vivliostyle/themes

Prettierによる整形で原稿MDファイル内容が書き換えられてしまう問題

Closed this issue · 1 comments

このリポジトリではpackage.jsonの次の設定によってcommit時にprettierによる整形が実行されるようになっている:

themes/package.json

Lines 34 to 38 in da19c8d

"husky": {
"hooks": {
"pre-commit": "lint-staged && pretty-quick --staged"
}
},

各テーマパッケージのexampleの原稿MDファイルに対してこれが適用されて次のように意図しない書き換えがされてしまうことがある:

  • 和文文字と欧文文字との間にスペース(U+0020)が挿入される(prettier v2の問題)
    • 和欧文間スペースの処理はCSS組版エンジンで行われるものなので、原稿テキストにこのようなスペース文字を入れるべきではない
    • この問題については、prettier v3では修正されている:
  • 意図的に入れている段落の行頭の全角スペース(U+3000)が削除される
    • 電書協EPUB3制作ガイドでは段落の字下げに全角スペースを入れる(行頭が括弧以外の場合)ことが勧められている。この形式の原稿が扱えないのは問題。
  • VFMでの見出しの属性記法で、見出しの行のあと改行してから属性記法 { … } を書いている場合(見出しの内容がインラインの要素で終わるときそうする必要がある)、改行がさらに追加されて空白行があいだにできる。そうすると見出しの属性記法ではなくなってしまい、{ … } がテキストとして出力されてしまう事故になる。

このうち問題のうち最初の「和文文字と欧文文字との間にスペース(U+0020)が挿入される」については、prettierのバージョンを現在使われている v2 から最新の v3 に更新すると解決するはず。しかし、commit時のprettier実行のために使われているpretty-quickがprettier v3に対応していないという問題があり、prettierを最新にするためにはpretty-quickをほかのものに置き換える必要がある。そのpretty-quickのissue:

実際に問題が起きた例:

  • #118 の電書協のEPUBサンプルをベースにMD化したサンプルをコミットしたとき、この意図しない書き換えが生じた。そのあとそれを直したコミット 8c69966 での差分を参照。

当面の対策としては、.prettierignore ファイルでMDファイルが整形対象にならないようにする。例:

packages/@vivliostyle/theme-epub3j/**/*.md

Prettier v3へのアップグレードは #131 で完了しました。これにより以下の問題が解決しました。

和文文字と欧文文字との間にスペース(U+0020)が挿入される

一方で、以下の問題のため packages/@vivliostyle/theme-epub3j/**/*.md は引き続きPrettierのフォーマットの対象外としています。

意図的に入れている段落の行頭の全角スペース(U+3000)が削除される

本来、行頭の全角スペースはCSSによる指定で再現が可能であるため、行頭の全角スペースを削除するPrettierによるフォーマットは妥当性があるように思います。そのため、theme-epub3jのMarkdownファイルを例外的にPrettierの対象外にする現在の対応が最良だと思います。