JavaScriptで原稿用紙の文字数を計算するシンプルなロジック

2022年8月31日水曜日

javascript

t f B! P L

JavaScriptで、原稿用紙の文字数(ページ数)計算をするロジックを紹介します。

はじめに

紹介するコードの文字数計算のルールは次のとおりです。

  • 400字詰め(20×20)の原稿用紙の文字数で計算
  • 行頭禁止文字は 」』)}】>≫、。,.
  • 行末調整は「ぶら下がり」または「追い込み」の前提

サンプルコード

HTML

計算対象の文字列を入力するテキストエリアと、文字数の計算結果を表示する <p> タグを置いておく。

<body>
  <textarea id="text" oninput="calc()" rows="20" cols="60"></textarea>
  <p id="result"></p>
</body>

JavaScript

次は本題の文字数を計算する JavaScriptである。

処理の流れ等は、コメントなどを見て頂きたい。

  function calc() {
    const LINE_CHAR_SIZE = 20;    //1行あたりの文字数
    const PAGE_LINE_SIZE = 20;    //1ページあたりの行数
    const END_KINSOKU = "」』)}】>≫、。,."; //行頭禁則文字(閉じ括弧、句読点)
    let targetText = document.getElementById("text").value;
    let lineCount = 0;

    //計算対象の文字列を改行コードで分割したブロック単位でループ
    const textBlocks = targetText.split("\n");
    textBlocks.forEach(block => {

      if (block.length == 0) {
        //改行だけの行は行数だけカウント
        lineCount++;
        return;
      }

      let currentIndex = 0;
      while (currentIndex < block.length) {

        //1行分(20文字)取得
        let t = block.substr(currentIndex, LINE_CHAR_SIZE);
        currentIndex += LINE_CHAR_SIZE;

        //行頭禁則文字の処理
        while (true) {
          const c = block.substr(currentIndex, 1);
          if (c && END_KINSOKU.indexOf(c) >= 0) {
            currentIndex++;
            continue;
          }
          break;
        }
        lineCount++;
      }
    });

    //行数から必要なページ数を計算
    const pageCount = Math.ceil(lineCount / PAGE_LINE_SIZE);

    //計算結果を画面に表示
    document.getElementById("result").innerText = 
      `${lineCount}行(${pageCount}ページ)`;
  }

動かしてみる

上で作成したコードを実行してみよう。
こんな感じで、テキストエリアに入力するたびにページ数や行数が計算されていればOKである。

enter image description here

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ