Class: Redmine::WikiFormatting::Markdown::Formatter

Inherits:
Object
  • Object
show all
Defined in:
lib/redmine/wiki_formatting/markdown/formatter.rb

Instance Method Summary collapse

Constructor Details

#initialize(text) ⇒ Formatter

Returns a new instance of Formatter

Since:

  • 2.5.0



55
56
57
# File 'lib/redmine/wiki_formatting/markdown/formatter.rb', line 55

def initialize(text)
  @text = text
end

Instance Method Details

#extract_sections(index) ⇒ Object

Since:

  • 2.5.0



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
117
118
119
120
121
122
123
124
125
126
# File 'lib/redmine/wiki_formatting/markdown/formatter.rb', line 91

def extract_sections(index)
  sections = ['', '', '']
  offset = 0
  i = 0
  l = 1
  inside_pre = false
  @text.split(/(^(?:.+\r?\n\r?(?:\=+|\-+)|#+.+|(?:~~~|```).*)\s*$)/).each do |part|
    level = nil
    if part =~ /\A(~{3,}|`{3,})(\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

#get_section(index) ⇒ Object

Since:

  • 2.5.0



76
77
78
79
80
# File 'lib/redmine/wiki_formatting/markdown/formatter.rb', line 76

def get_section(index)
  section = extract_sections(index)[1]
  hash = Digest::MD5.hexdigest(section)
  return section, hash
end

#to_html(*args) ⇒ Object

Since:

  • 2.5.0



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/redmine/wiki_formatting/markdown/formatter.rb', line 59

def to_html(*args)
  html = formatter.render(@text)
  # restore wiki links eg. [[Foo]]
  html.gsub!(%r{\[<a href="(.*?)">(.*?)</a>\]}) do
    "[[#{$2}]]"
  end
  # restore Redmine links with double-quotes, eg. version:"1.0"
  html.gsub!(/(\w):&quot;(.+?)&quot;/) do
    "#{$1}:\"#{$2}\""
  end
  # restore user links with @ in login name eg. [@jsmith@somenet.foo]
  html.gsub!(%r{[@\A]<a href="mailto:(.*?)">(.*?)</a>}) do
    "@#{$2}"
  end
  html
end

#update_section(index, update, hash = nil) ⇒ Object

Since:

  • 2.5.0



82
83
84
85
86
87
88
89
# File 'lib/redmine/wiki_formatting/markdown/formatter.rb', line 82

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