4

基本的な Web サイトを実行するために使用している小さなシナトラ アプリがあります。このサイトのコンテンツはクライアントから提供されており、そのほとんどは PDF から作成されています。すべて<&lt;、 、&に手動で置き換える必要&amp;はありませんので、自動的に行うように HAML/Sinatra を構成する方法はありますか?

基本的に、次のようなブロックがいくつかあります。

%p
  large block of text here...
  multi-line so I can see it in my IDE...
  more lines here...

HAML にすべてのコンテンツを調べて、安全でない文字を対応する HTML エンティティに置き換えるように指示する構成オプションを見つけたいと思います。

HTMLEntities gem を使用してみましたが、このサイトには複数行の段落が多く、うまく動作しませんでした。server.rbつまり、ファイルで次のようなことを行うことを意味します。

def "/some_url"
  @encoder = HTMLEntities.new
  haml :some_template
end

そして私のテンプレートでは:

%p
  = @encoder.encode("Really long multiline string...
    some more lines here...
    and more lines...")

そして、終了の欠落に関するエラーを吐き出します)

4

2 に答える 2

6

:escapedフィルターを使用できます:

%p
  :escaped
    A block of text here that might
    contain & and <.

出力:

<p>
  A block of text here that might
  contain &amp; and &lt;.
</p>

完全に自動ではありませんが、必要な編集が減る可能性があります。

于 2013-03-12T17:52:29.077 に答える
2

多分あなたはこれを探しています:

require 'cgi'
CGI::escapeHTML('unsafe string <script>kill() && destroy()</script>'
#=> "unsafe string &lt;script&gt;kill() &amp;&amp; destroy()&lt;/script&gt;"

編集

今、私は実際にあなたが望むものを手に入れます。すべての文字列が暗黙的にエスケープされるため、使用するだけ:escape_html => trueでテキストをラップできます。='...text here...'

require 'sinatra'

get '/' do
  haml :index, :escape_html => true
end

__END__

@@layout
!!! 5
%html
  %head
    %title Example
  %body
    = yield

@@index
%p
  ='Here is some <em>unsafe</em> HTML.'
  ='<script type="text/javascript">'
  ='killKittens() && destroyHumanity()'
  ='</script>'

結果:

$ curl localhost:4567
<!DOCTYPE html>
<html>
  <head>
    <title>Example</title>
  </head>
  <body>
    <p>
      Here is some &lt;em&gt;unsafe&lt;/em&gt; HTML.
      &lt;script type=&quot;text/javascript&quot;&gt;
      killKittens() &amp;&amp; destroyHumanity()
      &lt;/script&gt;
    </p>
  </body>
</html>
于 2013-03-12T15:12:34.130 に答える