class RDoc::Markup::ToHtmlCrossref

frozen_string_literal: true

Subclass of the RDoc::Markup::ToHtml class that supports looking up method names, classes, etc to create links. RDoc::CrossReference is used to generate those links based on the current context.

Attributes

context[RW]

RDoc::CodeObject for generating references

show_hash[RW]

Should we show '#' characters on method references?

Public Class Methods

new(options, from_path, context, markup = nil) click to toggle source

Creates a new crossref resolver that generates links relative to context which lives at from_path in the generated files. '#' characters on references are removed unless show_hash is true. Only method names preceded by '#' or '::' are linked, unless hyperlink_all is true.

Calls superclass method RDoc::Markup::ToHtml.new
# File lib/rdoc/markup/to_html_crossref.rb, line 32
def initialize(options, from_path, context, markup = nil)
  raise ArgumentError, 'from_path cannot be nil' if from_path.nil?

  super options, markup

  @context       = context
  @from_path     = from_path
  @hyperlink_all = @options.hyperlink_all
  @show_hash     = @options.show_hash

  crossref_re = @hyperlink_all ? ALL_CROSSREF_REGEXP : CROSSREF_REGEXP
  @markup.add_regexp_handling crossref_re, :CROSSREF

  @cross_reference = RDoc::CrossReference.new @context
end

Public Instance Methods

cross_reference(name, text = nil, code = true) click to toggle source

Creates a link to the reference name if the name exists. If text is given it is used as the link text, otherwise name is used.

# File lib/rdoc/markup/to_html_crossref.rb, line 52
def cross_reference name, text = nil, code = true
  lookup = name

  name = name[1..-1] unless @show_hash if name[0, 1] == '#'

  if name =~ /(.*[^#:])@/
    text ||= "#{CGI.unescape $'} at <code>#{$1}</code>"
    code = false
  else
    text ||= name
  end

  link lookup, text, code
end
gen_url(url, text) click to toggle source

Generates links for rdoc-ref: scheme URLs and allows RDoc::Markup::ToHtml to handle other schemes.

Calls superclass method RDoc::Markup::ToHtml#gen_url
# File lib/rdoc/markup/to_html_crossref.rb, line 122
def gen_url url, text
  return super unless url =~ /\Ardoc-ref:/

  name = $'
  cross_reference name, text, name == text
end
handle_regexp_CROSSREF(target) click to toggle source

We're invoked when any text matches the CROSSREF pattern. If we find the corresponding reference, generate a link. If the name we're looking for contains no punctuation, we look for it up the module/class chain. For example, ToHtml is found, even without the RDoc::Markup:: prefix, because we look for it in module Markup first.

# File lib/rdoc/markup/to_html_crossref.rb, line 74
def handle_regexp_CROSSREF(target)
  name = target.text

  return name if name =~ /@[\w-]+\.[\w-]/ # labels that look like emails

  unless @hyperlink_all then
    # This ensures that words entirely consisting of lowercase letters will
    # not have cross-references generated (to suppress lots of erroneous
    # cross-references to "new" in text, for instance)
    return name if name =~ /\A[a-z]*\z/
  end

  cross_reference name
end