✅jekyllで日本語ファイル名が正しくリンクされない問題を修正する
ここまでのまとめ
100%ではないが、下記の大半は解消した
まだ解消してない箇所
hr.icon
例
ファイルとしてはこう
独学大全――絶対に「学ぶこと」をあきらめたくない人のための55の技法.md
リンク元はこう
- [独学大全――絶対に「学ぶこと」をあきらめたくない人のための55の技法](独学大全――絶対に「学ぶこと」をあきらめたくない人のための55の技法.md)でも繰り返し言ってた
なんでヒットしない?
code:dash?
1 独学大全――絶対に「学ぶこと」をあきらめたくない人のための55の技法.md
2 独学大全――絶対に「学ぶこと」をあきらめたくない人のための55の技法.md
見た感じ、同じですけど……
例2
ファイル
心理的安全性のつくりかた 「心理的柔軟性」が困難を乗り越えるチームに変える.md
リンク元
- [心理的安全性のつくりかた 「心理的柔軟性」が困難を乗り越えるチームに変える](心理的安全性のつくりかた 「心理的柔軟性」が困難を乗り越えるチームに変える.md)
code:why?
file: 心理的安全性のつくりかた 「心理的柔軟性」が困難を乗り越えるチームに変える.md
link: 心理的安全性のつくりかた 「心理的柔軟性」が困難を乗り越えるチームに変える.md
これも同じなんだけどなー……
例3
どういうこと
https://gyazo.com/a80e70d2e5e6fc6cea1c5b503369f8dc
例4
1
2
https://gyazo.com/2b7efcdced6646c699e1bee521d5728c
半角に変換されてる?
実ファイル上は全角ですけどねー
https://gyazo.com/18d75a9b50b77ad2e014dc88a9e8d31f
ggr
でも他の日本語名ページは普通に見れてるので、これは違う
jekyll で日本語タイトル記事を書くとファイルが見つからないエラー
なぜなのか。
jekyll serveで使われるwebrickは日本語が含まれるパスが正しく扱えない。
なぜ扱えないかがわからない、と結論している
仮説
長い日本語ファイル名だと何かが起こる以下パターンを含む率が上がるので観測されやすい、だった
?や!などがjekyll側で(ファイル名として使うときは)勝手に正規化?されている → true
jekyllが依存している何らかのライブラリ、かもしれないが
とりあえず手元でjekyllでビルドしてみるしかない
ダメだ、むずすぎる
要するにjekyllが日本語ファイル名をどう変換するかがわかればいいんだよ
何とかして辿れないか?
パターンをいくつか観測している
全角記号が勝手に半角化するケース
!とか()とか
いやこれ[](この部分の話)だから、俺の実装側の問題じゃない?sta.icon
全角記号が勝手に消えるケース
とか
全角?が%3Fになるケース
一部の特殊ファイル名が弾かれているケース
jekyllの仕様
https://gyazo.com/0905d5d20dc3d5234535171a2803c363
ダウンロードになるケース
https://gyazo.com/24ae5972d98874d5dcf4befa76f2c923
さらにまとめる
実装上の問題([](ここのファイル名生成部分))……は関係なくて、jekyllが悪さしている
jekyll側のフィルタリング
ダウンロードになるケース
よし、実装上の問題調べてみますか
実装
convert_step3()
get_linkee_filename_from_markdown_line()
ここで[](ここを拾っている)
_linkee_filename_to_windows_compatible()
code:こうしてる.py
windows_compatible_filename = fix_filename_to_windows_compatible(target_filename)
beforestr = '(' + target_filename + ')'
afterstr = '(' + windows_compatible_filename + ')'
newline = newline.replace(beforestr, afterstr)
fix_filename_to_windows_compatible()
半角スペースを_に
つまりfix_filename_to_windows_compatible()に集約される
想定どおりですsta.icon
ファイルつくるところは?
save_one_special_pages()
https://gyazo.com/cfdb148f6992fe8053e793e419c386bb
同じロジック
なので整合性は合うはずなんだよな
本文中の[](xxx.md)に対して、fix_filename_to_windows_compatibleが走る
mdファイル生成時も、fix_filename_to_windows_compatibleが走る
実際はjekyll側が勝手に悪さして全角文字を(ファイル名として扱う時に?)勝手に変換してやがる
jekyll側の悪さに対処するには?
アプローチは二つ
オプションで無効にする
俺の実装をjekyllの悪さに合わせる
こっちは嫌やな……sta.icon
あるいは --jekyll みたいなオプションを入れることでサポートの余地を与える
オプション調べる
ソース読んでる
このへん探ってるけど相対パスなどの正規化っぽくて、ファイル名ではなさそう
これもファイル名いじってるわけではなさそう
code:rb
name.gsub(%r!^\w\s-+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "").gsub(%r!\s+!, "_") pythonのre.subみたいなもんか
\wとか\sって何?
つまりalnumと空白を表現しているのか
要するにafterを_にしてるだけよな?
少なくとも全角を半角にするなんて処理はない
的を得ない。。。sta.icon
全角文字を半角文字している ← これ、どうやって探せばいいんだ?
そもそもjekyllがやってるとも限らない(依存先の何かがやっている可能性も十分ある)
ふとFirefoxで検索してみたら、全角の?を入れても半角の?がヒットするんだよな……
このロジック、もしかしたら相当深いところで実行されている??
ちなみにscrapboxの検索はちゃんと区別してくれる
さすがやsta.icon
……ぐー、俺が合わせるしかなさそうやな
entity_outputは?
?が%3Fに変換されてるのが気になった
?のascii codeだね
ここを制御するのがentity_outputじゃね?
いや、これはentityというよりもurl encodingか
関係ないです
実装
もうfix_filename_to_ghpages_compatible() ← これつくろうかなと諦めかけてる
fix_filename_to_windows_compatible()
fix_filename_to_jekyll_compatible() ← これを追加する
1: 全角記号を半角記号にする
2: 全角スペースを半角スペースx2にする
3: 半角括弧()を半角ブラケット[]にする
etc
あー、意外と難しいな
たとえば?を?にしても、今度はnot windows compatibleなのでそもそもファイル保存できない
としたら、もう特殊文字はファイル名上は全部別文字に置き換えてしまった方がいいのか?
案1: _にする
案2: ?は_quest_などもうちょっとわかりやすい文字にする
案1がシンプルだが、衝突が心配
例: は??.htmlとは!?.htmlは両方ともは__.htmlになってしまう
は??のリンクをクリックしても、表示されるのがは!?の中身(逆もしかり)……なんてことが起こる
が、衝突心配するケースは実用上はない気もするsta.icon
うん、一覧見てるけどないわ
一番頻出してる?と!でも全然心配ない
もうちょっと整理すると
1 jekyll compatible
全角記号を全部_にする
最低限[!? ]
それ以外はページタイトルとして(sta.iconは)使ってないので程々か、最悪なくてもいい
(と)も全部_にする
2 windows compatible
扱いづらいのでスペースもしてるけどsta.icon
うん、これならシンプルやsta.icon*2
実装したが
いやリンク以外の中身も修正されてるー。。。
https://gyazo.com/2e88ffa53dbd6b5c2ea2acc7ef9851ec
https://gyazo.com/83939d3167cf1907d7ee974e14c180bd
これは元々の変換がおかしいな
確認してみる
独学大全はダメ
数字も半角にされてる
全角英数も半角化してる
_に置換したことで、start with _にひっかかってしまう
英数字限定でok
3パターン試したけど全滅
単に時間差で反映されてない可能性はあるsta.icon