All files / src/display/sms unicodesplitter.ts

100% Statements 86/86
85.71% Branches 18/21
100% Functions 3/3
100% Lines 86/86

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87702x 702x 702x 134x 134x 15x 15x 15x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 14x 14x 14x 14x 14x 14x 14x 14x 14x 23x 23x 2x 21x 8x 13x 23x 23x 23x 23x 23x 23x 23x 23x 23x 23x 23x 23x 14x 15x 702x 702x 702x 702x 75x 75x 75x 75x 702x 702x 702x 702x 702x 702x 14x 14x 14x 15x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 12x 12x 12x 12x 12x 12x 12x  
function isHighSurrogate(code) {
  return code >= 0xd800 && code <= 0xdbff;
}
 
export const unicodeSplit = function (message, options) {
  options = options || { summary: false };
 
  if (message === '') {
    return {
      parts: [
        {
          content: options.summary ? undefined : '',
          length: 0,
          bytes: 0
        }
      ],
      totalLength: 0,
      totalBytes: 0
    };
  }
 
  const messages = [];
  let length = 0;
  let bytes = 0;
  let totalBytes = 0;
  let totalLength = 0;
  let partStart = 0;
 
  function bank(partEnd = undefined) {
    const msg = {
      content: options.summary
        ? undefined
        : partEnd
          ? message.substring(partStart, partEnd + 1)
          : message.substring(partStart),
      length: length,
      bytes: bytes
    };
    messages.push(msg);
 
    partStart = partEnd + 1;
 
    totalLength += length;
    length = 0;
    totalBytes += bytes;
    bytes = 0;
  }
 
  for (let i = 0, count = message.length; i < count; i++) {
    const code = message.charCodeAt(i);
    const highSurrogate = isHighSurrogate(code);
 
    if (highSurrogate) {
      if (bytes === 132) bank(i - 1);
      bytes += 2;
      i++;
    }
 
    bytes += 2;
    length++;
 
    if (bytes === 134) bank(i);
  }
 
  if (bytes > 0) bank();
 
  if (messages[1] && totalBytes <= 140) {
    return {
      parts: [
        {
          content: options.summary ? undefined : message,
          length: totalLength,
          bytes: totalBytes
        }
      ],
      totalLength: totalLength,
      totalBytes: totalBytes
    };
  }
 
  return {
    parts: messages,
    totalLength: totalLength,
    totalBytes: totalBytes
  };
};