【Mac】なろう記法を自動化

2019年3月1日

「小説家になろう」では、文字にルビを振ることができる。
 CotEditor のスクリプトでこれを自動化してみたい。

といっても MeCab の yomi を使うだけだし、そもそも「なろう」のルビ振りは簡単で自動化するほどのものでもないのだが、あえてやるのである。

mecab のインストール

MeCabはオープンソースの形態素解析エンジンで、奈良先端科学技術大学院大学出身、現GoogleソフトウェアエンジニアでGoogle 日本語入力開発者の一人である工藤拓[1][2]によって開発されている。名称は開発者の好物「和布蕪(めかぶ)」から取られた。
MeCab – Wikipedia

mecab は Homebrew でインストールできる。

brew install mecab

mecab を使用するには、ipa辞書というのも必要だ。これも Homebrew でインストールできる。

brew install mecab-ipadic

準備はできた。
 さっそく試してみる。mecab で実行すると入力モードに入れる。終了するには control + c でいいのだと思う。

mecab↩
年賀状はお早めに↩
年賀状	名詞,一般,*,*,*,*,年賀状,ネンガジョウ,ネンガジョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
お	接頭詞,名詞接続,*,*,*,*,お,オ,オ
早め	名詞,一般,*,*,*,*,早め,ハヤメ,ハヤメ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
EOS

こんな風に出力される。これが形態素ということなのだろうか。ちょっと感動する。
 -Oyomi というオプションをつけるとヨミが表示され、-Owakati というオプションでわかち書きされる。

$ mecab -Oyomi↩
鯨は歌を唄うらしい。↩
クジラハウタヲウタウラシイ。
$ mecab -Owakati↩
ウルトラマンがまだ帰らない。↩
ウルトラマン が まだ 帰ら ない 

モードに入らずにヨミを表示する場合は、次のように書くみたいだ。

$ echo '牛乳二本買ってきて' | mecab -O yomi↩
ギュウニュウニホンカッテキテ

いい感じである。
 さらにこれをカタカナから、ひらがなに変換する。文字コードを変換する nkf コマンドにはそのものずばり --hiragana というオプションがある。

$ echo '牛乳二本買ってきて' | mecab -O yomi | nkf --hiragana↩
ぎゅうにゅうにほんかってきて

nkf もまた、Homebrew でインストールできる。

brew install nkf

今度こそ本当に準備完了だ。

「小説家になろう」におけるルビの振り方

小説家になろう、ではひと文字につき、10 文字のルビを振ることが出来る。書き方は、ふりがなを振る始点にパイプ、終点に二重の山パーレンでふりがなを指定する。

男は|冷灰《れいかい》のような目でわたしを見た。
|不来方《こずかた》の|羅刹《らせつ》童子
「違います、あのひとが来たのは|朝の《・・》の九時です」

上の例は、下の画像のようになる。

なお、ルビを振る対象が漢字ならパイプは省略できる。また、ルビがひらがななら、山カッコではなく普通の(かっこ)でもルビになる。
(かっこ)をただのカッコとして使う場合は、|(かっこ)とやればエスケープされる。

🔗 ルビを振る|マニュアル

 以上をふまえて、スクリプトを書いた。

CotEditor スクリプトメニュー

CotEditor には、文章やコードをスクリプトで処理する機能がある。シェルスクリプトばかりではなく、perl、php、ruby、python、javascript、swift、そして AppleScript が利用できる。
 スクリプトは、メニューバーのアイコンから実行できる。

スクリプトメニュー > 「スクリプトフォルダを開く」を実行すると、スクリプトを置くフォルダが開かれる。書いたスクリプトをそこへ入れると、スクリプトメニューに表示されるようになるのだ。

今回のスクリプトは以下のように書いた。

#!/bin/bash
#%%%{CotEditorXInput=Selection}%%%
#%%%{CotEditorXOutput=ReplaceSelection}%%%

string=`cat -`

michigo=`echo "$string" | /usr/local/bin/mecab -x "未知語" | grep '未知語'`

if test -z "$michigo"; then
	furigana=`echo "$string" | /usr/local/bin/mecab -O yomi | /usr/local/bin/nkf --hiragana -w`
	echo -n '|'"$string"'《'"$furigana"'》'
else
	echo -n '|'"$string"'《》'
fi

%%%{CotEditorXInput=Selection}%%% は CotEditor からスクリプトが受け取るデータの指定である。指定には三つあり、CotEditorXInput=○○○○ の、○の部分に記述する。
 以下は CotEditor のヘルプから抜粋する。

Selection現在選択しているテキスト
AllText書類のすべてのテキスト
None何も渡さない(デフォルト)

%%%{CotEditorXOutput=ReplaceSelection}%%%は、スクリプトが CotEditor に引き渡す、その方法だ。Input と同じく、CotEditorXOutput=○○○○ と指定する。

ReplaceSelection現在選択しているテキストを出力内容で置き換えます。
ReplaceAllText書類のすべてのテキストを出力内容で置き換えます。
InsertAfterSelection選択範囲の直後に出力内容を挿入します。
AppendToAllText書類の末尾に出力内容を挿入します。
NewDocument新規書類を作成し、そこに出力内容を挿入します。
Pasteboard putsクリップボードに出力内容を格納します。
Discard何もしない(デフォルト)

CotEditor ヘルプメニューの「CotEditor スクリプトガイド」>「スクリプトについて」にサンプルへのリンクがあり、参考になる。

Selection から受け取ったデータは標準入力に送られるので、
string=`cat -`
で変数に入れた。

mecab -x "未知語" というのは、選択した言葉が辞書にない言葉だった時、未知語である、と返してくれる、というものだ。
 なので「爆炎斬」に「エクスプロージョンスラッシュ」とかのルビは自動では振れない。「|爆炎斬《》」とふりがなのない形式で返ってくる。

nkf のオプション --hiragana -w の、 -w は文字コードを UTF にするものである。これは書いている原稿の文字コードよって euc(-e) や shift-jis(-s) に書き換える必要がある、と思われる。

ここまで書いてきて、致命的な点に気づいた。
 例えば「美味しい」を「おいしい」と読ませたい時だ。「美味」を選択すると「びみ」と返ってきてしまう。そこはしょうがないので我慢することにする。
 実行した結果は以下のような感じだ。

スクリプトメニューをカスタマイズする

CotEditor のスクリプトメニューは簡単にカスタマイズできる。

・ファイル名の頭に、「 1) 」というように、数字と半角カッコ閉じを入れると、メニューの順番を指定できる。

📝 1)pタグ.sh
 📝 2)ルビ.sh

・空のフォルダの名前に、順番、半角カッコ閉じ、ハイフンで仕切り線を指定できる。

📁 3)-

・ファイル名の拡張子の前に、ドットで区切ってキーボードショートカットを指定できる。

📝 1)pタグ.@$1.sh
 📝 2)ルビ.@$2.sh

・アンダーバーを頭につけたフォルダはメニューに表示されない。

📁 _library

3 のキーボードショートカットの指定は記号でおこなう。上の例の「pタグ.@$1.sh」だと command + shift + 1がショートカットになる。  モディファイキーと記号の対応は以下の通り。

表記キー
^Control(コントロール)
$Shift(シフト)
~Option(オプション)
@Command(コマンド)

これらの命名規則は、ヘルプのスクリプトガイドに詳しく書いてある。
 とくにキーボードショートカットを指定するとずいぶん便利に使える。