Class: RDoc::Markup::ToHtmlCrossref

Inherits:
ToHtml show all
Defined in:
lib/rdoc/markup/to_html_crossref.rb

Overview

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.

Constant Summary collapse

ALL_CROSSREF_REGEXP =

:stopdoc:

RDoc::CrossReference::ALL_CROSSREF_REGEXP
CLASS_REGEXP_STR =
RDoc::CrossReference::CLASS_REGEXP_STR
CROSSREF_REGEXP =
RDoc::CrossReference::CROSSREF_REGEXP
METHOD_REGEXP_STR =
RDoc::CrossReference::METHOD_REGEXP_STR

Constants inherited from ToHtml

RDoc::Markup::ToHtml::LIST_TYPE_TO_HTML

Constants included from Text

Text::MARKUP_FORMAT, Text::TO_HTML_CHARACTERS

Instance Attribute Summary collapse

Attributes inherited from ToHtml

#code_object, #from_path, #in_list_entry, #list, #res

Attributes included from Text

#language

Instance Method Summary collapse

Methods inherited from ToHtml

#accept_blank_line, #accept_block_quote, #accept_heading, #accept_list_end, #accept_list_item_end, #accept_list_item_start, #accept_list_start, #accept_paragraph, #accept_raw, #accept_rule, #accept_verbatim, #convert_string, #end_accepting, #handle_RDOCLINK, #handle_regexp_HARD_BREAK, #handle_regexp_TIDYLINK, #html_list_name, #init_tags, #list_end_for, #list_item_start, #parseable?, #start_accepting, #to_html

Methods included from Text

encode_fallback, #expand_tabs, #flush_left, #markup, #normalize_comment, #parse, #snippet, #strip_hashes, #strip_newlines, #strip_stars, #to_html, #wrap

Methods inherited from Formatter

#accept_document, #add_regexp_handling_RDOCLINK, #add_regexp_handling_TIDYLINK, #add_tag, #annotate, #convert, #convert_flow, #convert_regexp_handling, #convert_string, gen_relative_url, #ignore, #in_tt?, #off_tags, #on_tags, #parse_url, #tt?

Constructor Details

#initialize(options, from_path, context, markup = nil) ⇒ ToHtmlCrossref

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.

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 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

Instance Attribute Details

#contextObject

RDoc::CodeObject for generating references



19
20
21
# File 'lib/rdoc/markup/to_html_crossref.rb', line 19

def context
  @context
end

#show_hashObject

Should we show ‘#’ characters on method references?



24
25
26
# File 'lib/rdoc/markup/to_html_crossref.rb', line 24

def show_hash
  @show_hash
end

Instance Method Details

#cross_reference(name, text = nil, code = true) ⇒ Object

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.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 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) ⇒ Object

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



122
123
124
125
126
127
# 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) ⇒ Object

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.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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

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



93
94
95
96
97
# File 'lib/rdoc/markup/to_html_crossref.rb', line 93

def handle_regexp_HYPERLINK target
  return cross_reference $' if target.text =~ /\Ardoc-ref:/

  super
end

target is an rdoc-schemed link that will be converted into a hyperlink. For the rdoc-ref scheme the cross-reference will be looked up and the given name will be used.

All other contents are handled by the superclass



107
108
109
110
111
112
113
114
115
116
# File 'lib/rdoc/markup/to_html_crossref.rb', line 107

def handle_regexp_RDOCLINK target
  url = target.text

  case url
  when /\Ardoc-ref:/ then
    cross_reference $'
  else
    super
  end
end

Creates an HTML link to name with the given text.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/rdoc/markup/to_html_crossref.rb', line 132

def link name, text, code = true
  if name =~ /(.*[^#:])@/ then
    name = $1
    label = $'
  end

  ref = @cross_reference.resolve name, text

  case ref
  when String then
    ref
  else
    path = ref.as_href @from_path

    if code and RDoc::CodeObject === ref and !(RDoc::TopLevel === ref)
      text = "<code>#{text}</code>"
    end

    if path =~ /#/ then
      path << "-label-#{label}"
    elsif ref.sections and
          ref.sections.any? { |section| label == section.title } then
      path << "##{label}"
    else
      if ref.respond_to?(:aref)
        path << "##{ref.aref}-label-#{label}"
      else
        path << "#label-#{label}"
      end
    end if label

    "<a href=\"#{path}\">#{text}</a>"
  end
end