UtopiaSourceUtopiaContentMarkupParser

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 buffer String | XRB::Buffer

The markup source buffer.

parameter delegate Object

The delegate.

parameter entities Hash

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 buffer String

The markup source buffer.

parameter delegate Object

The delegate.

parameter entities Hash

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 name String

The name.

parameter offset Integer

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 key String | Symbol

The lookup key.

parameter value Object

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_closing Boolean

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 name String

The name.

parameter offset Integer

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 string String

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 string String

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 string String

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 string String

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 string String

The string.

returns Object

The delegate's text result.

Implementation

def text(string)
	@delegate.text(string)
end