マークダウンの解析についてどう思いますか?[閉まっている]


126

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

構文はここにあります

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

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

Markdownの実際の構文解析について何か意味のあることがない場合は、時間を割いてください。(これは厳しいように聞こえるかもしれませんが、はい、私は洞察を求めています。解決策ではなく、サードパーティのライブラリです)。

答えを少し助けるために、正規表現はパターン識別するためのものです!文法全体を解析しません。人々がそうすることを考えるのはフーバーです。

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

共有する価値があるとわかったら、私はソリューションで戻ってきます。


2
@cletusがマークダウンパーサーを作成しています。cforcoding.com/ search / label / markdownを
Alex Angas

私は同じことをしてしまいました。ただし、マークダウンを正式な文法であるかのように解析しようとしているわけではありません。異なる正規表現を再帰的に適用しました。そして、いくつかのパスで。それは非常にうまくいきました。
John Leidegren

@JohnLeidegren、私のような他の好奇心の強いユーザーがマークダウンを解析する試みを見ることができる可能性はありますか?
jmlopez 2013

@jmlopez申し訳ありませんが、そのソースにはもうアクセスできません。マークダウンパーサーが必要な場合は、使用できるNuGetパッケージがあります。アイデアは単純ですが、一連の正規表現をパスに適用し、入力を段落に分割してから、それがどのような種類の段落であるかを識別しようとします。最後に、段落内のリンクと文字スタイルを解析します。
John Leidegren 2013

2
Parsedownを見てください。テキストを行に分割します。次に、これらの行がどのように始まり、相互に関連するかを調べます。
Emanuil Rusev 2013

回答:


69

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


編集:Mauricio Fernandezは最近、彼のシンプルマークアップマークダウンパーサーをリリースしました。このパーサーは、OcsiBlogウェブログエンジンの一部として作成しました。パーサが書き込まれているのでOCamlの、それは非常に簡単かつ短い(268 SLOC パーサ、43 SLOC HTMLエミッタ)、まだ驚くほど速い 20%より速い(割引(手最適化Cで書かれた)とsixhundred速く回よりBlueClothルビー))、それはまだパフォーマンスのために最適化されていないという事実にもかかわらず。マウリシオ自身のウェブログでの内部使用のみを目的としているため、公式のマークダウン仕様からの逸脱がいくつかありますが、マウリシオはこれらの変更のほとんどを元に戻すブランチを作成しまし


1
面白い。多分私はそれをf#プロジェクトとして変換してみる
ShuggyCoUk

@Benjol同じ昔の話:時間がない:/
ShuggyCoUk

1
Terrence Parr(ANTLRの共著者)がANTLR 4向けに1つ作成しました:github.com/parrt/mini-markdown
Chris S

17

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

多分あなたに興味のある何か...


1
これは正式に非推奨になりました
Fabich 2018

7

マークダウン(およびその拡張Markdown extra)を解析しようとした場合、ステートマシンを使用して一度に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.
    

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

細心の注意を払うべき細かい点がたくさんあると私は確信しており、プロセスの間にRegexesが便利になる可能性があると確信しています。
結局のところ、彼らはテキストを処理するためのものでした。


3

おそらく、構文の仕様を理解するのに十分な回数読んで、構文解析の方法を理解するでしょう。

もちろん、既存のパーサーコードを読み取ることは、複雑さの主な原因と思われるものを確認するためにも、特別な巧妙なトリックが使用されている場合にも、見事です。MD5チェックサムの使用は少し奇妙に思えますが、なぜコードが実行されているのかを理解するのに十分なほどコードを研究していません。_EscapeSpecialChars()状態と呼ばれるルーチンのコメント:

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

単一の文字を完全なMD5で置き換えることは贅沢に思えますが、おそらくそれは本当に理にかなっています。

もちろん、Flexなどのツールが正規表現の沼から抜け出すためには、「真の」構文の作成を検討するのが賢明でしょう。


そのMD5のことはまだ私を悩ませています。また、過度の文字列操作は、あなたが自分で書くことができる実際のまともなパーサーよりも遅くなければなりません。
John Leidegren

2
Flexは実際にはパーサーの半分にすぎません。入力をトークン化したら、トークンの意味を判断する必要があります。これがパーサージェネレーターの目的です。それらはたくさんあります。( "Parser
Combinator

1
@jrockway:もちろんそうです、私は肩をすくめて、「彼がFlexで読み上げれば、Bisonを自動的に見つける」と思ったと思います。:)ありがとう。
アンワインド



1

他に4人以上のユーザーがいるプログラミング言語を使用している場合は、ライブラリを見つけて解析することができます。すばやくGoogleを実行すると、CL、Haskell、Python、JavaScript、Rubyなどのライブラリが明らかになります。このホイールを再発明する必要があることはほとんどありません。

本当に最初から作成する必要がある場合は、適切なパーサーを作成することをお勧めします。この手法を使用すると、MD5ハッシュでエスケープする必要がなくなります。(私があなたがこのようなことをしなければならないなら、それはあなたのデザインを再考する時であることに同意します。)


私は挑戦する準備ができています。私は図書館を見ましたが、それらはひどいです。醜いと愚かな。F#プロジェクトが必要なので、パーサーをF#で作成することを検討していますが、最終的にはC#で作成することになります。
John Leidegren

うまくいけば、F#にはParsecのようなライブラリがあります。もしそうなら、これは楽しいプロジェクトです;)
jrockway

0

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

それはあなたが使用したい言語に依存します、それを実装する最良の方法のために、それを行うための慣用的および非慣用的な方法があります。

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


1
誰かがそう言ったので、正規表現とperlは親友です。それがそのように使用されてきたということは、それが歴史的な祖先であるという事実に真実はありません。私はperlのようなものを使用していません。
John Leidegren

7
次に、それを使用しないでください。また、皮肉を学びます。
garrow

0

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

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

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

最善の方法は、既存のプロジェクトを使用/参加することです。これらの種類のものは、表示されるよりもずっと難しい


0

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

しかし、MD5の部分は不要です。

私は解析のコーディングを直接助けることはできませんが、おそらくこのリンクが何らかの方法であなたを助けることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.