【问题标题】:Convert markdown links to html with Pandoc使用 Pandoc 将 markdown 链接转换为 html
【发布时间】:2021-08-11 23:52:29
【问题描述】:

在我的新项目中,我有多个相互链接的降价文件。 这些链接引用原始的.md 文件。

示例: 文件 README.md

...
1. [Development documentation](Development.md)
1. [User documentation](Usage.md)
...

如果我使用 Pandoc 转换这些文件,例如到 html 文件,所有链接仍然指向原始的 .md 文件。我正在寻找的是一种转换链接类型的方法,这意味着输出文件应该引用输出文件类型,如 HTML、PDF、TeX 等。有没有办法用 Pandoc 转换内部链接类型?

我用它来转换文件:

pandoc -f markdown -t html5 input.md -o output.html

【问题讨论】:

  • 你能举一个文件名和链接的例子吗?
  • 描述中添加的示例。

标签: html hyperlink markdown pandoc


【解决方案1】:

built-in Lua filters 为例:

# links-to-html.lua
function Link(el)
  el.target = string.gsub(el.target, "%.md", ".html")
  return el
end

然后:

pandoc -f markdown -t html5 input.md -o output.html --lua-filter=links-to-html.lua

【讨论】:

  • 请注意,# 不是有效的 Lua 注释。使用 -- 如果你想保留第一行。
  • 我希望这可以保留链接并且只更改 href;但是给定的命令还将“a”标签转换为“embed”标签,这在某种程度上更糟?我想知道我在做什么?
【解决方案2】:

您可以创建一个过滤器来检查每个 link 元素,并且 - 如果 url 以 .md 结尾 - 将其替换为 .html

Python 示例,使用 panflute 包:

import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Link) and elem.url.endswith('.md'):
        elem.url = elem.url[:-3] + '.html'
        return elem

if __name__ == '__main__':
    pf.run_filter(action)

【讨论】:

  • 谢谢,太好了!我只是想知道使用 Pandoc 选项是否没有简单的方法?
  • @P.Tail 不,没有开箱即用的方法可以做到这一点。 Markdown 假定您的链接已经指向呈现的 HTML 文档,并且不会更改您的 URL。事实上,任何 URL 的更改都是一个错误。当然,使用各种 Markdown 解析器可以使用定制的插件(如这里的插件)。但它必须是定制的,因为只有您知道您的具体需求,没有单一的解决方案可能满足大多数(更不用说所有)用户的需求。
【解决方案3】:

假设您要通过网络服务器为您提供 html 页面,将所有 *.md url 解析为 *.html 相对简单,而不是通过 pandoc 重写它们,例如使用 NGinx:

location ~ \.md$ {
  if (!-f $request_filename) {
    rewrite ^(.*)\.md$ $1 permanent;
  }
}

location / {
  try_files /$uri /$uri.html;
}

或者,您可以使用sed 将所有md 链接替换为html (取自here):

将所有内部文件 url 从指向 *.md 链接改为指向本地 *.html 文件

  1. 递归运行这个 sed 命令(以编程方式替换 FILENAME)

    sed -n -i.bak '/href="\./s/\.md/\.html/' FILENAME.html
    
  2. 或者,改为运行以下命令(以编程方式替换 FILENAME)

    sed -e '/href="\./s/\.md/\.html/' FILENAME.html > FILENAME.html.tmp && mv FILENAME.html.tmp FILENAME.html`
    

【讨论】:

  • 我不推荐这种方法,因为代码部分中可能存在您不想转换的链接,以及您目前可能没有想到的类似其他复杂情况,如果您使用其他工具进行解析,例如 pandoc。
【解决方案4】:

我遇到了类似的问题,所以我做了这个:https://github.com/MatrixManAtYrService/md_htmldoc

它会在一个目录中找到所有.md 文件,然后创建一个单独的目录,其中所有markdown 都已转换为html。

它修复了超链接(感谢@Sergio_Correia 的回答)。

它还收集所有本地文件引用,以便图像链接等仍然有效

【讨论】:

  • 我在您的代码 (get_references.py) 中看到,您使用正则表达式在 markdown 中查找链接。我不推荐这种方法,因为代码部分中可能存在您不想转换的链接,以及您目前可能没有想到的类似其他复杂情况。如果您始终使用其他工具进行解析,例如 pandoc (就像您也按照 panflute 所做的那样),您可以自动规避这一点。
  • @hoijui: get_references.py 不用于转换某些东西 - 它只是用于查找参考。检查每个找到的引用是否引用本地文件 - 如果是,则将其添加到 doc_relevant,然后用于 (1) 将 markdown 编译为 html 或 (2) 将该文件复制到 HTML_DIR
  • 好的,谢谢 :-) 尽管如此,由于上述原因,您可能会以这种方式错过参考资料。只有构建 AST 才能正确完成(例如 pandoc 就是这样做的)。通过 pandoc 使用过滤器和 AST(raw?) 输出,这很容易做到。
【解决方案5】:

对于任何使用 Makefile 来推动转换的人,这里有一个 Makefile 片段,它提供了将 .md 转换为 .html 并调整链接的规则:

SHELL=/bin/bash

%.html: %.md
    ( set -eu -o pipefail ; \
    pandoc -i $< -t html | \
    sed -E 's/<a href="([^"]*).md/<a href="\1.html/g' > $@.tmp && mv -vf $@.tmp $@ ; )

如果test.md 存在于当前目录,make test.html 会这样做。

该规则还负责在转换实际成功之前不破坏现有的 HTML 文件(无论是什么原因)。

【讨论】:

  • 请注意,该规则不会在链接扭曲的情况下变得聪明,例如[foo](bar.md.somethingelse)
【解决方案6】:

对 Sergio Correia 的回答 https://stackoverflow.com/a/41005658/ 稍作修改也可以捕获文档中的锚链接。请注意,在极少数情况下,这可能会导致链接乱码...

import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Link):
        if elem.url.endswith('.md'):
            elem.url = elem.url[:-3] + '.html'
            return elem
        elif elem.url.find('.md#'):
            elem.url = elem.url.replace('.md#', '.html#')
            return elem

if __name__ == '__main__':
    pf.run_filter(action)
    

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2019-04-23
    • 2021-05-26
    • 2013-07-27
    • 2015-12-07
    相关资源
    最近更新 更多