これは一種のコーナーケースです。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 に提供することもできます)。結局、これはひどく難しいことではありませんでした。