如果在链接或URL宏的方括号之间检测到命名属性,那么该文本将被解析为属性列表。这个页面解释了这种情况发生的条件以及如何编写链接文本,使其被识别为单一位置属性。

将链接文本与命名属性并列

通常情况下,链接宏方括号之间的整个文本都被视为链接文本(即,第一个位置属性)。

https://chat.asciidoc.org[讨论AsciiDoc]

然而,如果文本包含等号(=),那么这段文本会被解析为一个属性列表的引用:attributes:element-attributes.adoc#attribute-list[属性列表]。属性列表解析的确切规则和定位属性相当复杂,在attributes:positional-and-named-attributes.html中有详细讨论。为了确保链接文本被正确识别,你可以进行以下两个简单的检查:

  • 不包含逗号(,)、等号(=)或者

  • 用双引号(")包围

还有一些其他情况,在这些情况下,第一个逗号之前的文本可能会被识别为链接文本。让我们来考虑一些例子。

以下示例展示了一个带有自定义链接文本和命名属性的URL宏。

https://chat.asciidoc.org[Discuss AsciiDoc,role=resource,window=_blank]

让我们考虑一个链接文本中包含逗号,宏还具有命名属性的情况。在这种情况下,你必须将链接文本用双引号括起来,以便将其作为第一个位置属性完整捕获。

https://example.org["Google, DuckDuckGo, Ecosia",role=teal]

同样地,如果链接文本包含等号,你可以用双引号将链接文本括起来,以确保解析器将其识别为第一个位置属性。

https://example.org["1=2 posits the problem of inequality"]

如果引用的链接文本本身包含用于封闭文本的引号字符,通过在引号字符之前加上反斜线来转义文本中的引号字符。

https://example.org["href=\"#top\" attribute"] creates link to top of page

当链接文本包含等号时,并不是所有情况下都需要双引号闭合。严格来说,只有当等号前的文本与有效属性名匹配时,才需要使用闭合。然而,为了安全起见,最好还是使用双引号。

最后,要使用命名属性而不指定链接文本,您只需指定命名属性。(换句话说,您留空第一个位置属性,这样目标链接就会被用作链接文本)。

https://chat.asciidoc.org[role=button,window=_blank,opts=nofollow]

链接宏识别所有常见的属性(id、角色和选项)。它也识别一些特定于链接宏的少数属性。

瞄准一个单独的窗口

默认情况下,链接宏产生的链接将在当前窗口中打开。换句话说,点击它将替换当前页面。

您可以通过使用`window`属性来配置链接在一个单独的窗口(或标签)中打开。

https://asciidoctor.org[Asciidoctor,window=read-later]

在HTML输出中,window`属性的值被赋给<a>`标签的`target`属性(例如,target=read-later)。

目标一个空白窗口

大多数情况下,你会使用`window`属性来指定在一个新窗口打开链接。配置一个指向当前站点外部位置的链接是一种常见的做法,这样可以避免打断读者的浏览流程。为了实现这一行为,你需要将`window`属性设置为特殊值`_blank`。

https://asciidoctor.org[Asciidoctor,window=_blank]

在HTML输出中,window`属性的值被赋予<a>`标签的`target`属性(例如,target=_blank),并且还包括了`rel=noopener`属性

Caution
_blank 开头的下划线在行或段落中的其他地方出现另一个下划线时,可能会意外形成一个受限的格式配对,从而导致宏指令出问题。您可以通过转义值开头的下划线(即,window=\_blank)或者使用 [Blank window shorthand] 来避免这个问题。

noopener 和 nofollow

当`window`属性的值为`_blank`时,AsciiDoc处理器也会在HTML输出的`<a>`元素中添加`rel="noopener"`属性。这样做被认为是一种安全的最佳实践。

如果窗口不是 _blank,您需要通过在宏上设置 noopener 选项来明确启用这种行为:

https://asciidoctor.org[Asciidoctor,window=read-later,opts=noopener]

如果你不希望搜索索引器跟踪链接,你可以向宏中添加`nofollow`选项。这个选项只有在`noopener`选项被隐式或显式地设置时才有效。

https://asciidoctor.org[Asciidoctor,window=_blank,opts=nofollow]

或者

https://asciidoctor.org[Asciidoctor,window=read-later,opts="noopener,nofollow"]

为了在网站内对索引进行微调,即使链接没有指向单独的窗口,你也可以指定使用nofollow选项。

空白窗口速记

将外部链接配置为目标新窗口是一种常见的做法。因此,AsciiDoc为此提供了一个简写方法。

您可以用插入行尾链接文本的插入符号(^)来代替命名属性`window=_blank。这种语法的附加优势是不需要担心值_blank`开头的下划线意外地与同一行或段落中出现的另一个下划线形成限制性格式对。

Unresolved directive in link-macro-attribute-parsing.adoc - include::example$url.adoc[tag=linkattrs-s]
Caution
在罕见的情况下,如果你在同一行或段落中多次使用脱字符语法,你可能需要用反斜杠来转义第一次出现的地方。然而,处理器应该尽量避免使这成为一个要求。

如果属性列表同时包含双引号中的链接文本和具名属性,光标应该放在链接文本的末尾,但在双引号内。

https://example.org["Google, DuckDuckGo, Ecosia^",role=btn]

如果没有命名属性存在,链接文本不应该用引号括起来。

https://example.org[Google, DuckDuckGo, Ecosia^]