Lexing of XML processing instructions.
This commit is contained in:
parent
ccd95d69d8
commit
8f4eaf3823
|
|
@ -98,6 +98,40 @@
|
||||||
any;
|
any;
|
||||||
*|;
|
*|;
|
||||||
|
|
||||||
|
# Processing Instructions
|
||||||
|
#
|
||||||
|
# http://www.w3.org/TR/xpath/#section-Processing-Instruction-Nodes
|
||||||
|
# http://en.wikipedia.org/wiki/Processing_Instruction
|
||||||
|
#
|
||||||
|
# These are tags meant to be used by parsers/libraries for custom behaviour.
|
||||||
|
# One example are the tags used by PHP: <?php and ?>. Note that the XML
|
||||||
|
# declaration tags (<?xml ?>) are not considered to be a processing
|
||||||
|
# instruction.
|
||||||
|
#
|
||||||
|
|
||||||
|
proc_ins_start = '<?' identifier;
|
||||||
|
proc_ins_end = '?>';
|
||||||
|
|
||||||
|
action start_proc_ins {
|
||||||
|
callback_simple("on_proc_ins_start");
|
||||||
|
callback("on_proc_ins_name", data, encoding, ts + 2, te);
|
||||||
|
|
||||||
|
mark = te;
|
||||||
|
|
||||||
|
fnext proc_ins_body;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_ins_body := |*
|
||||||
|
proc_ins_end => {
|
||||||
|
callback("on_text", data, encoding, mark, ts);
|
||||||
|
callback_simple("on_proc_ins_end");
|
||||||
|
|
||||||
|
fnext main;
|
||||||
|
};
|
||||||
|
|
||||||
|
any;
|
||||||
|
*|;
|
||||||
|
|
||||||
# Strings
|
# Strings
|
||||||
#
|
#
|
||||||
# Strings in HTML can either be single or double quoted. If a string
|
# Strings in HTML can either be single or double quoted. If a string
|
||||||
|
|
@ -257,6 +291,7 @@
|
||||||
xml_decl_start => start_xml_decl;
|
xml_decl_start => start_xml_decl;
|
||||||
comment_start => start_comment;
|
comment_start => start_comment;
|
||||||
cdata_start => start_cdata;
|
cdata_start => start_cdata;
|
||||||
|
proc_ins_start => start_proc_ins;
|
||||||
|
|
||||||
# The start of an element.
|
# The start of an element.
|
||||||
'<' => start_element;
|
'<' => start_element;
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,29 @@ module Oga
|
||||||
add_token(:T_ELEM_START)
|
add_token(:T_ELEM_START)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Called on the start of a processing instruction.
|
||||||
|
#
|
||||||
|
def on_proc_ins_start
|
||||||
|
add_token(:T_PROC_INS_START)
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Called on a processing instruction name.
|
||||||
|
#
|
||||||
|
# @param [String] value
|
||||||
|
#
|
||||||
|
def on_proc_ins_name(value)
|
||||||
|
add_token(:T_PROC_INS_NAME, value)
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Called on the end of a processing instruction.
|
||||||
|
#
|
||||||
|
def on_proc_ins_end
|
||||||
|
add_token(:T_PROC_INS_END)
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Called on the name of an element.
|
# Called on the name of an element.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Oga::XML::Lexer do
|
||||||
|
context 'processing instructions' do
|
||||||
|
example 'lex a processing instruction' do
|
||||||
|
lex('<?foo?>').should == [
|
||||||
|
[:T_PROC_INS_START, nil, 1],
|
||||||
|
[:T_PROC_INS_NAME, 'foo', 1],
|
||||||
|
[:T_PROC_INS_END, nil, 1]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'lex a processing instruction containing text' do
|
||||||
|
lex('<?foo bar ?>').should == [
|
||||||
|
[:T_PROC_INS_START, nil, 1],
|
||||||
|
[:T_PROC_INS_NAME, 'foo', 1],
|
||||||
|
[:T_TEXT, ' bar ', 1],
|
||||||
|
[:T_PROC_INS_END, nil, 1]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue