1
0
mirror of https://github.com/meineerde/redmine.git synced 2026-01-31 19:47:14 +00:00

Move methods related to wiki section to a helper file and include it in all 3 formatters (#37119).

git-svn-id: https://svn.redmine.org/redmine/trunk@21643 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Marius Balteanu 2022-06-16 21:39:27 +00:00
parent fce5c34407
commit 1a7b2fe907
4 changed files with 68 additions and 70 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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