diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-12-20 03:22:49 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-12-20 03:22:49 +0000 |
commit | 2ef9c50c6e405717d06362787c4549ca4f1c6485 (patch) | |
tree | ee99486567461dd5796f3d6edcc9e204187f2666 /lib/rdoc/markup/to_html.rb | |
parent | d7effd506f5b91a636f2e6452ef1946b923007c7 (diff) | |
download | ruby-2ef9c50c6e405717d06362787c4549ca4f1c6485.tar.gz |
Import RDoc 3
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rdoc/markup/to_html.rb')
-rw-r--r-- | lib/rdoc/markup/to_html.rb | 175 |
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(/&/, '&'). - - # convert -- to em-dash, (-- to en-dash) - gsub(/---?/, '—'). #gsub(/--/, '–'). - - # convert ... to elipsis (and make sure .... becomes .<elipsis>) - gsub(/\.\.\.\./, '.…').gsub(/\.\.\./, '…'). + # Adds +raw+ to the output - # convert single closing quote - gsub(%r{([^ \t\r\n\[\{\(])\'}, '\1’'). # } - gsub(%r{\'(?=\W|s\b)}, '’'). - - # convert single opening quote - gsub(/'/, '‘'). - - # convert double closing quote - gsub(%r{([^ \t\r\n\[\{\(])\"(?=\W)}, '\1”'). # } - - # convert double opening quote - gsub(/"/, '“'). - - # convert copyright - gsub(/\(c\)/, '©'). - - # convert registered trademark - gsub(/\(r\)/, '®') + 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 |