在我的新项目中,我有多个相互关联的降价文件。
这些链接指的是原始的.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
答案 0 :(得分:9)
# 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文件
以递归方式运行此sed命令(以编程方式替换FILENAME)
sed -n -i.bak '/href="\./s/\.md/\.html/' FILENAME.html
- 醇>
或者,改为运行以下命令(以编程方式替换FILENAME)
sed -e '/href="\./s/\.md/\.html/' FILENAME.html > FILENAME.html.tmp && mv FILENAME.html.tmp FILENAME.html`
答案 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)