Monkey-patched ReverseMarkdown's :text & :pre (#353)

This commit is contained in:
Mac Siri 2018-05-25 14:03:59 -04:00 committed by Ben Halpern
parent f02e926bfc
commit 9cbc209d62
3 changed files with 100 additions and 0 deletions

View file

@ -0,0 +1,42 @@
module ReverseMarkdown
module Converters
class CustomPre < Base
def convert(node, state = {})
content = treat_children(node, state)
if ReverseMarkdown.config.github_flavored
"\n```#{language(node)}\n" << content << "\n```\n"
else
"\n\n " << content.lines.to_a.join(" ") << "\n\n"
end
end
private
def treat(node, state)
case node.name
when "code"
node.text
when "br"
"\n"
else
super
end
end
def language(node)
lang = language_from_highlight_class(node)
lang || language_from_confluence_class(node)
end
def language_from_highlight_class(node)
node.parent["class"].to_s[/highlight-([a-zA-Z0-9]+)/, 1]
end
def language_from_confluence_class(node)
node["class"].to_s[/brush:\s?(:?.*);/, 1]
end
end
register :pre, CustomPre.new
end
end

View file

@ -0,0 +1,56 @@
module ReverseMarkdown
module Converters
class CustomText < Base
def convert(node, _options = {})
if node.text.strip.empty?
treat_empty(node)
else
treat_text(node)
end
end
private
def treat_empty(node)
parent = node.parent.name.to_sym
if %i[ol ul].include?(parent) # Otherwise the identation is broken
""
elsif node.text == " " # Regular whitespace text node
" "
else
""
end
end
def treat_text(node)
text = node.text
text = preserve_nbsp(text)
text = remove_border_newlines(text)
text = remove_inner_newlines(text)
text = escape_keychars(text)
text = preserve_keychars_within_backticks(text)
text
end
def preserve_nbsp(text)
text.gsub(/\u00A0/, "&nbsp;")
end
def remove_border_newlines(text)
text.gsub(/\A\n+/, "").gsub(/\n+\z/, "")
end
def remove_inner_newlines(text)
text.tr("\n\t", "")
end
def preserve_keychars_within_backticks(text)
text.gsub(/`.*?`/) do |match|
match.gsub('\_', "_").gsub('\*', "*")
end
end
end
register :text, CustomText.new
end
end

View file

@ -0,0 +1,2 @@
ReverseMarkdown::Converters.register :pre, ReverseMarkdown::Converters::CustomPre.new
ReverseMarkdown::Converters.register :Text, ReverseMarkdown::Converters::CustomText.new