-
Notifications
You must be signed in to change notification settings - Fork 157
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
markdown リストの入れ子が反映されないことがある #1362
Comments
4スペースで直しました |
@faithandbrave 修正ありがとうございます。修正をもって close とされたようですが、 今後も発生しそうな話なので、修正あるいは事情を文書化できたらいいなと考えています。 |
Python標準のmarkdownライブラリでHTMLに変換しているので、そのライブラリの仕様でそうなってますね。 https://python-markdown.github.io/
どこかに書いておきます |
start_editing.mdにこのように記載しました。 |
ありがとうございます。 |
FYI: https://github.com/cpprefjp/site/blob/master/NOTICE.md Markdownレンダリングエンジンの仕様(特性)なんですかねぇ(今でもコレを使っている?)
|
あ、どこかに書いてあった気はしましたが、そこにありましたか…。 specialized.mdの名前を変えて、「cpprefjpのMarkdown記法」みたいにして、制限と拡張をまとめたいですね。やっておきます。 たしかsite_generatorのどこかで、GitHub Flavored Markdownと描画を合わせるために、.mdのインデントを一部変換してたりはしますね。箇条書きのなかでのコードブロックだったと思います。 |
specialized.mdからリネームした以下のページに、拡張と制限をまとめました。 https://cpprefjp.github.io/start_editing/markdown_cpprefjp.html |
元の議論内容と関係ないですが…上のページのセクション "HTMLエンティティを使用できない制限" の中の変換が壊れている気がします。コードブロックの中の実体参照が変換されて、更に地の文が消えている? ように見えます。 ソース
HTML表示
|
これが表示されない問題は直しました。コードブロック内のHTMLエンティティはなぜこうなるのだろう…。 close状態でコメントし合うのもよくないと思うので、一旦reopenします。 |
ありがとうございます! これも現 Markdown の制限でしょうか。見落としでなければ、この制限も上記ページに記されていない制限ということになるでしょうか。 |
「コードブロックのあとに空行が必要な制限」を追加しました |
Related commits: c747f4a, aacc4df Reference: cpprefjp#1362 (comment)
edit: プログラムの修飾に関係しているのだとすれば、その時点で認識されない文字列が含まれていた場合に検出してエラーメッセージを出力できないでしょうか (或いは、既にエラーメッセージは出力しているが誰もエラーログをチェックしていないだけ?)。或いは、もし検出できるのだとすればエラーメッセージを出力する代わりに、通常の処理に切り替えれば良いのかもしれませんが。 |
エラーにできそうですね。 site_generatorに手を入れてそのようなMarkdownを修正して実行するのもできそうではあります。 |
HTMLエンティティのところ、 Gistとかで以下のように書くと問題なく
site_generatorでそこから変換された以下をGistに貼ると ® になりますね。
どうしたものか… |
pandocでMarkdownをHTMLに変換したら、以下のようになりました。 変換前:
変換後:
site_generatorで |
コードブロックに言語指定としてbashを指定するとエスケープされました。textだとエスケープされませんでした。 なにも言語指定しない場合にbashを指定するよう、このへんを直そうかと思います。そうした場合に、コードブロックに 影響が大きいので懸念がある方がいたら教えてください。 if self.codehilite_conf and m.group('lang'):
highliter = CodeHilite(
code,
linenums=self.codehilite_conf['linenums'][0],
guess_lang=self.codehilite_conf['guess_lang'][0],
css_class=self.codehilite_conf['css_class'][0],
style=self.codehilite_conf['pygments_style'][0],
lang=(m.group('lang') or None),
noclasses=self.codehilite_conf['noclasses'][0])
code = highliter.hilite()
# サンプルコードだったら <div id="..." class="yata"> で囲む
if is_example:
code = '<div id="%s" class="yata">%s</div>' % (example_id, code)
else:
lang = ''
if m.group('lang'):
lang = LANG_TAG % m.group('lang')
code = CODE_WRAP % (lang, _escape(code)) # このへんをm.group('lang') or bashのシンタックスハイライトに直す |
ちょっと影響範囲が大きすぎるので、langが指定されていないコードブロックで |
そもそも |
bashでコードハイライトした場合の出力:
|
memo markdownライブラリのコードハイライトのコード: https://github.com/Python-Markdown/markdown/blob/master/markdown/extensions/codehilite.py |
本文中ではHTMLエンティティがでてきたら現状エラーになりますが、コードブロックでは書いたものがそのままでてきてほしい、というのが課題ですね |
うーん。何故そのような処理が入っているのか分かりますか。
つまり、
「lang を指定しないコードブロック」だけだったら |
あ、これなら直りましたね。 def _escape(txt):
"""basic html escaping"""
before = txt
txt = txt.replace('&', '&')
txt = txt.replace('<', '<')
txt = txt.replace('>', '>')
txt = txt.replace('"', '"')
txt = txt.replace("&", "<span>&</span>")
return txt
出力HTML:
表示:
|
とりあえず明日、影響しそうなところを一通り確認します |
確認してOKだったページ:
NGだったページ:
|
あ、まちがってる変換コードのままやってました。。。失礼しました。 |
上記ページに加えて確認したページ:
その他、関係なさそうな普通のページを数十ページ確認しました。 これでいけそうな気がしますが、懸念があれば数日中に教えてください。 |
差分としては、この1行だけです。 diff --git forkSrcPrefix/qualified_fenced_code.py forkDstPrefix/qualified_fenced_code.py
index 650929971a8341f7dc05ab63749f22354d35aed8..52039dd155cb967d41e4cf2f382e102b3a100579 100644
--- forkSrcPrefix/qualified_fenced_code.py
+++ forkDstPrefix/qualified_fenced_code.py
@@ -72,6 +72,7 @@ def _escape(txt):
txt = txt.replace('<', '<')
txt = txt.replace('>', '>')
txt = txt.replace('"', '"')
+ txt = txt.replace("&", "<span>&</span>")
return txt |
言語指定がない場合はそれで良さそうですが、言語指定がある場合でも ```cpp
int reg = 0;
int& ref = reg; // int* ptr = ® とやっていることは同じ
``` を変換すると <span class="kt">int</span><span class="o">&</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">reg</span><span class="p">;</span> <span class="c1">// int* ptr = ® とやっていることは同じ</span> という HTML になって、コメント内の |
これ というか自分の手元に昔作った |
(なんかこの問題デジャヴな感じがするなあと思っていたら、実は2年半前に手元で修正仕掛けていたということでした…) |
それでいきましょう! |
ありがとうございます。取り敢えずこの方針で考えてみることにします。ただ、当該ブランチが放置されていたのは何か微妙な点があったからだったはずで、なので改めて注意深く実装・動作の確認をする必要がある気がします。 |
cpprefjp/markdown_to_html#7 に移動します。 |
HTMLエンティティの問題は別PRで直すとして、あとは
これらについて、「書いた文章が表示されない」という気づきにくい問題が発生するので、site_generatorでHTMLへの変換前にMarkdownの変換をして解決しようかと思います。 |
箇条書きのインデントが2の倍数ならエラーにするCIはあっていい気がします |
erroneous_behavior_for_uninitialized_reads.md の「仕様」でリストの入れ子による
記述があり GitHub 上の表示でも構造が反映されますが、 cpprefjp.github.io 側では
入れ子にならず同じレベルに並ぶ形になっています。
ソース:
GitHub 表示
cpprefjp.github.io:
他の箇所を見て回るとどうもインデントが半角スペース2個だと入れ子にならず
4個だと入れ子になるようです。 site_generator の仕様として変える余地がないところなら
個別修正として該当箇所を半角スペース4個に直しておけばよさそうですが、
変更の余地があるところなら GitHub 上と同じく半角スペース2個で入れ子になるように
しておいたほうがよさそうな気もします。
ここらへん事情など知ってる人がいるかも?ということで一旦 issue にしてみます。
参照:
The text was updated successfully, but these errors were encountered: