2013-05-16 25 views
7

Tôi có một vấn đề tương tự như một số tôi đã tìm thấy trên stackoverflow, nhưng không hoàn toàn giống nhau. Tôi muốn tránh những giải pháp cho những câu dưới đây:Unescaping HAML trong một thuộc tính Hash

https://stackoverflow.com/a/10407782/996587

Về cơ bản, muốn đầu ra HTML sau:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
</div> 

Các HAML Tôi đang sử dụng trông như sau:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT" } 
    Content... 

Tôi không thể tìm ra cách để nội dung xuất theo cách tôi muốn. Cố gắng áp dụng .html_safe đến cuối của chuỗi, nhưng có những lỗi sau đây:

phương pháp xác định 'html_safe' cho 'unescaped <> & CONTENT': String

Sau đó nhận ra rằng cho các ứng dụng đặc biệt này tôi không sử dụng Rails, chỉ cần ruby ​​+ HAML. (Tôi đã kế thừa dự án này và tôi chỉ mới bắt đầu học HAML, ruby ​​và Rails anyways)

Và một lần nữa, đối với những người bạn quá lười biếng nhấp vào liên kết và không đọc giải pháp tôi đã gọi, tôi ' d không muốn cấu hình HAML để không thoát khỏi attrs cho toàn bộ tập tin, chỉ cho một thuộc tính này.

Cảm ơn!

CẬP NHẬT

Tôi chỉ tìm thấy: bộ lọc đơn giản, và đã có thể có được những gì tôi muốn sử dụng đó. Tuy nhiên, nếu có một mẹo mà tôi không biết nên tôi không phải viết tất cả HTML, tôi sẽ đánh giá cao nó. "Sửa lỗi" của tôi:

:plain 
    <div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
    </div> 
+0

việc sử dụng: đơn giản phá vỡ tính thống nhất của Haml ... là có một ything tốt hơn? – chfw

Trả lời

0

Bạn đã thử sử dụng \ để thoát khỏi ký tự.

{ :myattr => '\<\>\&' }

+0

Các ký tự "thoát" xuất hiện trong dấu gạch chéo ngược bị bỏ qua, nhưng ký tự bị thoát. Tôi thậm chí đã cố gắng trốn thoát với một dấu gạch chéo về phía trước, chỉ trong trường hợp HAML bị điên. Không may mắn :) – thexfactor

4

Không có (hiện tại) cách nào để tắt thoát cho một thuộc tính cá nhân trong Haml ngoài Rails, đó là tất cả hoặc không có gì sử dụng tùy chọn :escape_attrs. Tùy thuộc vào những gì bạn muốn, nó có thể là giá trị nhìn vào :once option.

Khi Haml được sử dụng trong Rails, nó thay thế các phương thức thoát HTML bằng một số phương thức mà giá trị html_safe mà ActiveSupport bổ sung (xem lib/haml/helpers/xss_mods.rb).

Có thể sử dụng các phương pháp này ngoài Rails nếu bạn muốn. Bạn sẽ cần thêm các phương thức html_safehtml_safe? vào lớp String để làm việc này (hãy cẩn thận ở đây, ví dụ này chỉ là phiên bản "người nghèo" của bảo vệ XSS đầy đủ mà Rails cung cấp, nó sẽ không thực sự bảo vệ bạn từ nhiều nhưng nó sẽ cho phép thoát khỏi các thuộc tính chọn lọc).

Thêm dòng sau ở đâu đó sau khi đòi hỏi Haml (nó có thể là tốt nhất trong tập tin riêng của mình mà bị bắt buộc):

class String 
    def html_safe? 
    defined?(@html_safe) && @html_safe 
    end 

    def html_safe 
    @html_safe = true 
    self 
    end 
end 

require 'haml/helpers/xss_mods' 

module Haml::Helpers 
    include Haml::Helpers::XssMods 
end 

Bây giờ bạn có thể sử dụng html_safe trên dây của bạn, và Haml sẽ không thoát khỏi họ:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT".html_safe, 
      "otherextraattr" => "ESCAPED <>& CONTENT"} 
    Content... 

Output:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT' otherextraattr='ESCAPED &lt;&gt;&amp; CONTENT'> 
    Content... 
</div>