class RDoc::Markup::ToRdoc

Outputs RDoc markup as RDoc markup! (mostly)

Attributes

indent[RW]

Current indent amount for output in characters

list_index[R]

Stack of current list indexes for alphabetic and numeric lists

list_type[R]

Stack of list types

list_width[R]

Stack of list widths for indentation

prefix[R]

Prefix for the next list item. See use_prefix

res[R]

Output accumulator

width[RW]

Output width in characters

Public Class Methods

new(markup = nil) click to toggle source

Creates a new formatter that will output (mostly) RDoc markup

Calls superclass method RDoc::Markup::Formatter.new
# File lib/rdoc/markup/to_rdoc.rb, line 44
def initialize markup = nil
 super nil, markup
 @markup.add_special(/\\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

Public Instance Methods

accept_blank_line(blank_line) click to toggle source

Adds blank_line to the output

# File lib/rdoc/markup/to_rdoc.rb, line 76
def accept_blank_line blank_line
 @res << "\n"
end
accept_block_quote(block_quote) click to toggle source

Adds paragraph to the output

# File lib/rdoc/markup/to_rdoc.rb, line 83
def accept_block_quote block_quote
 @indent += 2
 block_quote.parts.each do |part|
 @prefix = '> '
 part.accept self
 end
 @indent -= 2
end
accept_heading(heading) click to toggle source

Adds heading to the output

# File lib/rdoc/markup/to_rdoc.rb, line 98
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
accept_indented_paragraph(paragraph) click to toggle source

Adds paragraph to the output

# File lib/rdoc/markup/to_rdoc.rb, line 202
def accept_indented_paragraph paragraph
 @indent += paragraph.indent
 text = paragraph.text @hard_break
 wrap attributes text
 @indent -= paragraph.indent
end
accept_list_end(list) click to toggle source

Finishes consumption of list

# File lib/rdoc/markup/to_rdoc.rb, line 109
def accept_list_end list
 @list_index.pop
 @list_type.pop
 @list_width.pop
end
accept_list_item_end(list_item) click to toggle source

Finishes consumption of list_item

# File lib/rdoc/markup/to_rdoc.rb, line 118
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
accept_list_item_start(list_item) click to toggle source

Prepares the visitor for consuming list_item

# File lib/rdoc/markup/to_rdoc.rb, line 142
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
accept_list_start(list) click to toggle source

Prepares the visitor for consuming list

# File lib/rdoc/markup/to_rdoc.rb, line 167
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
accept_paragraph(paragraph) click to toggle source

Adds paragraph to the output

# File lib/rdoc/markup/to_rdoc.rb, line 194
def accept_paragraph paragraph
 text = paragraph.text @hard_break
 wrap attributes text
end
accept_raw(raw) click to toggle source

Adds raw to the output

# File lib/rdoc/markup/to_rdoc.rb, line 212
def accept_raw raw
 @res << raw.parts.join("\n")
end
accept_rule(rule) click to toggle source

Adds rule to the output

# File lib/rdoc/markup/to_rdoc.rb, line 219
def accept_rule rule
 use_prefix or @res << ' ' * @indent
 @res << '-' * (@width - @indent)
 @res << "\n"
end
accept_verbatim(verbatim) click to toggle source

Outputs verbatim indented 2 columns

# File lib/rdoc/markup/to_rdoc.rb, line 228
def accept_verbatim verbatim
 indent = ' ' * (@indent + 2)
 verbatim.parts.each do |part|
 @res << indent unless part == "\n"
 @res << part
 end
 @res << "\n" unless @res =~ /\n\z/
end
attributes(text) click to toggle source

Applies attribute-specific markup to text using RDoc::AttributeManager

# File lib/rdoc/markup/to_rdoc.rb, line 242
def attributes text
 flow = @am.flow text.dup
 convert_flow flow
end
end_accepting() click to toggle source

Returns the generated output

# File lib/rdoc/markup/to_rdoc.rb, line 250
def end_accepting
 @res.join
end
handle_special_HARD_BREAK(special) click to toggle source

Adds a newline to the output

# File lib/rdoc/markup/to_rdoc.rb, line 266
def handle_special_HARD_BREAK special
 "\n"
end
handle_special_SUPPRESSED_CROSSREF(special) click to toggle source

Removes preceding \ from the suppressed crossref special

# File lib/rdoc/markup/to_rdoc.rb, line 257
def handle_special_SUPPRESSED_CROSSREF special
 text = special.text
 text = text.sub('\', '') unless in_tt?
 text
end
init_tags() click to toggle source

Maps attributes to HTML sequences

# File lib/rdoc/markup/to_rdoc.rb, line 67
def init_tags
 add_tag :BOLD, "<b>", "</b>"
 add_tag :TT, "<tt>", "</tt>"
 add_tag :EM, "<em>", "</em>"
end
start_accepting() click to toggle source

Prepares the visitor for text generation

# File lib/rdoc/markup/to_rdoc.rb, line 273
def start_accepting
 @res = [""]
 @indent = 0
 @prefix = nil
 @list_index = []
 @list_type = []
 @list_width = []
end
use_prefix() click to toggle source

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 287
def use_prefix
 prefix, @prefix = @prefix, nil
 @res << prefix if prefix
 prefix
end
wrap(text) click to toggle source

Wraps text to width

# File lib/rdoc/markup/to_rdoc.rb, line 297
def wrap text
 return unless text && !text.empty?
 text_len = @width - @indent
 text_len = 20 if text_len < 20
 re = /^(.{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