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