sci

最果て風呂

mto を JavaScript で実装してみる

mto を JavaScript で実装し直そうと思って、まずは JSON 形式の辞書をオブジェクトとして読み込んでみた。パースする手間がいらないので楽だった。内部辞書を調べてみると、他の実装と要素数が違ってしまっているのだった。調べてみたら、読み込んだオブジェクトはハッシュとなっているようで、重複しているものは自動的に削除されて(登録されないで)いたみたい。これは当然の挙動だわな。

読み込んだ時点でもうすでに使える辞書になっているのだから、わざわざ他の実装のように二次元配列に直す必要はないよね。というか面倒なのでこのまま行く。でもちょっと気になるので少しだけ脱線。

元辞書を作成するにあたり、一つのファイルで「新→旧」「旧→新」の辞書を作成できるようにしているため、元データに重複があるのは仕方がない。ではどんな文字列が重複しているのかを調べてみることにした。

  • csv 形式で出力して LibreOffice の calc で読み込み
  • 全体をソート
  • A列を選択
  • 「書式」→「条件付き書式」→「条件…」と進む
  • 「セルの値が次の値」で「重複」を選択
  • 適用スタイルは「新しいスタイル」で「背景」を目立つ色(赤や青)にしてOK

これで簡単に抽出することができた。重複している文字列は、例えば「(じゃあ . じやあ)」のような促音に関するものばかりだった。

で、JavaScript 版での方針としては、現在 ("新" . "旧") のペアとして出力しているものに追加してさらに ("旧" . "新") のペアのものも出力し、これらを読込むことで内部辞書を作成することにした。仮名と漢字があるので 4 種類だわ。

JavaScript にはよくわからないけれども「同一ドメインポリシー」というものがあるそうで、他サイトにある JSON ファイルを読み込むことができないらしい。正確には読み込みはするけれども、実行までは出来ないらしい。これをクリアするために JSONP とかいう……。いや、なるべく JavaScript については調べたくない。

でもこれを解決しなければ実装ができない。ものすごく簡単な方法は JSON ファイルの先頭に var hogejsonData = のようなものを付けてしまえば良いらしい。

ふぅ、とりあえず JavaScript での実装が終わった。GitHub に push して動くかどうかの実証はこれから。モバイル向けのページはどうしようかなぁ。

モバイル向けのページも作って、ちょっと長めの文章を置換してみた。どうもおかしい。JavaScript の replace は一度ヒットすると終わってしまうらしいぞ。要は replaceall が標準では無いってことらしい。

正規表現の g オプションを使う方法があるようだけれど、自分がやりたい事は変数に入っている文字列で検索&置換をしていきたいので、Ruby のような変数のインライン展開ができないと使えない。で、これをどうやるのか調べてみたのだけれども、さっぱりわからなかった。

もうちょい置換について調べてみると、「文字列を検索文字で分割(split)し配列に展開。それを検索文字列で結合(join)してしまう」方法が多くのサイトで紹介されていた。どこが元ネタなのかわからないぞ。つまり replaceAll のような関数をこれで作ってそれを使えってことらしい。

ありがたく真似をして実装。ライセンス的にはどうなんだろう?パブリックドメインだよね?

作成したファイルを gh-pages ブランチに放り込んで GitHub に push。あれ?反映されない。サイトであらかじめページを作成しておかなくちゃいけなかったんだっけ?ということで作成。gh-pages ブランチができていた。

再度 push しても変化なし。ずっと git push origin master とやってたわ。git push origin gh-pages だったわな。で、これを実行したらコンフリクトしちゃってあわわわっ(>_<)。面倒になったのでリポジトリを削除して新しく作り直してしまった(^_^;)。

なんやかんやあって作業は終了。リモートにアクセスしてみたけど、ローカルと何ら変わることなく使うことができた。同一ドメインだから問題が出なかったのかな?