Skip to content
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

脚注の追加 #140

Merged
merged 4 commits into from
Jul 18, 2024
Merged

脚注の追加 #140

merged 4 commits into from
Jul 18, 2024

Conversation

potato167
Copy link
Contributor

とりあえずこんな感じで進めていました。
markdown で入力した id をそのまま html で表示する感じになっています。
このまま進めると、連番をふることや、末尾に生成するのが難しくなると感じています。

@abap34
Copy link
Owner

abap34 commented Jun 25, 2024

具体的にどんな感じの仕様にしたのか教えていただけると助かります! 👀

@potato167
Copy link
Contributor Author

potato167 commented Jun 26, 2024

エスケープできない…

脚注の文中にいる方は、inlinefootnote で実装して、文中に

[^A]

という形の文があったら、id が ref_A となるような HTML の文を生成しています
実装の仕様は他の inline と同様に、string を引数として判定をしています。

脚注の本来末尾にあるべき方は、footnote で実装していて、文頭に

[^A]:hoge

という形の分があったら、 id が note_A となるような HTML の文を生成しています。
実装の仕様は他の文頭のものと同じで、read を渡して判定しています。

href も A を用いてそのまま生成しているので、 A が同じならお互いがお互いを参照するようになっています。

表示される番号?も連番ではなくて A がそのまま表示されます

@abap34
Copy link
Owner

abap34 commented Jun 26, 2024

まず連番についてですが、issue で言及したように、Reader クラスに情報を持たせるのはどうでしょうか?
例えば ExecutableCodeBlock では Reader が持っている editor_theme の情報をとってきて各ノードに持たせています。

ExecutableCodeBlock node(code, read.get_meta_data("editor_theme"));

脚注でも、Reader で現在の脚注のインデックス (?) を保持して、各 Footnote に番号を持たせればいけると思います。

https://github.com/abap34/almo/blob/main/src/syntax/ExecutableCodeBlock.hpp

末尾への挿入も同様にできると思います。

@noya2ruler
Copy link
Collaborator

インライン記法のパースは Reader を必要とせず動作をすることを想定している(たとえば、マッチ判定には Reader ではなくて std::string のみが与えられる)ので、ここに情報を入れるのであれば、ちゃんと検討した方がいいと思います。

たとえば Reader をそのまま投げる場合、ほとんどのインライン記法は Reader を必要としないので、あまりいい設計には思えないです。 int operator()(const std::string &s, Reader&) などとして、引数には取るけど内部で使用しないという表明はできるので、その方法でも致命的にひどいとは思わない、というのはあります。

構文解析とASTの処理が分けられていることをうまく利用して、ASTからHTMLの生成を行う際に、脚注情報をまとめるような処理を入れるという方向も考えたい気がします。

@abap34
Copy link
Owner

abap34 commented Jun 26, 2024

しばらく考えたんですが、

ASTからHTMLの生成を行う際に、脚注情報をまとめるような処理を入れるという方向

が一番良さそうに思いました。

つまり、実際の脚注の文章を作る方 ([^A]:hoge) は今までのように普通にパースしておいて、後処理でこれを根にする部分木を末尾にあたるところに付け替えるみたいな処理をすれば良さそうです。

連番を通す作業も、パース段階ではせずできた AST を走査して振るのが良さそうです。

とりあえず出来上がった AST に対する処理は後でやることにして、一旦パースまでこの PR で完結させることにしましょう ✊

@abap34 abap34 marked this pull request as ready for review June 26, 2024 07:32
@abap34 abap34 self-requested a review June 26, 2024 07:32
Copy link
Owner

@abap34 abap34 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すみません、先にこれだけお願いします 🙏

src/syntax/Footnote.hpp Outdated Show resolved Hide resolved
src/syntax/InlineFootnote.hpp Outdated Show resolved Hide resolved
src/syntax/InlineFootnote.hpp Outdated Show resolved Hide resolved
@potato167
Copy link
Contributor Author

#140 (review)

この分はやったつもりです。

@abap34 abap34 self-requested a review July 4, 2024 07:10
};
struct InlineFootnoteReferenceSyntax : public InlineSyntax {
static inline const std::regex rex = std::regex(R"((.*?)\[\^(.*?)\](.*?))");
int operator()(const std::string &str) const override {
Copy link
Owner

@abap34 abap34 Jul 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここの最後の正規表現がまずそうです. 最後に (.*?) としてしまうと最短マッチになってしまうので、空文字列とマッチして残りの部分が全て捨てられてしまうと思います。 ? は不要そうです

(https://regex101.com/ とかで動作が確認できます)

Suggested change
int operator()(const std::string &str) const override {
static inline const std::regex rex = std::regex(R"((.*?)\[\^(.*?)\](.*))");

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おそらく、

static inline const std::regex rex = std::regex(R"(\[\^(.*?)\])");

としてしまって

std::string prefix = sm.prefix().str();
std::string symbol = sm[1] ;
std::string suffix = sm.suffix().str();

とするのが一番よさそうです

@abap34
Copy link
Owner

abap34 commented Jul 4, 2024

少しバグが入ってそうなので修正をお願いします 🙇

make buildbuild/almo にバイナリができます。

---
title: テスト用
date: 2023-08-10
author: test
twitter_id: test
github_id: test
mail: test@test.com
ogp_url: test.com
tag: [test, test2]
author: test
url: test.com
site_name: test.com
twitter_site: test
---


footnote のテストをします。

同じ形式のものとして数式の場合も見ておきます。
例えば、 $1+1=2$ です。


まずは文中で [^1] と書いて、その下に注釈を書いて見ることにしようと思います。ちなみに$1+1=2$ です。
[^1]: これは注釈です。


今は`1` ですが複数文字も試します。

例えば、Aによる研究 [^reserch_A] を考えると、 

[^reserch_A]: これはAによる研究の注釈です。


他にも、連続してみます。研究2 [^2] と 研究3 [^long_reference3] です。

[^2]: これは2による研究の注釈です。
[^long_reference3]: これは3による研究の注釈です。


あとは注釈が文頭にない場合... これは仕様なら読まれないはず?

ここで、[^B] として、[^B]: これはBによる研究の注釈です。

不正な入力に対しては実行時エラーもしくは単におかしな出力になって欲しく、 SegmentFault にはなって欲しくないので、いくつか例を出します


入れ子: [^A[^B]] として、[^A[^B]]: これはAによる研究の注釈です。
他にも [[[[[^A]]]]]  [^A:B] [^A] [^A] [^A] 

[^A]: [^B]: [^C]: [^D]: [^E]: [^A]: [^B]: [^C]: [^D]: [^E]

を footnotes.md として保存して、 build/almo footnote.md -o tmp.html -d > ir.json として正常に出力されているかチェックしてみてください.

@abap34 abap34 merged commit 3e06afb into abap34:main Jul 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants