我有一个小的sinatra应用程序,我用来运行一个基本的网站。该网站的内容由客户提供,其中大部分来自PDF。由于我不必手动将所有<
替换为<
,将&
替换为&
,是否有办法配置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...")
如果错过关闭)
,就会出错。
答案 0 :(得分:6)
您可以使用:escaped
filter:
%p
:escaped
A block of text here that might
contain & and <.
输出:
<p>
A block of text here that might
contain & and <.
</p>
它不是很自动,但可能会减少所需的编辑。
答案 1 :(得分:2)
也许你正在寻找这个:
require 'cgi'
CGI::escapeHTML('unsafe string <script>kill() && destroy()</script>'
#=> "unsafe string <script>kill() && destroy()</script>"
现在我真的得到了你想要的东西。只需使用: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 <em>unsafe</em> HTML.
<script type="text/javascript">
killKittens() && destroyHumanity()
</script>
</p>
</body>
</html>