有没有办法在Markdown中创建一个在新窗口中打开的链接?如果不是,您建议使用什么语法来完成此操作?我将把它添加到我使用的markdown编译器中。我认为这应该是一个选择。


当前回答

如果您只想在特定的链接中执行此操作,只需使用其他人回答的内联属性列表语法,或者只使用HTML。

如果你想在所有生成的<a>标签中这样做,这取决于你的Markdown编译器,也许你需要一个扩展。

这些天我正在为我的博客做这个,它是由pelican生成的,它使用Python-Markdown。我找到了Python-Markdown Phuker/markdown_link_attr_modifier的扩展,它工作得很好。注意,旧的名为newtab的扩展在Python-Markdown 3.x中似乎不起作用。

其他回答

我不认为有降价功能,尽管如果你想用JavaScript自动打开指向你自己网站以外的链接,可能有其他可用的选项。

Array.from(javascript.links)
    .filter(link => link.hostname != window.location.hostname)
    .forEach(link => link.target = '_blank');

jsFiddle。

如果你正在使用jQuery:

$(document.links).filter(function() {
    return this.hostname != window.location.hostname;
}).attr('target', '_blank');

jsFiddle。

您可以使用{[attr]="[prop]"}添加任何属性

例如[谷歌](http://www.google.com){target="_blank"}

就Markdown语法而言,如果想要获得如此详细的内容,就必须使用HTML。

<a href="http://example.com/" target="_blank">Hello, world!</a>

我所见过的大多数Markdown引擎都允许普通的HTML,只是在这种情况下,一般的文本标记系统无法解决它。(例如StackOverflow引擎。)然后,他们通过HTML白名单过滤器运行整个输出,因为即使只有markdown的文档也很容易包含XSS攻击。因此,如果您或您的用户想要创建_blank链接,那么他们可能仍然可以。

如果这是一个您将经常使用的特性,那么创建自己的语法可能是有意义的,但它通常不是一个重要的特性。如果我想在一个新窗口中启动那个链接,我会自己按下ctrl键,谢谢。

你可以通过本地javascript代码这样做:

 
var pattern = /a href=/g;
var sanitizedMarkDownText = rawMarkDownText.replace(pattern,"a target='_blank' href=");

JSFiddle Code

如果有人正在寻找一个全局rmarkdown (pandoc)解决方案。

使用Pandoc Lua过滤器

你可以编写自己的Pandoc Lua过滤器,将target="_blank"添加到所有链接:

编写一个Pandoc Lua过滤器,例如links.lua

function Link(element)

    if 
        string.sub(element.target, 1, 1) ~= "#"
    then
        element.attributes.target = "_blank"
    end
    return element

end

然后更新你的_output.yml

bookdown::gitbook:
  pandoc_args:
    - --lua-filter=links.lua

在Header中注入<base target="_blank">

另一种解决方案是使用includes选项在HTML头部部分注入<base target="_blank">:

创建一个新的HTML文件,例如links.html

<base target="_blank">

然后更新你的_output.yml

bookdown::gitbook:
  includes:
    in_header: links.html

注意:此解决方案还可能为哈希(#)指针/ url打开新选项卡。我还没有用这样的url测试这个解决方案。