class MarkupParser
Provides a high level interface for parsing markup.
Nested
Definitions
def self.parse(buffer, delegate, entities = XRB::Entities::HTML5)
Parse markup events into a delegate.
Signature
-
parameter
bufferString | XRB::Buffer The markup source buffer.
-
parameter
delegateObject The delegate.
-
parameter
entitiesHash The named entity mappings.
-
returns
Nil Parsing completes through delegate callbacks.
-
raises
UnbalancedTagError If the markup contains mismatched tags.
Implementation
def self.parse(buffer, delegate, entities = XRB::Entities::HTML5)
# This is for compatibility with the existing API which passes in a string:
buffer = XRB::Buffer(buffer)
self.new(buffer, delegate, entities).parse!
end
def initialize(buffer, delegate, entities = XRB::Entities::HTML5)
Initialize a streaming markup parser and its delegate.
Signature
-
parameter
bufferString The markup source buffer.
-
parameter
delegateObject The delegate.
-
parameter
entitiesHash The named entity mappings.
Implementation
def initialize(buffer, delegate, entities = XRB::Entities::HTML5)
@buffer = buffer
@delegate = delegate
@entities = entities
@current = nil
@stack = []
end
def parse!
Parse the markup buffer into delegate callbacks and validate balanced tags.
Signature
-
returns
Nil Parsing completes through delegate callbacks.
Implementation
def parse!
XRB::Parsers.parse_markup(@buffer, self, @entities)
if tag = @stack.pop
raise UnbalancedTagError.new(@buffer, tag)
end
end
def open_tag_begin(name, offset)
Begin collecting an opening tag.
Signature
-
parameter
nameString The name.
-
parameter
offsetInteger The source offset.
-
returns
ParsedTag The tag being collected.
Implementation
def open_tag_begin(name, offset)
@current = ParsedTag.new(name, offset)
end
def attribute(key, value)
Process a markup attribute.
Signature
-
parameter
keyString | Symbol The lookup key.
-
parameter
valueObject The value to assign.
-
returns
Object The assigned attribute value.
Implementation
def attribute(key, value)
@current.tag.attributes[key] = value
end
def open_tag_end(self_closing)
Complete an opening tag and dispatch it to the delegate.
Signature
-
parameter
self_closingBoolean Whether the tag is self-closing.
-
returns
Nil The current tag is cleared.
Implementation
def open_tag_end(self_closing)
if self_closing
@current.tag.closed = true
@delegate.tag_complete(@current.tag)
else
@stack << @current
@delegate.tag_begin(@current.tag)
end
@current = nil
end
def close_tag(name, offset)
Process a closing markup tag.
Signature
-
parameter
nameString The name.
-
parameter
offsetInteger The source offset.
-
returns
Object The delegate's tag-end result.
-
raises
UnbalancedTagError If the closing tag does not match its opening tag.
Implementation
def close_tag(name, offset)
@current = @stack.pop
tag = @current.tag
if tag.name != name
raise UnbalancedTagError.new(@buffer, @current, ParsedTag.new(name, offset))
end
@delegate.tag_end(tag)
end
def doctype(string)
Process a document type declaration.
Signature
-
parameter
stringString The string.
-
returns
Object The delegate's write result.
Implementation
def doctype(string)
@delegate.write(string)
end
def comment(string)
Process a markup comment.
Signature
-
parameter
stringString The string.
-
returns
Object The delegate's write result.
Implementation
def comment(string)
@delegate.write(string)
end
def instruction(string)
Process a markup instruction.
Signature
-
parameter
stringString The string.
-
returns
Object The delegate's write result.
Implementation
def instruction(string)
@delegate.write(string)
end
def cdata(string)
Process a CDATA section.
Signature
-
parameter
stringString The string.
-
returns
Object The delegate's write result.
Implementation
def cdata(string)
@delegate.write(string[9..-4])
end
def text(string)
Process text content.
Signature
-
parameter
stringString The string.
-
returns
Object The delegate's text result.
Implementation
def text(string)
@delegate.text(string)
end