Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

Markdown container format - Draftsを便利に活用するために、エディターとCMS、それらを支えるライブラリを書こうと思った。

エディター

必要な機能

  • 新規作成
  • container.xml を読み取って適切な markdown を編集状態にする
  • 関連する画像ファイルなどを一緒にzipするわけなので、zip の中身を全体的に編集できる必要がある。
  • 保存

実装

archive-view zip の中身を見れる。一時ファイルを展開して開くようになっているが、これを zip でまとめ直す機能をzip-folderzip-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 側の仕事だし、そこらへんの切り分けは大事。

参考:

あったらいいな機能

  • 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.1metadataで検索して確認。この情報を簡単に書けるようにしておくことは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 系だったら書き直しやすいし、また利用者にも余計なインストールを強いずに済むと期待できる。

慣れている Pythoncx_Freezeコンパイルしてもよいが、あまりそのメリットがない。

Atom の代替