Markdown container format - Draftsを便利に活用するために、エディターとCMS、それらを支えるライブラリを書こうと思った。
エディター
必要な機能
- 新規作成
- container.xml を読み取って適切な markdown を編集状態にする
- 関連する画像ファイルなどを一緒にzipするわけなので、zip の中身を全体的に編集できる必要がある。
- 保存
実装
archive-view zip の中身を見れる。一時ファイルを展開して開くようになっているが、これを zip でまとめ直す機能をzip-folderのzip-folder/zip-folder.coffee at master · JakeDixon/zip-folderを参考に付ける。これは、Save to archive file · Issue #29 · atom/archive-view · GitHubで要望が出ている。
- OSの新規作成メニューでのテンプレート mdc の作成→atomでのテンプレートファイルの提供の仕方を調査
- 各OSでファイルの関連付けで、メインのmarkdownが開けるようにするようなインストーラを作成。
その他参考:
zip の中にある markdown を開く
各OSでファイルの関連付けで、メインのmarkdownが開けるようにするようなインストーラを作成。
しても、その中の markdown を直接編集させられないので、そちらがわに一時フォルダに展開したりする機能が必要。そうすると、今の atom archive-view の機能と重複する。それならば、インストーラは
- (archive-view をインストールしたうえで)単に atom に関連付ける
- 編集を監視し、zip を再生成するような zip エディタに関連付ける
のどちらかをすればよい。そこについでに、メインの .md を開く機能が加わる形だ。atom に縛られたくないので後者の実装をしたい。
Best Free File Archiver-Zip Utility | Gizmo's Freeware をいろいろ探してみたけれど、既存のアーカイバにそういう機能は見当たらなかった。7-zip が近くて、notepad で編集したときには変更後にアーカイブをアップデートするか聞かれたが、他のエディタだとだめ。ファイルロックの関係かもしれない。
- 一時フォルダのブラウジングはOSのexplorerに任す → ここは atom の tree view でもいい。
- unzip や zip も7-zipなどコマンドラインから命令できるプログラムに任す
- このプログラムのやるべきことは、開いているフォルダを監視して、変更があれば元の zip を上書き & ファイルを開いたときに各コマンドを呼び出す。
試しにまず、electron で、
- 引数をとってそれを画面に表示
- メニューに「Open directory」を用意し、それをクリックすると、引数のフォルダをエクスプローラで開く
プログラムを作成する。directory monitor and commander。次は
- chokidar を使って監視して変更を画面に表示する
機能。同じファイルを開かないように、同じファイルを開こうとしたらもとのを activate して、そこにメッセージを表示するとか、いくらでもやるべき実装があるが、例えばこれは unzip や zip を担当する wrapper 側の仕事だし、そこらへんの切り分けは大事。
参考:
- electron-sample-apps/file-explorer at master · hokein/electron-sample-appsがベースになると思っていたが、エクスプローラもOSのに任すので関係なくなった。
- GitHub - paulmillr/chokidar: A neat wrapper around node.js fs.watch / fs.watchFile / fsevents. フォルダ内を監視して、変更があったら既定のコマンドを走らせるのに、これを使うのがメインになる。
- node.jsでファイルの変更を検出して何かする - Qiita 参考サンプル
- electron/shell.md at master · electron/electron · GitHubエクスプローラ開くにはこれ
showItemInFolder
あったらいいな機能
- HTML や PDF、epub を出力する。参考: atom-markdown-katex
自動で画像を fetch してきて含めることもできるけれど、外部リンクのままにとどめときたい場合もあるから、あまり要らない。- 対象の md を右クリックして
Compile into .mdc
。container.xml 生成。さらに含めるファイルを選択して mdc 生成。 - Open Packaging Format (OPF) (参考:日本語で読みたいなら オープン・パッケージング・フォーマット(OPF) 2.0 v1.0 がある)の語彙などでメタデータを container.xml に記述できる。EPUB 3.1を
metadata
で検索して確認。この情報を簡単に書けるようにしておくことはCMSでのタグ機能などの実装に役立つ。 mdc を右クリックしてEdit main markdown file
メニュービューワーだけのプラグインも作ってもいい。そちらはarchive-viewに読み取り機能だけをつけて、デフォで markdown のプレビュー機能のみを表示。→ビューだけ欲しければ epub or pdf エクスポートすべき
テキスト的な差分管理との親和性
バイナリであることは git とかで差分管理できないという問題がある。その解決のために Open Container Format の非圧縮版の仕様もサポートしておいた方がいい。
Base64 でやるかんたんMarkdownならこの問題は無い。その代わり、Pandoc とかとの連携が悪くなるので、PDFにする部分はVivliostyleをか使う必要がある。むしろ元の markdown の保存形式が HTML や JS と密結合していることに少々難があることが分かった。base64 を markdown で使うなら Can I embed png's in Markdown? — The Insignificant Pebble に紹介されているような記法がいいと思うけれども、ここにもファイルサイズの問題があって、 mdc はやっぱり必要だなと思われた。
名前
プログラム名は markdown container editor environment から marcee (マーシー)にした。名前に atom 入れないのはそこは入れ替え可能だと思っているから。
deprecated idea
Atom のプラグインとしてすべての機能を完結させるつもりでいたので、coffee で mdc を読み書きするライブラリを作り、その活用例として Atom のプラグインを位置づけるつもりでいた。Atomプラグイン作成入門 ハンズオン形式でプレビュー型プラグインを作ってみよう! - Qiitaに書いてあるようにひな形が自動生成されるのだが、それが coffee で書かれている。CoffeeScript はただの javascript も受け付けるようだ。
Markdown container format - Draftsを広めるために、各プログラミング言語でのライブラリを作ろうと思い、その1つ目として coffee を選ぼうとしたということだ。でも、上記のように Atom は呼び出される側で、OS依存な部分で mdc の読み書きを実装する必要があるので、30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで - Qiita を参考に nodejs で書こうと思う。また、Atom 側でやるべきこととの設計のしなおしが生じても同じ javascript 系だったら書き直しやすいし、また利用者にも余計なインストールを強いずに済むと期待できる。
慣れている Python を cx_Freeze でコンパイルしてもよいが、あまりそのメリットがない。
Atom の代替