Converts a target url to one that is relative to a given path
# File rdoc/markup/to_html.rb, line 40
def self.gen_relative_url(path, target)
from = File.dirname path
to, to_file = File.split target
from = from.split "/"
to = to.split "/"
while from.size > 0 and to.size > 0 and from[0] == to[0] do
from.shift
to.shift
end
from.fill ".."
from.concat to
from << to_file
File.join(*from)
end
# File rdoc/markup/to_html.rb, line 20
def initialize
super
# @in_tt - tt nested levels count
# @tt_bit - cache
@in_tt = 0
@tt_bit = RDoc::Markup::Attribute.bitmap_for :TT
# external hyperlinks
@markup.add_special(/((link:|https?:|mailto:|ftp:|www\.)\S+\w)/, :HYPERLINK)
# and links of the form <text>[<url>]
@markup.add_special(/(((\{.*?\})|\b\S+?)\[\S+?\.\S+?\])/, :TIDYLINK)
init_tags
end
# File rdoc/markup/to_html.rb, line 211
def accept_blank_line(am, fragment)
# @res << annotate("<p />") << "\n"
end
# File rdoc/markup/to_html.rb, line 215
def accept_heading(am, fragment)
@res << convert_heading(fragment.head_level, am.flow(fragment.txt))
end
# File rdoc/markup/to_html.rb, line 192
def accept_list_end(am, fragment)
if tag = @in_list_entry.pop
@res << annotate(tag) << "\n"
end
@res << html_list_name(fragment.type, false) << "\n"
end
# File rdoc/markup/to_html.rb, line 199
def accept_list_item(am, fragment)
if tag = @in_list_entry.last
@res << annotate(tag) << "\n"
end
@res << list_item_start(am, fragment)
@res << wrap(convert_flow(am.flow(fragment.txt))) << "\n"
@in_list_entry[-1] = list_end_for(fragment.type)
end
# File rdoc/markup/to_html.rb, line 187
def accept_list_start(am, fragment)
@res << html_list_name(fragment.type, true) << "\n"
@in_list_entry.push false
end
# File rdoc/markup/to_html.rb, line 169
def accept_paragraph(am, fragment)
@res << annotate("<p>") + "\n"
@res << wrap(convert_flow(am.flow(fragment.txt)))
@res << annotate("</p>") + "\n"
end
# File rdoc/markup/to_html.rb, line 181
def accept_rule(am, fragment)
size = fragment.param
size = 10 if size > 10
@res << "<hr size=\"#{size}\"></hr>"
end
# File rdoc/markup/to_html.rb, line 175
def accept_verbatim(am, fragment)
@res << annotate("<pre>") + "\n"
@res << CGI.escapeHTML(fragment.txt)
@res << annotate("</pre>") << "\n"
end
Add a new set of HTML tags for an attribute. We allow separate start and end tags for flexibility.
# File rdoc/markup/to_html.rb, line 144
def add_tag(name, start, stop)
@attr_tags << InlineTag.new(RDoc::Markup::Attribute.bitmap_for(name), start, stop)
end
Given an HTML tag, decorate it with class information and the like if required. This is a no-op in the base class, but is overridden in HTML output classes that implement style sheets.
# File rdoc/markup/to_html.rb, line 153
def annotate(tag)
tag
end
# File rdoc/markup/to_html.rb, line 165
def end_accepting
@res
end
Generate a hyperlink for url, labeled with text. Handle the special cases for img: and link: described under #handle_special_HYPERLINK
# File rdoc/markup/to_html.rb, line 62
def gen_url(url, text)
if url =~ /([A-Za-z]+):(.*)/ then
type = $1
path = $2
else
type = "http"
path = url
url = "http://#{url}"
end
if type == "link" then
url = if path[0, 1] == '#' then # is this meaningful?
path
else
self.class.gen_relative_url @from_path, path
end
end
if (type == "http" or type == "link") and
url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then
"<img src=\"#{url}\" />"
else
"<a href=\"#{url}\">#{text.sub(%r{^#{type}:/*}, '')}</a>"
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.
# File rdoc/markup/to_html.rb, line 96
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] or {long label}[url]
# File rdoc/markup/to_html.rb, line 105
def handle_special_TIDYLINK(special)
text = special.text
return text unless text =~ /\{(.*?)\}\[(.*?)\]/ or text =~ /(\S+)\[(.*?)\]/
label = $1
url = $2
gen_url url, label
end
are we currently inside <tt> tags?
# File rdoc/markup/to_html.rb, line 118
def in_tt?
@in_tt > 0
end
Here's the client side of the visitor pattern
# File rdoc/markup/to_html.rb, line 160
def start_accepting
@res = ""
@in_list_entry = []
end
is tag a <tt> tag?
# File rdoc/markup/to_html.rb, line 125
def tt?(tag)
tag.bit == @tt_bit
end
This is a higher speed (if messier) version of wrap
# File rdoc/markup/to_html.rb, line 222
def wrap(txt, line_len = 76)
res = ""
sp = 0
ep = txt.length
while sp < ep
# scan back for a space
p = sp + line_len - 1
if p >= ep
p = ep
else
while p > sp and txt[p] != ?\s
p -= 1
end
if p <= sp
p = sp + line_len
while p < ep and txt[p] != ?\s
p += 1
end
end
end
res << txt[sp...p] << "\n"
sp = p
sp += 1 while sp < ep and txt[sp] == ?\s
end
res
end