2017-02-14 5 views
0

У меня есть введенный пользователем текст разметки, хранящийся в базе данных, который мне нужно визуализировать с помощью специального рендеринга Redcarpet (для создания PDF-файла Prawn). Для разрывов одной строки (т. Е. "\r\n") рендеринг правильно обрабатывает перерыв. Однако, когда текст содержит несколько разрывов строк в строке (то есть "\r\n\r\n"), средство рендеринга уценки удаляет и игнорирует их.Уценка Redcarpet игнорирует множественные разрывы строк

Кроме того, метод linebreak никогда не вызывается в моем настраиваемом рендерере, в то время как методыи emphasis.

Пример рубин сценарий:

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

Любое количество разрывов строк (более чем один) считаются абзацем уценки, поэтому парсер просто съедает лишние разрывы строк, и это не имеет ничего общего с визуализатором.

Вы можете наследовать от средства визуализации HTML, чтобы лучше понять, как это работает.

class TestRenderer < Redcarpet::Render::HTML 

Также см this answer, который имеет информацию о том, как добавить несколько разрывов строк (может быть, вы можете уйти только с заменой "\r\n" с "\r\n&nbsp;" перед визуализацией уценки)

+0

Благодарности @glebtv - Вы помогли мне пройти через мое психическое блокировать, что «100 символов пробела рассматриваются как один». Учитывая, что моя потребность была специфической для того, чтобы сделать отображение в формате PDF таким же, как в браузере, я запускал '.gsub (" \ r \ n ", '
') .gsub (" \ r \ n ", '')' (примечание 2 пробелы в начале первой строки поиска) в строке перед рендерингом. Это не кажется очень элегантным, но они показывают один и тот же контент во всех моих тестах. – roy