Визуализация строки на уровне диапазона с помощью Kramdown

Я знаю, что могу разобрать и отобразить HTML-документ с помощью Kramdown в ruby, используя что-то вроде

require 'kramdown'

s = 'This is a _document_'
Kramdown::Document.new(s).to_html
# '<p>This is a <i>document</i></p>'

В этом случае строка s может содержать полный документ в синтаксисе уценки.

Однако я хочу проанализировать s, предполагая, что он содержит только синтаксис уценки на уровне диапазона, и получить обработанный html. В частности, в отображаемом html не должно быть <p>, <blockquote> или, например, <table>.

s = 'This is **only** a span-level string'
# .. ??? ...
# 'This is <b>only</b> a span-level string'

Как я могу это сделать?


person Juan A. Navarro    schedule 05.08.2014    source источник
comment
Итак, вы хотите удалить все элементы блочного уровня? Это поведение kramdown по умолчанию. См. kramdown.gettalong.org/options.html.   -  person Mark Thomas    schedule 05.08.2014
comment
Я тоже это читал, но вывод по-прежнему содержит p. Не понял, как заставить kramdown удалить их.   -  person Juan A. Navarro    schedule 05.08.2014
comment
Похоже, что этот параметр предназначен для анализа необработанного HTML; это не влияет на вывод. Вывод не подлежит изменению, поскольку они стремятся соответствовать другим реализациям Markdown. Вероятно, вам придется выполнить постобработку.   -  person Mark Thomas    schedule 05.08.2014
comment
вы можете легко постобработать с помощью nokogiri.   -  person Mike H-R    schedule 05.08.2014
comment
Sanitize использует Nokogiri под капотом, это еще проще.   -  person Mark Thomas    schedule 05.08.2014


Ответы (2)


Я бы обработал вывод с помощью драгоценного камня sanitize.

require 'sanitize'

html = Kramdown::Document.new(s).to_html
output = Sanitize.fragment(html, elements:['b','i','em'])

Элементы представляют собой белый список разрешенных тегов, просто добавьте все теги, которые хотите. У драгоценного камня есть набор предопределенных белых списков, но ни один из них не соответствует тому, что вы ищете. (Кстати, если вам нужен список всех элементов HTML5, разрешенных в диапазоне, см. список "фразового содержания" WHATWG).

Я знаю, что это не было помечено rails, но для преимущество для читателей, использующих Rails: используйте встроенный помощник по очистке.

person Mark Thomas    schedule 05.08.2014
comment
Я бы предпочел не добавлять дополнительную разметку, чем удалить ее. Но если нет другого простого решения, я мог бы просто сделать это. - person Juan A. Navarro; 06.08.2014
comment
В целях безопасности белые списки предпочтительнее черных списков. Это особенно важно, если содержимое создается конечным пользователем, а приложение создает общедоступные страницы. - person Mark Thomas; 06.08.2014
comment
Конечно, я всегда об этом помню. Но в моем случае контент создается мной, а не конечным пользователем. Санитария (в некоторой степени) делает то, что я хочу, как побочный эффект, но моей конечной целью здесь не является санитария. - person Juan A. Navarro; 06.08.2014

Вы можете создать собственный синтаксический анализатор и очистить его внутренний список синтаксических анализаторов блочного уровня.

class Kramdown::Parser::SpanKramdown < Kramdown::Parser::Kramdown
  def initialize(source, options)
    super
    @block_parsers = []
  end
end

Затем вы можете использовать его следующим образом:

text = Kramdown::Document.new(text, :input => 'SpanKramdown').to_html

Это должно делать то, что вы хотите "правильно".

person rr-    schedule 26.05.2015