シーケンス
HackMD で任意のページを編集開始
- GROWI ユーザーが Start to edit with HackMD ボタンクリック
- GROWI クライアントがGROWIサーバーの
/_api/hackmd.integrate
を叩き、ドキュメントの更新等を行う- Page モデルの
pageIdOnHackmd
,revisionHackmdSynced
,hasDraftOnHackmd
が関連
- Page モデルの
- PageEditorByHackmd により、HackMD が iframe 内で起動
- HackMD 予め head 内に仕込まれていた script タグにより、GROWIサーバーの
/_hackmd/load-agent
を読み込んで実行- 参考ソース セクションの
hackmad-agent.js
- penpal を使って postMessage で GROWI と通信可能になる準備が整う
- 参考ソース セクションの
- GROWI HackmdEditor が penpal を通して hackmd-agent.js の
setValueOnInit
を叩き、Markdown string を渡す
iframe 間通信について
- postMessage を使っている
- ライブラリとしては penpal external_link
- セキュリティ対策のため、HackMD の head 内の script タグで読み込む
/_hackmd/load-agent
の準備段階で origin を設定している- 初期実装では
req.get('host')
を注入していたため、同一オリジンでないと通信できないような仕様になっていた - 5dc77d external_link で
app:url:fixed
というサーバー側URLを保持するコンフィグが新規に導入され、それを注入するように変更されたことにより、初期実装時の「同一オリジンでないと通信できない仕様」はなくなった
- 初期実装では
Save
(TBD)
Resume to edit
(TBD)
Discard
(TBD)
Page モデルの関連フィールド
(TBD)
- hasDraftOnHackmd
- revisionHackmdSynced
- hasDraftOnHackmd
参考ソース
HackMD head 内 script で読み込むもの
- hackmad-agent.js external_link
- hackmd-styles.js external_link
- 上記2つは、GROWI 側の route ファイル external_linkで swig template による変数の注入を経て提供される