Nwht0xn1

Railsで文字列からHTMLのタグを比較的簡単に取り払うCreated on 2016-05-03 by r7kamura

この記事は何?

viewで strip_tags(html) を使えば文字列からHTMLタグを取り除けるという話。

経緯

WikiHubでは記事とページがMarkdownで記述されるので、ページ内容を表すメタ要素には、Markdownの原文の先頭140文字までを利用することにしていた。しかし、こんな調子でやっていると例えばTwitterカードでMarkdownの記号が出てきたりして不格好になる…。

image

strip_tags

そこで strip_tags、正確には ActionView::Helpers::SanitizeHelper#strip_tags を使ってみることに。実装を読むと、Rails5でこの機能消すかもってコメントと、内部的には Rails::Html::Sanitizer を利用していることが分かる。これは rails/rails-html-sanitizer に実装が切り離されている。これの実装を読むと、内部的には flavorjones/loofah: HTML/XML manipulation and sanitization based on Nokogiri を使っていることが分かる。結局、一度Nokogiriを使ってツリー構造にして適当にタグを取り除いているっぽい。

キャッシュした方が良さそう

ページを描画するたびにこの処理を毎度やるのは辛かろうという気持ちもあるものの、計測してみないと分からないので、とりあえずキャッシュせずに行くことに。十分にボトルネックになっていると判断できれば、Markdownから変更したHTMLをキャッシュしているのと同様にキャッシュすれば良さそう。

結果

最終的に、現状こういうコードに落ち着く結果となった。

/ app/views/articles/show.html.slim
- content_for :page_description, strip_tags(@article.rendered_body).truncate(140)

ちなみに元のコードはこう。

/ app/views/articles/show.html.slim
- content_for :page_description, @article.body.truncate(140)

Twitterカードの表示はこんな感じに。

image