blade
Version:
Blade - HTML Template Compiler, inspired by Jade & Haml
1,490 lines (1,441 loc) • 173 kB
JavaScript
module.exports = (function(){
/*
* Generated by PEG.js 0.7.0.
*
* http://pegjs.majda.cz/
*/
function quote(s) {
/*
* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
* string literal except for the closing quote character, backslash,
* carriage return, line separator, paragraph separator, and line feed.
* Any character may appear in the form of an escape sequence.
*
* For portability, we also escape escape all control and non-ASCII
* characters. Note that "\0" and "\v" escape sequences are not used
* because JSHint does not like the first and IE the second.
*/
return '"' + s
.replace(/\\/g, '\\\\') // backslash
.replace(/"/g, '\\"') // closing quote character
.replace(/\x08/g, '\\b') // backspace
.replace(/\t/g, '\\t') // horizontal tab
.replace(/\n/g, '\\n') // line feed
.replace(/\f/g, '\\f') // form feed
.replace(/\r/g, '\\r') // carriage return
.replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape)
+ '"';
}
var result = {
/*
* Parses the input with a generated parser. If the parsing is successfull,
* returns a value explicitly or implicitly specified by the grammar from
* which the parser was generated (see |PEG.buildParser|). If the parsing is
* unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
*/
parse: function(input, startRule) {
var parseFunctions = {
"start": parse_start,
"nodes": parse_nodes,
"doctype": parse_doctype,
"blank_line": parse_blank_line,
"node": parse_node,
"parent_node": parse_parent_node,
"parent_node_types": parse_parent_node_types,
"child_node": parse_child_node,
"text_block_parent": parse_text_block_parent,
"text_block_parent_types": parse_text_block_parent_types,
"text_block_child": parse_text_block_child,
"tag": parse_tag,
"id_class": parse_id_class,
"attributes": parse_attributes,
"attribute_separator": parse_attribute_separator,
"attribute": parse_attribute,
"attribute_code": parse_attribute_code,
"tag_content": parse_tag_content,
"block": parse_block,
"block_render": parse_block_render,
"block_modifier": parse_block_modifier,
"block_modifier_keyword": parse_block_modifier_keyword,
"function_definition": parse_function_definition,
"function_call": parse_function_call,
"matched_parentheses": parse_matched_parentheses,
"parameters": parse_parameters,
"chunk": parse_chunk,
"isolate": parse_isolate,
"constant": parse_constant,
"preserve": parse_preserve,
"foreach": parse_foreach,
"foreach_else": parse_foreach_else,
"include": parse_include,
"exposed_locals": parse_exposed_locals,
"comment": parse_comment,
"unparsed_comment": parse_unparsed_comment,
"code": parse_code,
"event_handler": parse_event_handler,
"line_of_text": parse_line_of_text,
"content_prefix": parse_content_prefix,
"filter": parse_filter,
"identifier": parse_identifier,
"alpha": parse_alpha,
"alphanumeric": parse_alphanumeric,
"whitespace": parse_whitespace,
"quoted_string": parse_quoted_string,
"text_until_eol": parse_text_until_eol,
"newline": parse_newline,
"newline_token": parse_newline_token,
"indents": parse_indents
};
if (startRule !== undefined) {
if (parseFunctions[startRule] === undefined) {
throw new Error("Invalid rule name: " + quote(startRule) + ".");
}
} else {
startRule = "start";
}
var pos = { offset: 0, line: 1, column: 1, seenCR: false };
var reportFailures = 0;
var rightmostFailuresPos = { offset: 0, line: 1, column: 1, seenCR: false };
var rightmostFailuresExpected = [];
function padLeft(input, padding, length) {
var result = input;
var padLength = length - input.length;
for (var i = 0; i < padLength; i++) {
result = padding + result;
}
return result;
}
function escape(ch) {
var charCode = ch.charCodeAt(0);
var escapeChar;
var length;
if (charCode <= 0xFF) {
escapeChar = 'x';
length = 2;
} else {
escapeChar = 'u';
length = 4;
}
return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
}
function clone(object) {
var result = {};
for (var key in object) {
result[key] = object[key];
}
return result;
}
function advance(pos, n) {
var endOffset = pos.offset + n;
for (var offset = pos.offset; offset < endOffset; offset++) {
var ch = input.charAt(offset);
if (ch === "\n") {
if (!pos.seenCR) { pos.line++; }
pos.column = 1;
pos.seenCR = false;
} else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
pos.line++;
pos.column = 1;
pos.seenCR = true;
} else {
pos.column++;
pos.seenCR = false;
}
}
pos.offset += n;
}
function matchFailed(failure) {
if (pos.offset < rightmostFailuresPos.offset) {
return;
}
if (pos.offset > rightmostFailuresPos.offset) {
rightmostFailuresPos = clone(pos);
rightmostFailuresExpected = [];
}
rightmostFailuresExpected.push(failure);
}
function parse_start() {
var result0, result1, result2, result3;
var pos0, pos1, pos2, pos3;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = [];
pos2 = clone(pos);
pos3 = clone(pos);
result1 = parse_doctype();
if (result1 !== null) {
result2 = parse_newline();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = clone(pos3);
}
} else {
result1 = null;
pos = clone(pos3);
}
if (result1 !== null) {
result1 = (function(offset, line, column, doctype) {return doctype;})(pos2.offset, pos2.line, pos2.column, result1[0]);
}
if (result1 === null) {
pos = clone(pos2);
}
while (result1 !== null) {
result0.push(result1);
pos2 = clone(pos);
pos3 = clone(pos);
result1 = parse_doctype();
if (result1 !== null) {
result2 = parse_newline();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = clone(pos3);
}
} else {
result1 = null;
pos = clone(pos3);
}
if (result1 !== null) {
result1 = (function(offset, line, column, doctype) {return doctype;})(pos2.offset, pos2.line, pos2.column, result1[0]);
}
if (result1 === null) {
pos = clone(pos2);
}
}
if (result0 !== null) {
result1 = parse_nodes();
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = [];
result3 = parse_newline();
while (result3 !== null) {
result2.push(result3);
result3 = parse_newline();
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, doctypes, nodes) {return {'doctypes': doctypes, 'nodes': nodes};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
}
if (result0 === null) {
pos = clone(pos0);
}
return result0;
}
function parse_nodes() {
var result0, result1, result2, result3;
var pos0, pos1, pos2, pos3;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_node();
if (result0 !== null) {
result1 = [];
pos2 = clone(pos);
pos3 = clone(pos);
result3 = parse_newline();
if (result3 !== null) {
result2 = [];
while (result3 !== null) {
result2.push(result3);
result3 = parse_newline();
}
} else {
result2 = null;
}
if (result2 !== null) {
result3 = parse_node();
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = clone(pos3);
}
} else {
result2 = null;
pos = clone(pos3);
}
if (result2 !== null) {
result2 = (function(offset, line, column, node) {return node;})(pos2.offset, pos2.line, pos2.column, result2[1]);
}
if (result2 === null) {
pos = clone(pos2);
}
while (result2 !== null) {
result1.push(result2);
pos2 = clone(pos);
pos3 = clone(pos);
result3 = parse_newline();
if (result3 !== null) {
result2 = [];
while (result3 !== null) {
result2.push(result3);
result3 = parse_newline();
}
} else {
result2 = null;
}
if (result2 !== null) {
result3 = parse_node();
if (result3 !== null) {
result2 = [result2, result3];
} else {
result2 = null;
pos = clone(pos3);
}
} else {
result2 = null;
pos = clone(pos3);
}
if (result2 !== null) {
result2 = (function(offset, line, column, node) {return node;})(pos2.offset, pos2.line, pos2.column, result2[1]);
}
if (result2 === null) {
pos = clone(pos2);
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, first_node, next_nodes) {next_nodes.unshift(first_node); return next_nodes;})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
}
if (result0 === null) {
pos = clone(pos0);
}
return result0;
}
function parse_doctype() {
var result0, result1, result2;
var pos0, pos1;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
if (input.substr(pos.offset, 7) === "doctype") {
result0 = "doctype";
advance(pos, 7);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"doctype\"");
}
}
if (result0 !== null) {
result1 = parse_whitespace();
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = parse_text_until_eol();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, type) {return type;})(pos0.offset, pos0.line, pos0.column, result0[2]);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
if (input.substr(pos.offset, 3) === "!!!") {
result0 = "!!!";
advance(pos, 3);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"!!!\"");
}
}
if (result0 !== null) {
result1 = parse_whitespace();
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = parse_text_until_eol();
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, type) {return type;})(pos0.offset, pos0.line, pos0.column, result0[2]);
}
if (result0 === null) {
pos = clone(pos0);
}
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("doctype");
}
return result0;
}
function parse_blank_line() {
var result0, result1;
var pos0, pos1, pos2;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = [];
result1 = parse_whitespace();
while (result1 !== null) {
result0.push(result1);
result1 = parse_whitespace();
}
if (result0 !== null) {
pos2 = clone(pos);
reportFailures++;
result1 = parse_newline();
reportFailures--;
if (result1 !== null) {
result1 = "";
pos = clone(pos2);
} else {
result1 = null;
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column) {return {"type": "blank_line"};})(pos0.offset, pos0.line, pos0.column);
}
if (result0 === null) {
pos = clone(pos0);
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("blank line");
}
return result0;
}
function parse_node() {
var result0, result1, result2;
var pos0, pos1;
pos0 = clone(pos);
result0 = parse_include();
if (result0 !== null) {
result0 = (function(offset, line, column, include) {
include.line = line, include.col = column;
return include;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
result0 = parse_block_render();
if (result0 !== null) {
result0 = (function(offset, line, column, render) {
render.line = line, render.col = column;
return render;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
result0 = parse_function_call();
if (result0 !== null) {
result0 = (function(offset, line, column, call) {
call.line = line, call.col = column;
return call;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_parent_node();
if (result0 !== null) {
result1 = [];
result2 = parse_child_node();
while (result2 !== null) {
result1.push(result2);
result2 = parse_child_node();
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, parent, children) {
currentParentNode = parent.parent;
delete parent.parent; //Don't need this back-reference anymore
delete parent._indent; //Don't need this either
parent.children = parent.children.concat(children);
parent.line = line, parent.col = column;
return parent;
})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_text_block_parent();
if (result0 !== null) {
result1 = [];
result2 = parse_text_block_child();
while (result2 !== null) {
result1.push(result2);
result2 = parse_text_block_child();
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, parent, children) {
currentParentNode = parent.parent;
delete parent.parent; //Don't need this back-reference anymore
delete parent._indent; //Don't need this either
if(parent[parent.type].length > 0 && children.length > 0)
parent[parent.type] += "\n";
parent[parent.type] += children.join("\n");
parent.line = line, parent.col = column;
return parent;
})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1]);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
result0 = parse_unparsed_comment();
if (result0 !== null) {
result0 = (function(offset, line, column, comment) {
comment.line = line, comment.col = column;
return comment;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
result0 = parse_blank_line();
}
}
}
}
}
}
return result0;
}
function parse_parent_node() {
var result0;
var pos0;
pos0 = clone(pos);
result0 = parse_parent_node_types();
if (result0 !== null) {
result0 = (function(offset, line, column, parent) {
parent._indent = indent;
if(!(parent.children instanceof Array) )
parent.children = [];
parent.parent = currentParentNode;
currentParentNode = parent;
return parent;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
return result0;
}
function parse_parent_node_types() {
var result0;
result0 = parse_block_modifier();
if (result0 === null) {
result0 = parse_block();
if (result0 === null) {
result0 = parse_function_definition();
if (result0 === null) {
result0 = parse_isolate();
if (result0 === null) {
result0 = parse_constant();
if (result0 === null) {
result0 = parse_preserve();
if (result0 === null) {
result0 = parse_foreach();
if (result0 === null) {
result0 = parse_foreach_else();
if (result0 === null) {
result0 = parse_code();
if (result0 === null) {
result0 = parse_tag();
if (result0 === null) {
result0 = parse_comment();
}
}
}
}
}
}
}
}
}
}
return result0;
}
function parse_child_node() {
var result0, result1, result2, result3;
var pos0, pos1;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
result1 = parse_newline();
if (result1 !== null) {
result0 = [];
while (result1 !== null) {
result0.push(result1);
result1 = parse_newline();
}
} else {
result0 = null;
}
if (result0 !== null) {
result1 = parse_indents();
if (result1 !== null) {
result2 = (function(offset, line, column, child_indent) {
return child_indent == currentParentNode._indent + 1;
})(pos.offset, pos.line, pos.column, result1) ? "" : null;
if (result2 !== null) {
result3 = parse_node();
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, child_indent, child) {return child;})(pos0.offset, pos0.line, pos0.column, result0[1], result0[3]);
}
if (result0 === null) {
pos = clone(pos0);
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("child node");
}
return result0;
}
function parse_text_block_parent() {
var result0;
var pos0;
pos0 = clone(pos);
result0 = parse_text_block_parent_types();
if (result0 !== null) {
result0 = (function(offset, line, column, parent) {
parent._indent = indent;
parent.parent = currentParentNode;
currentParentNode = parent;
return parent;
})(pos0.offset, pos0.line, pos0.column, result0);
}
if (result0 === null) {
pos = clone(pos0);
}
return result0;
}
function parse_text_block_parent_types() {
var result0;
result0 = parse_filter();
if (result0 === null) {
result0 = parse_line_of_text();
if (result0 === null) {
result0 = parse_event_handler();
}
}
return result0;
}
function parse_text_block_child() {
var result0, result1, result2, result3;
var pos0, pos1;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_newline();
if (result0 !== null) {
result1 = parse_indents();
if (result1 !== null) {
result2 = (function(offset, line, column, child_indent) {
return child_indent > currentParentNode._indent;
})(pos.offset, pos.line, pos.column, result1) ? "" : null;
if (result2 !== null) {
result3 = parse_text_until_eol();
result3 = result3 !== null ? result3 : "";
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, child_indent, text) {
//Add overeaten indents back to the text
var pre = "";
for(var i = 0; i < child_indent - currentParentNode._indent - 1; i++)
pre += indentToken;
return pre + text;
})(pos0.offset, pos0.line, pos0.column, result0[1], result0[3]);
}
if (result0 === null) {
pos = clone(pos0);
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("text block");
}
return result0;
}
function parse_tag() {
var result0, result1, result2, result3, result4, result5, result6;
var pos0, pos1;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
if (input.charCodeAt(pos.offset) === 92) {
result0 = "\\";
advance(pos, 1);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\\\\"");
}
}
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
if (input.charCodeAt(pos.offset) === 60) {
result1 = "<";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"<\"");
}
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = parse_identifier();
result2 = result2 !== null ? result2 : "";
if (result2 !== null) {
if (input.charCodeAt(pos.offset) === 62) {
result3 = ">";
advance(pos, 1);
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\">\"");
}
}
result3 = result3 !== null ? result3 : "";
if (result3 !== null) {
result4 = parse_id_class();
if (result4 !== null) {
result5 = parse_attributes();
result5 = result5 !== null ? result5 : "";
if (result5 !== null) {
result6 = parse_tag_content();
result6 = result6 !== null ? result6 : "";
if (result6 !== null) {
result0 = [result0, result1, result2, result3, result4, result5, result6];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, prependSpace, tagName, appendSpace, id_class, attrs, content) {
/* Special case: you must specify a tag name, id,
or at least one class to be a valid tag */
if(tagName == "" && !id_class.id &&
id_class.classes.length == 0) return null;
//Return the tag
var tag = {
'type': "tag",
'name': tagName == "" ? "div" : tagName,
'id': id_class.id,
'classes': id_class.classes,
'attributes': attrs == "" ? {} : attrs,
'children': []
};
if(prependSpace)
tag.prependSpace = true;
if(appendSpace)
tag.appendSpace = true;
if(content != "")
tag.children.push(content);
return tag;
})(pos0.offset, pos0.line, pos0.column, result0[1], result0[2], result0[3], result0[4], result0[5], result0[6]);
}
if (result0 === null) {
pos = clone(pos0);
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("tag");
}
return result0;
}
function parse_id_class() {
var result0, result1, result2, result3, result4;
var pos0, pos1, pos2, pos3;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = [];
pos2 = clone(pos);
pos3 = clone(pos);
if (input.charCodeAt(pos.offset) === 46) {
result1 = ".";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result1 !== null) {
result2 = parse_identifier();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = clone(pos3);
}
} else {
result1 = null;
pos = clone(pos3);
}
if (result1 !== null) {
result1 = (function(offset, line, column, without_dot) {return without_dot;})(pos2.offset, pos2.line, pos2.column, result1[1]);
}
if (result1 === null) {
pos = clone(pos2);
}
while (result1 !== null) {
result0.push(result1);
pos2 = clone(pos);
pos3 = clone(pos);
if (input.charCodeAt(pos.offset) === 46) {
result1 = ".";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result1 !== null) {
result2 = parse_identifier();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = clone(pos3);
}
} else {
result1 = null;
pos = clone(pos3);
}
if (result1 !== null) {
result1 = (function(offset, line, column, without_dot) {return without_dot;})(pos2.offset, pos2.line, pos2.column, result1[1]);
}
if (result1 === null) {
pos = clone(pos2);
}
}
if (result0 !== null) {
pos2 = clone(pos);
if (input.charCodeAt(pos.offset) === 35) {
result1 = "#";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"#\"");
}
}
if (result1 !== null) {
result2 = parse_identifier();
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = clone(pos2);
}
} else {
result1 = null;
pos = clone(pos2);
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = [];
pos2 = clone(pos);
pos3 = clone(pos);
if (input.charCodeAt(pos.offset) === 46) {
result3 = ".";
advance(pos, 1);
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result3 !== null) {
result4 = parse_identifier();
if (result4 !== null) {
result3 = [result3, result4];
} else {
result3 = null;
pos = clone(pos3);
}
} else {
result3 = null;
pos = clone(pos3);
}
if (result3 !== null) {
result3 = (function(offset, line, column, without_dot) {return without_dot;})(pos2.offset, pos2.line, pos2.column, result3[1]);
}
if (result3 === null) {
pos = clone(pos2);
}
while (result3 !== null) {
result2.push(result3);
pos2 = clone(pos);
pos3 = clone(pos);
if (input.charCodeAt(pos.offset) === 46) {
result3 = ".";
advance(pos, 1);
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\".\"");
}
}
if (result3 !== null) {
result4 = parse_identifier();
if (result4 !== null) {
result3 = [result3, result4];
} else {
result3 = null;
pos = clone(pos3);
}
} else {
result3 = null;
pos = clone(pos3);
}
if (result3 !== null) {
result3 = (function(offset, line, column, without_dot) {return without_dot;})(pos2.offset, pos2.line, pos2.column, result3[1]);
}
if (result3 === null) {
pos = clone(pos2);
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, classes, id, classes2) {return {
'classes': classes.concat(classes2),
'id': id == "" ? null : id[1]
};})(pos0.offset, pos0.line, pos0.column, result0[0], result0[1], result0[2]);
}
if (result0 === null) {
pos = clone(pos0);
}
return result0;
}
function parse_attributes() {
var result0, result1, result2, result3, result4, result5, result6, result7, result8;
var pos0, pos1, pos2, pos3;
reportFailures++;
pos0 = clone(pos);
if (input.substr(pos.offset, 2) === "()") {
result0 = "()";
advance(pos, 2);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"()\"");
}
}
if (result0 !== null) {
result0 = (function(offset, line, column) {return {};})(pos0.offset, pos0.line, pos0.column);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
if (input.charCodeAt(pos.offset) === 40) {
result0 = "(";
advance(pos, 1);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = [];
result2 = parse_newline_token();
while (result2 !== null) {
result1.push(result2);
result2 = parse_newline_token();
}
if (result1 !== null) {
result2 = [];
result3 = parse_whitespace();
while (result3 !== null) {
result2.push(result3);
result3 = parse_whitespace();
}
if (result2 !== null) {
result3 = parse_attribute();
if (result3 !== null) {
result4 = [];
pos2 = clone(pos);
pos3 = clone(pos);
result5 = parse_attribute_separator();
if (result5 !== null) {
result6 = [];
result7 = parse_newline_token();
while (result7 !== null) {
result6.push(result7);
result7 = parse_newline_token();
}
if (result6 !== null) {
result7 = [];
result8 = parse_whitespace();
while (result8 !== null) {
result7.push(result8);
result8 = parse_whitespace();
}
if (result7 !== null) {
result8 = parse_attribute();
if (result8 !== null) {
result5 = [result5, result6, result7, result8];
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
if (result5 !== null) {
result5 = (function(offset, line, column, attr) {return attr;})(pos2.offset, pos2.line, pos2.column, result5[3]);
}
if (result5 === null) {
pos = clone(pos2);
}
while (result5 !== null) {
result4.push(result5);
pos2 = clone(pos);
pos3 = clone(pos);
result5 = parse_attribute_separator();
if (result5 !== null) {
result6 = [];
result7 = parse_newline_token();
while (result7 !== null) {
result6.push(result7);
result7 = parse_newline_token();
}
if (result6 !== null) {
result7 = [];
result8 = parse_whitespace();
while (result8 !== null) {
result7.push(result8);
result8 = parse_whitespace();
}
if (result7 !== null) {
result8 = parse_attribute();
if (result8 !== null) {
result5 = [result5, result6, result7, result8];
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
} else {
result5 = null;
pos = clone(pos3);
}
if (result5 !== null) {
result5 = (function(offset, line, column, attr) {return attr;})(pos2.offset, pos2.line, pos2.column, result5[3]);
}
if (result5 === null) {
pos = clone(pos2);
}
}
if (result4 !== null) {
result5 = [];
result6 = parse_newline_token();
while (result6 !== null) {
result5.push(result6);
result6 = parse_newline_token();
}
if (result5 !== null) {
result6 = [];
result7 = parse_whitespace();
while (result7 !== null) {
result6.push(result7);
result7 = parse_whitespace();
}
if (result6 !== null) {
if (input.charCodeAt(pos.offset) === 41) {
result7 = ")";
advance(pos, 1);
} else {
result7 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result7 !== null) {
result0 = [result0, result1, result2, result3, result4, result5, result6, result7];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, first_attr, next_attrs) {
var attrs = {};
attrs[first_attr.name] = first_attr.value;
for(var i in next_attrs)
attrs[next_attrs[i].name] = next_attrs[i].value;
return attrs;
})(pos0.offset, pos0.line, pos0.column, result0[3], result0[4]);
}
if (result0 === null) {
pos = clone(pos0);
}
}
reportFailures--;
if (reportFailures === 0 && result0 === null) {
matchFailed("attribute list");
}
return result0;
}
function parse_attribute_separator() {
var result0;
if (/^[, \t\r\n]/.test(input.charAt(pos.offset))) {
result0 = input.charAt(pos.offset);
advance(pos, 1);
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[, \\t\\r\\n]");
}
}
return result0;
}
function parse_attribute() {
var result0, result1, result2, result3, result4;
var pos0, pos1, pos2;
reportFailures++;
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_identifier();
if (result0 !== null) {
if (input.charCodeAt(pos.offset) === 33) {
result1 = "!";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"!\"");
}
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
if (input.charCodeAt(pos.offset) === 61) {
result2 = "=";
advance(pos, 1);
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"=\"");
}
}
if (result2 !== null) {
result3 = parse_quoted_string();
if (result3 !== null) {
pos2 = clone(pos);
reportFailures++;
if (input.charCodeAt(pos.offset) === 41) {
result4 = ")";
advance(pos, 1);
} else {
result4 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result4 === null) {
result4 = parse_attribute_separator();
}
reportFailures--;
if (result4 !== null) {
result4 = "";
pos = clone(pos2);
} else {
result4 = null;
}
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, name, escape, value) {return {'name': name, 'value': {'escape': escape != "!", 'text': value} }; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1], result0[3]);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_identifier();
if (result0 !== null) {
if (input.charCodeAt(pos.offset) === 33) {
result1 = "!";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\"!\"");
}
}
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
if (input.charCodeAt(pos.offset) === 61) {
result2 = "=";
advance(pos, 1);
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\"=\"");
}
}
if (result2 !== null) {
result3 = parse_attribute_code();
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
} else {
result0 = null;
pos = clone(pos1);
}
if (result0 !== null) {
result0 = (function(offset, line, column, name, escape, value) {return {'name': name, 'value': {'escape': escape != "!", 'code': value} }; })(pos0.offset, pos0.line, pos0.column, result0[0], result0[1], result0[3]);
}
if (result0 === null) {
pos = clone(pos0);
}
if (result0 === null) {
pos0 = clone(pos);
pos1 = clone(pos);
result0 = parse_identifier();
if (result0 !== null) {
pos2 = clone(pos);
reportFailures++;
if (input.charCodeAt(pos.offset) === 41) {
result1 = ")";
advance(pos, 1);
} else {
result1 = null;
if (reportFailures ===