All files / problems/chatSplit index.ts

100% Statements 80/80
100% Branches 17/17
50% Functions 1/2
100% Lines 80/80

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 811x 1x 1x 3x 3x 3x 3x 3x 2x 2x 2x 2x 2x 2x 2x 3x 10100x 2x 10100x 10098x 10098x 10098x 10098x 1531x 1531x 10098x 8567x 8567x 8567x 10098x 10100x 2x 2x 2x 2x 2x 2x 2x 2x 2x 3x 2052x 2052x 2052x 2052x 2052x 2052x 2052x 2048x 2048x 2048x 2048x 7778x 7778x 2048x 2048x 2048x 2048x 2048x 519x 2048x 1529x 1529x 2048x 2052x 2052x 2052x 2x 2x 2x 2052x 2052x 2052x 2052x 2x 2x 2x 2x 1x 1x  
export const MAX_MESSAGE_LENGTH = 50;
 
const splitMessage = (
  msg: string,
  chunkSize: number = MAX_MESSAGE_LENGTH
): string[] => {
  // base case
  if (msg.length <= chunkSize) return [msg];
 
  // split message into words
  const words = msg.split(" ");
  const chunkMessages: string[] = [];
 
  // loop through words to get chunkMessages (no number) (n)
  // get length chunkMessages
  for (let word of words) {
    if (!chunkMessages.length) {
      chunkMessages.push(word);
    } else {
      const currentChunk = chunkMessages[chunkMessages.length - 1];
 
      // if can't add word to current chunk
      if (currentChunk.length + word.length > chunkSize + 1) {
        // create new chunk
        chunkMessages.push(word);
      } else {
        // else push it to current chunk
        chunkMessages[chunkMessages.length - 1] = currentChunk + ` ${word}`;
      }
    }
  }
 
  // -> plus length with 1, convert to string and get length (example: 9 + 1 = 10 -> 2, 99 + 1 = 100 -> length 3)
  const possibleTotalChunkStringLength = (chunkMessages.length + 1).toString()
    .length;
 
  // `${index}/${xxx} hello the world...`
  const chunkMessagesWithNumber: string[] = [];
 
  // chunkMessages.map((i, index) => `${index + 1}/${'x'.repeat(possibleTotalChunkStringLength)} ${i}`);
  for (let x = 0; x < chunkMessages.length; x++) {
    const chunkMessage = chunkMessages[x];
    let chunkMessageWithNumber: string = `${x + 1}/${"x".repeat(
      possibleTotalChunkStringLength
    )} ${chunkMessage}`;
 
    // handle if chunkMessageWithNumber more than chunkSize
    if (chunkMessageWithNumber.length > chunkSize) {
      // message need to move
      let indexSplit = chunkSize - 1;
 
      while (chunkMessageWithNumber[indexSplit] !== " " && indexSplit > 0) {
        indexSplit--;
      }
 
      let messageNeedMove = chunkMessageWithNumber.slice(indexSplit + 1);
      chunkMessageWithNumber = chunkMessageWithNumber.slice(0, indexSplit + 1);
      // add messageNeedMove to next chunk
      if (!chunkMessages[x + 1]) {
        chunkMessages[x + 1] = messageNeedMove;
      } else {
        chunkMessages[x + 1] = `${messageNeedMove} ${chunkMessages[x + 1]}`;
      }
    }
 
    chunkMessagesWithNumber.push(chunkMessageWithNumber);
  }
 
  // replace x with chunkMessagesWithNumber length
  const chunkMessagesWithNumberWithLength = chunkMessagesWithNumber.map((i) =>
    i.replace(
      "x".repeat(possibleTotalChunkStringLength),
      chunkMessagesWithNumber.length.toString()
    )
  );
 
  return chunkMessagesWithNumberWithLength;
};
 
export default splitMessage;