Project

General

Profile

How can I define variable with redcarpet inherit Class in the bitnami redmine

Added by walkwolf reaper over 7 years ago

I used bitinami redmine 3.2.0 . And use markdown wiki which integration redcarpet v3.3.3 in.
I want a auto-number list,like this

1.   title xx ( leve 1)
2. title xx ( leve 1)
2.1 title xx ( leve 2)
2.2 title xx ( leve 2)
3 title xx ( leve 1)

by modify the `/home/redmine/redmine-3.2.0-0/apps/redmine/htdocs/lib/redmine/wiki_formatting/markdown`

When I refresh the Wiki in redmine. I got

1.   title xx ( leve 1)
2. title xx ( leve 1)
2.1 title xx ( leve 2)
2.2 title xx ( leve 2)
3 title xx ( leve 1)

#refresh

4. title xx ( leve 1)
5. title xx ( leve 1)
5.1 title xx ( leve 2)
5.2 title xx ( leve 2)
6 title xx ( leve 1)
#refresh

7. title xx ( leve 1)
8. title xx ( leve 1)
8.1 title xx ( leve 2)
8.2 title xx ( leve 2)
9 title xx ( leve 1)

and so on

Any help thanks.

`/home/redmine/redmine-3.2.0-0/apps/redmine/htdocs/lib/redmine/wiki_formatting/markdown`
    require 'cgi'

    module Redmine
        module WikiFormatting
        module Markdown
         class HTML < Redcarpet::Render::HTML
        include ActionView::Helpers::TagHelper

        # ---------My code begin---------

        def ms_header(header_level)
            if @ms_titles_hash==nil
                @ms_titles_hash = {1=>0,2=>0,3=>0,4=>0,5=>0,6=>0}
            end
            @ms_titles_hash[header_level]+=1
            @ms_titles_hash.each do |k,v| 
                if k > header_level
                    @ms_titles_hash[k]=0
                end
            end

            str="" 

            @ms_titles_hash.each do |k,v| 
                if k <= header_level
                    if k!=1
                        str<<"." 
                    end
                    str<<@ms_titles_hash[k].to_s
                end
            end

            return str
        end

        def header(text, header_level)
          return "<h#{header_level}>#{ms_header(header_level)}. #{text}</h#{header_level}>" 
          #return "<h3>#{text}</h3>" 
        end

        # --------My code end----------

        def link(link, title, content)
          css = nil
          unless link && link.starts_with?('/')
            css = 'external'
          end
          content_tag('a', content.to_s.html_safe, :href => link, :title => title, :class => css)
        end

        def block_code(code, language)
          if language.present?
            "<>>pre>" +
              Redmine::SyntaxHighlighting.highlight_by_language(code, language) +
              "<>>/code></>>pre>" 
          else
            "<>>pre>" + CGI.escapeHTML(code) + "</>>pre>" 
          end
        end
      end

      class Formatter

        def initialize(text)
          @text = text
        end

        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
          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(/(^(?:.+\r?\n\r?(?:\=+|\-+)|#+.+|~~~.*)\s*$)/).each do |part|
            level = nil
            if part =~ /\A~{3,}(\S+)?\s*$/
              if $1
                if !inside_pre
                  inside_pre = true
                end
              else
                inside_pre = !inside_pre
              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
          @@formatter ||= Redcarpet::Markdown.new(
            Redmine::WikiFormatting::Markdown::HTML.new(
              :filter_html => true,
              :hard_wrap => true
            ),
            :autolink => true,
            :fenced_code_blocks => true,
            :space_after_headers => true,
            :tables => true,
            :strikethrough => true,
            :superscript => true,
            :no_intra_emphasis => true,
            :footnotes => true,
            :highlight => true,
            :with_toc_data => true
          )
        end
      end
    end
      end
    end