web-dev-qa-db-ja.com

DSLファイルをHTMLに解析する方法は?

辞書を作成および配布するための [〜#〜] dsl [〜#〜] 形式があります。このような形式のすべての辞書記事は次のようになります。

algorithm
    [m0][b]al·go·rithm[/b] {{id=000001018}} [c rosybrown]\[[/c][c darkslategray][b]algorithm[/b][/c] [c darkslategray][b]algorithms[/b][/c][c rosybrown]\][/c] [p]BrE[/p] [c darkgray] [/c][c darkcyan]\[ˈælɡərɪðəm\][/c] [s]z_algorithm__gb_1.wav[/s] [p]NAmE[/p] [c darkgray] [/c][c darkcyan]\[ˈælɡərɪðəm\][/c] [s]z_algorithm__us_1.wav[/s] [c orange] noun[/c] [c darkgray] ([/c][c green]computing[/c][c darkgray])[/c]
    [m1]{{d}}a set of rules that must be followed when solving a particular problem{{/d}} [m3] 
    {{Word Origin}}[m3][c darkslategray][u]Word Origin:[/u][/c]
    [m3][c darkgray] [/c]{{d}}late 17th cent.{{/d}} [c dimgray]{{etymology}} (denoting the Arabic or decimal notation of numbers): variant (influenced by {{/etymology}} [/c][c darkslategray]{{lang}}Greek{{/lang}} [/c][c darkgray] [/c][c darkcyan]{{ff}}arithmos{{/ff}} [/c][c darkgray] [/c][c darkslateblue][b]{{etym_tr}}‘number’{{/etym_tr}}[/b][/c][c dimgray]{{etymology}}) of {{/etymology}} [/c][c darkslategray]{{lang}}Middle English{{/lang}} [/c][c darkgray] [/c][c darkslategray]{{etym_i}}algorism{{/etym_i}}[/c][c dimgray]{{etymology}}, via {{/etymology}} [/c][c darkslategray]{{lang}}Old French{{/lang}} [/c][c dimgray]{{etymology}} from {{/etymology}} [/c][c darkslategray]{{lang}}medieval Latin{{/lang}} [/c][c darkgray] [/c][c darkcyan]{{ff}}algorismus{{/ff}}[/c][c dimgray]{{etymology}}. The {{/etymology}} [/c][c darkslategray]{{lang}}Arabic{{/lang}} [/c][c dimgray]{{etymology}} source, {{/etymology}} [/c][c darkcyan]{{ff}}al-K̲wārizmī{{/ff}} [/c][c darkgray] [/c][c darkslateblue][b]{{etym_tr}}‘the man of K̲wārizm’{{/etym_tr}} [/b][/c][c dimgray]{{etymology}} (now Khiva), was a name given to the 9th-cent. mathematician Abū Ja‘far Muhammad ibn Mūsa, author of widely translated works on algebra and arithmetic.{{/etymology}} [/c]

それを[〜#〜] html [〜#〜]に解析する必要がありますJavaアプリケーション。
私の質問はそれを行う方法ですか?私は2つのオプションについて考えました、

  • すべてのケースをカバーする複数のregex式を記述します
  • ノードに分割することにより、それを意味ツリーのようなものに解析し、各ノードは独自に解析します

そんな仕事の経験は全くないので、アドバイスや落とし穴をお願いします。どんな助けでも感謝します!

1
Anatoly

一連の正規表現を作成してから、どの正規表現をいつ使用するかを判断する一連のコードを作成できます。これは実際、かなり単純なものにとってはひどい考えではありません。このような場合は、おそらく grammar を定義し、 [〜#〜] antlr [〜#〜] のようなツールを使用してレクサー/パーサーを構築します。

最初は少し怖いかもしれませんが、役立つリソースはたくさんあります。最初に、チュートリアルの1つを試して、簡単な言語パーサーを作成します。正規表現やそれらの使用方法と多くの重複があるはずです。

3
JimmyJames

既存のツールが解析できる形式に変換しないのはなぜですか?

このDSLは、簡単にXMLに変換できるように見えます。

この例では、4つのタイプの「要素」があるように見えます。

  • パターン[タグ名] * [/タグ名]に従う要素
  • パターン{{tag-name}} ** {{/ tag-name}}に従う要素
  • パターン{{tag-name = value-string}}を持つ自己終了要素
  • 周囲のタグのない独立したテキスト要素

Speculation: 2つのタイプの要素がインターリーブされることが期待されていないようです。

  • [x] {{y}}何とか[/ x]何とか{{/ y}}

XMLへの安価なコード変換はどうですか?

これが正しい場合は、これらの各パターンをXML要素に変換する方法を決定できます。例えば:

  • 「[タグ名]」を<tag-name>に、「[/タグ名]」を</tag-name>に変換します

  • 「{{tag-name}}」と「{{/ tag-name}}」を<cc-tag-name></cc-tag-name>に変換します

  • たとえば、「{{tag-name = value-string}}」を<tag-name>value</tag-name>または<tag-name value=value-string/>に変換します

  • 独立したテキストノードはそのままにしておきます。 XML(およびHTML)はすでにそれらをサポートしています。

この変換は、3つの正規表現によるグローバル置換を使用して行うことができます。手動でコード化された再帰パーサーコンバーター(これはかなり小さいでしょう)でそれを行うことができます。

ほとんどの人はおそらくこの仕事のために正規表現を好むでしょうが、この場合、プロセスに構造検証を入れたいので、手でコーディングしたコンバーターを書く傾向があります。要素がXMLでサポートされない方法でインターリーブされるケースを記録または処理する。

ソースデータが私の想定に違反しているかどうかを早期に確認したいと思います。

有効な文字セットとエスケープルールを知っている必要があります。

読み取る入力データが大量である場合、正規化が必要な場合や、データ内で「エンティティ」表記の形式で表現される場合がある、見慣れないUnicode文字など、奇妙なケースが発生する可能性があります。

少なくとも、[、]、{{、}}、/がテキストで発生し、マークアップの一部ではない場合に、それらがどのようにエスケープされるかを知る必要があります。これを処理しないと、一部の辞書エントリでプロセスが失敗する可能性が高くなります。

ドキュメントはあなたにこれらのことを教えてくれるかもしれません。一見の価値があります。

わかりました。XMLはありますが、HTMLが必要でした

XMLへの変換のポイントは、XMLの解析、XMLの変換、XMLのデシリアライズを設計のオブジェクトに行うための多くの無料のオープンソースツールを自由に使用できることです。

HTMLを生成すると、この入力データに含まれていない多くの決定が行われます。

  • ナビゲーション:ユーザーはどのようにさまざまなエントリに移動しますか?エントリは常に完全な詳細で表示されますか、それとも短い形式もありますか?

  • フォーマット、プレゼンテーション:このマークアップをhtml構造とcssスタイルシートにマッピングします。入力の一部のセクションは、マークアップに含まれていないマージン/インデントが必要なように見えます。

  • 検索:適切なユーザーエクスペリエンスを得るには、このマークアップからインデックス用語を抽出して、テキスト検索サービスにロードする必要がある場合もあります。

  • アクセシビリティ:それが要件の一部である場合。

  • 画像?存在する場合は、前処理が必要になる場合があります。

それをPOJOに解析し(たとえば、Jacksonまたは他のリフレクションベースのデシリアライザを使用)、htmlテンプレート(たとえば、Freemarker、Thymeleaf、Velocity、さらにはJSP)を使用することができます。すべてのデータを再処理せずにプレゼンテーションを変更できる柔軟性を確保するためだけに、CSSスタイルをドキュメントのメインテキストから分離することをお勧めします。

データをXMLまたはその他の十分にサポートされている形式で配置すると、これらのより複雑なタスク用の多くのツールから選択できます。

しかし、それは必要ではありません、そしてあなたがそれがあなたの時間を節約するだろうと思わないなら、あなたはおそらくそれをするべきではありません。

もちろん、入力を選択したJavaオブジェクトモデルに直接、または直接HTMLに解析できます。ANTLRは素晴らしいですが、以前の回答が示唆しているように、かなりの設定と学習曲線があります。

1
joshp