-
Notifications
You must be signed in to change notification settings - Fork 5
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
ビルド情報をHTMLレベルで埋め込みたい #30
Comments
注意としては、data属性に埋め込む時点でHTMLのエスケープを入れる必要があるということです。jinjaに丸投げすれば多分いける |
yabai...>右上の「編集」ボタンのリンク先から取得
|
自動更新は必要です! 静的コンテンツをきちんと生成して初めてインターネットが健全になります。kunaiみたいなのはあくまでオマケです。 言われて思いついたのですが、逆に考えて「GitHubが更新されていたら画面上に更新表示を出す」とかはフロントエンドでできますね。15分ごとにポーリングとかで。それはそれでいいかもしれない。
これを僕がやり始めるとすごく大変そうなのでやってませんでした。これをやって頂けるとかなり理想に近づきます。mdのXHR GETリクエストを消せるので。 今 Kunai::Meta で使っているメタ情報は、
などです。漏れがあるかもしれませんが、 meta/meta.js の中で完結していると思います。 mdから取れない情報は基本的に使っていなくて、そういうのは上記のdata-属性に入れたと思います。 |
こんな感じの JSON を <header> 要素の {
"meta": {
"cpp": ["cpp11", "cpp17deprecated"],
"header": ["thread"],
"id-type": ["class"],
"namespace": ["std::this_thread"],
"class": ["id"]
},
"sources": [{
"id": "...そのコードブロックの要素を指し示すID...",
"source": "...実行可能なソース..."
}, {
"id": "...",
"source": "..."
}, {
...
}]
} |
今ってサンプルコードかどうかを判別するのが結構泥臭い方法でしかできないから、これはむしろ Markdown の方に何か情報を入れていっても良いかもしれないですね。 |
あざす!
そうなんですよね。なるべくsiteに変更を入れない方針なのでこれは悩みどころだったのですが、結局必要な気がしています。 今のサンプルコードの判別方法は これなので……… |
markdownのlang指定を |
@yumetodo むしろCommonMarkでこういう仕様が標準化されているならそれを使いたいくらいなのですが、こういう決まりを自前で作るなら markdown_to_html のスペシャルシンタックス扱いにした方が管理がしやすいのです。 |
こっちではこういうコード書いてました。ひどい https://github.com/cpprefjp/bite/blob/d39c0a7a0e26ca5e61906795d80526e03df61e11/main.py#L61-L65
|
何かの特殊なシンタックスでもいいですね。 |
|
既にこういう提案が上がっていて、
これは 「リファレンス内のページだがメンバ関数ではないベージのとき、本来何を対象にして解説しているページなのか」を表すスペシャルシンタックスの提案です(この例では なので、こういうやり方をするのであれば * cpp[meta sample-code] が良いのではないかなと。
runnable かどうかは定性的に判断できないので、もっとゆるふわな表現の方が僕は好きです。 |
ref: cpprefjp/kunai#18 |
runnableというかwell-formedか。 well-formedか否かは判別できるはず |
すいません、ここでの実行可能とは、Wandboxで実行可能、という理解であっていますか? |
http://spec.commonmark.org/0.28/#fenced-code-blocks CommonMark における Fenced code block の info string を使うなら、スペースの後にオプションを入れれば良いのですが、
markdown_to_html とか kunai の現行のMarkdownパーサとか site に元からあるシンタックスハイライトがこれに準拠しているかどうかは不明。 僕は心理的には Markdown のコードブロックに |
はい。僕も同じように思います。あくまで、 「このコードはサンプルコードです」 ということが示せればそれで良いのです。僕が余計なことを書きました。 |
|
@saki7 メタ情報でやる場合、今のメタ情報はファイル単位でしか使えないので、コードブロック毎に情報を設定できる方法が必要になります。 で、パッと良い感じの構文は思いつかないので、まあ # cpp:wandbox とか cpp:editable とか cpp:tryonline とか思いつきました |
それもあって
と発言しました。 構文的には |
※僕もアキラさんの意見に賛成で、「例」以下のコードブロックで動かないものがあれば、記事側を直した方が良いという認識です。
あー。言われてみれば、逆にこっち(→僕がさっき書いた方法)の方が大変ですね。 試してみたのですが、
<pre lang="cpp:example">
int a = 42;
std::string s = "これは cpp example"; <div class="highlight highlight-source-c++"> GitHubだと前者が死んでしまうので、 site がGitHubでプレビューできる以上は、やはりCommonMarkに準拠してスペースを入れるべきな気がします。 その上で、タグを何にするかですが、 @melpon も #30 (comment) で書いていたので |
@faithandbrave さんが一番サンプルコードを書いてると思うのですが、
って書いてたら、その場で編集して実行できるようになるというので問題ないですか?(既存のを入れ替えるのは、ある程度自動で抽出して適用するのはやれます) |
あまり新ルールを入れると、コントリビューターの参入障壁が上がるのでルールは少ないほうがよい、というのが基本的な考えです。 |
僕も site に仕様変更を入れないで済む可能性も含めて色々考えたのですが、仰るように boostjp もできれば綺麗にしたいですし、 cpprefjp の範囲でも article/ 以下の記事は既にサンプルコードの検知で限界が来ています。なので、僕はやはり site 側の書き方の仕様変更はこれで大丈夫です。これに、 #30 (comment) のメタ情報があれば、こちらで対応できます。 これまで上がっているメタ情報の追加の他に、html変換後の コードブロックを
|
※念のため補足ですが、 このIssueの内容が全て実装された場合、 Kunai は md を見に行かなくなるので、 |
ひとまず、ぼくはその方法で合意します。 |
了解です。
という情報に対して |
背景
Kunaiの実装では、実は最初はレガシーなページの表示をしていて、後から色々と上乗せしています(JavaScriptを丸ごとオフにすると、本来の表示を見ることができます)。
現行の実装
今のkunaiでは、ページを表示した後に、常に最新のmdファイルをGitHubのリポジトリからフェッチしています。
https://github.com/cpprefjp/kunai/blob/69ee7acd3ef1cd6d367f7636f980acad7f0d43c6/js/kunai/meta/meta.js#L59-L77
Kunai::Metaでは、このmdファイルをMarkdownパーサでパースした上で、一部のメタ情報を抜き出してcpprefjpそのもののUX向上に使っています。
蛇足ですが、これはフェッチ自体に 250msec, パース&処理に 6msec ほどで済んでいるので、体感ではあまり感じないと思います。
情報1. ルートのコミットハッシュ
Kunai::Metaを実現するために使っている1つ目のビルド情報が、ルートのコミットハッシュです。
ルートのコミットハッシュは GitHub では
Tree:
に相当するので、 git clone をすることなく 1つのコミットハッシュで全てのファイルのスナップショットが取れます。今は単純に
master
をコミットハッシュとして使っているので、常にmasterが取得されます。タイムラグによってはcpprefjpのサイト全体が不定な動作をする可能性があります。情報2. 現在ページのリポジトリ内相対パス
2つ目のビルド情報が、今見ているページのmdのオリジナルリポジトリルートからの相対パスです。これは今は、
https://github.com/cpprefjp/kunai/blob/69ee7acd3ef1cd6d367f7636f980acad7f0d43c6/js/kunai/meta/meta.js#L253
我ながら寒気がするような実装ですが、信じられないことに右上の「編集」ボタンのリンク先から取得しています。
改善案
実装としては、 base.html のテンプレートを
このようにすれば、スマートに解決できると思います。
The text was updated successfully, but these errors were encountered: