読者です 読者をやめる 読者になる 読者になる

めんどうな作業がわずか数十秒に!新人プログラマが知らないと一生後悔するEmacsを使ったHTML生成

emacs

めんどうな作業がわずか数秒に!新人デザイナーが 知らないと一生後悔するExcelを使ったHTML生成 | Webロケッツマガジン


僕もこの記事見て最初は「これは Emacserに対する釣りだ。我慢しよう。」と思ったけど、
寝れなかったので書いてみた。

テーブルだけでいいなら、org-modeを使いましょう

  • org-mode


Emacs 22から標準添付です。試したのは最新版 7.8なので、古いので使えるか
どうかわかりませんが、基本的な機能であるはずなので、問題ないんじゃないかな
と思っています。

手順

この表をテーブルにします。スプレッドシートからコピペして Emacsに貼り付けます。


org-modeが有効になるように、keion.orgとでも命名したファイルにコピペすると
よいでしょう。コピペしたらタブセパレートで以下のようになるはずです。


このテーブルのもとになるデータをリージョンに設定します。
そして "M-x org-table-convert"と実行して下さい。そしたら以下のような
org-modeでのテーブルに変換してくれます。
"C-c |"に org-table-create-or-convert-from-regionという関数が割当てられて
いるんですが、うまく変換できなかったのでorg-table-convert関数を使いました。



あとは org-modeの各種エクスポート機能が使えます。
以下は org-table-exportを使って HTMLを生成してみました。

<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup><col class="left" /><col class="left" /><col class="left" />
</colgroup>
<tbody>
<tr><td class="left">役名</td><td class="left">パート</td><td class="left">声優</td></tr>
<tr><td class="left">平沢唯</td><td class="left">ギター</td><td class="left">豊崎愛生</td></tr>
<tr><td class="left">秋山澪</td><td class="left">ベース</td><td class="left">日笠陽子</td></tr>
<tr><td class="left">田井中律</td><td class="left">ドラムス</td><td class="left">佐藤聡美</td></tr>
<tr><td class="left">琴吹紬</td><td class="left">キーボード</td><td class="left">寿美菜子</td></tr>
<tr><td class="left">中野梓</td><td class="left">ギター</td><td class="left">竹達彩奈</td></tr>
</tbody>
</table>


その他 org-exportでヘッダ等を含む HTMLなり, Latexなりにすることもできます。

より細かい設定を行う場合

元ネタの元ネタの場合、class名を指定したりというのがあり、単純な org-modeの
利用ではうまく行きません。置換を駆使するというのもありますが、
Emacs=Editing MACrosということで、行単位の繰り返し処理はマクロを使うのがいいと
思います。

マクロを定義する

以下のように定義します。マクロ定義のときは、なるべく文字単位でなく、単語単位
などの大きなレベルでの移動・処理を行った方がよいです。

  1. F3を押し、マクロ定義を開始する
  2. <dt>と入力
  3. M-fで単語移動
  4. </dt><dd><span class="address">を入力
  5. </span>を入力
  6. C-dでタブを消す
  7. M-fで単語移動
  8. </span><span class="telno">を入力
  9. C-dでタブを消す
  10. M-fで単語移動
  11. </span></dd>
  12. F4でマクロ定義完了


あとは同様の処理を適用する行をリージョン指定し apply-macro-to-region-lines
関数を呼び出すだけです。行の構成が微妙に異なる場合は、キー入力に敏感になる
必要がありますが、Excelからコピペしたものは極めて、規則的に並んでいるので、
少々の間違いで打ち間違えをしても、ちゃんとそれを訂正すれば、どの行にも
期待したとおり結果が適用されるはずです。

終わりに

別に ExcelVimEmacsを使う必要はないと思います。大事なことは
どうやったら、楽にこういうことができるかを考えることだと思います。
一回きりのことであれば早くできるに越したことはないでしょうけど、
何回も繰り返しすることであれば、いつか元が取れればいい。最初は
その方法を考える・実装するのに 1時間かかっても、その苦労により、
次から 1秒でできればすぐ元は取れますしね。


マクロ定義じゃなく、関数を定義する。はたまた外部プログラムを使う。
考えられることはたくさんあると思います。


みなさんも Excelより高速で行う方法を考えてみてはいかがでしょうか