# File rdoc/ri/formatter.rb, line 11
def self.for(name)
FORMATTERS[name.downcase]
end
# File rdoc/ri/formatter.rb, line 80
def blankline
@output.puts
end
# File rdoc/ri/formatter.rb, line 91
def bold_print(txt)
@output.print txt
end
Called when we want to ensure a new 'wrap' starts on a newline. Only needed for HtmlFormatter, because the rest do their own line breaking.
# File rdoc/ri/formatter.rb, line 88
def break_to_newline
end
Convert HTML entities back to ASCII
# File rdoc/ri/formatter.rb, line 102
def conv_html(txt)
txt = txt.gsub(/>/, '>')
txt.gsub!(/</, '<')
txt.gsub!(/"/, '"')
txt.gsub!(/&/, '&')
txt
end
Convert markup into display form
# File rdoc/ri/formatter.rb, line 113
def conv_markup(txt)
txt = txt.gsub(%r{<tt>(.*?)</tt>}, '+\1+')
txt.gsub!(%r{<code>(.*?)</code>}, '+\1+')
txt.gsub!(%r{<b>(.*?)</b>}, '*\1*')
txt.gsub!(%r{<em>(.*?)</em>}, '_\1_')
txt
end
# File rdoc/ri/formatter.rb, line 218
def display_flow(flow)
flow.each do |f|
display_flow_item(f)
end
end
# File rdoc/ri/formatter.rb, line 166
def display_flow_item(item, prefix = @indent)
case item
when RDoc::Markup::Flow::P, RDoc::Markup::Flow::LI
wrap(conv_html(item.body), prefix)
blankline
when RDoc::Markup::Flow::LIST
display_list(item)
when RDoc::Markup::Flow::VERB
display_verbatim_flow_item(item, @indent)
when RDoc::Markup::Flow::H
display_heading(conv_html(item.text), item.level, @indent)
when RDoc::Markup::Flow::RULE
draw_line
else
raise RDoc::Error, "Unknown flow element: #{item.class}"
end
end
# File rdoc/ri/formatter.rb, line 196
def display_heading(text, level, indent)
text = strip_attributes text
case level
when 1 then
ul = "=" * text.length
@output.puts
@output.puts text.upcase
@output.puts ul
when 2 then
ul = "-" * text.length
@output.puts
@output.puts text
@output.puts ul
else
@output.print indent, text, "\n"
end
@output.puts
end
# File rdoc/ri/formatter.rb, line 121
def display_list(list)
case list.type
when :BULLET
prefixer = proc { |ignored| @indent + "* " }
when :NUMBER, :UPPERALPHA, :LOWERALPHA then
start = case list.type
when :NUMBER then 1
when :UPPERALPHA then 'A'
when :LOWERALPHA then 'a'
end
prefixer = proc do |ignored|
res = @indent + "#{start}.".ljust(4)
start = start.succ
res
end
when :LABELED, :NOTE then
longest = 0
list.contents.each do |item|
if RDoc::Markup::Flow::LI === item and item.label.length > longest then
longest = item.label.length
end
end
longest += 1
prefixer = proc { |li| @indent + li.label.ljust(longest) }
else
raise ArgumentError, "unknown list type #{list.type}"
end
list.contents.each do |item|
if RDoc::Markup::Flow::LI === item then
prefix = prefixer.call item
display_flow_item item, prefix
else
display_flow_item item
end
end
end
# File rdoc/ri/formatter.rb, line 189
def display_verbatim_flow_item(item, prefix=@indent)
item.body.split(/\n/).each do |line|
@output.print @indent, conv_html(line), "\n"
end
blankline
end
# File rdoc/ri/formatter.rb, line 26
def draw_line(label=nil)
len = @width
len -= (label.size + 1) if label
if len > 0 then
@output.print '-' * len
if label
@output.print ' '
bold_print label
end
@output.puts
else
@output.print '-' * @width
@output.puts
@output.puts label
end
end
# File rdoc/ri/formatter.rb, line 46
def indent
return @indent unless block_given?
begin
indent = @indent.dup
@indent += @original_indent
yield
ensure
@indent = indent
end
end
# File rdoc/ri/formatter.rb, line 95
def raw_print_line(txt)
@output.print txt
end
# File rdoc/ri/formatter.rb, line 224
def strip_attributes(text)
text.gsub(/(<\/?(?:b|code|em|i|tt)>)/, '')
end
# File rdoc/ri/formatter.rb, line 58
def wrap(txt, prefix=@indent, linelen=@width)
return unless txt && !txt.empty?
work = conv_markup(txt)
textLen = linelen - prefix.length
patt = Regexp.new("^(.{0,#{textLen}})[ \n]")
next_prefix = prefix.tr("^ ", " ")
res = []
while work.length > textLen
if work =~ patt
res << $1
work.slice!(0, $&.length)
else
res << work.slice!(0, textLen)
end
end
res << work if work.length.nonzero?
@output.puts(prefix + res.join("\n" + next_prefix))
end