関連ページ

吐き出し

  • yuki から (9/12 時点で) ヒアリングした内容を tatsuya がまとめている

具体例

本文が

あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

で、インラインコメントを「夏でも底に冷たさをもつ青いそら」に付けたいとする 非Markdownのプロダクトであれば、bodyを

あのイーハトーヴォのすきとおった風、<selected id="sel-1">夏でも底に冷たさをもつ青いそら</selected>、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

のようにして保存すれば、selected エレメントをとりだしてなんらかの react component でレンダリングすればインラインコメントを制御できる

だが Markdown プロダクトではそうはいかない
そこで、revision.body の素の Markdown とは別に、revision.markedBody として別途

あのイーハトーヴォのすきとおった風、<selected id="sel-1">夏でも底に冷たさをもつ青いそら</selected>、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

という文字列を保存することにする

モデル

  • markedBody という attribute を Revision モデルに追加
    • markdown body にコメントのアンカー(タグでもなんでもいいが)を複数付加した全文を保存する

ロジック(ユースケース)

更新時はどうするのか

  1. 元の文書を仮に rev1 とする
    • まだ markedBody は存在していない
  2. インラインコメントを付ける
    • rev1 の reivision に markedBody が作成される
  3. 元の文書を更新して保存する -> rev2 になる
    • rev1 の body と rev2 の body の diff をとる (これを仮に patch1-2 とする)
    • rev1 の markedBody に patch1-2 を適用し、コンフリクトが起きたら自動で解消する
    • コンフリクトした部分は全て rev2 を採用する

上記を保存し、rev2 の markedBody とする

フロントエンドの見せ方

markedBody が存在する場合は、remark/rehype で解析するときにそれを入力にし、インラインコメント部を react component でレンダリングする