2012年1月10日火曜日

SmartDox

年末年始はまとまった時間が取れたこともあって、 以前から構想していた文書処理アプリケーションの SmartDoxを作ってみました。 まだ、実用レベルではないですが一応ミニマムな実装が動いたところです。

SmartDoxは、1998年から作り続けているSmartDocの後継バージョンです。 SmartDoc2という名前でもよかったのですが、smartdox.orgというドメイン名が取れたので SmartDoxにしてみました。 SmartDocの場合、ドメイン名にxmlsmartdoc.orgを使っているのですが、SmartDoxでは「XML」が 必須でなくなるので「XML」の文言のないドメイン名を新しく使うことにしました。

動機

1998年にSmartDocを作る時も、プレインテキストベース(当時だとsetext、今だとSphinxあたりが候補) にするかXMLベースにするかという選択があったのですが、 プレインテキストベースだとパーサーを書くのが大変だったのと、当時のプレインテキストベースの マークアップ言語だと表組みや画像をマークアップする方法がなかったこともあって、XMLを 選択しました。 Emacsのsdoc-mode(sgml-modeを拡張)を使えば、XMLといっても入力、編集は問題ないので、 SmartDocは現在まで使い続けています。

ではなぜSmartDocの新バージョンを作ることにしたのかというと以下の理由があります。

  • org-modeが構造化プレインテキストワープロであることが分かった
  • SimpleModelerで、モデルの仕様記述
  • 自作アプリケーションで文章を扱うときの受け皿
  • Evernoteでの文書編集
  • iPad, iPhoneからの文書編集
org-mode

org-modeは、Emacs上で動作するアウトラインプロセッサです。 アウトラインプロセッサはMindmapModelingとの親和性も高そうなので、 以前からOmni Outlinerやorg-modeを調べていたのですが、 年末にorg-modeを触っていて、実は大変すごいことになっていることが判明しました。 org-modeは、アウトラインプロセッシング機能を持った構造化プレインテキストワープロと呼んでも 差し支えないEmacsアプリケーションだったのです。

特に驚愕したのは以下の機能。

Emacsをメインに使いながら今まで気づかなかったのは不覚でした。

org-modeの威力を目の当たりにし、今まで懸案にしていた色々なミッシングリンクが繋がってきました。 そこで得たインスピレーションをベースにSmartDox開発を開始することにしたわけです。

SimpleModelerで、モデルの仕様記述

SimpleModelerは、テキストDSLでモデルを記述し、このモデルからAppEngineやAndroidの アプリケーション(ドメインモデル+α)を生成するモデルコンパイラです。 SimpleModelerでは、クラス図や状態遷移図/表を含んだ仕様書生成も行いますが、この仕様書で 使用する自然言語による仕様記述の記述方法が懸案事項になっていました。 SmartDocをベースにした記述方式を仮実装していたのですが、これをオーバーホールし、 新規に本格的な文書処理系で実現するのがSmartDoxの目的の一つです。

自作アプリケーションで文章を扱うときの受け皿

SimpleModelerに限らず、自作アプリケーションで文章を扱いたいというニーズは色々あります。 たとえば、ヘルプとして構造を持った長めの文章を表示したいとか、そういう細々した用途です。

この目的で、org-mode文書を操作するScalaコンポーネントを用意しておきたいというのが、 SmartDoxの目的の一つです。 ボクが開発するアプリケーションは goldenport というアプリケーションフレームワーク上に構築していますが、 SmartDoxのコア はgoldenportからも切り離して、より汎用的な部品として使用できるような アーキテクチャにしています。 もちろんgoldenportでもSmartDoxに対応してSmartDoxをアプリケーションに容易に組み込む枠組みを 提供する予定です。

Evernoteでの文書編集

ノートやアイデアの管理にEvernoteを使っていますが、Evernoteのエディタが今ひとつ使いづらいのと、 Evernoteで記録した情報の再利用という目的で、Evernoteのエディタでも使用できる 構造化プレインテキストの導入を考えていました。 この目的にSmartDox文書を使用します。

また、Evernote APIを使ってSmartDox文書を格納したEvernoteノートの操作など、色々と 面白い応用がありそうです。

iPad, iPhoneからの文書編集

最近は iPadやiPhoneからTextforceを用いてDropbox上のテキスト文書を編集する運用を行っています。

PCからはEmacsを使うのでXML系のテキスト文書でも問題はないのですが、 Textforce(のようなプレインなテキストエディタ)でXML文書を編集するのはかなり辛いので、 構造化プレインテキストの導入を考えていました。 Evernoteの場合と同様に、ここもSmartDox文章がぴったりはまりそうです。

コンセプト

SmartDoxのコンセプトは、「(HTML5 + org-mode) / 2」です。 (SmartDocのコンセプトは、「(HTML + LaTeX) / 2」で、これをXML上に構築していました。)

SmartDoxは、HTML5とorg-modeをごちゃまぜにした記述方式にしました。 HTML5のサブセットとorg-modeのサブセットを合体させた文法にしています。 (という予定です。現在はorg-mode上に一部HTML5を取り込んでいます。)

普通の範囲のHTML5文書をHTMLエディタで編集したテキスト、 普通の範囲のorg-mode文書をEmacs上のorg-modeで編集したテキストの両方から HTML、プレインテキスト、LaTeX、PDFを生成します。(という予定です。) また、同一文章にHTML5とorg-modeを混在させ、さらにSmartDox専用の記述方式で 技術文書向けの便利な指定も可能にします。

具体的には、以下のような記述になります。

* SmartDox文書

これは<b>SmartDox</b>文書です。
<!DOCTYPE html>
<html>
<head><title>SmartDox文書</title></head>
<body>
<section><h2>SmartDox文書</h2>
<p>これは*SmartDox*文書です。</p>
</section>
</body>
</html>

org-modeを主体にして、細かい指定が必要なところは HTML5やSmartDox専用記述方式を併用するという運用イメージです。

インストール

プログラムの配布方法は、Scalaで最近注目されているconscriptにしました。 conscriptのインストール方法は以下のページに詳しいです。

Linux/Macであれば、以下のようにすればインストール完了です。

$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh

conscriptをインストールした後、以下のようにしてSmartDoxをインストールします。

$ cs asami/dox

以下の2つのコマンドがインストールされます。

dox
SmartDoxコマンド
sdoc
SmartDocコマンド(互換用)
確認

SmartDoxの文章として以下のものをsample.orgという名前で用意します。

* 最初の章

最初の章の文章。

** 最初の節

最初の節の文章。

*** 最初の小節

最初の小節の文章。

| 名前 | 住所 |
|------+------|
| 太郎 | 横浜 |
| 花子 | 東京 |

以下のようにSmartDoxのdoxコマンドを起動し、 HTML5文書らしきものがsample.htmlで生成されればインストール成功です。 (デバッグ用のスナップショットが出力されますが、ご愛嬌ということで)

$ dox -html5 sample.org

SmartDoxは、まだPoC(Proof of Concept)の段階ですが、 ボクが日々の作業の中で色々と作り足していく予定なので、 いずれそれなりに機能が充実してくると思います。 その時になったらぜひ試してみてください。

0 件のコメント:

コメントを投稿