You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@wordpress/block-serialization-default-parser

Package Overview
Dependencies
Maintainers
8
Versions
220
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@wordpress/block-serialization-default-parser - npm Package Compare versions

Comparing version
1.0.1
to
1.0.2
test/__snapshots__/index.js.snap

Sorry, the diff of this file is not supported yet

+7
<?php
require_once __DIR__ . '/../parser.php';
$parser = new WP_Block_Parser();
echo json_encode( $parser->parse( file_get_contents( 'php://stdin' ) ) );
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/gziolo/PhpstormProjects/gutenberg/packages/block-serialization-default-parser/src/index.js"],"names":["document","offset","output","stack","tokenizer","Block","blockName","attrs","innerBlocks","innerHTML","Freeform","Frame","block","tokenStart","tokenLength","prevOffset","leadingHtmlStart","parse","doc","lastIndex","proceed","next","nextToken","tokenType","startOffset","stackDepth","length","addFreeform","addBlockFromStack","push","substr","addInnerBlock","stackTop","pop","parseJSON","input","JSON","e","matches","exec","startedAt","index","match","closerMatch","namespaceMatch","nameMatch","attrsMatch","voidMatch","isCloser","isVoid","namespace","name","hasAttrs","rawLength","lastOffset","parent","endOffset"],"mappings":";AAAA,IAAIA,QAAJ;AACA,IAAIC,MAAJ;AACA,IAAIC,MAAJ;AACA,IAAIC,KAAJ;AACA,IAAMC,SAAS,GAAG,gGAAlB;;AAEA,SAASC,KAAT,CAAgBC,SAAhB,EAA2BC,KAA3B,EAAkCC,WAAlC,EAA+CC,SAA/C,EAA2D;AAC1D,SAAO;AACNH,IAAAA,SAAS,EAATA,SADM;AAENC,IAAAA,KAAK,EAALA,KAFM;AAGNC,IAAAA,WAAW,EAAXA,WAHM;AAINC,IAAAA,SAAS,EAATA;AAJM,GAAP;AAMA;;AAED,SAASC,QAAT,CAAmBD,SAAnB,EAA+B;AAC9B,SAAOJ,KAAK,CAAE,IAAF,EAAQ,EAAR,EAAY,EAAZ,EAAgBI,SAAhB,CAAZ;AACA;;AAED,SAASE,KAAT,CAAgBC,KAAhB,EAAuBC,UAAvB,EAAmCC,WAAnC,EAAgDC,UAAhD,EAA4DC,gBAA5D,EAA+E;AAC9E,SAAO;AACNJ,IAAAA,KAAK,EAALA,KADM;AAENC,IAAAA,UAAU,EAAVA,UAFM;AAGNC,IAAAA,WAAW,EAAXA,WAHM;AAINC,IAAAA,UAAU,EAAEA,UAAU,IAAIF,UAAU,GAAGC,WAJjC;AAKNE,IAAAA,gBAAgB,EAAhBA;AALM,GAAP;AAOA;;AAED,OAAO,IAAMC,KAAK,GAAG,SAARA,KAAQ,CAAEC,GAAF,EAAW;AAC/BlB,EAAAA,QAAQ,GAAGkB,GAAX;AACAjB,EAAAA,MAAM,GAAG,CAAT;AACAC,EAAAA,MAAM,GAAG,EAAT;AACAC,EAAAA,KAAK,GAAG,EAAR;AACAC,EAAAA,SAAS,CAACe,SAAV,GAAsB,CAAtB;;AAEA,KAAG,CACF;AACA,GAFD,QAEUC,OAAO,EAFjB;;AAIA,SAAOlB,MAAP;AACA,CAZM;;AAcP,SAASkB,OAAT,GAAmB;AAClB,MAAMC,IAAI,GAAGC,SAAS,EAAtB;;AADkB,6BAEgDD,IAFhD;AAAA,MAEVE,SAFU;AAAA,MAECjB,SAFD;AAAA,MAEYC,KAFZ;AAAA,MAEmBiB,WAFnB;AAAA,MAEgCV,WAFhC;;AAGlB,MAAMW,UAAU,GAAGtB,KAAK,CAACuB,MAAzB,CAHkB,CAKlB;;AACA,MAAMV,gBAAgB,GAAKQ,WAAW,GAAGvB,MAAhB,GAA2BA,MAA3B,GAAoC,IAA7D;;AAEA,UAASsB,SAAT;AACC,SAAK,gBAAL;AACC;AACA,UAAK,MAAME,UAAX,EAAwB;AACvBE,QAAAA,WAAW;AACX,eAAO,KAAP;AACA,OALF,CAOC;AACA;AACA;AACA;AACA;AAEA;;;AACA,UAAK,MAAMF,UAAX,EAAwB;AACvBG,QAAAA,iBAAiB;AACjB,eAAO,KAAP;AACA,OAjBF,CAmBC;AACA;AACA;;;AACA,aAAQ,IAAIzB,KAAK,CAACuB,MAAlB,EAA2B;AAC1BE,QAAAA,iBAAiB;AACjB;;AACD,aAAO,KAAP;;AAED,SAAK,YAAL;AACC;AACA;AACA,UAAK,MAAMH,UAAX,EAAwB;AACvB,YAAK,SAAST,gBAAd,EAAiC;AAChCd,UAAAA,MAAM,CAAC2B,IAAP,CAAanB,QAAQ,CAAEV,QAAQ,CAAC8B,MAAT,CAAiBd,gBAAjB,EAAmCQ,WAAW,GAAGR,gBAAjD,CAAF,CAArB;AACA;;AACDd,QAAAA,MAAM,CAAC2B,IAAP,CAAaxB,KAAK,CAAEC,SAAF,EAAaC,KAAb,EAAoB,EAApB,EAAwB,EAAxB,CAAlB;AACAN,QAAAA,MAAM,GAAGuB,WAAW,GAAGV,WAAvB;AACA,eAAO,IAAP;AACA,OAVF,CAYC;;;AACAiB,MAAAA,aAAa,CACZ1B,KAAK,CAAEC,SAAF,EAAaC,KAAb,EAAoB,EAApB,EAAwB,EAAxB,CADO,EAEZiB,WAFY,EAGZV,WAHY,CAAb;AAKAb,MAAAA,MAAM,GAAGuB,WAAW,GAAGV,WAAvB;AACA,aAAO,IAAP;;AAED,SAAK,cAAL;AACC;AACAX,MAAAA,KAAK,CAAC0B,IAAN,CACClB,KAAK,CACJN,KAAK,CAAEC,SAAF,EAAaC,KAAb,EAAoB,EAApB,EAAwB,EAAxB,CADD,EAEJiB,WAFI,EAGJV,WAHI,EAIJU,WAAW,GAAGV,WAJV,EAKJE,gBALI,CADN;AASAf,MAAAA,MAAM,GAAGuB,WAAW,GAAGV,WAAvB;AACA,aAAO,IAAP;;AAED,SAAK,cAAL;AACC;AACA;AACA,UAAK,MAAMW,UAAX,EAAwB;AACvB;AACA;AACA;AACA;AACAE,QAAAA,WAAW;AACX,eAAO,KAAP;AACA,OAVF,CAYC;;;AACA,UAAK,MAAMF,UAAX,EAAwB;AACvBG,QAAAA,iBAAiB,CAAEJ,WAAF,CAAjB;AACAvB,QAAAA,MAAM,GAAGuB,WAAW,GAAGV,WAAvB;AACA,eAAO,IAAP;AACA,OAjBF,CAmBC;AACA;;;AACA,UAAMkB,QAAQ,GAAG7B,KAAK,CAAC8B,GAAN,EAAjB;AACAD,MAAAA,QAAQ,CAACpB,KAAT,CAAeH,SAAf,IAA4BT,QAAQ,CAAC8B,MAAT,CAC3BE,QAAQ,CAACjB,UADkB,EAE3BS,WAAW,GAAGQ,QAAQ,CAACjB,UAFI,CAA5B;AAIAiB,MAAAA,QAAQ,CAACjB,UAAT,GAAsBS,WAAW,GAAGV,WAApC;AAEAiB,MAAAA,aAAa,CACZC,QAAQ,CAACpB,KADG,EAEZoB,QAAQ,CAACnB,UAFG,EAGZmB,QAAQ,CAAClB,WAHG,EAIZU,WAAW,GAAGV,WAJF,CAAb;AAMAb,MAAAA,MAAM,GAAGuB,WAAW,GAAGV,WAAvB;AACA,aAAO,IAAP;;AAED;AACC;AACAa,MAAAA,WAAW;AACX,aAAO,KAAP;AAvGF;AAyGA;AAED;;;;;;;;;;;;AAUA,SAASO,SAAT,CAAoBC,KAApB,EAA4B;AAC3B,MAAI;AACH,WAAOC,IAAI,CAACnB,KAAL,CAAYkB,KAAZ,CAAP;AACA,GAFD,CAEE,OAAQE,CAAR,EAAY;AACb,WAAO,IAAP;AACA;AACD;;AAED,SAASf,SAAT,GAAqB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,MAAMgB,OAAO,GAAGlC,SAAS,CAACmC,IAAV,CAAgBvC,QAAhB,CAAhB,CAPoB,CASpB;;AACA,MAAK,SAASsC,OAAd,EAAwB;AACvB,WAAO,CAAE,gBAAF,CAAP;AACA;;AAED,MAAME,SAAS,GAAGF,OAAO,CAACG,KAA1B;;AAdoB,gCAe6DH,OAf7D;AAAA,MAeZI,KAfY;AAAA,MAeLC,WAfK;AAAA,MAeQC,cAfR;AAAA,MAewBC,SAfxB;AAAA,MAemCC,UAfnC;AAAA,MAe+CC,SAf/C;;AAiBpB,MAAMrB,MAAM,GAAGgB,KAAK,CAAChB,MAArB;AACA,MAAMsB,QAAQ,GAAG,CAAC,CAAEL,WAApB;AACA,MAAMM,MAAM,GAAG,CAAC,CAAEF,SAAlB;AACA,MAAMG,SAAS,GAAGN,cAAc,IAAI,OAApC;AACA,MAAMO,IAAI,GAAGD,SAAS,GAAGL,SAAzB;AACA,MAAMO,QAAQ,GAAG,CAAC,CAAEN,UAApB;AACA,MAAMvC,KAAK,GAAG6C,QAAQ,GAAGlB,SAAS,CAAEY,UAAF,CAAZ,GAA6B,EAAnD,CAvBoB,CAyBpB;AACA;;AACA,MAAKE,QAAQ,KAAMC,MAAM,IAAIG,QAAhB,CAAb,EAA0C,CACzC;AACA;AACA;;AAED,MAAKH,MAAL,EAAc;AACb,WAAO,CAAE,YAAF,EAAgBE,IAAhB,EAAsB5C,KAAtB,EAA6BiC,SAA7B,EAAwCd,MAAxC,CAAP;AACA;;AAED,MAAKsB,QAAL,EAAgB;AACf,WAAO,CAAE,cAAF,EAAkBG,IAAlB,EAAwB,IAAxB,EAA8BX,SAA9B,EAAyCd,MAAzC,CAAP;AACA;;AAED,SAAO,CAAE,cAAF,EAAkByB,IAAlB,EAAwB5C,KAAxB,EAA+BiC,SAA/B,EAA0Cd,MAA1C,CAAP;AACA;;AAED,SAASC,WAAT,CAAsB0B,SAAtB,EAAkC;AACjC,MAAM3B,MAAM,GAAG2B,SAAS,GAAGA,SAAH,GAAerD,QAAQ,CAAC0B,MAAT,GAAkBzB,MAAzD;;AAEA,MAAK,MAAMyB,MAAX,EAAoB;AACnB;AACA;;AAEDxB,EAAAA,MAAM,CAAC2B,IAAP,CAAanB,QAAQ,CAAEV,QAAQ,CAAC8B,MAAT,CAAiB7B,MAAjB,EAAyByB,MAAzB,CAAF,CAArB;AACA;;AAED,SAASK,aAAT,CAAwBnB,KAAxB,EAA+BC,UAA/B,EAA2CC,WAA3C,EAAwDwC,UAAxD,EAAqE;AACpE,MAAMC,MAAM,GAAGpD,KAAK,CAAEA,KAAK,CAACuB,MAAN,GAAe,CAAjB,CAApB;AACA6B,EAAAA,MAAM,CAAC3C,KAAP,CAAaJ,WAAb,CAAyBqB,IAAzB,CAA+BjB,KAA/B;AACA2C,EAAAA,MAAM,CAAC3C,KAAP,CAAaH,SAAb,IAA0BT,QAAQ,CAAC8B,MAAT,CACzByB,MAAM,CAACxC,UADkB,EAEzBF,UAAU,GAAG0C,MAAM,CAACxC,UAFK,CAA1B;AAIAwC,EAAAA,MAAM,CAACxC,UAAP,GAAoBuC,UAAU,GAAGA,UAAH,GAAgBzC,UAAU,GAAGC,WAA3D;AACA;;AAED,SAASc,iBAAT,CAA4B4B,SAA5B,EAAwC;AAAA,mBACqBrD,KAAK,CAAC8B,GAAN,EADrB;AAAA,MAC/BrB,KAD+B,cAC/BA,KAD+B;AAAA,MACxBI,gBADwB,cACxBA,gBADwB;AAAA,MACND,UADM,cACNA,UADM;AAAA,MACMF,UADN,cACMA,UADN;;AAGvC,MAAK2C,SAAL,EAAiB;AAChB5C,IAAAA,KAAK,CAACH,SAAN,IAAmBT,QAAQ,CAAC8B,MAAT,CAAiBf,UAAjB,EAA6ByC,SAAS,GAAGzC,UAAzC,CAAnB;AACA,GAFD,MAEO;AACNH,IAAAA,KAAK,CAACH,SAAN,IAAmBT,QAAQ,CAAC8B,MAAT,CAAiBf,UAAjB,CAAnB;AACA;;AAED,MAAK,SAASC,gBAAd,EAAiC;AAChCd,IAAAA,MAAM,CAAC2B,IAAP,CAAanB,QAAQ,CAAEV,QAAQ,CAAC8B,MAAT,CAAiBd,gBAAjB,EAAmCH,UAAU,GAAGG,gBAAhD,CAAF,CAArB;AACA;;AAEDd,EAAAA,MAAM,CAAC2B,IAAP,CAAajB,KAAb;AACA","sourcesContent":["let document;\nlet offset;\nlet output;\nlet stack;\nconst tokenizer = /<!--\\s+(\\/)?wp:([a-z][a-z0-9_-]*\\/)?([a-z][a-z0-9_-]*)\\s+({(?:(?!}\\s+-->)[^])+?}\\s+)?(\\/)?-->/g;\n\nfunction Block( blockName, attrs, innerBlocks, innerHTML ) {\n\treturn {\n\t\tblockName,\n\t\tattrs,\n\t\tinnerBlocks,\n\t\tinnerHTML,\n\t};\n}\n\nfunction Freeform( innerHTML ) {\n\treturn Block( null, {}, [], innerHTML );\n}\n\nfunction Frame( block, tokenStart, tokenLength, prevOffset, leadingHtmlStart ) {\n\treturn {\n\t\tblock,\n\t\ttokenStart,\n\t\ttokenLength,\n\t\tprevOffset: prevOffset || tokenStart + tokenLength,\n\t\tleadingHtmlStart,\n\t};\n}\n\nexport const parse = ( doc ) => {\n\tdocument = doc;\n\toffset = 0;\n\toutput = [];\n\tstack = [];\n\ttokenizer.lastIndex = 0;\n\n\tdo {\n\t\t// twiddle our thumbs\n\t} while ( proceed() );\n\n\treturn output;\n};\n\nfunction proceed() {\n\tconst next = nextToken();\n\tconst [ tokenType, blockName, attrs, startOffset, tokenLength ] = next;\n\tconst stackDepth = stack.length;\n\n\t// we may have some HTML soup before the next block\n\tconst leadingHtmlStart = ( startOffset > offset ) ? offset : null;\n\n\tswitch ( tokenType ) {\n\t\tcase 'no-more-tokens':\n\t\t\t// if not in a block then flush output\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise we have a problem\n\t\t\t// This is an error\n\t\t\t// we have options\n\t\t\t// - treat it all as freeform text\n\t\t\t// - assume an implicit closer (easiest when not nesting)\n\n\t\t\t// for the easy case we'll assume an implicit closer\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// for the nested case where it's more difficult we'll\n\t\t\t// have to assume that multiple closers are missing\n\t\t\t// and so we'll collapse the whole stack piecewise\n\t\t\twhile ( 0 < stack.length ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase 'void-block':\n\t\t\t// easy case is if we stumbled upon a void block\n\t\t\t// in the top-level of the document\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\tif ( null !== leadingHtmlStart ) {\n\t\t\t\t\toutput.push( Freeform( document.substr( leadingHtmlStart, startOffset - leadingHtmlStart ) ) );\n\t\t\t\t}\n\t\t\t\toutput.push( Block( blockName, attrs, [], '' ) );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we found an inner block\n\t\t\taddInnerBlock(\n\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\tstartOffset,\n\t\t\t\ttokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-opener':\n\t\t\t// track all newly-opened blocks on the stack\n\t\t\tstack.push(\n\t\t\t\tFrame(\n\t\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\t\tstartOffset,\n\t\t\t\t\ttokenLength,\n\t\t\t\t\tstartOffset + tokenLength,\n\t\t\t\t\tleadingHtmlStart,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-closer':\n\t\t\t// if we're missing an opener we're in trouble\n\t\t\t// This is an error\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\t// we have options\n\t\t\t\t// - assume an implicit opener\n\t\t\t\t// - assume _this_ is the opener\n\t\t\t\t// - give up and close out the document\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// if we're not nesting then this is easy - close the block\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack( startOffset );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we're nested and we have to close out the current\n\t\t\t// block and add it as a innerBlock to the parent\n\t\t\tconst stackTop = stack.pop();\n\t\t\tstackTop.block.innerHTML += document.substr(\n\t\t\t\tstackTop.prevOffset,\n\t\t\t\tstartOffset - stackTop.prevOffset,\n\t\t\t);\n\t\t\tstackTop.prevOffset = startOffset + tokenLength;\n\n\t\t\taddInnerBlock(\n\t\t\t\tstackTop.block,\n\t\t\t\tstackTop.tokenStart,\n\t\t\t\tstackTop.tokenLength,\n\t\t\t\tstartOffset + tokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\t// This is an error\n\t\t\taddFreeform();\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Parse JSON if valid, otherwise return null\n *\n * Note that JSON coming from the block comment\n * delimiters is constrained to be an object\n * and cannot be things like `true` or `null`\n *\n * @param {string} input JSON input string to parse\n * @return {Object|null} parsed JSON if valid\n */\nfunction parseJSON( input ) {\n\ttry {\n\t\treturn JSON.parse( input );\n\t} catch ( e ) {\n\t\treturn null;\n\t}\n}\n\nfunction nextToken() {\n\t// aye the magic\n\t// we're using a single RegExp to tokenize the block comment delimiters\n\t// we're also using a trick here because the only difference between a\n\t// block opener and a block closer is the leading `/` before `wp:` (and\n\t// a closer has no attributes). we can trap them both and process the\n\t// match back in Javascript to see which one it was.\n\tconst matches = tokenizer.exec( document );\n\n\t// we have no more tokens\n\tif ( null === matches ) {\n\t\treturn [ 'no-more-tokens' ];\n\t}\n\n\tconst startedAt = matches.index;\n\tconst [ match, closerMatch, namespaceMatch, nameMatch, attrsMatch, voidMatch ] = matches;\n\n\tconst length = match.length;\n\tconst isCloser = !! closerMatch;\n\tconst isVoid = !! voidMatch;\n\tconst namespace = namespaceMatch || 'core/';\n\tconst name = namespace + nameMatch;\n\tconst hasAttrs = !! attrsMatch;\n\tconst attrs = hasAttrs ? parseJSON( attrsMatch ) : {};\n\n\t// This state isn't allowed\n\t// This is an error\n\tif ( isCloser && ( isVoid || hasAttrs ) ) {\n\t\t// we can ignore them since they don't hurt anything\n\t\t// we may warn against this at some point or reject it\n\t}\n\n\tif ( isVoid ) {\n\t\treturn [ 'void-block', name, attrs, startedAt, length ];\n\t}\n\n\tif ( isCloser ) {\n\t\treturn [ 'block-closer', name, null, startedAt, length ];\n\t}\n\n\treturn [ 'block-opener', name, attrs, startedAt, length ];\n}\n\nfunction addFreeform( rawLength ) {\n\tconst length = rawLength ? rawLength : document.length - offset;\n\n\tif ( 0 === length ) {\n\t\treturn;\n\t}\n\n\toutput.push( Freeform( document.substr( offset, length ) ) );\n}\n\nfunction addInnerBlock( block, tokenStart, tokenLength, lastOffset ) {\n\tconst parent = stack[ stack.length - 1 ];\n\tparent.block.innerBlocks.push( block );\n\tparent.block.innerHTML += document.substr(\n\t\tparent.prevOffset,\n\t\ttokenStart - parent.prevOffset,\n\t);\n\tparent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength;\n}\n\nfunction addBlockFromStack( endOffset ) {\n\tconst { block, leadingHtmlStart, prevOffset, tokenStart } = stack.pop();\n\n\tif ( endOffset ) {\n\t\tblock.innerHTML += document.substr( prevOffset, endOffset - prevOffset );\n\t} else {\n\t\tblock.innerHTML += document.substr( prevOffset );\n\t}\n\n\tif ( null !== leadingHtmlStart ) {\n\t\toutput.push( Freeform( document.substr( leadingHtmlStart, tokenStart - leadingHtmlStart ) ) );\n\t}\n\n\toutput.push( block );\n}\n"]}
{"version":3,"sources":["/Users/pento/Projects/gutenberg/packages/block-serialization-default-parser/src/index.js"],"names":["document","offset","output","stack","tokenizer","Block","blockName","attrs","innerBlocks","innerHTML","Freeform","Frame","block","tokenStart","tokenLength","prevOffset","leadingHtmlStart","parse","doc","lastIndex","proceed","next","nextToken","tokenType","startOffset","stackDepth","length","addFreeform","addBlockFromStack","push","substr","addInnerBlock","stackTop","pop","parseJSON","input","JSON","e","matches","exec","startedAt","index","match","closerMatch","namespaceMatch","nameMatch","attrsMatch","voidMatch","isCloser","isVoid","namespace","name","hasAttrs","rawLength","lastOffset","parent","endOffset"],"mappings":"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","sourcesContent":["let document;\nlet offset;\nlet output;\nlet stack;\nconst tokenizer = /<!--\\s+(\\/)?wp:([a-z][a-z0-9_-]*\\/)?([a-z][a-z0-9_-]*)\\s+({(?:(?!}\\s+-->)[^])+?}\\s+)?(\\/)?-->/g;\n\nfunction Block( blockName, attrs, innerBlocks, innerHTML ) {\n\treturn {\n\t\tblockName,\n\t\tattrs,\n\t\tinnerBlocks,\n\t\tinnerHTML,\n\t};\n}\n\nfunction Freeform( innerHTML ) {\n\treturn Block( null, {}, [], innerHTML );\n}\n\nfunction Frame( block, tokenStart, tokenLength, prevOffset, leadingHtmlStart ) {\n\treturn {\n\t\tblock,\n\t\ttokenStart,\n\t\ttokenLength,\n\t\tprevOffset: prevOffset || tokenStart + tokenLength,\n\t\tleadingHtmlStart,\n\t};\n}\n\nexport const parse = ( doc ) => {\n\tdocument = doc;\n\toffset = 0;\n\toutput = [];\n\tstack = [];\n\ttokenizer.lastIndex = 0;\n\n\tdo {\n\t\t// twiddle our thumbs\n\t} while ( proceed() );\n\n\treturn output;\n};\n\nfunction proceed() {\n\tconst next = nextToken();\n\tconst [ tokenType, blockName, attrs, startOffset, tokenLength ] = next;\n\tconst stackDepth = stack.length;\n\n\t// we may have some HTML soup before the next block\n\tconst leadingHtmlStart = ( startOffset > offset ) ? offset : null;\n\n\tswitch ( tokenType ) {\n\t\tcase 'no-more-tokens':\n\t\t\t// if not in a block then flush output\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise we have a problem\n\t\t\t// This is an error\n\t\t\t// we have options\n\t\t\t// - treat it all as freeform text\n\t\t\t// - assume an implicit closer (easiest when not nesting)\n\n\t\t\t// for the easy case we'll assume an implicit closer\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// for the nested case where it's more difficult we'll\n\t\t\t// have to assume that multiple closers are missing\n\t\t\t// and so we'll collapse the whole stack piecewise\n\t\t\twhile ( 0 < stack.length ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase 'void-block':\n\t\t\t// easy case is if we stumbled upon a void block\n\t\t\t// in the top-level of the document\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\tif ( null !== leadingHtmlStart ) {\n\t\t\t\t\toutput.push( Freeform( document.substr( leadingHtmlStart, startOffset - leadingHtmlStart ) ) );\n\t\t\t\t}\n\t\t\t\toutput.push( Block( blockName, attrs, [], '' ) );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we found an inner block\n\t\t\taddInnerBlock(\n\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\tstartOffset,\n\t\t\t\ttokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-opener':\n\t\t\t// track all newly-opened blocks on the stack\n\t\t\tstack.push(\n\t\t\t\tFrame(\n\t\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\t\tstartOffset,\n\t\t\t\t\ttokenLength,\n\t\t\t\t\tstartOffset + tokenLength,\n\t\t\t\t\tleadingHtmlStart,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-closer':\n\t\t\t// if we're missing an opener we're in trouble\n\t\t\t// This is an error\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\t// we have options\n\t\t\t\t// - assume an implicit opener\n\t\t\t\t// - assume _this_ is the opener\n\t\t\t\t// - give up and close out the document\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// if we're not nesting then this is easy - close the block\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack( startOffset );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we're nested and we have to close out the current\n\t\t\t// block and add it as a innerBlock to the parent\n\t\t\tconst stackTop = stack.pop();\n\t\t\tstackTop.block.innerHTML += document.substr(\n\t\t\t\tstackTop.prevOffset,\n\t\t\t\tstartOffset - stackTop.prevOffset,\n\t\t\t);\n\t\t\tstackTop.prevOffset = startOffset + tokenLength;\n\n\t\t\taddInnerBlock(\n\t\t\t\tstackTop.block,\n\t\t\t\tstackTop.tokenStart,\n\t\t\t\tstackTop.tokenLength,\n\t\t\t\tstartOffset + tokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\t// This is an error\n\t\t\taddFreeform();\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Parse JSON if valid, otherwise return null\n *\n * Note that JSON coming from the block comment\n * delimiters is constrained to be an object\n * and cannot be things like `true` or `null`\n *\n * @param {string} input JSON input string to parse\n * @return {Object|null} parsed JSON if valid\n */\nfunction parseJSON( input ) {\n\ttry {\n\t\treturn JSON.parse( input );\n\t} catch ( e ) {\n\t\treturn null;\n\t}\n}\n\nfunction nextToken() {\n\t// aye the magic\n\t// we're using a single RegExp to tokenize the block comment delimiters\n\t// we're also using a trick here because the only difference between a\n\t// block opener and a block closer is the leading `/` before `wp:` (and\n\t// a closer has no attributes). we can trap them both and process the\n\t// match back in Javascript to see which one it was.\n\tconst matches = tokenizer.exec( document );\n\n\t// we have no more tokens\n\tif ( null === matches ) {\n\t\treturn [ 'no-more-tokens' ];\n\t}\n\n\tconst startedAt = matches.index;\n\tconst [ match, closerMatch, namespaceMatch, nameMatch, attrsMatch, voidMatch ] = matches;\n\n\tconst length = match.length;\n\tconst isCloser = !! closerMatch;\n\tconst isVoid = !! voidMatch;\n\tconst namespace = namespaceMatch || 'core/';\n\tconst name = namespace + nameMatch;\n\tconst hasAttrs = !! attrsMatch;\n\tconst attrs = hasAttrs ? parseJSON( attrsMatch ) : {};\n\n\t// This state isn't allowed\n\t// This is an error\n\tif ( isCloser && ( isVoid || hasAttrs ) ) {\n\t\t// we can ignore them since they don't hurt anything\n\t\t// we may warn against this at some point or reject it\n\t}\n\n\tif ( isVoid ) {\n\t\treturn [ 'void-block', name, attrs, startedAt, length ];\n\t}\n\n\tif ( isCloser ) {\n\t\treturn [ 'block-closer', name, null, startedAt, length ];\n\t}\n\n\treturn [ 'block-opener', name, attrs, startedAt, length ];\n}\n\nfunction addFreeform( rawLength ) {\n\tconst length = rawLength ? rawLength : document.length - offset;\n\n\tif ( 0 === length ) {\n\t\treturn;\n\t}\n\n\toutput.push( Freeform( document.substr( offset, length ) ) );\n}\n\nfunction addInnerBlock( block, tokenStart, tokenLength, lastOffset ) {\n\tconst parent = stack[ stack.length - 1 ];\n\tparent.block.innerBlocks.push( block );\n\tparent.block.innerHTML += document.substr(\n\t\tparent.prevOffset,\n\t\ttokenStart - parent.prevOffset,\n\t);\n\tparent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength;\n}\n\nfunction addBlockFromStack( endOffset ) {\n\tconst { block, leadingHtmlStart, prevOffset, tokenStart } = stack.pop();\n\n\tif ( endOffset ) {\n\t\tblock.innerHTML += document.substr( prevOffset, endOffset - prevOffset );\n\t} else {\n\t\tblock.innerHTML += document.substr( prevOffset );\n\t}\n\n\tif ( null !== leadingHtmlStart ) {\n\t\toutput.push( Freeform( document.substr( leadingHtmlStart, tokenStart - leadingHtmlStart ) ) );\n\t}\n\n\toutput.push( block );\n}\n"]}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/gziolo/PhpstormProjects/gutenberg/packages/block-serialization-default-parser/src/index.js"],"names":["document","offset","output","stack","tokenizer","Block","blockName","attrs","innerBlocks","innerHTML","Freeform","Frame","block","tokenStart","tokenLength","prevOffset","leadingHtmlStart","parse","doc","lastIndex","proceed","next","nextToken","tokenType","startOffset","stackDepth","length","addFreeform","addBlockFromStack","push","substr","addInnerBlock","stackTop","pop","parseJSON","input","JSON","e","matches","exec","startedAt","index","match","closerMatch","namespaceMatch","nameMatch","attrsMatch","voidMatch","isCloser","isVoid","namespace","name","hasAttrs","rawLength","lastOffset","parent","endOffset"],"mappings":"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","sourcesContent":["let document;\nlet offset;\nlet output;\nlet stack;\nconst tokenizer = /<!--\\s+(\\/)?wp:([a-z][a-z0-9_-]*\\/)?([a-z][a-z0-9_-]*)\\s+({(?:(?!}\\s+-->)[^])+?}\\s+)?(\\/)?-->/g;\n\nfunction Block( blockName, attrs, innerBlocks, innerHTML ) {\n\treturn {\n\t\tblockName,\n\t\tattrs,\n\t\tinnerBlocks,\n\t\tinnerHTML,\n\t};\n}\n\nfunction Freeform( innerHTML ) {\n\treturn Block( null, {}, [], innerHTML );\n}\n\nfunction Frame( block, tokenStart, tokenLength, prevOffset, leadingHtmlStart ) {\n\treturn {\n\t\tblock,\n\t\ttokenStart,\n\t\ttokenLength,\n\t\tprevOffset: prevOffset || tokenStart + tokenLength,\n\t\tleadingHtmlStart,\n\t};\n}\n\nexport const parse = ( doc ) => {\n\tdocument = doc;\n\toffset = 0;\n\toutput = [];\n\tstack = [];\n\ttokenizer.lastIndex = 0;\n\n\tdo {\n\t\t// twiddle our thumbs\n\t} while ( proceed() );\n\n\treturn output;\n};\n\nfunction proceed() {\n\tconst next = nextToken();\n\tconst [ tokenType, blockName, attrs, startOffset, tokenLength ] = next;\n\tconst stackDepth = stack.length;\n\n\t// we may have some HTML soup before the next block\n\tconst leadingHtmlStart = ( startOffset > offset ) ? offset : null;\n\n\tswitch ( tokenType ) {\n\t\tcase 'no-more-tokens':\n\t\t\t// if not in a block then flush output\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise we have a problem\n\t\t\t// This is an error\n\t\t\t// we have options\n\t\t\t// - treat it all as freeform text\n\t\t\t// - assume an implicit closer (easiest when not nesting)\n\n\t\t\t// for the easy case we'll assume an implicit closer\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// for the nested case where it's more difficult we'll\n\t\t\t// have to assume that multiple closers are missing\n\t\t\t// and so we'll collapse the whole stack piecewise\n\t\t\twhile ( 0 < stack.length ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase 'void-block':\n\t\t\t// easy case is if we stumbled upon a void block\n\t\t\t// in the top-level of the document\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\tif ( null !== leadingHtmlStart ) {\n\t\t\t\t\toutput.push( Freeform( document.substr( leadingHtmlStart, startOffset - leadingHtmlStart ) ) );\n\t\t\t\t}\n\t\t\t\toutput.push( Block( blockName, attrs, [], '' ) );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we found an inner block\n\t\t\taddInnerBlock(\n\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\tstartOffset,\n\t\t\t\ttokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-opener':\n\t\t\t// track all newly-opened blocks on the stack\n\t\t\tstack.push(\n\t\t\t\tFrame(\n\t\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\t\tstartOffset,\n\t\t\t\t\ttokenLength,\n\t\t\t\t\tstartOffset + tokenLength,\n\t\t\t\t\tleadingHtmlStart,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-closer':\n\t\t\t// if we're missing an opener we're in trouble\n\t\t\t// This is an error\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\t// we have options\n\t\t\t\t// - assume an implicit opener\n\t\t\t\t// - assume _this_ is the opener\n\t\t\t\t// - give up and close out the document\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// if we're not nesting then this is easy - close the block\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack( startOffset );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we're nested and we have to close out the current\n\t\t\t// block and add it as a innerBlock to the parent\n\t\t\tconst stackTop = stack.pop();\n\t\t\tstackTop.block.innerHTML += document.substr(\n\t\t\t\tstackTop.prevOffset,\n\t\t\t\tstartOffset - stackTop.prevOffset,\n\t\t\t);\n\t\t\tstackTop.prevOffset = startOffset + tokenLength;\n\n\t\t\taddInnerBlock(\n\t\t\t\tstackTop.block,\n\t\t\t\tstackTop.tokenStart,\n\t\t\t\tstackTop.tokenLength,\n\t\t\t\tstartOffset + tokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\t// This is an error\n\t\t\taddFreeform();\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Parse JSON if valid, otherwise return null\n *\n * Note that JSON coming from the block comment\n * delimiters is constrained to be an object\n * and cannot be things like `true` or `null`\n *\n * @param {string} input JSON input string to parse\n * @return {Object|null} parsed JSON if valid\n */\nfunction parseJSON( input ) {\n\ttry {\n\t\treturn JSON.parse( input );\n\t} catch ( e ) {\n\t\treturn null;\n\t}\n}\n\nfunction nextToken() {\n\t// aye the magic\n\t// we're using a single RegExp to tokenize the block comment delimiters\n\t// we're also using a trick here because the only difference between a\n\t// block opener and a block closer is the leading `/` before `wp:` (and\n\t// a closer has no attributes). we can trap them both and process the\n\t// match back in Javascript to see which one it was.\n\tconst matches = tokenizer.exec( document );\n\n\t// we have no more tokens\n\tif ( null === matches ) {\n\t\treturn [ 'no-more-tokens' ];\n\t}\n\n\tconst startedAt = matches.index;\n\tconst [ match, closerMatch, namespaceMatch, nameMatch, attrsMatch, voidMatch ] = matches;\n\n\tconst length = match.length;\n\tconst isCloser = !! closerMatch;\n\tconst isVoid = !! voidMatch;\n\tconst namespace = namespaceMatch || 'core/';\n\tconst name = namespace + nameMatch;\n\tconst hasAttrs = !! attrsMatch;\n\tconst attrs = hasAttrs ? parseJSON( attrsMatch ) : {};\n\n\t// This state isn't allowed\n\t// This is an error\n\tif ( isCloser && ( isVoid || hasAttrs ) ) {\n\t\t// we can ignore them since they don't hurt anything\n\t\t// we may warn against this at some point or reject it\n\t}\n\n\tif ( isVoid ) {\n\t\treturn [ 'void-block', name, attrs, startedAt, length ];\n\t}\n\n\tif ( isCloser ) {\n\t\treturn [ 'block-closer', name, null, startedAt, length ];\n\t}\n\n\treturn [ 'block-opener', name, attrs, startedAt, length ];\n}\n\nfunction addFreeform( rawLength ) {\n\tconst length = rawLength ? rawLength : document.length - offset;\n\n\tif ( 0 === length ) {\n\t\treturn;\n\t}\n\n\toutput.push( Freeform( document.substr( offset, length ) ) );\n}\n\nfunction addInnerBlock( block, tokenStart, tokenLength, lastOffset ) {\n\tconst parent = stack[ stack.length - 1 ];\n\tparent.block.innerBlocks.push( block );\n\tparent.block.innerHTML += document.substr(\n\t\tparent.prevOffset,\n\t\ttokenStart - parent.prevOffset,\n\t);\n\tparent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength;\n}\n\nfunction addBlockFromStack( endOffset ) {\n\tconst { block, leadingHtmlStart, prevOffset, tokenStart } = stack.pop();\n\n\tif ( endOffset ) {\n\t\tblock.innerHTML += document.substr( prevOffset, endOffset - prevOffset );\n\t} else {\n\t\tblock.innerHTML += document.substr( prevOffset );\n\t}\n\n\tif ( null !== leadingHtmlStart ) {\n\t\toutput.push( Freeform( document.substr( leadingHtmlStart, tokenStart - leadingHtmlStart ) ) );\n\t}\n\n\toutput.push( block );\n}\n"]}
{"version":3,"sources":["/Users/pento/Projects/gutenberg/packages/block-serialization-default-parser/src/index.js"],"names":["document","offset","output","stack","tokenizer","Block","blockName","attrs","innerBlocks","innerHTML","Freeform","Frame","block","tokenStart","tokenLength","prevOffset","leadingHtmlStart","parse","doc","lastIndex","proceed","next","nextToken","tokenType","startOffset","stackDepth","length","addFreeform","addBlockFromStack","push","substr","addInnerBlock","stackTop","pop","parseJSON","input","JSON","e","matches","exec","startedAt","index","match","closerMatch","namespaceMatch","nameMatch","attrsMatch","voidMatch","isCloser","isVoid","namespace","name","hasAttrs","rawLength","lastOffset","parent","endOffset"],"mappings":"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","sourcesContent":["let document;\nlet offset;\nlet output;\nlet stack;\nconst tokenizer = /<!--\\s+(\\/)?wp:([a-z][a-z0-9_-]*\\/)?([a-z][a-z0-9_-]*)\\s+({(?:(?!}\\s+-->)[^])+?}\\s+)?(\\/)?-->/g;\n\nfunction Block( blockName, attrs, innerBlocks, innerHTML ) {\n\treturn {\n\t\tblockName,\n\t\tattrs,\n\t\tinnerBlocks,\n\t\tinnerHTML,\n\t};\n}\n\nfunction Freeform( innerHTML ) {\n\treturn Block( null, {}, [], innerHTML );\n}\n\nfunction Frame( block, tokenStart, tokenLength, prevOffset, leadingHtmlStart ) {\n\treturn {\n\t\tblock,\n\t\ttokenStart,\n\t\ttokenLength,\n\t\tprevOffset: prevOffset || tokenStart + tokenLength,\n\t\tleadingHtmlStart,\n\t};\n}\n\nexport const parse = ( doc ) => {\n\tdocument = doc;\n\toffset = 0;\n\toutput = [];\n\tstack = [];\n\ttokenizer.lastIndex = 0;\n\n\tdo {\n\t\t// twiddle our thumbs\n\t} while ( proceed() );\n\n\treturn output;\n};\n\nfunction proceed() {\n\tconst next = nextToken();\n\tconst [ tokenType, blockName, attrs, startOffset, tokenLength ] = next;\n\tconst stackDepth = stack.length;\n\n\t// we may have some HTML soup before the next block\n\tconst leadingHtmlStart = ( startOffset > offset ) ? offset : null;\n\n\tswitch ( tokenType ) {\n\t\tcase 'no-more-tokens':\n\t\t\t// if not in a block then flush output\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise we have a problem\n\t\t\t// This is an error\n\t\t\t// we have options\n\t\t\t// - treat it all as freeform text\n\t\t\t// - assume an implicit closer (easiest when not nesting)\n\n\t\t\t// for the easy case we'll assume an implicit closer\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// for the nested case where it's more difficult we'll\n\t\t\t// have to assume that multiple closers are missing\n\t\t\t// and so we'll collapse the whole stack piecewise\n\t\t\twhile ( 0 < stack.length ) {\n\t\t\t\taddBlockFromStack();\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase 'void-block':\n\t\t\t// easy case is if we stumbled upon a void block\n\t\t\t// in the top-level of the document\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\tif ( null !== leadingHtmlStart ) {\n\t\t\t\t\toutput.push( Freeform( document.substr( leadingHtmlStart, startOffset - leadingHtmlStart ) ) );\n\t\t\t\t}\n\t\t\t\toutput.push( Block( blockName, attrs, [], '' ) );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we found an inner block\n\t\t\taddInnerBlock(\n\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\tstartOffset,\n\t\t\t\ttokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-opener':\n\t\t\t// track all newly-opened blocks on the stack\n\t\t\tstack.push(\n\t\t\t\tFrame(\n\t\t\t\t\tBlock( blockName, attrs, [], '' ),\n\t\t\t\t\tstartOffset,\n\t\t\t\t\ttokenLength,\n\t\t\t\t\tstartOffset + tokenLength,\n\t\t\t\t\tleadingHtmlStart,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tcase 'block-closer':\n\t\t\t// if we're missing an opener we're in trouble\n\t\t\t// This is an error\n\t\t\tif ( 0 === stackDepth ) {\n\t\t\t\t// we have options\n\t\t\t\t// - assume an implicit opener\n\t\t\t\t// - assume _this_ is the opener\n\t\t\t\t// - give up and close out the document\n\t\t\t\taddFreeform();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// if we're not nesting then this is easy - close the block\n\t\t\tif ( 1 === stackDepth ) {\n\t\t\t\taddBlockFromStack( startOffset );\n\t\t\t\toffset = startOffset + tokenLength;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// otherwise we're nested and we have to close out the current\n\t\t\t// block and add it as a innerBlock to the parent\n\t\t\tconst stackTop = stack.pop();\n\t\t\tstackTop.block.innerHTML += document.substr(\n\t\t\t\tstackTop.prevOffset,\n\t\t\t\tstartOffset - stackTop.prevOffset,\n\t\t\t);\n\t\t\tstackTop.prevOffset = startOffset + tokenLength;\n\n\t\t\taddInnerBlock(\n\t\t\t\tstackTop.block,\n\t\t\t\tstackTop.tokenStart,\n\t\t\t\tstackTop.tokenLength,\n\t\t\t\tstartOffset + tokenLength,\n\t\t\t);\n\t\t\toffset = startOffset + tokenLength;\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\t// This is an error\n\t\t\taddFreeform();\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Parse JSON if valid, otherwise return null\n *\n * Note that JSON coming from the block comment\n * delimiters is constrained to be an object\n * and cannot be things like `true` or `null`\n *\n * @param {string} input JSON input string to parse\n * @return {Object|null} parsed JSON if valid\n */\nfunction parseJSON( input ) {\n\ttry {\n\t\treturn JSON.parse( input );\n\t} catch ( e ) {\n\t\treturn null;\n\t}\n}\n\nfunction nextToken() {\n\t// aye the magic\n\t// we're using a single RegExp to tokenize the block comment delimiters\n\t// we're also using a trick here because the only difference between a\n\t// block opener and a block closer is the leading `/` before `wp:` (and\n\t// a closer has no attributes). we can trap them both and process the\n\t// match back in Javascript to see which one it was.\n\tconst matches = tokenizer.exec( document );\n\n\t// we have no more tokens\n\tif ( null === matches ) {\n\t\treturn [ 'no-more-tokens' ];\n\t}\n\n\tconst startedAt = matches.index;\n\tconst [ match, closerMatch, namespaceMatch, nameMatch, attrsMatch, voidMatch ] = matches;\n\n\tconst length = match.length;\n\tconst isCloser = !! closerMatch;\n\tconst isVoid = !! voidMatch;\n\tconst namespace = namespaceMatch || 'core/';\n\tconst name = namespace + nameMatch;\n\tconst hasAttrs = !! attrsMatch;\n\tconst attrs = hasAttrs ? parseJSON( attrsMatch ) : {};\n\n\t// This state isn't allowed\n\t// This is an error\n\tif ( isCloser && ( isVoid || hasAttrs ) ) {\n\t\t// we can ignore them since they don't hurt anything\n\t\t// we may warn against this at some point or reject it\n\t}\n\n\tif ( isVoid ) {\n\t\treturn [ 'void-block', name, attrs, startedAt, length ];\n\t}\n\n\tif ( isCloser ) {\n\t\treturn [ 'block-closer', name, null, startedAt, length ];\n\t}\n\n\treturn [ 'block-opener', name, attrs, startedAt, length ];\n}\n\nfunction addFreeform( rawLength ) {\n\tconst length = rawLength ? rawLength : document.length - offset;\n\n\tif ( 0 === length ) {\n\t\treturn;\n\t}\n\n\toutput.push( Freeform( document.substr( offset, length ) ) );\n}\n\nfunction addInnerBlock( block, tokenStart, tokenLength, lastOffset ) {\n\tconst parent = stack[ stack.length - 1 ];\n\tparent.block.innerBlocks.push( block );\n\tparent.block.innerHTML += document.substr(\n\t\tparent.prevOffset,\n\t\ttokenStart - parent.prevOffset,\n\t);\n\tparent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength;\n}\n\nfunction addBlockFromStack( endOffset ) {\n\tconst { block, leadingHtmlStart, prevOffset, tokenStart } = stack.pop();\n\n\tif ( endOffset ) {\n\t\tblock.innerHTML += document.substr( prevOffset, endOffset - prevOffset );\n\t} else {\n\t\tblock.innerHTML += document.substr( prevOffset );\n\t}\n\n\tif ( null !== leadingHtmlStart ) {\n\t\toutput.push( Freeform( document.substr( leadingHtmlStart, tokenStart - leadingHtmlStart ) ) );\n\t}\n\n\toutput.push( block );\n}\n"]}

@@ -0,3 +1,7 @@

## 1.0.2 (2018-11-03)
## 1.0.1 (2018-10-11)
## 1.0.0 (2018-09-30)
- Initial release.
{
"name": "@wordpress/block-serialization-default-parser",
"version": "1.0.1",
"version": "1.0.2",
"description": "Block serialization specification parser for WordPress posts.",

@@ -26,6 +26,9 @@ "author": "The WordPress Contributors",

},
"devDependencies": {
"@wordpress/block-serialization-spec-parser": "^1.0.4"
},
"publishConfig": {
"access": "public"
},
"gitHead": "0aa5c4340f57a69ab935f9e819d74958aad2e022"
"gitHead": "c86e4d3d80109f594975d84afc932fd3edf4b790"
}
/**
* External dependencies
*/
import path from 'path';
/**
* Internal dependencies
*/
import { jsTester, phpTester } from '@wordpress/block-serialization-spec-parser';
import { parse } from '../';
describe( 'block-serialization-spec-parser', () => {
test( 'parse() accepts inputs with multiple Reusable blocks', () => {
const result = parse(
'<!-- wp:block {"ref":313} /--><!-- wp:block {"ref":482} /-->'
);
describe( 'block-serialization-default-parser-js', jsTester( parse ) );
expect( result ).toEqual( [
{
blockName: 'core/block',
attrs: { ref: 313 },
innerBlocks: [],
innerHTML: '',
},
{
blockName: 'core/block',
attrs: { ref: 482 },
innerBlocks: [],
innerHTML: '',
},
] );
} );
test( 'treats void blocks and empty blocks identically', () => {
expect( parse(
'<!-- wp:block /-->'
) ).toEqual( parse(
'<!-- wp:block --><!-- /wp:block -->'
) );
expect( parse(
'<!-- wp:my/bus { "is": "fast" } /-->'
) ).toEqual( parse(
'<!-- wp:my/bus { "is": "fast" } --><!-- /wp:my/bus -->'
) );
} );
test( 'should grab HTML soup before block openers', () => {
[
'<p>Break me</p><!-- wp:block /-->',
'<p>Break me</p><!-- wp:block --><!-- /wp:block -->',
].forEach( ( input ) => expect( parse( input ) ).toEqual( [
expect.objectContaining( { innerHTML: '<p>Break me</p>' } ),
expect.objectContaining( { blockName: 'core/block', innerHTML: '' } ),
] ) );
} );
test( 'should grab HTML soup before inner block openers', () => {
[
'<!-- wp:outer --><p>Break me</p><!-- wp:block /--><!-- /wp:outer -->',
'<!-- wp:outer --><p>Break me</p><!-- wp:block --><!-- /wp:block --><!-- /wp:outer -->',
].forEach( ( input ) => expect( parse( input ) ).toEqual( [
expect.objectContaining( {
innerBlocks: [ expect.objectContaining( { blockName: 'core/block', innerHTML: '' } ) ],
innerHTML: '<p>Break me</p>',
} ),
] ) );
} );
test( 'should grab HTML soup after blocks', () => {
[
'<!-- wp:block /--><p>Break me</p>',
'<!-- wp:block --><!-- /wp:block --><p>Break me</p>',
].forEach( ( input ) => expect( parse( input ) ).toEqual( [
expect.objectContaining( { blockName: 'core/block', innerHTML: '' } ),
expect.objectContaining( { innerHTML: '<p>Break me</p>' } ),
] ) );
} );
} );
phpTester( 'block-serialization-default-parser-php', path.join( __dirname, 'test-parser.php' ) );