130

編集: 私は最近、CommonMark と呼ばれるプロジェクトについて知りました。このプロジェクトは、元の Markdown 仕様のあいまいさを正しく識別して処理します。http://commonmark.org/優れた C# ライブラリ サポートがあります。

ここで構文を見つけることができます。

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

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

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

答えを少し助けるために、正規表現はパターンを識別するためのものです! 文法全体を解析しないでください。人々がそうすると考えるのは愚か者です。

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

共有する価値があると判断したら、解決策をお知らせします。

4

10 に答える 10

72

私が知っている唯一のマークダウン実装で、実際のパーサーを使用しているのは、Jon MacFarleanepeg- markdownです。そのパーサーは、 pegと呼ばれる解析式文法パーサー ジェネレーターに基づいています。


編集: Mauricio Fernandezは最近、Simple Markup Markdown parserをリリースしました。これは、彼がOcsiBlog Weblog Engine の一部として作成したものです。パーサーはOCamlで書かれているため、非常にシンプルで短い (パーサーの場合は 268 SLOC 、 HTML エミッターの場合は 43 SLOC )にもかかわらず、非常に高速(割引より 20% 高速 (手動で最適化された C で記述))、600倍高速です。 BlueCloth ( Rubyより))、まだパフォーマンスが最適化されていないという事実にもかかわらず。これは Mauricio 自身が自分のウェブログで内部使用することのみを目的としているため、公式の Markdown 仕様からの逸脱がいくつかありますが、Mauricio はそれらの変更のほとんどを元に戻すブランチを作成しました.

于 2009-03-03T10:35:56.473 に答える
17

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

たぶんあなたにとって何か興味があります...

于 2010-05-03T08:16:07.537 に答える
7

マークダウン(およびその拡張機能であるMarkdown extra)を解析しようとすると、ステートマシンを使用して、一度に1文字ずつ解析し、テキストのビットを表すいくつかの内部構造をリンクして、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.
    

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

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

于 2009-03-03T09:20:06.483 に答える
2

MarkdownPapersは、パーサーがJavaCC文法で定義されているもう1つのJava実装です。

于 2011-04-29T06:11:22.183 に答える
0

Markdown は JAWL (別のウィキ言語) です。

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

スクリューターン wiki をチェックしてください。興味深いマルチパス フォーマッタ パイプラインがあり、非常に優れたテクニックです。/core/Formatter.cs と /core/FormatterPipeline.cs を参照してください。

最善の方法は、既存のプロジェクトを使用/参加することです。これらの種類のことは、常に見た目よりもはるかに困難です

于 2009-03-03T08:20:28.687 に答える