2017-02-14 8 views
0

私はカスタムRedcarpetレンダラー(Prawn PDF生成用)でレンダリングする必要があるデータベースに格納されたユーザー入力マークダウンテキストを持っています。 1行改行(すなわち、"\r\n")の場合、レンダラーは改行を正しく処理します。ただし、行に複数の改行が含まれている場合(つまり"\r\n\r\n")、マークダウンレンダラーはそれらを削除して無視します。複数行の改行を無視したRedcarpetのマークダウン

また、paragraphemphasisのメソッドがある間は、linebreakメソッドはカスタムレンダラーで呼び出されません。

例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_\r\nthat\r\nthis\r\n\r\nline\r\n\r\n\r\nbreaks' 
s_rn = s.gsub '\r\n', "\r\n" 
s_n = s.gsub '\r\n', "\n" 

puts "\n\n" 
puts 'raw string -----------------------' 
puts s 

puts 'gsub \r\n string -----------------' 
puts s_rn 

puts 'gsub \n string -------------------' 
puts s_n 

puts 'markdown \r\n string -------------' 
puts markdown_this(s_rn) 

puts 'markdown \n string ---------------' 
puts markdown_this(s_n) 

puts '----------------------------------' 
puts "\n\n" 

答えて

0

改行(1以上)の任意の数の値下げで、段落と考えられ、そのパーサはちょうど余分な改行を食べると、それはレンダラとは何の関係もありません。

HTMLレンダラーから継承して、その動作をよりよく理解することができます。

class TestRenderer < Redcarpet::Render::HTML 

はまた、複数の改行を追加する方法についての情報を持っているthis answer(多分あなただけの値下げをレンダリングする前に"\r\n&nbsp;""\r\n"を交換して逃げることができます)

+0

おかげで@glebtv参照してください - あなたは私の精神を介して取得助けました「100個の空白文字は1つとして扱われます」とブロックします。ブラウザと同じようにPDF表示を行う必要があることを考えると、 '.gsub(" \ r \ n "、 '
').gsub(" \ r \ n "、 '')'(注2最初の検索文字列の先頭の空白)をレンダリング前の文字列に追加します。超エレガントではないようですが、すべてのテストで同じ内容を表示しています。 – roy

関連する問題