0

Scalaのパーサーコンビネーターライブラリ(基本的にはPEGパーサー)を使用してテキスタイルパーサーを作成することを検討していて、インライン修飾子を解析するためにどのようなアプローチを使用すべきか疑問に思いました。

This is *bold* text, _italic_ text, +underlined+ text, etc.

この場合、何が何で、何を解析する必要があるかはかなり明確です。ただし、それほど明確ではないエッジケースが多数あります。太字のテキストのみに焦点を当てる:

Which sections get bolded: 
*onomato*poeia* ?
bold *word*, without a space after?
tyr*annos*aurus
a bold word in a (*bracket*)?
How about *This *case?

明らかに、これは主観的(太字として数える必要があります)と客観的(解析ルールで正しく解析する方法)の組み合わせです。

私は次のようなPEGに傾いています

wordChar = [a-zA-Z]
nonWordChar = [^a-zA-Z]
boldStart = nonWordChar ~ * ~ wordChar
boldEnd = wordChar ~ * ~ nonWordChar
boldSection = boldStart ~ rep(not(boldEnd) ~ anyChar) ~ boldEnd

上記を次のように解析します。

<b>onomato*poeia</b> ?
bold <b>word</b>, without a space after?
tyr*annos*aurus    <- fails because of lack of whitespace
a bold word in a (<b>bracket</b>)?
How about *This *case? <- fails because there is no correct closing *

ただし、このメソッドがすべてのユースケースに当てはまり、すべてのエッジケースに明確に定義されているかどうかはわかりません。コピーして信頼できるこれを行うための標準的な方法はありますか?回避できるのであれば、アドホックでよく考えられていない言語仕様に頼りたくありません。

4

2 に答える 2

1

マークダウンの場合の標準はなく、実装はエッジの場合で異なります。マークダウンの場合の選択肢の1つとして、MultiMarkdownでも使用されているpeg-markdownを確認できます。もちろん、マークダウンはこの点でテキスタイルよりも複雑です。これは**、太字と*斜体を使用するため、のようなものをどのように扱うかについてさらに多くの決定をもたらすため*hello**there**です。

PHPマークダウンエクストラの開発者であるMichelFortinは、太字/斜体のエッジケースを多数含むテストスイートを持っています。ただし、ここでの彼の決定については普遍的な合意はないと思います。また、多くの実装は異なる方法で解析されます。

そうは言っても、次の決定はマークダウンではかなり議論の余地がないと思います。

  • *次の文字が空白以外の場合にのみ強調を開始します。
  • *前の文字が空白以外の場合にのみ強調を終了します。
  • 強調は単語内で発生する可能性があるため、he*ll*oでは、2つのlが強調されます(ただし、一部のマークダウン実装_では、識別子でアンダースコアが一般的であるため、文字のこの機能が無効になります)。
于 2012-08-08T23:02:46.457 に答える
0

しばらく調達した後、reStructuredTextのインラインマークアップ認識ルールを見つけました。

マークダウンのルールには従いません。特に、のようなものt*hi*sはインラインタグとして解析されませんが、それは非常に似ており、全体的な目的も似ています。

これもやや複雑な仕様ですが(たとえば、角かっこと句読点用の特別なケーシングを使用)、かなり明確に指定され、完全に説明され、正当化されています。私はそのスペックが構築するためのかなり堅実な基盤であることに気づきました。

于 2012-08-08T23:23:03.607 に答える