1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
require 'stringio'
module Orgmode
class MarkdownOutputBuffer < OutputBuffer
def initialize(output, opts = {})
super(output)
@options = opts
@logger.debug "Markdown export options: #{@options.inspect}"
@custom_blocktags = {} if @options[:markup_file]
if @options[:markup_file]
do_custom_markup
end
end
def push_mode(mode, indent)
super(mode, indent)
end
def pop_mode(mode = nil)
m = super(mode)
@list_indent_stack.pop
m
end
# Maps org markup to markdown markup.
MarkdownMap = {
"*" => "**",
"/" => "*",
"_" => "*",
"=" => "`",
"~" => "`",
"+" => "~~"
}
# Handles inline formatting for markdown.
def inline_formatting(input)
@re_help.rewrite_emphasis input do |marker, body|
m = MarkdownMap[marker]
"#{m}#{body}#{m}"
end
@re_help.rewrite_subp input do |type, text|
if type == "_" then
"<sub>#{text}</sub>"
elsif type == "^" then
"<sup>#{text}</sup>"
end
end
@re_help.rewrite_links input do |link, defi|
# We don't add a description for images in links, because its
# empty value forces the image to be inlined.
defi ||= link unless link =~ @re_help.org_image_file_regexp
link = link.gsub(/ /, "%%20")
if defi =~ @re_help.org_image_file_regexp
""
elsif defi
"[#{defi}](#{link})"
else
"[#{link}](#{link})"
end
end
# Just reuse Textile special symbols for now?
Orgmode.special_symbols_to_textile(input)
input = @re_help.restore_code_snippets input
input
end
# TODO: Implement this
def output_footnotes!
return false
end
# Flushes the current buffer
def flush!
return false if @buffer.empty? and @output_type != :blank
@logger.debug "FLUSH ==========> #{@output_type}"
@buffer.gsub!(/\A\n*/, "")
case
when mode_is_code?(current_mode)
@output << "```#{@block_lang}\n"
@output << @buffer << "\n"
@output << "```\n"
when preserve_whitespace?
@output << @buffer << "\n"
when @output_type == :blank
@output << "\n"
else
case current_mode
when :paragraph
@output << "> " if @mode_stack[0] == :quote
when :list_item
@output << " " * @mode_stack.count(:list_item) << "* "
when :horizontal_rule
@output << "---"
end
@output << inline_formatting(@buffer) << "\n"
end
@buffer = ""
end
def add_line_attributes headline
@output << "#" * headline.level
@output << " "
end
end # class MarkdownOutputBuffer
end # module Orgmode
|