Class: Generators::HyperlinkHtml

Inherits:
SM::ToHtml show all
Defined in:
lib/rdoc/generators/html_generator.rb

Overview

Subclass of the SM::ToHtml class that supports looking up words in the AllReferences list. Those that are found (like AllReferences in this comment) will be hyperlinked

Constant Summary

Constants inherited from SM::ToHtml

SM::ToHtml::LIST_TYPE_TO_HTML

Instance Method Summary collapse

Methods inherited from SM::ToHtml

#accept_blank_line, #accept_heading, #accept_list_end, #accept_list_item, #accept_list_start, #accept_paragraph, #accept_rule, #accept_verbatim, #add_tag, #annotate, #end_accepting, #init_tags, #start_accepting, #wrap

Constructor Details

#initialize(from_path, context) ⇒ HyperlinkHtml

We need to record the html path of our caller so we can generate correct relative paths for any hyperlinks that we find



92
93
94
95
96
97
98
99
# File 'lib/rdoc/generators/html_generator.rb', line 92

def initialize(from_path, context)
  super()
  @from_path = from_path

  @parent_name = context.parent_name
  @parent_name += "::" if @parent_name
  @context = context
end

Instance Method Details

#gen_url(url, text) ⇒ Object

Generate a hyperlink for url, labeled with text. Handle the special cases for img: and link: described under handle_special_HYPEDLINK



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/generators/html_generator.rb', line 140

def gen_url(url, text)
  if url =~ /([A-Za-z]+):(.*)/
    type = $1
    path = $2
  else
    type = "http"
    path = url
    url  = "http://#{url}"
  end

  if type == "link"
    if path[0,1] == '#'     # is this meaningful?
      url = path
    else
      url = HTMLGenerator.gen_url(@from_path, path)
    end
  end

  if (type == "http" || type == "link") && 
      url =~ /\.(gif|png|jpg|jpeg|bmp)$/

    "<img src=\"#{url}\" />"
  else
    "<a href=\"#{url}\">#{text.sub(%r{^#{type}:/*}, '')}</a>"
  end
end

#handle_special_CROSSREF(special) ⇒ Object

We're invoked when any text matches the CROSSREF pattern (defined in MarkUp). If we fine the corresponding reference, generate a hyperlink. If the name we're looking for contains no punctuation, we look for it up the module/class chain. For

example, HyperlinkHtml is found, even without the Generators

prefix, because we look for it in module Generators first.



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/rdoc/generators/html_generator.rb', line 108

def handle_special_CROSSREF(special)
  name = special.text
  if name[0,1] == '#'
    lookup = name[1..-1]
    name = lookup unless Options.instance.show_hash
  else
    lookup = name
  end

  # Find class, module, or method in class or module.
  if /([A-Z]\w*)[.\#](\w+[!?=]?)/ =~ lookup
    container = $1
    method = $2
    ref = @context.find_symbol(container, method)
  elsif /([A-Za-z]\w*)[.\#](\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?)/ =~ lookup
    container = $1
    method = $2
    ref = @context.find_symbol(container, method)
  else
    ref = @context.find_symbol(lookup)
  end

  if ref and ref.document_self
    "<a href=\"#{ref.as_href(@from_path)}\">#{name}</a>"
  else
    name
  end
end

And we're invoked with a potential external hyperlink mailto: just gets inserted. http: links are checked to see if they reference an image. If so, that image gets inserted using an <img> tag. Otherwise a conventional <a href> is used. We also support a special type of hyperlink, link:, which is a reference to a local file whose path is relative to the --op directory.



174
175
176
177
# File 'lib/rdoc/generators/html_generator.rb', line 174

def handle_special_HYPERLINK(special)
  url = special.text
  gen_url(url, url)
end

HEre's a hypedlink where the label is different to the URL

<label>[url]


183
184
185
186
187
188
189
190
191
192
# File 'lib/rdoc/generators/html_generator.rb', line 183

def handle_special_TIDYLINK(special)
  text = special.text
#      unless text =~ /(\S+)\[(.*?)\]/
  unless text =~ /\{(.*?)\}\[(.*?)\]/ or text =~ /(\S+)\[(.*?)\]/ 
    return text
  end
  label = $1
  url   = $2
  gen_url(url, label)
end