module Banzai module Filter class BlockquoteFenceFilter < HTML::Pipeline::TextFilter REGEX = %r{ (? # Code blocks: # ``` # Anything, including `>>>` blocks which are ignored by this filter # ``` ^``` .+? \n```\ *$ ) | (? # HTML block: # # Anything, including `>>>` blocks which are ignored by this filter # ^<[^>]+?>\ *\n .+? \n<\/[^>]+?>\ *$ ) | (?: # Blockquote: # >>> # Anything, including code and HTML blocks # >>> ^>>>\ *\n (? (?: # Any character that doesn't introduce a code or HTML block (?! ^``` | ^<[^>]+?>\ *\n ) . | # A code block \g | # An HTML block \g )+? ) \n>>>\ *$ ) }mx.freeze def initialize(text, context = nil, result = nil) super text, context, result @text = @text.delete("\r") end def call @text.gsub(REGEX) do if $~[:quote] $~[:quote].gsub(/^/, "> ").gsub(/^> $/, ">") else $~[0] end end end end end end