-
Notifications
You must be signed in to change notification settings - Fork 4
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
脚注の追加 #140
Conversation
具体的にどんな感じの仕様にしたのか教えていただけると助かります! 👀 |
エスケープできない… 脚注の文中にいる方は、inlinefootnote で実装して、文中に
という形の文があったら、id が ref_A となるような HTML の文を生成しています 脚注の本来末尾にあるべき方は、footnote で実装していて、文頭に
という形の分があったら、 id が note_A となるような HTML の文を生成しています。 href も A を用いてそのまま生成しているので、 A が同じならお互いがお互いを参照するようになっています。 表示される番号?も連番ではなくて A がそのまま表示されます |
まず連番についてですが、issue で言及したように、 almo/src/syntax/ExecutableCodeBlock.hpp Line 91 in 3100fc5
脚注でも、 https://github.com/abap34/almo/blob/main/src/syntax/ExecutableCodeBlock.hpp 末尾への挿入も同様にできると思います。 |
インライン記法のパースは Reader を必要とせず動作をすることを想定している(たとえば、マッチ判定には たとえば 構文解析とASTの処理が分けられていることをうまく利用して、ASTからHTMLの生成を行う際に、脚注情報をまとめるような処理を入れるという方向も考えたい気がします。 |
しばらく考えたんですが、
が一番良さそうに思いました。 つまり、実際の脚注の文章を作る方 ( 連番を通す作業も、パース段階ではせずできた AST を走査して振るのが良さそうです。 とりあえず出来上がった AST に対する処理は後でやることにして、一旦パースまでこの PR で完結させることにしましょう ✊ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すみません、先にこれだけお願いします 🙏
この分はやったつもりです。 |
}; | ||
struct InlineFootnoteReferenceSyntax : public InlineSyntax { | ||
static inline const std::regex rex = std::regex(R"((.*?)\[\^(.*?)\](.*?))"); | ||
int operator()(const std::string &str) const override { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここの最後の正規表現がまずそうです. 最後に (.*?)
としてしまうと最短マッチになってしまうので、空文字列とマッチして残りの部分が全て捨てられてしまうと思います。 ?
は不要そうです
(https://regex101.com/ とかで動作が確認できます)
int operator()(const std::string &str) const override { | |
static inline const std::regex rex = std::regex(R"((.*?)\[\^(.*?)\](.*))"); |
There was a problem hiding this comment.
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();
とするのが一番よさそうです
少しバグが入ってそうなので修正をお願いします 🙇
---
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 として保存して、 |
とりあえずこんな感じで進めていました。
markdown で入力した id をそのまま html で表示する感じになっています。
このまま進めると、連番をふることや、末尾に生成するのが難しくなると感じています。