我有用户输入的markdown文本存储在数据库中,我需要使用自定义红地毯渲染器进行渲染(用于生成Prawn PDF)。对于单行中断(即"rn"
),渲染器会正确处理中断。但是,当文本在一行中包含多个换行符(即"rnrn"
)时,markdown渲染器会删除并忽略它们。
此外,linebreak
方法在我的自定义渲染器中从未被调用,而paragraph
和emphasis
方法是。
示例ruby脚本:
require 'redcarpet'
class TestRenderer < Redcarpet::Render::Base
def paragraph(text)
text
end
def emphasis(text)
'<foo>' + text + '</foo>'
end
def linebreak
'<should this be called?>'
end
end
def markdown_this(content)
markdown = Redcarpet::Markdown.new(TestRenderer)
markdown.render(content.to_s)
end
s = '_testing_rnthatrnthisrnrnlinernrnrnbreaks'
s_rn = s.gsub 'rn', "rn"
s_n = s.gsub 'rn', "n"
puts "nn"
puts 'raw string -----------------------'
puts s
puts 'gsub rn string -----------------'
puts s_rn
puts 'gsub n string -------------------'
puts s_n
puts 'markdown rn string -------------'
puts markdown_this(s_rn)
puts 'markdown n string ---------------'
puts markdown_this(s_n)
puts '----------------------------------'
puts "nn"
在markdown中,任何数量的换行符(多于一个)都被视为一个段落,因此解析器只会吃掉多余的换行符,与渲染器无关。
您可以从HTML呈现器继承以更好地了解它的工作方式。
class TestRenderer < Redcarpet::Render::HTML
另请参阅此答案,其中包含有关如何添加多个换行符的信息(也许您可以在渲染markdown之前将"rn"
替换为"rn "
)