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]
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

RDVisitor#apply_to_Include

# 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(/--/, "&shy;&shy;")
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
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
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
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/, "&nbsp;")
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