Class: RDoc::Markup::ToHtml
- Includes:
- Text
- Defined in:
- lib/rdoc/markup/to_html.rb
Overview
Outputs RDoc markup as HTML.
Direct Known Subclasses
Constant Summary collapse
- LIST_TYPE_TO_HTML =
Maps RDoc::Markup::Parser::LIST_TOKENS types to HTML tags
{ :BULLET => ['<ul>', '</ul>'], :LABEL => ['<dl class="rdoc-list label-list">', '</dl>'], :LALPHA => ['<ol style="list-style-type: lower-alpha">', '</ol>'], :NOTE => ['<dl class="rdoc-list note-list">', '</dl>'], :NUMBER => ['<ol>', '</ol>'], :UALPHA => ['<ol style="list-style-type: upper-alpha">', '</ol>'], }
- URL_CHARACTERS_REGEXP_STR =
:nodoc:
/[A-Za-z0-9\-._~:\/\?#\[\]@!$&'\(\)*+,;%=]/.source
Constants included from Text
Text::MARKUP_FORMAT, Text::SPACE_SEPARATED_LETTER_CLASS, Text::TO_HTML_CHARACTERS
Instance Attribute Summary collapse
-
#code_object ⇒ Object
The RDoc::CodeObject HTML is being generated for.
-
#from_path ⇒ Object
Path to this document for relative links.
-
#in_list_entry ⇒ Object
readonly
:nodoc:.
-
#list ⇒ Object
readonly
:nodoc:.
-
#res ⇒ Object
readonly
:nodoc:.
Attributes included from Text
Instance Method Summary collapse
-
#accept_blank_line(blank_line) ⇒ Object
Adds
blank_line
to the output. -
#accept_block_quote(block_quote) ⇒ Object
Adds
block_quote
to the output. -
#accept_heading(heading) ⇒ Object
Adds
heading
to the output. -
#accept_list_end(list) ⇒ Object
Finishes consumption of
list
. -
#accept_list_item_end(list_item) ⇒ Object
Finishes consumption of
list_item
. -
#accept_list_item_start(list_item) ⇒ Object
Prepares the visitor for consuming
list_item
. -
#accept_list_start(list) ⇒ Object
Prepares the visitor for consuming
list
. -
#accept_paragraph(paragraph) ⇒ Object
Adds
paragraph
to the output. -
#accept_raw(raw) ⇒ Object
Adds
raw
to the output. -
#accept_rule(rule) ⇒ Object
Adds
rule
to the output. -
#accept_table(header, body, aligns) ⇒ Object
Adds
table
to the output. -
#accept_verbatim(verbatim) ⇒ Object
Adds
verbatim
to the output. -
#convert_string(text) ⇒ Object
CGI-escapes
text
. -
#end_accepting ⇒ Object
Returns the generated output.
-
#gen_url(url, text) ⇒ Object
Generate a link to
url
with contenttext
. -
#handle_RDOCLINK(url) ⇒ Object
:nodoc:.
-
#handle_regexp_HARD_BREAK(target) ⇒ Object
target
is a<br>
. -
#handle_regexp_HYPERLINK(target) ⇒ Object
target
is a potential link. -
#handle_regexp_RDOCLINK(target) ⇒ Object
target
is an rdoc-schemed link that will be converted into a hyperlink. -
#handle_regexp_TIDYLINK(target) ⇒ Object
This
target
is a link where the label is different from the URLlabel[url]
or{long label}[url]
. -
#html_list_name(list_type, open_tag) ⇒ Object
Determines the HTML list element for
list_type
andopen_tag
. -
#init_link_notation_regexp_handlings ⇒ Object
Adds regexp handlings about link notations.
-
#init_regexp_handlings ⇒ Object
Adds regexp handlings.
-
#init_tags ⇒ Object
Maps attributes to HTML tags.
-
#initialize(options, markup = nil) ⇒ ToHtml
constructor
Creates a new formatter that will output HTML.
-
#list_end_for(list_type) ⇒ Object
Returns the HTML end-tag for
list_type
. -
#list_item_start(list_item, list_type) ⇒ Object
Returns the HTML tag for
list_type
, possible using a label fromlist_item
. -
#parseable?(text) ⇒ Boolean
Returns true if text is valid ruby syntax.
-
#start_accepting ⇒ Object
Prepares the visitor for HTML generation.
-
#to_html(item) ⇒ Object
Converts
item
to HTML using RDoc::Text#to_html.
Methods included from Text
encode_fallback, #expand_tabs, #flush_left, #markup, #normalize_comment, #parse, #snippet, #strip_hashes, #strip_newlines, #strip_stars, #wrap
Methods inherited from Formatter
#accept_document, #add_regexp_handling_RDOCLINK, #add_regexp_handling_TIDYLINK, #add_tag, #annotate, #convert, #convert_flow, #convert_regexp_handling, gen_relative_url, #ignore, #in_tt?, #off_tags, #on_tags, #parse_url, #tt?
Constructor Details
#initialize(options, markup = nil) ⇒ ToHtml
Creates a new formatter that will output HTML
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/rdoc/markup/to_html.rb', line 45 def initialize , markup = nil super @code_object = nil @from_path = '' @in_list_entry = nil @list = nil @th = nil @hard_break = "<br>\n" init_regexp_handlings end |
Instance Attribute Details
#code_object ⇒ Object
The RDoc::CodeObject HTML is being generated for. This is used to generate namespaced URI fragments
33 34 35 |
# File 'lib/rdoc/markup/to_html.rb', line 33 def code_object @code_object end |
#from_path ⇒ Object
Path to this document for relative links
38 39 40 |
# File 'lib/rdoc/markup/to_html.rb', line 38 def from_path @from_path end |
#in_list_entry ⇒ Object (readonly)
:nodoc:
26 27 28 |
# File 'lib/rdoc/markup/to_html.rb', line 26 def in_list_entry @in_list_entry end |
#list ⇒ Object (readonly)
:nodoc:
27 28 29 |
# File 'lib/rdoc/markup/to_html.rb', line 27 def list @list end |
#res ⇒ Object (readonly)
:nodoc:
25 26 27 |
# File 'lib/rdoc/markup/to_html.rb', line 25 def res @res end |
Instance Method Details
#accept_blank_line(blank_line) ⇒ Object
Adds blank_line
to the output
291 292 293 |
# File 'lib/rdoc/markup/to_html.rb', line 291 def accept_blank_line(blank_line) # @res << annotate("<p />") << "\n" end |
#accept_block_quote(block_quote) ⇒ Object
Adds block_quote
to the output
190 191 192 193 194 195 196 197 198 |
# File 'lib/rdoc/markup/to_html.rb', line 190 def accept_block_quote block_quote @res << "\n<blockquote>" block_quote.parts.each do |part| part.accept self end @res << "</blockquote>\n" end |
#accept_heading(heading) ⇒ Object
Adds heading
to the output. The headings greater than 6 are trimmed to level 6.
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'lib/rdoc/markup/to_html.rb', line 299 def accept_heading heading level = [6, heading.level].min label = heading.label @code_object @res << if @options.output_decoration "\n<h#{level} id=\"#{label}\">" else "\n<h#{level}>" end @res << to_html(heading.text) unless @options.pipe then @res << "<span><a href=\"##{label}\">¶</a>" @res << " <a href=\"#top\">↑</a></span>" end @res << "</h#{level}>\n" end |
#accept_list_end(list) ⇒ Object
Finishes consumption of list
262 263 264 265 266 267 268 |
# File 'lib/rdoc/markup/to_html.rb', line 262 def accept_list_end(list) @list.pop if tag = @in_list_entry.pop @res << tag end @res << html_list_name(list.type, false) << "\n" end |
#accept_list_item_end(list_item) ⇒ Object
Finishes consumption of list_item
284 285 286 |
# File 'lib/rdoc/markup/to_html.rb', line 284 def accept_list_item_end(list_item) @in_list_entry[-1] = list_end_for(@list.last) end |
#accept_list_item_start(list_item) ⇒ Object
Prepares the visitor for consuming list_item
273 274 275 276 277 278 279 |
# File 'lib/rdoc/markup/to_html.rb', line 273 def accept_list_item_start(list_item) if tag = @in_list_entry.last @res << tag end @res << list_item_start(list_item, @list.last) end |
#accept_list_start(list) ⇒ Object
Prepares the visitor for consuming list
253 254 255 256 257 |
# File 'lib/rdoc/markup/to_html.rb', line 253 def accept_list_start(list) @list << list.type @res << html_list_name(list.type, true) @in_list_entry.push false end |
#accept_paragraph(paragraph) ⇒ Object
Adds paragraph
to the output
203 204 205 206 207 208 209 210 211 |
# File 'lib/rdoc/markup/to_html.rb', line 203 def accept_paragraph paragraph @res << "\n<p>" text = paragraph.text @hard_break text = text.gsub(/(#{SPACE_SEPARATED_LETTER_CLASS})?\K\r?\n(?=(?(1)(#{SPACE_SEPARATED_LETTER_CLASS})?))/o) { defined?($2) && ' ' } @res << to_html(text) @res << "</p>\n" end |
#accept_raw(raw) ⇒ Object
Adds raw
to the output
320 321 322 |
# File 'lib/rdoc/markup/to_html.rb', line 320 def accept_raw raw @res << raw.parts.join("\n") end |
#accept_rule(rule) ⇒ Object
Adds rule
to the output
246 247 248 |
# File 'lib/rdoc/markup/to_html.rb', line 246 def accept_rule rule @res << "<hr>\n" end |
#accept_table(header, body, aligns) ⇒ Object
Adds table
to the output
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 |
# File 'lib/rdoc/markup/to_html.rb', line 327 def accept_table header, body, aligns @res << "\n<table role=\"table\">\n<thead>\n<tr>\n" header.zip(aligns) do |text, align| @res << '<th' @res << ' align="' << align << '"' if align @res << '>' << to_html(text) << "</th>\n" end @res << "</tr>\n</thead>\n<tbody>\n" body.each do |row| @res << "<tr>\n" row.zip(aligns) do |text, align| @res << '<td' @res << ' align="' << align << '"' if align @res << '>' << to_html(text) << "</td>\n" end @res << "</tr>\n" end @res << "</tbody>\n</table>\n" end |
#accept_verbatim(verbatim) ⇒ Object
Adds verbatim
to the output
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/rdoc/markup/to_html.rb', line 216 def accept_verbatim verbatim text = verbatim.text.rstrip klass = nil content = if verbatim.ruby? or parseable? text then begin tokens = RDoc::Parser::RipperStateLex.parse text klass = ' class="ruby"' result = RDoc::TokenStream.to_html tokens result = result + "\n" unless "\n" == result[-1] result rescue CGI.escapeHTML text end else CGI.escapeHTML text end if @options.pipe then @res << "\n<pre><code>#{CGI.escapeHTML text}\n</code></pre>\n" else @res << "\n<pre#{klass}>#{content}</pre>\n" end end |
#convert_string(text) ⇒ Object
CGI-escapes text
352 353 354 |
# File 'lib/rdoc/markup/to_html.rb', line 352 def convert_string(text) CGI.escapeHTML text end |
#end_accepting ⇒ Object
Returns the generated output
183 184 185 |
# File 'lib/rdoc/markup/to_html.rb', line 183 def end_accepting @res.join end |
#gen_url(url, text) ⇒ Object
Generate a link to url
with content text
. Handles the special cases for img: and link: described under handle_regexp_HYPERLINK
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
# File 'lib/rdoc/markup/to_html.rb', line 360 def gen_url url, text scheme, url, id = parse_url url if %w[http https link].include?(scheme) and url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then "<img src=\"#{url}\" />" else if scheme != 'link' and %r%\A((?!https?:)(?:[^/#]*/)*+)([^/#]+)\.(rb|rdoc|md)(?=\z|#)%i =~ url url = "#$1#{$2.tr('.', '_')}_#$3.html#$'" end text = text.sub %r%^#{scheme}:/*%i, '' text = text.sub %r%^[*\^](\d+)$%, '\1' link = "<a#{id} href=\"#{url}\">#{text}</a>" link = "<sup>#{link}</sup>" if /"foot/ =~ id link end end |
#handle_RDOCLINK(url) ⇒ Object
:nodoc:
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/rdoc/markup/to_html.rb', line 85 def handle_RDOCLINK url # :nodoc: case url when /^rdoc-ref:/ CGI.escapeHTML($') when /^rdoc-label:/ text = $' text = case text when /\Alabel-/ then $' when /\Afootmark-/ then $' when /\Afoottext-/ then $' else text end gen_url CGI.escapeHTML(url), CGI.escapeHTML(text) when /^rdoc-image:/ %[<img src=\"#{CGI.escapeHTML($')}\">] when /\Ardoc-[a-z]+:/ CGI.escapeHTML($') end end |
#handle_regexp_HARD_BREAK(target) ⇒ Object
target
is a <br>
110 111 112 |
# File 'lib/rdoc/markup/to_html.rb', line 110 def handle_regexp_HARD_BREAK target '<br>' end |
#handle_regexp_HYPERLINK(target) ⇒ Object
target
is a potential link. The following schemes are handled:
mailto:
-
Inserted as-is.
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. link:
-
Reference to a local file relative to the output directory.
126 127 128 129 130 |
# File 'lib/rdoc/markup/to_html.rb', line 126 def handle_regexp_HYPERLINK(target) url = CGI.escapeHTML(target.text) gen_url url, url end |
#handle_regexp_RDOCLINK(target) ⇒ Object
target
is an rdoc-schemed link that will be converted into a hyperlink.
For the rdoc-ref
scheme the named reference will be returned without creating a link.
For the rdoc-label
scheme the footnote and label prefixes are stripped when creating a link. All other contents will be linked verbatim.
141 142 143 |
# File 'lib/rdoc/markup/to_html.rb', line 141 def handle_regexp_RDOCLINK target handle_RDOCLINK target.text end |
#handle_regexp_TIDYLINK(target) ⇒ Object
This target
is a link where the label is different from the URL label[url]
or {long label}[url]
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/rdoc/markup/to_html.rb', line 149 def handle_regexp_TIDYLINK(target) text = target.text return text unless text =~ /^\{(.*)\}\[(.*?)\]$/ or text =~ /^(\S+)\[(.*?)\]$/ label = $1 url = CGI.escapeHTML($2) if /^rdoc-image:/ =~ label label = handle_RDOCLINK(label) else label = CGI.escapeHTML(label) end gen_url url, label end |
#html_list_name(list_type, open_tag) ⇒ Object
Determines the HTML list element for list_type
and open_tag
385 386 387 388 389 |
# File 'lib/rdoc/markup/to_html.rb', line 385 def html_list_name(list_type, open_tag) = LIST_TYPE_TO_HTML[list_type] raise RDoc::Error, "Invalid list type: #{list_type.inspect}" unless [open_tag ? 0 : 1] end |
#init_link_notation_regexp_handlings ⇒ Object
Adds regexp handlings about link notations.
80 81 82 83 |
# File 'lib/rdoc/markup/to_html.rb', line 80 def init_link_notation_regexp_handlings add_regexp_handling_RDOCLINK add_regexp_handling_TIDYLINK end |
#init_regexp_handlings ⇒ Object
Adds regexp handlings.
70 71 72 73 74 75 |
# File 'lib/rdoc/markup/to_html.rb', line 70 def init_regexp_handlings # external links @markup.add_regexp_handling(/(?:link:|https?:|mailto:|ftp:|irc:|www\.)#{URL_CHARACTERS_REGEXP_STR}+\w/, :HYPERLINK) init_link_notation_regexp_handlings end |
#init_tags ⇒ Object
Maps attributes to HTML tags
394 395 396 397 398 |
# File 'lib/rdoc/markup/to_html.rb', line 394 def add_tag :BOLD, "<strong>", "</strong>" add_tag :TT, "<code>", "</code>" add_tag :EM, "<em>", "</em>" end |
#list_end_for(list_type) ⇒ Object
Returns the HTML end-tag for list_type
420 421 422 423 424 425 426 427 428 429 |
# File 'lib/rdoc/markup/to_html.rb', line 420 def list_end_for(list_type) case list_type when :BULLET, :LALPHA, :NUMBER, :UALPHA then "</li>" when :LABEL, :NOTE then "</dd>" else raise RDoc::Error, "Invalid list type: #{list_type.inspect}" end end |
#list_item_start(list_item, list_type) ⇒ Object
Returns the HTML tag for list_type
, possible using a label from list_item
404 405 406 407 408 409 410 411 412 413 414 415 |
# File 'lib/rdoc/markup/to_html.rb', line 404 def list_item_start(list_item, list_type) case list_type when :BULLET, :LALPHA, :NUMBER, :UALPHA then "<li>" when :LABEL, :NOTE then Array(list_item.label).map do |label| "<dt>#{to_html label}\n" end.join << "<dd>" else raise RDoc::Error, "Invalid list type: #{list_type.inspect}" end end |
#parseable?(text) ⇒ Boolean
Returns true if text is valid ruby syntax
434 435 436 437 438 439 440 441 442 443 |
# File 'lib/rdoc/markup/to_html.rb', line 434 def parseable? text verbose, $VERBOSE = $VERBOSE, nil catch(:valid) do eval("BEGIN { throw :valid, true }\n#{text}") end rescue SyntaxError false ensure $VERBOSE = verbose end |
#start_accepting ⇒ Object
Prepares the visitor for HTML generation
174 175 176 177 178 |
# File 'lib/rdoc/markup/to_html.rb', line 174 def start_accepting @res = [] @in_list_entry = [] @list = [] end |
#to_html(item) ⇒ Object
Converts item
to HTML using RDoc::Text#to_html
448 449 450 |
# File 'lib/rdoc/markup/to_html.rb', line 448 def to_html item super convert_flow @am.flow item end |