使用Pandoc将markdown链接转换为html

时间:2016-12-06 10:48:13

标签: html hyperlink markdown pandoc

在我的新项目中,我有多个相互关联的降价文件。 这些链接指的是原始的.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

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

您可以创建一个过滤器来检查每个link元素,如果网址以.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)

答案 2 :(得分:1)

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

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

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

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

  

更改所有内部文件网址,指向* .md链接,而是指向本地* .html文件

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

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

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

答案 3 :(得分:1)

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

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

它修复了超链接(感谢@ Sergio_Correia'答案)。

它还收集任何本地文件引用,以便指向图像的链接仍然可以工作

答案 4 :(得分:0)

对于使用 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 文件(无论出于何种原因)。

答案 5 :(得分:0)

对 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)