Conf2ditaのTableプロパティの編集・保存方法について
ConfluenceのHTMLにおけるAttributeの扱いの問題点というか性質
ConfluenceのEditorはHTML5を使っているが、AttributeについてEditor以外の外部から(JavaScriptなどで)無理に追加してもデータベースに保存時にSanitizeされてしまい削除されてしまう。
Conf2ditaの方針
ということで、DITA要素はできる限りConfluenceマクロを使い、Attributeはマクロパラメータに設定するようにしている。が、TableとListはConfluenceがHTMLのTableとUL/OLをそのまま使用しているのでどうしようかしらというのが最大の悩みどころです。
TableのAttributeについて
TableのAttributeについては下記の手法にて保存しています。基本的には、conf2dita/editor.jsで行われています。以下の()内のメソッドはヒントです。
- 各Row/CellのAttribute設定のパネルの「保存」時には当該DOMのdataプロパティ上に保存(onsubmitsave:)
- ページの「保存」時にはAjaxを飛ばしてそのページの ContentPropertyにXMLで保存する。(saveTableProperties)
- この時、Tableの順序が問題になる。TableのDOMにおける順序はブラウザにより統一されているわけでは無いため、各TableにAttributeを保存した時の順序を明示しておかないと後で整合性が合わないことがある。
たとえば、IEでAttributeを保存した後にFirefoxで再度編集画面を開くと、違うテーブルにAttributeがAssignされてしまう可能性がある。(実際にあった) - そこで、Tableのラップマクロに対してconf2dita_table_orderという隠しconf2dita_oem / src / main / resources / js / conf2dita /マクロパラメータを操作して割り振っている。このパラメータは以下のケースで使用される。
- 次回のTableプロパティの編集時(assignTableProperties)
- ユーザー画面での表示時(assignTableProperties)
- DITAを出力時
- この時、Tableの順序が問題になる。TableのDOMにおける順序はブラウザにより統一されているわけでは無いため、各TableにAttributeを保存した時の順序を明示しておかないと後で整合性が合わないことがある。
- このAjaxは非非同期なので、このAjax保存が終わってからページの保存がなされる。
上記の制御をしているJavaScriptについて
これらのJavaScriptはconf2dita_oem / src / main / resources / js / conf2dita /に入っている。
- editor.js編集画面でコールされる
- page.js 表示画面でコールされる
- common.js 両方の画面でコールされる
上記の通信対象となるAjax先
これらのJavaScriptの通信先は、src / main / java / jp / junoe / confluence / plugins / conf2dita / servlet / editor / ajax / DitaTablePropertyController.java
DITA IDを保存するのは src / main / java / jp / junoe / confluence / plugins / conf2dita / servlet / editor / ajax / DitaPropertyController.java となる。
ちなみに画像のプロパティについて
画像のプロパティには、Tableプロパティのようなマクロラッパーが使えないが、confluence-query-paramsというAttributeが使えるのでそこにBase64エンコーディングを行って保存している。このQueryStringは、Imageタグのsrc属性に?パラメータとして付与されるもので、これはImageタグだから使えるというものである。
このあたりの処理は conf2dita / src / main / resources / js / conf2dita / editor.js のImagePropertyPanelを参考に。