Class: Banzai::Filter::BlockquoteFenceFilter

Inherits:
TimeoutTextPipelineFilter show all
Defined in:
lib/banzai/filter/blockquote_fence_filter.rb

Constant Summary collapse

REGEX =
%r{
    #{::Gitlab::Regex.markdown_code_or_html_blocks}
  |
    (?=(?<=^\n|\A)\ *>>>\ *\n.*\n\ *>>>\ *(?=\n$|\z))(?:
      # Blockquote:
      # >>>
      # Anything, including code and HTML blocks
      # >>>

      (?<=^\n|\A)(?<indent>\ *)>>>\ *\n
      (?<blockquote>
        (?:
            # Any character that doesn't introduce a code or HTML block
            (?!
                ^```
              |
                ^<[^>]+?>\ *\n
            )
            .
          |
            # A code block
            \g<code>
          |
            # An HTML block
            \g<html>
        )+?
      )
      \n\ *>>>\ *(?=\n$|\z)
    )
}mx

Constants inherited from TimeoutTextPipelineFilter

TimeoutTextPipelineFilter::RENDER_TIMEOUT

Instance Method Summary collapse

Methods inherited from TimeoutTextPipelineFilter

#call

Constructor Details

#initialize(text, context = nil, result = nil) ⇒ BlockquoteFenceFilter

Returns a new instance of BlockquoteFenceFilter.



37
38
39
40
# File 'lib/banzai/filter/blockquote_fence_filter.rb', line 37

def initialize(text, context = nil, result = nil)
  super text, context, result
  @text = @text.delete("\r")
end

Instance Method Details

#call_with_timeoutObject



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/banzai/filter/blockquote_fence_filter.rb', line 42

def call_with_timeout
  @text.gsub(REGEX) do
    if $~[:blockquote]
      # keep the same number of source lines/positions by replacing the
      # fence lines with newlines
      indent = $~[:indent]
      "\n" + $~[:blockquote].gsub(/^#{Regexp.quote(indent)}/, "#{indent}> ").gsub(/^> $/, ">") + "\n"
    else
      $~[0]
    end
  end
end