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_regexp_handlings, #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
# 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

  @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.


60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rdoc/markup/to_html_crossref.rb', line 60

def cross_reference name, text = nil, code = true
  lookup = name

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

  if !(name.end_with?('[email protected]', '[email protected]')) and 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.


130
131
132
133
134
135
# File 'lib/rdoc/markup/to_html_crossref.rb', line 130

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.


82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/rdoc/markup/to_html_crossref.rb', line 82

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.


101
102
103
104
105
# File 'lib/rdoc/markup/to_html_crossref.rb', line 101

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


115
116
117
118
119
120
121
122
123
124
# File 'lib/rdoc/markup/to_html_crossref.rb', line 115

def handle_regexp_RDOCLINK target
  url = target.text

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

45
46
47
48
49
50
51
52
53
54
# File 'lib/rdoc/markup/to_html_crossref.rb', line 45

def init_link_notation_regexp_handlings
  add_regexp_handling_RDOCLINK

  # The crossref must be linked before tidylink because Klass.method[:sym]
  # will be processed as a tidylink first and will be broken.
  crossref_re = @options.hyperlink_all ? ALL_CROSSREF_REGEXP : CROSSREF_REGEXP
  @markup.add_regexp_handling crossref_re, :CROSSREF

  add_regexp_handling_TIDYLINK
end

Creates an HTML link to name with the given text.


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
166
167
168
169
170
171
172
173
# File 'lib/rdoc/markup/to_html_crossref.rb', line 140

def link name, text, code = true
  if !(name.end_with?('[email protected]', '[email protected]')) and name =~ /(.*[^#:])@/
    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>#{CGI.escapeHTML 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