質問

  

編集:最近、CommonMarkと呼ばれるプロジェクトについて学びました。   オリジナルのあいまいさを正しく識別して処理する   マークダウン仕様。 http://commonmark.org/ 素晴らしいC#ライブラリがあります   サポート。

こちらの構文をご覧ください。

ダウンロードに続くソースは Perl で書かれていますが、これは意図していません。敬意を表する。正規表現にあふれており、特定の文字をエスケープするために MD5 ハッシュに依存しています。それについて何かが間違っています!

Markdown のパーサーをハードコーディングしようとしています。これの経験とは何ですか?

Markdownの実際の構文解析について言う意味がない場合は、時間を節約してください。 (これは耳障りに聞こえるかもしれませんが、はい、解決策ではなく、サードパーティのライブラリではなく、洞察を探しています)。

答えを少し助けるために、正規表現はパターンを特定するためのものです!文法全体を解析しない。人々がそうすることを検討しているのはfoobarです。

  • Markdownについて考える場合、それは基本的に段落の概念に基づいています。
  • そのため、合理的なアプローチは、入力を段落に分割することです。
  • 見出し、テキスト、リスト、ブロック引用、コードなど、多くの種類の段落があります。
  • したがって、課題はこれらの段落を特定し、どのような文脈で発生するかです。

共有する価値があるとわかったら、解決策を返します。

役に立ちましたか?

解決

私が知っている、実際のパーサーを使用する唯一のマークダウン実装は、 Jon MacFarleane ’です。 ■ peg-markdown そのパーサーは、 Parsing Expression Grammar ペグ


編集: Mauricio Fernandez は最近、シンプルマークアップマークダウンパーサー OcsiBlog ウェブログエンジン。パーサーは OCaml で記述されているため、極めてシンプルで短い(268 SLOC パーサー HTMLエミッター)、まだ 非常に高速高速 discount (手動で最適化されたCで記述)および sixhundred 回よりも href = "http://Deveiate.Org/projects/BlueCloth/" rel = "noreferrer"> BlueCloth Ruby ))、それはまだパフォーマンスのために最適化されていないという事実にもかかわらず。 Mauricio自身のブログでの内部使用のみを目的としているため、公式Markdownとは若干異なります。仕様ですが、Mauricioはこれらの変更のほとんどを元に戻すブランチを作成しました

他のヒント

先週 pegdown と呼ばれる新しいパーサーベースのMarkdown Java実装をリリースしました。 pegdownはPEGパーサーを使用して、最初に抽象構文ツリーを構築し、続いてHTMLに書き出されます。そのため、正規表現ベースのアプローチよりも非常にクリーンで、読み取り、保守、拡張がはるかに簡単です。 PEG文法は、John MacFarlanes Cの実装「peg-markdown」に基づいています。

おそらく興味のあるもの...

マークダウン(およびその拡張子マークダウンエクストラ)を解析しようとした場合ステートマシンを使用して一度に1文字ずつ解析し、テキストの一部を表す内部構造をリンクし、すべてが解析されると、すべて文字列化されたオブジェクトから出力が生成されると思います。

基本的に、入力ファイルを読み取るときにミニDOMのようなツリーを構築します。
出力を生成するには、ツリーを走査してHTMLまたはその他のもの(PS、LaTex、RTFなど)を出力するだけです

複雑さを増す可能性のあるもの:

  • ルールは簡単に実装できますが、HTMLとマークダウンを混在させることができるという事実:2つのバランスの取れたタグの間にあるものはすべて無視して、そのまま出力します。

  • URLとメモは、テキストの下部に参照を含めることができます。ハイパーリンクにデータ構造を使用すると、次のように簡単に記録できます。

    [my text to a link][linkkey]
    results in a structure like: 
        URLStructure: 
        |  InnerText : "my text to a link"
        |  Key       : "linkkey"
        |  URL       : <null>
    
  • ヘッダーは下線で定義できます。これにより、一般的な段落に単純なデータ構造を使用し、ファイルを読み取るときにそのプロパティを変更することができます。

    ParagraphStructure:
    |  InnerText    : the current paragraph text 
    |                 (beginning of line until end of line).
    |  HeadingLevel : <null> or 1-4 when we can assess 
    |                 that paragraph heading level, if any.
    

とにかく、いくつかの考えだけ。

細心の注意を払うべき細部がたくさんあると確信しており、プロセス中に正規表現が便利になる可能性があると確信しています。
結局のところ、それらはテキストを処理するためのものでした。

おそらく構文仕様を十分に読んでそれを知ることができ、構文解析の感覚をつかむことができます。

もちろん、既存のパーサーコードを読むことは、複雑さの主な原因と思われるものを確認したり、特別な巧妙なトリックが使用されているかどうかを確認したりするのに最適です。 MD5チェックサムの使用は少し奇妙に思えますが、なぜコードが実行されているのかを理解するのに十分なコードを研究していません。 _EscapeSpecialChars()と呼ばれるルーチンのコメントには次のように記載されています。

  

このような各文字を、対応するMD5チェックサム値に置き換えています。   これはおそらくやり過ぎですが、エスケープとの衝突を防ぐ必要があります   偶然の値。

1つのキャラクターを完全なMD5に置き換えることは贅沢に思えますが、おそらく理にかなっています。

もちろん、&quot; true&quot;の作成を検討することは賢明です。構文、 Flex などのツールを使用して、正規表現の沼地から抜け出します。

Perlがあなたのものでなければ、少なくとも10か国語にMarkdown実装があります。おそらくすべてが100%の互換性を持っているわけではありませんが、かなり近い傾向があります。

MarkdownPapers は、パーサーが JavaCC 文法。

php、ruby、java、c#、javascriptなど、多数の言語で利用可能なライブラリがあります。これらのいくつかを考えてみることをお勧めします。

使用する言語によって異なりますが、実装する最良の方法は、慣用的および非慣用的方法があります。

perlとregexは親友なので、正規表現はperlで動作します。

他に3つ以上あるプログラミング言語を使用している場合 ユーザーの場合は、解析するライブラリを見つけることができるはずです。 A Googleのクイック検索により、CL、Haskell、Python、 JavaScript、Rubyなど。必要になる可能性は非常に低い この車輪を再発明します。

本当に最初から書く必要がある場合は、 適切なパーサー。このテクニックを使用すると、物事をエスケープする必要はありません MD5ハッシュを使用します。 (このようなことをしなければならない場合、 デザインを再検討する時が来ました。

MarkdownはJAWL(単なる別のWiki言語)です

パーサーのコードを調べることができるオープンソースwikiがたくさんあります。ほとんどはREGEXを使用します

screwturn wikiをご覧ください。興味深いマルチパスフォーマッタパイプラインがあり、非常に優れた手法です。/core/Formatter.csおよび/core/FormatterPipeline.csを参照してください

既存のプロジェクトを使用/参加するのが最善です。これらの種類のものは、常に表示されるよりもはるかに困難です

こちらでは、MarkdownのJavaScript実装を見つけることができます。また、これはテキストを解析するための最も高速で簡単な方法であるため、正規表現にも大きく依存しています。

ただし、MD5パーツは不要です。

解析のコーディングを直接支援することはできませんが、このリンクが何らかの形で役立つ場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top