diff options
author | dave <dave@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-11 17:34:05 +0000 |
---|---|---|
committer | dave <dave@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-11 17:34:05 +0000 |
commit | b4d94277bb37ff405c2ca5bd47809083a9bfa3ee (patch) | |
tree | ca3768ba3dea8a1d69876479db798885cf1ca79a | |
parent | db4ec3c56a0ee43630234885039cc3bcd13f8026 (diff) | |
download | ruby-b4d94277bb37ff405c2ca5bd47809083a9bfa3ee.tar.gz |
Add HTML formatter to ri
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5440 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | lib/rdoc/ri/ri_formatter.rb | 177 | ||||
-rw-r--r-- | process.c | 4 |
3 files changed, 157 insertions, 29 deletions
@@ -1,3 +1,8 @@ +Mon Jan 12 02:24:07 2004 Dave Thomas <dave@pragprog.com> + + * 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 <nobu@ruby-lang.org> * 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 <b>brown</b> and <i>italic</i> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> dog " + -# "The quick <b>brown and <i>italic</i></b> 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("<hr /><p />") + end + + def bold_print(txt) + tag("b") { txt } + end + + def blankline() + puts("<p>") + 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| "<li>" } + + when SM::ListBase::NUMBER, + SM::ListBase::UPPERALPHA, + SM::ListBase::LOWERALPHA + list_type = "ol" + prefixer = proc { |ignored| "<li>" } + + when SM::ListBase::LABELED + list_type = "dl" + prefixer = proc do |li| + "<dt><b>" + escape(li.label) + "</b><dd>" + end + + when SM::ListBase::NOTE + list_type = "table" + prefixer = proc do |li| + %{<tr valign="top"><td>#{li.label.gsub(/ /, ' ')}</td><td>} + 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 "</#{list_type}>" + end + + def display_verbatim_flow_item(item, prefix=@indent) + print("<pre>") + item.body.split(/\n/).each do |line| + puts conv_html(line) + end + puts("</pre>") + 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 << "</" + ATTR_MAP[quality] + end + end + + # now turn on wanted + for quality in [ BOLD, ITALIC, CODE] + unless (wanted & quality).zero? + str << "<" << ATTR_MAP[quality] + end + end + print str + end + + def tag(code) + print("<#{code}>") + print(yield) + print("</#{code}>") + end + + def escape(str) + str. + gsub(/&/n, '&'). + gsub(/\"/n, '"'). + gsub(/>/n, '>'). + gsub(/</n, '<') + end + + end end @@ -662,10 +662,6 @@ waitall_each(pid, status, ary) * * 0:: Waits for any child whose process group ID equals that of the * calling process. - * adsasdasd sads adada dsa a sad ad asd sad sa dsa dasdsad asd asd - * adsasdasd sads adada dsa a sad ad asd sad sa dsa dasdsad asd asd - * adsasdasd sads adada dsa a sad ad asd sad sa dsa dasdsad asd asd - * adsasdasd sads adada dsa a sad ad asd sad sa dsa dasdsad asd asd * * -1:: Waits for any child process (the default if no _pid_ is * given). |