0

これは一種のコーナーケースです。Haskell、Text.XmlHtml (バージョン 0.2.3) を実行しています。Pandoc (バージョン 1.12) からソース データを取得しています。ソース ファイルはすべて Markdown 形式です。

このコーナーでは、Markdown ファイルに生の Html が直接含まれている場合について説明します。もちろん、これは Markdown 形式でサポートされており、必要な種類のテーブル レイアウトを取得する唯一の方法である場合があります。Pandoc はファイルだけを読み取りますが、Html セクションに到達すると、出力される内容はおおよそ次のようになります。

[ RawInline (Format "html") "<a href=\"abcdefg\">"
, RawInline (Format "html") "<img src=\"image.png\" />"
, RawInline (Format "html") "</a>" ]

したがって...これを階層ツリーに変換すると、非常に複雑になる可能性があります。望ましい結果は、XmlHtml では次のようになります。

Element "a" [("href", "abcdefg")] [Element "img" [("src", "image.png")]]

しかし、階層的な構造 (Pandoc が出力するものはすべて適切に階層化されています) を扱っている場合、それを取得するのは非常に難しく、突然そうではなくなりますが、「階層的でない」部分は、基本的に Html パーサーを構築することによってのみ見つけることができます。これは、他の構造を囲む複数の文字列で機能します。

理想的には、私が発行したいのは単純なTextNodeです:

TextNode "<a href=\"abcdefg\"><img src=\"image.png\" /></a>"

これは、RawInline ごとに 1 つずつ、一連​​の TextNode を発行するか、RawInline 要素をまとめるかのいずれかで行うことができます。要点は、生の Html を含む TextNode を出力し、最終的にそれを追加の Html エスケープなしでレンダリングしたいということです。

私のレンダラーは最終的に Heist スニペットですが、それはおそらく Blaze 経由で実行されることを意味します。

うまくいくかもしれない最後の代替手段は、Pandoc から Blaze Html レンダラーを経由し、次に XmlHtml パーサーを経由して、Heist スニペットに埋め込むことができるものを取得することです。汚いと思うので避けたいです。

(JavaスクリプトをMarkdownドキュメントに入れたい場合、実際には同じ問題に遭遇すると思います...これは言語によって技術的に許可されていますが、おそらく非常に悪いことです。)

これを行う方法はありますか、それともツールに制限されすぎていますか?

アップデート

PandocからBlaze、XmlHtmlへのレンダリングのルートを試してみました。Htmlがエスケープされた最終ノードに配置され、ブラウザーに表示されるという同じ結果が得られることがわかりました。これが私の関数です(これは、私が行った完全な実装よりもはるかに短くて簡単でした...)

pandocToHtml :: Pandoc.Pandoc -> [XmlHtml.Node]
pandocToHtml = Text.Blaze.Renderer.XmlHtml.renderHtmlNodes . Pandoc.writeHtml Pandoc.def

Pandoc.def には、allow_raw_html を含むすべての「allow_raw_*」拡張機能が含まれています。

最後に考えられるのは、独自の断片的な html パーサーを適用することです (そして、それを Pandoc に提供することもできます)。結局、これはひどく難しいことではありませんでした。

4

1 に答える 1

1

これを行う唯一の方法は、次のように自分でノードを構築することです。

Element "a" [("href", "abcdefg")] [Element "img" [("src", "image.png")]]

...またはパーサーを介してマークアップを実行します。これは仕様によるものです。の内容TextNodeは常にエスケープされます。XmlHmtl は、pandoc スタイルのマークダウン用に設計されていません。XML および HTML 用に設計されています。そのため、最初にドキュメントをその形式にする必要があります。pandoc を使用してマークダウンを HTML にレンダリングし、その上で XmlHtml パーサーを実行できるように思えます。

XmlHtml には、ドキュメントの特定の部分を未加工のテキストとして解釈するためのメカニズムがあります (HTML 仕様で要求されているように)。どのタグが未加工のテキストとして解釈されるかは、こちらで確認できます。0.2.2 では、XmlHtml を更新して、生のテキストとして扱われるものをユーザーがより細かく制御できるようにしました。ノードを raw として扱いたい場合は、xmlhtmlRaw属性をタグに追加するだけです。デフォルトで raw として扱われるノードを raw として扱わないようにするには、xmlhtmlNotRaw属性を追加します。

なぜrenderHtmlNodes . writeHtml defうまくいかなかったのかわかりません。それはうまくいくようです。writeHtmlうまくいかない場合は、Pandocにバグがある可能性があると思います。それはうまくいかなかったので、試してみてくださいparseHtml . writeHtmlString(疑似コード)。

于 2013-10-06T18:17:50.897 に答える