본문 바로가기

FrontEnd

[JS] 한글을 2byte로 한 줄 길이 제한 및 줄바꿈 코드

반응형

바이트 수 기준으로 줄바꿈을 적용하는 코드

  • 한 줄의 맨 앞에서 trim을 적용한다.
  • 한 줄의 바이트 수가 threshold를 넘어가면 줄바꿈한다.
 /**
 *
 * @param {string} str
 * @param {number} threshold
 * @returns {string}
 */
const changeLine = (str="",threshold=80) => {
  /**
   *
   * @param {number} charCodeAt
   * @returns {number}
   */
  const encode = (charCodeAt) => (charCodeAt > 127 ? 2 : 1);
  let [len, /**@type{string[]} */ buffer] = [0, []];
  for (let i = 0; i < str.length; i++) {
    const byte = encode(str.charCodeAt(i));
    const shoundChangeLine = byte + len > threshold;
    const isSpace = str.charAt(i) === " ";
    const shouldChangeLineAtSpace = shoundChangeLine && isSpace;
    const shouldTrimAtHead = len === 0 && isSpace;
    if (shouldChangeLineAtSpace) {
      len = 0;
      buffer.push("\n");
      continue;
    }
    if (!shouldChangeLineAtSpace && shoundChangeLine) {
      buffer.push("\n");
      buffer.push(str.charAt(i));
      len = byte;
      continue;
    }
    if (shouldTrimAtHead) {
      len = 0;
      continue;
    }
    len += byte;
    buffer.push(str.charAt(i));
  }
  return buffer.join("");
};

테스트 케이스 (threshold = 80)

위하여 청춘의 없으면 있으며, 풍부하게 황금시대의 가슴이 그들의 뼈 아니다. 굳세게 설레는 그들의 같은 이것은 천지는 용기가 곧 아니다. 희망의 예수는 자신과 풀밭에 이상을 부패뿐이다. 용감하고 것은 청춘의 그것은 얼마나 이 보라. 피부가 물방아 가는 든 풍부하게 그들을 그림자는 사라지지 끓는다. 가치를 대중을 귀는 크고 천자만홍이 품에 목숨이 인생을 온갖 보라. 피부가 그림자는 품었기 인생을 그것을 예수는 피다. 수 힘차게 새 주는 싸인 있으랴? 미묘한 내려온 뼈 이상 이상, 석가는 이는 따뜻한 풀밭에 듣는다. 이상의 끓는 뛰노는 수 것이다. 그림자는 옷을 많이 봄바람이다.
위하여 청춘의 없으면 있으며, 풍부하게 황금시대의 가슴이 그들의 뼈 아니다. 굳세게
설레는 그들의 같은 이것은 천지는 용기가 곧 아니다. 희망의 예수는 자신과 풀밭에 
이상을 부패뿐이다. 용감하고 것은 청춘의 그것은 얼마나 이 보라. 피부가 물방아 가
는 든 풍부하게 그들을 그림자는 사라지지 끓는다. 가치를 대중을 귀는 크고 천자만홍
이 품에 목숨이 인생을 온갖 보라. 피부가 그림자는 품었기 인생을 그것을 예수는 피
다. 수 힘차게 새 주는 싸인 있으랴? 미묘한 내려온 뼈 이상 이상, 석가는 이는 따뜻
한 풀밭에 듣는다. 이상의 끓는 뛰노는 수 것이다. 그림자는 옷을 많이 봄바람이다.
반응형