4

我有一个用于运行基本网站的小 sinatra 应用程序。该网站的内容由客户提供,其中大部分来自 PDF。由于我不想手动替换所有<with&lt;&with &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 回答