class RD::RD2HTMLVisitor
Constants
- INCLUDE_SUFFIX
- METACHAR
- OUTPUT_SUFFIX
must-have constants
- SYSTEM_NAME
- SYSTEM_VERSION
- VERSION
Attributes
charcode[RW]
charcode=[RW]
charset[RW]
css[RW]
footnotes[R]
foottexts[R]
html_link_rel[R]
html_link_rev[R]
lang[RW]
output_rbl[RW]
output external Label file.
title[RW]
use_old_anchor[RW]
Public Class Methods
new()
click to toggle source
Calls superclass method
# File lib/rd/rd2html-lib.rb, line 42 def initialize @css = nil @charset = nil @lang = nil @title = nil @html_link_rel = {} @html_link_rev = {} @footnotes = [] @index = {} # @use_old_anchor = nil @use_old_anchor = true # MUST -> nil @output_rbl = nil super end
version()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 17 def self.version VERSION end
Public Instance Methods
add_foottext(num, foottext)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 393 def add_foottext(num, foottext) raise ArgumentError, "[BUG] footnote ##{num} isn't here." unless footnotes[num - 1] @foottexts[num - 1] = foottext end
apply_to_Code(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 287 def apply_to_Code(element, content) %Q[<code>#{content.join("")}</code>] end
apply_to_DescList(element, items)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 230 def apply_to_DescList(element, items) %Q[<dl>\n#{items.join("\n").chomp}\n</dl>] end
apply_to_DescListItem(element, term, description)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 251 def apply_to_DescListItem(element, term, description) anchor = get_anchor(element.term) label = hyphen_escape(element.label) term = term.join("") if description.empty? %Q[<dt><a name="#{anchor}" id="#{anchor}">#{term}</a></dt>] + %Q[<!-- RDLabel: "#{label}" -->] else %Q[<dt><a name="#{anchor}" id="#{anchor}">#{term}</a></dt>] + %Q[<!-- RDLabel: "#{label}" -->\n] + %Q[<dd>\n#{description.join("\n").chomp}\n</dd>] end end
apply_to_DocumentElement(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 67 def apply_to_DocumentElement(element, content) ret = "" ret << xml_decl + "\n" ret << doctype_decl + "\n" ret << html_open_tag + "\n" ret << html_head + "\n" ret << html_body(content) + "\n" ret << "</html>\n" ret end
apply_to_Emphasis(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 283 def apply_to_Emphasis(element, content) %Q[<em>#{content.join("")}</em>] end
apply_to_EnumList(element, items)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 226 def apply_to_EnumList(element, items) %Q[<ol>\n#{items.join("\n").chomp}\n</ol>] end
apply_to_EnumListItem(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 242 def apply_to_EnumListItem(element, content) %Q[<li>#{content.join("\n").chomp}</li>] end
apply_to_Footnote(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 354 def apply_to_Footnote(element, content) num = get_footnote_num(element) raise ArgumentError, "[BUG?] #{element} is not registered." unless num add_foottext(num, content) anchor = a_name("footmark", num) href = a_name("foottext", num) %Q|<a name="#{anchor}" id="#{anchor}" | + %Q|href="##{href}"><sup><small>| + %Q|*#{num}</small></sup></a>| end
apply_to_Foottext(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 382 def apply_to_Foottext(element, content) num = get_footnote_num(element) raise ArgumentError, "[BUG] #{element} isn't registered." unless num anchor = a_name("foottext", num) href = a_name("footmark", num) content = content.join("") %|<a name="#{anchor}" id="#{anchor}" href="##{href}">|+ %|<sup><small>*#{num}</small></sup></a>| + %|<small>#{content}</small><br />| end
apply_to_Headline(element, title)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 163 def apply_to_Headline(element, title) anchor = get_anchor(element) label = hyphen_escape(element.label) title = title.join("") %Q[<h#{element.level}><a name="#{anchor}" id="#{anchor}">#{title}</a>] + %Q[</h#{element.level}><!-- RDLabel: "#{label}" -->] end
apply_to_Index(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 299 def apply_to_Index(element, content) tmp = [] element.each do |i| tmp.push(i) if i.is_a?(String) end key = meta_char_escape(tmp.join("")) if @index.has_key?(key) # warning? %Q[<!-- Index, but conflict -->#{content.join("")}<!-- Index end -->] else num = @index[key] = @index.size anchor = a_name("index", num) %Q[<a name="#{anchor}" id="#{anchor}">#{content.join("")}</a>] end end
apply_to_ItemList(element, items)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 222 def apply_to_ItemList(element, items) %Q[<ul>\n#{items.join("\n").chomp}\n</ul>] end
apply_to_ItemListItem(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 238 def apply_to_ItemListItem(element, content) %Q[<li>#{content.join("\n").chomp}</li>] end
apply_to_Keyboard(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 295 def apply_to_Keyboard(element, content) %Q[<kbd>#{content.join("")}</kbd>] end
apply_to_MethodList(element, items)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 234 def apply_to_MethodList(element, items) %Q[<dl>\n#{items.join("\n").chomp}\n</dl>] end
apply_to_MethodListItem(element, term, description)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 265 def apply_to_MethodListItem(element, term, description) term = parse_method(term) # maybe: term -> element.term anchor = get_anchor(element.term) label = hyphen_escape(element.label) if description.empty? %Q[<dt><a name="#{anchor}" id="#{anchor}"><code>#{term}] + %Q[</code></a></dt><!-- RDLabel: "#{label}" -->] else %Q[<dt><a name="#{anchor}" id="#{anchor}"><code>#{term}] + %Q[</code></a></dt><!-- RDLabel: "#{label}" -->\n] + %Q[<dd>\n#{description.join("\n")}</dd>] end end
apply_to_RefToElement(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 328 def apply_to_RefToElement(element, content) content = content.join("") if anchor = refer(element) content = content.sub(/^function#/, "") %Q[<a href="\##{anchor}">#{content}</a>] else # warning? label = hyphen_escape(element.to_label) %Q[<!-- Reference, RDLabel "#{label}" doesn't exist -->] + %Q[<em class="label-not-found">#{content}</em><!-- Reference end -->] #' end end
apply_to_RefToOtherFile(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 342 def apply_to_RefToOtherFile(element, content) content = content.join("") filename = element.label.filename.sub(/\.(rd|rb)(\.\w+)?$/, "." + OUTPUT_SUFFIX) anchor = refer_external(element) if anchor %Q[<a href="#{filename}\##{anchor}">#{content}</a>] else %Q[<a href="#{filename}">#{content}</a>] end end
apply_to_Reference_with_RDLabel(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 315 def apply_to_Reference_with_RDLabel(element, content) if element.label.filename apply_to_RefToOtherFile(element, content) else apply_to_RefToElement(element, content) end end
apply_to_Reference_with_URL(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 323 def apply_to_Reference_with_URL(element, content) %Q[<a href="#{meta_char_escape(element.label.url)}">] + %Q[#{content.join("")}</a>] end
apply_to_String(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 409 def apply_to_String(element) meta_char_escape(element) end
apply_to_StringElement(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 279 def apply_to_StringElement(element) apply_to_String(element.content) end
apply_to_TextBlock(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 173 def apply_to_TextBlock(element, content) content = content.join("") if (is_this_textblock_only_one_block_of_parent_listitem?(element) or is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element)) content.chomp else %Q[<p>#{content.chomp}</p>] end end
apply_to_Var(element, content)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 291 def apply_to_Var(element, content) %Q[<var>#{content.join("")}</var>] end
apply_to_Verb(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 399 def apply_to_Verb(element) content = apply_to_String(element.content) %Q[#{content}] end
apply_to_Verbatim(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 214 def apply_to_Verbatim(element) content = [] element.each_line do |i| content.push(apply_to_String(i)) end %Q[<pre>#{content.join("").chomp}</pre>] end
consist_of_one_textblock_and_sublists(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 201 def consist_of_one_textblock_and_sublists(element) i = 0 element.each_child do |child| if i == 0 return false unless child.is_a?(TextBlock) else return false unless child.is_a?(List) end i += 1 end return true end
get_footnote_num(fn)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 366 def get_footnote_num(fn) raise ArgumentError, "#{fn} must be Footnote." unless fn.is_a? Footnote i = @footnotes.index(fn) if i i + 1 else nil end end
hyphen_escape(str)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 461 def hyphen_escape(str) str.gsub(/--/, "­­") end
is_this_textblock_only_one_block_of_parent_listitem?(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 183 def is_this_textblock_only_one_block_of_parent_listitem?(element) parent = element.parent (parent.is_a?(ItemListItem) or parent.is_a?(EnumListItem) or parent.is_a?(DescListItem) or parent.is_a?(MethodListItem)) and consist_of_one_textblock?(parent) end
is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 192 def is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element) parent = element.parent (parent.is_a?(ItemListItem) or parent.is_a?(EnumListItem) or parent.is_a?(DescListItem) or parent.is_a?(MethodListItem)) and consist_of_one_textblock_and_sublists(element.parent) end
visit(tree)
click to toggle source
Calls superclass method
# File lib/rd/rd2html-lib.rb, line 59 def visit(tree) prepare_labels(tree, "label-") prepare_footnotes(tree) tmp = super(tree) make_rbl_file(@filename) if @output_rbl and @filename tmp end
Private Instance Methods
a_name(prefix, num)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 475 def a_name(prefix, num) "#{prefix}-#{num}" end
backward_links()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 147 def backward_links return nil if @html_link_rev.empty? revs = @html_link_rev.sort{|i, j| i[0] <=> j[0] } (revs.collect do |rev, href| %Q[<link href="#{href}" rev="#{rev}" />] end).join("\n") end
consist_of_one_textblock?(listitem)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 246 def consist_of_one_textblock?(listitem) listitem.children.size == 1 and listitem.children[0].is_a?(TextBlock) end
doctype_decl()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 92 def doctype_decl %|<!DOCTYPE html \n| + %| PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n| + %| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">| end
document_title()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 78 def document_title return @title if @title return @filename if @filename return @input_filename unless @input_filename == "-" "Untitled" end
forward_links()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 138 def forward_links return nil if @html_link_rel.empty? rels = @html_link_rel.sort{|i, j| i[0] <=> j[0] } (rels.collect do |rel, href| %Q[<link href="#{href}" rel="#{rel}" />] end).join("\n") end
html_body(contents)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 156 def html_body(contents) content = contents.join("\n") foottext = make_foottext %Q|<body>\n#{content}\n#{foottext}\n</body>| end
html_content_type()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 121 def html_content_type if @charset %Q[<meta http-equiv="Content-type" ] + %Q[content="text/html; charset=#{@charset}" ] + "/>" end end
html_head()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 105 def html_head ret = %|<head>\n| ret << html_content_type + "\n" if html_content_type ret << html_title + "\n" ret << link_to_css + "\n" if link_to_css ret << forward_links + "\n" if forward_links ret << backward_links + "\n" if backward_links ret << %Q[</head>] end
html_open_tag()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 99 def html_open_tag lang_attr = %[ lang="#{@lang}" xml:lang="#{@lang}"] if @lang %|<html xmlns="http://www.w3.org/1999/xhtml"#{lang_attr}>| end
html_title()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 116 def html_title "<title>#{document_title}</title>" end
link_to_css()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 130 def link_to_css if @css %|<link href="#{@css}" type="text/css" rel="stylesheet" | + "/>" # for ruby-mode.el fontlock, it is separated into 2 lines. end end
make_foottext()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 465 def make_foottext return nil if foottexts.empty? content = [] foottexts.each_with_index do |ft, num| content.push(apply_to_Foottext(footnotes[num], ft)) end %|<hr />\n<p class="foottext">\n#{content.join("\n")}\n</p>| end
meta_char_escape(str)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 454 def meta_char_escape(str) str.gsub(/[<>&]/) { METACHAR[$&] } end
parse_method(method)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 413 def parse_method(method) klass, kind, method, args = MethodParse.analize_method(method) if kind == :function klass = kind = nil else kind = MethodParse.kind2str(kind) end args.gsub!(/&?\w+;?/){ |m| if /&\w+;/ =~ m then m else '<var>'+m+'</var>' end } case method when "self" klass, kind, method, args = MethodParse.analize_method(args) "#{klass}#{kind}<var>self</var> #{method}#{args}" when "[]" args.strip! args.sub!(/^\((.*)\)$/, '\\1') "#{klass}#{kind}[#{args}]" when "[]=" args.tr!(' ', '') args.sub!(/^\((.*)\)$/, '\\1') ary = args.split(/,/) case ary.length when 1 val = '<var>val</var>' when 2 args, val = *ary when 3 args, val = ary[0, 2].join(', '), ary[2] end "#{klass}#{kind}[#{args}] = #{val}" else "#{klass}#{kind}#{method}#{args}" end end
prepare_footnotes(tree)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 376 def prepare_footnotes(tree) @footnotes = tree.find_all{|i| i.is_a? Footnote } @foottexts = [] end
sp2nbsp(str)
click to toggle source
# File lib/rd/rd2html-lib.rb, line 404 def sp2nbsp(str) str.gsub(/\s/, " ") end
xml_decl()
click to toggle source
# File lib/rd/rd2html-lib.rb, line 86 def xml_decl encoding = %[encoding="#{@charset}" ] if @charset %|<?xml version="1.0" #{encoding}?>| end