Current indent amount for output in characters
Stack of current list indexes for alphabetic and numeric lists
Stack of list types
Stack of list widths for indentation
Prefix for the next list item. See use_prefix
Output accumulator
Output width in characters
Creates a new formatter that will output (mostly) RDoc markup
# File lib/rdoc/markup/to_rdoc.rb, line 44
def initialize markup = nil
super
@markup.add_special(%r\\\S/, :SUPPRESSED_CROSSREF)
@width = 78
init_tags
@headings = {}
@headings.default = []
@headings[1] = ['= ', '']
@headings[2] = ['== ', '']
@headings[3] = ['=== ', '']
@headings[4] = ['==== ', '']
@headings[5] = ['===== ', '']
@headings[6] = ['====== ', '']
@hard_break = "\n"
end
Adds blank_line
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 76
def accept_blank_line blank_line
@res << "\n"
end
Adds heading
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 83
def accept_heading heading
use_prefix or @res << ' ' * @indent
@res << @headings[heading.level][0]
@res << attributes(heading.text)
@res << @headings[heading.level][1]
@res << "\n"
end
Adds paragraph
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 187
def accept_indented_paragraph paragraph
@indent += paragraph.indent
text = paragraph.text @hard_break
wrap attributes text
@indent -= paragraph.indent
end
Finishes consumption of list
# File lib/rdoc/markup/to_rdoc.rb, line 94
def accept_list_end list
@list_index.pop
@list_type.pop
@list_width.pop
end
Finishes consumption of list_item
# File lib/rdoc/markup/to_rdoc.rb, line 103
def accept_list_item_end list_item
width = case @list_type.last
when :BULLET then
2
when :NOTE, :LABEL then
if @prefix then
@res << @prefix.strip
@prefix = nil
end
@res << "\n"
2
else
bullet = @list_index.last.to_s
@list_index[-1] = @list_index.last.succ
bullet.length + 2
end
@indent -= width
end
Prepares the visitor for consuming list_item
# File lib/rdoc/markup/to_rdoc.rb, line 127
def accept_list_item_start list_item
type = @list_type.last
case type
when :NOTE, :LABEL then
bullets = Array(list_item.label).map do |label|
attributes(label).strip
end.join "\n"
bullets << ":\n" unless bullets.empty?
@prefix = ' ' * @indent
@indent += 2
@prefix << bullets + (' ' * @indent)
else
bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
@prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)
width = bullet.length + 1
@indent += width
end
end
Prepares the visitor for consuming list
# File lib/rdoc/markup/to_rdoc.rb, line 152
def accept_list_start list
case list.type
when :BULLET then
@list_index << nil
@list_width << 1
when :LABEL, :NOTE then
@list_index << nil
@list_width << 2
when :LALPHA then
@list_index << 'a'
@list_width << list.items.length.to_s.length
when :NUMBER then
@list_index << 1
@list_width << list.items.length.to_s.length
when :UALPHA then
@list_index << 'A'
@list_width << list.items.length.to_s.length
else
raise RDoc::Error, "invalid list type #{list.type}"
end
@list_type << list.type
end
Adds paragraph
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 179
def accept_paragraph paragraph
text = paragraph.text @hard_break
wrap attributes text
end
Adds raw
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 197
def accept_raw raw
@res << raw.parts.join("\n")
end
Adds rule
to the output
# File lib/rdoc/markup/to_rdoc.rb, line 204
def accept_rule rule
use_prefix or @res << ' ' * @indent
@res << '-' * (@width - @indent)
@res << "\n"
end
Outputs verbatim
indented 2 columns
# File lib/rdoc/markup/to_rdoc.rb, line 213
def accept_verbatim verbatim
indent = ' ' * (@indent + 2)
verbatim.parts.each do |part|
@res << indent unless part == "\n"
@res << part
end
@res << "\n" unless @res =~ %r\n\z/
end
Applies attribute-specific markup to text
using
RDoc::AttributeManager
# File lib/rdoc/markup/to_rdoc.rb, line 227
def attributes text
flow = @am.flow text.dup
convert_flow flow
end
Returns the generated output
# File lib/rdoc/markup/to_rdoc.rb, line 235
def end_accepting
@res.join
end
Removes preceding \ from the suppressed crossref special
# File lib/rdoc/markup/to_rdoc.rb, line 242
def handle_special_SUPPRESSED_CROSSREF special
text = special.text
text = text.sub('\', '') unless in_tt?
text
end
Prepares the visitor for text generation
# File lib/rdoc/markup/to_rdoc.rb, line 251
def start_accepting
@res = [""]
@indent = 0
@prefix = nil
@list_index = []
@list_type = []
@list_width = []
end
Adds the stored prefix to the output and clears it. Lists generate a prefix for later consumption.
# File lib/rdoc/markup/to_rdoc.rb, line 265
def use_prefix
prefix, @prefix = @prefix, nil
@res << prefix if prefix
prefix
end
Wraps text
to width
# File lib/rdoc/markup/to_rdoc.rb, line 275
def wrap text
return unless text && !text.empty?
text_len = @width - @indent
text_len = 20 if text_len < 20
re = %r^(.{0,#{text_len}})[ \n]/
next_prefix = ' ' * @indent
prefix = @prefix || next_prefix
@prefix = nil
@res << prefix
while text.length > text_len
if text =~ re then
@res << $1
text.slice!(0, $&.length)
else
@res << text.slice!(0, text_len)
end
@res << "\n" << next_prefix
end
if text.empty? then
@res.pop
@res.pop
else
@res << text
@res << "\n"
end
end
/ | Search |
---|---|
? | Show this help |