Class HTML5::HTMLSerializer
In: lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb
Parent: Object
Phase XmlElementPhase InTablePhase RootElementPhase InHeadPhase AfterHeadPhase AfterFramesetPhase XmlRootPhase InTableBodyPhase InFramesetPhase InColumnGroupPhase InitialPhase InCaptionPhase TrailingEndPhase InSelectPhase BeforeHeadPhase AfterBodyPhase InCellPhase InBodyPhase InRowPhase XhmlRootPhase Exception SerializeError EOF AssertionError ParseError HTMLSanitizer HTMLTokenizer XMLParser XHTMLParser HTMLParser String EncodingBytes HTMLSerializer XHTMLSerializer TreeWalkers::Base NonRecursiveTreeWalker TreeWalker TreeWalker Base TreeWalker Element DocumentFragment Node CommentNode DocumentType TextNode Document Base::Node Node Node Base::TreeBuilder TreeBuilder TreeBuilder TreeBuilder Element DocumentFragment CommentNode DocumentType TextNode Document Element DocumentFragment CommentNode DocumentType TextNode Document Base InjectMetaCharset OptionalTagFilter WhitespaceFilter HTMLSanitizeFilter HTMLSanitizeModule Enumerable TestData SimpleDelegator HTMLInputStream EncodingParser ContentAttrParser Node TreeBuilder lib/feed_tools/vendor/html5/lib/html5/html5parser/trailing_end_phase.rb lib/feed_tools/vendor/html5/lib/html5/constants.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/after_frameset_phase.rb lib/feed_tools/vendor/html5/lib/html5/liberalxmlparser.rb lib/feed_tools/vendor/html5/lib/html5/serializer/xhtmlserializer.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_caption_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/initial_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_frameset_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_body_phase.rb lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/root_element_phase.rb lib/feed_tools/vendor/html5/lib/html5/tokenizer.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/before_head_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_select_phase.rb lib/feed_tools/vendor/html5/lib/html5/inputstream.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_row_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_cell_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_body_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_head_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/after_body_phase.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/after_head_phase.rb lib/feed_tools/vendor/html5/lib/html5/sanitizer.rb lib/feed_tools/vendor/html5/lib/html5/html5parser/in_column_group_phase.rb lib/feed_tools/vendor/html5/lib/html5/treewalkers/base.rb lib/feed_tools/vendor/html5/lib/html5/treewalkers/hpricot.rb Hpricot TokenConstructor lib/feed_tools/vendor/html5/lib/html5/treewalkers/rexml.rb REXML lib/feed_tools/vendor/html5/lib/html5/treewalkers/simpletree.rb SimpleTree TreeWalkers HTMLSanitizeModule lib/feed_tools/vendor/html5/lib/html5/treebuilders/hpricot.rb Hpricot lib/feed_tools/vendor/html5/lib/html5/treebuilders/base.rb Base lib/feed_tools/vendor/html5/lib/html5/treebuilders/rexml.rb REXML lib/feed_tools/vendor/html5/lib/html5/treebuilders/simpletree.rb SimpleTree TreeBuilders lib/feed_tools/vendor/html5/lib/html5/filters/whitespace.rb lib/feed_tools/vendor/html5/lib/html5/filters/optionaltags.rb lib/feed_tools/vendor/html5/lib/html5/filters/base.rb lib/feed_tools/vendor/html5/lib/html5/filters/inject_meta_charset.rb lib/feed_tools/vendor/html5/lib/html5/filters/sanitizer.rb Filters Sniffer lib/feed_tools/vendor/html5/tests/preamble.rb TestSupport HTML5 dot/m_75_0.png

Methods

Public Class methods

[Source]

    # File lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb, line 15
15:     def initialize(options={})
16:       @quote_attr_values           = false
17:       @quote_char                  = '"'
18:       @use_best_quote_char         = true
19:       @minimize_boolean_attributes = true
20: 
21:       @use_trailing_solidus          = false
22:       @space_before_trailing_solidus = true
23:       @escape_lt_in_attrs            = false
24:       @escape_rcdata                 = false
25: 
26:       @omit_optional_tags = true
27:       @sanitize           = false
28: 
29:       @strip_whitespace = false
30: 
31:       @inject_meta_charset = true
32: 
33:       options.each do |name, value|
34:         next unless instance_variables.include?("@#{name}")
35:         @use_best_quote_char = false if name.to_s == 'quote_char'
36:         instance_variable_set("@#{name}", value)
37:       end
38: 
39:       @errors = []
40:     end

[Source]

   # File lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb, line 7
7:     def self.serialize(stream, options = {})
8:       new(options).serialize(stream, options[:encoding])
9:     end

Public Instance methods

[Source]

    # File lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb, line 11
11:     def escape(string)
12:       string.gsub("&", "&amp;").gsub("<", "&lt;").gsub(">", "&gt;")
13:     end
render(treewalker, encoding=nil)

Alias for serialize

[Source]

     # File lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb, line 42
 42:     def serialize(treewalker, encoding=nil)
 43:       in_cdata = false
 44:       @errors = []
 45: 
 46:       if encoding and @inject_meta_charset
 47:         require 'html5/filters/inject_meta_charset'
 48:         treewalker = Filters::InjectMetaCharset.new(treewalker, encoding)
 49:       end
 50: 
 51:       if @strip_whitespace
 52:         require 'html5/filters/whitespace'
 53:         treewalker = Filters::WhitespaceFilter.new(treewalker)
 54:       end
 55: 
 56:       if @sanitize
 57:         require 'html5/filters/sanitizer'
 58:         treewalker = Filters::HTMLSanitizeFilter.new(treewalker)
 59:       end
 60: 
 61:       if @omit_optional_tags
 62:         require 'html5/filters/optionaltags'
 63:         treewalker = Filters::OptionalTagFilter.new(treewalker)
 64:       end
 65: 
 66:       result = []
 67:       treewalker.each do |token|
 68:         type = token[:type]
 69:         if type == :Doctype
 70:           doctype = "<!DOCTYPE %s>" % token[:name]
 71:           result << doctype
 72: 
 73:         elsif [:Characters, :SpaceCharacters].include? type
 74:           if type == :SpaceCharacters or in_cdata
 75:             if in_cdata and token[:data].include?("</")
 76:               serialize_error("Unexpected </ in CDATA")
 77:             end
 78:             result << token[:data]
 79:           else
 80:             result << escape(token[:data])
 81:           end
 82: 
 83:         elsif [:StartTag, :EmptyTag].include? type
 84:           name = token[:name]
 85:           if RCDATA_ELEMENTS.include?(name) and not @escape_rcdata
 86:             in_cdata = true
 87:           elsif in_cdata
 88:             serialize_error(_("Unexpected child element of a CDATA element"))
 89:           end
 90:           attributes = []
 91:           for k,v in attrs = token[:data].to_a.sort
 92:             attributes << ' '
 93: 
 94:             attributes << k
 95:             if not @minimize_boolean_attributes or \
 96:                 (!(BOOLEAN_ATTRIBUTES[name]||[]).include?(k) \
 97:                 and !BOOLEAN_ATTRIBUTES[:global].include?(k))
 98:               attributes << "="
 99:               if @quote_attr_values or v.empty?
100:                 quote_attr = true
101:               else
102:                 quote_attr = (SPACE_CHARACTERS + %w(< > " ')).any? {|c| v.include?(c)}
103:               end
104:               v = v.gsub("&", "&amp;")
105:               v = v.gsub("<", "&lt;") if @escape_lt_in_attrs
106:               if quote_attr
107:                 quote_char = @quote_char
108:                 if @use_best_quote_char
109:                   if v.index("'") and !v.index('"')
110:                     quote_char = '"'
111:                   elsif v.index('"') and !v.index("'")
112:                     quote_char = "'"
113:                   end
114:                 end
115:                 if quote_char == "'"
116:                   v = v.gsub("'", "&#39;")
117:                 else
118:                   v = v.gsub('"', "&quot;")
119:                 end
120:                 attributes << quote_char << v << quote_char
121:               else
122:                 attributes << v
123:               end
124:             end
125:           end
126:           if VOID_ELEMENTS.include?(name) and @use_trailing_solidus
127:             if @space_before_trailing_solidus
128:               attributes << " /"
129:             else
130:               attributes << "/"
131:             end
132:           end
133:           result << "<%s%s>" % [name, attributes.join('')]
134: 
135:         elsif type == :EndTag
136:           name = token[:name]
137:           if RCDATA_ELEMENTS.include?(name)
138:             in_cdata = false
139:           elsif in_cdata
140:             serialize_error(_("Unexpected child element of a CDATA element"))
141:           end
142:           end_tag = "</#{name}>"
143:           result << end_tag
144: 
145:         elsif type == :Comment
146:           data = token[:data]
147:           serialize_error(_("Comment contains --")) if data.index("--")
148:           comment = "<!--%s-->" % token[:data]
149:           result << comment
150: 
151:         else
152:           serialize_error(token[:data])
153:         end
154:       end
155: 
156:       if encoding and encoding != 'utf-8'
157:         require 'iconv'
158:         Iconv.iconv(encoding, 'utf-8', result.join('')).first
159:       else
160:         result.join('')
161:       end
162:     end

[Source]

     # File lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb, line 166
166:     def serialize_error(data="XXX ERROR MESSAGE NEEDED")
167:       # XXX The idea is to make data mandatory.
168:       @errors.push(data)
169:       if @strict
170:         raise SerializeError
171:       end
172:     end

[Validate]