mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Import RDoc 3
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d7effd506f
commit
2ef9c50c6e
106 changed files with 8878 additions and 4179 deletions
|
@ -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
|
||||
|
||||
##
|
||||
# Adds +blank_line+ to the output
|
||||
|
||||
def accept_blank_line(blank_line)
|
||||
# @res << annotate("<p />") << "\n"
|
||||
end
|
||||
|
||||
##
|
||||
# Adds +heading+ to the output
|
||||
|
||||
def accept_heading(heading)
|
||||
@res << convert_heading(heading.level, @am.flow(heading.text))
|
||||
@res << "\n<h#{heading.level}>"
|
||||
@res << to_html(heading.text)
|
||||
@res << "</h#{heading.level}>\n"
|
||||
end
|
||||
|
||||
##
|
||||
# Adds +raw+ to the output
|
||||
|
||||
def accept_raw raw
|
||||
@res << raw.parts.join("\n")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
##
|
||||
# Converts string +item+
|
||||
# CGI escapes +text+
|
||||
|
||||
def convert_string(item)
|
||||
in_tt? ? convert_string_simple(item) : convert_string_fancy(item)
|
||||
def convert_string(text)
|
||||
CGI.escapeHTML text
|
||||
end
|
||||
|
||||
##
|
||||
# Escapes HTML in +item+
|
||||
|
||||
def convert_string_simple(item)
|
||||
CGI.escapeHTML item
|
||||
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(/\.\.\./, '…').
|
||||
|
||||
# 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\)/, '®')
|
||||
end
|
||||
|
||||
##
|
||||
# Converts headings to hN elements
|
||||
|
||||
def convert_heading(level, flow)
|
||||
[annotate("<h#{level}>"),
|
||||
convert_flow(flow),
|
||||
annotate("</h#{level}>\n")].join
|
||||
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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue