sanitizeというメソッドを使うと、ホワイトリストに載ったHTMLタグ以外を削除して出力できる。例えば以下のようなコード(haml)を書くと、
%p - dummy_text = '斜め' = raw(sanitize(dummy_text))
斜め
と出力される。
通常はこれで問題ないが、タグが閉じられないままだと、続けて出力されてしまう。
%p - dummy_texts = ['<i>斜め' '斜めったまま'] - dummy_texts.each do |dummy_text| %p = raw(sanitize(dummy_text))
↓こんな感じ。
斜め 斜めったまま
つまり、validではないHTMLをvalidにするにはどうすればいいかという問題。
この場合、nokogiriを使うと、validなHTMLに変換することができる。Gemfileにgem 'nokogiri'
を加えてから、以下のように書くとうまく変換される。
%p - dummy_texts = ['<i>斜め' '斜めってない'] - dummy_texts.each do |dummy_text| %p = raw(Nokogiri::HTML::fragment(sanitize(dummy_text)).to_xml)
斜め 斜めってない
Nokogiri::HTML::fragmentのto_xmlを使うと、完全な状態になってるxmlとして出力できるようだ。
参考:Sanitize HTML and close incomplete tags – stackoverflow