lib/maruku/output/to_markdown.rb
module MaRuKu::Out::Markdown
DefaultLineLength = 40
def to_md(context={})
children_to_md(context)
end
# " andrea censi " => [" andrea ", "censi "]
def mysplit(c)
res = c.split.map {|x| x + " " }
if c[0] == ' ' && res[0]
res[0] = " " + res[0]
end
res
end
def to_md_header(context)
pounds = "#" * @level
"#{pounds} #{children_to_md(context)} #{pounds}\n\n"
end
def to_md_inline_code(context)
"`#{@raw_code}`"
end
def to_md_code(context)
@raw_code.split("\n").collect { |line| " " + line}.join("\n") + "\n\n"
end
def to_md_quote(context)
line_length = (context[:line_length] || DefaultLineLength) - 2
wrap(@children, line_length, context).split(/\n/).collect { |line| "> " + line}.join("\n") + "\n"
end
def to_md_hrule(context)
"* * *\n"
end
def to_md_emphasis(context)
"*#{children_to_md(context)}*"
end
def to_md_strong(context)
"**#{children_to_md(context)}**"
end
def to_md_immediate_link(context)
"<#{@url}>"
end
def to_md_email_address(context)
"<#{@email}>"
end
def to_md_entity(context)
"&#{@entity_name};"
end
def to_md_linebreak(context)
"\n"
end
def to_md_paragraph(context)
line_length = context[:line_length] || DefaultLineLength
wrap(@children, line_length, context)+"\n"
end
def to_md_im_link(context)
"[#{children_to_md(context)}](#{@url}#{" \"#{@title}\"" if @title})"
end
def to_md_link(context)
"[#{children_to_md(context)}][#{@ref_id}]"
end
def to_md_im_image(context)
""
end
def to_md_image(context)
"![#{children_to_md(context)}][#{@ref_id}]"
end
def to_md_ref_definition(context)
"[#{@ref_id}] #{@url}#{" \"#{@title}\"" if @title}"
end
def to_md_abbr_def(context)
"*[#{self.abbr}]: #{self.text}\n"
end
def to_md_ol(context)
len = (context[:line_length] || DefaultLineLength) - 2
md = ""
self.children.each_with_index do |li, i|
# s = (w=wrap(li.children, len-2, context)).rstrip.gsub(/^/, ' ')+"\n"
# s[0,4] = "#{i+1}. "[0,4]
# puts w.inspect
s = "#{i+1}. " + wrap(li.children, len-2, context).rstrip + "\n"
md += s
end
md + "\n"
end
def to_md_ul(context)
len = (context[:line_length] || DefaultLineLength) - 2
md = ""
self.children.each_with_index do |li, i|
w = wrap(li.children, len-2, context)
s = "- " + w
# puts "W: "+ w.inspect
# s = add_indent(w)
# puts "S: " +s.inspect
# s[0,1] = "-"
md += s
end
md + "\n"
end
def add_indent(s,char=" ")
t = s.split("\n").map{|x| char+x }.join("\n")
s << ?\n if t[-1] == ?\n
s
end
# Convert each child to html
def children_to_md(context)
array_to_md(@children, context)
end
def wrap(array, line_length, context)
out = ""
line = ""
array.each do |c|
if c.kind_of?(MaRuKu::MDElement) && c.node_type == :linebreak
out << line.strip << " \n"; line="";
next
end
pieces =
if c.kind_of? String
mysplit(c)
elsif c.kind_of?(MaRuKu::MDElement)
method = "to_md_#{c.node_type}"
method = "to_md" unless c.respond_to?(method)
[c.send(method, context)].flatten
else
[c.to_md(context)].flatten
end
# puts "Pieces: #{pieces.inspect}"
pieces.each do |p|
if p.size + line.size > line_length
out << line.strip << "\n";
line = ""
end
line << p
end
end
out << line.strip << "\n" if line.size > 0
out << ?\n if not out[-1] == ?\n
out
end
def array_to_md(array, context, join_char='')
e = []
array.each do |c|
if c.is_a?(String)
e << c
else
method = c.kind_of?(MaRuKu::MDElement) ?
"to_md_#{c.node_type}" : "to_md"
if not c.respond_to?(method)
#raise "Object does not answer to #{method}: #{c.class} #{c.inspect[0,100]}"
# tell_user "Using default for #{c.node_type}"
method = 'to_md'
end
# puts "#{c.inspect} created with method #{method}"
h = c.send(method, context)
if h.nil?
raise "Nil md for #{c.inspect} created with method #{method}"
end
if h.kind_of?Array
e = e + h
else
e << h
end
end
end
e.join(join_char)
end
end
module MaRuKu
class MDDocument
alias old_md to_md
def to_md(context={})
warn "Maruku#to_md is deprecated and will be removed in a near-future version of Maruku."
old_md(context)
end
end
end