class RDoc::Markup::ToMarkdown

Outputs parsed markup as Markdown

Public Class Methods

Creates a new formatter that will output Markdown format text

Calls superclass method RDoc::Markup::ToRdoc::new
# File lib/rdoc/markup/to_markdown.rb, line 12
def initialize(markup = nil)
  super

  @headings[1] = ['# ',      '']
  @headings[2] = ['## ',     '']
  @headings[3] = ['### ',    '']
  @headings[4] = ['#### ',   '']
  @headings[5] = ['##### ',  '']
  @headings[6] = ['###### ', '']

  add_regexp_handling_RDOCLINK

  @hard_break = "  \n"
end

Public Instance Methods

Finishes consumption of list

Calls superclass method RDoc::Markup::ToRdoc#accept_list_end
# File lib/rdoc/markup/to_markdown.rb, line 30
def accept_list_end(list)
  super
end

Finishes consumption of list_item

# File lib/rdoc/markup/to_markdown.rb, line 37
def accept_list_item_end(list_item)
  width = case @list_type.last
          when :BULLET then
            4
          when :NOTE, :LABEL then
            use_prefix

            @res << "\n"

            4
          else
            @list_index[-1] = @list_index.last.succ
            4
          end

  @indent -= width
end

Prepares the visitor for consuming list_item

# File lib/rdoc/markup/to_markdown.rb, line 58
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 += 4
    @prefix << bullets << ":" << (' ' * (@indent - 1))
  else
    bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
    @prefix = (' ' * @indent) + bullet.ljust(4)

    @indent += 4
  end
end

Prepares the visitor for consuming list

# File lib/rdoc/markup/to_markdown.rb, line 142
def accept_list_start(list)
  case list.type
  when :BULLET, :LABEL, :NOTE then
    @list_index << nil
  when :LALPHA, :NUMBER, :UALPHA then
    @list_index << 1
  else
    raise RDoc::Error, "invalid list type #{list.type}"
  end

  @list_width << 4
  @list_type << list.type
end

Adds rule to the output

# File lib/rdoc/markup/to_markdown.rb, line 159
def accept_rule(rule)
  use_prefix or @res << ' ' * @indent
  @res << '-' * 3
  @res << "\n"
end

Outputs verbatim indented 4 columns

# File lib/rdoc/markup/to_markdown.rb, line 168
def accept_verbatim(verbatim)
  indent = ' ' * (@indent + 4)

  verbatim.parts.each do |part|
    @res << indent unless part == "\n"
    @res << part
  end

  @res << "\n"
end
# File lib/rdoc/markup/to_markdown.rb, line 80
def add_tag(tag, simple_tag, content)
  if content.match?(/\A[\w\s]+\z/)
    emit_inline("#{simple_tag}#{content}#{simple_tag}")
  else
    emit_inline("<#{tag}>#{content}</#{tag}>")
  end
end

Creates a Markdown-style URL from url with text.

# File lib/rdoc/markup/to_markdown.rb, line 182
def gen_url(url, text)
  scheme, url, = parse_url url

  "[#{text.sub(%r{^#{scheme}:/*}i, '')}](#{url})"
end
# File lib/rdoc/markup/to_markdown.rb, line 111
def handle_BOLD(nodes)
  handle_tag(nodes, '**', 'strong')
end
# File lib/rdoc/markup/to_markdown.rb, line 119
def handle_BOLD_WORD(word)
  add_tag('strong', '**', convert_string(word))
end
# File lib/rdoc/markup/to_markdown.rb, line 115
def handle_EM(nodes)
  handle_tag(nodes, '*', 'em')
end
# File lib/rdoc/markup/to_markdown.rb, line 123
def handle_EM_WORD(word)
  add_tag('em', '*', convert_string(word))
end
# File lib/rdoc/markup/to_markdown.rb, line 135
def handle_HARD_BREAK
  emit_inline("  \n")
end
# File lib/rdoc/markup/to_markdown.rb, line 131
def handle_STRIKE(nodes)
  handle_tag(nodes, '~~', 's')
end
# File lib/rdoc/markup/to_markdown.rb, line 127
def handle_TT(text)
  add_tag('code', '`', convert_string(text))
end
# File lib/rdoc/markup/to_markdown.rb, line 88
def handle_tag(nodes, simple_tag, tag)
  if nodes.size == 1 && String === nodes[0]
    content = apply_regexp_handling(nodes[0]).map do |text, converted|
      converted ? text : convert_string(text)
    end.join
    add_tag(tag, simple_tag, content)
  else
    emit_inline("<#{tag}>")
    traverse_inline_nodes(nodes)
    emit_inline("</#{tag}>")
  end
end