summaryrefslogtreecommitdiff
path: root/lib/rdoc/markup/to_html.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rdoc/markup/to_html.rb')
-rw-r--r--lib/rdoc/markup/to_html.rb175
1 files changed, 84 insertions, 91 deletions
diff --git a/lib/rdoc/markup/to_html.rb b/lib/rdoc/markup/to_html.rb
index 74e3137eb2..de723921e9 100644
--- a/lib/rdoc/markup/to_html.rb
+++ b/lib/rdoc/markup/to_html.rb
@@ -8,6 +8,8 @@ require 'cgi'
class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
+ include RDoc::Text
+
##
# Maps RDoc::Markup::Parser::LIST_TOKENS types to HTML tags
@@ -15,7 +17,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
:BULLET => ['<ul>', '</ul>'],
:LABEL => ['<dl>', '</dl>'],
:LALPHA => ['<ol style="display: lower-alpha">', '</ol>'],
- :NOTE => ['<table>', '</table>'],
+ :NOTE => ['<table class="rdoc-list">', '</table>'],
:NUMBER => ['<ol>', '</ol>'],
:UALPHA => ['<ol style="display: upper-alpha">', '</ol>'],
}
@@ -48,6 +50,9 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
File.join(*from)
end
+ ##
+ # Creates a new formatter that will output HTML
+
def initialize
super
@@ -103,13 +108,15 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
end
end
+ # :section: Special handling
+
##
- # And we're invoked with a potential external hyperlink mailto:
- # just gets inserted. http: links are checked to see if they
+ # And we're invoked with a potential external hyperlink. <tt>mailto:</tt>
+ # just gets inserted. <tt>http:</tt> 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.
+ # <tt><img></tt> tag. Otherwise a conventional <tt><a href></tt> is used.
+ # We also support a special type of hyperlink, <tt>link:</tt>, which is a
+ # reference to a local file whose path is relative to the --op directory.
def handle_special_HYPERLINK(special)
url = special.text
@@ -118,7 +125,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
##
# Here's a hypedlink where the label is different to the URL
- # <label>[url] or {long label}[url]
+ # <label>[url] or {long label}[url]
def handle_special_TIDYLINK(special)
text = special.text
@@ -130,8 +137,10 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
gen_url url, label
end
+ # :section: Utilities
+
##
- # This is a higher speed (if messier) version of wrap
+ # Wraps +txt+ to +line_len+
def wrap(txt, line_len = 76)
res = []
@@ -159,173 +168,150 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
sp += 1 while sp < ep and txt[sp] == ?\s
end
- res.join
+ res.join.strip
end
- ##
# :section: Visitor
+ ##
+ # Prepares the visitor for HTML generation
+
def start_accepting
@res = []
@in_list_entry = []
@list = []
end
+ ##
+ # Returns the generated output
+
def end_accepting
@res.join
end
+ ##
+ # Adds +paragraph+ to the output
+
def accept_paragraph(paragraph)
- @res << annotate("<p>") + "\n"
- @res << wrap(convert_flow(@am.flow(paragraph.text)))
- @res << annotate("</p>") + "\n"
+ @res << "\n<p>"
+ @res << wrap(to_html(paragraph.text))
+ @res << "</p>\n"
end
+ ##
+ # Adds +verbatim+ to the output
+
def accept_verbatim(verbatim)
- @res << annotate("<pre>") << "\n"
- @res << CGI.escapeHTML(verbatim.text)
- @res << annotate("</pre>") << "\n"
+ @res << "\n<pre>"
+ @res << CGI.escapeHTML(verbatim.text.rstrip)
+ @res << "</pre>\n"
end
+ ##
+ # Adds +rule+ to the output
+
def accept_rule(rule)
size = rule.weight
size = 10 if size > 10
- @res << "<hr style=\"height: #{size}px\"></hr>"
+ @res << "<hr style=\"height: #{size}px\">\n"
end
+ ##
+ # Prepares the visitor for consuming +list+
+
def accept_list_start(list)
@list << list.type
- @res << html_list_name(list.type, true) << "\n"
+ @res << html_list_name(list.type, true)
@in_list_entry.push false
end
+ ##
+ # Finishes consumption of +list+
+
def accept_list_end(list)
@list.pop
if tag = @in_list_entry.pop
- @res << annotate(tag) << "\n"
+ @res << tag
end
@res << html_list_name(list.type, false) << "\n"
end
+ ##
+ # Prepares the visitor for consuming +list_item+
+
def accept_list_item_start(list_item)
if tag = @in_list_entry.last
- @res << annotate(tag) << "\n"
+ @res << tag
end
@res << list_item_start(list_item, @list.last)
end
+ ##
+ # Finishes consumption of +list_item+
+
def accept_list_item_end(list_item)
@in_list_entry[-1] = list_end_for(@list.last)
end
- def accept_blank_line(blank_line)
- # @res << annotate("<p />") << "\n"
- end
-
- def accept_heading(heading)
- @res << convert_heading(heading.level, @am.flow(heading.text))
- end
-
- def accept_raw raw
- @res << raw.parts.join("\n")
- end
-
- private
-
##
- # Converts string +item+
+ # Adds +blank_line+ to the output
- def convert_string(item)
- in_tt? ? convert_string_simple(item) : convert_string_fancy(item)
+ def accept_blank_line(blank_line)
+ # @res << annotate("<p />") << "\n"
end
##
- # Escapes HTML in +item+
+ # Adds +heading+ to the output
- def convert_string_simple(item)
- CGI.escapeHTML item
+ def accept_heading(heading)
+ @res << "\n<h#{heading.level}>"
+ @res << to_html(heading.text)
+ @res << "</h#{heading.level}>\n"
end
##
- # Converts ampersand, dashes, elipsis, quotes, copyright and registered
- # trademark symbols to HTML escaped Unicode.
-
- def convert_string_fancy(item)
- # convert ampersand before doing anything else
- item.gsub(/&/, '&amp;').
-
- # convert -- to em-dash, (-- to en-dash)
- gsub(/---?/, '&#8212;'). #gsub(/--/, '&#8211;').
-
- # convert ... to elipsis (and make sure .... becomes .<elipsis>)
- gsub(/\.\.\.\./, '.&#8230;').gsub(/\.\.\./, '&#8230;').
+ # Adds +raw+ to the output
- # convert single closing quote
- gsub(%r{([^ \t\r\n\[\{\(])\'}, '\1&#8217;'). # }
- gsub(%r{\'(?=\W|s\b)}, '&#8217;').
-
- # convert single opening quote
- gsub(/'/, '&#8216;').
-
- # convert double closing quote
- gsub(%r{([^ \t\r\n\[\{\(])\"(?=\W)}, '\1&#8221;'). # }
-
- # convert double opening quote
- gsub(/"/, '&#8220;').
-
- # convert copyright
- gsub(/\(c\)/, '&#169;').
-
- # convert registered trademark
- gsub(/\(r\)/, '&#174;')
+ def accept_raw raw
+ @res << raw.parts.join("\n")
end
##
- # Converts headings to hN elements
+ # CGI escapes +text+
- def convert_heading(level, flow)
- [annotate("<h#{level}>"),
- convert_flow(flow),
- annotate("</h#{level}>\n")].join
+ def convert_string(text)
+ CGI.escapeHTML text
end
##
- # Determins the HTML list element for +list_type+ and +open_tag+
+ # Determines the HTML list element for +list_type+ and +open_tag+
def html_list_name(list_type, open_tag)
tags = LIST_TYPE_TO_HTML[list_type]
raise RDoc::Error, "Invalid list type: #{list_type.inspect}" unless tags
- annotate tags[open_tag ? 0 : 1]
+ tags[open_tag ? 0 : 1]
end
##
- # Starts a list item
+ # Returns the HTML tag for +list_type+, possible using a label from
+ # +list_item+
def list_item_start(list_item, list_type)
case list_type
when :BULLET, :LALPHA, :NUMBER, :UALPHA then
- annotate("<li>")
-
+ "<li>"
when :LABEL then
- annotate("<dt>") +
- convert_flow(@am.flow(list_item.label)) +
- annotate("</dt>") +
- annotate("<dd>")
-
+ "<dt>#{to_html list_item.label}</dt>\n<dd>"
when :NOTE then
- annotate("<tr>") +
- annotate("<td valign=\"top\">") +
- convert_flow(@am.flow(list_item.label)) +
- annotate("</td>") +
- annotate("<td>")
+ "<tr><td class=\"rdoc-term\"><p>#{to_html list_item.label}</p></td>\n<td>"
else
raise RDoc::Error, "Invalid list type: #{list_type.inspect}"
end
end
##
- # Ends a list item
+ # Returns the HTML end-tag for +list_type+
def list_end_for(list_type)
case list_type
@@ -340,5 +326,12 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
end
end
+ ##
+ # Converts +item+ to HTML using RDoc::Text#to_html
+
+ def to_html item
+ super convert_flow @am.flow item
+ end
+
end