删除 Markdown 中的 HTML 元素

hcd*_*ocs 1 shell markdown pandoc

目标

将带有 HTML 的 Markdown 文件转换为纯 Markdown

代码: in.md

# Title

## Subtitle

### Sub-subtitle

<span><div>Line before image</div><div><br></div><div><img src="img.png" width=404 height=255><br></div><div><br></div><div>Line after image</div><div><br></div><div>Text</div></span><h1><span>Heading 1</span></h1><span><div>Text</div><div><br></div></span><h2><span>Heading 2</span></h2><span><div>Text</div></span><h3><span>Heading 3</span></h3><div><span>Text</span></div><div><span><br></span></div><span><div>Line before code</div><code><pre><code><div>Code line 1</div><div>Code line 2</div><div>Code line 3</div></code></pre></code><div><span style="">Line after code</span><br></div><div><span style=""><br></span></div><div><span style=""><a href="http://pandoc.org">Link</a></span></div><div><span style=""><br></span></div><div><ul><li>Unordered bullet 1<br></li><li>Unordered bullet 2<br></li></ul></div><div><span style=""><br></span></div><div><ol><li>Ordered bullet 1<br></li><li>Ordered bullet 2<br></li></ol></div><div><span style=""><br></span></div></span><blockquote style="margin:0 0 0 40px;border:none;padding:0px;"><span><div><span style="">Quote line 1</span></div></span><span><div><span style="">Quote line 2</span></div></span></blockquote><span><div><span style=""><br></span></div><div><span style="">Text</span></div><div><span style=""><br></span></div><div><i>Italic</i></div><div><i><br></i></div><div>Text</div><div></div></span>

Markdown text

More Markdown text
Run Code Online (Sandbox Code Playgroud)

尝试

我尝试了许多 Pandoc 脚本:

尝试 1

pandoc -f markdown -t markdown_strict --atx-headers in.md -o out.md

  • 添加了换行符

  • 无转换

从结果中提取

<h3>
<span>H3</span>
</h3>
<span>txt</span>

<span><br></span>
Run Code Online (Sandbox Code Playgroud)

<ul>
<li>
bullet<br>
</li>
<li>
list<br>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

对结果再次运行转换命令没有任何作用。

尝试 2

pandoc -f markdown -t markdown_strict-native_divs-native_spans --atx-headers in.md -o out.md

结果

和上面一样

尝试 3

pandoc -f markdown-markdown_in_html_blocks -t markdown_strict-native_divs-native_spans --atx-headers in.md -o out.md

结果

同上,换行更少

尝试 4

pandoc -f markdown -t markdown_strict-native_divs-native_spans-raw_html --atx-headers in.md -o out.md

从结果中提取

所有 HTML 元素都被删除,但没有应用 Markdown:

Heading 1
Text

Heading 2
Text

Heading 3
Text
Run Code Online (Sandbox Code Playgroud)

Unordered bullet 1
Unordered bullet 2
Unordered bullet 3
Run Code Online (Sandbox Code Playgroud)

杂项

  • 我无法调整in.md原来的生成方式。

  • Pandoc 不必成为解决方案的一部分。但是,使用 Pandoc 似乎很有意义,因为 (1) 转换需要由 Azure DevOps 发布管道执行,并且运行一个简单的命令非常适合该工作流,并且 (2) 所需的结果只是一个干净的 Markdown 文件。

  • 我可以使用 Regex 编写解决方案脚本(并且,如果没有其他解决方案有意义的话),但是如果 Pandoc 命令(或其他解决方案)完成它,这似乎不太容易出现我的人为错误。

感谢您的任何想法或建议。

tar*_*leb 5

我的建议是先将完整文档转换为 HTML,然后将结果转换为您想要的 Markdown 格式:

pandoc --from=markdown --to=html in.md | \
    pandoc --from=html --to=markdown-raw_html-native_divs --output out.md
Run Code Online (Sandbox Code Playgroud)

请注意,输入似乎包含无效的 HTML(例如,div不得出现在符合 HTML 标准的spancode元素中),因此嵌入的 HTML 并不完全意味着它应有的含义。

人们还会注意到一些仅包含换行符的跨度,这使输出看起来很难看。最好的解决方案是通过pandoc 过滤器删除它们。