From 27ae73a55823885be55a544464c39784161319b5 Mon Sep 17 00:00:00 2001 From: "marius.balteanu" Date: Tue, 17 May 2022 23:50:47 +0200 Subject: [PATCH 1/2] Move methods related to section to a helper file and include it in all 3 formatters. --- .../wiki_formatting/common_mark/formatter.rb | 8 ++- .../wiki_formatting/markdown/formatter.rb | 54 +---------------- lib/redmine/wiki_formatting/section_helper.rb | 59 +++++++++++++++++++ .../wiki_formatting/textile/formatter.rb | 17 +----- 4 files changed, 68 insertions(+), 70 deletions(-) create mode 100644 lib/redmine/wiki_formatting/section_helper.rb diff --git a/lib/redmine/wiki_formatting/common_mark/formatter.rb b/lib/redmine/wiki_formatting/common_mark/formatter.rb index bffad6c92..26257aaa0 100644 --- a/lib/redmine/wiki_formatting/common_mark/formatter.rb +++ b/lib/redmine/wiki_formatting/common_mark/formatter.rb @@ -61,7 +61,13 @@ module Redmine TaskList::Filter ], PIPELINE_CONFIG - class Formatter < Redmine::WikiFormatting::Markdown::Formatter + class Formatter + include Redmine::WikiFormatting::SectionHelper + + def initialize(text) + @text = text + end + def to_html(*args) result = MarkdownPipeline.call @text result[:output].to_s diff --git a/lib/redmine/wiki_formatting/markdown/formatter.rb b/lib/redmine/wiki_formatting/markdown/formatter.rb index eb49e02db..177c5623c 100644 --- a/lib/redmine/wiki_formatting/markdown/formatter.rb +++ b/lib/redmine/wiki_formatting/markdown/formatter.rb @@ -57,6 +57,7 @@ module Redmine class Formatter include Redmine::WikiFormatting::LinksHelper + include Redmine::WikiFormatting::SectionHelper alias :inline_restore_redmine_links :restore_redmine_links def initialize(text) @@ -69,59 +70,6 @@ module Redmine html end - def get_section(index) - section = extract_sections(index)[1] - hash = Digest::MD5.hexdigest(section) - return section, hash - end - - def update_section(index, update, hash=nil) - t = extract_sections(index) - if hash.present? && hash != Digest::MD5.hexdigest(t[1]) - raise Redmine::WikiFormatting::StaleSectionError - end - - t[1] = update unless t[1].blank? - t.reject(&:blank?).join "\n\n" - end - - def extract_sections(index) - sections = [+'', +'', +''] - offset = 0 - i = 0 - l = 1 - inside_pre = false - @text.split(/(^(?:\S+\r?\n\r?(?:\=+|\-+)|#+.+|(?:~~~|```).*)\s*$)/).each do |part| - level = nil - if part =~ /\A(~{3,}|`{3,})(\s*\S+)?\s*$/ - if !inside_pre - inside_pre = true - elsif !$2 - inside_pre = false - end - elsif inside_pre - # nop - elsif part =~ /\A(#+).+/ - level = $1.size - elsif part =~ /\A.+\r?\n\r?(\=+|\-+)\s*$/ - level = $1.include?('=') ? 1 : 2 - end - if level - i += 1 - if offset == 0 && i == index - # entering the requested section - offset = 1 - l = level - elsif offset == 1 && i > index && level <= l - # leaving the requested section - offset = 2 - end - end - sections[offset] << part - end - sections.map(&:strip) - end - private def formatter diff --git a/lib/redmine/wiki_formatting/section_helper.rb b/lib/redmine/wiki_formatting/section_helper.rb new file mode 100644 index 000000000..a697e3faf --- /dev/null +++ b/lib/redmine/wiki_formatting/section_helper.rb @@ -0,0 +1,59 @@ +module Redmine + module WikiFormatting + module SectionHelper + + def get_section(index) + section = extract_sections(index)[1] + hash = Digest::MD5.hexdigest(section) + return section, hash + end + + def update_section(index, update, hash=nil) + t = extract_sections(index) + if hash.present? && hash != Digest::MD5.hexdigest(t[1]) + raise Redmine::WikiFormatting::StaleSectionError + end + + t[1] = update unless t[1].blank? + t.reject(&:blank?).join "\n\n" + end + + def extract_sections(index) + sections = [+'', +'', +''] + offset = 0 + i = 0 + l = 1 + inside_pre = false + @text.split(/(^(?:\S+\r?\n\r?(?:\=+|\-+)|#+.+|(?:~~~|```).*)\s*$)/).each do |part| + level = nil + if part =~ /\A(~{3,}|`{3,})(\s*\S+)?\s*$/ + if !inside_pre + inside_pre = true + elsif !$2 + inside_pre = false + end + elsif inside_pre + # nop + elsif part =~ /\A(#+).+/ + level = $1.size + elsif part =~ /\A.+\r?\n\r?(\=+|\-+)\s*$/ + level = $1.include?('=') ? 1 : 2 + end + if level + i += 1 + if offset == 0 && i == index + # entering the requested section + offset = 1 + l = level + elsif offset == 1 && i > index && level <= l + # leaving the requested section + offset = 2 + end + end + sections[offset] << part + end + sections.map(&:strip) + end + end + end +end \ No newline at end of file diff --git a/lib/redmine/wiki_formatting/textile/formatter.rb b/lib/redmine/wiki_formatting/textile/formatter.rb index 61cf0385d..fd7d0b2ec 100644 --- a/lib/redmine/wiki_formatting/textile/formatter.rb +++ b/lib/redmine/wiki_formatting/textile/formatter.rb @@ -25,6 +25,7 @@ module Redmine class Formatter < RedCloth3 include ActionView::Helpers::TagHelper include Redmine::WikiFormatting::LinksHelper + include Redmine::WikiFormatting::SectionHelper alias :inline_auto_link :auto_link! alias :inline_auto_mailto :auto_mailto! @@ -45,22 +46,6 @@ module Redmine super(*RULES).to_s end - def get_section(index) - section = extract_sections(index)[1] - hash = Digest::MD5.hexdigest(section) - return section, hash - end - - def update_section(index, update, hash=nil) - t = extract_sections(index) - if hash.present? && hash != Digest::MD5.hexdigest(t[1]) - raise Redmine::WikiFormatting::StaleSectionError - end - - t[1] = update unless t[1].blank? - t.reject(&:blank?).join "\n\n" - end - def extract_sections(index) @pre_list = [] text = self.dup -- 2.35.1