2007年11月20日

作文添削用・JavaScript生成用の秀丸マクロ

久しぶりに手抜き道を邁進している近況をお伝えします。

手抜き日本語教師としましては、「機械に任せられることは人間はやらない」というのは譲れないところです。だって、人間って機械より偉いんですから。最近、我慢ができなくなってきたのは、メールで添削するときの一連の繰り返し作業。で、自動化できる部分は自動化してみました。
残念ながら、間違いを自動的に指摘してくれるようなコードは私には書けません。というか、すでにワードとかで実装されていますよね。ここでは、添削という作業そのものは私という人間がやることとして、定型的な編集作業だけを秀丸のマクロで組んでみました。といっても、実際の操作を記録して、それに削除とコピーをしただけで、自分は一切コードは書いていません。

まず、学習者からメールで作文が送られてきます。それを私の場合は秀丸メールで受信しますが、これは別にOUTLOOKでもFIREFOXでも何でも構いません。まず、メールの全文をコピーして、その後、秀丸エディタを起動します。そして実行するのが、以下のマクロです。
setcompatiblemode 15;
paste;
gofiletop;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
selectall;
refcopy2;
paste;
gofiletop;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;
searchdown "。" , hilight;
if( ! result ) beep;
right;
insertreturn;
insertreturn;
insert "→「」";
insertreturn;
insertreturn;


いやあ、繰り返しがたくさんあるのに、forもwhileも使っていない、まったくもってエレガントでないコードですねえ。しかし、秀丸マクロにforとかwhileが存在するかどうかも調べるのが面倒くさいので、しかたがありません。(今、マクロのヘルプを見たら、forはないようですがwhileはあるようです)

で、これで何ができるかというと、学習者の書いたまとまりのある文章を「。」で分け、全文の文頭に「> 」というよくメールで使われる引用符を挿入します。そして一行置いて、右向きの矢印とカギ括弧を挿入します。そして、二行置いて、次の文が来るようにします。要するにこういう感じです。
学習者の文
あいうえお。かきくけこ。さしすせそ。

マクロ実行後の表示
> あいうえお。

→「」


> かきくけお。

→「」


> さしすせそ。

→「」



で、もちろんカギ括弧の中に訂正例などを記入するわけですね。これだけでも、学習者にとってはずいぶん添削が読みやすくなるのではないでしょうか。

もう一つ挙げておきます。

読解用の資料から漢字の読みのリストを作る場合、読解用のプリントにはMSワードなどであらかじめルビが振っていることが多いですよね。このルビつきの漢字だけを取り出して、リストを作るマクロです。

ルビつきのワードのテキストをエディターである秀丸に貼り付けると、こんな感じになります。
海外で心臓などを移植(いしょく)することが必要な日本の子供のための募金(ぼきん)活動を支援(しえん)し、余ったお金を管理しているトリオジャパン事務(じむ)局長(きょくちょう)は次のように述べている。

丸括弧の中の読みが、ワードではルビになっていた部分です。

以下に紹介する秀丸マクロでは、あらかじめコピーしてあったテキストを秀丸エディタに貼り付け、文頭から丸括弧の開く方を検索し、見つけたら二文字戻って改行し、次に丸括弧の閉じる方を検索します。そして、見つけたらその右で改行します。これを実行すると上記のテキストはこんな風になります。
海外で心臓などを
移植(いしょく)
することが必要な日本の・・・
カーソルは「移植」の下の行の頭にあるので、そこから二行あがって、その行を削除します。これで「海外で心臓などを」の部分がなくなります。

これを五回続けると、上記のテキストの場合は
移植(いしょく)
事務(じむ)
募金(ぼきん)
事務(じむ)
局長(きょくちょう)
という結果が取り出されます。これで漢字のリストができてしまうわけですね。

ただ、これはいろいろ問題があって、二文字の漢字には対応していますが、機械的に二文字しか残さないので、一文字の漢字のルビなどは左側に一文字ゴミが入ってしまいますし、送りがななども対応していません。つまり
難病(なんびょう)の子供を抱(かか)えた親を温(あたた)かい目で見て、お金の面で厳しく追及(ついきゅう)しないでほしい。
受託(じゅたく)した資金の・・・
というようなテキストの場合、
難病(なんびょう)
を抱(かか)
を温(あたた)
追及(ついきゅう)
受託(じゅたく)
というような結果になってしまいます。ですから、ちょっと手作業で編集が必要になる場合もありますが、それでも、最初から全部手でやることを考えれば、はるかに楽です。

これを実行するマクロは以下の通りです。
paste;
gofiletop;
searchdown "(" , hilight;
if( ! result ) beep;
left 2;
insertreturn;
searchdown ")" , hilight;
if( ! result ) beep;
right;
insertreturn;
up 2;
beginsel;
down;
backspace;
down;
上のように五行やる場合は、マクロ三行目(searchdownの行)から最後までを五回コピー&ペーストすればできます。

で、このリストを先日ご紹介したガンツ先生に埋め込むためには、以下のマクロを使うと自動的にできます。
gofiletop;
replaceallfast ")" , "";
if( ! result ) beep;

gofiletop;
replaceallfast "(" , "カッコヒラク";
if( ! result ) beep;
gofiletop;

gofiletop;
insert "if (prompt('";
golineend;
insert "'){ pinpon(); }else{ buu(); }";
right;

gofiletop;
replaceallfast "カッコヒラク" , "') == '";
if( ! result ) beep;

この中の
insert "if (prompt('";
golineend;
insert "'){ pinpon(); }else{ buu(); }";
right;
の部分を、たとえば五回繰り返せば五行分が整形できます。その結果、たとえば最初のテキストだったら
if (prompt('移植') == 'いしょく){ pinpon(); }else{ buu(); }
if (prompt('募金') == 'ぼきん'){ pinpon(); }else{ buu(); }
if (prompt('支援') == 'しえん'){ pinpon(); }else{ buu(); }
if (prompt('事務') == 'じむ'){ pinpon(); }else{ buu(); }
if (prompt('局長') == 'きょくちょう'){ pinpon(); }else{ buu(); }
という結果になりますので、これを「ガンツ先生」に流し込むと、こういうWeb上の練習プログラムが簡単にできてしまうわけですね。

さて、まとめですが、ワードのルビ振りから漢字リストを作るマクロと、上記のJavaScriptを作るマクロを組み合わせると、
 海外で心臓などを移植(いしょく)することが必要な日本の子供のための募金(ぼきん)活動を支援(しえん)し、余ったお金を管理しているトリオジャパン事務(じむ)局長(きょくちょう)は次のように述べている。
というデータが、多少の手作業での編集をするだけで
if (prompt('移植') == 'いしょく'){ pinpon(); }else{ buu(); }
if (prompt('募金') == 'ぼきん'){ pinpon(); }else{ buu(); }
if (prompt('支援') == 'しえん'){ pinpon(); }else{ buu(); }
if (prompt('事務') == 'じむ'){ pinpon(); }else{ buu(); }
if (prompt('局長') == 'きょくちょう'){ pinpon(); }else{ buu(); }
に加工できるわけですね。こういう「二文字の漢字熟語五つを含む文章を上記のJavaScriptのコードに変換する秀丸マクロ」がこちら(り付け改行引用符.MAC)で、その結果をhtmlに流し込んで練習できるようにしたのが、こちら(生テキストから漢字練習JS生成.MAC)です。


最後に特筆しておきたいのが、今回の秀丸マクロに関して、私自身は一度もコードを書いていないということです。私が手動で検索やら置換をやった作業を秀丸エディタが覚えていて、私は秀丸エディタが記録したマクロをコピペしたり削除したりして多少編集しただけです。

この「作業を記録する」ということができるようになるだけで、教材作成の効率はグググッと上がりますので、今度はその辺をご紹介したいと思います。
posted by 村上吉文 at 08:32 | Comment(0) | TrackBack(0) | 日本語hacks! | このエントリーをはてなブックマークに追加
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック