Ruby gem для быстрой проверки частичных фрагментов HTML?

#html #ruby-on-rails #ruby

#HTML #ruby-on-rails #ruby

Вопрос:

Я создаю настраиваемую квази-CMS в Rails, и мы хотели бы иметь одно поле, которое можно редактировать как фрагмент HTML в коде (интерфейс администратора будет использовать CodeMirror во внешнем интерфейсе). Когда он будет представлен конечному пользователю, он будет просто html_safe разделен и вставлен в div. Мы верим, что наши редакторы контента не являются вредоносными, но было бы полезно убедиться, что они создают правильный HTML, чтобы не нарушать работу страницы, тем более что они относительно новички в программировании!

В качестве первой попытки я использую Hash.from_xml и сохраняю исключения в качестве пользовательского средства проверки. Но есть ли лучший и / или более оптимизированный способ (т. Е. gem) проверить, является ли он допустимым HTML?

Спасибо!

Ответ №1:

Вы можете использовать библиотеку Nokogirigem) для создания средства проверки в вашей модели. Использование Nokogiri для фрагментов не идеально (поэтому вы можете добавить возможность переопределения средства проверки), но оно выявит много очевидных ошибок, которые могут привести к повреждению страницы.

Пример (при условии, что вызывается ваш атрибут / поле модели content ):

 validate :invalid_html?

def invalid_html?
  doc = Nokogiri::HTML(self.content) do |config|
    config.strict
  end
  if doc.errors.any?
    errors.add(:base, "Custom Error Message")
  end
end
  

Комментарии:

1. что такое :base ? Как действительно добавить сообщения об ошибках с фактическим сообщением об ошибке, которое предоставляет nokogiri?

2. :base указывает на ошибку для всей модели. Вы также можете пометить ошибку в определенном поле. Если поле является содержимым, следующее могло бы быть лучше errors.add(:content, "Custom Error Message") .

3. Если вы хотите добавить ошибки Nokogiri, вы можете обработать doc.errors и добавить их любым способом, который вы считаете полезным. Чтобы добавить каждую ошибку в модель, которую вы могли бы сделать doc.errors.each { |nokogiri_error| errors.add(:content, nokogiri_error) } . Я не уверен, как выглядят ошибки Nokogiri и было бы ли это хорошей идеей.

Ответ №2:

Вместо проверки, возможно, стоит использовать Nokogiri, который способен исправлять разметку:

 require 'nokogiri'
html = '<div><b>Whoa</i>'
Nokogiri::HTML::DocumentFragment.parse(html).to_html
#=> "<div><b>Whoa</b></div>"
  

Комментарии:

1. Это кажется идеальным для того, что мы ищем — не знали, что Nokogiri может обрабатывать фрагменты! Кроме того, думая об исправлении разметки, я обнаружил github.com/rgrove/sanitize который построен на этой функциональности Nokogiri и позволяет более детально контролировать, какая разметка разрешена. Спасибо!

2. Существует более короткий синтаксис: Nokogiri::HTML.fragment(html).to_html

Ответ №3:

Вы, вероятно, хотите https://github.com/libc/tidy_ffi или http://apidock.com/rails/v4.0.2/HTML/WhiteListSanitizer (метод класса sanitize )

Ответ №4:

Я думаю, это может быть то, что вы ищете?: be_valid_asset .

Комментарии:

1. Кажется, это вызывает внешнюю службу , и я бы предпочел полагаться на что-то внутреннее, но это хорошее начало!