module Asciidoctor::RFC::V3::InlineAnchor

Public Instance Methods

inline_anchor(node) click to toggle source
# File lib/asciidoctor/rfc/v3/inline_anchor.rb, line 4
def inline_anchor(node)
  case node.type
  when :xref
    inline_anchor_xref node
  when :link
    inline_anchor_link node
  when :bibref
    inline_anchor_bibref node
  when :ref
    inline_anchor_ref node
  else
    warn %(asciidoctor: WARNING (#{current_location(node)}): unknown anchor type: #{node.type.inspect})
  end
end

Private Instance Methods

inline_anchor_bibref(node) click to toggle source
# File lib/asciidoctor/rfc/v3/inline_anchor.rb, line 72
def inline_anchor_bibref(node)
  unless node.xreftext.nil?
    x = node.xreftext.gsub(/^\[(.+)\]$/, "\\1")
    if node.id != x
      $xreftext[node.id] = x
    end
  end
  # NOTE technically node.text should be node.reftext, but subs have already been applied to text
  # %(<bibanchor="#{node.id}">) # will convert to anchor attribute upstream
  nil
end
inline_anchor_ref(node) click to toggle source
# File lib/asciidoctor/rfc/v3/inline_anchor.rb, line 84
def inline_anchor_ref(node)
  warn %(asciidoctor: WARNING (#{current_location(node)}): anchor "#{node.id}" is not in a place where XML RFC will recognise it as an anchor attribute)
end
inline_anchor_xref(node) click to toggle source
# File lib/asciidoctor/rfc/v3/inline_anchor.rb, line 21
def inline_anchor_xref(node)
  text = node.text
  if text =~ /^\S+ (of|comma|parens|bare)\b/
    # <<crossreference#fragment,section (of|comma|parens|bare): text>> = relref
    matched = /(?<section>\S+)\s+(?<format>[a-z]+)(: )?(?<text>.*)$/.match node.text

    relref_contents = matched[:text]

    relref_attributes = {
      relative: node.attributes["path"].nil? ? nil : node.attributes["fragment"],
      section: matched[:section],
      displayFormat: matched[:format],
      # fragment inserts file suffix, e.g. rfc2911#fragment becomes rfc2911.xml#fragment
      target: node.target.gsub(/^#/, "").gsub(/(.)(\.xml)?#.*$/, "\\1"),
    }

    noko do |xml|
      xml.relref relref_contents, **attr_code(relref_attributes)
    end.join
  else
    xref_contents = node.text
    matched = /^format=(?<format>counter|title|none|default)(?<text>:\s*.*)?$/.match xref_contents
    xref_contents = if matched.nil?
                      xref_contents
                    else
                      matched[:text].nil? ? "" : matched[:text].gsub(/^:\s*/, "")
                    end

    warn %(asciidoctor: WARNING (#{current_location(node)}): fragments not supported on crossreferences in v3 without relref: #{node.target} #{node.text}) if node.target =~ /.#/
    xref_attributes = {
      format: matched&.[](:format),
      target: node.target.gsub(/^#/, "").gsub(/(.)(\.xml)?#.*$/, "\\1"),
    }

    noko do |xml|
      xml.xref xref_contents, **attr_code(xref_attributes)
    end.join
  end
end