From ffc19614c79fd7aaa6b4fa173f02714b6a840b7e Mon Sep 17 00:00:00 2001 From: Grzegorz Ziolkowski Date: Mon, 2 Jul 2018 15:41:08 +0200 Subject: [PATCH 1/3] Packages: Create new spec-parser package --- .eslintignore | 1 + bin/create-php-parser.js | 2 +- bin/generate-public-grammar.js | 2 +- blocks/api/parser.js | 4 +- .../api/post-grammar-parser-pre-generated.js | 1597 ---------------- blocks/api/post-parser.js | 1 - blocks/api/post-parser.native.js | 1 - blocks/api/test/parser.js | 10 +- core-blocks/test/full-content.js | 2 +- package-lock.json | 26 +- package.json | 4 +- packages/spec-parser/.npmrc | 1 + packages/spec-parser/README.md | 26 + .../spec-parser/grammar.pegjs | 0 packages/spec-parser/index.js | 1600 +++++++++++++++++ packages/spec-parser/package.json | 28 + packages/spec-parser/test/index.js | 23 + test/unit/jest.config.json | 3 - test/unit/pegjs-transform.js | 16 - webpack.config.js | 4 - 20 files changed, 1690 insertions(+), 1661 deletions(-) delete mode 100644 blocks/api/post-grammar-parser-pre-generated.js delete mode 100644 blocks/api/post-parser.js delete mode 100644 blocks/api/post-parser.native.js create mode 100644 packages/spec-parser/.npmrc create mode 100644 packages/spec-parser/README.md rename blocks/api/post.pegjs => packages/spec-parser/grammar.pegjs (100%) create mode 100644 packages/spec-parser/index.js create mode 100644 packages/spec-parser/package.json create mode 100644 packages/spec-parser/test/index.js delete mode 100644 test/unit/pegjs-transform.js diff --git a/.eslintignore b/.eslintignore index a4a3d4cbd0924..169d8b3691f4a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,5 +2,6 @@ build build-module coverage node_modules +packages/spec-parser test/e2e/test-plugins vendor diff --git a/bin/create-php-parser.js b/bin/create-php-parser.js index f5cd5327fd000..595e3597466eb 100755 --- a/bin/create-php-parser.js +++ b/bin/create-php-parser.js @@ -5,7 +5,7 @@ const phpegjs = require( 'phpegjs' ); const fs = require( 'fs' ); const path = require( 'path' ); -const peg = fs.readFileSync( 'blocks/api/post.pegjs', 'utf8' ); +const peg = fs.readFileSync( 'packages/spec-parser/grammar.pegjs', 'utf8' ); const parser = pegjs.generate( peg, diff --git a/bin/generate-public-grammar.js b/bin/generate-public-grammar.js index 34b5522a6eb0a..1e6df4106caec 100755 --- a/bin/generate-public-grammar.js +++ b/bin/generate-public-grammar.js @@ -2,7 +2,7 @@ const parser = require( '../node_modules/pegjs/lib/parser.js' ); const fs = require( 'fs' ); const path = require( 'path' ); -const grammarSource = fs.readFileSync( './blocks/api/post.pegjs', 'utf8' ); +const grammarSource = fs.readFileSync( './packages/spec-parser/grammar.pegjs', 'utf8' ); const grammar = parser.parse( grammarSource ); function escape( text ) { diff --git a/blocks/api/parser.js b/blocks/api/parser.js index 4aa98b09eba43..cf75bd483f009 100644 --- a/blocks/api/parser.js +++ b/blocks/api/parser.js @@ -10,11 +10,11 @@ import { flow, castArray, mapValues, omit, stubFalse } from 'lodash'; import { autop } from '@wordpress/autop'; import { applyFilters } from '@wordpress/hooks'; import deprecated from '@wordpress/deprecated'; +import { parse as grammarParse } from '@wordpress/spec-parser'; /** * Internal dependencies */ -import { parse as grammarParse } from './post-parser'; import { getBlockType, getUnknownTypeHandlerName } from './registration'; import { createBlock } from './factory'; import { isValidBlock } from './validation'; @@ -365,7 +365,7 @@ export function createBlockWithFallback( blockNode ) { * * @return {Function} An implementation which parses the post content. */ -export const createParse = ( parseImplementation ) => +const createParse = ( parseImplementation ) => ( content ) => parseImplementation( content ).reduce( ( memo, blockNode ) => { const block = createBlockWithFallback( blockNode ); if ( block ) { diff --git a/blocks/api/post-grammar-parser-pre-generated.js b/blocks/api/post-grammar-parser-pre-generated.js deleted file mode 100644 index 44abebda2c058..0000000000000 --- a/blocks/api/post-grammar-parser-pre-generated.js +++ /dev/null @@ -1,1597 +0,0 @@ -/* eslint-disable */ -// TODO: enable eslint - -module.exports = /* - * Generated by PEG.js 0.10.0. - * - * http://pegjs.org/ - */ -(function() { - "use strict"; - - function peg$subclass(child, parent) { - function ctor() { this.constructor = child; } - ctor.prototype = parent.prototype; - child.prototype = new ctor(); - } - - function peg$SyntaxError(message, expected, found, location) { - this.message = message; - this.expected = expected; - this.found = found; - this.location = location; - this.name = "SyntaxError"; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, peg$SyntaxError); - } - } - - peg$subclass(peg$SyntaxError, Error); - - peg$SyntaxError.buildMessage = function(expected, found) { - var DESCRIBE_EXPECTATION_FNS = { - literal: function(expectation) { - return "\"" + literalEscape(expectation.text) + "\""; - }, - - "class": function(expectation) { - var escapedParts = "", - i; - - for (i = 0; i < expectation.parts.length; i++) { - escapedParts += expectation.parts[i] instanceof Array - ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) - : classEscape(expectation.parts[i]); - } - - return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; - }, - - any: function(expectation) { - return "any character"; - }, - - end: function(expectation) { - return "end of input"; - }, - - other: function(expectation) { - return expectation.description; - } - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function literalEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } - - function classEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/\]/g, '\\]') - .replace(/\^/g, '\\^') - .replace(/-/g, '\\-') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } - - function describeExpectation(expectation) { - return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); - } - - function describeExpected(expected) { - var descriptions = new Array(expected.length), - i, j; - - for (i = 0; i < expected.length; i++) { - descriptions[i] = describeExpectation(expected[i]); - } - - descriptions.sort(); - - if (descriptions.length > 0) { - for (i = 1, j = 1; i < descriptions.length; i++) { - if (descriptions[i - 1] !== descriptions[i]) { - descriptions[j] = descriptions[i]; - j++; - } - } - descriptions.length = j; - } - - switch (descriptions.length) { - case 1: - return descriptions[0]; - - case 2: - return descriptions[0] + " or " + descriptions[1]; - - default: - return descriptions.slice(0, -1).join(", ") - + ", or " - + descriptions[descriptions.length - 1]; - } - } - - function describeFound(found) { - return found ? "\"" + literalEscape(found) + "\"" : "end of input"; - } - - return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; - }; - - function peg$parse(input, options) { - options = options !== void 0 ? options : {}; - - var peg$FAILED = {}, - - peg$startRuleFunctions = { Block_List: peg$parseBlock_List }, - peg$startRuleFunction = peg$parseBlock_List, - - peg$c0 = peg$anyExpectation(), - peg$c1 = function(pre, b, html) { /** **/ return [ b, html ] }, - peg$c2 = function(pre, bs, post) { /** **/ - return joinBlocks( pre, bs, post ); - }, - peg$c3 = "", - peg$c9 = peg$literalExpectation("/-->", false), - peg$c10 = function(blockName, attrs) { - /** $blockName, - 'attrs' => $attrs, - 'innerBlocks' => array(), - 'innerHTML' => '', - ); - ?> **/ - - return { - blockName: blockName, - attrs: attrs, - innerBlocks: [], - innerHTML: '' - }; - }, - peg$c11 = function(s, children, e) { - /** $s['blockName'], - 'attrs' => $s['attrs'], - 'innerBlocks' => $innerBlocks, - 'innerHTML' => implode( '', $innerHTML ), - ); - ?> **/ - - var innerContent = partition( function( a ) { return 'string' === typeof a }, children ); - var innerHTML = innerContent[ 0 ]; - var innerBlocks = innerContent[ 1 ]; - - return { - blockName: s.blockName, - attrs: s.attrs, - innerBlocks: innerBlocks, - innerHTML: innerHTML.join( '' ) - }; - }, - peg$c12 = "-->", - peg$c13 = peg$literalExpectation("-->", false), - peg$c14 = function(blockName, attrs) { - /** $blockName, - 'attrs' => $attrs, - ); - ?> **/ - - return { - blockName: blockName, - attrs: attrs - }; - }, - peg$c15 = "/wp:", - peg$c16 = peg$literalExpectation("/wp:", false), - peg$c17 = function(blockName) { - /** $blockName, - ); - ?> **/ - - return { - blockName: blockName - }; - }, - peg$c18 = "/", - peg$c19 = peg$literalExpectation("/", false), - peg$c20 = function(type) { - /** **/ - return 'core/' + type; - }, - peg$c21 = /^[a-z]/, - peg$c22 = peg$classExpectation([["a", "z"]], false, false), - peg$c23 = /^[a-z0-9_\-]/, - peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "-"], false, false), - peg$c25 = "{", - peg$c26 = peg$literalExpectation("{", false), - peg$c27 = "}", - peg$c28 = peg$literalExpectation("}", false), - peg$c29 = "", - peg$c30 = function(attrs) { - /** **/ - return maybeJSON( attrs ); - }, - peg$c31 = /^[ \t\r\n]/, - peg$c32 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false), - - peg$currPos = 0, - peg$savedPos = 0, - peg$posDetailsCache = [{ line: 1, column: 1 }], - peg$maxFailPos = 0, - peg$maxFailExpected = [], - peg$silentFails = 0, - - peg$result; - - if ("startRule" in options) { - if (!(options.startRule in peg$startRuleFunctions)) { - throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); - } - - peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; - } - - function text() { - return input.substring(peg$savedPos, peg$currPos); - } - - function location() { - return peg$computeLocation(peg$savedPos, peg$currPos); - } - - function expected(description, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - - throw peg$buildStructuredError( - [peg$otherExpectation(description)], - input.substring(peg$savedPos, peg$currPos), - location - ); - } - - function error(message, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - - throw peg$buildSimpleError(message, location); - } - - function peg$literalExpectation(text, ignoreCase) { - return { type: "literal", text: text, ignoreCase: ignoreCase }; - } - - function peg$classExpectation(parts, inverted, ignoreCase) { - return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; - } - - function peg$anyExpectation() { - return { type: "any" }; - } - - function peg$endExpectation() { - return { type: "end" }; - } - - function peg$otherExpectation(description) { - return { type: "other", description: description }; - } - - function peg$computePosDetails(pos) { - var details = peg$posDetailsCache[pos], p; - - if (details) { - return details; - } else { - p = pos - 1; - while (!peg$posDetailsCache[p]) { - p--; - } - - details = peg$posDetailsCache[p]; - details = { - line: details.line, - column: details.column - }; - - while (p < pos) { - if (input.charCodeAt(p) === 10) { - details.line++; - details.column = 1; - } else { - details.column++; - } - - p++; - } - - peg$posDetailsCache[pos] = details; - return details; - } - } - - function peg$computeLocation(startPos, endPos) { - var startPosDetails = peg$computePosDetails(startPos), - endPosDetails = peg$computePosDetails(endPos); - - return { - start: { - offset: startPos, - line: startPosDetails.line, - column: startPosDetails.column - }, - end: { - offset: endPos, - line: endPosDetails.line, - column: endPosDetails.column - } - }; - } - - function peg$fail(expected) { - if (peg$currPos < peg$maxFailPos) { return; } - - if (peg$currPos > peg$maxFailPos) { - peg$maxFailPos = peg$currPos; - peg$maxFailExpected = []; - } - - peg$maxFailExpected.push(expected); - } - - function peg$buildSimpleError(message, location) { - return new peg$SyntaxError(message, null, null, location); - } - - function peg$buildStructuredError(expected, found, location) { - return new peg$SyntaxError( - peg$SyntaxError.buildMessage(expected, found), - expected, - found, - location - ); - } - - function peg$parseBlock_List() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; - - s0 = peg$currPos; - s1 = peg$currPos; - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$silentFails++; - s5 = peg$parseBlock(); - peg$silentFails--; - if (s5 === peg$FAILED) { - s4 = void 0; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$currPos; - peg$silentFails++; - s5 = peg$parseBlock(); - peg$silentFails--; - if (s5 === peg$FAILED) { - s4 = void 0; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parseBlock(); - if (s4 !== peg$FAILED) { - s5 = peg$currPos; - s6 = []; - s7 = peg$currPos; - s8 = peg$currPos; - peg$silentFails++; - s9 = peg$parseBlock(); - peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; - } else { - peg$currPos = s8; - s8 = peg$FAILED; - } - if (s8 !== peg$FAILED) { - if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s9 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - while (s7 !== peg$FAILED) { - s6.push(s7); - s7 = peg$currPos; - s8 = peg$currPos; - peg$silentFails++; - s9 = peg$parseBlock(); - peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; - } else { - peg$currPos = s8; - s8 = peg$FAILED; - } - if (s8 !== peg$FAILED) { - if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s9 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } - if (s6 !== peg$FAILED) { - s5 = input.substring(s5, peg$currPos); - } else { - s5 = s6; - } - if (s5 !== peg$FAILED) { - peg$savedPos = s3; - s4 = peg$c1(s1, s4, s5); - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$parseBlock(); - if (s4 !== peg$FAILED) { - s5 = peg$currPos; - s6 = []; - s7 = peg$currPos; - s8 = peg$currPos; - peg$silentFails++; - s9 = peg$parseBlock(); - peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; - } else { - peg$currPos = s8; - s8 = peg$FAILED; - } - if (s8 !== peg$FAILED) { - if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s9 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - while (s7 !== peg$FAILED) { - s6.push(s7); - s7 = peg$currPos; - s8 = peg$currPos; - peg$silentFails++; - s9 = peg$parseBlock(); - peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; - } else { - peg$currPos = s8; - s8 = peg$FAILED; - } - if (s8 !== peg$FAILED) { - if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s9 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } - if (s6 !== peg$FAILED) { - s5 = input.substring(s5, peg$currPos); - } else { - s5 = s6; - } - if (s5 !== peg$FAILED) { - peg$savedPos = s3; - s4 = peg$c1(s1, s4, s5); - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - if (s2 !== peg$FAILED) { - s3 = peg$currPos; - s4 = []; - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - while (s5 !== peg$FAILED) { - s4.push(s5); - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - } - if (s4 !== peg$FAILED) { - s3 = input.substring(s3, peg$currPos); - } else { - s3 = s4; - } - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c2(s1, s2, s3); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseBlock() { - var s0; - - s0 = peg$parseBlock_Void(); - if (s0 === peg$FAILED) { - s0 = peg$parseBlock_Balanced(); - } - - return s0; - } - - function peg$parseBlock_Void() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8; - - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c5) { - s3 = peg$c5; - peg$currPos += 3; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c6); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - s6 = peg$currPos; - s7 = peg$parseBlock_Attributes(); - if (s7 !== peg$FAILED) { - s8 = peg$parse__(); - if (s8 !== peg$FAILED) { - peg$savedPos = s6; - s7 = peg$c7(s4, s7); - s6 = s7; - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 === peg$FAILED) { - s6 = null; - } - if (s6 !== peg$FAILED) { - if (input.substr(peg$currPos, 4) === peg$c8) { - s7 = peg$c8; - peg$currPos += 4; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c9); } - } - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c10(s4, s6); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseBlock_Balanced() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - s1 = peg$parseBlock_Start(); - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseBlock(); - if (s3 === peg$FAILED) { - s3 = peg$currPos; - s4 = peg$currPos; - s5 = peg$currPos; - peg$silentFails++; - s6 = peg$parseBlock_End(); - peg$silentFails--; - if (s6 === peg$FAILED) { - s5 = void 0; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - if (s5 !== peg$FAILED) { - if (input.length > peg$currPos) { - s6 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - s3 = input.substring(s3, peg$currPos); - } else { - s3 = s4; - } - } - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseBlock(); - if (s3 === peg$FAILED) { - s3 = peg$currPos; - s4 = peg$currPos; - s5 = peg$currPos; - peg$silentFails++; - s6 = peg$parseBlock_End(); - peg$silentFails--; - if (s6 === peg$FAILED) { - s5 = void 0; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - if (s5 !== peg$FAILED) { - if (input.length > peg$currPos) { - s6 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - s3 = input.substring(s3, peg$currPos); - } else { - s3 = s4; - } - } - } - if (s2 !== peg$FAILED) { - s3 = peg$parseBlock_End(); - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c11(s1, s2, s3); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseBlock_Start() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8; - - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c5) { - s3 = peg$c5; - peg$currPos += 3; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c6); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - s6 = peg$currPos; - s7 = peg$parseBlock_Attributes(); - if (s7 !== peg$FAILED) { - s8 = peg$parse__(); - if (s8 !== peg$FAILED) { - peg$savedPos = s6; - s7 = peg$c7(s4, s7); - s6 = s7; - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 === peg$FAILED) { - s6 = null; - } - if (s6 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s7 = peg$c12; - peg$currPos += 3; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c14(s4, s6); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseBlock_End() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 4) === peg$c15) { - s3 = peg$c15; - peg$currPos += 4; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c16); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s6 = peg$c12; - peg$currPos += 3; - } else { - s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s6 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c17(s4); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseBlock_Name() { - var s0; - - s0 = peg$parseNamespaced_Block_Name(); - if (s0 === peg$FAILED) { - s0 = peg$parseCore_Block_Name(); - } - - return s0; - } - - function peg$parseNamespaced_Block_Name() { - var s0, s1, s2, s3, s4; - - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$parseBlock_Name_Part(); - if (s2 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 47) { - s3 = peg$c18; - peg$currPos++; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name_Part(); - if (s4 !== peg$FAILED) { - s2 = [s2, s3, s4]; - s1 = s2; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - if (s1 !== peg$FAILED) { - s0 = input.substring(s0, peg$currPos); - } else { - s0 = s1; - } - - return s0; - } - - function peg$parseCore_Block_Name() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$parseBlock_Name_Part(); - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c20(s1); - } - s0 = s1; - - return s0; - } - - function peg$parseBlock_Name_Part() { - var s0, s1, s2, s3, s4; - - s0 = peg$currPos; - s1 = peg$currPos; - if (peg$c21.test(input.charAt(peg$currPos))) { - s2 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c22); } - } - if (s2 !== peg$FAILED) { - s3 = []; - if (peg$c23.test(input.charAt(peg$currPos))) { - s4 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c24); } - } - while (s4 !== peg$FAILED) { - s3.push(s4); - if (peg$c23.test(input.charAt(peg$currPos))) { - s4 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c24); } - } - } - if (s3 !== peg$FAILED) { - s2 = [s2, s3]; - s1 = s2; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - if (s1 !== peg$FAILED) { - s0 = input.substring(s0, peg$currPos); - } else { - s0 = s1; - } - - return s0; - } - - function peg$parseBlock_Attributes() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12; - - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c25; - peg$currPos++; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c26); } - } - if (s3 !== peg$FAILED) { - s4 = []; - s5 = peg$currPos; - s6 = peg$currPos; - peg$silentFails++; - s7 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 125) { - s8 = peg$c27; - peg$currPos++; - } else { - s8 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c28); } - } - if (s8 !== peg$FAILED) { - s9 = peg$parse__(); - if (s9 !== peg$FAILED) { - s10 = peg$c29; - if (s10 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 47) { - s11 = peg$c18; - peg$currPos++; - } else { - s11 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } - } - if (s11 === peg$FAILED) { - s11 = null; - } - if (s11 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s12 = peg$c12; - peg$currPos += 3; - } else { - s12 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s12 !== peg$FAILED) { - s8 = [s8, s9, s10, s11, s12]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - peg$silentFails--; - if (s7 === peg$FAILED) { - s6 = void 0; - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 !== peg$FAILED) { - if (input.length > peg$currPos) { - s7 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s7 !== peg$FAILED) { - s6 = [s6, s7]; - s5 = s6; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - while (s5 !== peg$FAILED) { - s4.push(s5); - s5 = peg$currPos; - s6 = peg$currPos; - peg$silentFails++; - s7 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 125) { - s8 = peg$c27; - peg$currPos++; - } else { - s8 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c28); } - } - if (s8 !== peg$FAILED) { - s9 = peg$parse__(); - if (s9 !== peg$FAILED) { - s10 = peg$c29; - if (s10 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 47) { - s11 = peg$c18; - peg$currPos++; - } else { - s11 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } - } - if (s11 === peg$FAILED) { - s11 = null; - } - if (s11 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s12 = peg$c12; - peg$currPos += 3; - } else { - s12 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s12 !== peg$FAILED) { - s8 = [s8, s9, s10, s11, s12]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - peg$silentFails--; - if (s7 === peg$FAILED) { - s6 = void 0; - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 !== peg$FAILED) { - if (input.length > peg$currPos) { - s7 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s7 !== peg$FAILED) { - s6 = [s6, s7]; - s5 = s6; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - } - if (s4 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c27; - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c28); } - } - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c30(s1); - } - s0 = s1; - - return s0; - } - - function peg$parse__() { - var s0, s1; - - s0 = []; - if (peg$c31.test(input.charAt(peg$currPos))) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c32); } - } - if (s1 !== peg$FAILED) { - while (s1 !== peg$FAILED) { - s0.push(s1); - if (peg$c31.test(input.charAt(peg$currPos))) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c32); } - } - } - } else { - s0 = peg$FAILED; - } - - return s0; - } - - - - /* - * - * _____ _ _ - * / ____| | | | | - * | | __ _ _| |_ ___ _ __ | |__ ___ _ __ __ _ - * | | |_ | | | | __/ _ \ '_ \| '_ \ / _ \ '__/ _` | - * | |__| | |_| | || __/ | | | |_) | __/ | | (_| | - * \_____|\__,_|\__\___|_| |_|_.__/ \___|_| \__, | - * __/ | - * GRAMMAR |___/ - * - * - * Welcome to the grammar file for Gutenberg posts! - * - * Please don't be distracted by the functions at the top - * here - they're just helpers for the grammar below. We - * try to keep them as minimal and simple as possible, - * but the parser generator forces us to declare them at - * the beginning of the file. - * - * What follows is the official specification grammar for - * documents created or edited in Gutenberg. It starts at - * the top-level rule `Block_List` - * - * The grammar is defined by a series of _rules_ and ways - * to return matches on those rules. It's a _PEG_, a - * parsing expression grammar, which simply means that for - * each of our rules we have a set of sub-rules to match - * on and the generated parser will try them in order - * until it finds the first match. - * - * This grammar is a _specification_ (with as little actual - * code as we can get away with) which is used by the - * parser generator to generate the actual _parser_ which - * is used by Gutenberg. We generate two parsers: one in - * JavaScript for use the browser and one in PHP for - * WordPress itself. PEG parser generators are available - * in many languages, though different libraries may require - * some translation of this grammar into their syntax. - * - * For more information: - * @see https://pegjs.org - * @see https://en.wikipedia.org/wiki/Parsing_expression_grammar - * - */ - - /** array(), 'innerHTML' => $pre ); - } - - foreach ( $tokens as $token ) { - list( $token, $html ) = $token; - - $blocks[] = $token; - - if ( ! empty( $html ) ) { - $blocks[] = array( 'attrs' => array(), 'innerHTML' => $html ); - } - } - - if ( ! empty( $post ) ) { - $blocks[] = array( 'attrs' => array(), 'innerHTML' => $post ); - } - - return $blocks; - } - } - - ?> **/ - - function freeform( s ) { - return s.length && { - attrs: {}, - innerHTML: s - }; - } - - function joinBlocks( pre, tokens, post ) { - var blocks = [], i, l, html, item, token; - - if ( pre.length ) { - blocks.push( freeform( pre ) ); - } - - for ( i = 0, l = tokens.length; i < l; i++ ) { - item = tokens[ i ]; - token = item[ 0 ]; - html = item[ 1 ]; - - blocks.push( token ); - if ( html.length ) { - blocks.push( freeform( html ) ); - } - } - - if ( post.length ) { - blocks.push( freeform( post ) ); - } - - return blocks; - } - - function maybeJSON( s ) { - try { - return JSON.parse( s ); - } catch (e) { - return null; - } - } - - function partition( predicate, list ) { - var i, l, item; - var truthy = []; - var falsey = []; - - // nod to performance over a simpler reduce - // and clone model we could have taken here - for ( i = 0, l = list.length; i < l; i++ ) { - item = list[ i ]; - - predicate( item ) - ? truthy.push( item ) - : falsey.push( item ) - }; - - return [ truthy, falsey ]; - } - - - - peg$result = peg$startRuleFunction(); - - if (peg$result !== peg$FAILED && peg$currPos === input.length) { - return peg$result; - } else { - if (peg$result !== peg$FAILED && peg$currPos < input.length) { - peg$fail(peg$endExpectation()); - } - - throw peg$buildStructuredError( - peg$maxFailExpected, - peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, - peg$maxFailPos < input.length - ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) - : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) - ); - } - } - - return { - SyntaxError: peg$SyntaxError, - parse: peg$parse - }; -})(); \ No newline at end of file diff --git a/blocks/api/post-parser.js b/blocks/api/post-parser.js deleted file mode 100644 index 80f5a105d53e7..0000000000000 --- a/blocks/api/post-parser.js +++ /dev/null @@ -1 +0,0 @@ -export * from './post.pegjs'; diff --git a/blocks/api/post-parser.native.js b/blocks/api/post-parser.native.js deleted file mode 100644 index 7adb6bd3ce0ad..0000000000000 --- a/blocks/api/post-parser.native.js +++ /dev/null @@ -1 +0,0 @@ -export * from './post-grammar-parser-pre-generated'; diff --git a/blocks/api/test/parser.js b/blocks/api/test/parser.js index a9b4b2ce4800c..99d8d6e5a9293 100644 --- a/blocks/api/test/parser.js +++ b/blocks/api/test/parser.js @@ -16,9 +16,7 @@ import { default as parsePegjs, parseWithAttributeSchema, toBooleanAttributeMatcher, - createParse, } from '../parser'; -import { parse as grammarParsePreGenerated } from '../post-grammar-parser-pre-generated'; import { registerBlockType, unregisterBlockType, @@ -549,17 +547,11 @@ describe( 'block parser', () => { } ); } ); - describe( 'parse() of pegjs parser', () => { + describe( 'parse() of @wordpress/spec-parser', () => { // run the test cases using the PegJS defined parser testCases( parsePegjs ); } ); - describe( 'parse() of pre-generated parser', () => { - // run the test cases using the pre-generated parser - const parsePreGenerated = createParse( grammarParsePreGenerated ); - testCases( parsePreGenerated ); - } ); - // encapsulate the test cases so we can run them multiple time but with a different parse() function function testCases( parse ) { it( 'should parse the post content, including block attributes', () => { diff --git a/core-blocks/test/full-content.js b/core-blocks/test/full-content.js index afa71247575ad..7f4b5e6c27cf0 100644 --- a/core-blocks/test/full-content.js +++ b/core-blocks/test/full-content.js @@ -10,12 +10,12 @@ import { format } from 'util'; * WordPress dependencies */ import { getBlockTypes, parse, serialize } from '@wordpress/blocks'; +import { parse as grammarParse } from '@wordpress/spec-parser'; /** * Internal dependencies */ import { registerCoreBlocks } from '../'; -import { parse as grammarParse } from '../../blocks/api/post.pegjs'; const fixturesDir = path.join( __dirname, 'fixtures' ); diff --git a/package-lock.json b/package-lock.json index a65035568ca77..72e19337c4ce7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3582,6 +3582,9 @@ "lodash": "^4.17.10" } }, + "@wordpress/spec-parser": { + "version": "file:packages/spec-parser" + }, "@wordpress/url": { "version": "file:packages/url" }, @@ -15411,29 +15414,6 @@ "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", "dev": true }, - "pegjs-loader": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/pegjs-loader/-/pegjs-loader-0.5.4.tgz", - "integrity": "sha512-ViH8WwUkc/N8H59zuarORrgCi7uxn+gDIq+Ydriw1GFJi/oUg2xvhsgDDujO6dAxRsxXMgqWESx6TKYIqHorqA==", - "dev": true, - "requires": { - "loader-utils": "^0.2.5" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", diff --git a/package.json b/package.json index 07fa9c52fa721..278e97a9ce7ec 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/plugins": "file:packages/plugins", "@wordpress/shortcode": "file:packages/shortcode", + "@wordpress/spec-parser": "file:packages/spec-parser", "@wordpress/url": "file:packages/url", "@wordpress/viewport": "file:packages/viewport", "@wordpress/wordcount": "file:packages/wordcount", @@ -105,7 +106,6 @@ "node-sass": "4.9.2", "path-type": "3.0.0", "pegjs": "0.10.0", - "pegjs-loader": "0.5.4", "phpegjs": "1.0.0-beta7", "postcss-color-function": "4.0.1", "postcss-loader": "2.1.3", @@ -145,7 +145,7 @@ "scripts": { "prebuild": "npm run check-engines", "clean:packages": "rimraf ./packages/*/build ./packages/*/build-module ./packages/*/build-style", - "prebuild:packages": "npm run clean:packages && cross-env INCLUDE_PACKAGES=babel-plugin-import-jsx-pragma,postcss-themes SKIP_JSX_PRAGMA_TRANSFORM=1 node ./bin/packages/build.js", + "prebuild:packages": "npm run clean:packages && lerna run build && cross-env INCLUDE_PACKAGES=babel-plugin-import-jsx-pragma,postcss-themes SKIP_JSX_PRAGMA_TRANSFORM=1 node ./bin/packages/build.js", "build:packages": "cross-env EXCLUDE_PACKAGES=babel-plugin-import-jsx-pragma,postcss-themes node ./bin/packages/build.js", "build": "npm run build:packages && cross-env NODE_ENV=production webpack", "check-engines": "check-node-version --package", diff --git a/packages/spec-parser/.npmrc b/packages/spec-parser/.npmrc new file mode 100644 index 0000000000000..43c97e719a5a8 --- /dev/null +++ b/packages/spec-parser/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/packages/spec-parser/README.md b/packages/spec-parser/README.md new file mode 100644 index 0000000000000..014f89c7575cb --- /dev/null +++ b/packages/spec-parser/README.md @@ -0,0 +1,26 @@ +# @wordpress/spec-parser + +This library contains the grammar file (`grammar.pegjs`) for WordPress posts which is a _specification_ which is used to generate the actual _parser_ which is also bundled in this package. + +PEG parser generators are available in many languages, though different libraries may require some translation of this grammar into their syntax. For more information see: +* https://pegjs.org +* https://en.wikipedia.org/wiki/Parsing_expression_grammar + +## Installation + +Install the module + +```bash +npm install @wordpress/spec-parser --save +``` + +## Usage + +```js +import { parse } from '@wordpress/spec-parser'; + +parse( '' ); +// [{"attrs": null, "blockName": "core/more", "innerBlocks": [], "innerHTML": ""}] +``` + +

Code is Poetry.

diff --git a/blocks/api/post.pegjs b/packages/spec-parser/grammar.pegjs similarity index 100% rename from blocks/api/post.pegjs rename to packages/spec-parser/grammar.pegjs diff --git a/packages/spec-parser/index.js b/packages/spec-parser/index.js new file mode 100644 index 0000000000000..6df34dd8169da --- /dev/null +++ b/packages/spec-parser/index.js @@ -0,0 +1,1600 @@ +/* + * Generated by PEG.js 0.10.0. + * + * http://pegjs.org/ + */ + +"use strict"; + +function peg$subclass(child, parent) { + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); +} + +function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } +} + +peg$subclass(peg$SyntaxError, Error); + +peg$SyntaxError.buildMessage = function(expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + + "class": function(expectation) { + var escapedParts = "", + i; + + for (i = 0; i < expectation.parts.length; i++) { + escapedParts += expectation.parts[i] instanceof Array + ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) + : classEscape(expectation.parts[i]); + } + + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + + any: function(expectation) { + return "any character"; + }, + + end: function(expectation) { + return "end of input"; + }, + + other: function(expectation) { + return expectation.description; + } + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function literalEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } + + function classEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/\]/g, '\\]') + .replace(/\^/g, '\\^') + .replace(/-/g, '\\-') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } + + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + + function describeExpected(expected) { + var descriptions = new Array(expected.length), + i, j; + + for (i = 0; i < expected.length; i++) { + descriptions[i] = describeExpectation(expected[i]); + } + + descriptions.sort(); + + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + descriptions.length = j; + } + + switch (descriptions.length) { + case 1: + return descriptions[0]; + + case 2: + return descriptions[0] + " or " + descriptions[1]; + + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } + } + + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; +}; + +function peg$parse(input, options) { + options = options !== void 0 ? options : {}; + + var peg$FAILED = {}, + + peg$startRuleFunctions = { Block_List: peg$parseBlock_List }, + peg$startRuleFunction = peg$parseBlock_List, + + peg$c0 = peg$anyExpectation(), + peg$c1 = function(pre, b, html) { /** **/ return [ b, html ] }, + peg$c2 = function(pre, bs, post) { /** **/ + return joinBlocks( pre, bs, post ); + }, + peg$c3 = "", + peg$c9 = peg$literalExpectation("/-->", false), + peg$c10 = function(blockName, attrs) { + /** $blockName, + 'attrs' => $attrs, + 'innerBlocks' => array(), + 'innerHTML' => '', + ); + ?> **/ + + return { + blockName: blockName, + attrs: attrs, + innerBlocks: [], + innerHTML: '' + }; + }, + peg$c11 = function(s, children, e) { + /** $s['blockName'], + 'attrs' => $s['attrs'], + 'innerBlocks' => $innerBlocks, + 'innerHTML' => implode( '', $innerHTML ), + ); + ?> **/ + + var innerContent = partition( function( a ) { return 'string' === typeof a }, children ); + var innerHTML = innerContent[ 0 ]; + var innerBlocks = innerContent[ 1 ]; + + return { + blockName: s.blockName, + attrs: s.attrs, + innerBlocks: innerBlocks, + innerHTML: innerHTML.join( '' ) + }; + }, + peg$c12 = "-->", + peg$c13 = peg$literalExpectation("-->", false), + peg$c14 = function(blockName, attrs) { + /** $blockName, + 'attrs' => $attrs, + ); + ?> **/ + + return { + blockName: blockName, + attrs: attrs + }; + }, + peg$c15 = "/wp:", + peg$c16 = peg$literalExpectation("/wp:", false), + peg$c17 = function(blockName) { + /** $blockName, + ); + ?> **/ + + return { + blockName: blockName + }; + }, + peg$c18 = "/", + peg$c19 = peg$literalExpectation("/", false), + peg$c20 = function(type) { + /** **/ + return 'core/' + type; + }, + peg$c21 = /^[a-z]/, + peg$c22 = peg$classExpectation([["a", "z"]], false, false), + peg$c23 = /^[a-z0-9_\-]/, + peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "-"], false, false), + peg$c25 = peg$otherExpectation("JSON-encoded attributes embedded in a block's opening comment"), + peg$c26 = "{", + peg$c27 = peg$literalExpectation("{", false), + peg$c28 = "}", + peg$c29 = peg$literalExpectation("}", false), + peg$c30 = "", + peg$c31 = function(attrs) { + /** **/ + return maybeJSON( attrs ); + }, + peg$c32 = /^[ \t\r\n]/, + peg$c33 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false), + + peg$currPos = 0, + peg$savedPos = 0, + peg$posDetailsCache = [{ line: 1, column: 1 }], + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, + + peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function expected(description, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + + throw peg$buildStructuredError( + [peg$otherExpectation(description)], + input.substring(peg$savedPos, peg$currPos), + location + ); + } + + function error(message, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + + throw peg$buildSimpleError(message, location); + } + + function peg$literalExpectation(text, ignoreCase) { + return { type: "literal", text: text, ignoreCase: ignoreCase }; + } + + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; + } + + function peg$anyExpectation() { + return { type: "any" }; + } + + function peg$endExpectation() { + return { type: "end" }; + } + + function peg$otherExpectation(description) { + return { type: "other", description: description }; + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], p; + + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), + endPosDetails = peg$computePosDetails(endPos); + + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { return; } + + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + + peg$maxFailExpected.push(expected); + } + + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError( + peg$SyntaxError.buildMessage(expected, found), + expected, + found, + location + ); + } + + function peg$parseBlock_List() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + s5 = peg$parseBlock(); + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + if (input.length > peg$currPos) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + s5 = peg$parseBlock(); + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + if (input.length > peg$currPos) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parseBlock(); + if (s4 !== peg$FAILED) { + s5 = peg$currPos; + s6 = []; + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } + if (s6 !== peg$FAILED) { + s5 = input.substring(s5, peg$currPos); + } else { + s5 = s6; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c1(s1, s4, s5); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parseBlock(); + if (s4 !== peg$FAILED) { + s5 = peg$currPos; + s6 = []; + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } + if (s6 !== peg$FAILED) { + s5 = input.substring(s5, peg$currPos); + } else { + s5 = s6; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c1(s1, s4, s5); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = []; + if (input.length > peg$currPos) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + while (s5 !== peg$FAILED) { + s4.push(s5); + if (input.length > peg$currPos) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c2(s1, s2, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBlock() { + var s0; + + s0 = peg$parseBlock_Void(); + if (s0 === peg$FAILED) { + s0 = peg$parseBlock_Balanced(); + } + + return s0; + } + + function peg$parseBlock_Void() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c5) { + s3 = peg$c5; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseBlock_Attributes(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + peg$savedPos = s6; + s7 = peg$c7(s4, s7); + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 4) === peg$c8) { + s7 = peg$c8; + peg$currPos += 4; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c9); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c10(s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBlock_Balanced() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parseBlock_Start(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseBlock(); + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$currPos; + s5 = peg$currPos; + peg$silentFails++; + s6 = peg$parseBlock_End(); + peg$silentFails--; + if (s6 === peg$FAILED) { + s5 = void 0; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + if (input.length > peg$currPos) { + s6 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseBlock(); + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$currPos; + s5 = peg$currPos; + peg$silentFails++; + s6 = peg$parseBlock_End(); + peg$silentFails--; + if (s6 === peg$FAILED) { + s5 = void 0; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + if (input.length > peg$currPos) { + s6 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + } + } + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock_End(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c11(s1, s2, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBlock_Start() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c5) { + s3 = peg$c5; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseBlock_Attributes(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + peg$savedPos = s6; + s7 = peg$c7(s4, s7); + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s7 = peg$c12; + peg$currPos += 3; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c14(s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBlock_End() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 4) === peg$c15) { + s3 = peg$c15; + peg$currPos += 4; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c16); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s6 = peg$c12; + peg$currPos += 3; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c17(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBlock_Name() { + var s0; + + s0 = peg$parseNamespaced_Block_Name(); + if (s0 === peg$FAILED) { + s0 = peg$parseCore_Block_Name(); + } + + return s0; + } + + function peg$parseNamespaced_Block_Name() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseBlock_Name_Part(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s3 = peg$c18; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name_Part(); + if (s4 !== peg$FAILED) { + s2 = [s2, s3, s4]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; + } + + function peg$parseCore_Block_Name() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseBlock_Name_Part(); + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c20(s1); + } + s0 = s1; + + return s0; + } + + function peg$parseBlock_Name_Part() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (peg$c21.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c22); } + } + if (s2 !== peg$FAILED) { + s3 = []; + if (peg$c23.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c24); } + } + while (s4 !== peg$FAILED) { + s3.push(s4); + if (peg$c23.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c24); } + } + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; + } + + function peg$parseBlock_Attributes() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c26; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c27); } + } + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$currPos; + s6 = peg$currPos; + peg$silentFails++; + s7 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 125) { + s8 = peg$c28; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c29); } + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s10 = peg$c30; + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s11 = peg$c18; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s11 === peg$FAILED) { + s11 = null; + } + if (s11 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s12 = peg$c12; + peg$currPos += 3; + } else { + s12 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s12 !== peg$FAILED) { + s8 = [s8, s9, s10, s11, s12]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + peg$silentFails--; + if (s7 === peg$FAILED) { + s6 = void 0; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + if (input.length > peg$currPos) { + s7 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$currPos; + s6 = peg$currPos; + peg$silentFails++; + s7 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 125) { + s8 = peg$c28; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c29); } + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s10 = peg$c30; + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s11 = peg$c18; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s11 === peg$FAILED) { + s11 = null; + } + if (s11 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s12 = peg$c12; + peg$currPos += 3; + } else { + s12 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s12 !== peg$FAILED) { + s8 = [s8, s9, s10, s11, s12]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + peg$silentFails--; + if (s7 === peg$FAILED) { + s6 = void 0; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + if (input.length > peg$currPos) { + s7 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c28; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c29); } + } + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c31(s1); + } + s0 = s1; + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c25); } + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + s0 = []; + if (peg$c32.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c33); } + } + if (s1 !== peg$FAILED) { + while (s1 !== peg$FAILED) { + s0.push(s1); + if (peg$c32.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c33); } + } + } + } else { + s0 = peg$FAILED; + } + + return s0; + } + + + + /* + * + * _____ _ _ + * / ____| | | | | + * | | __ _ _| |_ ___ _ __ | |__ ___ _ __ __ _ + * | | |_ | | | | __/ _ \ '_ \| '_ \ / _ \ '__/ _` | + * | |__| | |_| | || __/ | | | |_) | __/ | | (_| | + * \_____|\__,_|\__\___|_| |_|_.__/ \___|_| \__, | + * __/ | + * GRAMMAR |___/ + * + * + * Welcome to the grammar file for Gutenberg posts! + * + * Please don't be distracted by the functions at the top + * here - they're just helpers for the grammar below. We + * try to keep them as minimal and simple as possible, + * but the parser generator forces us to declare them at + * the beginning of the file. + * + * What follows is the official specification grammar for + * documents created or edited in Gutenberg. It starts at + * the top-level rule `Block_List` + * + * The grammar is defined by a series of _rules_ and ways + * to return matches on those rules. It's a _PEG_, a + * parsing expression grammar, which simply means that for + * each of our rules we have a set of sub-rules to match + * on and the generated parser will try them in order + * until it finds the first match. + * + * This grammar is a _specification_ (with as little actual + * code as we can get away with) which is used by the + * parser generator to generate the actual _parser_ which + * is used by Gutenberg. We generate two parsers: one in + * JavaScript for use the browser and one in PHP for + * WordPress itself. PEG parser generators are available + * in many languages, though different libraries may require + * some translation of this grammar into their syntax. + * + * For more information: + * @see https://pegjs.org + * @see https://en.wikipedia.org/wiki/Parsing_expression_grammar + * + */ + + /** array(), 'innerHTML' => $pre ); + } + + foreach ( $tokens as $token ) { + list( $token, $html ) = $token; + + $blocks[] = $token; + + if ( ! empty( $html ) ) { + $blocks[] = array( 'attrs' => array(), 'innerHTML' => $html ); + } + } + + if ( ! empty( $post ) ) { + $blocks[] = array( 'attrs' => array(), 'innerHTML' => $post ); + } + + return $blocks; + } + } + + ?> **/ + + function freeform( s ) { + return s.length && { + attrs: {}, + innerHTML: s + }; + } + + function joinBlocks( pre, tokens, post ) { + var blocks = [], i, l, html, item, token; + + if ( pre.length ) { + blocks.push( freeform( pre ) ); + } + + for ( i = 0, l = tokens.length; i < l; i++ ) { + item = tokens[ i ]; + token = item[ 0 ]; + html = item[ 1 ]; + + blocks.push( token ); + if ( html.length ) { + blocks.push( freeform( html ) ); + } + } + + if ( post.length ) { + blocks.push( freeform( post ) ); + } + + return blocks; + } + + function maybeJSON( s ) { + try { + return JSON.parse( s ); + } catch (e) { + return null; + } + } + + function partition( predicate, list ) { + var i, l, item; + var truthy = []; + var falsey = []; + + // nod to performance over a simpler reduce + // and clone model we could have taken here + for ( i = 0, l = list.length; i < l; i++ ) { + item = list[ i ]; + + predicate( item ) + ? truthy.push( item ) + : falsey.push( item ) + }; + + return [ truthy, falsey ]; + } + + + + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + + throw peg$buildStructuredError( + peg$maxFailExpected, + peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, + peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) + ); + } +} + +module.exports = { + SyntaxError: peg$SyntaxError, + parse: peg$parse +}; diff --git a/packages/spec-parser/package.json b/packages/spec-parser/package.json new file mode 100644 index 0000000000000..5d4badf195db4 --- /dev/null +++ b/packages/spec-parser/package.json @@ -0,0 +1,28 @@ +{ + "name": "@wordpress/spec-parser", + "version": "1.0.0-alpha.1", + "description": "Parser for WordPress posts", + "author": "The WordPress Contributors", + "license": "GPL-2.0-or-later", + "keywords": [ + "wordpress", + "parser" + ], + "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/spec-parser/README.md", + "repository": { + "type": "git", + "url": "https://github.com/WordPress/gutenberg.git" + }, + "bugs": { + "url": "https://github.com/WordPress/gutenberg/issues" + }, + "devDependencies": { + "pegjs": "0.10.0" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "pegjs -o ./index.js ./grammar.pegjs" + } +} diff --git a/packages/spec-parser/test/index.js b/packages/spec-parser/test/index.js new file mode 100644 index 0000000000000..5d79f3b88a403 --- /dev/null +++ b/packages/spec-parser/test/index.js @@ -0,0 +1,23 @@ +/** + * Internal dependencies + */ +import { parse } from "../"; + +describe("spec-parser", () => { + test("parse() works properly", () => { + const result = parse( + "" + ); + + expect(result).toMatchInlineSnapshot(` +Array [ + Object { + "attrs": null, + "blockName": "core/more", + "innerBlocks": Array [], + "innerHTML": "", + }, +] +`); + }); +}); diff --git a/test/unit/jest.config.json b/test/unit/jest.config.json index fc2e92fc20c2a..a108d01564de5 100644 --- a/test/unit/jest.config.json +++ b/test/unit/jest.config.json @@ -21,9 +21,6 @@ "/test/unit/setup-wp-aliases.js", "/test/unit/setup-mocks.js" ], - "transform": { - "\\.pegjs$": "/test/unit/pegjs-transform.js" - }, "testPathIgnorePatterns": [ "/node_modules/", "/test/e2e" diff --git a/test/unit/pegjs-transform.js b/test/unit/pegjs-transform.js deleted file mode 100644 index b5f84d20aba00..0000000000000 --- a/test/unit/pegjs-transform.js +++ /dev/null @@ -1,16 +0,0 @@ -const pegjs = require( 'pegjs' ); - -module.exports = { - process( src ) { - // Description of PEG.js options: https://github.com/pegjs/pegjs#javascript-api - const pegOptions = { - output: 'source', - cache: false, - optimize: 'speed', - trace: false, - }; - const methodName = ( typeof pegjs.generate === 'function' ) ? 'generate' : 'buildParser'; - - return `module.exports = ${ pegjs[ methodName ]( src, pegOptions ) };`; - }, -}; diff --git a/webpack.config.js b/webpack.config.js index f1261c39911d9..9336b2a5bf734 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -157,10 +157,6 @@ const config = { }, module: { rules: [ - { - test: /\.pegjs/, - use: 'pegjs-loader', - }, { test: /\.js$/, exclude: /node_modules/, From b059cce740e4ace50eb3a079a3d0ed3635cc27f8 Mon Sep 17 00:00:00 2001 From: Grzegorz Ziolkowski Date: Wed, 18 Jul 2018 15:41:42 +0200 Subject: [PATCH 2/3] Spec-parser: Use umd as the distribution format --- lib/client-assets.php | 9 +- packages/spec-parser/index.js | 2153 +++++++++++++++-------------- packages/spec-parser/package.json | 2 +- webpack.config.js | 1 + 4 files changed, 1090 insertions(+), 1075 deletions(-) diff --git a/lib/client-assets.php b/lib/client-assets.php index cde5919bab1af..46c8e4933122c 100644 --- a/lib/client-assets.php +++ b/lib/client-assets.php @@ -203,6 +203,13 @@ function gutenberg_register_scripts_and_styles() { filemtime( gutenberg_dir_path() . 'build/dom/index.js' ), true ); + wp_register_script( + 'wp-spec-parser', + gutenberg_url( 'build/spec-parser/index.js' ), + array(), + filemtime( gutenberg_dir_path() . 'build/spec-parser/index.js' ), + true + ); wp_add_inline_script( 'wp-dom', gutenberg_get_script_polyfill( array( @@ -290,7 +297,7 @@ function gutenberg_register_scripts_and_styles() { wp_register_script( 'wp-blocks', gutenberg_url( 'build/blocks/index.js' ), - array( 'wp-blob', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-shortcode', 'wp-data', 'lodash' ), + array( 'wp-blob', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-shortcode', 'wp-spec-parser', 'wp-data', 'lodash' ), filemtime( gutenberg_dir_path() . 'build/blocks/index.js' ), true ); diff --git a/packages/spec-parser/index.js b/packages/spec-parser/index.js index 6df34dd8169da..95a476bc3cbdb 100644 --- a/packages/spec-parser/index.js +++ b/packages/spec-parser/index.js @@ -3,424 +3,398 @@ * * http://pegjs.org/ */ +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(); + } +})(this, function() { + "use strict"; -"use strict"; - -function peg$subclass(child, parent) { - function ctor() { this.constructor = child; } - ctor.prototype = parent.prototype; - child.prototype = new ctor(); -} + function peg$subclass(child, parent) { + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + } -function peg$SyntaxError(message, expected, found, location) { - this.message = message; - this.expected = expected; - this.found = found; - this.location = location; - this.name = "SyntaxError"; + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, peg$SyntaxError); + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } } -} -peg$subclass(peg$SyntaxError, Error); + peg$subclass(peg$SyntaxError, Error); -peg$SyntaxError.buildMessage = function(expected, found) { - var DESCRIBE_EXPECTATION_FNS = { - literal: function(expectation) { - return "\"" + literalEscape(expectation.text) + "\""; - }, + peg$SyntaxError.buildMessage = function(expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, - "class": function(expectation) { - var escapedParts = "", - i; + "class": function(expectation) { + var escapedParts = "", + i; - for (i = 0; i < expectation.parts.length; i++) { - escapedParts += expectation.parts[i] instanceof Array - ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) - : classEscape(expectation.parts[i]); - } + for (i = 0; i < expectation.parts.length; i++) { + escapedParts += expectation.parts[i] instanceof Array + ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) + : classEscape(expectation.parts[i]); + } - return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; - }, + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, - any: function(expectation) { - return "any character"; - }, + any: function(expectation) { + return "any character"; + }, - end: function(expectation) { - return "end of input"; - }, + end: function(expectation) { + return "end of input"; + }, - other: function(expectation) { - return expectation.description; - } - }; + other: function(expectation) { + return expectation.description; + } + }; - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } - function literalEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } + function literalEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } - function classEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/\]/g, '\\]') - .replace(/\^/g, '\\^') - .replace(/-/g, '\\-') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } + function classEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/\]/g, '\\]') + .replace(/\^/g, '\\^') + .replace(/-/g, '\\-') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } - function describeExpectation(expectation) { - return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); - } + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } - function describeExpected(expected) { - var descriptions = new Array(expected.length), - i, j; + function describeExpected(expected) { + var descriptions = new Array(expected.length), + i, j; - for (i = 0; i < expected.length; i++) { - descriptions[i] = describeExpectation(expected[i]); - } + for (i = 0; i < expected.length; i++) { + descriptions[i] = describeExpectation(expected[i]); + } - descriptions.sort(); + descriptions.sort(); - if (descriptions.length > 0) { - for (i = 1, j = 1; i < descriptions.length; i++) { - if (descriptions[i - 1] !== descriptions[i]) { - descriptions[j] = descriptions[i]; - j++; + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } } + descriptions.length = j; } - descriptions.length = j; - } - switch (descriptions.length) { - case 1: - return descriptions[0]; + switch (descriptions.length) { + case 1: + return descriptions[0]; - case 2: - return descriptions[0] + " or " + descriptions[1]; + case 2: + return descriptions[0] + " or " + descriptions[1]; - default: - return descriptions.slice(0, -1).join(", ") - + ", or " - + descriptions[descriptions.length - 1]; + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } } - } - - function describeFound(found) { - return found ? "\"" + literalEscape(found) + "\"" : "end of input"; - } - - return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; -}; -function peg$parse(input, options) { - options = options !== void 0 ? options : {}; + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } - var peg$FAILED = {}, + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + }; + + function peg$parse(input, options) { + options = options !== void 0 ? options : {}; + + var peg$FAILED = {}, + + peg$startRuleFunctions = { Block_List: peg$parseBlock_List }, + peg$startRuleFunction = peg$parseBlock_List, + + peg$c0 = peg$anyExpectation(), + peg$c1 = function(pre, b, html) { /** **/ return [ b, html ] }, + peg$c2 = function(pre, bs, post) { /** **/ + return joinBlocks( pre, bs, post ); + }, + peg$c3 = "", + peg$c9 = peg$literalExpectation("/-->", false), + peg$c10 = function(blockName, attrs) { + /** $blockName, + 'attrs' => $attrs, + 'innerBlocks' => array(), + 'innerHTML' => '', + ); + ?> **/ + + return { + blockName: blockName, + attrs: attrs, + innerBlocks: [], + innerHTML: '' + }; + }, + peg$c11 = function(s, children, e) { + /** $s['blockName'], + 'attrs' => $s['attrs'], + 'innerBlocks' => $innerBlocks, + 'innerHTML' => implode( '', $innerHTML ), + ); + ?> **/ + + var innerContent = partition( function( a ) { return 'string' === typeof a }, children ); + var innerHTML = innerContent[ 0 ]; + var innerBlocks = innerContent[ 1 ]; + + return { + blockName: s.blockName, + attrs: s.attrs, + innerBlocks: innerBlocks, + innerHTML: innerHTML.join( '' ) + }; + }, + peg$c12 = "-->", + peg$c13 = peg$literalExpectation("-->", false), + peg$c14 = function(blockName, attrs) { + /** $blockName, + 'attrs' => $attrs, + ); + ?> **/ + + return { + blockName: blockName, + attrs: attrs + }; + }, + peg$c15 = "/wp:", + peg$c16 = peg$literalExpectation("/wp:", false), + peg$c17 = function(blockName) { + /** $blockName, + ); + ?> **/ + + return { + blockName: blockName + }; + }, + peg$c18 = "/", + peg$c19 = peg$literalExpectation("/", false), + peg$c20 = function(type) { + /** **/ + return 'core/' + type; + }, + peg$c21 = /^[a-z]/, + peg$c22 = peg$classExpectation([["a", "z"]], false, false), + peg$c23 = /^[a-z0-9_\-]/, + peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "-"], false, false), + peg$c25 = peg$otherExpectation("JSON-encoded attributes embedded in a block's opening comment"), + peg$c26 = "{", + peg$c27 = peg$literalExpectation("{", false), + peg$c28 = "}", + peg$c29 = peg$literalExpectation("}", false), + peg$c30 = "", + peg$c31 = function(attrs) { + /** **/ + return maybeJSON( attrs ); + }, + peg$c32 = /^[ \t\r\n]/, + peg$c33 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false), + + peg$currPos = 0, + peg$savedPos = 0, + peg$posDetailsCache = [{ line: 1, column: 1 }], + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, + + peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } - peg$startRuleFunctions = { Block_List: peg$parseBlock_List }, - peg$startRuleFunction = peg$parseBlock_List, + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } - peg$c0 = peg$anyExpectation(), - peg$c1 = function(pre, b, html) { /** **/ return [ b, html ] }, - peg$c2 = function(pre, bs, post) { /** **/ - return joinBlocks( pre, bs, post ); - }, - peg$c3 = "", - peg$c9 = peg$literalExpectation("/-->", false), - peg$c10 = function(blockName, attrs) { - /** $blockName, - 'attrs' => $attrs, - 'innerBlocks' => array(), - 'innerHTML' => '', - ); - ?> **/ - - return { - blockName: blockName, - attrs: attrs, - innerBlocks: [], - innerHTML: '' - }; - }, - peg$c11 = function(s, children, e) { - /** $s['blockName'], - 'attrs' => $s['attrs'], - 'innerBlocks' => $innerBlocks, - 'innerHTML' => implode( '', $innerHTML ), - ); - ?> **/ - - var innerContent = partition( function( a ) { return 'string' === typeof a }, children ); - var innerHTML = innerContent[ 0 ]; - var innerBlocks = innerContent[ 1 ]; - - return { - blockName: s.blockName, - attrs: s.attrs, - innerBlocks: innerBlocks, - innerHTML: innerHTML.join( '' ) - }; - }, - peg$c12 = "-->", - peg$c13 = peg$literalExpectation("-->", false), - peg$c14 = function(blockName, attrs) { - /** $blockName, - 'attrs' => $attrs, - ); - ?> **/ - - return { - blockName: blockName, - attrs: attrs - }; - }, - peg$c15 = "/wp:", - peg$c16 = peg$literalExpectation("/wp:", false), - peg$c17 = function(blockName) { - /** $blockName, - ); - ?> **/ - - return { - blockName: blockName - }; - }, - peg$c18 = "/", - peg$c19 = peg$literalExpectation("/", false), - peg$c20 = function(type) { - /** **/ - return 'core/' + type; - }, - peg$c21 = /^[a-z]/, - peg$c22 = peg$classExpectation([["a", "z"]], false, false), - peg$c23 = /^[a-z0-9_\-]/, - peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "-"], false, false), - peg$c25 = peg$otherExpectation("JSON-encoded attributes embedded in a block's opening comment"), - peg$c26 = "{", - peg$c27 = peg$literalExpectation("{", false), - peg$c28 = "}", - peg$c29 = peg$literalExpectation("}", false), - peg$c30 = "", - peg$c31 = function(attrs) { - /** **/ - return maybeJSON( attrs ); - }, - peg$c32 = /^[ \t\r\n]/, - peg$c33 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false), + function text() { + return input.substring(peg$savedPos, peg$currPos); + } - peg$currPos = 0, - peg$savedPos = 0, - peg$posDetailsCache = [{ line: 1, column: 1 }], - peg$maxFailPos = 0, - peg$maxFailExpected = [], - peg$silentFails = 0, + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } - peg$result; + function expected(description, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - if ("startRule" in options) { - if (!(options.startRule in peg$startRuleFunctions)) { - throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + throw peg$buildStructuredError( + [peg$otherExpectation(description)], + input.substring(peg$savedPos, peg$currPos), + location + ); } - peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; - } - - function text() { - return input.substring(peg$savedPos, peg$currPos); - } + function error(message, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - function location() { - return peg$computeLocation(peg$savedPos, peg$currPos); - } + throw peg$buildSimpleError(message, location); + } - function expected(description, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + function peg$literalExpectation(text, ignoreCase) { + return { type: "literal", text: text, ignoreCase: ignoreCase }; + } - throw peg$buildStructuredError( - [peg$otherExpectation(description)], - input.substring(peg$savedPos, peg$currPos), - location - ); - } + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; + } - function error(message, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + function peg$anyExpectation() { + return { type: "any" }; + } - throw peg$buildSimpleError(message, location); - } + function peg$endExpectation() { + return { type: "end" }; + } - function peg$literalExpectation(text, ignoreCase) { - return { type: "literal", text: text, ignoreCase: ignoreCase }; - } + function peg$otherExpectation(description) { + return { type: "other", description: description }; + } - function peg$classExpectation(parts, inverted, ignoreCase) { - return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; - } + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], p; - function peg$anyExpectation() { - return { type: "any" }; - } + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } - function peg$endExpectation() { - return { type: "end" }; - } + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; - function peg$otherExpectation(description) { - return { type: "other", description: description }; - } + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } - function peg$computePosDetails(pos) { - var details = peg$posDetailsCache[pos], p; + p++; + } - if (details) { - return details; - } else { - p = pos - 1; - while (!peg$posDetailsCache[p]) { - p--; + peg$posDetailsCache[pos] = details; + return details; } + } - details = peg$posDetailsCache[p]; - details = { - line: details.line, - column: details.column - }; + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), + endPosDetails = peg$computePosDetails(endPos); - while (p < pos) { - if (input.charCodeAt(p) === 10) { - details.line++; - details.column = 1; - } else { - details.column++; + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column } - - p++; - } - - peg$posDetailsCache[pos] = details; - return details; + }; } - } - function peg$computeLocation(startPos, endPos) { - var startPosDetails = peg$computePosDetails(startPos), - endPosDetails = peg$computePosDetails(endPos); - - return { - start: { - offset: startPos, - line: startPosDetails.line, - column: startPosDetails.column - }, - end: { - offset: endPos, - line: endPosDetails.line, - column: endPosDetails.column - } - }; - } + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { return; } - function peg$fail(expected) { - if (peg$currPos < peg$maxFailPos) { return; } + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } - if (peg$currPos > peg$maxFailPos) { - peg$maxFailPos = peg$currPos; - peg$maxFailExpected = []; + peg$maxFailExpected.push(expected); } - peg$maxFailExpected.push(expected); - } + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } - function peg$buildSimpleError(message, location) { - return new peg$SyntaxError(message, null, null, location); - } + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError( + peg$SyntaxError.buildMessage(expected, found), + expected, + found, + location + ); + } - function peg$buildStructuredError(expected, found, location) { - return new peg$SyntaxError( - peg$SyntaxError.buildMessage(expected, found), - expected, - found, - location - ); - } + function peg$parseBlock_List() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; - function peg$parseBlock_List() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; - - s0 = peg$currPos; - s1 = peg$currPos; - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$silentFails++; - s5 = peg$parseBlock(); - peg$silentFails--; - if (s5 === peg$FAILED) { - s4 = void 0; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - while (s3 !== peg$FAILED) { - s2.push(s3); + s0 = peg$currPos; + s1 = peg$currPos; + s2 = []; s3 = peg$currPos; s4 = peg$currPos; peg$silentFails++; @@ -451,101 +425,46 @@ function peg$parse(input, options) { peg$currPos = s3; s3 = peg$FAILED; } - } - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parseBlock(); - if (s4 !== peg$FAILED) { - s5 = peg$currPos; - s6 = []; - s7 = peg$currPos; - s8 = peg$currPos; + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; peg$silentFails++; - s9 = peg$parseBlock(); + s5 = peg$parseBlock(); peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; + if (s5 === peg$FAILED) { + s4 = void 0; } else { - peg$currPos = s8; - s8 = peg$FAILED; + peg$currPos = s4; + s4 = peg$FAILED; } - if (s8 !== peg$FAILED) { + if (s4 !== peg$FAILED) { if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); + s5 = input.charAt(peg$currPos); peg$currPos++; } else { - s9 = peg$FAILED; + s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c0); } } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - while (s7 !== peg$FAILED) { - s6.push(s7); - s7 = peg$currPos; - s8 = peg$currPos; - peg$silentFails++; - s9 = peg$parseBlock(); - peg$silentFails--; - if (s9 === peg$FAILED) { - s8 = void 0; - } else { - peg$currPos = s8; - s8 = peg$FAILED; - } - if (s8 !== peg$FAILED) { - if (input.length > peg$currPos) { - s9 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s9 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s9 !== peg$FAILED) { - s8 = [s8, s9]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; } else { - peg$currPos = s7; - s7 = peg$FAILED; + peg$currPos = s3; + s3 = peg$FAILED; } - } - if (s6 !== peg$FAILED) { - s5 = input.substring(s5, peg$currPos); - } else { - s5 = s6; - } - if (s5 !== peg$FAILED) { - peg$savedPos = s3; - s4 = peg$c1(s1, s4, s5); - s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); } else { - peg$currPos = s3; - s3 = peg$FAILED; + s1 = s2; } - while (s3 !== peg$FAILED) { - s2.push(s3); + if (s1 !== peg$FAILED) { + s2 = []; s3 = peg$currPos; s4 = peg$parseBlock(); if (s4 !== peg$FAILED) { @@ -631,19 +550,97 @@ function peg$parse(input, options) { peg$currPos = s3; s3 = peg$FAILED; } - } - if (s2 !== peg$FAILED) { - s3 = peg$currPos; - s4 = []; - if (input.length > peg$currPos) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parseBlock(); + if (s4 !== peg$FAILED) { + s5 = peg$currPos; + s6 = []; + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$currPos; + s8 = peg$currPos; + peg$silentFails++; + s9 = peg$parseBlock(); + peg$silentFails--; + if (s9 === peg$FAILED) { + s8 = void 0; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 !== peg$FAILED) { + if (input.length > peg$currPos) { + s9 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } + if (s6 !== peg$FAILED) { + s5 = input.substring(s5, peg$currPos); + } else { + s5 = s6; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c1(s1, s4, s5); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } } - while (s5 !== peg$FAILED) { - s4.push(s5); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = []; if (input.length > peg$currPos) { s5 = input.charAt(peg$currPos); peg$currPos++; @@ -651,16 +648,29 @@ function peg$parse(input, options) { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c0); } } - } - if (s4 !== peg$FAILED) { - s3 = input.substring(s3, peg$currPos); - } else { - s3 = s4; - } - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c2(s1, s2, s3); - s0 = s1; + while (s5 !== peg$FAILED) { + s4.push(s5); + if (input.length > peg$currPos) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c2(s1, s2, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -669,82 +679,82 @@ function peg$parse(input, options) { peg$currPos = s0; s0 = peg$FAILED; } - } else { - peg$currPos = s0; - s0 = peg$FAILED; + + return s0; } - return s0; - } + function peg$parseBlock() { + var s0; - function peg$parseBlock() { - var s0; + s0 = peg$parseBlock_Void(); + if (s0 === peg$FAILED) { + s0 = peg$parseBlock_Balanced(); + } - s0 = peg$parseBlock_Void(); - if (s0 === peg$FAILED) { - s0 = peg$parseBlock_Balanced(); + return s0; } - return s0; - } - - function peg$parseBlock_Void() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8; + function peg$parseBlock_Void() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c5) { - s3 = peg$c5; - peg$currPos += 3; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c6); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - s6 = peg$currPos; - s7 = peg$parseBlock_Attributes(); - if (s7 !== peg$FAILED) { - s8 = peg$parse__(); - if (s8 !== peg$FAILED) { - peg$savedPos = s6; - s7 = peg$c7(s4, s7); - s6 = s7; + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c5) { + s3 = peg$c5; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseBlock_Attributes(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + peg$savedPos = s6; + s7 = peg$c7(s4, s7); + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } } else { peg$currPos = s6; s6 = peg$FAILED; } - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 === peg$FAILED) { - s6 = null; - } - if (s6 !== peg$FAILED) { - if (input.substr(peg$currPos, 4) === peg$c8) { - s7 = peg$c8; - peg$currPos += 4; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c9); } + if (s6 === peg$FAILED) { + s6 = null; } - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c10(s4, s6); - s0 = s1; + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 4) === peg$c8) { + s7 = peg$c8; + peg$currPos += 4; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c9); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c10(s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -769,62 +779,17 @@ function peg$parse(input, options) { peg$currPos = s0; s0 = peg$FAILED; } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - return s0; - } + return s0; + } - function peg$parseBlock_Balanced() { - var s0, s1, s2, s3, s4, s5, s6; + function peg$parseBlock_Balanced() { + var s0, s1, s2, s3, s4, s5, s6; - s0 = peg$currPos; - s1 = peg$parseBlock_Start(); - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseBlock(); - if (s3 === peg$FAILED) { - s3 = peg$currPos; - s4 = peg$currPos; - s5 = peg$currPos; - peg$silentFails++; - s6 = peg$parseBlock_End(); - peg$silentFails--; - if (s6 === peg$FAILED) { - s5 = void 0; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - if (s5 !== peg$FAILED) { - if (input.length > peg$currPos) { - s6 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - if (s4 !== peg$FAILED) { - s3 = input.substring(s3, peg$currPos); - } else { - s3 = s4; - } - } - while (s3 !== peg$FAILED) { - s2.push(s3); + s0 = peg$currPos; + s1 = peg$parseBlock_Start(); + if (s1 !== peg$FAILED) { + s2 = []; s3 = peg$parseBlock(); if (s3 === peg$FAILED) { s3 = peg$currPos; @@ -864,13 +829,58 @@ function peg$parse(input, options) { s3 = s4; } } - } - if (s2 !== peg$FAILED) { - s3 = peg$parseBlock_End(); - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c11(s1, s2, s3); - s0 = s1; + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseBlock(); + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$currPos; + s5 = peg$currPos; + peg$silentFails++; + s6 = peg$parseBlock_End(); + peg$silentFails--; + if (s6 === peg$FAILED) { + s5 = void 0; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + if (input.length > peg$currPos) { + s6 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + } + } + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock_End(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c11(s1, s2, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -879,71 +889,71 @@ function peg$parse(input, options) { peg$currPos = s0; s0 = peg$FAILED; } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - return s0; - } + return s0; + } - function peg$parseBlock_Start() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8; + function peg$parseBlock_Start() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c5) { - s3 = peg$c5; - peg$currPos += 3; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c6); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - s6 = peg$currPos; - s7 = peg$parseBlock_Attributes(); - if (s7 !== peg$FAILED) { - s8 = peg$parse__(); - if (s8 !== peg$FAILED) { - peg$savedPos = s6; - s7 = peg$c7(s4, s7); - s6 = s7; + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c5) { + s3 = peg$c5; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseBlock_Attributes(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + peg$savedPos = s6; + s7 = peg$c7(s4, s7); + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } } else { peg$currPos = s6; s6 = peg$FAILED; } - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 === peg$FAILED) { - s6 = null; - } - if (s6 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s7 = peg$c12; - peg$currPos += 3; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } + if (s6 === peg$FAILED) { + s6 = null; } - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c14(s4, s6); - s0 = s1; + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s7 = peg$c12; + peg$currPos += 3; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c14(s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -968,51 +978,51 @@ function peg$parse(input, options) { peg$currPos = s0; s0 = peg$FAILED; } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - return s0; - } + return s0; + } - function peg$parseBlock_End() { - var s0, s1, s2, s3, s4, s5, s6; + function peg$parseBlock_End() { + var s0, s1, s2, s3, s4, s5, s6; - s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c3) { - s1 = peg$c3; - peg$currPos += 4; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c4); } - } - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - if (s2 !== peg$FAILED) { - if (input.substr(peg$currPos, 4) === peg$c15) { - s3 = peg$c15; - peg$currPos += 4; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c16); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name(); - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - if (s5 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s6 = peg$c12; - peg$currPos += 3; - } else { - s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s6 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c17(s4); - s0 = s1; + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c3) { + s1 = peg$c3; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 4) === peg$c15) { + s3 = peg$c15; + peg$currPos += 4; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c16); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s6 = peg$c12; + peg$currPos += 3; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c17(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1033,44 +1043,44 @@ function peg$parse(input, options) { peg$currPos = s0; s0 = peg$FAILED; } - } else { - peg$currPos = s0; - s0 = peg$FAILED; + + return s0; } - return s0; - } + function peg$parseBlock_Name() { + var s0; - function peg$parseBlock_Name() { - var s0; + s0 = peg$parseNamespaced_Block_Name(); + if (s0 === peg$FAILED) { + s0 = peg$parseCore_Block_Name(); + } - s0 = peg$parseNamespaced_Block_Name(); - if (s0 === peg$FAILED) { - s0 = peg$parseCore_Block_Name(); + return s0; } - return s0; - } - - function peg$parseNamespaced_Block_Name() { - var s0, s1, s2, s3, s4; + function peg$parseNamespaced_Block_Name() { + var s0, s1, s2, s3, s4; - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$parseBlock_Name_Part(); - if (s2 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 47) { - s3 = peg$c18; - peg$currPos++; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } - } - if (s3 !== peg$FAILED) { - s4 = peg$parseBlock_Name_Part(); - if (s4 !== peg$FAILED) { - s2 = [s2, s3, s4]; - s1 = s2; + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseBlock_Name_Part(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s3 = peg$c18; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parseBlock_Name_Part(); + if (s4 !== peg$FAILED) { + s2 = [s2, s3, s4]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } } else { peg$currPos = s1; s1 = peg$FAILED; @@ -1079,62 +1089,49 @@ function peg$parse(input, options) { peg$currPos = s1; s1 = peg$FAILED; } - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - if (s1 !== peg$FAILED) { - s0 = input.substring(s0, peg$currPos); - } else { - s0 = s1; + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; } - return s0; - } + function peg$parseCore_Block_Name() { + var s0, s1, s2; - function peg$parseCore_Block_Name() { - var s0, s1, s2; + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseBlock_Name_Part(); + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c20(s1); + } + s0 = s1; - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$parseBlock_Name_Part(); - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c20(s1); + return s0; } - s0 = s1; - - return s0; - } - function peg$parseBlock_Name_Part() { - var s0, s1, s2, s3, s4; + function peg$parseBlock_Name_Part() { + var s0, s1, s2, s3, s4; - s0 = peg$currPos; - s1 = peg$currPos; - if (peg$c21.test(input.charAt(peg$currPos))) { - s2 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c22); } - } - if (s2 !== peg$FAILED) { - s3 = []; - if (peg$c23.test(input.charAt(peg$currPos))) { - s4 = input.charAt(peg$currPos); + s0 = peg$currPos; + s1 = peg$currPos; + if (peg$c21.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); peg$currPos++; } else { - s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c24); } + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c22); } } - while (s4 !== peg$FAILED) { - s3.push(s4); + if (s2 !== peg$FAILED) { + s3 = []; if (peg$c23.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; @@ -1142,128 +1139,52 @@ function peg$parse(input, options) { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c24); } } - } - if (s3 !== peg$FAILED) { - s2 = [s2, s3]; - s1 = s2; + while (s4 !== peg$FAILED) { + s3.push(s4); + if (peg$c23.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c24); } + } + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } } else { peg$currPos = s1; s1 = peg$FAILED; } - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - if (s1 !== peg$FAILED) { - s0 = input.substring(s0, peg$currPos); - } else { - s0 = s1; - } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } - return s0; - } + return s0; + } - function peg$parseBlock_Attributes() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12; + function peg$parseBlock_Attributes() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12; - peg$silentFails++; - s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c26; - peg$currPos++; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c27); } - } - if (s3 !== peg$FAILED) { - s4 = []; - s5 = peg$currPos; - s6 = peg$currPos; peg$silentFails++; - s7 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 125) { - s8 = peg$c28; + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c26; peg$currPos++; } else { - s8 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c29); } - } - if (s8 !== peg$FAILED) { - s9 = peg$parse__(); - if (s9 !== peg$FAILED) { - s10 = peg$c30; - if (s10 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 47) { - s11 = peg$c18; - peg$currPos++; - } else { - s11 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } - } - if (s11 === peg$FAILED) { - s11 = null; - } - if (s11 !== peg$FAILED) { - if (input.substr(peg$currPos, 3) === peg$c12) { - s12 = peg$c12; - peg$currPos += 3; - } else { - s12 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } - } - if (s12 !== peg$FAILED) { - s8 = [s8, s9, s10, s11, s12]; - s7 = s8; - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - } else { - peg$currPos = s7; - s7 = peg$FAILED; - } - peg$silentFails--; - if (s7 === peg$FAILED) { - s6 = void 0; - } else { - peg$currPos = s6; - s6 = peg$FAILED; - } - if (s6 !== peg$FAILED) { - if (input.length > peg$currPos) { - s7 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } - } - if (s7 !== peg$FAILED) { - s6 = [s6, s7]; - s5 = s6; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - } else { - peg$currPos = s5; - s5 = peg$FAILED; + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c27); } } - while (s5 !== peg$FAILED) { - s4.push(s5); + if (s3 !== peg$FAILED) { + s4 = []; s5 = peg$currPos; s6 = peg$currPos; peg$silentFails++; @@ -1347,18 +1268,107 @@ function peg$parse(input, options) { peg$currPos = s5; s5 = peg$FAILED; } - } - if (s4 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c28; - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c29); } + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$currPos; + s6 = peg$currPos; + peg$silentFails++; + s7 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 125) { + s8 = peg$c28; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c29); } + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s10 = peg$c30; + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s11 = peg$c18; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s11 === peg$FAILED) { + s11 = null; + } + if (s11 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c12) { + s12 = peg$c12; + peg$currPos += 3; + } else { + s12 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c13); } + } + if (s12 !== peg$FAILED) { + s8 = [s8, s9, s10, s11, s12]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + peg$silentFails--; + if (s7 === peg$FAILED) { + s6 = void 0; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + if (input.length > peg$currPos) { + s7 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c0); } + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } } - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c28; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c29); } + } + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } } else { peg$currPos = s2; s2 = peg$FAILED; @@ -1367,234 +1377,231 @@ function peg$parse(input, options) { peg$currPos = s2; s2 = peg$FAILED; } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); - } else { - s1 = s2; - } - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c31(s1); - } - s0 = s1; - peg$silentFails--; - if (s0 === peg$FAILED) { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c25); } - } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c31(s1); + } + s0 = s1; + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c25); } + } - return s0; - } + return s0; + } - function peg$parse__() { - var s0, s1; + function peg$parse__() { + var s0, s1; - s0 = []; - if (peg$c32.test(input.charAt(peg$currPos))) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c33); } - } - if (s1 !== peg$FAILED) { - while (s1 !== peg$FAILED) { - s0.push(s1); - if (peg$c32.test(input.charAt(peg$currPos))) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c33); } + s0 = []; + if (peg$c32.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c33); } + } + if (s1 !== peg$FAILED) { + while (s1 !== peg$FAILED) { + s0.push(s1); + if (peg$c32.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c33); } + } } + } else { + s0 = peg$FAILED; } - } else { - s0 = peg$FAILED; + + return s0; } - return s0; - } + /* + * + * _____ _ _ + * / ____| | | | | + * | | __ _ _| |_ ___ _ __ | |__ ___ _ __ __ _ + * | | |_ | | | | __/ _ \ '_ \| '_ \ / _ \ '__/ _` | + * | |__| | |_| | || __/ | | | |_) | __/ | | (_| | + * \_____|\__,_|\__\___|_| |_|_.__/ \___|_| \__, | + * __/ | + * GRAMMAR |___/ + * + * + * Welcome to the grammar file for Gutenberg posts! + * + * Please don't be distracted by the functions at the top + * here - they're just helpers for the grammar below. We + * try to keep them as minimal and simple as possible, + * but the parser generator forces us to declare them at + * the beginning of the file. + * + * What follows is the official specification grammar for + * documents created or edited in Gutenberg. It starts at + * the top-level rule `Block_List` + * + * The grammar is defined by a series of _rules_ and ways + * to return matches on those rules. It's a _PEG_, a + * parsing expression grammar, which simply means that for + * each of our rules we have a set of sub-rules to match + * on and the generated parser will try them in order + * until it finds the first match. + * + * This grammar is a _specification_ (with as little actual + * code as we can get away with) which is used by the + * parser generator to generate the actual _parser_ which + * is used by Gutenberg. We generate two parsers: one in + * JavaScript for use the browser and one in PHP for + * WordPress itself. PEG parser generators are available + * in many languages, though different libraries may require + * some translation of this grammar into their syntax. + * + * For more information: + * @see https://pegjs.org + * @see https://en.wikipedia.org/wiki/Parsing_expression_grammar + * + */ + + /** array(), 'innerHTML' => $pre ); + } - if ( ! empty( $pre ) ) { - $blocks[] = array( 'attrs' => array(), 'innerHTML' => $pre ); - } + foreach ( $tokens as $token ) { + list( $token, $html ) = $token; - foreach ( $tokens as $token ) { - list( $token, $html ) = $token; + $blocks[] = $token; - $blocks[] = $token; + if ( ! empty( $html ) ) { + $blocks[] = array( 'attrs' => array(), 'innerHTML' => $html ); + } + } - if ( ! empty( $html ) ) { - $blocks[] = array( 'attrs' => array(), 'innerHTML' => $html ); - } - } + if ( ! empty( $post ) ) { + $blocks[] = array( 'attrs' => array(), 'innerHTML' => $post ); + } - if ( ! empty( $post ) ) { - $blocks[] = array( 'attrs' => array(), 'innerHTML' => $post ); - } + return $blocks; + } + } - return $blocks; - } - } + ?> **/ - ?> **/ + function freeform( s ) { + return s.length && { + attrs: {}, + innerHTML: s + }; + } - function freeform( s ) { - return s.length && { - attrs: {}, - innerHTML: s - }; - } + function joinBlocks( pre, tokens, post ) { + var blocks = [], i, l, html, item, token; - function joinBlocks( pre, tokens, post ) { - var blocks = [], i, l, html, item, token; + if ( pre.length ) { + blocks.push( freeform( pre ) ); + } - if ( pre.length ) { - blocks.push( freeform( pre ) ); - } + for ( i = 0, l = tokens.length; i < l; i++ ) { + item = tokens[ i ]; + token = item[ 0 ]; + html = item[ 1 ]; - for ( i = 0, l = tokens.length; i < l; i++ ) { - item = tokens[ i ]; - token = item[ 0 ]; - html = item[ 1 ]; + blocks.push( token ); + if ( html.length ) { + blocks.push( freeform( html ) ); + } + } - blocks.push( token ); - if ( html.length ) { - blocks.push( freeform( html ) ); - } - } + if ( post.length ) { + blocks.push( freeform( post ) ); + } - if ( post.length ) { - blocks.push( freeform( post ) ); - } + return blocks; + } - return blocks; - } + function maybeJSON( s ) { + try { + return JSON.parse( s ); + } catch (e) { + return null; + } + } - function maybeJSON( s ) { - try { - return JSON.parse( s ); - } catch (e) { - return null; - } - } + function partition( predicate, list ) { + var i, l, item; + var truthy = []; + var falsey = []; - function partition( predicate, list ) { - var i, l, item; - var truthy = []; - var falsey = []; + // nod to performance over a simpler reduce + // and clone model we could have taken here + for ( i = 0, l = list.length; i < l; i++ ) { + item = list[ i ]; - // nod to performance over a simpler reduce - // and clone model we could have taken here - for ( i = 0, l = list.length; i < l; i++ ) { - item = list[ i ]; + predicate( item ) + ? truthy.push( item ) + : falsey.push( item ) + }; - predicate( item ) - ? truthy.push( item ) - : falsey.push( item ) - }; + return [ truthy, falsey ]; + } - return [ truthy, falsey ]; - } + peg$result = peg$startRuleFunction(); - peg$result = peg$startRuleFunction(); + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } - if (peg$result !== peg$FAILED && peg$currPos === input.length) { - return peg$result; - } else { - if (peg$result !== peg$FAILED && peg$currPos < input.length) { - peg$fail(peg$endExpectation()); + throw peg$buildStructuredError( + peg$maxFailExpected, + peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, + peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) + ); } - - throw peg$buildStructuredError( - peg$maxFailExpected, - peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, - peg$maxFailPos < input.length - ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) - : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) - ); } -} -module.exports = { - SyntaxError: peg$SyntaxError, - parse: peg$parse -}; + return { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; +}); diff --git a/packages/spec-parser/package.json b/packages/spec-parser/package.json index 5d4badf195db4..cbbff0881f990 100644 --- a/packages/spec-parser/package.json +++ b/packages/spec-parser/package.json @@ -23,6 +23,6 @@ "access": "public" }, "scripts": { - "build": "pegjs -o ./index.js ./grammar.pegjs" + "build": "pegjs --format umd -o ./index.js ./grammar.pegjs" } } diff --git a/webpack.config.js b/webpack.config.js index 9336b2a5bf734..9d6c6dfb26534 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -102,6 +102,7 @@ const gutenbergPackages = [ 'keycodes', 'plugins', 'shortcode', + 'spec-parser', 'viewport', ]; From 5bac6bd28df1fcbc9b12f5f68e49e90b5c4fe520 Mon Sep 17 00:00:00 2001 From: Grzegorz Ziolkowski Date: Thu, 19 Jul 2018 09:32:11 +0200 Subject: [PATCH 3/3] Packages: Rename spec-parser to better explain its purpose --- .eslintignore | 2 +- .eslintrc.js | 7 +++++-- bin/create-php-parser.js | 2 +- bin/generate-public-grammar.js | 2 +- blocks/api/parser.js | 2 +- blocks/api/test/parser.js | 2 +- core-blocks/test/full-content.js | 2 +- lib/client-assets.php | 8 ++++---- package-lock.json | 6 +++--- package.json | 2 +- .../.npmrc | 0 .../README.md | 8 ++++---- .../grammar.pegjs | 0 .../index.js | 0 .../package.json | 8 +++++--- .../test/index.js | 2 +- webpack.config.js | 7 +++++-- 17 files changed, 34 insertions(+), 26 deletions(-) rename packages/{spec-parser => block-serialization-spec-parser}/.npmrc (100%) rename packages/{spec-parser => block-serialization-spec-parser}/README.md (67%) rename packages/{spec-parser => block-serialization-spec-parser}/grammar.pegjs (100%) rename packages/{spec-parser => block-serialization-spec-parser}/index.js (100%) rename packages/{spec-parser => block-serialization-spec-parser}/package.json (72%) rename packages/{spec-parser => block-serialization-spec-parser}/test/index.js (88%) diff --git a/.eslintignore b/.eslintignore index 169d8b3691f4a..7228e8b672e90 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,6 +2,6 @@ build build-module coverage node_modules -packages/spec-parser +packages/block-serialization-spec-parser test/e2e/test-plugins vendor diff --git a/.eslintrc.js b/.eslintrc.js index 18ab9e6e14277..b2564dfc09afa 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -50,10 +50,13 @@ module.exports = { message: 'Use @wordpress/blob as import path instead.', }, { - selector: 'ImportDeclaration[source.value=/^blocks(\\u002F|$)/]', - message: 'Use @wordpress/blocks as import path instead.', + selector: 'ImportDeclaration[source.value=/^block-serialization-spec-parser(\\u002F|$)/]', + message: 'Use @wordpress/block-serialization-spec-parser as import path instead.', }, { + selector: 'ImportDeclaration[source.value=/^blocks(\\u002F|$)/]', + message: 'Use @wordpress/blocks as import path instead.', + },{ selector: 'ImportDeclaration[source.value=/^components(\\u002F|$)/]', message: 'Use @wordpress/components as import path instead.', }, diff --git a/bin/create-php-parser.js b/bin/create-php-parser.js index 595e3597466eb..0d661ff0f906b 100755 --- a/bin/create-php-parser.js +++ b/bin/create-php-parser.js @@ -5,7 +5,7 @@ const phpegjs = require( 'phpegjs' ); const fs = require( 'fs' ); const path = require( 'path' ); -const peg = fs.readFileSync( 'packages/spec-parser/grammar.pegjs', 'utf8' ); +const peg = fs.readFileSync( 'packages/block-serialization-spec-parser/grammar.pegjs', 'utf8' ); const parser = pegjs.generate( peg, diff --git a/bin/generate-public-grammar.js b/bin/generate-public-grammar.js index 1e6df4106caec..aaa3c43bc2888 100755 --- a/bin/generate-public-grammar.js +++ b/bin/generate-public-grammar.js @@ -2,7 +2,7 @@ const parser = require( '../node_modules/pegjs/lib/parser.js' ); const fs = require( 'fs' ); const path = require( 'path' ); -const grammarSource = fs.readFileSync( './packages/spec-parser/grammar.pegjs', 'utf8' ); +const grammarSource = fs.readFileSync( './packages/block-serialization-spec-parser/grammar.pegjs', 'utf8' ); const grammar = parser.parse( grammarSource ); function escape( text ) { diff --git a/blocks/api/parser.js b/blocks/api/parser.js index cf75bd483f009..5f2ebf531f169 100644 --- a/blocks/api/parser.js +++ b/blocks/api/parser.js @@ -10,7 +10,7 @@ import { flow, castArray, mapValues, omit, stubFalse } from 'lodash'; import { autop } from '@wordpress/autop'; import { applyFilters } from '@wordpress/hooks'; import deprecated from '@wordpress/deprecated'; -import { parse as grammarParse } from '@wordpress/spec-parser'; +import { parse as grammarParse } from '@wordpress/block-serialization-spec-parser'; /** * Internal dependencies diff --git a/blocks/api/test/parser.js b/blocks/api/test/parser.js index 99d8d6e5a9293..0b811b9d9a279 100644 --- a/blocks/api/test/parser.js +++ b/blocks/api/test/parser.js @@ -547,7 +547,7 @@ describe( 'block parser', () => { } ); } ); - describe( 'parse() of @wordpress/spec-parser', () => { + describe( 'parse() of @wordpress/block-serialization-spec-parser', () => { // run the test cases using the PegJS defined parser testCases( parsePegjs ); } ); diff --git a/core-blocks/test/full-content.js b/core-blocks/test/full-content.js index 7f4b5e6c27cf0..0dc2c9005143f 100644 --- a/core-blocks/test/full-content.js +++ b/core-blocks/test/full-content.js @@ -10,7 +10,7 @@ import { format } from 'util'; * WordPress dependencies */ import { getBlockTypes, parse, serialize } from '@wordpress/blocks'; -import { parse as grammarParse } from '@wordpress/spec-parser'; +import { parse as grammarParse } from '@wordpress/block-serialization-spec-parser'; /** * Internal dependencies diff --git a/lib/client-assets.php b/lib/client-assets.php index 46c8e4933122c..1fc9d11ee92e5 100644 --- a/lib/client-assets.php +++ b/lib/client-assets.php @@ -204,10 +204,10 @@ function gutenberg_register_scripts_and_styles() { true ); wp_register_script( - 'wp-spec-parser', - gutenberg_url( 'build/spec-parser/index.js' ), + 'wp-block-serialization-spec-parser', + gutenberg_url( 'build/block-serialization-spec-parser/index.js' ), array(), - filemtime( gutenberg_dir_path() . 'build/spec-parser/index.js' ), + filemtime( gutenberg_dir_path() . 'build/block-serialization-spec-parser/index.js' ), true ); wp_add_inline_script( @@ -297,7 +297,7 @@ function gutenberg_register_scripts_and_styles() { wp_register_script( 'wp-blocks', gutenberg_url( 'build/blocks/index.js' ), - array( 'wp-blob', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-shortcode', 'wp-spec-parser', 'wp-data', 'lodash' ), + array( 'wp-blob', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-shortcode', 'wp-block-serialization-spec-parser', 'wp-data', 'lodash' ), filemtime( gutenberg_dir_path() . 'build/blocks/index.js' ), true ); diff --git a/package-lock.json b/package-lock.json index 72e19337c4ce7..d604bb389330b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3029,6 +3029,9 @@ "@wordpress/blob": { "version": "file:packages/blob" }, + "@wordpress/block-serialization-spec-parser": { + "version": "file:packages/block-serialization-spec-parser" + }, "@wordpress/browserslist-config": { "version": "file:packages/browserslist-config", "dev": true @@ -3582,9 +3585,6 @@ "lodash": "^4.17.10" } }, - "@wordpress/spec-parser": { - "version": "file:packages/spec-parser" - }, "@wordpress/url": { "version": "file:packages/url" }, diff --git a/package.json b/package.json index 278e97a9ce7ec..391fd95d665f9 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/autop": "file:packages/autop", "@wordpress/blob": "file:packages/blob", + "@wordpress/block-serialization-spec-parser": "file:packages/block-serialization-spec-parser", "@wordpress/components": "file:packages/components", "@wordpress/compose": "file:packages/compose", "@wordpress/core-data": "file:packages/core-data", @@ -35,7 +36,6 @@ "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/plugins": "file:packages/plugins", "@wordpress/shortcode": "file:packages/shortcode", - "@wordpress/spec-parser": "file:packages/spec-parser", "@wordpress/url": "file:packages/url", "@wordpress/viewport": "file:packages/viewport", "@wordpress/wordcount": "file:packages/wordcount", diff --git a/packages/spec-parser/.npmrc b/packages/block-serialization-spec-parser/.npmrc similarity index 100% rename from packages/spec-parser/.npmrc rename to packages/block-serialization-spec-parser/.npmrc diff --git a/packages/spec-parser/README.md b/packages/block-serialization-spec-parser/README.md similarity index 67% rename from packages/spec-parser/README.md rename to packages/block-serialization-spec-parser/README.md index 014f89c7575cb..36c93ddb6a236 100644 --- a/packages/spec-parser/README.md +++ b/packages/block-serialization-spec-parser/README.md @@ -1,6 +1,6 @@ -# @wordpress/spec-parser +# @wordpress/block-serialization-spec-parser -This library contains the grammar file (`grammar.pegjs`) for WordPress posts which is a _specification_ which is used to generate the actual _parser_ which is also bundled in this package. +This library contains the grammar file (`grammar.pegjs`) for WordPress posts which is a block serialization _specification_ which is used to generate the actual _parser_ which is also bundled in this package. PEG parser generators are available in many languages, though different libraries may require some translation of this grammar into their syntax. For more information see: * https://pegjs.org @@ -11,13 +11,13 @@ PEG parser generators are available in many languages, though different librarie Install the module ```bash -npm install @wordpress/spec-parser --save +npm install @wordpress/block-serialization-spec-parser --save ``` ## Usage ```js -import { parse } from '@wordpress/spec-parser'; +import { parse } from '@wordpress/block-serialization-spec-parser'; parse( '' ); // [{"attrs": null, "blockName": "core/more", "innerBlocks": [], "innerHTML": ""}] diff --git a/packages/spec-parser/grammar.pegjs b/packages/block-serialization-spec-parser/grammar.pegjs similarity index 100% rename from packages/spec-parser/grammar.pegjs rename to packages/block-serialization-spec-parser/grammar.pegjs diff --git a/packages/spec-parser/index.js b/packages/block-serialization-spec-parser/index.js similarity index 100% rename from packages/spec-parser/index.js rename to packages/block-serialization-spec-parser/index.js diff --git a/packages/spec-parser/package.json b/packages/block-serialization-spec-parser/package.json similarity index 72% rename from packages/spec-parser/package.json rename to packages/block-serialization-spec-parser/package.json index cbbff0881f990..eba5a9bfedc17 100644 --- a/packages/spec-parser/package.json +++ b/packages/block-serialization-spec-parser/package.json @@ -1,14 +1,16 @@ { - "name": "@wordpress/spec-parser", + "name": "@wordpress/block-serialization-spec-parser", "version": "1.0.0-alpha.1", - "description": "Parser for WordPress posts", + "description": "Block serialization specification parser for WordPress posts", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", "keywords": [ "wordpress", + "block", + "spec", "parser" ], - "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/spec-parser/README.md", + "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/block-serialization-spec-parser/README.md", "repository": { "type": "git", "url": "https://github.com/WordPress/gutenberg.git" diff --git a/packages/spec-parser/test/index.js b/packages/block-serialization-spec-parser/test/index.js similarity index 88% rename from packages/spec-parser/test/index.js rename to packages/block-serialization-spec-parser/test/index.js index 5d79f3b88a403..77b090a144a50 100644 --- a/packages/spec-parser/test/index.js +++ b/packages/block-serialization-spec-parser/test/index.js @@ -3,7 +3,7 @@ */ import { parse } from "../"; -describe("spec-parser", () => { +describe("block-serialization-spec-parser", () => { test("parse() works properly", () => { const result = parse( "" diff --git a/webpack.config.js b/webpack.config.js index 9d6c6dfb26534..793723e1f7867 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -87,6 +87,7 @@ const gutenbergPackages = [ 'a11y', 'api-fetch', 'blob', + 'block-serialization-spec-parser', 'compose', 'core-data', 'data', @@ -102,7 +103,6 @@ const gutenbergPackages = [ 'keycodes', 'plugins', 'shortcode', - 'spec-parser', 'viewport', ]; @@ -160,7 +160,10 @@ const config = { rules: [ { test: /\.js$/, - exclude: /node_modules/, + exclude: [ + /block-serialization-spec-parser/, + /node_modules/, + ], use: 'babel-loader', }, {