diff --git a/app/lib/reverse_markdown/converters/custom_pre.rb b/app/lib/reverse_markdown/converters/custom_pre.rb new file mode 100644 index 000000000..bb48ae00f --- /dev/null +++ b/app/lib/reverse_markdown/converters/custom_pre.rb @@ -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 diff --git a/app/lib/reverse_markdown/converters/custom_text.rb b/app/lib/reverse_markdown/converters/custom_text.rb new file mode 100644 index 000000000..3c6f84841 --- /dev/null +++ b/app/lib/reverse_markdown/converters/custom_text.rb @@ -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/, " ") + 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 diff --git a/config/initializers/reverse_markdown.rb b/config/initializers/reverse_markdown.rb new file mode 100644 index 000000000..034cbc73f --- /dev/null +++ b/config/initializers/reverse_markdown.rb @@ -0,0 +1,2 @@ +ReverseMarkdown::Converters.register :pre, ReverseMarkdown::Converters::CustomPre.new +ReverseMarkdown::Converters.register :Text, ReverseMarkdown::Converters::CustomText.new