Skip to content

Instantly share code, notes, and snippets.

@prettydiff
Created January 21, 2018 04:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save prettydiff/777bbc96d1ac5c226696de6acad481ba to your computer and use it in GitHub Desktop.
Save prettydiff/777bbc96d1ac5c226696de6acad481ba to your computer and use it in GitHub Desktop.
window.parseFramework={language:function framework_language(){"use strict";return},lexer:{},parse:{},parseerror:"",parser:function framework_parser(){"use strict";return}};/*
Parse Framework
*/
/*jslint node:true */
/*eslint-env node*/
/*eslint no-console: 0*/
/*global global, location*/
(function parse_init() {
"use strict";
let framework;
const parse = {
concat: function parse_concat(data, array) {
parse
.datanames
.forEach(function parse_concat_datanames(value) {
data[value] = data[value].concat(array[value]);
});
if (data === parse.data) {
parse.count = data.token.length - 1;
}
},
count: -1,
data: {
begin: [],
lexer: [],
lines: [],
presv: [],
stack: [],
token: [],
types: []
},
datanames: ["begin", "lexer", "lines", "presv", "stack", "token", "types"],
lineNumber: 1,
linesSpace: 0,
objectSort: function parse_objectSort(data) {
let cc = 0, dd = 0, ee = 0, ff = 0, behind = parse.count, commaTest = true, front = 0, keyend = 0, keylen = 0;
const keys = [], length = parse.count, lines = parse.linesSpace, sort = function parse_objectSort_sort(x, y) {
let xx = x[0], yy = y[0];
if (data.types[xx] === "comment" || data.types[xx] === "comment-inline") {
do {
xx = xx + 1;
} while (xx < length && (data.types[xx] === "comment" || data.types[xx] === "comment-inline"));
}
if (data.types[yy] === "comment" || data.types[yy] === "comment-inline") {
do {
yy = yy + 1;
} while (yy < length && (data.types[yy] === "comment" || data.types[yy] === "comment-inline"));
}
if (data.token[xx].toLowerCase() > data.token[yy].toLowerCase()) {
return 1;
}
return -1;
}, store = {
begin: [],
lexer: [],
lines: [],
presv: [],
stack: [],
token: [],
types: []
};
if (data.token[behind] === "," || data.types[behind] === "comment") {
do {
behind = behind - 1;
} while (behind > 0 && (data.token[behind] === "," || data.types[behind] === "comment"));
}
cc = behind;
if (cc > -1) {
do {
if (data.types[cc] === "end") {
dd = dd + 1;
}
if (data.types[cc] === "start") {
dd = dd - 1;
}
if (dd === 0) {
if (data.types[cc].indexOf("template") > -1) {
return;
}
if (data.token[cc] === ",") {
commaTest = true;
front = cc + 1;
}
if (commaTest === true && data.token[cc] === "," && front < behind) {
if (data.token[behind] !== ",") {
behind = behind + 1;
}
if (data.types[front] === "comment-inline") {
front = front + 1;
}
keys.push([front, behind]);
behind = front - 1;
}
}
if (dd < 0 && cc < parse.count) {
if (keys.length > 0 && keys[keys.length - 1][0] > cc + 1) {
ee = keys[keys.length - 1][0];
if (data.types[ee - 1] !== "comment-inline") {
ee = ee - 1;
}
keys.push([
cc + 1,
ee
]);
}
if (data.token[cc - 1] === "=" || data.token[cc - 1] === ":" || data.token[cc - 1] === "(" || data.token[cc - 1] === "[" || data.token[cc - 1] === "," || data.types[cc - 1] === "word" || cc === 0) {
if (keys.length > 1) {
keys.sort(sort);
keylen = keys.length;
commaTest = false;
dd = 0;
if (dd < keylen) {
do {
keyend = keys[dd][1];
if (data.lines[keys[dd][0] - 1] > 1 && store.lines.length > 0) {
store.lines[store.lines.length - 1] = data.lines[keys[dd][0] - 1];
}
ee = keys[dd][0];
if (ee < keyend) {
do {
parse.push(store, {
begin: data.begin[ee],
lexer: data.lexer[ee],
lines: data.lines[ee],
presv: data.presv[ee],
stack: data.stack[ee],
token: data.token[ee],
types: data.types[ee]
}, "");
ff = ff + 1;
//remove extra commas
if (data.token[ee] === ",") {
commaTest = true;
}
else if (data.token[ee] !== "," && data.types[ee] !== "comment" && data.types[ee] !== "comment-inline") {
commaTest = false;
}
ee = ee + 1;
} while (ee < keyend);
}
if (commaTest === false && dd < keylen - 1) {
ee = store.types.length - 1;
if (store.types[ee] === "comment" || store.types[ee] === "comment-inline") {
do {
ee = ee - 1;
} while (ee > 0 && (store.types[ee] === "comment" || store.types[ee] === "comment-inline"));
}
ee = ee + 1;
parse.splice({
data: store,
howmany: 0,
index: ee,
record: {
begin: parse.structure[parse.structure.length - 1][1],
lexer: store.lexer[ee - 1],
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: ",",
types: "separator"
}
});
store.lines[ee - 1] = 0;
ff = ff + 1;
}
dd = dd + 1;
} while (dd < keylen);
}
ee = store.types.length;
do {
ee = ee - 1;
} while (ee > 0 && (store.types[ee] === "comment" || store.types[ee] === "comment-inline"));
parse.splice({
data: data,
howmany: ff,
index: cc + 1,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
parse.linesSpace = lines;
return parse.concat(data, store);
}
}
return;
}
cc = cc - 1;
} while (cc > -1);
}
return;
},
options: {
correct: false,
crlf: false,
lang: "javascript",
lexer: "script",
lexerOptions: {
script: {}
},
outputFormat: "arrays",
source: ""
},
pop: function parse_pop(data) {
const output = {
begin: data.begin.pop(),
lexer: data.lexer.pop(),
lines: data.lines.pop(),
presv: data.presv.pop(),
stack: data.stack.pop(),
token: data.token.pop(),
types: data.types.pop()
};
if (data === parse.data) {
parse.count = parse.count - 1;
}
return output;
},
push: function parse_push(data, record, structure) {
parse
.datanames
.forEach(function parse_push_datanames(value) {
data[value].push(record[value]);
});
if (data === parse.data) {
parse.count = parse.count + 1;
parse.linesSpace = 0;
if (record.types === "start" || record.types.indexOf("_start") > 0) {
parse.structure.push([structure, parse.count]);
}
else if (record.types === "end" || record.types.indexOf("_end") > 0) {
parse.structure.pop();
}
else if (record.types === "else" || record.types.indexOf("_else") > 0) {
parse.structure[parse.structure.length - 1] = ["else", parse.count];
}
}
},
safeSort: function parse_safeSort(array, operation, recursive) {
let extref = function parse_safeSort_extref(item) {
//worthless function for backwards compatibility with older versions of V8 node.
return item;
};
const arTest = function parse_safeSort_arTest(item) {
if (Array.isArray(item) === true) {
return true;
}
return false;
}, normal = function parse_safeSort_normal(item) {
let storeb = item;
const done = [item[0]], child = function safeSort_normal_child() {
let a = 0;
const len = storeb.length;
if (a < len) {
do {
if (arTest(storeb[a]) === true) {
storeb[a] = parse_safeSort_normal(storeb[a]);
}
a = a + 1;
} while (a < len);
}
}, recurse = function parse_safeSort_normal_recurse(x) {
let a = 0;
const storea = [], len = storeb.length;
if (a < len) {
do {
if (storeb[a] !== x) {
storea.push(storeb[a]);
}
a = a + 1;
} while (a < len);
}
storeb = storea;
if (storea.length > 0) {
done.push(storea[0]);
extref(storea[0]);
}
else {
if (recursive === true) {
child();
}
item = storeb;
}
};
extref = recurse;
recurse(array[0]);
return item;
}, descend = function parse_safeSort_descend(item) {
let c = 0;
const len = item.length, storeb = item, child = function parse_safeSort_descend_child() {
let a = 0;
const lenc = storeb.length;
if (a < lenc) {
do {
if (arTest(storeb[a]) === true) {
storeb[a] = parse_safeSort_descend(storeb[a]);
}
a = a + 1;
} while (a < lenc);
}
}, recurse = function parse_safeSort_descend_recurse(value) {
let a = c, b = 0, d = 0, e = 0, ind = [], key = storeb[c], tstore = "";
const tkey = typeof key;
if (a < len) {
do {
tstore = typeof storeb[a];
if (storeb[a] > key || (tstore > tkey)) {
key = storeb[a];
ind = [a];
}
else if (storeb[a] === key) {
ind.push(a);
}
a = a + 1;
} while (a < len);
}
d = ind.length;
a = c;
b = d + c;
if (a < b) {
do {
storeb[ind[e]] = storeb[a];
storeb[a] = key;
e = e + 1;
a = a + 1;
} while (a < b);
}
c = c + d;
if (c < len) {
extref("");
}
else {
if (recursive === true) {
child();
}
item = storeb;
}
return value;
};
extref = recurse;
recurse("");
return item;
}, ascend = function parse_safeSort_ascend(item) {
let c = 0;
const len = item.length, storeb = item, child = function parse_safeSort_ascend_child() {
let a = 0;
const lenc = storeb.length;
if (a < lenc) {
do {
if (arTest(storeb[a]) === true) {
storeb[a] = parse_safeSort_ascend(storeb[a]);
}
a = a + 1;
} while (a < lenc);
}
}, recurse = function parse_safeSort_ascend_recurse(value) {
let a = c, b = 0, d = 0, e = 0, ind = [], key = storeb[c], tstore = "";
const tkey = typeof key;
if (a < len) {
do {
tstore = typeof storeb[a];
if (storeb[a] < key || tstore < tkey) {
key = storeb[a];
ind = [a];
}
else if (storeb[a] === key) {
ind.push(a);
}
a = a + 1;
} while (a < len);
}
d = ind.length;
a = c;
b = d + c;
if (a < b) {
do {
storeb[ind[e]] = storeb[a];
storeb[a] = key;
e = e + 1;
a = a + 1;
} while (a < b);
}
c = c + d;
if (c < len) {
extref("");
}
else {
if (recursive === true) {
child();
}
item = storeb;
}
return value;
};
extref = recurse;
recurse("");
return item;
};
if (arTest(array) === false) {
return array;
}
if (operation === "normal") {
return normal(array);
}
if (operation === "descend") {
return descend(array);
}
return ascend(array);
},
spacer: function parse_spacer(args) {
// * array - the characters to scan
// * index - the index to start scanning from
// * end - the length of the array, to break the loop
parse.linesSpace = 1;
do {
if (args.array[args.index] === "\n") {
parse.linesSpace = parse.linesSpace + 1;
parse.lineNumber = parse.lineNumber + 1;
}
if ((/\s/).test(args.array[args.index + 1]) === false) {
break;
}
args.index = args.index + 1;
} while (args.index < args.end);
return args.index;
},
splice: function parse_splice(spliceData) {
// * data - The data object to alter
// * howmany - How many indexes to remove
// * index - The index where to start
// * record - A new record to insert
if (spliceData.record.token !== "") {
parse
.datanames
.forEach(function parse_splice_datanames(value) {
spliceData
.data[value]
.splice(spliceData.index, spliceData.howmany, spliceData.record[value]);
});
if (spliceData.data === parse.data) {
parse.count = (parse.count - spliceData.howmany) + 1;
parse.linesSpace = 0;
}
return;
}
parse
.datanames
.forEach(function parse_splice_datanames(value) {
spliceData
.data[value]
.splice(spliceData.index, spliceData.howmany);
});
if (spliceData.data === parse.data) {
parse.count = parse.count - spliceData.howmany;
parse.linesSpace = 0;
}
},
structure: [["global", -1]]
}, parser = function parser_(options) {
parse.count = -1;
parse.data = {
begin: [],
lexer: [],
lines: [],
presv: [],
stack: [],
token: [],
types: []
};
parse.datanames = [
"begin",
"lexer",
"lines",
"presv",
"stack",
"token",
"types"
];
parse.linesSpace = 0;
parse.lineNumber = 1;
parse.structure = [
["global", -1]
];
parse.options = options;
parse.structure.pop = function parse_structure_pop() {
const len = parse.structure.length - 1, arr = parse.structure[len];
if (len > 0) {
parse
.structure
.splice(len, 1);
}
return arr;
};
if (framework.lexer[options.lexer] === undefined) {
framework.parseerror = "Lexer '" + options.lexer + "' isn't available.";
}
if (typeof framework.lexer[options.lexer] !== "function") {
framework.parseerror = "Specified lexer, " + options.lexer + ", is not a function.";
}
else {
framework.parseerror = "";
options.lexerOptions = (options.lexerOptions || {});
Object.keys(framework.lexer).forEach(function parse_lexers(value) {
options.lexerOptions[value] = (options.lexerOptions[value] || {});
});
// This line parses the code using a lexer file
framework.lexer[options.lexer](options.source + " ");
}
// validate that all the data arrays are the same length
(function parser_checkLengths() {
let a = 0, b = 0;
const keys = Object.keys(parse.data), c = keys.length;
do {
b = a + 1;
do {
if (parse.data[keys[a]].length !== parse.data[keys[b]].length) {
framework.parseerror = "'" + keys[a] + "' array is of different length than '" +
keys[b] + "'";
break;
}
b = b + 1;
} while (b < c);
a = a + 1;
} while (a < c - 1);
}());
if ((parse.options.lexerOptions[options.lexer] !== undefined && parse.options.lexerOptions[options.lexer].objectSort === true) || (parse.options.lexerOptions.markup !== undefined && parse.options.lexerOptions.markup.tagSort === true)) {
let a = 0;
const data = parse.data, b = data.begin.length, structure = [-1];
do {
if ((data.types[a - 1] === "attribute" || data.types[a - 1] === "jsx_attribute_end") && data.types[a] !== "attribute" && data.types[a] !== "jsx_attribute_start" && data.lexer[a - 1] === "markup" && data.types[data.begin[a - 1]] === "singleton") {
structure.pop();
}
if (data.begin[a] !== structure[structure.length - 1]) {
if (parse.options.lexerOptions[options.lexer].objectSort === true && (data.lexer[a] === "script" || data.lexer[a] === "style")) {
data.begin[a] = structure[structure.length - 1];
}
else if (parse.options.lexerOptions.markup.tagSort === true && data.lexer[a] === "markup") {
data.begin[a] = structure[structure.length - 1];
}
}
if (data.types[a] === "start" || data.types[a] === "template_start" || (data.types[a] === "cdata" && data.token[data.begin[a - 1]].toLowerCase().indexOf("<script") === 0)) {
structure.push(a);
}
else if (structure.length > 1 && (data.types[a] === "end" || data.types[a] === "template_end")) {
structure.pop();
}
else if (data.types[a] === "template_else") {
structure[structure.length - 1] = a;
}
else if (data.types[a] === "attribute" && data.lexer[a] === "markup" && (data.types[a - 1] === "start" || data.types[a - 1] === "singleton")) {
structure.push(a - 1);
}
else if (data.lexer[a] === "markup" && data.types[a] !== "attribute" && data.types[structure[structure.length - 1] + 1] === "attribute") {
structure.pop();
}
a = a + 1;
} while (a < b);
}
}, parserArrays = function parserArrays(options) {
parser(options);
return parse.data;
}, parserObjects = function parserObjects(options) {
let a = 0;
const data = [];
parser(options);
do {
data.push({
begin: parse.data.begin[a],
lexer: parse.data.lexer[a],
lines: parse.data.lines[a],
presv: parse.data.presv[a],
stack: parse.data.stack[a],
token: parse.data.token[a],
types: parse.data.types[a]
});
a = a + 1;
} while (a < parse.count);
return data;
};
window.parseFramework = (window.parseFramework || {
lexer: {},
parse: parse,
parseerror: "",
parserArrays: parserArrays,
parserObjects: parserObjects
});
framework = window.parseFramework;
framework.parse = parse;
framework.parserArrays = parserArrays;
framework.parserObjects = parserObjects;
}());window.parseFramework.parse.options.lexerOptions.markdown={};window.parseFramework.parse.options.lexerOptions.markup={};window.parseFramework.parse.options.lexerOptions.script={};window.parseFramework.parse.options.lexerOptions.style={};/*global global*/
(function markdown_init() {
"use strict";
const framework = window.parseFramework, markdown = function lexer_markdown(source) {
let a = 0, b = 0, bc1 = 0, bc2 = 0, quote = "", stack = [];
const parse = framework.parse, data = parse.data, options = parse.options, lines = (options.crlf === true)
? source.replace(/\u0000/g, "\ufffd").split("\r\n")
: source.replace(/\u0000/g, "\ufffd").split("\n"), hr = function lexer_markdown_hr() {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<hr/>",
types: "singleton"
}, "");
}, text = function lexer_markdown_text(item, tag, listrecurse) {
let tagend = tag.replace("<", "</"), struct = tag.replace("<", "").replace(/(\/?>)$/, "");
// line containing strong, em, or inline code
if (item.indexOf("*") > -1 || item.indexOf("`") > -1 || (item.indexOf("[") > -1 && item.indexOf("](") > -1)) {
const esctest = function lexer_markdown_text_esctest() {
let bb = aa - 1;
if (str[bb] === "\\") {
do {
bb = bb - 1;
} while (str[bb] === "\\");
if ((aa - bb) % 2 === 1) {
return true;
}
return false;
}
return false;
}, gencontent = function lexer_markdown_text_gencontent() {
return itemx.join("").replace(/\s+/g, " ").replace(/^\s/, "").replace(/\s$/, "").replace(/\\(?!(\\))/g, "").replace(/\\{2}/g, "\\");
};
let stray = "", str = item.split(""), content = "", itemx = [], square = 0, aa = 0, bb = str.length, cc = 0;
if (tag !== "multiline") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tag,
types: "start"
}, struct);
}
do {
if (str[aa] === "[" && esctest() === false) {
cc = aa;
square = 0;
do {
if (str[cc] === "[") {
square = square + 1;
}
else if (str[cc] === "]") {
square = square - 1;
if (square < 1 && str[cc + 1] === "(") {
content = itemx.join("").replace(/\s+/g, " ").replace(/^\s/, "").replace(/\s$/, "");
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
itemx = [];
stack.push("[");
if (str[aa - 1] === "!") {
content = "img";
}
else {
content = "a";
}
if (content === "img") {
if (data.token[parse.count] === "!") {
parse.pop(data);
}
else if (data.types[parse.count] === "content") {
data.token[parse.count] = data.token[parse.count].slice(0, data.token[parse.count].length - 1).replace(/(\s)$/, "");
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<img/>",
types: "singleton"
}, "");
content = str.slice(aa + 1, cc).join("").replace(/\s+/g, " ").replace(/^\s/, "").replace(/\s$/, "");
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "alt=\"" + content + "\"",
types: "attribute"
}, "");
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "src=\"",
types: "attribute"
}, "");
aa = cc - 1;
}
else {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<a>",
types: "start"
}, "a");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "href=\"",
types: "attribute"
}, "");
}
break;
}
}
cc = cc + 1;
} while (cc < bb);
}
else if (str[aa] === "]" && str[aa + 1] === "(" && esctest() === false && stack[stack.length - 1] === "[") {
content = gencontent();
if (content !== "" && content.length > 1 && parse.structure[parse.structure.length - 1][0] !== "img") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
cc = aa + 1;
square = 0;
do {
if (str[cc] === "(") {
square = square + 1;
}
else if (str[cc] === ")") {
square = square - 1;
if (square === 0) {
content = str.slice(aa + 2, cc).join("").replace(/\s+/g, " ").replace(/^\s/, "").replace(/\s$/, "");
aa = cc + 1;
itemx = [];
cc = (parse.structure[parse.structure.length - 1][0] === "a")
? parse.structure[parse.structure.length - 1][1] + 1
: parse.count;
if (content === "") {
data.token[cc] = data.token[cc] + "\"";
}
else {
data.token[cc] = data.token[cc] + content + "\"";
}
break;
}
}
cc = cc + 1;
} while (cc < bb);
stack.pop();
if (parse.structure[parse.structure.length - 1][0] === "a") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</a>",
types: "end"
}, "");
}
}
else if ((str[aa] === "*" || str[aa] === "~") &&
esctest() === false &&
stack[stack.length - 1] !== "`" &&
((quote === "" && ((/\s/).test(str[aa - 1]) === true ||
aa === 0)) || (quote === "**" && ((/\s/).test(str[aa + 2]) === true ||
aa === bb - 2)) || (quote !== "" && ((/\s/).test(str[aa + 1]) === true ||
aa === bb - 1)))) {
if (str[aa] === "~") {
quote = "~";
do {
str[aa] = "";
aa = aa + 1;
} while (str[aa] === "~");
}
else if (str[aa + 1] === "*") {
quote = "**";
str[aa + 1] = "";
}
else {
quote = "*";
}
str[aa] = "";
if (quote === stack[stack.length - 1]) {
let midtag = "</em>";
content = gencontent();
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
itemx = [];
if (quote === "~") {
midtag = "</strike>";
}
else if (quote === "**") {
midtag = "</strong>";
}
stack.pop();
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: midtag,
types: "end"
}, "");
quote = "";
stack = [];
}
else {
let midtag = "em";
content = gencontent();
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
itemx = [];
if (quote === "~") {
midtag = "strike";
}
else if (quote === "**") {
midtag = "strong";
}
stack.push(quote);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<" + midtag + ">",
types: "start"
}, midtag);
}
}
else if (str[aa] === "`" && esctest() === false) {
content = gencontent();
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
itemx = [];
if (stack[stack.length - 1] === "`") {
str[aa] = "";
stack.pop();
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</code>",
types: "end"
}, "");
quote = "";
stack = [];
}
else {
stack.push("`");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<code>",
types: "start"
}, "code");
}
}
if (str[aa] !== stack[stack.length - 1] && str[aa - 1] + str[aa] !== stack[stack.length - 1]) {
itemx.push(str[aa]);
}
aa = aa + 1;
} while (aa < bb);
content = gencontent();
if (tag !== "multiline" && data.types[parse.count] === "start" && data.token[parse.count] !== tag) {
stray = data.token[parse.count];
parse.pop(data);
parse.structure.pop();
if (stray === "<code>") {
stray = "`";
}
else if (stray === "<em>") {
stray = "*";
}
else if (stray === "<strong>") {
stray = "**";
}
else if (stray === "<strike>") {
stray = "~";
}
if (data.types[parse.count] === "start") {
content = item;
}
else {
data.token[parse.count] = data.token[parse.count] + stray;
}
}
if (content !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 1,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: content,
types: "content"
}, "");
}
if (listrecurse === true) {
list();
}
if (tag !== "multiline") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tagend,
types: "end"
}, "");
quote = "";
stack = [];
}
return;
}
if (struct.indexOf(" ") > 0) {
struct = struct.slice(0, struct.indexOf(" "));
}
if (tag !== "multiline") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tag,
types: "start"
}, struct);
}
if (listrecurse === true) {
list();
}
else {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: item.replace(/^(\s+)/, "").replace(/(\s+)$/, ""),
types: "content"
}, "");
}
if (tag !== "multiline") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tagend,
types: "end"
}, "");
quote = "";
stack = [];
}
}, comtest = function lexer_markdown_comtest(index) {
return (/^(\s{0,3}<!--)/).test(lines[index]);
}, hrtest = function lexer_markdown_hrtest(index) {
return (/^(\s*((-\s*){3,}|(_\s*){3,}|(\*\s*){3,})\s*)$/).test(lines[index]);
}, codetest = function lexer_markdown_codetest(index) {
return ((/^(\u0020{4,}\s*\S)/).test(lines[index]) === true || (/^(\s*\t\s*\S)/).test(lines[index]) === true);
}, codeblocktest = function lexer_markdown_codeblocktest(index) {
return (/^(\s*((`{3,})|(~{3,}))+(\S+)?\s*)$/).test(lines[index]);
}, listtest = function lexer_markdown_listtest(index) {
const listy = (/^(\s*(\*|-|\+|(\d{1,9}(\)|\.))))/);
if (listy.test(lines[index]) === true) {
const listr = lines[index].replace(listy, "");
if (listr === "") {
lines[index] = lines[index] + " ";
}
else if ((/\s/).test(listr.charAt(0)) === false) {
return false;
}
return true;
}
return false;
}, comment = function lexer_markdown_comment() {
const com = [];
let comment = "";
if (lines[a].indexOf("-->") < 0) {
do {
com.push(lines[a]);
a = a + 1;
} while (a < b && lines[a].indexOf("-->") < 0);
}
else {
com.push(lines[a]);
}
if (options.crlf === true) {
comment = com.join("\r\n").replace(/^(\s*<!--+\s*)/, "").replace(/\s*-+->/, "-->");
}
else {
comment = com.join("\n").replace(/^(\s*<!--+\s*)/, "").replace(/\s*-+->/, "-->");
}
comment = comment.slice(0, comment.indexOf("-->"));
if (lines[a] !== undefined) {
lines[a] = lines[a].slice(lines[a].indexOf("-->") + 3);
if (lines[a].replace(/\s+/, "") !== "") {
a = a - 1;
}
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: comment,
types: "comment"
}, "");
}, code = function lexer_markdown_code(codetext, language, fourspace) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<p>",
types: "start"
}, "p");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<code>",
types: "start"
}, "code");
if (language !== "") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "class=\"language-" + language + "\"",
types: "attribute"
}, "");
}
if (codetext !== "") {
if (fourspace === true) {
if (codetext.indexOf(" ") === 0) {
codetext = codetext.replace(/^(\u0020{4})/, "");
}
else {
codetext = codetext.replace(/^(\s*\t)/, "");
}
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: codetext,
types: "content"
}, "");
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</code>",
types: "end"
}, "");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</p>",
types: "end"
}, "");
}, codeblock = function lexer_markdown_codeblock(ticks, blockyquote, fourspace) {
const indentstr = (function lexer_markdown_codeblock() {
let inumb = (ticks === true)
? (/^(\s*)/).exec(lines[a])[0].length
: 0;
if (inumb > 3) {
return 0;
}
return inumb;
}()), indent = new RegExp("^(\\s{0," + indentstr + "})"), language = (ticks === true)
? lines[a].replace(/\s*((`+)|(~+))\s*/, "").replace(/\s*/g, "")
: "", tilde = (/^(\s*`)/).test(lines[a]) === false, cchar = (tilde === true)
? "~"
: "`", len = lines[a].split(cchar).length - 1, endgate = new RegExp("^((\\s{0," + indentstr + "})?\\s*" + cchar + "{" + len + ",}\\s*)$"), codes = [];
if (ticks === true) {
a = a + 1;
if (endgate.test(lines[a]) === true) {
code("", language, false);
return;
}
}
do {
if (lines[a] === undefined) {
break;
}
if (lines[a] !== "") {
if (ticks === true) {
if (endgate.test(lines[a]) === true && (/^(\u0020{4})/).test(lines[a]) === false) {
break;
}
codes.push(lines[a].replace(indent, ""));
}
else {
codes.push(lines[a].replace(/^(\u0020{4})/, "").replace(/^(\s*\t)/, ""));
if (lines[a + 1] !== "" && codetest(a + 1) === false) {
break;
}
if (lines[a + 1] === "" && codetest(a + 2) === false) {
a = a + 1;
break;
}
}
}
else {
if (codetest(a + 1) === false) {
break;
}
codes.push("");
}
if (blockyquote === true && (/^(\s*>)/).test(lines[a + 1]) === false) {
break;
}
a = a + 1;
} while (a < b);
if (options.crlf === true) {
code(codes.join("\r\n"), language, fourspace);
}
else {
code(codes.join("\n"), language, fourspace);
}
}, parabuild = function lexer_markdown_parabuild() {
let x = a, tag = "<p>";
const test = function lexer_markdown_parabuild_test(index) {
if (lines[index] === undefined) {
return false;
}
if ((/^(\s{0,3}((=+)|(-+))\s*)$/).test(lines[index]) === true) {
if (lines[index].indexOf("=") > -1) {
tag = "<h1>";
}
else {
tag = "<h2>";
}
return false;
}
if (hrtest(index) === true) {
return false;
}
if ((/^(\s*((`{3,})|(~{3,}))+(\S+)?\s*)$/).test(lines[index]) === true) {
return false;
}
if (lines[index] === "") {
return false;
}
if ((/^(\s*>)/).test(lines[index]) === true) {
return false;
}
if ((/^(\s*#{1,6}\s)/).test(lines[index]) === true) {
return false;
}
return true;
}, fixquote = function lexer_markdown_parabuild_fixquote() {
let key = "", x = parse.count;
if (quote === "*") {
key = "<em>";
}
else if (quote === "**") {
key = "<strong>";
}
else if (quote === "~") {
key = "<strike>";
}
parse.structure.pop();
if (data.token[x] !== key) {
do {
data.begin[x] = parse.structure[parse.structure.length - 1][1];
data.stack[x] = parse.structure[parse.structure.length - 1][0];
x = x - 1;
} while (x > 0 && data.token[x] !== key);
}
if (data.types[x + 1] === "content") {
data.token[x + 1] = quote + " " + data.token[x + 1];
parse.splice({
data: data,
howmany: 1,
index: x,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
}
else if (data.types[x - 1] === "content") {
data.token[x - 1] = data.token[x - 1] + quote;
parse.splice({
data: data,
howmany: 1,
index: x,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
}
else {
data.token[x] = quote;
data.types[x] = "content";
}
quote = "";
};
if (test(a + 1) === true) {
do {
x = x + 1;
} while (x < b && test(x) === true);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tag,
types: "start"
}, tag.replace("<", "").replace(">", ""));
if (x === a + 1) {
text(lines[a], tag, false);
}
else {
do {
text(lines[a], "multiline", false);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<br/>",
types: "singleton"
}, "");
a = a + 1;
} while (a < x);
parse.pop(data);
if (quote !== "") {
fixquote();
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: tag.replace("<", "</"),
types: "end"
}, "");
}
}
else {
text(lines[a], tag, false);
if (tag !== "<p>") {
a = a + 1;
}
}
quote = "";
stack = [];
}, heading = function lexer_markdown_heading() {
let hash = (/^(\s*#+\s+)/).exec(lines[a])[0].replace(/\s+/g, ""), hashes = function lexer_markdown_heading_hasheds(escapes) {
return escapes.replace(/\\/g, "").replace(/\s+/g, "");
}, content = lines[a].replace(/^(\s*#+\s+)/, "").replace(/(\s+#+\s*)$/, "").replace(/((\\?#)+\s*)$/, hashes);
if (content === "" || (/^(#+)$/).test(content) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<h" + hash.length + ">",
types: "start"
}, "h" + hash.length);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</h" + hash.length + ">",
types: "end"
}, "");
}
else {
text(content, "<h" + hash.length + ">", false);
}
}, blockquote = function lexer_markdown_blockquote() {
let x = a;
bc1 = bc1 + 1;
bc2 = bc1;
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<blockquote>",
types: "start"
}, "blockquote");
do {
lines[x] = lines[x].replace(/^(\s*>\u0020?)/, "");
if (listtest(x + 1) === true) {
break;
}
if (lines[x].replace(/\s+/, "") === "") {
lines[x] = "";
if ((/^(\s*>)/).test(lines[x + 1]) === false) {
break;
}
}
if ((/^(\s{0,3}((-{3,})|(={3,}))\s*)$/).test(lines[x + 1]) === true) {
break;
}
x = x + 1;
} while (x < b && lines[x] !== "" && codetest(x) === false && hrtest(x) === false);
if (x < b - 1 && x > 0) {
if (listtest(x) === true) {
lines.splice(x + 1, 0, "");
b = b + 1;
}
else if (lines[x].replace(/\s+/, "") !== "") {
x = x - 1;
}
}
do {
if ((/^(\s*>)/).test(lines[a]) === true) {
blockquote();
}
else if ((/^(\s*((`{3,})|(~{3,}))+(\S+)?\s*)$/).test(lines[a]) === true) {
if (a + 1 < x) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<p>",
types: "start"
}, "p");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<code>",
types: "start"
}, "code");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</code>",
types: "end"
}, "");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</p>",
types: "end"
}, "");
lines[a] = "";
break;
}
codeblock(true, true, false);
}
else if (codetest(a) === true) {
codeblock(false, true, true);
}
else if ((/^(\s*#{1,6}\s)/).test(lines[a]) === true) {
heading();
}
else if (listtest(a) === true) {
list();
}
else if (a > x && (/^(\s{0,3}((-{3,})|(={3,}))\s*)$/).test(lines[a + 1]) === true) {
text(lines[a], "<p>", false);
}
else if (lines[a].replace(/\s+/, "") !== "") {
parabuild();
}
a = a + 1;
} while (a < x);
if (lines[a - 1] === "" || lines[a] !== "" || (a > x && (/^(\s{0,3}((-{3,})|(={3,}))\s*)$/).test(lines[a]) === true)) {
a = a - 1;
}
bc1 = bc1 - 1;
if (bc1 === 0) {
do {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</blockquote>",
types: "end"
}, "");
bc2 = bc2 - 1;
} while (bc2 > 0);
}
}, list = function lexer_markdown_list() {
let paraForce = false, ind = 0, sym = lines[a].replace(/^(\s+)/, "").charAt(0), record = {
begin: -1,
lexer: "markdown",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}, numb = "", lasttext = "", y = 0, z = 0, order = false, end;
const tabs = function lexer_markdown_list_tabs(spaces) {
let output = spaces.split(""), uu = 0;
const tt = output.length;
do {
if (output[uu] === "\t") {
output[uu] = " ";
}
uu = uu + 1;
} while (uu < tt);
return output.join("");
}, checktest = function lexer_markdown_list_checktest() {
return ((/^(\s*(\*|-|\+)?\s{0,3}\[( |x)\]\s*)$/).test(lines[a]) === true || (/^(\s*(\*|-|\+)?\s{0,3}\[( |x)\]\s+\S)/).test(lines[a]) === true);
}, indentation = (/^(\s*(\*|-|\+)?\s*)/), indlen = function lexer_markdown_list_indlen(index) {
if (lines[index] === undefined) {
return 0;
}
return indentation.exec(lines[index].replace(indentation, tabs))[0].length;
}, space = function lexer_markdown_list_space(index, emptyLine) {
let xind = indlen(index), xsym = (lines[index] === undefined)
? ""
: lines[index].replace(/^(\s+)/, "").charAt(0);
if (lines[index] === undefined) {
return 0;
}
if (order === true) {
xind = (/^(\s*(\d+(\)|\.)))?\s*/).exec(lines[index])[0].length;
xsym = lines[index].replace(/^(\s*\d+)/, "").charAt(0);
}
if (order === false && "*-+".indexOf(xsym) > -1 && xsym !== sym && xind - ind < 2 && (/\s/).test(lines[index].replace(/^(\s+)/, "").charAt(1)) === true) {
return -1;
}
if (xind - ind < 0) {
return xind;
}
if (xsym !== sym && listtest(index) === true && (emptyLine === false || (emptyLine === true && xind - ind < 2))) {
return 10;
}
return xind;
};
if ((/^(\s{0,3}\d{1,9}(\)|\.)\s)/).test(lines[a]) === true) {
order = true;
ind = (/^(\s*(\d+(\)|\.)))?\s*/).exec(lines[a])[0].length;
sym = lines[a].replace(/^(\s*\d+)/, "").charAt(0);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<ol>",
types: "start"
}, "ol");
numb = (/\d{1,9}/).exec(lines[a])[0].replace(/^(0+)/, "");
if (numb !== "1") {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "start=\"" + numb + "\"",
types: "attribute"
}, "");
}
}
else {
ind = indlen(a);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<ul>",
types: "start"
}, "ul");
}
do {
paraForce = false;
// lists do not contain comments
if (comtest(a) === true) {
a = a - 1;
break;
}
// an ordered list may not have unordered list items
if (order === true && (/^(\s{0,3}(\*|-|\+)\s)/).test(lines[a]) === true) {
a = a - 1;
break;
}
// an unordered list may not have ordered list items
if (order === false && (/^(\s{0,3}\d{1,9}(\)|\.)\s)/).test(lines[a]) === true) {
a = a - 1;
break;
}
numb = lines[a];
lines[a] = lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, "");
//recursive list item: - - foo
//console.log((space(a + 1, true) - ind)+" "+lines[a]);
if (listtest(a) === true) {
parse.structure.push(["ul", parse.count - 3]);
list();
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
y = parse.count - 1;
do {
data.begin[y] = data.begin[y] - 1;
y = y - 1;
} while (y > 0 && data.token[y + 1] !== "<li>");
parse.splice({
data: data,
howmany: 0,
index: y,
record: record
});
y = y + 1;
do {
if (data.types[y] === "start") {
data.begin[y] = y - 1;
data.stack[y] = data.token[y - 1].replace("<", "").replace(">", "");
z = y;
}
else {
data.begin[y] = z;
if (data.types[y] === "end") {
z = z - 1;
}
}
y = y + 1;
} while (y < parse.count + 1);
record.begin = z;
record.stack = "li";
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else if (lines[a] === "") {
y = space(a + 1, true) - ind;
if (y < 0) {
break;
}
if (y > 1 && a < b - 1 && lines[a + 1].replace(/\s+/, "").charAt(0) !== sym && (/^(\s{0,3}>)/).test(lines[a + 1]) === false) {
paraForce = true;
}
else if (codetest(a + 1) === false && (parse.structure.join("").indexOf("blockquote") > 0 || y !== 0) && a < b - 1) {
break;
}
}
else {
lines[a] = numb;
y = space(a, false) - ind;
if (y < -1 || y > 9 || hrtest(a) === true) {
z = (lines[a + 1] === "")
? a + 2
: a + 1;
if (z !== b && codetest(z) === false && listtest(z) === false && (/^\s*>/).test(lines[a]) === false) {
a = a - 1;
break;
}
}
if (data.token[parse.count - 1] === "<li>") {
paraForce = false;
if (lines[a - 1] === "") {
a = a - 1;
break;
}
}
else if (y < 1 && listtest(a) === false) {
paraForce = true;
y = 2;
}
if ((/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s*)$/).test(lines[a]) === true && lines[a + 1] === "") {
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
parse.push(data, record, "li");
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else if (y < -1) {
//different list type
lines.splice(a, 0, "");
b = b + 1;
break;
}
else if (y > 1) {
if ((/^(\s*>)/).test(lines[a]) === true) {
//blockquote in list item
end = parse.pop(data);
record.begin = end.begin;
record.stack = end.stack;
parse.structure.push([end.stack, end.begin]);
blockquote();
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else if (listtest(a) === true && (/^(\u0020{4,}\s*\S)/).test(lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s)/, "").replace(/^\t/, " ")) === true) {
//code line in list item
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
parse.push(data, record, "li");
lines[a] = lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s)/, "").replace(/^\t/, " ");
code(lines[a], "", true);
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else if (paraForce || (codetest(a) === true && listtest(a) === false)) {
end = parse.pop(data);
record.begin = end.begin;
record.stack = end.stack;
parse.structure.push([end.stack, end.begin]);
if (lines[a - 1] === "" && data.token[parse.count] !== "</p>") {
lasttext = data.token[parse.count];
parse.pop(data);
record.token = "<p>";
record.types = "start";
parse.push(data, record, "p");
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = lasttext;
record.types = "content";
parse.push(data, record, "");
record.token = "</p>";
record.types = "end";
parse.push(data, record, "");
}
lines[a] = lines[a].replace(/^(\u0020{4})/, "").replace(/^(\s*\t)/, "");
if (codetest(a) === true) {
code(lines[a], "", true);
}
else if (data.token[parse.count] === "</p>" && lines[a - 1] !== "") {
parse.pop(data);
parse.structure.push(["p", data.begin[parse.count]]);
record.token = "<br/>";
record.types = "singleton";
parse.push(data, record, "");
text(lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, ""), "multiline", false);
record.token = "</p>";
record.types = "end";
parse.push(data, record, "");
}
else if (data.types[parse.count] === "content") {
a = a - 1;
parse.pop(data);
record.token = "<p>";
record.types = "start";
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
parse.push(data, record, "p");
text(lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, ""), "multiline", false);
record.token = "<br/>";
record.types = "singleton";
parse.push(data, record, "");
a = a + 1;
text(lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, ""), "multiline", false);
record.token = "</p>";
record.types = "end";
parse.push(data, record, "");
}
else {
text(lines[a], "<p>", false);
}
parse.push(data, end, "");
}
else if (listtest(a) === true) {
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
parse.push(data, record, "li");
list();
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
}
else if ((/^(\s*((`{3,})|(~{3,}))+(\S+)?\s*)$/).test(lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s)/, "")) === true) {
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
parse.push(data, record, "li");
lines[a] = lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s)/, "");
codeblock(true, false, false);
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else if (checktest() === true || (listtest(a + 1) === true && space(a + 1, false) - space(a, false) > 1)) {
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "<li>";
record.types = "start";
parse.push(data, record, "li");
if (checktest() === true) {
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "class=\"task-list-item\"";
record.types = "attribute";
parse.push(data, record, "");
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "input";
record.types = "singleton";
parse.push(data, record, "");
y = parse.count;
record.begin = y;
record.stack = "input";
record.token = "class=\"task-list-item-checkbox\"";
record.types = "attribute";
parse.push(data, record, "");
record.begin = y;
record.stack = "input";
record.token = "disabled=\"disabled\"";
record.types = "attribute";
parse.push(data, record, "");
y = lines[a].indexOf("[x]");
z = lines[a].indexOf("[ ]");
if (data.types[parse.structure[parse.structure.length - 2][1] + 1] !== "attribute") {
parse.splice({
data: data,
howmany: 0,
index: parse.structure[parse.structure.length - 2][1] + 1,
record: {
begin: parse.structure[parse.structure.length - 2][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 2][0],
token: "class=\"contains-task-list\"",
types: "attribute"
}
});
}
if (y > -1 && z > -1) {
if (y < z) {
lines[a] = lines[a].replace(/\[x\]\s*/, "");
record.begin = data.begin[parse.count - 1];
record.stack = "input";
record.token = "checked=\"checked\"";
record.types = "attribute";
parse.push(data, record, "");
}
else {
lines[a] = lines[a].replace(/\[ \]\s*/, "");
}
}
else if (y > -1) {
lines[a] = lines[a].replace(/\[x\]\s*/, "");
record.begin = data.begin[parse.count - 1];
record.stack = "input";
record.token = "checked=\"checked\"";
record.types = "attribute";
parse.push(data, record, "");
}
else {
lines[a] = lines[a].replace(/\[ \]\s*/, "");
}
}
lines[a] = lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, "");
text(lines[a], "multiline", false);
record.begin = parse.structure[parse.structure.length - 1][1];
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
}
else {
lines[a] = lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}\.))\s+)/, "");
text(lines[a], "<li>", false);
}
}
a = a + 1;
} while (a < b);
if (order === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</ol>",
types: "end"
}, "");
}
else {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</ul>",
types: "end"
}, "");
}
}, table = function lexer_markdown_table() {
let c = 0, d = 0, line = lines[a]
.replace(/^\|/, "")
.replace(/\|$/, "")
.replace(/\\\|/g, "parse\\?sep")
.split("|"), bar = lines[a + 1]
.replace(/\s*/g, "")
.replace(/^\|/, "")
.replace(/\|$/, "")
.split("|");
if (line.length !== bar.length) {
return parabuild();
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<table>",
types: "start"
}, "table");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<thead>",
types: "start"
}, "thead");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<tr>",
types: "start"
}, "tr");
d = line.length;
do {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<th>",
types: "start"
}, "th");
if ((/:-+:/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:center\"",
types: "attribute"
}, "");
}
else if ((/:-+/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:left\"",
types: "attribute"
}, "");
}
else if ((/-+:/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:right\"",
types: "attribute"
}, "");
}
text(line[c].replace(/parse\\\?sep/g, "|"), "multiline", false);
quote = "";
stack = [];
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</th>",
types: "end"
}, "");
c = c + 1;
} while (c < d);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</tr>",
types: "end"
}, "");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</thead>",
types: "end"
}, "");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<tbody>",
types: "start"
}, "thead");
a = a + 2;
d = bar.length;
do {
if (lines[a] === "") {
break;
}
if ((/^(\s*>)/).test(lines[a]) === true) {
if (data.token[parse.count] === "<tbody>") {
parse.structure.pop();
parse.pop(data);
}
else {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</tbody>",
types: "end"
}, "");
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</table>",
types: "end"
}, "");
return blockquote();
}
line = lines[a]
.replace(/^\|/, "")
.replace(/\|$/, "")
.replace(/\\\|/g, "parse\\?sep")
.split("|");
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<tr>",
types: "start"
}, "tr");
c = 0;
do {
if (line[c] === undefined) {
line[c] = "";
}
if (line[c] === " " && c === bar.length) {
break;
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<td>",
types: "start"
}, "td");
if ((/:-+:/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:center\"",
types: "attribute"
}, "");
}
else if ((/:-+/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:left\"",
types: "attribute"
}, "");
}
else if ((/-+:/).test(bar[c]) === true) {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "style=\"text-align:right\"",
types: "attribute"
}, "");
}
if (line[c] !== "") {
text(line[c].replace(/parse\\\?sep/g, "|"), "multiline", false);
}
quote = "";
stack = [];
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</td>",
types: "end"
}, "");
c = c + 1;
} while (c < d);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</tr>",
types: "end"
}, "");
a = a + 1;
} while (a < b);
if (data.token[parse.count] === "<tbody>") {
parse.structure.pop();
parse.pop(data);
}
else {
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</tbody>",
types: "end"
}, "");
}
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</table>",
types: "end"
}, "");
};
b = lines.length;
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "<body>",
types: "start"
}, "body");
do {
if ((/^(\s*)$/).test(lines[a]) === true) {
if (lines[a - 1] === "") {
lines.splice(a, 1);
b = b - 1;
a = a - 1;
}
else {
lines[a] = "";
}
}
else if ((/^(\s*(\*|-|\+|(\d{1,9}(\)|\.))))/).test(lines[a]) === true && lines[a].replace(/^(\s*(\*|-|\+|(\d{1,9}(\)|\.)))\s*)/, "") === "") {
if ((/^(\u0020{2,})/).test(lines[a + 1]) === true) {
lines[a] = lines[a].replace(/(\s+)$/, "") + lines[a + 1].replace(" ", " ");
lines.splice(a + 1, 1);
b = b - 1;
}
else if ((/^(\t)/).test(lines[a + 1]) === true) {
lines[a] = lines[a].replace(/(\s+)$/, "") + lines[a + 1].replace("\t", " ");
lines.splice(a + 1, 1);
b = b - 1;
}
}
a = a + 1;
} while (a < b);
a = 0;
do {
if (comtest(a) === true) {
comment();
}
else if (codetest(a) === true) {
if (codetest(a + 1) === true || (lines[a + 1] === "" && codetest(a + 2) === true)) {
codeblock(false, false, true);
}
else {
code(lines[a], "", true);
}
}
else if (hrtest(a) === true) {
hr();
}
else if ((/^(\s{0,3}>)/).test(lines[a]) === true) {
blockquote();
}
else if ((/((:-+)|(-+:)|(:-+:)|(-{2,}))\s*\|\s*/).test(lines[a + 1]) === true) {
table();
}
else if (codeblocktest(a) === true) {
codeblock(true, false, false);
}
else if ((/^(\s*#{1,6}\s)/).test(lines[a]) === true) {
heading();
}
else if (listtest(a) === true && (a === 0 || lines[a - 1] === "")) {
list();
}
else if (lines[a] !== "" && (/^(\s+)$/).test(lines[a]) === false) {
parabuild();
}
a = a + 1;
} while (a < b);
parse.push(data, {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markdown",
lines: 0,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "</body>",
types: "end"
}, "");
return data;
};
framework.lexer.markdown = markdown;
}());
/*global global*/
(function markup_init() {
"use strict";
const framework = window.parseFramework, markup = function lexer_markup(source) {
let a = 0, linepreserve = 0, list = 0, litag = 0, sgmlflag = 0, minspace = "", cftransaction = false, ext = false;
const parse = framework.parse, data = parse.data, options = parse.options, b = source.split(""), c = b.length,
// Find the lowercase tag name of the provided token.
tagName = function lexer_markup_tagName(el) {
let space = 0, name = "";
const reg = (/^(\{((%-?)|\{-?)\s*)/);
if (typeof el !== "string") {
return "";
}
space = el
.replace(reg, "%")
.replace(/\s+/, " ")
.indexOf(" ");
name = el.replace(reg, " ");
name = (space < 0)
? name.slice(1, el.length - 1)
: name.slice(1, space);
if (options.lang === "html" || options.lang === "coldfusion") {
name = name.toLowerCase();
}
name = name.replace(/(\}\})$/, "");
if (name.indexOf("(") > 0) {
name = name.slice(0, name.indexOf("("));
}
return name;
},
//parses tags, attributes, and template elements
tag = function lexer_markup_tag(end) {
// markup is two smaller lexers that work together: tag - evaluates markup and
// template tags content - evaluates text content and code for external lexers
//
//type definitions:
// * start end type
// * <![CDATA[ ]]> cdata
// * <!-- --> comment
// * <#-- --> comment
// * <%-- --%> comment
// * {! !} comment
// * <!--[if --> conditional
// * text text content
// * </ > end
// * <pre </pre> ignore (html only)
// * text text script
// * <! > sgml
// * < /> singleton
// * < > start
// * text text style
// * <!--# --> template
// * <% %> template
// * {{{ }}} template
// * {{ }} template
// * {% %} template
// * [% %] template
// * {@ @} template
// * {# #} template
// * {# /} template
// * {? /} template
// * {^ /} template
// * {@ /} template
// * {< /} template
// * {+ /} template
// * {~ } template
// * <? ?> template
// * {:else} template_else
// * <#else > template_else
// * {@}else{@} template_else
// * <%}else{%> template_else
// * {{ }} template_end
// * <%\s*} %> template_end
// * [%\s*} %] template_end
// * {@\s*} @} template_end
// * { } template_end
// * {{# }} template_start
// * <% {\s*%> template_start
// * [% {\s*%] template_start
// * {@ {\s*@} template_start
// * {# } template_start
// * {? } template_start
// * {^ } template_start
// * {@ } template_start
// * {< } template_start
// * {+ } template_start
// * <?xml ?> xml
let igcount = 0, element = "", lastchar = "", ltype = "", tname = "", comment = false, cheat = false, earlyexit = false, ignoreme = false, jscom = false, nopush = false, nosort = false, preserve = false, simple = false, singleton = false, attstore = [];
const record = {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markup",
lines: parse.linesSpace,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: "",
types: ""
},
//cftags is a list of supported coldfusion tags
// * required - means must have a separate matching end tag
// * optional - means the tag could have a separate end tag, but is probably a
// singleton
// * prohibited - means there is no corresponding end tag
cftags = {
"cfNTauthenticate": "optional",
"cfabort": "prohibited",
"cfajaximport": "optional",
"cfajaxproxy": "optional",
"cfapplet": "prohibited",
"cfapplication": "prohibited",
"cfargument": "prohibited",
"cfassociate": "prohibited",
"cfauthenticate": "prohibited",
"cfbreak": "prohibited",
"cfcache": "optional",
"cfcalendar": "optional",
"cfcase": "required",
"cfcatch": "required",
"cfchart": "optional",
"cfchartdata": "prohibited",
"cfchartseries": "optional",
"cfclient": "required",
"cfclientsettings": "optional",
"cfcol": "prohibited",
"cfcollection": "prohibited",
"cfcomponent": "required",
"cfcontent": "optional",
"cfcontinue": "prohibited",
"cfcookie": "prohibited",
"cfdbinfo": "prohibited",
"cfdefaultcase": "required",
"cfdirectory": "prohibited",
"cfdiv": "optional",
"cfdocument": "optional",
"cfdocumentitem": "optional",
"cfdocumentsection": "optional",
"cfdump": "optional",
"cfelse": "prohibited",
"cfelseif": "prohibited",
"cferror": "prohibited",
"cfexchangecalendar": "optional",
"cfexchangeconnection": "optional",
"cfexchangecontact": "optional",
"cfexchangeconversation": "optional",
"cfexchangefilter": "optional",
"cfexchangefolder": "optional",
"cfexchangemail": "optional",
"cfexchangetask": "optional",
"cfexecute": "required",
"cfexit": "prohibited",
"cffeed": "prohibited",
"cffile": "optional",
"cffileupload": "optional",
"cffinally": "required",
"cfflush": "prohibited",
"cfform": "required",
"cfformgroup": "required",
"cfformitem": "optional",
"cfforward": "prohibited",
"cfftp": "prohibited",
"cffunction": "required",
"cfgraph": "required",
"cfgraphdata": "prohibited",
"cfgrid": "required",
"cfgridcolumn": "optional",
"cfgridrow": "optional",
"cfgridupdate": "optional",
"cfheader": "prohibited",
"cfhtmlbody": "optional",
"cfhtmlhead": "optional",
"cfhtmltopdf": "optional",
"cfhtmltopdfitem": "optional",
"cfhttp": "optional",
"cfhttpparam": "prohibited",
"cfif": "required",
"cfimage": "prohibited",
"cfimap": "prohibited",
"cfimapfilter": "optional",
"cfimport": "prohibited",
"cfinclude": "prohibited",
"cfindex": "prohibited",
"cfinput": "prohibited",
"cfinsert": "prohibited",
"cfinterface": "required",
"cfinvoke": "optional",
"cfinvokeargument": "prohibited",
"cflayout": "optional",
"cflayoutarea": "optional",
"cfldap": "prohibited",
"cflocation": "prohibited",
"cflock": "required",
"cflog": "prohibited",
"cflogic": "required",
"cfloginuser": "prohibited",
"cflogout": "prohibited",
"cfloop": "required",
"cfmail": "required",
"cfmailparam": "prohibited",
"cfmailpart": "required",
"cfmap": "optional",
"cfmapitem": "optional",
"cfmediaplayer": "optional",
"cfmenu": "required",
"cfmenuitem": "optional",
"cfmessagebox": "optional",
"cfmodule": "optional",
"cfoauth": "optional",
"cfobject": "prohibited",
"cfobjectcache": "prohibited",
"cfoutput": "required",
"cfpageencoding": "optional",
"cfparam": "prohibited",
"cfpdf": "optional",
"cfpdfform": "optional",
"cfpdfformparam": "optional",
"cfpdfparam": "prohibited",
"cfpdfsubform": "required",
"cfpod": "optional",
"cfpop": "prohibited",
"cfpresentation": "required",
"cfpresentationslide": "optional",
"cfpresenter": "optional",
"cfprint": "optional",
"cfprocessingdirective": "optional",
"cfprocparam": "prohibited",
"cfprocresult": "prohibited",
"cfprogressbar": "optional",
"cfproperty": "prohibited",
"cfquery": "required",
"cfqueryparam": "prohibited",
"cfregistry": "prohibited",
"cfreport": "optional",
"cfreportparam": "optional",
"cfrethrow": "prohibited",
"cfretry": "prohibited",
"cfreturn": "prohibited",
"cfsavecontent": "required",
"cfschedule": "prohibited",
"cfscript": "required",
"cfsearch": "prohibited",
"cfselect": "required",
"cfservlet": "prohibited",
"cfservletparam": "prohibited",
"cfset": "prohibited",
"cfsetting": "optional",
"cfsharepoint": "optional",
"cfsilent": "required",
"cfsleep": "prohibited",
"cfslider": "prohibited",
"cfspreadsheet": "optional",
"cfsprydataset": "optional",
"cfstatic": "required",
"cfstopwatch": "required",
"cfstoredproc": "optional",
"cfswitch": "required",
"cftable": "required",
"cftextarea": "optional",
"cfthread": "optional",
"cfthrow": "prohibited",
"cftimer": "required",
"cftooltip": "required",
"cftrace": "optional",
"cftransaction": "required",
"cftree": "required",
"cftreeitem": "optional",
"cftry": "required",
"cfupdate": "prohibited",
"cfvideo": "prohibited",
"cfvideoplayer": "optional",
"cfwddx": "prohibited",
"cfwebsocket": "optional",
"cfwhile": "required",
"cfwindow": "optional",
"cfx_": "prohibited",
"cfxml": "required",
"cfzip": "optional",
"cfzipparam": "prohibited"
},
//attribute name
arname = function lexer_markup_tag_name(x) {
const eq = x.indexOf("=");
if (eq > 0 && ((eq < x.indexOf("\"") && x.indexOf("\"") > 0) || (eq < x.indexOf("'") && x.indexOf("'") > 0))) {
return [x.slice(0, eq), x.slice(eq + 1)];
}
return [x, ""];
},
// attribute parser
attributeRecord = function lexer_markup_tag_attributeRecord() {
let ind = 0, eq = 0, dq = 0, sq = 0, slice = "", name = "", cft = cftags[tname
.toLowerCase()
.replace(/\/$/, "")], store = [];
const len = attstore.length, syntax = "<{\"'=/", jsxAttribute = function lexer_markup_tag_attributeRecord_jsxAttribute(str) {
if ((/\s/).test(str) === true) {
record.lines = str
.split("\n")
.length + 1;
}
else {
record.lines = 0;
}
return "";
};
if (attstore.length < 1) {
return;
}
// fix for singleton tags, since "/" at the end of the tag is not an attribute
if (attstore[attstore.length - 1] === "/") {
attstore.pop();
element = element.replace(/>$/, "/>");
}
// reconnects attribute names to their respective values if separated on "="
eq = attstore.length;
dq = 1;
if (dq < eq) {
do {
name = attstore[dq - 1];
if (name.charAt(name.length - 1) === "=" && attstore[dq].indexOf("=") < 0) {
attstore[dq - 1] = name + attstore[dq];
attstore.splice(dq, 1);
eq = eq - 1;
dq = dq - 1;
}
dq = dq + 1;
} while (dq < eq);
}
// sort the attributes
if (options.lexerOptions.markup.tagSort === true && jscom === false && options.lang !== "jsx" && nosort === false && tname !== "cfif" && tname !== "cfelseif" && tname !== "cfset") {
attstore = parse.safeSort(attstore, "", false);
record.presv = true;
}
else {
record.presv = false;
}
// preparation for a coldfusion edge case
if (tname.slice(0, 3).toLowerCase() === "cf_") {
cft = "required";
}
record.begin = parse.count;
record.lines = 0;
record.stack = tname.replace(/\/$/, "");
record.types = "attribute";
if (ind < len) {
do {
if (attstore[ind] === undefined) {
break;
}
eq = attstore[ind].indexOf("=");
dq = attstore[ind].indexOf("\"");
sq = attstore[ind].indexOf("'");
if (eq > -1 && store.length > 0) {
// put certain attributes together for coldfusion
record.token = store.join(" ");
parse.push(data, record, "");
if (attstore[ind].indexOf("=") > 0 && attstore[ind].indexOf("//") < 0 && attstore[ind].charAt(0) !== ";") {
record.token = attstore[ind].replace(/\s$/, "");
}
else {
record.token = attstore[ind];
}
parse.push(data, record, "");
store = [];
}
else if (ltype === "sgml") {
store.push(attstore[ind]);
}
else if (cft !== undefined && eq < 0 && attstore[ind].indexOf("=") < 0) {
// put certain attributes together for coldfusion
store.push(attstore[ind]);
}
else if ((cft !== undefined && eq < 0) || (dq > 0 && dq < eq) || (sq > 0 && sq < eq) || syntax.indexOf(attstore[ind].charAt(0)) > -1) {
// tags stored as attributes of other tags
record.token = attstore[ind].replace(/\s$/, "");
parse.push(data, record, "");
}
else if (eq < 0 && cft === undefined) {
// in most markup languages an attribute without an expressed value has its name
// as its string value
name = attstore[ind];
if (options.lang === "html") {
name = name.toLowerCase();
}
if (options.lang === "jsx") {
record.token = name;
}
else {
record.token = name + "=\"" + attstore[ind] + "\"";
}
parse.push(data, record, "");
}
else {
// separates out the attribute name from its value
slice = attstore[ind].slice(eq + 1);
if (syntax.indexOf(slice.charAt(0)) < 0 && cft === undefined) {
slice = "\"" + slice + "\"";
}
name = attstore[ind].slice(0, eq);
if (options.lang === "html" && cft === undefined) {
name = name.toLowerCase();
}
if (options.lang === "jsx" && (/^(\s*\{)/).test(slice) === true) {
if (ind === 0 && (ltype === "singleton" || ltype === "template")) {
parse.structure.push([
tagName(element).replace(/\/$/, ""),
parse.count
]);
}
record.token = name + "={";
record.types = "jsx_attribute_start";
parse.push(data, record, "");
parse.structure.push(["jsx_attribute", parse.count]);
name = slice
.replace(/^(\s*\{)/, "")
.replace(/(\}\s*)$/, jsxAttribute);
framework.lexer.script(name);
record.begin = record.begin + 1;
record.token = "}";
record.types = "jsx_attribute_end";
parse.push(data, record, "");
record.types = "attribute";
parse.structure.pop();
if (ind === len - 1 && (ltype === "singleton" || ltype === "template")) {
parse.structure.pop();
}
}
else {
name = name + "=" + slice;
record.token = name.replace(/(\s+)$/, "");
parse.push(data, record, "");
}
}
ind = ind + 1;
} while (ind < len);
}
if (store.length > 0) {
record.token = store.join(" ");
parse.push(data, record, "");
}
};
ext = false;
// this complex series of conditions determines an elements delimiters look to
// the types being pushed to quickly reason about the logic no type is pushed
// for start tags or singleton tags just yet some types set the `preserve` flag,
// which means to preserve internal white space The `nopush` flag is set when
// parsed tags are to be ignored and forgotten
(function lexer_markup_types() {
if (end === "]>") {
end = ">";
sgmlflag = sgmlflag - 1;
ltype = "template_end";
}
else if (end === "---") {
preserve = true;
ltype = "comment";
}
else if (b[a] === "<") {
if (b[a + 1] === "/") {
if (b[a + 2] === "#") {
ltype = "template_end";
}
else {
ltype = "end";
}
end = ">";
}
else if (b[a + 1] === "!") {
if (b[a + 2] === "-" && b[a + 3] === "-") {
if (b[a + 4] === "#") {
end = "-->";
ltype = "template";
}
else if (b[a + 4] === "-" && (/<cf[a-z]/i).test(source) === true) {
preserve = true;
comment = true;
end = "--->";
ltype = "comment";
}
else {
end = "-->";
preserve = true;
comment = true;
ltype = "comment";
}
}
else if (b[a + 2] === "[" && b[a + 3] === "C" && b[a + 4] === "D" && b[a + 5] === "A" && b[a + 6] === "T" && b[a + 7] === "A" && b[a + 8] === "[") {
end = "]]>";
preserve = true;
comment = true;
ltype = "cdata";
}
else {
end = ">";
sgmlflag = sgmlflag + 1;
ltype = "sgml";
}
}
else if (b[a + 1] === "?") {
end = "?>";
if (b[a + 2] === "x" && b[a + 3] === "m" && b[a + 4] === "l") {
ltype = "xml";
}
else {
preserve = true;
ltype = "template";
}
}
else if (b[a + 1] === "%") {
if (b[a + 2] !== "=") {
preserve = true;
}
if (b[a + 2] === "-" && b[a + 3] === "-") {
end = "--%>";
comment = true;
ltype = "comment";
}
else if (b[a + 2] === "#") {
end = "%>";
comment = true;
ltype = "comment";
}
else {
end = "%>";
ltype = "template";
}
}
else if ((b[a + 1] === "p" || b[a + 1] === "P") && (b[a + 2] === "r" || b[a + 2] === "R") && (b[a + 3] === "e" || b[a + 3] === "E") && (b[a + 4] === ">" || (/\s/).test(b[a + 4]) === true)) {
end = "</pre>";
preserve = true;
ltype = "ignore";
}
else if ((b[a + 1] === "x" || b[a + 1] === "X") && (b[a + 2] === "m" || b[a + 2] === "M") && (b[a + 3] === "l" || b[a + 3] === "L") && b[a + 4] === ":" && (b[a + 5] === "t" || b[a + 5] === "T") && (b[a + 6] === "e" || b[a + 6] === "E") && (b[a + 7] === "x" || b[a + 7] === "X") && (b[a + 8] === "t" || b[a + 8] === "T") && (b[a + 9] === ">" || (/\s/).test(b[a + 9]) === true)) {
end = "</xsl:text>";
preserve = true;
ltype = "ignore";
}
else if ((b[a + 1] === "c" || b[a + 1] === "C") && (b[a + 2] === "f" || b[a + 2] === "F") && (b[a + 3] === "q" || b[a + 3] === "Q") && (b[a + 4] === "u" || b[a + 4] === "U") && (b[a + 5] === "e" || b[a + 5] === "E") && (b[a + 6] === "r" || b[a + 6] === "R") && (b[a + 7] === "y" || b[a + 7] === "Y") && (b[a + 8] === ">" || (/\s/).test(b[a + 8]) === true)) {
end = "</" + b.slice(a + 1, a + 8).join("") + ">";
preserve = true;
ltype = "content_preserve";
}
else if (b[a + 1] === "<") {
if (b[a + 2] === "<") {
end = ">>>";
}
else {
end = ">>";
}
ltype = "template";
}
else if (b[a + 1] === "#") {
if (b[a + 2] === "e" && b[a + 3] === "l" && b[a + 4] === "s" && b[a + 5] === "e") {
end = ">";
ltype = "template_else";
}
else if (b[a + 2] === "-" && b[a + 3] === "-") {
end = "-->";
ltype = "comment";
preserve = true;
}
else {
end = ">";
ltype = "template_start";
}
}
else {
simple = true;
end = ">";
}
}
else if (b[a] === "{") {
preserve = true;
if (options.lang === "jsx") {
ext = true;
earlyexit = true;
record.token = "{";
record.types = "script";
parse.push(data, record, "");
parse.structure.push(["script", parse.count]);
return;
}
if (options.lang === "dustjs") {
if (b[a + 1] === ":" && b[a + 2] === "e" && b[a + 3] === "l" && b[a + 4] === "s" && b[a + 5] === "e" && b[a + 6] === "}") {
a = a + 6;
earlyexit = true;
record.presv = true;
record.token = "{:else}";
record.types = "template_else";
parse.push(data, record, "");
return;
}
if (b[a + 1] === "!") {
end = "!}";
comment = true;
ltype = "comment";
}
else if (b[a + 1] === "/") {
end = "}";
ltype = "template_end";
}
else if (b[a + 1] === "~") {
end = "}";
ltype = "singleton";
}
else if (b[a + 1] === ">") {
end = "/}";
ltype = "singleton";
}
else if (b[a + 1] === "#" || b[a + 1] === "?" || b[a + 1] === "^" || b[a + 1] === "@" || b[a + 1] === "<" || b[a + 1] === "+") {
end = "}";
ltype = "template_start";
}
else {
end = "}";
ltype = "template";
}
}
else if (b[a + 1] === "{") {
if (b[a + 2] === "{") {
end = "}}}";
ltype = "template";
}
else if (b[a + 2] === "#") {
end = "}}";
ltype = "template_start";
}
else if (b[a + 2] === "/") {
end = "}}";
ltype = "template_end";
}
else if (b[a + 2] === "e" && b[a + 3] === "n" && b[a + 4] === "d") {
end = "}}";
ltype = "template_end";
}
else if (b[a + 2] === "e" && b[a + 3] === "l" && b[a + 4] === "s" && b[a + 5] === "e") {
end = "}}";
ltype = "template_else";
}
else {
end = "}}";
ltype = "template";
}
}
else if (b[a + 1] === "%") {
end = "%}";
ltype = "template";
}
else if (b[a + 1] === "#") {
end = "#}";
ltype = "comment";
preserve = true;
comment = true;
}
else {
end = b[a + 1] + "}";
ltype = "template";
}
if (b[a + 1] === "@" && b[a + 2] === "}" && b[a + 3] === "e" && b[a + 4] === "l" && b[a + 5] === "s" && b[a + 6] === "e" && b[a + 7] === "{" && b[a + 8] === "@" && b[a + 9] === "}") {
a = a + 9;
earlyexit = true;
record.presv = true;
record.token = "{@}else{@}";
record.types = "template_else";
parse.push(data, record, "");
return;
}
}
else if (b[a] === "[" && b[a + 1] === "%") {
end = "%]";
ltype = "template";
}
else if (b[a] === "#" && options.lang === "apacheVelocity") {
if (b[a + 1] === "*") {
preserve = true;
comment = true;
end = "*#";
ltype = "comment";
}
else if (b[a + 1] === "[" && b[a + 2] === "[") {
preserve = true;
comment = true;
end = "]]#";
ltype = "comment";
}
else if (b[a + 1] === "#") {
preserve = true;
comment = true;
end = "\n";
ltype = "comment";
}
else if (b[a + 1] === "e" && b[a + 2] === "l" && b[a + 3] === "s" && b[a + 4] === "e" && (/\s/).test(b[a + 5]) === true) {
end = "\n";
ltype = "template_else";
}
else if (b[a + 1] === "i" && b[a + 2] === "f") {
end = "\n";
ltype = "template_start";
}
else if (b[a + 1] === "f" && b[a + 2] === "o" && b[a + 3] === "r" && b[a + 4] === "e" && b[a + 5] === "a" && b[a + 6] === "c" && b[a + 7] === "h") {
end = "\n";
ltype = "template_start";
}
else if (b[a + 1] === "e" && b[a + 2] === "n" && b[a + 3] === "d") {
end = "\n";
ltype = "template_end";
}
else {
end = "\n";
ltype = "template";
}
}
else if (b[a] === "$" && options.lang === "apacheVelocity") {
end = "\n";
ltype = "template";
}
if (options.lexerOptions.markup.unformatted === true) {
preserve = true;
}
}());
if (earlyexit === true) {
return;
}
// This is the real tag lexer. Everything that follows is attribute handling and
// edge cases
lastchar = end.charAt(end.length - 1);
if (a < c) {
let bcount = 0, braccount = 0, jsxcount = 0, e = 0, f = 0, parncount = 0, quote = "", jsxquote = "", stest = false, quotetest = false, attribute = [];
const lex = [],
//finds slash escape sequences
slashy = function lexer_markup_tag_slashy() {
let x = a;
do {
x = x - 1;
} while (b[x] === "\\");
x = a - x;
if (x % 2 === 1) {
return false;
}
return true;
},
// attribute lexer
attributeLexer = function lexer_markup_tag_attributeLexer(quotes) {
let atty = "", name, aa = 0, bb = 0;
if (quotes === true) {
atty = attribute.join("");
name = arname(atty);
if (name[0] === "data-parse-ignore" || name[0] === "data-prettydiff-ignore") {
ignoreme = true;
}
quote = "";
}
else {
atty = attribute
.join("")
.replace(/\s+/g, " ");
name = arname(atty);
if (name[0] === "data-parse-ignore" || name[0] === "data-prettydiff-ignore") {
ignoreme = true;
}
if (options.lang === "jsx" && attribute[0] === "{" && attribute[attribute.length - 1] === "}") {
jsxcount = 0;
}
}
if (atty.slice(0, 3) === "<%=" || atty.slice(0, 2) === "{%") {
nosort = true;
}
atty = atty
.replace(/^\u0020/, "")
.replace(/\u0020$/, "");
attribute = atty
.replace(/\r\n/g, "\n")
.split("\n");
bb = attribute.length;
if (aa < bb) {
do {
attribute[aa] = attribute[aa].replace(/(\s+)$/, "");
aa = aa + 1;
} while (aa < bb);
}
if (options.crlf === true) {
atty = attribute.join("\r\n");
}
else {
atty = attribute.join("\r\n");
}
if (atty === "=") {
attstore[attstore.length - 1] = attstore[attstore.length - 1] + "=";
}
else if (atty.charAt(0) === "=" && attstore.length > 0 && attstore[attstore.length - 1].indexOf("=") < 0) {
//if an attribute starts with a `=` then adjoin it to the last attribute
attstore[attstore.length - 1] = attstore[attstore.length - 1] + atty;
}
else if (atty.charAt(0) !== "=" && attstore.length > 0 && attstore[attstore.length - 1].indexOf("=") === attstore[attstore.length - 1].length - 1) {
// if an attribute follows an attribute ending with `=` then adjoin it to the
// last attribute
attstore[attstore.length - 1] = attstore[attstore.length - 1] + atty;
}
else if (options.lang === "coldfusion" && attstore.length > 0 && (("+-*/(^").indexOf(atty) > -1 || ("+-*/(^").indexOf(attstore[attstore.length - 1].charAt(attstore[attstore.length - 1].length - 1)) > -1)) {
attstore[attstore.length - 1] = attstore[attstore.length - 1] + " " + atty;
}
else if (atty !== "" && atty !== " ") {
attstore.push(atty);
}
attribute = [];
};
do {
if (b[a] === "\n") {
if (options.lang === "apacheVelocity" && lex[0] === "#") {
a = a - 1;
break;
}
parse.lineNumber = parse.lineNumber + 1;
}
if (preserve === true || (/\s/).test(b[a]) === false) {
lex.push(b[a]);
}
if (comment === true) {
quote = "";
//comments must ignore fancy encapsulations and attribute parsing
if (b[a] === lastchar && lex.length > end.length + 1) {
//if current character matches the last character of the tag ending sequence
f = lex.length;
e = end.length - 1;
if (e > -1) {
do {
f = f - 1;
if (lex[f] !== end.charAt(e)) {
break;
}
e = e - 1;
} while (e > -1);
}
if (e < 0) {
if (end === "endcomment") {
f = f - 1;
if ((/\s/).test(lex[f]) === true) {
do {
f = f - 1;
} while ((/\s/).test(lex[f]) === true);
}
if (lex[f - 1] === "{" && lex[f] === "%") {
end = "%}";
lastchar = "}";
}
}
else {
break;
}
}
}
}
else {
if (quote === "") {
if (options.lang === "jsx") {
if (b[a] === "{") {
jsxcount = jsxcount + 1;
}
else if (b[a] === "}") {
jsxcount = jsxcount - 1;
}
}
if (data.types[parse.count] === "sgml" && b[a] === "[" && lex.length > 4) {
data.types[parse.count] = "template_start";
break;
}
if (b[a] === "<" && options.lang !== "coldfusion" && preserve === false && lex.length > 1 && end !== ">>" && end !== ">>>" && simple === true) {
framework.parseerror = "Parse error on line " + parse.lineNumber + " on element: " + data.token[parse.count];
}
if (stest === true && (/\s/).test(b[a]) === false && b[a] !== lastchar) {
//attribute start
stest = false;
quote = jsxquote;
igcount = 0;
lex.pop();
if (a < c) {
do {
if (b[a] === "\n") {
parse.lineNumber = parse.lineNumber + 1;
}
if (options.lexerOptions.markup.unformatted === true) {
lex.push(b[a]);
}
attribute.push(b[a]);
if ((b[a] === "<" || b[a] === ">") && (quote === "" || quote === ">") && options.lang !== "jsx") {
if (quote === "" && b[a] === "<") {
quote = ">";
braccount = 1;
}
else if (quote === ">") {
if (b[a] === "<") {
braccount = braccount + 1;
}
else if (b[a] === ">") {
braccount = braccount - 1;
if (braccount === 0) {
// the following detects if a coldfusion tag is embedded within another markup
// tag
tname = tagName(attribute.join(""));
if (cftags[tname] === "required") {
quote = "</" + tname + ">";
}
else {
quote = "";
igcount = 0;
attributeLexer(false);
break;
}
}
}
}
}
else if (quote === "") {
if (b[a + 1] === lastchar) {
//if at end of tag
if (attribute[attribute.length - 1] === "/") {
attribute.pop();
if (preserve === true) {
lex.pop();
}
a = a - 1;
}
if (attribute.length > 0) {
attributeLexer(false);
}
break;
}
if (b[a] === "{" && b[a - 1] === "=" && options.lang !== "jsx") {
quote = "}";
}
else if (b[a] === "\"" || b[a] === "'") {
quote = b[a];
if (b[a - 1] === "=" && (b[a + 1] === "<" || (b[a + 1] === "{" && b[a + 2] === "%") || (/\s/).test(b[a + 1]) === true)) {
igcount = a;
}
}
else if (b[a] === "(") {
quote = ")";
parncount = 1;
}
else if (options.lang === "jsx") {
//jsx variable attribute
if ((b[a - 1] === "=" || (/\s/).test(b[a - 1]) === true) && b[a] === "{") {
quote = "}";
bcount = 1;
}
else if (b[a] === "/") {
//jsx comments
if (b[a + 1] === "*") {
quote = "*/";
}
else if (b[a + 1] === "/") {
quote = "\n";
}
}
}
else if (lex[0] !== "{" && b[a] === "{" && (options.lang === "dustjs" || b[a + 1] === "{" || b[a + 1] === "%" || b[a + 1] === "@" || b[a + 1] === "#")) {
//opening embedded template expression
if (b[a + 1] === "{") {
if (b[a + 2] === "{") {
quote = "}}}";
}
else {
quote = "}}";
}
}
else if (options.lang === "dustjs") {
quote = "}";
}
else {
quote = b[a + 1] + "}";
}
}
if ((/\s/).test(b[a]) === true && quote === "") {
// testing for a run of spaces between an attribute's = and a quoted value.
// Unquoted values separated by space are separate attributes
if (attribute[attribute.length - 2] === "=") {
e = a + 1;
if (e < c) {
do {
if ((/\s/).test(b[e]) === false) {
if (b[e] === "\"" || b[e] === "'") {
a = e - 1;
quotetest = true;
attribute.pop();
}
break;
}
e = e + 1;
} while (e < c);
}
}
if (quotetest === true) {
quotetest = false;
}
else if (jsxcount === 0 || (jsxcount === 1 && attribute[0] === "{")) {
//if there is an unquoted space attribute is complete
attribute.pop();
attributeLexer(false);
stest = true;
break;
}
}
}
else if (b[a] === "(" && quote === ")") {
parncount = parncount + 1;
}
else if (b[a] === ")" && quote === ")") {
parncount = parncount - 1;
if (parncount === 0) {
quote = "";
if (b[a + 1] === end.charAt(0)) {
attributeLexer(false);
break;
}
}
}
else if (options.lang === "jsx" && (quote === "}" || (quote === "\n" && b[a] === "\n") || (quote === "*/" && b[a - 1] === "*" && b[a] === "/"))) {
//jsx attributes
if (quote === "}") {
if (b[a] === "{") {
bcount = bcount + 1;
}
else if (b[a] === quote) {
bcount = bcount - 1;
if (bcount === 0) {
jsxcount = 0;
quote = "";
element = attribute.join("");
if (options.lexerOptions.markup.unformatted === false) {
if (options.lang === "jsx") {
if ((/^(\s*)$/).test(element) === false) {
attstore.push(element);
}
}
else {
element = element.replace(/\s+/g, " ");
if (element !== " ") {
attstore.push(element);
}
}
}
else if ((/^(\s+)$/).test(element) === false) {
attstore.push(element);
}
attribute = [];
break;
}
}
}
else {
quote = "";
jsxquote = "";
jscom = true;
element = attribute.join("");
if (element.charAt(1) === "*") {
element = element + "\n";
}
attribute = [];
if (element !== " ") {
attstore.push(element);
}
break;
}
}
else if (b[a] === "{" && b[a + 1] === "%" && b[igcount - 1] === "=" && (quote === "\"" || quote === "'")) {
quote = quote + "{%";
igcount = 0;
}
else if (b[a - 1] === "%" && b[a] === "}" && (quote === "\"{%" || quote === "'{%")) {
quote = quote.charAt(0);
igcount = 0;
}
else if (b[a] === "<" && end === ">" && b[igcount - 1] === "=" && (quote === "\"" || quote === "'")) {
quote = quote + "<";
igcount = 0;
}
else if (b[a] === ">" && (quote === "\"<" || quote === "'<")) {
quote = quote.charAt(0);
igcount = 0;
}
else if (igcount === 0 && quote !== ">" && (quote.length < 2 || (quote.charAt(0) !== "\"" && quote.charAt(0) !== "'"))) {
//terminate attribute at the conclusion of a quote pair
f = 0;
if (lex.length > 1) {
tname = lex[1] + lex[2];
tname = tname.toLowerCase();
}
// in coldfusion quotes are escaped in a string with double the characters:
// "cat"" and dog"
if (tname === "cf" && b[a] === b[a + 1] && (b[a] === "\"" || b[a] === "'")) {
attribute.push(b[a + 1]);
a = a + 1;
}
else {
e = quote.length - 1;
if (e > -1) {
do {
if (b[a - f] !== quote.charAt(e)) {
break;
}
f = f + 1;
e = e - 1;
} while (e > -1);
}
if (e < 0) {
attributeLexer(true);
if (b[a + 1] === lastchar) {
break;
}
}
}
}
else if (igcount > 0 && (/\s/).test(b[a]) === false) {
igcount = 0;
}
a = a + 1;
} while (a < c);
}
}
else if (end !== "%>" && end !== "\n" && (b[a] === "\"" || b[a] === "'")) {
//opening quote
quote = b[a];
}
else if (comment === false && end !== "\n" && b[a] === "<" && b[a + 1] === "!" && b[a + 2] === "-" && b[a + 3] === "-" && b[a + 4] !== "#" && data.types[parse.count] !== "conditional") {
quote = "-->";
}
else if (lex[0] !== "{" && end !== "\n" && b[a] === "{" && end !== "%>" && end !== "%]" && (options.lang === "dustjs" || b[a + 1] === "{" || b[a + 1] === "%" || b[a + 1] === "@" || b[a + 1] === "#")) {
//opening embedded template expression
if (b[a + 1] === "{") {
if (b[a + 2] === "{") {
quote = "}}}";
}
else {
quote = "}}";
}
}
else if (options.lang === "dustjs") {
quote = "}";
}
else {
quote = b[a + 1] + "}";
}
if (quote === end) {
quote = "";
}
}
else if ((simple === true || ltype === "sgml") && end !== "\n" && (/\s/).test(b[a]) === true && b[a - 1] !== "<") {
//identify a space in a regular start or singleton tag
if (ltype === "sgml") {
lex.push(" ");
}
else {
stest = true;
}
}
else if (simple === true && options.lang === "jsx" && b[a] === "/" && (b[a + 1] === "*" || b[a + 1] === "/")) {
//jsx comment immediately following tag name
stest = true;
lex[lex.length - 1] = " ";
attribute.push(b[a]);
if (b[a + 1] === "*") {
jsxquote = "*/";
}
else {
jsxquote = "\n";
}
}
else if ((b[a] === lastchar || (end === "\n" && b[a + 1] === "<")) && (lex.length > end.length + 1 || lex[0] === "]") && (options.lang !== "jsx" || jsxcount === 0)) {
if (end === "\n") {
if ((/\s/).test(lex[lex.length - 1]) === true) {
do {
lex.pop();
a = a - 1;
} while ((/\s/).test(lex[lex.length - 1]) === true);
}
break;
}
if (lex[0] === "{" && lex[1] === "%" && lex.join("").replace(/\s+/g, "") === "{%comment%}") {
end = "endcomment";
lastchar = "t";
preserve = true;
comment = true;
ltype = "comment";
}
else {
//if current character matches the last character of the tag ending sequence
f = lex.length;
e = end.length - 1;
if (e > -1) {
do {
f = f - 1;
if (lex[f] !== end.charAt(e)) {
break;
}
e = e - 1;
} while (e > -1);
}
if (e < 0) {
break;
}
}
}
}
else if (b[a] === quote.charAt(quote.length - 1) && ((options.lang === "jsx" && end === "}" && (b[a - 1] !== "\\" || slashy() === false)) || options.lang !== "jsx" || end !== "}")) {
//find the closing quote or embedded template expression
f = 0;
if (lex.length > 1) {
tname = lex[1] + lex[2];
tname = tname.toLowerCase();
}
// in coldfusion quotes are escaped in a string with double the characters:
// "cat"" and dog"
if (tname === "cf" && b[a] === b[a + 1] && (b[a] === "\"" || b[a] === "'")) {
attribute.push(b[a + 1]);
a = a + 1;
}
else {
e = quote.length - 1;
if (e > -1) {
do {
if (b[a - f] !== quote.charAt(e)) {
break;
}
f = f + 1;
e = e - 1;
} while (e > -1);
}
if (e < 0) {
quote = "";
}
}
}
}
a = a + 1;
} while (a < c);
//nopush flags mean an early exit
if (nopush) {
return;
}
//a correction to incomplete template tags that use multiple angle braces
if (options.correct === true) {
if (b[a + 1] === ">" && lex[0] === "<" && lex[1] !== "<") {
do {
a = a + 1;
} while (b[a + 1] === ">");
}
else if (lex[0] === "<" && lex[1] === "<" && b[a + 1] !== ">" && lex[lex.length - 2] !== ">") {
do {
lex.splice(1, 1);
} while (lex[1] === "<");
}
}
igcount = 0;
element = lex.join("");
}
record.presv = preserve;
record.token = element;
record.types = ltype;
tname = tagName(element);
if ((/^(\/?cf)/i).test(tname) === true) {
tname = tname
.toLowerCase()
.replace(/\/$/, "")
.replace(/^\//, "");
}
if (preserve === false && options.lang !== "jsx") {
element = element.replace(/\s+/g, " ");
}
//a quick hack to inject records for a type of template comments
if (tname === "comment" && element.slice(0, 2) === "{%") {
element = element
.replace(/^(\{%\s*comment\s*%\}\s*)/, "")
.replace(/(\s*\{%\s*endcomment\s*%\})$/, "");
record.token = "{% comment %}";
record.types = "template_start";
parse.push(data, record, "");
record.token = element;
record.types = "comment";
parse.push(data, record, "");
record.token = "{% endcomment %}";
record.types = "template_end";
parse.push(data, record, "");
return;
}
// a type correction for template tags who have variable start tag names but a
// consistent ending tag name
if (element.indexOf("{{") === 0 && element.slice(element.length - 2) === "}}") {
if (tname === "end") {
ltype = "template_end";
}
else if (tname === "else") {
ltype = "template_else";
}
}
else if (element.slice(0, 2) === "<%" && element.slice(element.length - 2) === "%>") {
if ((/^(<%\s+end\s+-?%>)$/).test(element) === true) {
ltype = "template_end";
}
else if (((/\sdo\s/).test(element) === true && element.indexOf("-%>") === element.length - 3) || (/^(<%(%|-)?\s*if)/).test(element) === true) {
ltype = "template_start";
}
}
//update a flag for subatomic parsing in SGML tags
if (end !== "]>" && sgmlflag > 0 && element.charAt(element.length - 1) !== "[" && (element.slice(element.length - 2) === "]>" || (/^(<!((doctype)|(notation))\s)/i).test(element) === true)) {
sgmlflag = sgmlflag - 1;
}
// cheat identifies HTML singleton elements as singletons even if formatted as
// start tags, such as <br> (which is really <br/>)
cheat = (function lexer_markup_tag_cheat() {
let cfval = "", struc = [];
const ender = (/(\/>)$/), htmlsings = {
area: "singleton",
base: "singleton",
basefont: "singleton",
br: "singleton",
col: "singleton",
embed: "singleton",
eventsource: "singleton",
frame: "singleton",
hr: "singleton",
img: "singleton",
input: "singleton",
keygen: "singleton",
link: "singleton",
meta: "singleton",
param: "singleton",
progress: "singleton",
source: "singleton",
wbr: "singleton"
}, fixsingleton = function lexer_markup_tag_cheat_fixsingleton() {
let aa = parse.count, bb = 0;
const vname = tname.slice(1);
if (aa > -1) {
do {
if (data.types[aa] === "end") {
bb = bb + 1;
}
else if (data.types[aa] === "start") {
bb = bb - 1;
if (bb < 0) {
return false;
}
}
if (bb === 0 && data.token[aa].toLowerCase().indexOf(vname) === 1) {
if (cftags[tname] !== undefined) {
data.types[aa] = "template_start";
}
else {
data.types[aa] = "start";
}
data.token[aa] = data
.token[aa]
.replace(/(\s*\/>)$/, ">");
return false;
}
aa = aa - 1;
} while (aa > -1);
}
return false;
};
//determine if the current tag is an HTML singleton and exit
if (data.types[parse.count] === "end" && tname.slice(0, 3) !== "/cf") {
const lastToken = data.token[parse.count];
if (data.types[parse.count - 1] === "singleton" && lastToken.charAt(lastToken.length - 2) !== "/" && "/" + tagName(lastToken) === tname) {
data.types[parse.count - 1] = "start";
}
else if (tname !== "/span" && tname !== "/div" && tname !== "/script" && tname === "/" + tagName(data.token[parse.count]) && options.lexerOptions.markup.tagMerge === true && (data.types[parse.count - 1] === "start" || htmlsings[tname.slice(1)] === "singleton") && (options.lang !== "html" || (options.lang === "html" && tname !== "/li"))) {
parse.pop(data);
if (data.types[parse.count] === "start") {
data.token[parse.count] = data
.token[parse.count]
.replace(/>$/, "/>");
}
data.types[parse.count] = "singleton";
singleton = true;
return false;
}
}
//renames the types value for the following two template tags
if (tname === "/#assign" || tname === "/#global") {
let dd = parse.count - 1, count = 1;
if (dd > -1) {
do {
if (data.types[dd] === "start" || data.types[dd] === "template_start") {
count = count - 1;
}
else if (data.types[dd] === "end" || data.types[dd] === "template_end") {
count = count + 1;
}
if (count === 1) {
if ((data.token[dd].indexOf("<#assign") === 0 && tname === "/#assign") || (data.token[dd].indexOf("<#global") === 0 && tname === "/#global")) {
data.types[dd] = "template_start";
return false;
}
}
if (count === 0) {
return false;
}
dd = dd - 1;
} while (dd > -1);
}
return false;
}
//determines if custom coldfusion tags are singletons
cfval = cftags[tname];
if (data.types[parse.count] === "end" && tname.slice(0, 3) === "/cf" && cfval !== undefined) {
if (tname === "/cftransaction") {
cftransaction = false;
}
if (cfval !== undefined) {
data.types[parse.count] = "template_end";
}
if ((cfval === "optional" || cfval === "prohibited") && tname !== "/cftransaction") {
return fixsingleton();
}
return false;
}
//processes all other coldfusion tags
if (tname.slice(0, 2) === "cf") {
if (tname === "cfelse" || tname === "cfelseif") {
record.token = element;
record.types = "template_else";
parse.push(data, record, "");
singleton = true;
return false;
}
if (tname === "cftransaction" && cftransaction === true) {
if (element.charAt(1) === "/") {
record.types = "template_end";
}
else {
cfval = "prohibited";
}
}
else {
cfval = cftags[tname];
}
if (tname === "cfscript" && element.indexOf("</cfscript") !== 0) {
ext = true;
}
if (cfval === "optional" || cfval === "prohibited" || tname.slice(0, 3) === "cf_") {
if (options.correct === true && ender.test(element) === false) {
element = element.slice(0, element.length - 1) + "/>";
}
record.token = element.replace(/\s+/, " ");
record.types = "template";
if (tname === "cfmodule" && element.charAt(1) === "/") {
let ss = parse.count, tt = 1;
do {
if (data.token[ss].toLowerCase() === "<cfmodule>") {
tt = tt - 1;
if (tt < 1) {
break;
}
}
else if (data.token[ss].toLowerCase() === "</cfmodule>") {
tt = tt + 1;
}
ss = ss - 1;
} while (ss > -1);
data.types[ss] = "template_start";
tt = ss + 1;
struc = [["cfmodule", ss]];
ss = parse.count + 1;
do {
if (data.types[tt] === "end" || data.types[tt] === "template_end") {
data.begin[tt] = struc[struc.length - 1][1];
data.stack[tt] = struc[struc.length - 1][0];
if (struc.length > 1) {
struc.pop();
}
}
else if (data.types[tt] === "start" || data.types[tt] === "template_start" || (data.types[tt] === "cdata" && data.token[data.begin[tt + 1]].toLowerCase().indexOf("<script") === 0)) {
data.begin[tt] = struc[struc.length - 1][1];
data.stack[tt] = struc[struc.length - 1][0];
struc.push([tagName(data.token[tt]), tt]);
}
else {
data.begin[tt] = struc[struc.length - 1][1];
data.stack[tt] = struc[struc.length - 1][0];
}
tt = tt + 1;
} while (tt < ss);
parse.structure.push(struc[0]);
record.begin = struc[0][1];
record.stack = "cfmodule";
record.types = "template_end";
}
parse.push(data, record, "");
singleton = true;
return false;
}
if (cfval === "required" && tname !== "cfquery") {
if (tname === "cftransaction" && cftransaction === false) {
cftransaction = true;
}
record.token = element;
record.types = (ltype === "end")
? "template_end"
: "template_start";
parse.push(data, record, tname);
singleton = true;
}
return false;
}
if (options.lang === "html") {
// html gets tag names in lowercase, if you want to preserve case sensitivity
// beautify as XML
if (element.charAt(0) === "<" && element.charAt(1) !== "!" && element.charAt(1) !== "?" && (parse.count < 0 || data.types[parse.count].indexOf("template") < 0) && cftags[tname] === undefined && tname.slice(0, 3) !== "cf_") {
element = element.toLowerCase();
}
//looks for HTML "li" tags that have no ending tag, which is valid in HTML
if (tname === "li") {
if (litag === list && (list !== 0 || (list === 0 && parse.count > -1 && data.types[parse.count].indexOf("template") < 0))) {
let d = parse.count, ee = 1;
if (d > -1) {
do {
if (data.types[d] === "start" || data.types[d] === "template_start") {
ee = ee - 1;
}
else if (data.types[d] === "end" || data.types[d] === "template_end") {
ee = ee + 1;
}
if (ee === -1 && (tagName(data.token[d]) === "li" || (tagName(data.token[d + 1]) === "li" && (tagName(data.token[d]) === "ul" || tagName(data.token[d]) === "ol")))) {
record.lines = data.lines[parse.count];
record.presv = false;
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
record.begin = parse.structure[parse.structure.length - 1][1];
record.lines = parse.linesSpace;
record.presv = preserve;
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = element;
record.types = ltype;
data.lines[parse.count - 1] = 0;
break;
}
if (ee < 0) {
break;
}
d = d - 1;
} while (d > -1);
}
}
else {
litag = litag + 1;
}
}
else if (tname === "/li" && litag === list) {
litag = litag - 1;
}
else if (tname === "ul" || tname === "ol") {
list = list + 1;
}
else if (tname === "/ul" || tname === "/ol") {
if (litag === list) {
record.lines = data.lines[parse.count];
record.presv = false;
record.token = "</li>";
record.types = "end";
parse.push(data, record, "");
record.begin = parse.structure[parse.structure.length - 1][1];
record.lines = parse.linesSpace;
record.presv = preserve;
record.stack = parse.structure[parse.structure.length - 1][0];
record.token = element;
record.types = "end";
data.lines[parse.count - 1] = 0;
litag = litag - 1;
}
list = list - 1;
}
//generalized corrections for the handling of singleton tags
if (data.types[parse.count] === "end" && htmlsings[tname.slice(1)] === "singleton" && element.toLowerCase().indexOf("/cftransaction") !== 1) {
return fixsingleton();
}
//inserts a trailing slash into singleton tags if they do not already have it
if (htmlsings[tname] === "singleton") {
if (options.correct === true && ender.test(element) === false) {
element = element.slice(0, element.length - 1) + " />";
}
return true;
}
}
return false;
}());
//This escape flag is set in the cheat function
if (singleton === true) {
attributeRecord();
return;
}
//tags with the following names are singletons
if (tname.charAt(0) === "#" && data.types[parse.count] === "start" && (tname === "#assign" || tname === "#break" || tname === "#case" || tname === "#default" || tname === "#fallback" || tname === "#flush" || tname === "#ftl" || tname === "#global" || tname === "#import" || tname === "#include" || tname === "#local" || tname === "#t" || tname === "#lt" || tname === "#rt" || tname === "#nested" || tname === "#nt" || tname === "#recover" || tname === "#recurse" || tname === "#return" || tname === "#sep" || tname === "#setting" || tname === "#stop" || tname === "#visit")) {
simple = true;
}
//correction for dustjs tags to template singleton types
if (options.lang === "dustjs" && data.types[parse.count] === "template_start") {
const first = element.charAt(1), ending = element.slice(element.length - 2);
if ((ending === "/}" || ending.charAt(0) === first) && (first === "#" || first === "?" || first === "^" || first === "@" || first === "<" || first === "+")) {
data.types[parse.count] = "template";
}
}
// determine if the markup tag potentially contains code interpreted by a
// different lexer
if ((tname === "script" || tname === "style" || tname === "cfscript") && element.slice(element.length - 2) !== "/>") {
//get the attribute value for "type"
let len = attstore.length - 1, attValue = "", attr = [];
if (len > -1) {
do {
attr = arname(attstore[len]);
if (attr[0] === "type") {
attValue = attr[1];
if (attValue.charAt(0) === "\"" || attValue.charAt(0) === "'") {
attValue = attValue.slice(1, attValue.length - 1);
}
break;
}
len = len - 1;
} while (len > -1);
}
//ext is flag to send information between the tag lexer and the content lexer
if (tname === "script" && (attValue === "" || attValue === "text/javascript" || attValue === "babel" || attValue === "module" || attValue === "application/javascript" || attValue === "application/x-javascript" || attValue === "text/ecmascript" || attValue === "application/ecmascript" || attValue === "text/jsx" || attValue === "application/jsx" || attValue === "text/cjs")) {
ext = true;
}
else if (tname === "style" && (attValue === "" || attValue === "text/css")) {
ext = true;
}
else if (tname === "cfscript") {
ext = true;
}
if (ext === true) {
len = a + 1;
if (len < c) {
do {
if ((/\s/).test(b[len]) === false) {
if (b[len] === "<") {
if (b.slice(len + 1, len + 4).join("") === "!--") {
len = len + 4;
if (len < c) {
do {
if ((/\s/).test(b[len]) === false) {
ext = false;
break;
}
if (b[len] === "\n" || b[len] === "\r") {
break;
}
len = len + 1;
} while (len < c);
}
}
else {
ext = false;
}
}
break;
}
len = len + 1;
} while (len < c);
}
}
}
//am I a singleton or a start type?
if (simple === true && ignoreme === false) {
if (cheat === true || element.slice(element.length - 2) === "/>") {
ltype = "singleton";
}
else {
ltype = "start";
}
record.types = ltype;
}
// additional logic is required to find the end of a tag with the attribute
// data-parse-ignore
if (simple === true && preserve === false && ignoreme && end === ">" && element.slice(element.length - 2) !== "/>") {
let tags = [];
if (cheat === true) {
ltype = "singleton";
}
else {
preserve = true;
data.presv[parse.count] = true;
ltype = "ignore";
a = a + 1;
if (a < c) {
let delim = "", ee = 0, ff = 0, endtag = false;
do {
if (b[a] === "\n") {
parse.lineNumber = parse.lineNumber + 1;
}
tags.push(b[a]);
if (delim === "") {
if (b[a] === "\"") {
delim = "\"";
}
else if (b[a] === "'") {
delim = "'";
}
else if (tags[0] !== "{" && b[a] === "{" && (options.lang === "dustjs" || b[a + 1] === "{" || b[a + 1] === "%" || b[a + 1] === "@" || b[a + 1] === "#")) {
if (b[a + 1] === "{") {
if (b[a + 2] === "{") {
delim = "}}}";
}
else {
delim = "}}";
}
}
else if (options.lang === "dustjs") {
delim = "}";
}
else {
delim = b[a + 1] + "}";
}
}
else if (b[a] === "<" && simple === true) {
if (b[a + 1] === "/") {
endtag = true;
}
else {
endtag = false;
}
}
else if (b[a] === lastchar && b[a - 1] !== "/") {
if (endtag === true) {
igcount = igcount - 1;
if (igcount < 0) {
break;
}
}
else {
igcount = igcount + 1;
}
}
}
else if (b[a] === delim.charAt(delim.length - 1)) {
ff = 0;
ee = delim.length - 1;
if (ee > -1) {
do {
if (b[a - ff] !== delim.charAt(ee)) {
break;
}
ff = ff + 1;
ee = ee - 1;
} while (ee > -1);
}
if (ee < 0) {
delim = "";
}
}
a = a + 1;
} while (a < c);
}
}
element = element + tags.join("");
element = element.replace(">", " " + attstore.join(" ") + ">");
record.token = element;
record.types = "content-ignore";
attstore = [];
}
// some template tags can be evaluated as a block start/end based on syntax
// alone
if (record.types.indexOf("template") > -1) {
if (element.slice(0, 2) === "{%") {
let names = [
"autoescape",
"block",
"capture",
"case",
"comment",
"embed",
"filter",
"for",
"form",
"if",
"macro",
"paginate",
"raw",
"sandbox",
"spaceless",
"tablerow",
"unless",
"verbatim"
];
if (tname === "else" || tname === "elseif" || tname === "when" || tname === "elif") {
record.types = "template_else";
}
else {
let namelen = names.length - 1;
if (namelen > -1) {
do {
if (tname === names[namelen]) {
record.types = "template_start";
break;
}
if (tname === "end" + names[namelen]) {
record.types = "template_end";
break;
}
namelen = namelen - 1;
} while (namelen > -1);
}
}
}
else if (element.slice(0, 2) === "{{" && element.charAt(3) !== "{") {
if ((/^(\{\{\s*-?\s*end\s*-?\s*\}\})$/).test(element) === true) {
record.types = "template_end";
}
else if (tname === "block" || tname === "define" || tname === "form" || tname === "if" || tname === "range" || tname === "with") {
if (tname !== "block" || (/\{%\s*\w/).test(source) === false) {
record.types = "template_start";
}
}
}
else if (record.types === "template") {
if (element.indexOf("else") > 2) {
record.types = "template_else";
}
else if ((/^(<%\s*\})/).test(element) === true || (/^(\[%\s*\})/).test(element) === true || (/^(\{@\s*\})/).test(element) === true) {
record.types = "template_end";
}
else if ((/(\{\s*%>)$/).test(element) === true || (/(\{\s*%\])$/).test(element) === true || (/(\{\s*@\})$/).test(element) === true) {
record.types = "template_start";
}
}
if (record.types === "template_start" && (tname === "" || tname === "@" || tname === "#" || tname === "%")) {
tname = tname + element.slice(1).replace(tname, "").replace(/^(\s+)/, "");
tname = tname.slice(0, tname.indexOf("(")).replace(/\s+/, "");
}
}
// identify script hidden within a CDATA escape
if (ltype === "cdata" && record.stack === "script") {
let counta = parse.count, countb = parse.count;
if (data.types[countb] === "attribute") {
do {
counta = counta - 1;
countb = countb - 1;
} while (data.types[countb] === "attribute" && countb > -1);
}
record.begin = counta;
element = element
.replace(/^(\s*<!\[cdata\[)/i, "")
.replace(/(\]\]>\s*)$/, "");
record.token = "<![CDATA[";
parse.push(data, record, "");
parse.structure.push(["cdata", parse.count]);
framework.lexer.script(element);
record.begin = parse.structure[parse.structure.length - 1][1];
record.token = "]]>";
parse.push(data, record, "");
parse.structure.pop();
}
else {
parse.push(data, record, tname);
}
attributeRecord();
//sorts child elements
if (options.lexerOptions.markup.tagSort === true && data.types[parse.count] === "end" && data.types[parse.count - 1] !== "start" && tname !== "/script" && tname !== "/style" && tname !== "/cfscript") {
let bb = 0, d = 0, startStore = 0, jsxatt = false, endData;
const children = [], store = {
begin: [],
lexer: [],
lines: [],
presv: [],
stack: [],
token: [],
types: []
}, storeRecord = function lexer_markup_tag_sorttag_storeRecord(index) {
const output = {
begin: data.begin[index],
lexer: data.lexer[index],
lines: data.lines[index],
presv: data.presv[index],
stack: data.stack[index],
token: data.token[index],
types: data.types[index]
};
return output;
}, childsort = function lexer_markup_tag_sorttag_childsort(a, b) {
if (data.token[a[0]] > data.token[b[0]]) {
return -1;
}
return 1;
};
bb = parse.count - 1;
if (bb > -1) {
let endStore = 0;
do {
if (data.types[bb] === "start") {
d = d - 1;
if (d < 0) {
startStore = bb + 1;
if (data.types[startStore] === "attribute" || data.types[startStore] === "jsx_attribute_start") {
jsxatt = false;
do {
startStore = startStore + 1;
if (jsxatt === false && data.types[startStore] !== "attribute") {
break;
}
if (data.types[startStore] === "jsx_attribute_start") {
jsxatt = true;
}
else if (data.types[startStore] === "jsx_attribute_end") {
jsxatt = false;
}
} while (startStore < c);
}
break;
}
}
else if (data.types[bb] === "end") {
d = d + 1;
if (d === 1) {
endStore = bb;
}
}
if (d === 0) {
if (data.types[bb] === "start") {
children.push([bb, endStore]);
}
else {
if (data.types[bb] === "singleton" && (data.types[bb + 1] === "attribute" || data.types[bb + 1] === "jsx_attribute_start")) {
let cc = bb + 1;
jsxatt = false;
do {
if (data.types[cc] === "jsx_attribute_start") {
jsxatt = true;
}
else if (data.types[cc] === "jsx_attribute_end") {
jsxatt = false;
}
if (jsxatt === false && data.types[cc + 1] !== "attribute" && data.types[cc + 1] !== "jsx_attribute_start") {
break;
}
cc = cc + 1;
} while (cc < parse.count);
children.push([bb, cc]);
}
else if (data.types[bb] !== "attribute" && data.types[bb] !== "jsx_attribute_start") {
children.push([bb, bb]);
}
}
}
bb = bb - 1;
} while (bb > -1);
}
if (children.length < 2) {
return;
}
children.sort(childsort);
bb = children.length - 1;
if (bb > -1) {
do {
parse.push(store, storeRecord(children[bb][0]), "");
if (children[bb][0] !== children[bb][1]) {
d = children[bb][0] + 1;
if (d < children[bb][1]) {
do {
parse.push(store, storeRecord(d), "");
d = d + 1;
} while (d < children[bb][1]);
}
parse.push(store, storeRecord(children[bb][1]), "");
}
bb = bb - 1;
} while (bb > -1);
}
endData = {
begin: data.begin.pop(),
lexer: data.lexer.pop(),
lines: data.lines.pop(),
presv: data.presv.pop(),
stack: data.stack.pop(),
token: data.token.pop(),
types: data.types.pop()
};
(function lexer_markup_tag_sorttag_slice() {
parse.datanames.forEach(function lexer_markup_tag_sorttag_slice_datanames(value) {
data[value] = data[value].slice(0, startStore);
});
}());
parse.concat(data, store);
parse.push(data, endData, "");
}
parse.linesSpace = 0;
}, content = function lexer_markup_content() {
let lex = [], ltoke = "", jsxbrace = (data.token[parse.count] === "{"), liner = parse.linesSpace, now = a;
const name = (ext === true)
? (jsxbrace === true)
? "script"
: (parse.structure[parse.structure.length - 1][1] > -1)
? tagName(data.token[parse.structure[parse.structure.length - 1][1]].toLowerCase())
: tagName(data.token[data.begin[parse.count]].toLowerCase())
: "", square = (data.types[parse.count] === "template_start" && data.token[parse.count].indexOf("<!") === 0 && data.token[parse.count].indexOf("<![") < 0 && data.token[parse.count].charAt(data.token[parse.count].length - 1) === "["), record = {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "markup",
lines: liner,
presv: (linepreserve > 0),
stack: parse.structure[parse.structure.length - 1][0],
token: "",
types: "content"
}, esctest = function lexer_markup_content_esctest() {
let aa = a - 1, bb = 0;
if (b[a - 1] !== "\\") {
return false;
}
if (aa > -1) {
do {
if (b[aa] !== "\\") {
break;
}
bb = bb + 1;
aa = aa - 1;
} while (aa > -1);
}
if (bb % 2 === 1) {
return true;
}
return false;
};
if (a < c) {
let end = "", quote = "", quotes = 0;
do {
// external code requires additional parsing to look for the appropriate end
// tag, but that end tag cannot be quoted or commented
if (ext === true) {
if (quote === "") {
if (b[a] === "/") {
if (b[a + 1] === "*") {
quote = "*";
}
else if (b[a + 1] === "/") {
quote = "/";
}
else if (name === "script" && "([{!=,;.?:&<>".indexOf(b[a - 1]) > -1) {
if (options.lang !== "jsx" || b[a - 1] !== "<") {
quote = "reg";
}
}
}
else if ((b[a] === "\"" || b[a] === "'" || b[a] === "`") && esctest() === false) {
quote = b[a];
}
else if (b[a] === "{" && jsxbrace === true) {
quotes = quotes + 1;
}
else if (b[a] === "}" && jsxbrace === true) {
if (quotes === 0) {
framework.lexer.script(lex.join("").replace(/^(\s+)/, "").replace(/(\s+)$/, ""));
parse.structure[parse.structure.length - 1][1] + 1;
record.token = "}";
record.types = "script";
parse.push(data, record, "");
parse.structure.pop();
break;
}
quotes = quotes - 1;
}
end = b
.slice(a, a + 10)
.join("")
.toLowerCase();
//cfscript requires use of the script lexer
if (name === "cfscript" && end === "</cfscript") {
a = a - 1;
if (lex.length < 1) {
break;
}
framework.lexer.script(lex.join("").replace(/^(\s+)/, "").replace(/(\s+)$/, ""));
break;
}
//script requires use of the script lexer
if (name === "script") {
if (a === c - 9) {
end = end.slice(0, end.length - 1);
}
else {
end = end.slice(0, end.length - 2);
}
if (end === "</script") {
let outside = lex.join("").replace(/^(\s+)/, "").replace(/(\s+)$/, "");
a = a - 1;
if (lex.length < 1) {
break;
}
if ((/^(<!--+)/).test(outside) === true && (/(--+>)$/).test(outside) === true) {
record.token = "<!--";
record.types = "comment";
parse.push(data, record, "");
outside = outside.replace(/^(<!--+)/, "").replace(/(--+>)$/, "");
framework.lexer.script(outside);
record.token = "-->";
parse.push(data, record, "");
}
else {
framework.lexer.script(outside);
}
break;
}
}
//style requires use of the style lexer
if (name === "style") {
if (a === c - 8) {
end = end.slice(0, end.length - 1);
}
else if (a === c - 9) {
end = end.slice(0, end.length - 2);
}
else {
end = end.slice(0, end.length - 3);
}
if (end === "</style") {
let outside = lex.join("").replace(/^(\s+)/, "").replace(/(\s+)$/, "");
a = a - 1;
if (lex.length < 1) {
break;
}
if ((/^(<!--+)/).test(outside) === true && (/(--+>)$/).test(outside) === true) {
record.token = "<!--";
record.types = "comment";
parse.push(data, record, "");
outside = outside.replace(/^(<!--+)/, "").replace(/(--+>)$/, "");
framework.lexer.style(outside);
record.token = "-->";
parse.push(data, record, "");
}
else {
framework.lexer.style(outside);
}
break;
}
}
}
else if (quote === b[a] && (quote === "\"" || quote === "'" || quote === "`" || (quote === "*" && b[a + 1] === "/")) && esctest() === false) {
quote = "";
}
else if (quote === "`" && b[a] === "$" && b[a + 1] === "{" && esctest() === false) {
quote = "}";
}
else if (quote === "}" && b[a] === "}" && esctest() === false) {
quote = "`";
}
else if (quote === "/" && (b[a] === "\n" || b[a] === "\r")) {
quote = "";
}
else if (quote === "reg" && b[a] === "/" && esctest() === false) {
quote = "";
}
else if (quote === "/" && b[a] === ">" && b[a - 1] === "-" && b[a - 2] === "-") {
end = b
.slice(a + 1, a + 11)
.join("")
.toLowerCase();
if (name === "cfscript" && end === "</cfscript") {
quote = "";
}
end = end.slice(0, end.length - 2);
if (name === "script" && end === "</script") {
quote = "";
}
end = end.slice(0, end.length - 1);
if (name === "style" && end === "</style") {
quote = "";
}
}
}
//typically this logic is for artifacts nested within an SGML tag
if (square === true && b[a] === "]") {
a = a - 1;
ltoke = minspace + lex.join("");
liner = 0;
record.token = ltoke;
parse.push(data, record, "");
break;
}
//general content processing
if (ext === false && lex.length > 0 && ((b[a] === "<" && b[a + 1] !== "=" && (/\s|\d/).test(b[a + 1]) === false) || (b[a] === "[" && b[a + 1] === "%") || (b[a] === "{" && (options.lang === "jsx" || options.lang === "dustjs" || b[a + 1] === "{" || b[a + 1] === "%" || b[a + 1] === "@" || b[a + 1] === "#")))) {
//dustjs template handling
if (options.lang === "dustjs" && b[a] === "{" && b[a + 1] === ":" && b[a + 2] === "e" && b[a + 3] === "l" && b[a + 4] === "s" && b[a + 5] === "e" && b[a + 6] === "}") {
a = a + 6;
ltoke = minspace + lex.join("");
liner = 0;
record.token = ltoke;
parse.push(data, record, "");
record.token = "{:else}";
record.types = "template_else";
record.presv = false;
parse.push(data, record, "");
break;
}
//regular content
a = a - 1;
ltoke = minspace + lex.join("");
liner = 0;
record.token = ltoke;
parse.push(data, record, "");
break;
}
lex.push(b[a]);
a = a + 1;
} while (a < c);
}
if (a > now && a < c) {
if ((/\s/).test(b[a]) === true) {
let x = a;
parse.linesSpace = 1;
do {
if (b[x] === "\n") {
parse.lineNumber = parse.lineNumber + 1;
parse.linesSpace = parse.linesSpace + 1;
}
x = x - 1;
} while (x > now && (/\s/).test(b[x]) === true);
}
else {
parse.linesSpace = 0;
}
}
else if (a !== now || (a === now && ext === false)) {
//regular content at the end of the supplied source
ltoke = minspace + lex.join("");
liner = 0;
//this condition prevents adding content that was just added in the loop above
if (record.token !== ltoke) {
record.token = ltoke;
parse.push(data, record, "");
parse.linesSpace = 0;
}
}
ext = false;
};
do {
if ((/\s/).test(b[a]) === true) {
a = parse.spacer({ array: b, end: c, index: a });
}
else if (ext) {
content();
}
else if (b[a] === "<") {
tag("");
}
else if (b[a] === "[" && b[a + 1] === "%") {
tag("%]");
}
else if (b[a] === "{" && (options.lang === "jsx" || options.lang === "dustjs" || b[a + 1] === "{" || b[a + 1] === "%" || b[a + 1] === "@" || b[a + 1] === "#")) {
tag("");
}
else if (b[a] === "]" && sgmlflag > 0) {
tag("]>");
}
else if (b[a] === "-" && b[a + 1] === "-" && b[a + 2] === "-" && options.lang === "jekyll") {
tag("---");
}
else if (options.lang === "apacheVelocity" && (/\d/).test(b[a + 1]) === false && (/\s/).test(b[a + 1]) === false) {
if (b[a] === "#" && ((/\w/).test(b[a + 1]) === true || b[a + 1] === "*" || b[a + 1] === "#" || (b[a + 1] === "[" && b[a + 2] === "["))) {
tag("");
}
else if (b[a] === "$" && b[a + 1] !== "$" && b[a + 1] !== "=" && b[a + 1] !== "[") {
tag("");
}
else {
content();
}
}
else {
content();
}
a = a + 1;
} while (a < c);
return data;
};
framework.lexer.markup = markup;
}());
/*global global*/
(function style_init() {
"use strict";
const framework = window.parseFramework, style = function lexer_style(source) {
let a = 0, ltype = "", ltoke = "", endtest = false;
const parse = framework.parse, data = parse.data, options = parse.options, colors = [], colorNames = {
aliceblue: 0.9288006825347457,
antiquewhite: 0.8464695170775405,
aqua: 0.7874,
aquamarine: 0.8078549208338043,
azure: 0.9726526495416643,
beige: 0.8988459998705021,
bisque: 0.8073232737297876,
black: 0,
blanchedalmond: 0.8508443960815607,
blue: 0.0722,
blueviolet: 0.12622014321946043,
brown: 0.09822428787651079,
burlywood: 0.5155984453389335,
cadetblue: 0.29424681085422044,
chartreuse: 0.7603202590262282,
chocolate: 0.23898526114557292,
coral: 0.3701793087292368,
cornflowerblue: 0.30318641994179363,
cornsilk: 0.9356211037296492,
crimson: 0.16042199953025577,
cyan: 0.7874,
darkblue: 0.018640801980939217,
darkcyan: 0.2032931783904645,
darkgoldenrod: 0.27264703559992554,
darkgray: 0.39675523072562674,
darkgreen: 0.09114342904757505,
darkgrey: 0.39675523072562674,
darkkhaki: 0.45747326349994155,
darkmagenta: 0.07353047651207048,
darkolivegreen: 0.12651920884889156,
darkorange: 0.40016167026523863,
darkorchid: 0.1341314217485677,
darkred: 0.05488967453113126,
darksalmon: 0.4054147156338075,
darkseagreen: 0.43789249325969054,
darkslateblue: 0.06579284622798763,
darkslategray: 0.06760815192804355,
darkslategrey: 0.06760815192804355,
darkturquoise: 0.4874606277449034,
darkviolet: 0.10999048339343433,
deeppink: 0.2386689582827583,
deepskyblue: 0.444816033955754,
dimgray: 0.14126329114027164,
dimgrey: 0.14126329114027164,
dodgerblue: 0.2744253699145608,
firebrick: 0.10724525535015225,
floralwhite: 0.9592248482500424,
forestgreen: 0.18920812076002244,
fuchsia: 0.2848,
gainsboro: 0.7156935005064806,
ghostwhite: 0.9431126188632283,
gold: 0.6986087742815887,
goldenrod: 0.41919977809568404,
gray: 0.21586050011389915,
green: 0.15438342968146068,
greenyellow: 0.8060947261145331,
grey: 0.21586050011389915,
honeydew: 0.9633653555478173,
hotpink: 0.3465843816971475,
indianred: 0.21406134963884,
indigo: 0.031075614863369846,
ivory: 0.9907127060061531,
khaki: 0.7701234339412052,
lavendar: 0.8031875051452125,
lavendarblush: 0.9017274863104644,
lawngreen: 0.7390589312496334,
lemonchiffon: 0.9403899224562171,
lightblue: 0.6370914128080659,
lightcoral: 0.35522120733134843,
lightcyan: 0.9458729349482863,
lightgoldenrodyellow: 0.9334835101829635,
lightgray: 0.651405637419824,
lightgreen: 0.6909197995686475,
lightgrey: 0.651405637419824,
lightpink: 0.5856615273489745,
lightsalmon: 0.47806752252059587,
lightseagreen: 0.3505014511704197,
lightskyblue: 0.5619563761833096,
lightslategray: 0.23830165007286924,
lightslategrey: 0.23830165007286924,
lightyellow: 0.9816181839288161,
lime: 0.7152,
limegreen: 0.44571042246097864,
linen: 0.8835734098437936,
magenta: 0.2848,
maroon: 0.04589194232421496,
mediumaquamarine: 0.4938970331080111,
mediumblue: 0.04407778021232784,
mediumorchid: 0.21639251153773428,
mediumpurple: 0.22905858091648004,
mediumseagreen: 0.34393112338131226,
mediumslateblue: 0.20284629471622434,
mediumspringgreen: 0.7070430819418444,
mediumturquois: 0.5133827926447991,
mediumvioletred: 0.14371899849357186,
midnightblue: 0.020717866350860484,
mintcream: 0.9783460494758793,
mistyrose: 0.8218304785918541,
moccasin: 0.8008300099156694,
navajowhite: 0.7651968234278562,
navy: 0.015585128108223519,
oldlace: 0.9190063340554899,
olive: 0.20027537200567563,
olivedrab: 0.2259315095192918,
orange: 0.48170267036309605,
orangered: 0.2551624375341641,
orchid: 0.3134880676143873,
palegoldenrod: 0.7879264788761452,
palegreen: 0.7793675900635259,
paleturquoise: 0.764360779217138,
palevioletred: 0.2875499411788909,
papayawhip: 0.8779710019983541,
peachpuff: 0.7490558987825108,
peru: 0.3011307487793569,
pink: 0.6327107070246611,
plum: 0.4573422158796909,
powderblue: 0.6825458650060524,
purple: 0.061477070432438476,
red: 0.2126,
rosyblue: 0.3231945764940708,
royalblue: 0.16663210743188323,
saddlebrown: 0.09792228502052071,
salmon: 0.3697724152759545,
sandybrown: 0.46628543696283414,
seagreen: 0.1973419970627483,
seashell: 0.927378622069223,
sienna: 0.13697631337097677,
silver: 0.527115125705813,
skyblue: 0.5529166851818412,
slateblue: 0.14784278062136097,
slategray: 0.20896704076536138,
slategrey: 0.20896704076536138,
slightsteelblue: 0.5398388828466575,
snow: 0.9653334183484877,
springgreen: 0.7305230606852947,
steelblue: 0.20562642207624846,
tan: 0.48237604163921527,
teal: 0.1699685577896842,
thistle: 0.5681840109373312,
tomato: 0.3063861271941505,
turquoise: 0.5895536427577983,
violet: 0.40315452986676303,
wheat: 0.7490970282048214,
white: 1,
whitesmoke: 0.913098651793419,
yellow: 0.9278,
yellowgreen: 0.5076295720870697
}, b = source.split(""), len = source.length, mapper = [], nosort = [], recordStore = function lexer_style_recordStore(index) {
return {
begin: data.begin[index],
lexer: data.lexer[index],
lines: data.lines[index],
presv: data.presv[index],
stack: data.stack[index],
token: data.token[index],
types: data.types[index]
};
}, recordPush = function lexer_style_recordPush(structure) {
const record = {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "style",
lines: parse.linesSpace,
presv: (ltype === "ignore")
? true
: false,
stack: parse.structure[parse.structure.length - 1][0],
token: ltoke,
types: ltype
};
parse.push(data, record, structure);
}, esctest = function lexer_style_esctest(xx) {
let yy = xx;
do {
xx = xx - 1;
} while (xx > 0 && b[xx] === "\\");
if ((yy - xx) % 2 === 0) {
return true;
}
return false;
},
// Since I am already identifying value types this is a good place to do some
// quick analysis and clean up on certain value conditions. These things are
// being corrected:
// * fractional values missing a leading 0 are provided a leading 0
// * 0 values with a dimension indicator (px, em) have the dimension
// indicator removed
// * eliminate unnecessary leading 0s
// * url values that are not quoted are wrapped in double quote characters
// * color values are set to lowercase and reduced from 6 to 3 digits if
// appropriate
value = function lexer_style_item_value(val) {
const x = val.split(""), values = [], transition = (data.token[parse.count - 2] === "transition"), colorPush = function lexer_style_item_value_colorPush(value) {
const vl = value.toLowerCase();
if ((/^(#[0-9a-f]{3,6})$/).test(vl) === true) {
colors.push(value);
}
else if ((/^(rgba?\()/).test(vl) === true) {
colors.push(value);
}
else if (colorNames[vl] !== undefined) {
colors.push(value);
}
return value;
};
let cc = 0, dd = 0, block = "", leng = x.length, items = [];
// this loop identifies containment so that tokens/sub-tokens are correctly
// taken
if (cc < leng) {
do {
items.push(x[cc]);
if (block === "") {
if (x[cc] === "\"") {
block = "\"";
dd = dd + 1;
}
else if (x[cc] === "'") {
block = "'";
dd = dd + 1;
}
else if (x[cc] === "(") {
block = ")";
dd = dd + 1;
}
else if (x[cc] === "[") {
block = "]";
dd = dd + 1;
}
}
else if ((x[cc] === "(" && block === ")") || (x[cc] === "[" && block === "]")) {
dd = dd + 1;
}
else if (x[cc] === block) {
dd = dd - 1;
if (dd === 0) {
block = "";
}
}
if (block === "" && x[cc] === " ") {
items.pop();
values.push(colorPush(items.join("")));
items = [];
}
cc = cc + 1;
} while (cc < leng);
}
values.push(colorPush(items.join("")));
leng = values.length;
//This is where the rules mentioned above are applied
cc = 0;
if (cc < leng) {
do {
if ((/^(0+([a-z]{2,3}|%))$/).test(values[cc]) === true && transition === false) {
values[cc] = "0";
}
else if ((/^(0+)/).test(values[cc]) === true) {
values[cc] = values[cc].replace(/0+/, "0");
if ((/\d/).test(values[cc].charAt(1)) === true) {
values[cc] = values[cc].substr(1);
}
}
else if ((/^url\((?!\$)/).test(values[cc]) === true && values[cc].charAt(values[cc].length - 1) === ")") {
block = values[cc].charAt(values[cc].indexOf("url(") + 4);
if (block !== "@" && block !== "{" && block !== "<") {
values[cc] = values[cc]
.replace(/url\(\s*('|")?/, "url(\"")
.replace(/(('|")?\s*\))$/, "\")");
}
}
cc = cc + 1;
} while (cc < leng);
}
return values.join(" ");
},
//the generic token builder
buildtoken = function lexer_style_build() {
let aa = a, bb = 0, out = [], outy = "", mappy = 0;
const block = [], comma = (parse.count > -1 && data.token[parse.count].charAt(data.token[parse.count].length - 1) === ","), spacestart = function lexer_style_build_spacestart() {
if ((/\s/).test(b[aa + 1]) === true) {
do {
aa = aa + 1;
} while ((/\s/).test(b[aa + 1]) === true);
}
};
//this loop accounts for grouping mechanisms
if (aa < len) {
do {
out.push(b[aa]);
if (b[aa - 1] !== "\\" || esctest(aa) === false) {
if (b[aa] === "\"" && block[block.length - 1] !== "'") {
if (block[block.length - 1] === "\"") {
block.pop();
}
else {
block.push("\"");
}
}
else if (b[aa] === "'" && block[block.length - 1] !== "\"") {
if (block[block.length - 1] === "'") {
block.pop();
}
else {
block.push("'");
}
}
else if (block[block.length - 1] !== "\"" && block[block.length - 1] !== "'") {
if (b[aa] === "(") {
mappy = mappy + 1;
block.push(")");
spacestart();
}
else if (b[aa] === "[") {
block.push("]");
spacestart();
}
else if (b[aa] === "#" && b[aa + 1] === "{") {
out.push("{");
aa = aa + 1;
block.push("}");
spacestart();
}
else if (b[aa] === block[block.length - 1]) {
block.pop();
if ((/\s/).test(out[out.length - 2]) === true) {
out.pop();
do {
out.pop();
} while ((/\s/).test(out[out.length - 1]) === true);
out.push(b[aa]);
}
}
}
}
if (parse.structure[parse.structure.length - 1][0] === "map" && block.length === 0 && (b[aa + 1] === "," || b[aa + 1] === ")")) {
if (b[aa + 1] === ")" && data.token[parse.count] === "(") {
parse.pop(data);
out = ["("];
aa = a - 1;
}
else {
break;
}
}
if (b[aa + 1] === ":") {
bb = aa;
if ((/\s/).test(b[bb]) === true) {
do {
bb = bb - 1;
} while ((/\s/).test(b[bb]) === true);
}
outy = b
.slice(bb - 6, bb + 1)
.join("");
if (outy.indexOf("filter") === outy.length - 6 || outy.indexOf("progid") === outy.length - 6) {
outy = "filter";
}
}
if (block.length === 0 && ((b[aa + 1] === ";" && esctest(aa + 1) === false) || (b[aa + 1] === ":" && b[aa] !== ":" && b[aa + 2] !== ":" && outy !== "filter" && outy !== "progid") || b[aa + 1] === "}" || b[aa + 1] === "{" || (b[aa + 1] === "/" && (b[aa + 2] === "*" || b[aa + 2] === "/")))) {
bb = out.length - 1;
if ((/\s/).test(out[bb]) === true) {
do {
bb = bb - 1;
aa = aa - 1;
out.pop();
} while ((/\s/).test(out[bb]) === true);
}
break;
}
if (out[0] === "@" && block.length === 0 && (b[aa + 1] === "\"" || b[aa + 1] === "'")) {
break;
}
aa = aa + 1;
} while (aa < len);
}
a = aa;
if (parse.structure[parse.structure.length - 1][0] === "map" && out[0] === "(") {
mapper[mapper.length - 1] = mapper[mapper.length - 1] - 1;
}
if (comma === true && parse.structure[parse.structure.length - 1][0] !== "map" && data.types[parse.count] !== "comment" && data.types[parse.count] !== "ignore") {
data.token[parse.count] = data.token[parse.count] + out
.join("")
.replace(/\s+/g, " ")
.replace(/^\s/, "")
.replace(/\s$/, "");
return;
}
ltoke = out
.join("")
.replace(/\s+/g, " ")
.replace(/^\s/, "")
.replace(/\s$/, "");
if (parse.count > -1 && data.token[parse.count].indexOf("extend(") === 0) {
ltype = "pseudo";
}
else if (parse.count > -1 && "\"'".indexOf(data.token[parse.count].charAt(0)) > -1 && data.types[parse.count] === "variable") {
ltype = "item";
}
else if (out[0] === "@" || out[0] === "$") {
if (data.types[parse.count] === "colon" && (data.types[parse.count - 1] === "property" || data.types[parse.count - 1] === "variable")) {
ltype = "value";
}
else if (parse.count > -1) {
ltype = "variable";
outy = data.token[parse.count];
aa = outy.indexOf("(");
if (outy.charAt(outy.length - 1) === ")" && aa > 0) {
outy = outy.slice(aa + 1, outy.length - 1);
data.token[parse.count] = data
.token[parse.count]
.slice(0, aa + 1) + value(outy) + ")";
}
}
else {
ltype = "variable";
}
}
else {
ltype = "item";
}
recordPush("");
},
// Some tokens receive a generic type named 'item' because their type is unknown
// until we know the following syntax. This function replaces the type 'item'
// with something more specific.
item = function lexer_style_item(type) {
let aa = parse.count + 1, bb = 0;
const coms = [], tokel = (parse.count > 0)
? data.token[parse.count - 1]
: "", toked = tokel.slice(tokel.length - 2);
//backtrack through immediately prior comments to find the correct token
if (ltype === "comment" || ltype === "ignore") {
do {
aa = aa - 1;
ltype = data.types[aa];
coms.push(data.token[aa]);
} while (aa > 0 && (ltype === "comment" || ltype === "ignore"));
}
else {
aa = aa - 1;
}
//if the last non-comment type is 'item' then id it
if (ltype === "item" && data.lexer[aa] === "style") {
if (type === "start") {
if (data.types[aa - 1] !== "comment" && data.types[aa - 1] !== "ignore" && data.types[aa - 1] !== "end" && data.types[aa - 1] !== "start" && data.types[aa - 1] !== "semi" && data.types[aa - 1] !== undefined && data.lexer[aa - 1] === "style") {
let cc = aa, dd = 0;
const parts = [];
do {
parts.push(data.token[cc]);
if (data.lines[cc] > 0 && data.token[cc] === ":" && data.token[cc - 1] !== ":") {
parts.push(" ");
}
else if (data.token[cc] !== ":") {
parts.push(" ");
}
cc = cc - 1;
} while (cc > -1 && data.types[cc] !== "comment" && data.types[cc] !== "ignore" && data.types[cc] !== "end" && data.types[cc] !== "start" && data.types[cc] !== "semi" && data.types[cc] !== undefined);
parts.reverse();
cc = cc + 1;
dd = aa - cc;
parse.splice({ data: data, howmany: dd, index: cc, record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
} });
aa = aa - dd;
data.token[aa] = parts
.join("")
.replace(/:\u0020/g, ":")
.replace(/(\s*,\s*)/g, ",");
}
else {
data.token[aa] = data
.token[aa]
.replace(/(\s*,\s*)/g, ",");
}
data.token[aa] = data
.token[aa]
.replace(/\s*&/, " &")
.replace(/\s*>\s*/g, " > ")
.replace(/:\s+/g, ": ")
.replace(/^(\s+)/, "")
.replace(/(\s+)$/, "")
.replace(/\s+::\s+/, "::");
let y = 0, z = "", mark = 0;
const toke = data.token[aa], slen = toke.length, list = [];
if (y < slen) {
do {
if (z === "" && toke.charAt(y) === ",") {
list.push(toke.slice(mark, y));
mark = y + 1;
}
else if (toke.charAt(y) === "\"" || toke.charAt(y) === "'" || toke.charAt(y) === "(" || toke.charAt(y) === "{") {
z = toke.charAt(y);
}
else if (toke.charAt(y) === z && (z === "\"" || z === "''")) {
z = "";
}
else if (toke.charAt(y) === ")" && z === "(") {
z = "";
}
else if (toke.charAt(y) === "}" && z === "{") {
z = "";
}
y = y + 1;
} while (y < slen);
}
list.push(toke.slice(mark, y));
list.sort();
data.token[aa] = list
.join(",")
.replace(/^(\s+)/, "");
data.types[aa] = "selector";
ltype = "selector";
}
else if (type === "end") {
data.types[aa] = "value";
ltype = "value";
data.token[aa] = data
.token[aa]
.replace(/\s*!\s+important/, " !important");
data.token[aa] = value(data.token[aa]);
//take comments out until the 'item' is found and then put the comments back
if (data.token[parse.count - 1] === "{") {
data.types[parse.count] = "variable";
}
else if (parse.structure[parse.structure.length - 1][0] === data.token[data.begin[parse.count] - 1] && options.correct === true) {
if (coms.length > 0 && ltype !== "semi" && ltype !== "end" && ltype !== "start") {
aa = coms.length - 1;
do {
parse.pop(data);
aa = aa - 1;
} while (aa > 0);
ltoke = ";";
ltype = "semi";
recordPush("");
bb = coms.length - 1;
do {
ltoke = coms[aa];
ltype = "comment";
recordPush("");
aa = aa + 1;
} while (aa < bb);
}
else {
ltoke = ";";
ltype = "semi";
recordPush("");
}
}
}
else if (type === "semi") {
if (data.types[aa - 1] === "colon") {
data.types[aa] = "value";
ltype = "value";
data.token[aa] = data
.token[aa]
.replace(/\s*!\s+important/, " !important");
data.token[aa] = value(data.token[aa]);
}
else {
//properties without values are considered variables
if (data.types[aa] !== "value") {
if (data.types[aa] === "item" && data.types[aa - 1] === "value" && (toked === "}}" || toked === "?>" || toked === "->" || toked === "%}" || toked === "%>")) {
if (Number.isNaN(Number(data.token[parse.count])) === false) {
data.token[parse.count - 1] = tokel + data.token[parse.count];
}
else {
data.token[parse.count - 1] = tokel + " " + data.token[parse.count];
}
parse.pop(data);
return;
}
data.types[aa] = "variable";
ltype = "variable";
}
if (data.token[aa].indexOf("\"") > 0) {
bb = data
.token[aa]
.indexOf("\"");
a = a - (data.token[aa].length - bb);
data.token[aa] = data
.token[aa]
.slice(0, bb);
buildtoken();
}
else if (data.token[aa].indexOf("'") > 0) {
bb = data
.token[aa]
.indexOf("'");
a = a - (data.token[aa].length - bb);
data.token[aa] = data
.token[aa]
.slice(0, bb);
buildtoken();
}
else if ((/\s/).test(data.token[aa]) === true) {
bb = data
.token[aa]
.replace(/\s/, " ")
.indexOf(" ");
if (bb < data.token[aa].indexOf("(") && bb < data.token[aa].indexOf("[")) {
a = a - (data.token[aa].length - bb);
data.token[aa] = data
.token[aa]
.slice(0, bb);
buildtoken();
}
}
}
}
else if (type === "colon") {
data.types[aa] = "property";
ltype = "property";
}
else if (data.token[aa].charAt(0) === "@" && ((data.types[aa - 2] !== "variable" && data.types[aa - 2] !== "property") || data.types[aa - 1] === "semi")) {
data.types[aa] = "variable";
ltype = "variable";
}
}
}, semiComment = function lexer_style_semiComment() {
let x = parse.count;
do {
x = x - 1;
} while (x > 0 && (data.types[x] === "comment"));
parse.splice({
data: data,
howmany: 0,
index: x + 1,
record: {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "style",
lines: parse.linesSpace,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: ";",
types: "semi"
}
});
}, template = function lexer_style_template(open, end) {
let quote = "", name = "", start = open.length, endlen = 0;
const store = [], exit = function lexer_style_template_exit(typename) {
const endtype = data.types[parse.count - 1];
if (ltype === "item") {
if (endtype === "colon") {
data.types[parse.count] = "value";
}
else {
item(endtype);
}
}
ltype = typename;
recordPush("");
};
nosort[nosort.length - 1] = true;
if (a < len) {
do {
store.push(b[a]);
if (quote === "") {
if (b[a] === "\"") {
quote = "\"";
}
else if (b[a] === "'") {
quote = "'";
}
else if (b[a] === "/") {
if (b[a + 1] === "/") {
quote = "/";
}
else if (b[a + 1] === "*") {
quote = "*";
}
}
else if (b[a + 1] === end.charAt(0)) {
do {
endlen = endlen + 1;
a = a + 1;
store.push(b[a]);
} while (a < len && endlen < end.length && b[a + 1] === end.charAt(endlen));
if (endlen === end.length) {
quote = store.join("");
if ((/\s/).test(quote.charAt(start)) === true) {
do {
start = start + 1;
} while ((/\s/).test(quote.charAt(start)) === true);
}
endlen = start;
do {
endlen = endlen + 1;
} while (endlen < end.length && (/\s/).test(quote.charAt(endlen)) === false);
if (endlen === quote.length) {
endlen = endlen - end.length;
}
if (open === "{%") {
if (quote.indexOf("{%-") === 0) {
quote = quote
.replace(/^(\{%-\s*)/, "{%- ")
.replace(/(\s*-%\})$/, " -%}");
name = quote.slice(4);
}
else {
quote = quote
.replace(/^(\{%\s*)/, "{% ")
.replace(/(\s*%\})$/, " %}");
name = quote.slice(3);
}
}
if (open === "{{") {
quote = quote
.replace(/^(\{\{\s+)/, "{{")
.replace(/(\s+\}\})$/, "}}");
}
if (ltype === "item" && data.types[parse.count - 1] === "colon" && (data.types[parse.count - 2] === "property" || data.types[parse.count - 2] === "variable")) {
ltype = "value";
data.types[parse.count] = "value";
if (Number.isNaN(Number(data.token[parse.count])) === true && data.token[parse.count].charAt(data.token[parse.count].length - 1) !== ")") {
data.token[parse.count] = data.token[parse.count] + quote;
}
else {
data.token[parse.count] = data.token[parse.count] + " " + quote;
}
return;
}
ltoke = quote;
if (open === "{%") {
const templateNames = [
"autoescape",
"block",
"capture",
"case",
"comment",
"embed",
"filter",
"for",
"form",
"if",
"macro",
"paginate",
"raw",
"sandbox",
"spaceless",
"tablerow",
"unless",
"verbatim"
];
let namesLen = templateNames.length - 1;
name = name.slice(0, name.indexOf(" "));
if (name.indexOf("(") > 0) {
name = name.slice(0, name.indexOf("("));
}
if (name === "else" || name === "elseif" || name === "when" || name === "elif") {
exit("template_else");
return;
}
namesLen = templateNames.length - 1;
if (namesLen > -1) {
do {
if (name === templateNames[namesLen]) {
exit("template_start");
return;
}
if (name === "end" + templateNames[namesLen]) {
exit("template_end");
return;
}
namesLen = namesLen - 1;
} while (namesLen > -1);
}
}
else if (open === "{{") {
let group = quote.slice(2), ending = group.length, begin = 0;
do {
begin = begin + 1;
} while (begin < ending && (/\s/).test(group.charAt(begin)) === false && group.charAt(start) !== "(");
group = group.slice(0, begin);
if (group.charAt(group.length - 2) === "}") {
group = group.slice(0, group.length - 2);
}
if (group === "end") {
exit("template_end");
return;
}
if (group === "block" || group === "define" || group === "form" || group === "if" || group === "range" || group === "with") {
exit("template_start");
return;
}
}
exit("template");
return;
}
endlen = 0;
}
}
else if (quote === b[a]) {
if (quote === "\"" || quote === "'") {
quote = "";
}
else if (quote === "/" && (b[a] === "\r" || b[a] === "\n")) {
quote = "";
}
else if (quote === "*" && b[a + 1] === "/") {
quote = "";
}
}
a = a + 1;
} while (a < len);
}
},
//finds comments including those JS looking '//' comments
comment = function lexer_style_comment(inline) {
let aa = a + 1, bb = 0, ender = [], ignorecom = [], extra = "";
const out = [b[a]], store = [];
if (aa < len) {
do {
out.push(b[aa]);
if ((inline === false && b[aa - 1] === "*" && b[aa] === "/") || (inline === true && (b[aa + 1] === "\n" || b[aa + 1] === "\r"))) {
break;
}
aa = aa + 1;
} while (aa < len);
}
if (ltype === "item") {
bb = aa;
do {
bb = bb + 1;
if (b[bb] === "/") {
if (b[bb + 1] === "*" || b[bb + 1] === "/") {
extra = b[bb + 1];
}
else if (b[bb - 1] === "*" && extra === "*") {
extra = "";
bb = bb + 1;
}
}
else if ((b[bb] === "\n" || b[bb] === "\r") && extra === "/") {
extra = "";
bb = bb + 1;
}
} while (bb < len && ((extra === "" && (/\s/).test(b[bb]) === true) || extra !== ""));
if (b[bb] === "{") {
item("start");
}
else if (b[bb] === "}") {
item("end");
}
else if (b[bb] === ";") {
item("semi");
}
else if (b[bb] === ":") {
item("colon");
}
else {
item("");
}
}
a = aa;
ltype = "comment";
ltoke = out.join("");
if ((/^(\/(\/|\*)\s*parse-ignore-start)/).test(ltoke) === true) {
do {
if (ender[0] === undefined && (b[bb] === "/" || b[bb] === "*") && b[bb - 1] === "/") {
ignorecom.push(b[bb - 1]);
if (b[bb] === "*") {
ender = ["*", "/"];
}
else {
ender = ["\n"];
}
}
else if ((b[bb] === ender[1] || ender[1] === undefined) && b[bb - 1] === ender[0]) {
if ((/^(\/(\/|\*)\s*parse-ignore-end)/).test(ignorecom.join("")) === true) {
a = bb - 1;
ltoke = out.join("");
ltype = "ignore";
break;
}
ignorecom = [];
ender = [];
}
if (ender[0] !== undefined) {
ignorecom.push(b[bb]);
}
out.push(b[bb]);
bb = bb + 1;
} while (bb < len);
if (bb === len) {
ltoke = out.join("");
ltype = "ignore";
a = bb;
}
}
if (parse.count > -1 && store.length > 0 && (ltype === "selector" || ltype === "variable") && data.types[parse.count] !== "comment" && data.types[parse.count] !== "ignore") {
parse.pop(data);
recordPush("");
ltoke = store[0].token;
ltype = (ltype === "variable")
? "variable"
: "selector";
recordPush("");
}
else if (ltype === "colon" || ltype === "property" || ltype === "value") {
do {
store.push(recordStore(parse.count));
parse.pop(data);
} while (parse.count > 0 && data.types[parse.count] !== "semi" && data.types[parse.count] !== "start");
recordPush("");
do {
parse.push(data, store.pop(), "");
} while (store.length > 0);
}
else {
recordPush("");
}
},
//do fancy things to property types like: sorting, consolidating, and padding
properties = function lexer_style_properties() {
let aa = parse.count, bb = 1, cc = 0, dd = 0, next = 0, leng = 0;
const p = [], set = [
[]
], store = {
begin: [],
lexer: [],
lines: [],
presv: [],
stack: [],
token: [],
types: []
}, fourcount = function lexer_style_properties_propcheck_fourcount(name) {
let test = [
false, false, false, false
], val = [
"0", "0", "0", "0"
], valsplit = [], start = aa, yy = -1, zz = 0;
const zero = (/^(0+([a-z]+|%))/), storage = function lexer_style_properties_propcheck_fourcount_storage(side) {
yy = yy + 1;
val[side] = data.token[set[aa][2]];
test[side] = true;
if (start < 0) {
start = aa;
}
};
if (aa < leng) {
do {
if (data.token[set[aa][2]] !== undefined && data.token[set[aa][0]].indexOf(name) === 0) {
if (data.token[set[aa][0]] === name || data.token[set[aa][0]].indexOf(name + " ") === 0) {
yy = yy + 1;
valsplit = data
.token[set[aa][2]]
.split(" ");
if (valsplit.length === 1) {
val = [
data.token[set[aa][2]],
data.token[set[aa][2]],
data.token[set[aa][2]],
data.token[set[aa][2]]
];
}
else if (valsplit.length === 2) {
val = [
valsplit[0], valsplit[1], valsplit[0], valsplit[1]
];
}
else if (valsplit.length === 3) {
val = [
valsplit[0], valsplit[1], valsplit[2], valsplit[1]
];
}
else if (valsplit.length === 4) {
val = [
valsplit[0], valsplit[1], valsplit[2], valsplit[3]
];
}
else {
return;
}
test = [true, true, true, true];
}
else if (data.token[set[aa][0]].indexOf(name + "-bottom") === 0) {
storage(2);
}
else if (data.token[set[aa][0]].indexOf(name + "-left") === 0) {
storage(3);
}
else if (data.token[set[aa][0]].indexOf(name + "-right") === 0) {
storage(1);
}
else if (data.token[set[aa][0]].indexOf(name + "-top") === 0) {
storage(0);
}
}
if (aa === leng - 1 || set[aa + 1] === undefined || data.token[set[aa + 1][0]].indexOf(name) < 0) {
if (test[0] === true && test[1] === true && test[2] === true && test[3] === true) {
set.splice(start + 1, yy);
leng = leng - yy;
aa = aa - yy;
zz = 0;
bb = p.length;
do {
if (p[zz] === set[start][0]) {
break;
}
zz = zz + 1;
} while (zz < bb);
if (zz < bb) {
p.splice(zz + 1, yy);
}
data.token[set[start][0]] = name;
if (zero.test(val[0]) === true) {
val[0] = "0";
}
if (zero.test(val[1]) === true) {
val[1] = "0";
}
if (zero.test(val[2]) === true) {
val[2] = "0";
}
if (zero.test(val[3]) === true) {
val[3] = "0";
}
if (val[1] === val[3]) {
val.pop();
if (val[0] === val[2]) {
val.pop();
if (val[0] === val[1]) {
val.pop();
}
}
}
data.token[set[start][2]] = val.join(" ");
if (data.token[set[start][2]].indexOf("!important") > 0) {
data.token[set[start][2]] = data
.token[set[start][2]]
.replace(/\s!important/g, "") + " !important";
}
}
break;
}
aa = aa + 1;
} while (aa < leng);
}
};
//identify properties and build out prop/val sets
do {
if (data.types[aa] === "start") {
bb = bb - 1;
if (bb === 0) {
next = aa;
set.pop();
aa = set.length - 1;
if (aa > -1) {
do {
set[aa].reverse();
aa = aa - 1;
} while (aa > -1);
}
break;
}
}
if (data.types[aa] === "end") {
bb = bb + 1;
}
if (bb === 1 && (data.types[aa] === "property" || (data.types[aa] === "variable" && data.types[aa + 1] === "colon"))) {
p.push(aa);
}
set[set.length - 1].push(aa);
if (bb === 1 && (data.types[aa - 1] === "comment" || data.types[aa - 1] === "semi" || data.types[aa - 1] === "end" || data.types[aa - 1] === "start") && data.types[aa] !== "start" && data.types[aa] !== "end") {
set.push([]);
}
aa = aa - 1;
} while (aa > -1);
//this reverse fixes the order of consecutive comments
set.reverse();
p.reverse();
//consolidate margin and padding
leng = set.length;
aa = 0;
if (aa < leng) {
do {
if (data.types[set[aa][0]] === "property") {
if (data.token[set[aa][0]].indexOf("margin") === 0) {
fourcount("margin");
}
if (data.token[set[aa][0]].indexOf("padding") === 0) {
fourcount("padding");
}
}
aa = aa + 1;
} while (aa < leng);
}
bb = set.length;
aa = 0;
if (aa < bb) {
do {
dd = set[aa].length;
cc = 0;
if (cc < dd) {
do {
parse.push(store, recordStore(set[aa][cc]), "");
cc = cc + 1;
} while (cc < dd);
}
aa = aa + 1;
} while (aa < bb);
}
//replace a block's data with sorted analyzed data
parse.splice({
data: data,
howmany: parse.count - next,
index: next + 1,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
parse.concat(data, store);
};
//token building loop
do {
if ((/\s/).test(b[a]) === true) {
a = parse.spacer({ array: b, end: len, index: a });
}
else if (b[a] === "/" && b[a + 1] === "*") {
comment(false);
}
else if (b[a] === "/" && b[a + 1] === "/") {
comment(true);
}
else if (b[a] === "<" && b[a + 1] === "?" && b[a + 2] === "p" && b[a + 3] === "h" && b[a + 4] === "p") {
//php
template("<?php", "?>");
}
else if (b[a] === "<" && b[a + 1] === "%") {
//asp
template("<%", "%>");
}
else if (b[a] === "{" && b[a + 1] === "%") {
//asp
template("{%", "%}");
}
else if (b[a] === "{" && b[a + 1] === "{" && b[a + 2] === "{") {
//mustache
template("{{{", "}}}");
}
else if (b[a] === "{" && b[a + 1] === "{") {
//handlebars
template("{{", "}}");
}
else if (b[a] === "<" && b[a + 1] === "!" && b[a + 2] === "-" && b[a + 3] === "-" && b[a + 4] === "#") {
//ssi
template("<!--#", "-->");
}
else if (b[a] === "@" && b[a + 1] === "e" && b[a + 2] === "l" && b[a + 3] === "s" && b[a + 4] === "e" && (b[a + 5] === "{" || (/\s/).test(b[a + 5]) === true)) {
ltoke = "@else";
ltype = "template_else";
recordPush("");
a = a + 4;
}
else if (b[a] === "{" || (b[a] === "(" && data.token[parse.count] === ":" && data.types[parse.count - 1] === "variable")) {
if (b[a] === "{" && data.token[parse.count - 1] === ":") {
data.types[parse.count] = "pseudo";
}
item("start");
ltype = "start";
ltoke = b[a];
if (b[a] === "(") {
recordPush("map");
mapper.push(0);
}
else if (data.types[parse.count] === "selector" || data.types[parse.count] === "variable") {
recordPush(data.token[parse.count]);
}
else if (data.types[parse.count] === "colon") {
recordPush(data.token[parse.count - 1]);
}
else {
recordPush("block");
}
nosort.push(false);
}
else if (b[a] === "}" || (b[a] === ")" && parse.structure[parse.structure.length - 1][0] === "map" && mapper[mapper.length - 1] === 0)) {
endtest = true;
if (b[a] === "}" && data.types[parse.count] === "item" && data.token[parse.count - 1] === "{" && data.token[parse.count - 2] !== undefined && data.token[parse.count - 2].charAt(data.token[parse.count - 2].length - 1) === "@") {
data.token[parse.count - 2] = data.token[parse.count - 2] + "{" + data.token[parse.count] +
"}";
parse.pop(data);
parse.pop(data);
}
else {
if (b[a] === ")") {
mapper.pop();
}
item("end");
if (b[a] === "}" && data.token[parse.count] !== ";" && options.correct === true) {
if (data.types[parse.count] === "value") {
ltoke = ";";
ltype = "semi";
recordPush("");
}
else if (data.types[parse.count] === "comment") {
semiComment();
}
}
properties();
ltype = "end";
if (options.lexerOptions.style.objectSort === true && nosort[nosort.length - 1] === false) {
parse.objectSort(data);
}
nosort.pop();
ltoke = b[a];
ltype = "end";
recordPush("");
}
}
else if (b[a] === ";" || (b[a] === "," && parse.structure[parse.structure.length - 1][0] === "map")) {
item("semi");
if (data.types[parse.count] !== "semi" && data.types[parse.count] !== "start" && esctest(a) === false) {
ltoke = b[a];
ltype = "semi";
recordPush("");
}
}
else if (b[a] === ":" && data.types[parse.count] !== "end") {
item("colon");
ltoke = ":";
ltype = "colon";
recordPush("");
}
else {
if (parse.structure[parse.structure.length - 1][0] === "map" && b[a] === "(") {
mapper[mapper.length - 1] = mapper[mapper.length - 1] + 1;
}
buildtoken();
}
a = a + 1;
} while (a < len);
if (endtest === false) {
properties();
}
return data;
};
framework.lexer.style = style;
}());
/*global global*/
(function script_init() {
"use strict";
const framework = window.parseFramework, script = function lexer_script(source) {
let a = 0, ltoke = "", ltype = "", lword = [], pword = [], lengthb = 0, wordTest = -1, paren = -1, tempstore, pstack;
const parse = framework.parse, data = parse.data, options = parse.options, sourcemap = [
0, ""
], b = source.length, c = source.split(""), brace = [], classy = [],
// depth and status of templateStrings
templateString = [],
// identify variable declarations
vart = {
count: [],
index: [],
len: -1,
word: []
},
// peek at whats up next
nextchar = function lexer_script_nextchar(len, current) {
let cc = (current === true)
? a
: a + 1, dd = "";
if (typeof len !== "number" || len < 1) {
len = 1;
}
if (c[a] === "/") {
if (c[a + 1] === "/") {
dd = "\n";
}
else if (c[a + 1] === "*") {
dd = "/";
}
}
if (cc < b) {
do {
if ((/\s/).test(c[cc]) === false) {
if (c[cc] === "/") {
if (dd === "") {
if (c[cc + 1] === "/") {
dd = "\n";
}
else if (c[cc + 1] === "*") {
dd = "/";
}
}
else if (dd === "/" && c[cc - 1] === "*") {
dd = "";
}
}
if (dd === "" && c[cc - 1] + c[cc] !== "*/") {
return c
.slice(cc, cc + len)
.join("");
}
}
else if (dd === "\n" && c[cc] === "\n") {
dd = "";
}
cc = cc + 1;
} while (cc < b);
}
return "";
},
// cleans up improperly applied ASI
asifix = function lexer_script_asifix() {
let len = parse.count;
do {
len = len - 1;
} while (len > 0 && data.types[len] === "comment");
if (data.token[len] === "from") {
len = len - 2;
}
if (data.token[len] === "x;") {
parse.splice({ data: data, howmany: 1, index: len, record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
} });
}
},
// determine the definition of containment by stack
recordPush = function lexer_script_recordPush(structure) {
const record = {
begin: parse.structure[parse.structure.length - 1][1],
lexer: "script",
lines: parse.linesSpace,
presv: false,
stack: parse.structure[parse.structure.length - 1][0],
token: ltoke,
types: ltype
};
if ((/^(\/(\/|\*)\s*parse-ignore-start)/).test(ltoke) === true) {
record.presv = true;
record.types = "ignore";
}
parse.push(data, record, structure);
},
// remove "vart" object data
vartpop = function lexer_script_vartpop() {
vart
.count
.pop();
vart
.index
.pop();
vart
.word
.pop();
vart.len = vart.len - 1;
},
// A lexer for keywords, reserved words, and variables
word = function lexer_script_word() {
let f = wordTest, g = 1, output = "", nextitem = "";
const lex = [], elsefix = function lexer_script_word_elsefix() {
brace.push("x{");
parse.splice({
data: data,
howmany: 1,
index: parse.count - 3,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
}, builder = function lexer_script_word_builder(index) {
return {
begin: data.begin[index],
lexer: data.lexer[index],
lines: data.lines[index],
presv: data.presv[index],
stack: data.stack[index],
token: data.token[index],
types: data.types[index]
};
};
do {
lex.push(c[f]);
if (c[f] === "\\") {
framework.parseerror = "Illegal escape in JavaScript on line number " + parse.lineNumber;
}
f = f + 1;
} while (f < a);
output = lex.join("");
wordTest = -1;
if (parse.count > 0 && output === "function" && data.token[parse.count] === "(" && (data.token[parse.count - 1] === "{" || data.token[parse.count - 1] === "x{")) {
data.types[parse.count] = "start";
}
if (parse.count > 1 && output === "function" && ltoke === "(" && (data.token[parse.count - 1] === "}" || data.token[parse.count - 1] === "x}")) {
if (data.token[parse.count - 1] === "}") {
f = parse.count - 2;
if (f > -1) {
do {
if (data.types[f] === "end") {
g = g + 1;
}
else if (data.types[f] === "start" || data.types[f] === "end") {
g = g - 1;
}
if (g === 0) {
break;
}
f = f - 1;
} while (f > -1);
}
if (data.token[f] === "{" && data.token[f - 1] === ")") {
g = 1;
f = f - 2;
if (f > -1) {
do {
if (data.types[f] === "end") {
g = g + 1;
}
else if (data.types[f] === "start" || data.types[f] === "end") {
g = g - 1;
}
if (g === 0) {
break;
}
f = f - 1;
} while (f > -1);
}
if (data.token[f - 1] !== "function" && data.token[f - 2] !== "function") {
data.types[parse.count] = "start";
}
}
}
else {
data.types[parse.count] = "start";
}
}
if (options.correct === true && (output === "Object" || output === "Array") && c[a + 1] === "(" && c[a + 2] === ")" && data.token[parse.count - 1] === "=" && data.token[parse.count] === "new") {
if (output === "Object") {
data.token[parse.count] = "{";
ltoke = "}";
data.stack[parse.count] = "object";
parse.structure[parse.structure.length - 1][0] = "object";
}
else {
data.token[parse.count] = "[";
ltoke = "]";
data.stack[parse.count] = "array";
parse.structure[parse.structure.length - 1][0] = "array";
}
data.types[parse.count] = "start";
ltype = "end";
c[a + 1] = "";
c[a + 2] = "";
a = a + 2;
}
else {
g = parse.count;
f = g;
if (options.lexerOptions.script.varword !== "none" && (output === "var" || output === "let" || output === "const")) {
if (data.types[g] === "comment") {
do {
g = g - 1;
} while (g > 0 && (data.types[g] === "comment"));
}
if (options.lexerOptions.script.varword === "list" && vart.len > -1 && vart.index[vart.len] === g && output === vart.word[vart.len]) {
ltoke = ",";
ltype = "separator";
data.token[g] = ltoke;
data.types[g] = ltype;
vart.count[vart.len] = 0;
vart.index[vart.len] = g;
vart.word[vart.len] = output;
return;
}
vart.len = vart.len + 1;
vart
.count
.push(0);
vart
.index
.push(g);
vart
.word
.push(output);
g = f;
}
else if (vart.len > -1 && output !== vart.word[vart.len] && parse.count === vart.index[vart.len] && data.token[vart.index[vart.len]] === ";" && ltoke !== vart.word[vart.len] && options.lexerOptions.script.varword === "list") {
vartpop();
}
if (output === "else" && data.types[g] === "comment") {
do {
f = f - 1;
} while (f > -1 && data.types[f] === "comment");
if (data.token[f] === "x;" && (data.token[f - 1] === "}" || data.token[f - 1] === "x}")) {
parse.splice({ data: data, howmany: 1, index: f, record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
} });
g = g - 1;
f = f - 1;
}
do {
tempstore = parse.pop(data);
parse.splice({
data: data,
howmany: 0,
index: g - 3,
record: builder(g)
});
f = f + 1;
} while (f < g);
}
if (output === "from" && data.token[parse.count] === "x;" && data.token[parse.count - 1] === "}") {
asifix();
}
if (output === "while" && data.token[parse.count] === "x;" && data.token[parse.count - 1] === "}") {
let d = 0, e = parse.count - 2;
if (e > -1) {
do {
if (data.types[e] === "end") {
d = d + 1;
}
else if (data.types[e] === "start") {
d = d - 1;
}
if (d < 0) {
if (data.token[e] === "{" && data.token[e - 1] === "do") {
asifix();
}
return;
}
e = e - 1;
} while (e > -1);
}
}
ltoke = output;
ltype = "word";
if (output === "from" && data.token[parse.count] === "}") {
asifix();
}
}
recordPush("");
if (output === "class") {
classy.push(0);
}
if (output === "do") {
nextitem = nextchar(1, true);
if (nextitem !== "{") {
ltoke = "x{";
ltype = "start";
brace.push("x{");
recordPush("do");
}
}
if (output === "else") {
nextitem = nextchar(2, true);
if (data.token[parse.count - 1] === "x}") {
if (data.token[parse.count] === "else") {
if (data.stack[parse.count - 1] !== "if" && data.stack[parse.count - 1] !== "else") {
brace.pop();
parse.splice({
data: data,
howmany: 0,
index: parse.count - 1,
record: {
begin: data.begin[data.begin[data.begin[parse.count - 1] - 1] - 1],
lexer: "script",
lines: 0,
presv: false,
stack: "if",
token: "x}",
types: "end"
}
});
if (parse.structure.length > 1) {
parse.structure.splice(parse.structure.length - 2, 1);
parse.structure[parse.structure.length - 1][1] = parse.count;
}
}
else if (data.token[parse.count - 2] === "x}" && pstack[0] !== "if" && data.stack[parse.count] === "else") {
elsefix();
}
else if (data.token[parse.count - 2] === "}" && data.stack[parse.count - 2] === "if" && pstack[0] === "if" && data.token[pstack[1] - 1] !== "if" && data.token[data.begin[parse.count - 1]] === "x{") {
// fixes when "else" is following a block that isn't "if"
elsefix();
}
}
else if (data.token[parse.count] === "x}" && data.stack[parse.count] === "if") {
elsefix();
}
}
if (nextitem !== "if" && nextitem.charAt(0) !== "{") {
ltoke = "x{";
ltype = "start";
brace.push("x{");
recordPush("else");
}
}
if ((output === "for" || output === "if" || output === "switch" || output === "catch") && options.lang !== "twig" && data.token[parse.count - 1] !== ".") {
nextitem = nextchar(1, true);
if (nextitem !== "(") {
paren = parse.count;
start("x(");
}
}
},
// determines if a slash comprises a valid escape or if it is escaped itself
slashes = function lexer_script_slashes(index) {
let slashy = index;
do {
slashy = slashy - 1;
} while (c[slashy] === "\\" && slashy > 0);
if ((index - slashy) % 2 === 1) {
return true;
}
return false;
},
// the generic function is a generic tokenizer start argument contains the
// token's starting syntax offset argument is length of start minus control
// chars end is how is to identify where the token ends
generic = function lexer_script_genericBuilder(starting, ending) {
let ee = 0, output = "", escape = false, ignorecom = [], build = [starting], ender = ending.split("");
const endlen = ender.length, jj = b, base = a + starting.length;
if (wordTest > -1) {
word();
}
// this insanity is for JSON where all the required quote characters are
// escaped.
if (c[a - 1] === "\\" && slashes(a - 1) === true && (c[a] === "\"" || c[a] === "'")) {
parse.pop(data);
if (data.token[0] === "{") {
if (c[a] === "\"") {
starting = "\"";
ending = "\\\"";
build = ["\""];
}
else {
starting = "'";
ending = "\\'";
build = ["'"];
}
escape = true;
}
else {
if (c[a] === "\"") {
return "\\\"";
}
return "\\'";
}
}
ee = base;
if (ee < jj) {
do {
if (ee > a + 1) {
if (c[ee] === "<" && c[ee + 1] === "?" && c[ee + 2] === "p" && c[ee + 3] === "h" && c[ee + 4] === "p" && c[ee + 5] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("<?php", "?>"));
ee = ee + build[build.length - 1].length - 1;
}
else if (c[ee] === "<" && c[ee + 1] === "%" && c[ee + 2] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("<%", "%>"));
ee = ee + build[build.length - 1].length - 1;
}
else if (c[ee] === "{" && c[ee + 1] === "%" && c[ee + 2] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("{%", "%}"));
ee = ee + build[build.length - 1].length - 1;
}
else if (c[ee] === "{" && c[ee + 1] === "{" && c[ee + 2] === "{" && c[ee + 3] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("{{{", "}}}"));
ee = ee + build[build.length - 1].length - 1;
}
else if (c[ee] === "{" && c[ee + 1] === "{" && c[ee + 2] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("{{", "}}"));
ee = ee + build[build.length - 1].length - 1;
}
else if (c[ee] === "<" && c[ee + 1] === "!" && c[ee + 2] === "-" && c[ee + 3] === "-" && c[ee + 4] === "#" && c[ee + 5] !== starting && starting !== "//" && starting !== "/*") {
a = ee;
build.push(lexer_script_genericBuilder("<!--#", "-->"));
ee = ee + build[build.length - 1].length - 1;
}
else {
build.push(c[ee]);
}
}
else {
build.push(c[ee]);
}
if ((starting === "\"" || starting === "'") && options.lang !== "json" && c[ee - 1] !== "\\" && (c[ee] !== c[ee - 1] || (c[ee] !== "\"" && c[ee] !== "'")) && (c[ee] === "\n" || ee === jj - 1)) {
framework.parseerror = "Unterminated string in script on line number " + parse.lineNumber;
break;
}
if (c[ee] === ender[endlen - 1] && (c[ee - 1] !== "\\" || slashes(ee - 1) === false)) {
if (endlen === 1) {
break;
}
// `ee - base` is a cheap means of computing length of build array the `ee -
// base` and `endlen` are both length based values, so adding two (1 for each)
// provides an index based number
if (build[ee - base] === ender[0] && build.slice(ee - base - endlen + 2).join("") === ending) {
break;
}
}
ee = ee + 1;
} while (ee < jj);
}
if (escape === true) {
output = build[build.length - 1];
build.pop();
build.pop();
build.push(output);
}
a = ee;
if (starting === "//") {
build.pop();
}
output = build.join("");
if ((/^(\/(\/|\*)\s*parse-ignore-start)/).test(output) === true && ee < jj) {
ender = [];
do {
if (ender[0] === undefined && (c[ee] === "/" || c[ee] === "*") && c[ee - 1] === "/") {
ignorecom.push(c[ee - 1]);
if (c[ee] === "*") {
ender = ["*", "/"];
}
else {
ender = ["\n"];
}
}
else if ((c[ee] === ender[1] || ender[1] === undefined) && c[ee - 1] === ender[0]) {
if ((/^(\/(\/|\*)\s*parse-ignore-end)/).test(ignorecom.join("")) === true) {
a = ee - 1;
output = build.join("");
break;
}
ignorecom = [];
ender = [];
}
if (ender[0] !== undefined) {
ignorecom.push(c[ee]);
}
build.push(c[ee]);
ee = ee + 1;
} while (ee < jj);
if (ee === jj) {
output = build.join("");
a = ee;
}
}
else {
if (starting === "//") {
output = output.replace(/(\s+)$/, "");
}
else if (starting === "/*") {
if (options.crlf === true) {
build = output.split("\r\n");
}
else {
build = output.split("\n");
}
ee = build.length - 1;
if (ee > -1) {
do {
build[ee] = build[ee].replace(/(\s+)$/, "");
ee = ee - 1;
} while (ee > -1);
}
if (options.crlf === true) {
output = build.join("\r\n");
}
else {
output = build.join("\n");
}
}
if (starting === "{%") {
if (output.indexOf("{%-") < 0) {
output = output
.replace(/^(\{%\s*)/, "{% ")
.replace(/(\s*%\})$/, " %}");
}
else {
output = output
.replace(/^(\{%-\s*)/, "{%- ")
.replace(/(\s*-%\})$/, " -%}");
}
}
if (output.indexOf("#region") === 0 || output.indexOf("#endregion") === 0) {
output = output.replace(/(\s+)$/, "");
}
}
return output;
},
// inserts ending curly brace (where absent)
blockinsert = function lexer_script_blockinsert() {
let next = nextchar(5, false), name = "";
const g = parse.count, lines = parse.linesSpace;
if (options.lang === "json") {
return;
}
if (data.stack[parse.count] === "do" && next === "while" && data.token[parse.count] === "}") {
return;
}
next = next.slice(0, 4);
if (next === "else" && ltoke === "}" && data.stack[parse.count] === "if" && data.token[data.begin[parse.count]] !== "x{") {
return;
}
if (ltoke === ";" && data.token[g - 1] === "x{") {
name = data.token[data.begin[g - 2] - 1];
if (data.token[g - 2] === "do" || (data.token[g - 2] === ")" && "ifforwhilecatch".indexOf(name) > -1)) {
tempstore = parse.pop(data);
ltoke = "x}";
ltype = "end";
pstack = parse.structure[parse.structure.length - 1];
recordPush("");
brace.pop();
parse.linesSpace = lines;
return;
}
// to prevent the semicolon from inserting between the braces --> while (x) {};
tempstore = parse.pop(data);
ltoke = "x}";
ltype = "end";
pstack = parse.structure[parse.structure.length - 1];
recordPush("");
brace.pop();
ltoke = ";";
ltype = "end";
parse.push(data, tempstore, "");
parse.linesSpace = lines;
return;
}
ltoke = "x}";
ltype = "end";
if (data.token[parse.count] === "x}") {
return;
}
if (data.stack[parse.count] === "if" && (data.token[parse.count] === ";" || data.token[parse.count] === "x;") && next === "else") {
pstack = parse.structure[parse.structure.length - 1];
recordPush("");
brace.pop();
parse.linesSpace = lines;
return;
}
do {
pstack = parse.structure[parse.structure.length - 1];
recordPush("");
brace.pop();
if (data.stack[parse.count] === "do") {
break;
}
} while (brace[brace.length - 1] === "x{");
parse.linesSpace = lines;
},
// commaComment ensures that commas immediately precede comments instead of
// immediately follow
commaComment = function lexer_script_commacomment() {
let x = parse.count;
if (data.stack[x] === "object" && options.lexerOptions.script.objectSort === true) {
ltoke = ",";
ltype = "separator";
asifix();
recordPush("");
}
else {
do {
x = x - 1;
} while (x > 0 && data.types[x - 1] === "comment");
parse.splice({
data: data,
howmany: 0,
index: x,
record: {
begin: data.begin[x],
lexer: "script",
lines: parse.linesSpace,
presv: false,
stack: data.stack[x],
token: ",",
types: "separator"
}
});
recordPush("");
}
},
// automatic semicolon insertion
asi = function lexer_script_asi(isEnd) {
let aa = 0;
const next = nextchar(1, false), record = {
begin: data.begin[parse.count],
lexer: data.lexer[parse.count],
lines: data.lines[parse.count],
presv: data.presv[parse.count],
stack: data.stack[parse.count],
token: data.token[parse.count],
types: data.types[parse.count]
}, clist = (parse.structure.length === 0)
? ""
: parse.structure[parse.structure.length - 1][0];
if (data.lexer[parse.count - 1] !== "script" || options.lang === "java" || options.lang === "csharp") {
return;
}
if (options.lang === "json" || record.token === ";" || record.token === "," || next === "{" || record.stack === "class" || record.stack === "map" || record.stack === "attribute" || clist === "initializer" || data.types[record.begin - 1] === "generic") {
return;
}
if (((record.stack === "global" && record.types !== "end") || (record.types === "end" && data.stack[record.begin - 1] === "global")) && (next === "" || next === "}") && record.stack === data.stack[parse.count - 1] && options.lang === "jsx") {
return;
}
if (record.stack === "array" && record.token !== "]") {
return;
}
if (record.types !== undefined && record.types.indexOf("template") > -1) {
return;
}
if (next === ";" && isEnd === false) {
return;
}
if (options.lang === "qml") {
if (record.types === "start") {
return;
}
ltoke = "x;";
ltype = "separator";
recordPush("");
if (brace[brace.length - 1] === "x{" && next !== "}") {
blockinsert();
}
return;
}
if (record.token === "}" && (record.stack === "function" || record.stack === "if" || record.stack === "else" || record.stack === "for" || record.stack === "do" || record.stack === "while" || record.stack === "switch" || record.stack === "class" || record.stack === "try" || record.stack === "catch" || record.stack === "finally" || record.stack === "block")) {
if (data.token[record.begin - 1] === ")") {
aa = data.begin[record.begin - 1] - 1;
if (data.token[aa - 1] === "function") {
aa = aa - 1;
}
if (data.stack[aa - 1] === "object" || data.stack[aa - 1] === "switch") {
return;
}
if (data.token[aa - 1] !== "=" && data.token[aa - 1] !== "return" && data.token[aa - 1] !== ":") {
return;
}
}
else {
return;
}
}
if (record.types === "comment" || clist === "method" || clist === "paren" || clist === "expression" || clist === "array" || clist === "object" || (clist === "switch" && record.stack !== "method" && data.token[data.begin[parse.count]] === "(")) {
return;
}
if (data.stack[parse.count] === "expression" && (data.token[data.begin[parse.count] - 1] !== "while" || (data.token[data.begin[parse.count] - 1] === "while" && data.stack[data.begin[parse.count] - 2] !== "do"))) {
return;
}
if (next !== "" && "=<>+*?|^:&%~,.()]".indexOf(next) > -1 && isEnd === false) {
return;
}
if (record.types === "comment") {
aa = parse.count;
do {
aa = aa - 1;
} while (aa > 0 && data.types[aa] === "comment");
if (aa < 1) {
return;
}
record.token = data.token[aa];
record.types = data.types[aa];
record.stack = data.stack[aa];
}
if (record.token === undefined || record.types === "start" || record.types === "separator" || (record.types === "operator" && record.token !== "++" && record.token !== "--") || record.token === "x}" || record.token === "var" || record.token === "let" || record.token === "const" || record.token === "else" || record.token.indexOf("#!/") === 0 || record.token === "instanceof") {
return;
}
if (record.stack === "method" && (data.token[record.begin - 1] === "function" || data.token[record.begin - 2] === "function")) {
return;
}
if (options.lexerOptions.script.varword === "list") {
vart.index[vart.len] = parse.count;
}
if (options.correct === true) {
ltoke = ";";
}
else {
ltoke = "x;";
}
ltype = "separator";
aa = parse.linesSpace;
recordPush("");
parse.linesSpace = aa;
if (brace[brace.length - 1] === "x{" && next !== "}") {
blockinsert();
}
},
// convert ++ and -- into "= x +" and "= x -" in most cases
plusplus = function lexer_script_plusplus() {
let pre = true, toke = "+", tokea = "", tokeb = "", tokec = "", inc = 0, ind = 0, walk = 0, next = "";
const store = [], end = function lexer_script_plusplus_end() {
walk = data.begin[walk] - 1;
if (data.types[walk] === "end") {
lexer_script_plusplus_end();
}
else if (data.token[walk - 1] === ".") {
period();
}
}, period = function lexer_script_plusplus_period() {
walk = walk - 2;
if (data.types[walk] === "end") {
end();
}
else if (data.token[walk - 1] === ".") {
lexer_script_plusplus_period();
}
}, applyStore = function lexer_script_plusplus_applyStore() {
let x = 0;
const y = store.length;
if (x < y) {
do {
parse.push(data, store[x], "");
x = x + 1;
} while (x < y);
}
}, recordStore = function lexer_script_plusplus_recordStore(index) {
return {
begin: data.begin[index],
lexer: data.lexer[index],
lines: data.lines[index],
presv: data.presv[index],
stack: data.stack[index],
token: data.token[index],
types: data.types[index]
};
};
tokea = data.token[parse.count];
tokeb = data.token[parse.count - 1];
tokec = data.token[parse.count - 2];
if (tokea !== "++" && tokea !== "--" && tokeb !== "++" && tokeb !== "--") {
walk = parse.count;
if (data.types[walk] === "end") {
end();
}
else if (data.token[walk - 1] === ".") {
period();
}
}
if (data.token[walk - 1] === "++" || data.token[walk - 1] === "--") {
if ("startendoperator".indexOf(data.types[walk - 2]) > -1) {
return;
}
inc = walk;
if (inc < parse.count + 1) {
do {
store.push(recordStore(inc));
inc = inc + 1;
} while (inc < parse.count + 1);
parse.splice({
data: data,
howmany: parse.count - walk,
index: walk,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
}
}
else {
if (options.correct === false || (tokea !== "++" && tokea !== "--" && tokeb !== "++" && tokeb !== "--")) {
return;
}
next = nextchar(1, false);
if ((tokea === "++" || tokea === "--") && (c[a] === ";" || next === ";" || c[a] === "}" || next === "}" || c[a] === ")" || next === ")")) {
toke = data.stack[parse.count];
if (toke === "array" || toke === "method" || toke === "object" || toke === "paren" || toke === "notation" || (data.token[data.begin[parse.count] - 1] === "while" && toke !== "while")) {
return;
}
inc = parse.count;
do {
inc = inc - 1;
if (data.token[inc] === "return") {
return;
}
if (data.types[inc] === "end") {
do {
inc = data.begin[inc] - 1;
} while (data.types[inc] === "end" && inc > 0);
}
} while (inc > 0 && (data.token[inc] === "." || data.types[inc] === "word" || data.types[inc] === "end"));
if (data.token[inc] === "," && c[a] !== ";" && next !== ";" && c[a] !== "}" && next !== "}" && c[a] !== ")" && next !== ")") {
return;
}
if (data.types[inc] === "operator") {
if (data.stack[inc] === "switch" && data.token[inc] === ":") {
do {
inc = inc - 1;
if (data.types[inc] === "start") {
ind = ind - 1;
if (ind < 0) {
break;
}
}
else if (data.types[inc] === "end") {
ind = ind + 1;
}
if (data.token[inc] === "?" && ind === 0) {
return;
}
} while (inc > 0);
}
else {
return;
}
}
pre = false;
if (tokea === "--") {
toke = "-";
}
else {
toke = "+";
}
}
else if (tokec === "[" || tokec === ";" || tokec === "x;" || tokec === "}" || tokec === "{" || tokec === "(" || tokec === ")" || tokec === "," || tokec === "return") {
if (tokea === "++" || tokea === "--") {
if (tokec === "[" || tokec === "(" || tokec === "," || tokec === "return") {
return;
}
if (tokea === "--") {
toke = "-";
}
pre = false;
}
else if (tokeb === "--" || tokea === "--") {
toke = "-";
}
}
else {
return;
}
if (pre === false) {
tempstore = parse.pop(data);
}
walk = parse.count;
if (data.types[walk] === "end") {
end();
}
else if (data.token[walk - 1] === ".") {
period();
}
inc = walk;
if (inc < parse.count + 1) {
do {
store.push(recordStore(inc));
inc = inc + 1;
} while (inc < parse.count + 1);
}
}
if (pre === true) {
parse.splice({
data: data,
howmany: 1,
index: walk - 1,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
ltoke = "=";
ltype = "operator";
recordPush("");
applyStore();
ltoke = toke;
ltype = "operator";
recordPush("");
ltoke = "1";
ltype = "number";
recordPush("");
}
else {
ltoke = "=";
ltype = "operator";
recordPush("");
applyStore();
ltoke = toke;
ltype = "operator";
recordPush("");
ltoke = "1";
ltype = "number";
recordPush("");
}
ltoke = data.token[parse.count];
ltype = data.types[parse.count];
if (next === "}" && c[a] !== ";") {
asi(false);
}
},
// fixes asi location if inserted after an inserted brace
asibrace = function lexer_script_asibrace() {
let aa = parse.count;
do {
aa = aa - 1;
} while (aa > -1 && data.token[aa] === "x}");
if (data.stack[aa] === "else") {
return recordPush("");
}
aa = aa + 1;
parse.splice({
data: data,
howmany: 0,
index: aa,
record: {
begin: data.begin[aa],
lexer: "script",
lines: parse.linesSpace,
presv: false,
stack: data.stack[aa],
token: ltoke,
types: ltype
}
});
recordPush("");
},
// a tokenizer for regular expressions
regex = function lexer_script_regex() {
let ee = a + 1, h = 0, i = 0, output = "", square = false;
const f = b, build = ["/"];
if (ee < f) {
do {
build.push(c[ee]);
if (c[ee - 1] !== "\\" || c[ee - 2] === "\\") {
if (c[ee] === "[") {
square = true;
}
if (c[ee] === "]") {
square = false;
}
}
if (c[ee] === "/" && square === false) {
if (c[ee - 1] === "\\") {
i = 0;
h = ee - 1;
if (h > 0) {
do {
if (c[h] === "\\") {
i = i + 1;
}
else {
break;
}
h = h - 1;
} while (h > 0);
}
if (i % 2 === 0) {
break;
}
}
else {
break;
}
}
ee = ee + 1;
} while (ee < f);
}
if (c[ee + 1] === "g" || c[ee + 1] === "i" || c[ee + 1] === "m" || c[ee + 1] === "y" || c[ee + 1] === "u") {
build.push(c[ee + 1]);
if (c[ee + 2] !== c[ee + 1] && (c[ee + 2] === "g" || c[ee + 2] === "i" || c[ee + 2] === "m" || c[ee + 2] === "y" || c[ee + 2] === "u")) {
build.push(c[ee + 2]);
if (c[ee + 3] !== c[ee + 1] && c[ee + 3] !== c[ee + 2] && (c[ee + 3] === "g" || c[ee + 3] === "i" || c[ee + 3] === "m" || c[ee + 3] === "y" || c[ee + 3] === "u")) {
build.push(c[ee + 3]);
if (c[ee + 4] !== c[ee + 1] && c[ee + 4] !== c[ee + 2] && c[ee + 4] !== c[ee + 3] && (c[ee + 4] === "g" || c[ee + 4] === "i" || c[ee + 4] === "m" || c[ee + 4] === "y" || c[ee + 4] === "u")) {
build.push(c[ee + 4]);
if (c[ee + 5] !== c[ee + 1] && c[ee + 5] !== c[ee + 2] && c[ee + 5] !== c[ee + 3] && c[ee + 5] !== c[ee + 4] && (c[ee + 5] === "g" || c[ee + 5] === "i" || c[ee + 5] === "m" || c[ee + 5] === "y" || c[ee + 5] === "u")) {
build.push(c[ee + 4]);
a = ee + 5;
}
else {
a = ee + 4;
}
}
else {
a = ee + 3;
}
}
else {
a = ee + 2;
}
}
else {
a = ee + 1;
}
}
else {
a = ee;
}
output = build.join("");
return output;
},
// a unique tokenizer for operator characters
operator = function lexer_script_operator() {
let g = 0, h = 0, jj = b, output = "";
const syntax = [
"=",
"<",
">",
"+",
"*",
"?",
"|",
"^",
":",
"&",
"%",
"~"
], synlen = syntax.length, plusequal = function lexer_script_operator_plusequal(op) {
let walk = parse.count, inc = 0;
const toke = op.charAt(0), store = [], applyStore = function lexer_script_plusplus_applyStore() {
let x = 0;
const y = store.length;
if (x < y) {
do {
parse.push(data, store[x], "");
x = x + 1;
} while (x < y);
}
}, end = function lexer_script_operator_plusequal_end() {
walk = data.begin[walk] - 1;
if (data.types[walk] === "end") {
lexer_script_operator_plusequal_end();
}
else if (data.token[walk - 1] === ".") {
period();
}
}, period = function lexer_script_operator_plusequal_period() {
walk = walk - 2;
if (data.types[walk] === "end") {
end();
}
else if (data.token[walk - 1] === ".") {
lexer_script_operator_plusequal_period();
}
};
if (data.types[walk] === "end") {
end();
}
else if (data.token[walk - 1] === ".") {
period();
}
inc = walk;
do {
store.push({
begin: data.begin[inc],
lexer: data.lexer[inc],
lines: data.lines[inc],
presv: data.presv[inc],
stack: data.stack[inc],
token: data.token[inc],
types: data.types[inc]
});
inc = inc + 1;
} while (inc < parse.count);
ltoke = "=";
ltype = "operator";
recordPush("");
applyStore();
return toke;
};
if (wordTest > -1) {
word();
}
if (c[a] === "/" && (parse.count > -1 && (ltype !== "word" || ltoke === "typeof" || ltoke === "return" || ltoke === "else") && ltype !== "number" && ltype !== "string" && ltype !== "end")) {
if (ltoke === "return" || ltoke === "typeof" || ltoke === "else" || ltype !== "word") {
ltoke = regex();
ltype = "regex";
}
else {
ltoke = "/";
ltype = "operator";
}
recordPush("");
return "regex";
}
if (c[a] === "?" && ("+-*/".indexOf(c[a + 1]) > -1 || (c[a + 1] === ":" && syntax.join("").indexOf(c[a + 2]) < 0))) {
return "?";
}
if (c[a] === ":" && "+-*/".indexOf(c[a + 1]) > -1) {
return ":";
}
if (a < b - 1) {
if (c[a] !== "<" && c[a + 1] === "<") {
return c[a];
}
if (c[a] === "!" && c[a + 1] === "/") {
return "!";
}
if (c[a] === "-") {
if (c[a + 1] === "-") {
output = "--";
}
else if (c[a + 1] === "=") {
output = "-=";
}
else if (c[a + 1] === ">") {
output = "->";
}
if (output === "") {
return "-";
}
}
if (c[a] === "+") {
if (c[a + 1] === "+") {
output = "++";
}
else if (c[a + 1] === "=") {
output = "+=";
}
if (output === "") {
return "+";
}
}
if (c[a] === "=" && c[a + 1] !== "=" && c[a + 1] !== "!" && c[a + 1] !== ">") {
return "=";
}
}
if (output === "") {
if ((c[a + 1] === "+" && c[a + 2] === "+") || (c[a + 1] === "-" && c[a + 2] === "-")) {
output = c[a];
}
else {
const buildout = [c[a]];
g = a + 1;
if (g < jj) {
do {
if ((c[g] === "+" && c[g + 1] === "+") || (c[g] === "-" && c[g + 1] === "-")) {
break;
}
h = 0;
if (h < synlen) {
do {
if (c[g] === syntax[h]) {
buildout.push(syntax[h]);
break;
}
h = h + 1;
} while (h < synlen);
}
if (h === synlen) {
break;
}
g = g + 1;
} while (g < jj);
}
output = buildout.join("");
}
}
a = a + (output.length - 1);
if (output === "=>" && ltoke === ")") {
g = parse.count;
jj = data.begin[g];
do {
if (data.begin[g] === jj) {
data.stack[g] = "method";
}
g = g - 1;
} while (g > jj - 1);
}
if (output.length === 2 && output.charAt(1) === "=" && "!=<>|&?".indexOf(output.charAt(0)) < 0 && options.correct === true) {
return plusequal(output);
}
return output;
},
// ES6 template string support
tempstring = function lexer_script_tempstring() {
const output = [c[a]];
a = a + 1;
if (a < b) {
do {
output.push(c[a]);
if (c[a] === "`" && (c[a - 1] !== "\\" || slashes(a - 1) === false)) {
templateString.pop();
break;
}
if (c[a - 1] === "$" && c[a] === "{" && (c[a - 2] !== "\\" || slashes(a - 2) === false)) {
templateString[templateString.length - 1] = true;
break;
}
a = a + 1;
} while (a < b);
}
return output.join("");
},
// a tokenizer for numbers
numb = function lexer_script_number() {
const f = b, build = [c[a]];
let ee = 0, test = /zz/, dot = (build[0] === ".");
if (a < b - 2 && c[a] === "0") {
if (c[a + 1] === "x") {
test = /[0-9a-fA-F]/;
}
else if (c[a + 1] === "o") {
test = /[0-9]/;
}
else if (c[a + 1] === "b") {
test = /0|1/;
}
if (test.test(c[a + 2]) === true) {
build.push(c[a + 1]);
ee = a + 1;
do {
ee = ee + 1;
build.push(c[ee]);
} while (test.test(c[ee + 1]) === true);
a = ee;
return build.join("");
}
}
ee = a + 1;
if (ee < f) {
do {
if ((/[0-9]/).test(c[ee]) || (c[ee] === "." && dot === false)) {
build.push(c[ee]);
if (c[ee] === ".") {
dot = true;
}
}
else {
break;
}
ee = ee + 1;
} while (ee < f);
}
if (ee < f - 1 && ((/\d/).test(c[ee - 1]) === true || ((/\d/).test(c[ee - 2]) === true && (c[ee - 1] === "-" || c[ee - 1] === "+"))) && (c[ee] === "e" || c[ee] === "E")) {
build.push(c[ee]);
if (c[ee + 1] === "-" || c[ee + 1] === "+") {
build.push(c[ee + 1]);
ee = ee + 1;
}
dot = false;
ee = ee + 1;
if (ee < f) {
do {
if ((/[0-9]/).test(c[ee]) || (c[ee] === "." && dot === false)) {
build.push(c[ee]);
if (c[ee] === ".") {
dot = true;
}
}
else {
break;
}
ee = ee + 1;
} while (ee < f);
}
}
a = ee - 1;
return build.join("");
},
// Identifies blocks of markup embedded within JavaScript for language supersets
// like React JSX.
markup = function lexer_script_markup() {
let curlytest = false, endtag = false, anglecount = 0, curlycount = 0, tagcount = 0, d = 0, next = "", output = [];
const syntaxnum = "0123456789=<>+-*?|^:&.,;%(){}[]~", syntax = "=<>+-*?|^:&.,;%(){}[]~", applyMarkup = function lexer_script_markup_applyMarkup() {
if (ltoke === "(") {
parse.structure[parse.structure.length - 1] = ["paren", parse.count];
}
framework.lexer.markup(output.join(""));
};
if (wordTest > -1) {
word();
}
d = parse.count;
if (data.types[d] === "comment") {
do {
d = d - 1;
} while (d > 0 && data.types[d] === "comment");
}
if (c[a] === "<" && c[a + 1] === ">") {
a = a + 1;
ltype = "generic";
ltoke = "<>";
}
if ((c[a] !== "<" && syntaxnum.indexOf(c[a + 1]) > -1) || data.token[d] === "++" || data.token[d] === "--" || (/\s/).test(c[a + 1]) === true || ((/\d/).test(c[a + 1]) === true && (ltype === "operator" || ltype === "string" || ltype === "number" || (ltype === "word" && ltoke !== "return")))) {
ltype = "operator";
ltoke = operator();
return recordPush("");
}
if (options.lang !== "typescript" && (data.token[d] === "return" || data.types[d] === "operator" || data.types[d] === "start" || data.types[d] === "separator" || (data.token[d] === "}" && parse.structure[parse.structure.length - 1][0] === "global"))) {
ltype = "markup";
options.lang = "jsx";
}
else if (options.lang === "typescript" || data.token[parse.count] === "#include" || (((/\s/).test(c[a - 1]) === false || ltoke === "public" || ltoke === "private" || ltoke === "static" || ltoke === "final" || ltoke === "implements" || ltoke === "class" || ltoke === "void" || ltoke === "Promise") && syntaxnum.indexOf(c[a + 1]) < 0)) {
// Java type generics
let comma = false, e = 1, f = 0;
const generics = [
"<",
c[a + 1]
], jj = b;
if (c[a + 1] === "<") {
e = 2;
}
d = a + 2;
if (d < jj) {
do {
generics.push(c[d]);
if (c[d] === "?" && c[d + 1] === ">") {
generics.push(">");
d = d + 1;
}
if (c[d] === ",") {
comma = true;
if ((/\s/).test(c[d + 1]) === false) {
generics.push(" ");
}
}
else if (c[d] === "[") {
f = f + 1;
}
else if (c[d] === "]") {
f = f - 1;
}
else if (c[d] === "<") {
e = e + 1;
}
else if (c[d] === ">") {
e = e - 1;
if (e === 0 && f === 0) {
if ((/\s/).test(c[d - 1]) === true) {
ltype = "operator";
operator();
return;
}
ltype = "generic";
a = d;
ltoke = generics
.join("")
.replace(/\s+/g, " ");
return recordPush("");
}
}
if ((syntax.indexOf(c[d]) > -1 && c[d] !== "," && c[d] !== "<" && c[d] !== ">" && c[d] !== "[" && c[d] !== "]") || (comma === false && (/\s/).test(c[d]) === true)) {
ltype = "operator";
operator();
return;
}
d = d + 1;
} while (d < jj);
}
return;
}
else {
ltype = "operator";
ltoke = operator();
return recordPush("");
}
do {
output.push(c[a]);
if (c[a] === "{") {
curlycount = curlycount + 1;
curlytest = true;
}
else if (c[a] === "}") {
curlycount = curlycount - 1;
if (curlycount === 0) {
curlytest = false;
}
}
else if (c[a] === "<" && curlytest === false) {
if (c[a + 1] === "<") {
do {
output.push(c[a]);
a = a + 1;
} while (a < b && c[a + 1] === "<");
}
anglecount = anglecount + 1;
if (c[a + 1] === "/") {
endtag = true;
}
}
else if (c[a] === ">" && curlytest === false) {
if (c[a + 1] === ">") {
do {
output.push(c[a]);
a = a + 1;
} while (c[a + 1] === ">");
}
anglecount = anglecount - 1;
if (endtag === true) {
tagcount = tagcount - 1;
}
else if (c[a - 1] !== "/") {
tagcount = tagcount + 1;
}
if (anglecount === 0 && curlycount === 0 && tagcount < 1) {
next = nextchar(2, false);
if (next.charAt(0) !== "<") {
// if followed by nonmarkup
return applyMarkup();
}
// catch additional trailing tag sets
if (next.charAt(0) === "<" && syntaxnum.indexOf(next.charAt(1)) < 0 && (/\s/).test(next.charAt(1)) === false) {
// perform a minor safety test to verify if "<" is a tag start or a less than
// operator
d = a + 1;
do {
d = d + 1;
if (c[d] === ">" || ((/\s/).test(c[d - 1]) === true && syntaxnum.indexOf(c[d]) < 0)) {
break;
}
if (syntaxnum.indexOf(c[d]) > -1) {
// if followed by additional markup tags
return applyMarkup();
}
} while (d < b);
}
else {
// if a nonmarkup "<" follows markup
return applyMarkup();
}
}
endtag = false;
}
a = a + 1;
} while (a < b);
return applyMarkup();
},
// operations for end types: ), ], }
end = function lexer_script_end(x) {
let insert = false;
const next = nextchar(1, false), newarray = function lexer_script_end_newarray() {
let bb = 0, cc = 0, arraylen = 0;
const aa = data.begin[parse.count], ar = (data.token[data.begin[parse.count] - 1] === "Array"), startar = (ar === true)
? "["
: "{", endar = (ar === true)
? "]"
: "}", namear = (ar === true)
? "array"
: "object";
tempstore = parse.pop(data);
if (ar === true && data.token[parse.count - 1] === "(" && data.types[parse.count] === "number") {
arraylen = data.begin[parse.count] - 1;
tempstore = parse.pop(data);
tempstore = parse.pop(data);
tempstore = parse.pop(data);
data.token[parse.count] = "[";
data.types[parse.count] = "start";
data.lines[parse.count] = 0;
data.stack[parse.count] = "array";
data.begin[parse.count] = parse.count;
parse.structure[parse.structure.length - 1] = ["array", parse.count];
ltoke = ",";
ltype = "separator";
do {
recordPush("");
arraylen = arraylen - 1;
} while (arraylen > 0);
}
else {
data.token[aa] = startar;
data.types[aa] = "start";
cc = data.begin[aa];
parse.splice({
data: data,
howmany: 2,
index: aa - 2,
record: {
begin: 0,
lexer: "",
lines: 0,
presv: false,
stack: "",
token: "",
types: ""
}
});
parse.structure[parse.structure.length - 1] = [
namear, aa - 2
];
pstack = [namear, aa];
bb = parse.count;
do {
if (data.begin[bb] === cc) {
data.stack[bb] = namear;
data.begin[bb] = data.begin[bb] - 2;
}
bb = bb - 1;
} while (bb > aa - 3);
}
ltoke = endar;
ltype = "end";
recordPush("");
};
if (wordTest > -1) {
word();
}
if (classy.length > 0) {
if (classy[classy.length - 1] === 0) {
classy.pop();
}
else {
classy[classy.length - 1] = classy[classy.length - 1] - 1;
}
}
if (x === ")" || x === "x)" || x === "]") {
if (options.correct === true) {
plusplus();
}
asifix();
}
if (x === ")" || x === "x)") {
asi(false);
}
if (vart.len > -1) {
if (x === "}" && ((options.lexerOptions.script.varword === "list" && vart.count[vart.len] === 0) || (data.token[parse.count] === "x;" && options.lexerOptions.script.varword === "each"))) {
vartpop();
}
vart.count[vart.len] = vart.count[vart.len] - 1;
if (vart.count[vart.len] < 0) {
vartpop();
}
}
if (ltoke === "," && data.stack[parse.count] !== "initializer" && ((x === "]" && data.token[parse.count - 1] === "[") || x === "}")) {
tempstore = parse.pop(data);
}
if (x === ")" || x === "x)") {
ltoke = x;
ltype = "end";
if (lword.length > 0) {
pword = lword[lword.length - 1];
if (pword.length > 1 && next !== "{" && (pword[0] === "if" || pword[0] === "for" || (pword[0] === "while" && data.stack[pword[1] - 2] !== undefined && data.stack[pword[1] - 2] !== "do") || pword[0] === "with")) {
insert = true;
}
}
}
else if (x === "]") {
ltoke = "]";
ltype = "end";
}
else if (x === "}") {
if (ltoke !== "," && options.correct === true) {
plusplus();
}
if (parse.structure.length > 0 && parse.structure[parse.structure.length - 1][0] !== "object") {
asi(true);
}
else if (options.lexerOptions.script.objectSort === true) {
parse.objectSort(data);
}
if (ltype === "comment") {
ltoke = data.token[parse.count];
ltype = data.types[parse.count];
}
ltoke = "}";
ltype = "end";
}
lword.pop();
pstack = parse.structure[parse.structure.length - 1];
if (x === ")" && options.correct === true && (data.token[data.begin[parse.count] - 1] === "Array" || data.token[data.begin[parse.count] - 1] === "Object") && data.token[data.begin[parse.count] - 2] === "new") {
newarray();
}
if (brace[brace.length - 1] === "x{" && x === "}") {
blockinsert();
brace.pop();
if (data.stack[parse.count] !== "try") {
if (next !== ":" && next !== ";" && data.token[data.begin[a] - 1] !== "?") {
blockinsert();
}
}
ltoke = "}";
}
else {
brace.pop();
}
recordPush("");
if (insert === true) {
ltoke = "x{";
ltype = "start";
recordPush(pword[0]);
brace.push("x{");
pword[1] = parse.count;
}
},
// determines tag names for {% %} based template tags and returns a type
tname = function lexer_script_tname(x) {
let sn = 2, en = 0, name = "";
const st = x.slice(0, 2), len = x.length, namelist = [
"autoescape",
"block",
"capture",
"case",
"comment",
"embed",
"filter",
"for",
"form",
"if",
"macro",
"paginate",
"raw",
"sandbox",
"spaceless",
"tablerow",
"unless",
"verbatim"
];
if (x.charAt(2) === "-") {
sn = sn + 1;
}
if ((/\s/).test(x.charAt(sn)) === true) {
do {
sn = sn + 1;
} while ((/\s/).test(x.charAt(sn)) === true && sn < len);
}
en = sn;
do {
en = en + 1;
} while ((/\s/).test(x.charAt(en)) === false && x.charAt(en) !== "(" && en < len);
if (en === len) {
en = x.length - 2;
}
name = x.slice(sn, en);
if (name === "else" || (st === "{%" && (name === "elseif" || name === "when" || name === "elif"))) {
return "template_else";
}
if (st === "{{") {
if (name === "end") {
return "template_end";
}
if (name === "block" || name === "define" || name === "form" || name === "if" || name === "range" || name === "with") {
return "template_start";
}
return "template";
}
en = namelist.length - 1;
if (en > -1) {
do {
if (name === namelist[en]) {
return "template_start";
}
if (name === "end" + namelist[en]) {
return "template_end";
}
en = en - 1;
} while (en > -1);
}
return "template";
}, start = function lexer_script_start(x) {
let aa = parse.count, wordx = "", wordy = "", stack = "";
brace.push(x);
if (wordTest > -1) {
word();
aa = parse.count;
}
if (vart.len > -1) {
vart.count[vart.len] = vart.count[vart.len] + 1;
}
if (data.token[aa - 1] === "function") {
lword.push([
"function", aa + 1
]);
}
else {
lword.push([
ltoke, aa + 1
]);
}
ltoke = x;
ltype = "start";
if (x === "(" || x === "x(") {
asifix();
}
else if (x === "{") {
if (paren > -1) {
if (data.begin[paren - 1] === data.begin[data.begin[aa] - 1] || data.token[data.begin[aa]] === "x(") {
paren = -1;
end("x)");
asifix();
ltoke = "{";
ltype = "start";
}
}
else if (ltoke === ")") {
asifix();
}
if (ltype === "comment" && data.token[aa - 1] === ")") {
ltoke = data.token[aa];
data.token[aa] = "{";
ltype = data.types[aa];
data.types[aa] = "start";
}
}
wordx = data.token[aa];
wordy = (data.stack[aa] === undefined)
? ""
: data.token[data.begin[aa] - 1];
if (ltoke === "{" || ltoke === "x{") {
if (wordx === "else" || wordx === "do" || wordx === "try" || wordx === "finally" || wordx === "switch") {
stack = wordx;
}
else if (classy[classy.length - 1] === 0 && wordx !== "return") {
classy.pop();
stack = "class";
}
else if (data.token[aa - 1] === "class") {
stack = "class";
}
else if (data.token[aa] === "]" && data.token[aa - 1] === "[") {
stack = "array";
}
else if (data.types[aa] === "word" && (data.types[aa - 1] === "word" || (data.token[aa - 1] === "?" && data.types[aa - 2] === "word")) && data.token[aa] !== "in" && data.token[aa - 1] !== "export" && data.token[aa - 1] !== "import") {
stack = "map";
}
else if (data.stack[aa] === "method" && data.types[aa] === "end" && data.types[data.begin[aa] - 1] === "word" && data.token[data.begin[aa] - 2] === "new") {
stack = "initializer";
}
else if (ltoke === "{" && (wordx === ")" || wordx === "x)") && (data.types[data.begin[aa] - 1] === "word" || data.token[data.begin[aa] - 1] === "]")) {
if (wordy === "if") {
stack = "if";
}
else if (wordy === "for") {
stack = "for";
}
else if (wordy === "while") {
stack = "while";
}
else if (wordy === "class") {
stack = "class";
}
else if (wordy === "switch" || data.token[data.begin[aa] - 1] === "switch") {
stack = "switch";
}
else if (wordy === "catch") {
stack = "catch";
}
else {
stack = "function";
}
}
else if (ltoke === "{" && (wordx === ";" || wordx === "x;")) {
// ES6 block
stack = "block";
}
else if (ltoke === "{" && data.token[aa] === ":" && data.stack[aa] === "switch") {
// ES6 block
stack = "block";
}
else if (data.token[aa - 1] === "import" || data.token[aa - 2] === "import" || data.token[aa - 1] === "export" || data.token[aa - 2] === "export") {
stack = "object";
}
else if (wordx === ")" && (pword[0] === "function" || pword[0] === "if" || pword[0] === "for" || pword[0] === "class" || pword[0] === "while" || pword[0] === "switch" || pword[0] === "catch")) {
// if preceeded by a paren the prior containment is preceeded by a keyword if
// (...) {
stack = pword[0];
}
else if (data.stack[aa] === "notation") {
// if following a TSX array type declaration
stack = "function";
}
else if ((data.types[aa] === "number" || data.types[aa] === "string" || data.types[aa] === "word") && data.types[aa - 1] === "word" && data.token[data.begin[aa] - 1] !== "for") {
// if preceed by a word and either string or word public class {
stack = "function";
}
else if (parse.structure.length > 0 && data.token[aa] !== ":" && parse.structure[parse.structure.length - 1][0] === "object" && (data.token[data.begin[aa] - 2] === "{" || data.token[data.begin[aa] - 2] === ",")) {
// if an object wrapped in some containment which is itself preceeded by a curly
// brace or comma var a={({b:{cat:"meow"}})};
stack = "function";
}
else if (data.types[pword[1] - 1] === "markup" && data.token[pword[1] - 3] === "function") {
// checking for TSX function using an angle brace name
stack = "function";
}
else if (wordx === "=>") {
// checking for fat arrow assignment
stack = "function";
}
else if (wordx === ")" && data.stack[aa] === "method" && data.types[data.begin[aa] - 1] === "word") {
stack = "function";
}
else if (data.types[aa] === "word" && ltoke === "{" && data.token[aa] !== "return" && data.token[aa] !== "in" && data.token[aa] !== "import" && data.token[aa] !== "const" && data.token[aa] !== "let" && data.token[aa] !== "") {
// ES6 block
stack = "block";
}
else {
stack = "object";
}
}
else if (ltoke === "[") {
if ((/\s/).test(c[a - 1]) === true && data.types[aa] === "word" && wordx !== "return" && options.lang !== "twig") {
stack = "notation";
}
else {
stack = "array";
}
}
else if (ltoke === "(" || ltoke === "x(") {
if (wordx === "function" || data.token[aa - 1] === "function") {
stack = "arguments";
}
else if (data.token[aa - 1] === "." || data.token[data.begin[aa] - 2] === ".") {
stack = "method";
}
else if (data.types[aa] === "generic") {
stack = "method";
}
else if (data.token[aa] === "}" && data.stack[aa] === "function") {
stack = "method";
}
else if (wordx === "if" || wordx === "for" || wordx === "class" || wordx === "while" || wordx === "catch" || wordx === "switch" || wordx === "with") {
stack = "expression";
}
else if (data.types[aa] === "word") {
stack = "method";
}
else {
stack = "paren";
}
}
else if (ltoke === ":" && data.types[aa] === "word" && data.token[aa - 1] === "[") {
stack = "attribute";
}
recordPush(stack);
if (classy.length > 0) {
classy[classy.length - 1] = classy[classy.length - 1] + 1;
}
};
do {
if ((/\s/).test(c[a])) {
if (wordTest > -1) {
word();
}
a = parse.spacer({ array: c, end: b, index: a });
if (parse.linesSpace > 1 && ltoke !== ";" && lengthb < parse.count && c[a + 1] !== "}") {
asi(false);
lengthb = parse.count;
}
}
else if (c[a] === "<" && c[a + 1] === "?" && c[a + 2] === "p" && c[a + 3] === "h" && c[a + 4] === "p") {
// php
ltoke = generic("<?php", "?>");
ltype = "template";
recordPush("");
}
else if (c[a] === "<" && c[a + 1] === "%") {
// asp
ltoke = generic("<%", "%>");
ltype = "template";
recordPush("");
}
else if (c[a] === "{" && c[a + 1] === "%") {
// twig
ltoke = generic("{%", "%}");
ltype = tname(ltoke);
recordPush("");
}
else if (c[a] === "{" && c[a + 1] === "{" && c[a + 2] === "{") {
// mustache
ltoke = generic("{{{", "}}}");
ltype = "template";
recordPush("");
}
else if (c[a] === "{" && c[a + 1] === "{") {
// handlebars
ltoke = generic("{{", "}}");
ltype = tname(ltoke);
recordPush("");
}
else if (c[a] === "<" && c[a + 1] === "!" && c[a + 2] === "-" && c[a + 3] === "-" && c[a + 4] === "#") {
// ssi
ltoke = generic("<!--#", "-->");
ltype = "template";
recordPush("");
}
else if (c[a] === "<" && c[a + 1] === "!" && c[a + 2] === "-" && c[a + 3] === "-") {
// markup comment
ltoke = generic("<!--", "-->");
ltype = "comment";
recordPush("");
}
else if (c[a] === "<") {
// markup
markup();
}
else if (c[a] === "/" && (a === b - 1 || c[a + 1] === "*")) {
// comment block
ltoke = generic("/*", "*\u002f");
if (ltoke.indexOf("# sourceMappingURL=") === 2) {
sourcemap[0] = parse.count + 1;
sourcemap[1] = ltoke;
}
ltype = "comment";
if (data.token[parse.count] === "var" || data.token[parse.count] === "let" || data.token[parse.count] === "const") {
tempstore = parse.pop(data);
recordPush("");
parse.push(data, tempstore, "");
if (data.lines[parse.count - 2] === 0) {
data.lines[parse.count - 2] = data.lines[parse.count];
}
data.lines[parse.count] = 0;
}
else {
if (data.token[parse.count] === "x}" || data.token[parse.count] === "x)") {
let ignore = ((/^(\/\*\s*parse-ignore-start)/).test(ltoke) === true);
parse.splice({
data: data,
howmany: 0,
index: parse.count,
record: {
begin: data.begin[parse.count],
lexer: "script",
lines: parse.linesSpace,
presv: (ignore === true),
stack: data.stack[parse.count],
token: ltoke,
types: (ignore === true)
? "ignore"
: "comment"
}
});
}
else {
recordPush("");
}
}
}
else if ((parse.count < 0 || data.lines[parse.count] > 0) && c[a] === "#" && c[a + 1] === "!" && (c[a + 2] === "/" || c[a + 2] === "[")) {
// shebang
ltoke = generic("#!" + c[a + 2], "\n");
ltoke = ltoke.slice(0, ltoke.length - 1);
ltype = "string";
parse.linesSpace = 2;
recordPush("");
}
else if (c[a] === "/" && (a === b - 1 || c[a + 1] === "/")) {
// comment line
asi(false);
ltoke = generic("//", "\n");
ltype = "comment";
if (ltoke.indexOf("# sourceMappingURL=") === 2) {
sourcemap[0] = parse.count + 1;
sourcemap[1] = ltoke;
}
if (data.token[parse.count] === "x}" || data.token[parse.count] === "x)") {
let ignore = ((/^(\/\/\s*parse-ignore-start)/).test(ltoke) === true);
parse.splice({
data: data,
howmany: 0,
index: parse.count,
record: {
begin: data.begin[parse.count],
lexer: "script",
lines: parse.linesSpace,
presv: (ignore === true),
stack: data.stack[parse.count],
token: ltoke,
types: (ignore === true)
? "ignore"
: "comment"
}
});
}
else {
recordPush("");
}
a = parse.spacer({ array: c, end: b, index: a });
}
else if (c[a] === "#" && c[a + 1] === "r" && c[a + 2] === "e" && c[a + 3] === "g" && c[a + 4] === "i" && c[a + 5] === "o" && c[a + 6] === "n" && (/\s/).test(c[a + 7]) === true) {
// comment line
asi(false);
ltoke = generic("#region", "\n");
ltype = "comment";
recordPush("");
}
else if (c[a] === "#" && c[a + 1] === "e" && c[a + 2] === "n" && c[a + 3] === "d" && c[a + 4] === "r" && c[a + 5] === "e" && c[a + 6] === "g" && c[a + 7] === "i" && c[a + 8] === "o" && c[a + 9] === "n") {
// comment line
asi(false);
ltoke = generic("#endregion", "\n");
ltype = "comment";
recordPush("");
}
else if (c[a] === "`" || (c[a] === "}" && templateString[templateString.length - 1] === true)) {
// template string
if (wordTest > -1) {
word();
}
if (c[a] === "`") {
templateString.push(false);
}
else {
templateString[templateString.length - 1] = false;
}
ltoke = tempstring();
ltype = "string";
recordPush("");
}
else if (c[a] === "\"" || c[a] === "'") {
// string
ltoke = generic(c[a], c[a]);
ltype = "string";
recordPush("");
}
else if (c[a] === "-" && (a < b - 1 && c[a + 1] !== "=" && c[a + 1] !== "-") && (ltype === "number" || ltype === "word") && ltoke !== "return" && (ltoke === ")" || ltoke === "]" || ltype === "word" || ltype === "number")) {
// subtraction
if (wordTest > -1) {
word();
}
ltoke = "-";
ltype = "operator";
recordPush("");
}
else if (wordTest === -1 && (c[a] !== "0" || (c[a] === "0" && c[a + 1] !== "b")) && ((/\d/).test(c[a]) || (a !== b - 2 && c[a] === "-" && c[a + 1] === "." && (/\d/).test(c[a + 2])) || (a !== b - 1 && (c[a] === "-" || c[a] === ".") && (/\d/).test(c[a + 1])))) {
// number
if (wordTest > -1) {
word();
}
if (ltype === "end" && c[a] === "-") {
ltoke = "-";
ltype = "operator";
}
else {
ltoke = numb();
ltype = "number";
}
recordPush("");
}
else if (c[a] === ":" && c[a + 1] === ":") {
if (wordTest > -1) {
word();
}
if (options.correct === true) {
plusplus();
}
asifix();
a = a + 1;
ltoke = "::";
ltype = "separator";
recordPush("");
}
else if (c[a] === ",") {
// comma
if (wordTest > -1) {
word();
}
if (options.correct === true) {
plusplus();
}
if (ltype === "comment") {
commaComment();
}
else if (vart.len > -1 && vart.count[vart.len] === 0 && options.lexerOptions.script.varword === "each") {
asifix();
ltoke = ";";
ltype = "separator";
recordPush("");
ltoke = vart.word[vart.len];
ltype = "word";
recordPush("");
vart.index[vart.len] = parse.count;
}
else {
ltoke = ",";
ltype = "separator";
asifix();
recordPush("");
}
}
else if (c[a] === ".") {
// period
if (wordTest > -1) {
word();
}
if (c[a + 1] === "." && c[a + 2] === ".") {
ltoke = "...";
ltype = "operator";
a = a + 2;
}
else {
asifix();
ltoke = ".";
ltype = "separator";
}
if ((/\s/).test(c[a - 1]) === true) {
parse.linesSpace = 1;
}
recordPush("");
}
else if (c[a] === ";") {
// semicolon
if (wordTest > -1) {
word();
}
if (options.lang === "qml") {
ltoke = "x;";
ltype = "separator";
recordPush("");
}
else {
if (classy[classy.length - 1] === 0) {
classy.pop();
}
if (vart.len > -1 && vart.count[vart.len] === 0) {
if (options.lexerOptions.script.varword === "each") {
vartpop();
}
else {
vart.index[vart.len] = parse.count + 1;
}
}
if (options.correct === true) {
plusplus();
}
ltoke = ";";
ltype = "separator";
if (data.token[parse.count] === "x}") {
asibrace();
}
else {
recordPush("");
}
}
if (brace[brace.length - 1] === "x{" && nextchar(1, false) !== "}") {
blockinsert();
}
}
else if (c[a] === "(" || c[a] === "[" || c[a] === "{") {
start(c[a]);
}
else if (c[a] === ")" || c[a] === "]" || c[a] === "}") {
end(c[a]);
}
else if (c[a] === "*" && data.stack[parse.count] === "object" && wordTest < 0 && (/\s/).test(c[a + 1]) === false && c[a + 1] !== "=" && (/\d/).test(c[a + 1]) === false) {
wordTest = a;
}
else if (c[a] === "=" || c[a] === "&" || c[a] === "<" || c[a] === ">" || c[a] === "+" || c[a] === "-" || c[a] === "*" || c[a] === "/" || c[a] === "!" || c[a] === "?" || c[a] === "|" || c[a] === "^" || c[a] === ":" || c[a] === "%" || c[a] === "~") {
// operator
ltoke = operator();
if (ltoke === "regex") {
ltoke = data.token[parse.count];
}
else {
ltype = "operator";
if (ltoke !== "!" && ltoke !== "++" && ltoke !== "--") {
asifix();
}
recordPush("");
}
}
else if (wordTest < 0 && c[a] !== "") {
wordTest = a;
}
if (vart.len > -1 && parse.count === vart.index[vart.len] + 1 && data.token[vart.index[vart.len]] === ";" && ltoke !== vart.word[vart.len] && ltype !== "comment" && options.lexerOptions.script.varword === "list") {
vartpop();
}
a = a + 1;
} while (a < b);
if (wordTest > -1) {
word();
}
if (options.correct === true && options.lang !== "jsx" && ((data.token[parse.count] !== "}" && data.token[0] === "{") || data.token[0] !== "{") && ((data.token[parse.count] !== "]" && data.token[0] === "[") || data.token[0] !== "[")) {
asi(false);
}
if (sourcemap[0] === parse.count) {
ltoke = "\n" + sourcemap[1];
ltype = "string";
recordPush("");
}
if (data.token[parse.count] === "x;" && (data.token[parse.count - 1] === "}" || data.token[parse.count - 1] === "]") && data.begin[parse.count - 1] === 0) {
tempstore = parse.pop(data);
}
if (options.correct === true) {
let aa = 0;
const bb = parse.count + 1;
do {
if (data.token[aa] === "x;") {
data.token[aa] = ";";
}
else if (data.token[aa] === "x{") {
data.token[aa] = "{";
}
else if (data.token[aa] === "x}") {
data.token[aa] = "}";
}
else if (data.token[aa] === "x(") {
data.token[aa] = "(";
}
else if (data.token[aa] === "x)") {
data.token[aa] = ")";
}
aa = aa + 1;
} while (aa < bb);
}
return data;
};
framework.lexer.script = script;
}());
/*global global*/
/*
Taken from Pretty Diff. This file is not a formal release product. It exists to make testing code in node and browser a bit faster.
*/
(function language_init() {
"use strict";
const language = {
auto: function language_auto(sample, defaultLang) {
let b = [], c = 0;
const vartest = (/(((var)|(let)|(const)|(function)|(import))\s+(\w|\$)+[a-zA-Z0-9]*)/).test(sample), finalstatic = (/((((final)|(public)|(private))\s+static)|(static\s+void))/).test(sample), output = function language_auto_output(langname) {
if (langname === "unknown") {
return [defaultLang, language.setlangmode(defaultLang), "unknown"];
}
if (langname === "xhtml" || langname === "markup") {
return ["xml", "markup", "XHTML"];
}
if (langname === "tss") {
return ["tss", "script", "Titanium Stylesheets"];
}
if (langname === "markdown") {
return ["markdown", "markdown", "Markdown"];
}
return [langname, language.setlangmode(langname), language.nameproper(langname)];
}, cssA = function language_auto_cssA() {
if ((/\$[a-zA-Z]/).test(sample) === true || (/\{\s*(\w|\.|\$|#)+\s*\{/).test(sample) === true) {
return output("scss");
}
if ((/@[a-zA-Z]/).test(sample) === true || (/\{\s*(\w|\.|@|#)+\s*\{/).test(sample) === true) {
return output("less");
}
return output("css");
}, notmarkup = function language_auto_notmarkup() {
let d = 1, join = "", flaga = false, flagb = false;
const publicprivate = (/((public)|(private))\s+(static\s+)?(((v|V)oid)|(class)|(final))/).test(sample), javascriptA = function language_auto_notmarkup_javascriptA() {
if (sample.indexOf("(") > -1 || sample.indexOf("=") > -1 || (sample.indexOf(";") > -1 && sample.indexOf("{") > -1)) {
if (vartest === false && ((/\n\s+#region\s/).test(sample) === true || (/\[\w+:/).test(sample) === true)) {
return output("csharp");
}
if (finalstatic === true || (/\w<\w+(,\s+\w+)*>/).test(sample) === true) {
if ((/:\s*((number)|(string))/).test(sample) === false && vartest === false && (finalstatic === true || publicprivate === true)) {
return output("java");
}
return output("typescript");
}
if ((/final\s+static/).test(sample) === true) {
return output("java");
}
if ((/(\(|\}|\?|,|(return)|(=>?))\s*</).test(sample) === true) {
return output("jsx");
}
return output("javascript");
}
return output("unknown");
}, cssOrJavaScript = function language_auto_notmarkup_cssOrJavaScript() {
if ((/:\s*((number)|(string))/).test(sample) === true && (/((public)|(private))\s+/).test(sample) === true) {
return output("typescript");
}
if ((/import\s+java(\.|(fx))/).test(sample) === true || (/((public)|(private))\s+static\s+/).test(sample) === true) {
return output("java");
}
if ((/\sclass\s+\w/).test(sample) === false && (/<[a-zA-Z]/).test(sample) === true && (/<\/[a-zA-Z]/).test(sample) === true && ((/\s?\{%/).test(sample) === true || (/\{(\{|#)(?!(\{|#|=))/).test(sample) === true)) {
return output("twig");
}
if ((/^(\s*(\$|@))/).test(sample) === false && (/(\};?\s*)$/).test(sample) === true) {
if ((/export\s+default\s+\{/).test(sample) === true || (/(\?|:)\s*(\{|\[)/).test(sample) === true || (/(\{|\s|;)render\s*\(\)\s*\{/).test(sample) === true || (/^(\s*return;?\s*\{)/).test(sample) === true) {
return output("javascript");
}
}
if ((/\{\{#/).test(sample) === true && (/\{\{\//).test(sample) === true && (/<\w/).test(sample) === true) {
return output("handlebars");
}
if ((/\{\s*(\w|\.|@|#)+\s*\{/).test(sample) === true) {
return output("less");
}
if ((/\$(\w|-)/).test(sample) === true) {
return output("scss");
}
if ((/(;|\{|:)\s*@\w/).test(sample) === true) {
return output("less");
}
if ((/class\s+\w+\s+\{/).test(sample) === true) {
return output("java");
}
return output("css");
};
if (d < c) {
do {
if (flaga === false) {
if (b[d] === "*" && b[d - 1] === "/") {
b[d - 1] = "";
flaga = true;
}
else if (flagb === false && b[d] === "f" && d < c - 6 && b[d + 1] === "i" && b[d + 2] === "l" && b[d + 3] === "t" && b[d + 4] === "e" && b[d + 5] === "r" && b[d + 6] === ":") {
flagb = true;
}
}
else if (flaga === true && b[d] === "*" && d !== c - 1 && b[d + 1] === "/") {
flaga = false;
b[d] = "";
b[d + 1] = "";
}
else if (flagb === true && b[d] === ";") {
flagb = false;
b[d] = "";
}
if (flaga === true || flagb === true) {
b[d] = "";
}
d = d + 1;
} while (d < c);
}
join = b.join("");
if ((/\s\/\//).test(sample) === false && (/\/\/\s/).test(sample) === false && (/^(\s*(\{|\[)(?!%))/).test(sample) === true && (/((\]|\})\s*)$/).test(sample) && sample.indexOf(",") !== -1) {
return output("json");
}
if ((/((\}?(\(\))?\)*;?\s*)|([a-z0-9]("|')?\)*);?(\s*\})*)$/i).test(sample) === true && (vartest === true || publicprivate === true || (/console\.log\(/).test(sample) === true || (/export\s+default\s+class\s+/).test(sample) === true || (/document\.get/).test(sample) === true || (/((=|(\$\())\s*function)|(\s*function\s+(\w*\s+)?\()/).test(sample) === true || sample.indexOf("{") === -1 || (/^(\s*if\s+\()/).test(sample) === true)) {
return javascriptA();
}
// * u007b === {
// * u0024 === $
// * u002e === .
if (sample.indexOf("{") > -1 && ((/^(\s*[\u007b\u0024\u002e#@a-z0-9])/i).test(sample) === true || (/^(\s*\/(\*|\/))/).test(sample) === true || (/^(\s*\*\s*\{)/).test(sample) === true) && (/^(\s*if\s*\()/).test(sample) === false && (/=\s*(\{|\[|\()/).test(join) === false && (((/(\+|-|=|\?)=/).test(join) === false || (/\/\/\s*=+/).test(join) === true) || ((/=+('|")?\)/).test(sample) === true && (/;\s*base64/).test(sample) === true)) && (/function(\s+\w+)*\s*\(/).test(join) === false) {
if ((/\s*#((include)|(define)|(endif))\s+/).test(sample)) {
return output("c_cpp");
}
return cssOrJavaScript();
}
if ((/"\s*:\s*\{/).test(sample) === true) {
return output("tss");
}
if (sample.indexOf("{%") > -1) {
return output("twig");
}
return output("unknown");
}, markup = function language_auto_markup() {
const html = function language_auto_markup_html() {
if ((/<%\s*\}/).test(sample) === true) {
return output("ejs");
}
if ((/<%\s*end/).test(sample) === true) {
return output("html_ruby");
}
if ((/\{\{(#|\/|\{)/).test(sample) === true) {
return output("handlebars");
}
if ((/\{\{end\}\}/).test(sample) === true) {
//place holder for Go lang templates
return output("html");
}
if ((/\s?\{%/).test(sample) === true && (/\{(\{|#)(?!(\{|#|=))/).test(sample) === true) {
return output("twig");
}
if ((/<\?/).test(sample) === true) {
return output("php");
}
if ((/<jsp:include\s/).test(sample) === true || (/<c:((set)|(if))\s/).test(sample) === true) {
return output("jsp");
}
if ((/\{(#|\?|\^|@|<|\+|~)/).test(sample) === true && (/\{\//).test(sample) === true) {
return output("dustjs");
}
return output("html");
};
if ((/^(\s*<!doctype\u0020html>)/i).test(sample) === true || (/^(\s*<html)/i).test(sample) === true || ((/^(\s*<!DOCTYPE\s+((html)|(HTML))\s+PUBLIC\s+)/).test(sample) === true && (/XHTML\s+1\.1/).test(sample) === false && (/XHTML\s+1\.0\s+(S|s)((trict)|(TRICT))/).test(sample) === false)) {
return html();
}
if ((/<jsp:include\s/).test(sample) === true || (/<c:((set)|(if))\s/).test(sample) === true) {
return output("jsp");
}
if ((/<%\s*\}/).test(sample) === true) {
return output("ejs");
}
if ((/<%\s*end/).test(sample) === true) {
return output("html_ruby");
}
if ((/\{\{(#|\/|\{)/).test(sample) === true) {
return output("handlebars");
}
if ((/\{\{end\}\}/).test(sample) === true) {
//place holder for Go lang templates
return output("xml");
}
if ((/\s?\{%/).test(sample) === true && (/\{\{(?!(\{|#|=))/).test(sample) === true) {
return output("twig");
}
if ((/<\?(?!(xml))/).test(sample) === true) {
return output("php");
}
if ((/\{(#|\?|\^|@|<|\+|~)/).test(sample) === true && (/\{\//).test(sample) === true) {
return output("dustjs");
}
if ((/<jsp:include\s/).test(sample) === true || (/<c:((set)|(if))\s/).test(sample) === true) {
return output("jsp");
}
if ((/<cfset\s/i).test(sample) === true && (/<cfif\s/i).test(sample) === true) {
return output("coldfusion");
}
return output("xml");
};
if (sample === null) {
return;
}
if ((/\n#+\s+\w/).test(sample) === true && (/\s\*{1,2}\w+(\s+\w+)*\*{1,2}\s/).test(sample) === true) {
return output("markdown");
}
if ((/^(\s*<!DOCTYPE\s+html>)/i).test(sample) === true) {
return output("html");
}
if ((/^(\s*((if)|(for)|(function))\s*\()/).test(sample) === false && (/(\s|;|\})((if)|(for)|(function\s*\w*))\s*\(/).test(sample) === false && vartest === false && (/return\s*\w*\s*(;|\})/).test(sample) === false && (sample === undefined || (/^(\s*#(?!(!\/)))/).test(sample) === true || ((/\n\s*(\.|@)\w+(\(?|(\s*:))/).test(sample) === true && (/>\s*<\w/).test(sample) === false))) {
return cssA();
}
b = sample
.replace(/\[[a-zA-Z][\w-]*=("|')?[a-zA-Z][\w-]*("|')?\]/g, "")
.split("");
c = b.length;
if ((/^(\s*\{(%|#|\{))/).test(sample) === true) {
return markup();
}
if (((/^([\s\w-]*<)/).test(sample) === false && (/(>[\s\w-]*)$/).test(sample) === false) || finalstatic === true) {
return notmarkup();
}
if ((((/(>[\w\s:]*)?<(\/|!|#)?[\w\s:-\[]+/).test(sample) === true || (/^(\s*<\?xml)/).test(sample) === true) && ((/^([\s\w]*<)/).test(sample) === true || (/(>[\s\w]*)$/).test(sample) === true)) || ((/^(\s*<s((cript)|(tyle)))/i).test(sample) === true && (/(<\/s((cript)|(tyle))>\s*)$/i).test(sample) === true)) {
if ((/^([\s\w]*<)/).test(sample) === false || (/(>[\s\w]*)$/).test(sample) === false) {
return notmarkup();
}
return markup();
}
return output("unknown");
},
nameproper: function language_nameproper(input) {
const langmap = {
c_cpp: "C++ (Not yet supported)",
coldfusion: "ColdFusion",
csharp: "C#",
dustjs: "Dust.js",
ejs: "EJS Template",
elm: "Elm Template",
go: "Go Lang Template",
handlebars: "Handlebars Template",
html_ruby: "ERB (Ruby) Template",
java: "Java",
javascript: "JavaScript",
jsp: "JSTL (JSP)",
jsx: "React JSX",
liquid: "Liquid Template",
markup: "markup",
scss: "SCSS",
text: "Plain Text",
titanium: "Titanium Stylesheets",
tss: "Titanium Stylesheets",
twig: "HTML TWIG Template",
typescript: "TypeScript",
velocity: "Apache Velocity",
volt: "Volt Template"
};
if (typeof input !== "string" || langmap[input] === undefined) {
return input.toUpperCase();
}
return langmap[input];
},
// [0] = language value for ace mode [1] = prettydiff language category from [0]
// [2] = pretty formatting for text output to user
setlangmode: function language_setlangmode(input) {
const langmap = {
c_cpp: "script",
coldfusion: "markup",
csharp: "script",
css: "style",
csv: "csv",
dustjs: "markup",
ejs: "markup",
go: "markup",
handlebars: "markup",
html: "markup",
html_ruby: "markup",
java: "script",
javascript: "script",
json: "script",
jsp: "markup",
jsx: "script",
less: "style",
markup: "markup",
php: "markup",
qml: "markup",
scss: "style",
swig: "markup",
text: "text",
titanium: "script",
tss: "script",
twig: "markup",
typescript: "script",
velocity: "markup",
xhtml: "markup",
xml: "markup"
};
if (typeof input !== "string") {
return "script";
}
if (input.indexOf("html") > -1) {
return "markup";
}
if (langmap[input] === undefined) {
return "script";
}
return langmap[input];
}
};
window.parseFramework.language = language;
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment