UNPKG

idyll-compiler

Version:
1 lines 148 kB
{"version":3,"file":"index.mjs","sources":["../../src/lexer.js","../../src/grammar.js","../../src/parser.js","../../src/util/clean-newlines.js","../../src/util/pipeline.js","../../src/plugins/hoist-variables.js","../../src/plugins/flatten-children.js","../../src/plugins/make-full-width.js","../../src/plugins/wrap-text.js","../../src/plugins/clean-results.js","../../src/plugins/smart-quotes.js","../../src/plugins/auto-linkify.js","../../src/index.js"],"sourcesContent":["var Lexer = require('lex');\n\nconst formatToken = text => {\n text = text || '';\n const results = [];\n results.push('TOKEN_VALUE_START');\n results.push(\n '\"' +\n text\n .replace(/\\\"/g, '"')\n .replace(/\\\\\\[/, '[')\n .replace(/\\\\\\]/, ']') +\n '\"'\n );\n results.push('TOKEN_VALUE_END');\n return results;\n};\n\nconst shouldBreak = text => {\n if (text.trim() === '' && (text.match(/\\n/g) || []).length > 1) {\n return true;\n }\n return false;\n};\n\nlet currentInput = null;\n\nconst lex = function(options, alias = {}) {\n let { row, column, outer, skipLists, inComponent, gotName } = Object.assign(\n {},\n {\n row: 1,\n column: 1,\n outer: true,\n skipLists: false,\n inComponent: false,\n gotName: false\n },\n options || {}\n );\n var lexer = new Lexer(function(chr) {\n let errorString = `\n Error lexing input, unexpected token: ${chr}\n\n Found near index ${this.index - 1}:\n\n ${currentInput.substring(\n Math.max(0, this.index - 10),\n Math.min(this.index + 10, currentInput.length - 1)\n )}\n `;\n throw new Error(errorString);\n });\n\n const recurse = (str, opts) => {\n return lex(Object.assign({ row, column, outer: false }, opts || {}), alias)(\n str\n ).tokens;\n };\n const findAliases = name => {\n const aliasNames = Object.keys(alias);\n return [\n name,\n ...aliasNames.filter(\n aliasName => alias[aliasName].toLowerCase() === name.toLowerCase()\n )\n ].join('|');\n };\n var updatePosition = function(lexeme) {\n var lines = lexeme.split('\\n');\n row += lines.length - 1;\n if (lines.length > 1) {\n column = 0;\n }\n column += lines[lines.length - 1].length;\n };\n\n // Rules at the front are pre-processed,\n // e.g. equations, and code snippets\n // that shouldn't be formatted.\n const equationAliases = findAliases('equation');\n lexer.addRule(\n new RegExp(\n String.raw`\\[\\s*(${equationAliases})\\s*([^\\/\\]]*)\\s*\\][\\n\\s\\t]*(((?!(\\[\\s*\\/(${equationAliases})\\s*\\])).\\n?)*)[\\n\\s\\t]*\\[\\s*\\/\\s*(${equationAliases})\\s*\\]`,\n 'i'\n ),\n function(lexeme, tagName, props, innerText) {\n inComponent = false;\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['OPEN_BRACKET', 'COMPONENT_NAME']\n .concat(formatToken('equation'))\n .concat(recurse(props, { inComponent: true, gotName: true }))\n .concat(['CLOSE_BRACKET'])\n .concat(['WORDS'])\n .concat(formatToken(innerText.trim()))\n .concat(['OPEN_BRACKET', 'FORWARD_SLASH', 'COMPONENT_NAME'])\n .concat(formatToken('equation'))\n .concat(['CLOSE_BRACKET'])\n ];\n }\n );\n const codeAlias = findAliases('code');\n lexer.addRule(\n new RegExp(\n String.raw`\\[\\s*(${codeAlias})\\s*([^\\/\\]]*)\\s*\\][\\n\\s\\t]*(((?!(\\[\\s*\\/(${codeAlias})\\s*\\])).\\n?)*)[\\n\\s\\t]*\\[\\s*\\/\\s*(${codeAlias})\\s*\\]`,\n 'i'\n ),\n function(lexeme, tagName, props, innerText) {\n inComponent = false;\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['OPEN_BRACKET', 'COMPONENT_NAME']\n .concat(formatToken('code'))\n .concat(recurse(props, { inComponent: true, gotName: true }))\n .concat(['CLOSE_BRACKET'])\n .concat(['WORDS'])\n .concat(formatToken(innerText.trim()))\n .concat(['OPEN_BRACKET', 'FORWARD_SLASH', 'COMPONENT_NAME'])\n .concat(formatToken('code'))\n .concat(['CLOSE_BRACKET'])\n ];\n }\n );\n lexer.addRule(/`{4}(\\S*)\\n(((?!````)[\\s\\S])*[^\\n])\\n?\\s*`{4}/g, function(\n lexeme,\n language,\n text\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['MULTILINE_CODE'].concat(formatToken(language)).concat(formatToken(text))\n ];\n });\n lexer.addRule(/`{3}(\\S*)\\n(((?!```)[\\s\\S])*[^\\n])\\n?\\s*`{3}/g, function(\n lexeme,\n language,\n text\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['MULTILINE_CODE'].concat(formatToken(language)).concat(formatToken(text))\n ];\n });\n lexer.addRule(/```(((?!```)[^\\n])+)```/, function(lexeme, text) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['INLINE_CODE'].concat(formatToken(text.trim()))];\n });\n lexer.addRule(/``(((?!``)[^\\n])+)``/, function(lexeme, text) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['INLINE_CODE'].concat(formatToken(text.trim()))];\n });\n lexer.addRule(/`([^\\n\\`]+)`/, function(lexeme, text) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['INLINE_CODE'].concat(formatToken(text.trim()))];\n });\n\n lexer.addRule(/[\\s\\n]*(#{1,6})\\s*([^\\n\\[]+)[\\n\\s]*/gm, function(\n lexeme,\n hashes,\n text\n ) {\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['BREAK', 'HEADER_' + hashes.length]\n .concat(recurse(text, { skipLists: true }))\n .concat(['HEADER_END'])\n ];\n });\n\n lexer.addRule(/[\\s\\n]*>\\s*([^\\n\\[]+)[\\n\\s]*/gm, function(lexeme, text) {\n if (this.reject) return;\n updatePosition(lexeme);\n return [\n ['BREAK', 'QUOTE_START']\n .concat(recurse(text, { skipLists: true }))\n .concat(['QUOTE_END'])\n ];\n });\n\n lexer.addRule(/\\*\\*([^\\s\\n][^\\*]*[^\\s\\n])\\*\\*(\\s*)/g, function(\n lexeme,\n text,\n trailingSpace\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n var ret = ['STRONG']\n .concat(recurse(text, { skipLists: true }))\n .concat(['STRONG_END']);\n if (trailingSpace) {\n if (shouldBreak(trailingSpace)) {\n ret = ret.concat(['BREAK']);\n } else {\n ret = ret.concat(['WORDS']).concat(formatToken(trailingSpace));\n }\n }\n return [ret];\n });\n lexer.addRule(/__([^\\s\\n][^_]*[^\\s\\n])__(\\s*)/g, function(\n lexeme,\n text,\n trailingSpace\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n var ret = ['STRONG']\n .concat(recurse(text, { skipLists: true }))\n .concat(['STRONG_END']);\n if (trailingSpace) {\n if (shouldBreak(trailingSpace)) {\n ret = ret.concat(['BREAK']);\n } else {\n ret = ret.concat(['WORDS']).concat(formatToken(trailingSpace));\n }\n }\n return [ret];\n });\n lexer.addRule(/\\*([^\\s\\n\\*][^\\*]*[^\\s\\n\\*])\\*(\\s*)/g, function(\n lexeme,\n text,\n trailingSpace\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n var ret = ['EM']\n .concat(recurse(text, { skipLists: true }))\n .concat(['EM_END']);\n if (trailingSpace) {\n if (shouldBreak(trailingSpace)) {\n ret = ret.concat(['BREAK']);\n } else {\n ret = ret.concat(['WORDS']).concat(formatToken(trailingSpace));\n }\n }\n return [ret];\n });\n lexer.addRule(/_([^\\s\\n_][^_]*[^\\s\\n_])_(\\s*)/g, function(\n lexeme,\n text,\n trailingSpace\n ) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n var ret = ['EM']\n .concat(recurse(text, { skipLists: true }))\n .concat(['EM_END']);\n if (trailingSpace) {\n if (shouldBreak(trailingSpace)) {\n ret = ret.concat(['BREAK']);\n } else {\n ret = ret.concat(['WORDS']).concat(formatToken(trailingSpace));\n }\n }\n return [ret];\n });\n\n lexer.addRule(/^\\s*([\\-\\*]\\s+([^\\n]*)\\n)*([\\-\\*]\\s+([^\\n]*)\\n?)/gm, function(\n lexeme\n ) {\n this.reject = inComponent || skipLists;\n if (this.reject) return;\n updatePosition(lexeme);\n const items = lexeme.trim().split('\\n');\n const matches = items.map(item => /[\\-\\*]\\s*([^\\n]*)/.exec(item)[1]);\n let output = ['BREAK', 'UNORDERED_LIST'];\n matches.forEach(item => {\n output = output.concat(['LIST_ITEM']).concat(recurse(item.trim() || ' '));\n });\n return [output.concat(['LIST_END'])];\n });\n\n lexer.addRule(/^\\s*(\\d+\\.\\s+([^\\n]*)\\n)*(\\d+\\.\\s+([^\\n]*)\\n?)/gm, function(\n lexeme\n ) {\n this.reject = inComponent || skipLists;\n if (this.reject) return;\n updatePosition(lexeme);\n const items = lexeme.trim().split('\\n');\n const matches = items.map(item => /\\d+\\.\\s*([^\\n]*)/.exec(item)[1]);\n let output = ['BREAK', 'ORDERED_LIST'];\n matches.forEach(item => {\n output = output.concat(['LIST_ITEM']).concat(recurse(item));\n });\n return [output.concat(['LIST_END'])];\n });\n\n lexer.addRule(\n /\\s*~((\\s*\\w*\\s*(:?=)\\s*[^\\n,]*)[^\\n,](,[^\\n]\\s*\\w*\\s*(:?=)\\s*[^\\n,]*)*)/g,\n function(lexeme, variableDeclarations) {\n if (this.reject) return;\n updatePosition(lexeme);\n let output = [];\n variableDeclarations.split(',').forEach(declaration => {\n if (declaration[declaration.indexOf('=') - 1] === ':') {\n output = output\n .concat(['OPEN_BRACKET', 'COMPONENT_NAME'])\n .concat(formatToken('derived'))\n .concat(['COMPONENT_WORD'])\n .concat(formatToken('name'))\n .concat('PARAM_SEPARATOR', 'COMPONENT_WORD')\n .concat(formatToken(declaration.split(':=')[0].trim()))\n .concat(['COMPONENT_WORD'])\n .concat(formatToken('value'))\n .concat(['PARAM_SEPARATOR'])\n .concat(['EXPRESSION'])\n .concat(formatToken('`' + declaration.split(':=')[1].trim() + '`'))\n .concat(['FORWARD_SLASH', 'CLOSE_BRACKET']);\n } else {\n output = output\n .concat(['OPEN_BRACKET', 'COMPONENT_NAME'])\n .concat(formatToken('var'))\n .concat(['COMPONENT_WORD'])\n .concat(formatToken('name'))\n .concat('PARAM_SEPARATOR', 'COMPONENT_WORD')\n .concat(formatToken(declaration.split('=')[0].trim()))\n .concat(['COMPONENT_WORD'])\n .concat(formatToken('value'))\n .concat('PARAM_SEPARATOR')\n .concat(\n recurse(declaration.split('=')[1].trim(), { inComponent: true })\n )\n .concat(['FORWARD_SLASH', 'CLOSE_BRACKET']);\n }\n });\n return [output];\n }\n );\n lexer.addRule(/!\\[([^\\]]*)\\]\\(([^\\)]*)\\)/, function(lexeme, text, link) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['IMAGE'].concat(formatToken(text)).concat(formatToken(link))];\n });\n\n lexer.addRule(/\\[([^\\]]*)\\]\\(([^\\)]*)\\)/, function(lexeme, text, link) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['LINK'].concat(formatToken(text)).concat(formatToken(link))];\n });\n\n lexer.addRule(/(\\n\\s*\\/\\/[^\\n]*|\\/\\/\\s+[^\\n]*)/, function(lexeme) {\n updatePosition(lexeme);\n if (lexeme.startsWith('\\n')) {\n return [['BREAK']];\n }\n });\n\n lexer.addRule(/\\/(\\n?[^`\\*\\[\\/\\n\\]!\\\\\\d_])*/gm, function(lexeme) {\n this.reject = inComponent || lexeme.trim() === '';\n if (this.reject) return;\n updatePosition(lexeme);\n return [['WORDS'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(/(\\n?[^`\\*\\[\\/\\n\\]!\\\\\\d_])+/, function(lexeme) {\n this.reject = inComponent || lexeme.trim() === '';\n if (this.reject) return;\n updatePosition(lexeme);\n return [['WORDS'].concat(formatToken(lexeme))];\n });\n // Match on separately so we can greedily match the\n // other tags.\n lexer.addRule(/[!\\d\\*_`] */, function(lexeme) {\n this.reject = inComponent || lexeme.trim() === '';\n if (this.reject) return;\n updatePosition(lexeme);\n return [['WORDS'].concat(formatToken(lexeme))];\n });\n lexer.addRule(/\\\\[\\[\\]]?/, function(lexeme) {\n this.reject = inComponent || lexeme.trim() === '';\n if (this.reject) return;\n updatePosition(lexeme);\n return [['WORDS'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(/\\s*\\n{2,}\\s*/, function(lexeme) {\n this.reject = inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['BREAK']];\n });\n\n lexer.addRule(/[ \\t\\n]+/, function(lexeme) {\n updatePosition(lexeme);\n });\n\n lexer.addRule(/\\[/, function(lexeme) {\n inComponent = true;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['OPEN_BRACKET']];\n });\n\n lexer.addRule(/\\]([ ]*)/, function(lexeme, trailingSpace) {\n inComponent = false;\n gotName = false;\n if (this.reject) return;\n updatePosition(lexeme);\n var ret = ['CLOSE_BRACKET'];\n if (trailingSpace) {\n ret = ret.concat(['WORDS']).concat(formatToken(trailingSpace));\n }\n return [ret];\n });\n\n lexer.addRule(/\\//, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['FORWARD_SLASH']];\n });\n\n lexer.addRule(/true|false/, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['BOOLEAN'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(\n /[^+\\-0-9:\\s\\/\\]\"'`\\.]([^:\\s\\/\\]\"'`]*[^:\\s\\/\\]\"'`\\.])*/,\n function(lexeme) {\n this.reject = !inComponent || gotName;\n if (this.reject) return;\n gotName = true;\n updatePosition(lexeme);\n return [['COMPONENT_NAME'].concat(formatToken(lexeme))];\n }\n );\n lexer.addRule(/[^+\\-0-9:\\s\\/\\]\"'`\\.][^:\\s\\/\\]\"'`\\.]*/, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['COMPONENT_WORD'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(/`[^`]*`/, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['EXPRESSION'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(/[+\\-]?\\.?[0-9]+\\.?[0-9]*/, function(lexeme) {\n const multiplePeriods =\n (lexeme.match(new RegExp(/\\./, 'g')) || []).length >= 2;\n this.reject = !inComponent || multiplePeriods;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['NUMBER'].concat(formatToken(lexeme))];\n });\n\n lexer.addRule(/\"[^\"]*\"/, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['STRING'].concat(formatToken(lexeme))];\n });\n lexer.addRule(/'([^']*)'/, function(lexeme, str) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['STRING'].concat(formatToken('\"' + str + '\"'))];\n });\n\n lexer.addRule(/:/, function(lexeme) {\n this.reject = !inComponent;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['PARAM_SEPARATOR']];\n });\n\n lexer.addRule(/\\s*$/, function(lexeme) {\n this.reject = !outer;\n if (this.reject) return;\n updatePosition(lexeme);\n return [['EOF']];\n });\n\n return function(str) {\n currentInput = str;\n var vals = [];\n var output = [];\n var positions = [];\n\n lexer.input = str.trim();\n var token = lexer.lex();\n\n while (token) {\n output.push(token);\n positions.push([row, column]);\n token = lexer.lex();\n }\n return {\n tokens: output,\n positions: positions\n };\n };\n};\n\nexport default lex;\n","// Generated automatically by nearley, version 2.20.1\n// http://github.com/Hardmath123/nearley\n(function () {\nfunction id(x) { return x[0]; }\nvar grammar = {\n Lexer: undefined,\n ParserRules: [\n {\"name\": \"_$ebnf$1\", \"symbols\": []},\n {\"name\": \"_$ebnf$1\", \"symbols\": [\"_$ebnf$1\", \"wschar\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"_\", \"symbols\": [\"_$ebnf$1\"], \"postprocess\": function(d) {return null;}},\n {\"name\": \"__$ebnf$1\", \"symbols\": [\"wschar\"]},\n {\"name\": \"__$ebnf$1\", \"symbols\": [\"__$ebnf$1\", \"wschar\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"__\", \"symbols\": [\"__$ebnf$1\"], \"postprocess\": function(d) {return null;}},\n {\"name\": \"wschar\", \"symbols\": [/[ \\t\\n\\v\\f]/], \"postprocess\": id},\n {\"name\": \"Sourcefile$string$1\", \"symbols\": [{\"literal\":\"E\"}, {\"literal\":\"O\"}, {\"literal\":\"F\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Sourcefile\", \"symbols\": [\"Blocks\", \"Sourcefile$string$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0];\n }\n },\n {\"name\": \"Blocks$ebnf$1\", \"symbols\": []},\n {\"name\": \"Blocks$ebnf$1$subexpression$1$string$1\", \"symbols\": [{\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"K\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Blocks$ebnf$1$subexpression$1\", \"symbols\": [\"Blocks$ebnf$1$subexpression$1$string$1\", \"__\"]},\n {\"name\": \"Blocks$ebnf$1\", \"symbols\": [\"Blocks$ebnf$1\", \"Blocks$ebnf$1$subexpression$1\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Blocks$ebnf$2\", \"symbols\": []},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$1$string$1\", \"symbols\": [{\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"K\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$1$string$1\", \"__\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$1\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$2$string$1\", \"symbols\": [{\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"K\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$2\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$2$string$1\", \"__\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1\", \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$1\", \"symbols\": [\"BreakBlock\", \"__\", \"Blocks$ebnf$2$subexpression$1$subexpression$1$ebnf$1\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$1\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1\", \"symbols\": []},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1$subexpression$1$string$1\", \"symbols\": [{\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"K\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1$subexpression$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1$subexpression$1$string$1\", \"__\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1\", \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1$subexpression$1\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Blocks$ebnf$2$subexpression$1$subexpression$2\", \"symbols\": [\"NoBreakBlock\", \"__\", \"Blocks$ebnf$2$subexpression$1$subexpression$2$ebnf$1\"]},\n {\"name\": \"Blocks$ebnf$2$subexpression$1\", \"symbols\": [\"Blocks$ebnf$2$subexpression$1$subexpression$2\"]},\n {\"name\": \"Blocks$ebnf$2\", \"symbols\": [\"Blocks$ebnf$2\", \"Blocks$ebnf$2$subexpression$1\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Blocks$ebnf$3$subexpression$1\", \"symbols\": [\"BreakBlock\", \"__\"]},\n {\"name\": \"Blocks$ebnf$3\", \"symbols\": [\"Blocks$ebnf$3$subexpression$1\"], \"postprocess\": id},\n {\"name\": \"Blocks$ebnf$3\", \"symbols\": [], \"postprocess\": function(d) {return null;}},\n {\"name\": \"Blocks\", \"symbols\": [\"Blocks$ebnf$1\", \"Blocks$ebnf$2\", \"Blocks$ebnf$3\"], \"postprocess\": \n function(data, location, reject) {\n var blocks = [];\n data[1].forEach(function(d) {\n blocks.push(d[0][0]);\n })\n \n if (data[2]) {\n blocks.push(data[2][0]);\n }\n return blocks;\n }\n },\n {\"name\": \"Block$subexpression$1\", \"symbols\": [\"BreakBlock\"]},\n {\"name\": \"Block$subexpression$1\", \"symbols\": [\"NoBreakBlock\"]},\n {\"name\": \"Block\", \"symbols\": [\"Block$subexpression$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0][0];\n }\n },\n {\"name\": \"NoBreakBlock$subexpression$1\", \"symbols\": [\"Header\"]},\n {\"name\": \"NoBreakBlock$subexpression$1\", \"symbols\": [\"Quote\"]},\n {\"name\": \"NoBreakBlock$subexpression$1\", \"symbols\": [\"MultilineCode\"]},\n {\"name\": \"NoBreakBlock$subexpression$1\", \"symbols\": [\"UnorderedList\"]},\n {\"name\": \"NoBreakBlock$subexpression$1\", \"symbols\": [\"OrderedList\"]},\n {\"name\": \"NoBreakBlock\", \"symbols\": [\"NoBreakBlock$subexpression$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0][0];\n }\n },\n {\"name\": \"BreakBlock$subexpression$1\", \"symbols\": [\"Paragraph\"]},\n {\"name\": \"BreakBlock\", \"symbols\": [\"BreakBlock$subexpression$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0][0];\n }\n },\n {\"name\": \"Header$string$1\", \"symbols\": [{\"literal\":\"H\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}, {\"literal\":\"R\"}, {\"literal\":\"_\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Header$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"Header$ebnf$1\", \"symbols\": [\"Header$ebnf$1$subexpression$1\"]},\n {\"name\": \"Header$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"Header$ebnf$1\", \"symbols\": [\"Header$ebnf$1\", \"Header$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Header$string$2\", \"symbols\": [{\"literal\":\"H\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}, {\"literal\":\"R\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Header\", \"symbols\": [\"Header$string$1\", /[1-6]/, \"Header$ebnf$1\", \"__\", \"Header$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[2].map(function (child) {\n children.push(child[1]);\n });\n \n return [\"h\" + data[1], [], children];\n }\n },\n {\"name\": \"Quote$string$1\", \"symbols\": [{\"literal\":\"Q\"}, {\"literal\":\"U\"}, {\"literal\":\"O\"}, {\"literal\":\"T\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Quote$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"Quote$ebnf$1\", \"symbols\": [\"Quote$ebnf$1$subexpression$1\"]},\n {\"name\": \"Quote$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"Quote$ebnf$1\", \"symbols\": [\"Quote$ebnf$1\", \"Quote$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Quote$string$2\", \"symbols\": [{\"literal\":\"Q\"}, {\"literal\":\"U\"}, {\"literal\":\"O\"}, {\"literal\":\"T\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Quote\", \"symbols\": [\"Quote$string$1\", \"Quote$ebnf$1\", \"__\", \"Quote$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push(child[1]);\n });\n \n return [\"blockquote\", [], children];\n }\n },\n {\"name\": \"UnorderedList$string$1\", \"symbols\": [{\"literal\":\"U\"}, {\"literal\":\"N\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"D\"}, {\"literal\":\"_\"}, {\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"UnorderedList$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ListItem\"]},\n {\"name\": \"UnorderedList$ebnf$1\", \"symbols\": [\"UnorderedList$ebnf$1$subexpression$1\"]},\n {\"name\": \"UnorderedList$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ListItem\"]},\n {\"name\": \"UnorderedList$ebnf$1\", \"symbols\": [\"UnorderedList$ebnf$1\", \"UnorderedList$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"UnorderedList$string$2\", \"symbols\": [{\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"UnorderedList\", \"symbols\": [\"UnorderedList$string$1\", \"UnorderedList$ebnf$1\", \"__\", \"UnorderedList$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push([\"li\", [], child[1]]);\n });\n return [\"ul\", [], children];\n }\n },\n {\"name\": \"OrderedList$string$1\", \"symbols\": [{\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"D\"}, {\"literal\":\"_\"}, {\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OrderedList$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ListItem\"]},\n {\"name\": \"OrderedList$ebnf$1\", \"symbols\": [\"OrderedList$ebnf$1$subexpression$1\"]},\n {\"name\": \"OrderedList$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ListItem\"]},\n {\"name\": \"OrderedList$ebnf$1\", \"symbols\": [\"OrderedList$ebnf$1\", \"OrderedList$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"OrderedList$string$2\", \"symbols\": [{\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OrderedList\", \"symbols\": [\"OrderedList$string$1\", \"OrderedList$ebnf$1\", \"__\", \"OrderedList$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push([\"li\", [], child[1]]);\n });\n return [\"ol\", [], children];\n }\n },\n {\"name\": \"ListItem$string$1\", \"symbols\": [{\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"I\"}, {\"literal\":\"T\"}, {\"literal\":\"E\"}, {\"literal\":\"M\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ListItem$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"ListItem$ebnf$1\", \"symbols\": [\"ListItem$ebnf$1$subexpression$1\"]},\n {\"name\": \"ListItem$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"ListItem$ebnf$1\", \"symbols\": [\"ListItem$ebnf$1\", \"ListItem$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"ListItem\", \"symbols\": [\"ListItem$string$1\", \"ListItem$ebnf$1\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push(child[1]);\n });\n return children;\n }\n },\n {\"name\": \"MultilineCode$string$1\", \"symbols\": [{\"literal\":\"M\"}, {\"literal\":\"U\"}, {\"literal\":\"L\"}, {\"literal\":\"T\"}, {\"literal\":\"I\"}, {\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"N\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"C\"}, {\"literal\":\"O\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"MultilineCode$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"TokenValue\"]},\n {\"name\": \"MultilineCode$ebnf$1\", \"symbols\": [\"MultilineCode$ebnf$1$subexpression$1\"]},\n {\"name\": \"MultilineCode$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"TokenValue\"]},\n {\"name\": \"MultilineCode$ebnf$1\", \"symbols\": [\"MultilineCode$ebnf$1\", \"MultilineCode$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"MultilineCode\", \"symbols\": [\"MultilineCode$string$1\", \"MultilineCode$ebnf$1\"], \"postprocess\": \n function(data, location, reject) {\n if (data[1].length > 1 && data[1][0][1].trim() !== '') {\n return [\"CodeHighlight\", [['language', ['value', data[1][0][1]]]], [data[1][1][1]]];\n } else {\n return [\"pre\", [], [[\"code\", [], [data[1][data[1].length - 1][1]]]]];\n }\n }\n },\n {\"name\": \"Paragraph$ebnf$1\", \"symbols\": []},\n {\"name\": \"Paragraph$ebnf$1$subexpression$1\", \"symbols\": [\"ParagraphItem\", \"__\"]},\n {\"name\": \"Paragraph$ebnf$1\", \"symbols\": [\"Paragraph$ebnf$1\", \"Paragraph$ebnf$1$subexpression$1\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"Paragraph\", \"symbols\": [\"Paragraph$ebnf$1\", \"ParagraphItem\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[0].map(function (child) {\n children.push(child[0]);\n });\n children.push(data[1]);\n var lastWasString = false;\n \n // If there are multiple strings split across\n // children merge them to avoid issues with\n // Equation and other components that\n // consume their children programatically.\n children = children.reduce((acc, c) => {\n if (typeof c === 'string' && lastWasString) {\n acc[acc.length - 1] += c;\n lastWasString = true;\n } else if (typeof c === 'string') {\n acc.push(c);\n lastWasString = true;\n } else {\n acc.push(c);\n lastWasString = false;\n }\n return acc;\n }, [])\n if (children.length === 1 && typeof children[0] !== 'string') {\n return children[0];\n } else if (children.filter(function (c) { return typeof c === 'string' }).length === 0) {\n return [\"_idyllContainer\", [], children];\n }\n \n return [\"p\", [], children];\n }\n },\n {\"name\": \"ParagraphItem$subexpression$1\", \"symbols\": [\"Text\"]},\n {\"name\": \"ParagraphItem$subexpression$1\", \"symbols\": [\"ClosedComponent\"]},\n {\"name\": \"ParagraphItem$subexpression$1\", \"symbols\": [\"OpenComponent\"]},\n {\"name\": \"ParagraphItem$subexpression$1\", \"symbols\": [\"TextInline\"]},\n {\"name\": \"ParagraphItem\", \"symbols\": [\"ParagraphItem$subexpression$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0][0];\n }\n },\n {\"name\": \"Text$string$1\", \"symbols\": [{\"literal\":\"W\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}, {\"literal\":\"S\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"Text\", \"symbols\": [\"Text$string$1\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n return data[2];\n }\n },\n {\"name\": \"TextInline$subexpression$1\", \"symbols\": [\"CodeInline\"]},\n {\"name\": \"TextInline$subexpression$1\", \"symbols\": [\"BoldInline\"]},\n {\"name\": \"TextInline$subexpression$1\", \"symbols\": [\"EmInline\"]},\n {\"name\": \"TextInline$subexpression$1\", \"symbols\": [\"LinkInline\"]},\n {\"name\": \"TextInline$subexpression$1\", \"symbols\": [\"ImageInline\"]},\n {\"name\": \"TextInline\", \"symbols\": [\"TextInline$subexpression$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0][0];\n }\n },\n {\"name\": \"BoldInline$string$1\", \"symbols\": [{\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"R\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}, {\"literal\":\"G\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"BoldInline$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"BoldInline$ebnf$1\", \"symbols\": [\"BoldInline$ebnf$1$subexpression$1\"]},\n {\"name\": \"BoldInline$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"BoldInline$ebnf$1\", \"symbols\": [\"BoldInline$ebnf$1\", \"BoldInline$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"BoldInline$string$2\", \"symbols\": [{\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"R\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}, {\"literal\":\"G\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"BoldInline\", \"symbols\": [\"BoldInline$string$1\", \"BoldInline$ebnf$1\", \"__\", \"BoldInline$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push(child[1]);\n });\n \n return [\"strong\", [], children];\n }\n },\n {\"name\": \"EmInline$string$1\", \"symbols\": [{\"literal\":\"E\"}, {\"literal\":\"M\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"EmInline$ebnf$1$subexpression$1\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"EmInline$ebnf$1\", \"symbols\": [\"EmInline$ebnf$1$subexpression$1\"]},\n {\"name\": \"EmInline$ebnf$1$subexpression$2\", \"symbols\": [\"__\", \"ParagraphItem\"]},\n {\"name\": \"EmInline$ebnf$1\", \"symbols\": [\"EmInline$ebnf$1\", \"EmInline$ebnf$1$subexpression$2\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"EmInline$string$2\", \"symbols\": [{\"literal\":\"E\"}, {\"literal\":\"M\"}, {\"literal\":\"_\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"EmInline\", \"symbols\": [\"EmInline$string$1\", \"EmInline$ebnf$1\", \"__\", \"EmInline$string$2\"], \"postprocess\": \n function(data, location, reject) {\n var children = [];\n data[1].map(function (child) {\n children.push(child[1]);\n });\n \n return [\"em\", [], children];\n }\n },\n {\"name\": \"CodeInline$string$1\", \"symbols\": [{\"literal\":\"I\"}, {\"literal\":\"N\"}, {\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"N\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"C\"}, {\"literal\":\"O\"}, {\"literal\":\"D\"}, {\"literal\":\"E\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"CodeInline\", \"symbols\": [\"CodeInline$string$1\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n return ['code', [], [data[2]]];\n }\n },\n {\"name\": \"ImageInline$string$1\", \"symbols\": [{\"literal\":\"I\"}, {\"literal\":\"M\"}, {\"literal\":\"A\"}, {\"literal\":\"G\"}, {\"literal\":\"E\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ImageInline\", \"symbols\": [\"ImageInline$string$1\", \"__\", \"TokenValue\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n return ['img', [[\"src\", [\"value\", data[4]]], [\"alt\", [\"value\", data[2]]]], []];\n }\n },\n {\"name\": \"LinkInline$string$1\", \"symbols\": [{\"literal\":\"L\"}, {\"literal\":\"I\"}, {\"literal\":\"N\"}, {\"literal\":\"K\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"LinkInline\", \"symbols\": [\"LinkInline$string$1\", \"__\", \"TokenValue\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n return ['a', [[\"href\", [\"value\", data[4]]]], [data[2]]];\n }\n },\n {\"name\": \"OpenComponent\", \"symbols\": [\"OpenComponentStart\", \"__\", \"Blocks\", \"OpenComponentEnd\"], \"postprocess\": \n function(data, location, reject) {\n return [data[0][0], data[0][1], data[2] || []];\n }\n },\n {\"name\": \"OpenComponentStart$string$1\", \"symbols\": [{\"literal\":\"O\"}, {\"literal\":\"P\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OpenComponentStart$string$2\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"L\"}, {\"literal\":\"O\"}, {\"literal\":\"S\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OpenComponentStart\", \"symbols\": [\"OpenComponentStart$string$1\", \"__\", \"ComponentName\", \"__\", \"ComponentProperties\", \"OpenComponentStart$string$2\"], \"postprocess\": \n function(data, location, reject) {\n return [data[2], data[4]];\n }\n },\n {\"name\": \"OpenComponentEnd$string$1\", \"symbols\": [{\"literal\":\"O\"}, {\"literal\":\"P\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OpenComponentEnd$string$2\", \"symbols\": [{\"literal\":\"F\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"W\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}, {\"literal\":\"_\"}, {\"literal\":\"S\"}, {\"literal\":\"L\"}, {\"literal\":\"A\"}, {\"literal\":\"S\"}, {\"literal\":\"H\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OpenComponentEnd$string$3\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"L\"}, {\"literal\":\"O\"}, {\"literal\":\"S\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"OpenComponentEnd\", \"symbols\": [\"OpenComponentEnd$string$1\", \"__\", \"OpenComponentEnd$string$2\", \"__\", \"ComponentName\", \"__\", \"OpenComponentEnd$string$3\"], \"postprocess\": \n function(data, location, reject) {\n return data;\n }\n },\n {\"name\": \"ClosedComponent$string$1\", \"symbols\": [{\"literal\":\"O\"}, {\"literal\":\"P\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ClosedComponent$string$2\", \"symbols\": [{\"literal\":\"F\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"W\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}, {\"literal\":\"_\"}, {\"literal\":\"S\"}, {\"literal\":\"L\"}, {\"literal\":\"A\"}, {\"literal\":\"S\"}, {\"literal\":\"H\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ClosedComponent$string$3\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"L\"}, {\"literal\":\"O\"}, {\"literal\":\"S\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"B\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"C\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ClosedComponent\", \"symbols\": [\"ClosedComponent$string$1\", \"__\", \"ComponentName\", \"__\", \"ComponentProperties\", \"ClosedComponent$string$2\", \"__\", \"ClosedComponent$string$3\"], \"postprocess\": \n function(data, location, reject) {\n return [data[2], data[4], []];\n }\n },\n {\"name\": \"ComponentName$string$1\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"O\"}, {\"literal\":\"M\"}, {\"literal\":\"P\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"N\"}, {\"literal\":\"A\"}, {\"literal\":\"M\"}, {\"literal\":\"E\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentName\", \"symbols\": [\"ComponentName$string$1\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n return data[2];\n }\n },\n {\"name\": \"ComponentProperties$ebnf$1\", \"symbols\": []},\n {\"name\": \"ComponentProperties$ebnf$1$subexpression$1\", \"symbols\": [\"ComponentProperty\", \"__\"]},\n {\"name\": \"ComponentProperties$ebnf$1\", \"symbols\": [\"ComponentProperties$ebnf$1\", \"ComponentProperties$ebnf$1$subexpression$1\"], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"ComponentProperties\", \"symbols\": [\"ComponentProperties$ebnf$1\"], \"postprocess\": \n function(data, location, reject) {\n return data[0].map(function(d) { return d[0]; });\n }\n },\n {\"name\": \"ComponentProperty$string$1\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"O\"}, {\"literal\":\"M\"}, {\"literal\":\"P\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"W\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentProperty$string$2\", \"symbols\": [{\"literal\":\"P\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"M\"}, {\"literal\":\"_\"}, {\"literal\":\"S\"}, {\"literal\":\"E\"}, {\"literal\":\"P\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"A\"}, {\"literal\":\"T\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentProperty\", \"symbols\": [\"ComponentProperty$string$1\", \"__\", \"TokenValue\", \"__\", \"ComponentProperty$string$2\", \"__\", \"ComponentPropertyValue\"], \"postprocess\": \n function(data, location, reject) {\n var key = data[2];\n var val = data[6];\n return [key, val];\n }\n },\n {\"name\": \"ComponentPropertyValue$subexpression$1$string$1\", \"symbols\": [{\"literal\":\"N\"}, {\"literal\":\"U\"}, {\"literal\":\"M\"}, {\"literal\":\"B\"}, {\"literal\":\"E\"}, {\"literal\":\"R\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentPropertyValue$subexpression$1\", \"symbols\": [\"ComponentPropertyValue$subexpression$1$string$1\"]},\n {\"name\": \"ComponentPropertyValue$subexpression$1$string$2\", \"symbols\": [{\"literal\":\"E\"}, {\"literal\":\"X\"}, {\"literal\":\"P\"}, {\"literal\":\"R\"}, {\"literal\":\"E\"}, {\"literal\":\"S\"}, {\"literal\":\"S\"}, {\"literal\":\"I\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentPropertyValue$subexpression$1\", \"symbols\": [\"ComponentPropertyValue$subexpression$1$string$2\"]},\n {\"name\": \"ComponentPropertyValue$subexpression$1$string$3\", \"symbols\": [{\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"R\"}, {\"literal\":\"I\"}, {\"literal\":\"N\"}, {\"literal\":\"G\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentPropertyValue$subexpression$1\", \"symbols\": [\"ComponentPropertyValue$subexpression$1$string$3\"]},\n {\"name\": \"ComponentPropertyValue$subexpression$1$string$4\", \"symbols\": [{\"literal\":\"C\"}, {\"literal\":\"O\"}, {\"literal\":\"M\"}, {\"literal\":\"P\"}, {\"literal\":\"O\"}, {\"literal\":\"N\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"T\"}, {\"literal\":\"_\"}, {\"literal\":\"W\"}, {\"literal\":\"O\"}, {\"literal\":\"R\"}, {\"literal\":\"D\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentPropertyValue$subexpression$1\", \"symbols\": [\"ComponentPropertyValue$subexpression$1$string$4\"]},\n {\"name\": \"ComponentPropertyValue$subexpression$1$string$5\", \"symbols\": [{\"literal\":\"B\"}, {\"literal\":\"O\"}, {\"literal\":\"O\"}, {\"literal\":\"L\"}, {\"literal\":\"E\"}, {\"literal\":\"A\"}, {\"literal\":\"N\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"ComponentPropertyValue$subexpression$1\", \"symbols\": [\"ComponentPropertyValue$subexpression$1$string$5\"]},\n {\"name\": \"ComponentPropertyValue\", \"symbols\": [\"ComponentPropertyValue$subexpression$1\", \"__\", \"TokenValue\"], \"postprocess\": \n function(data, location, reject) {\n var t = data[0][0];\n var val = data[2];\n if (t === 'NUMBER') {\n val = +val;\n } else if (t === 'EXPRESSION' || t === 'STRING') {\n val = val.substring(1, val.length-1);\n } else if (t === 'BOOLEAN') {\n val = (val === 'true');\n }\n \n var typeString = '';\n if (t === 'EXPRESSION') {\n typeString = 'expression';\n } else if (t === 'NUMBER' || t === 'STRING' || t === 'BOOLEAN') {\n typeString = 'value';\n } else if (t === 'COMPONENT_WORD') {\n typeString = 'variable';\n }\n return [typeString, val];\n }\n },\n {\"name\": \"TokenValue$string$1\", \"symbols\": [{\"literal\":\"T\"}, {\"literal\":\"O\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"_\"}, {\"literal\":\"V\"}, {\"literal\":\"A\"}, {\"literal\":\"L\"}, {\"literal\":\"U\"}, {\"literal\":\"E\"}, {\"literal\":\"_\"}, {\"literal\":\"S\"}, {\"literal\":\"T\"}, {\"literal\":\"A\"}, {\"literal\":\"R\"}, {\"literal\":\"T\"}], \"postprocess\": function joiner(d) {return d.join('');}},\n {\"name\": \"TokenValue$ebnf$1\", \"symbols\": []},\n {\"name\": \"TokenValue$ebnf$1\", \"symbols\": [\"TokenValue$ebnf$1\", /[^\\\"]/], \"postprocess\": function arrpush(d) {return d[0].concat([d[1]]);}},\n {\"name\": \"TokenValue$string$2\", \"symbols\": [{\"literal\":\"T\"}, {\"literal\":\"O\"}, {\"literal\":\"K\"}, {\"literal\":\"E\"}, {\"literal\":\"N\"}, {\"literal\":\"_\"}, {\"literal\":\"V\"}, {\"literal\":\"A