From b4d94277bb37ff405c2ca5bd47809083a9bfa3ee Mon Sep 17 00:00:00 2001 From: dave Date: Sun, 11 Jan 2004 17:34:05 +0000 Subject: [PATCH] Add HTML formatter to ri git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5440 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 + lib/rdoc/ri/ri_formatter.rb | 177 +++++++++++++++++++++++++++++++----- process.c | 4 - 3 files changed, 157 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 449a886719..d6c6a495ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Jan 12 02:24:07 2004 Dave Thomas + + * lib/rdoc/ri/ri_formatter.rb (RI::HtmlFormatter): Add HTML + generation support to ri (Elliot Hughes) + Sun Jan 11 23:54:41 2004 Nobuyoshi Nakada * env.h (ruby_frame, ruby_scope, ruby_in_eval, ruby_class, diff --git a/lib/rdoc/ri/ri_formatter.rb b/lib/rdoc/ri/ri_formatter.rb index 8fd214437d..f4ea7cb049 100644 --- a/lib/rdoc/ri/ri_formatter.rb +++ b/lib/rdoc/ri/ri_formatter.rb @@ -2,14 +2,15 @@ module RI class TextFormatter def TextFormatter.list - "plain, bs, ansi" + "plain, html, bs, ansi" end def TextFormatter.for(name) case name when /plain/i then TextFormatter - when /bs/i then OverstrikeFormatter - when /ansi/i then AnsiFormatter + when /html/i then HtmlFormatter + when /bs/i then OverstrikeFormatter + when /ansi/i then AnsiFormatter else nil end end @@ -159,10 +160,7 @@ module RI display_list(item) when SM::Flow::VERB - item.body.split(/\n/).each do |line| - print @indent, conv_html(line), "\n" - end - blankline + display_verbatim_flow_item(item, @indent) when SM::Flow::H display_heading(conv_html(item.text.join), item.level, @indent) @@ -177,6 +175,15 @@ module RI ###################################################################### + def display_verbatim_flow_item(item, prefix=@indent) + item.body.split(/\n/).each do |line| + print @indent, conv_html(line), "\n" + end + blankline + end + + ###################################################################### + def display_heading(text, level, indent) case level when 1 @@ -431,24 +438,144 @@ module RI end end -# options = "options" -# def options.width -# 70 -# end -# a = OverstrikeFormatter.new(options, " ") -# a.wrap( -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " + -# "The quick brown and italic dog " -# ) + ################################################## + + # This formatter uses HTML. + + class HtmlFormatter < AttributeFormatter + + def initialize(*args) + super + end + + def write_attribute_text(prefix, line) + curr_attr = 0 + line.each do |achar| + attr = achar.attr + if achar.attr != curr_attr + update_attributes(curr_attr, achar.attr) + curr_attr = achar.attr + end + print(escape(achar.char)) + end + update_attributes(curr_attr, 0) unless curr_attr.zero? + puts + end + + def draw_line(label=nil) + if label != nil + bold_print(label) + end + puts("

") + end + + def bold_print(txt) + tag("b") { txt } + end + + def blankline() + puts("

") + end + + def display_heading(text, level, indent) + level = 4 if level > 4 + tag("h#{level}") { text } + puts + end + + ###################################################################### + + def display_list(list) + + case list.type + when SM::ListBase::BULLET + list_type = "ul" + prefixer = proc { |ignored| "

  • " } + + when SM::ListBase::NUMBER, + SM::ListBase::UPPERALPHA, + SM::ListBase::LOWERALPHA + list_type = "ol" + prefixer = proc { |ignored| "
  • " } + + when SM::ListBase::LABELED + list_type = "dl" + prefixer = proc do |li| + "
    " + escape(li.label) + "
    " + end + + when SM::ListBase::NOTE + list_type = "table" + prefixer = proc do |li| + %{#{li.label.gsub(/ /, ' ')}} + end + else + fail "unknown list type" + end + + print "<#{list_type}>" + list.contents.each do |item| + if item.kind_of? SM::Flow::LI + prefix = prefixer.call(item) + print prefix + display_flow_item(item, prefix) + else + display_flow_item(item) + end + end + print "" + end + + def display_verbatim_flow_item(item, prefix=@indent) + print("
    ")
    +        item.body.split(/\n/).each do |line|
    +          puts conv_html(line)
    +        end
    +        puts("
    ") + end + + private + + ATTR_MAP = { + BOLD => "b>", + ITALIC => "i>", + CODE => "tt>" + } + + def update_attributes(current, wanted) + str = "" + # first turn off unwanted ones + off = current & ~wanted + for quality in [ BOLD, ITALIC, CODE] + if (off & quality) > 0 + str << "") + print(yield) + print("") + end + + def escape(str) + str. + gsub(/&/n, '&'). + gsub(/\"/n, '"'). + gsub(/>/n, '>'). + gsub(/