目的

创建一个名为`man`的内联宏,用于链接到另一个man页面。

查看 man:gittutorial[7] 以开始。

手册页内联宏

class ManInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
  use_dsl

named :man
name_positional_attributes 'volnum'

def process parent, target, attrs
    doc = parent.document
    text = manname = target
    suffix = (volnum = attrs['volnum']) ? %((#{volnum})) : ''
    if doc.basebackend? 'html'
      target = %(#{manname}#{doc.outfilesuffix})
      doc.register :links, target
      node = create_anchor parent, text, type: :link, target: target
    elsif doc.backend == 'manpage'
      node = create_inline parent, :quoted, manname, type: :strong
    else
      node = create_inline parent, :quoted, manname
    end
    create_inline parent, :quoted, %(#{node.convert}#{suffix})
  end
end

用法

Asciidoctor::Extensions.register do
  inline_macro ManInlineMacro
end

Asciidoctor.convert_file 'sample-with-man-link.adoc', safe: :safe

小贴士与技巧

应用替换

当内联宏被处理时,大多数替换已经被应用(因为宏是最后被应用的替换之一)。为了让处理器应用替换到扩展返回的Inline节点的文本中,你必须在节点实例本身指定那些扩展。

您可以使用`subs`属性指定要对节点文本应用的替换。这个属性接受一个符号、一组符号或一个逗号分隔的字符串。

假设我们希望对文本应用正常的替换。以下是可以实现的方式:

create_inline_pass parent, '*https://example.org[Learn more]*',
  attributes: { 'subs' => :normal }

这个内嵌直通节点将生成一个链接,该链接的链接文本具有强调效果(即,加粗)。

您也可以将替换指定为一个字符串,该字符串的解析方式与块上的subs属性的值一样。

create_inline_pass parent, '*https://example.org[Learn more]*', attributes: { 'subs' => 'quotes,macros' }

你可以指定你想要应用的任何替换,以及它们应用的顺序。

你也可以创建一个应用了额外替换的格式化文本范围,而不是创建一个内联直通节点。

create_inline parent, :quoted, 'https://asciidoctor.org is _awesome_!',
  attributes: { 'subs' => :quotes }

:quoted` 主要类型代表一段格式化的文本。在这种情况下,我们不需要应用 macros 替换,因为链接还没有被转换。