|
1 this["wp"] = this["wp"] || {}; this["wp"]["blockSerializationDefaultParser"] = |
|
2 /******/ (function(modules) { // webpackBootstrap |
|
3 /******/ // The module cache |
|
4 /******/ var installedModules = {}; |
|
5 /******/ |
|
6 /******/ // The require function |
|
7 /******/ function __webpack_require__(moduleId) { |
|
8 /******/ |
|
9 /******/ // Check if module is in cache |
|
10 /******/ if(installedModules[moduleId]) { |
|
11 /******/ return installedModules[moduleId].exports; |
|
12 /******/ } |
|
13 /******/ // Create a new module (and put it into the cache) |
|
14 /******/ var module = installedModules[moduleId] = { |
|
15 /******/ i: moduleId, |
|
16 /******/ l: false, |
|
17 /******/ exports: {} |
|
18 /******/ }; |
|
19 /******/ |
|
20 /******/ // Execute the module function |
|
21 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); |
|
22 /******/ |
|
23 /******/ // Flag the module as loaded |
|
24 /******/ module.l = true; |
|
25 /******/ |
|
26 /******/ // Return the exports of the module |
|
27 /******/ return module.exports; |
|
28 /******/ } |
|
29 /******/ |
|
30 /******/ |
|
31 /******/ // expose the modules object (__webpack_modules__) |
|
32 /******/ __webpack_require__.m = modules; |
|
33 /******/ |
|
34 /******/ // expose the module cache |
|
35 /******/ __webpack_require__.c = installedModules; |
|
36 /******/ |
|
37 /******/ // define getter function for harmony exports |
|
38 /******/ __webpack_require__.d = function(exports, name, getter) { |
|
39 /******/ if(!__webpack_require__.o(exports, name)) { |
|
40 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); |
|
41 /******/ } |
|
42 /******/ }; |
|
43 /******/ |
|
44 /******/ // define __esModule on exports |
|
45 /******/ __webpack_require__.r = function(exports) { |
|
46 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
|
47 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
|
48 /******/ } |
|
49 /******/ Object.defineProperty(exports, '__esModule', { value: true }); |
|
50 /******/ }; |
|
51 /******/ |
|
52 /******/ // create a fake namespace object |
|
53 /******/ // mode & 1: value is a module id, require it |
|
54 /******/ // mode & 2: merge all properties of value into the ns |
|
55 /******/ // mode & 4: return value when already ns object |
|
56 /******/ // mode & 8|1: behave like require |
|
57 /******/ __webpack_require__.t = function(value, mode) { |
|
58 /******/ if(mode & 1) value = __webpack_require__(value); |
|
59 /******/ if(mode & 8) return value; |
|
60 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; |
|
61 /******/ var ns = Object.create(null); |
|
62 /******/ __webpack_require__.r(ns); |
|
63 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); |
|
64 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); |
|
65 /******/ return ns; |
|
66 /******/ }; |
|
67 /******/ |
|
68 /******/ // getDefaultExport function for compatibility with non-harmony modules |
|
69 /******/ __webpack_require__.n = function(module) { |
|
70 /******/ var getter = module && module.__esModule ? |
|
71 /******/ function getDefault() { return module['default']; } : |
|
72 /******/ function getModuleExports() { return module; }; |
|
73 /******/ __webpack_require__.d(getter, 'a', getter); |
|
74 /******/ return getter; |
|
75 /******/ }; |
|
76 /******/ |
|
77 /******/ // Object.prototype.hasOwnProperty.call |
|
78 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; |
|
79 /******/ |
|
80 /******/ // __webpack_public_path__ |
|
81 /******/ __webpack_require__.p = ""; |
|
82 /******/ |
|
83 /******/ |
|
84 /******/ // Load entry module and return exports |
|
85 /******/ return __webpack_require__(__webpack_require__.s = 258); |
|
86 /******/ }) |
|
87 /************************************************************************/ |
|
88 /******/ ({ |
|
89 |
|
90 /***/ 258: |
|
91 /***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
92 |
|
93 "use strict"; |
|
94 __webpack_require__.r(__webpack_exports__); |
|
95 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; }); |
|
96 /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28); |
|
97 |
|
98 var document; |
|
99 var offset; |
|
100 var output; |
|
101 var stack; |
|
102 /** |
|
103 * Matches block comment delimiters |
|
104 * |
|
105 * While most of this pattern is straightforward the attribute parsing |
|
106 * incorporates a tricks to make sure we don't choke on specific input |
|
107 * |
|
108 * - since JavaScript has no possessive quantifier or atomic grouping |
|
109 * we are emulating it with a trick |
|
110 * |
|
111 * we want a possessive quantifier or atomic group to prevent backtracking |
|
112 * on the `}`s should we fail to match the remainder of the pattern |
|
113 * |
|
114 * we can emulate this with a positive lookahead and back reference |
|
115 * (a++)*c === ((?=(a+))\1)*c |
|
116 * |
|
117 * let's examine an example: |
|
118 * - /(a+)*c/.test('aaaaaaaaaaaaad') fails after over 49,000 steps |
|
119 * - /(a++)*c/.test('aaaaaaaaaaaaad') fails after 85 steps |
|
120 * - /(?>a+)*c/.test('aaaaaaaaaaaaad') fails after 126 steps |
|
121 * |
|
122 * this is because the possessive `++` and the atomic group `(?>)` |
|
123 * tell the engine that all those `a`s belong together as a single group |
|
124 * and so it won't split it up when stepping backwards to try and match |
|
125 * |
|
126 * if we use /((?=(a+))\1)*c/ then we get the same behavior as the atomic group |
|
127 * or possessive and prevent the backtracking because the `a+` is matched but |
|
128 * not captured. thus, we find the long string of `a`s and remember it, then |
|
129 * reference it as a whole unit inside our pattern |
|
130 * |
|
131 * @cite http://instanceof.me/post/52245507631/regex-emulate-atomic-grouping-with-lookahead |
|
132 * @cite http://blog.stevenlevithan.com/archives/mimic-atomic-groups |
|
133 * @cite https://javascript.info/regexp-infinite-backtracking-problem |
|
134 * |
|
135 * once browsers reliably support atomic grouping or possessive |
|
136 * quantifiers natively we should remove this trick and simplify |
|
137 * |
|
138 * @type RegExp |
|
139 * |
|
140 * @since 3.8.0 |
|
141 * @since 4.6.1 added optimization to prevent backtracking on attribute parsing |
|
142 */ |
|
143 |
|
144 var tokenizer = /<!--\s+(\/)?wp:([a-z][a-z0-9_-]*\/)?([a-z][a-z0-9_-]*)\s+({(?:(?=([^}]+|}+(?=})|(?!}\s+\/?-->)[^])*)\5|[^]*?)}\s+)?(\/)?-->/g; |
|
145 |
|
146 function Block(blockName, attrs, innerBlocks, innerHTML, innerContent) { |
|
147 return { |
|
148 blockName: blockName, |
|
149 attrs: attrs, |
|
150 innerBlocks: innerBlocks, |
|
151 innerHTML: innerHTML, |
|
152 innerContent: innerContent |
|
153 }; |
|
154 } |
|
155 |
|
156 function Freeform(innerHTML) { |
|
157 return Block(null, {}, [], innerHTML, [innerHTML]); |
|
158 } |
|
159 |
|
160 function Frame(block, tokenStart, tokenLength, prevOffset, leadingHtmlStart) { |
|
161 return { |
|
162 block: block, |
|
163 tokenStart: tokenStart, |
|
164 tokenLength: tokenLength, |
|
165 prevOffset: prevOffset || tokenStart + tokenLength, |
|
166 leadingHtmlStart: leadingHtmlStart |
|
167 }; |
|
168 } |
|
169 /** |
|
170 * Parser function, that converts input HTML into a block based structure. |
|
171 * |
|
172 * @param {string} doc The HTML document to parse. |
|
173 * |
|
174 * @example |
|
175 * Input post: |
|
176 * ```html |
|
177 * <!-- wp:columns {"columns":3} --> |
|
178 * <div class="wp-block-columns has-3-columns"><!-- wp:column --> |
|
179 * <div class="wp-block-column"><!-- wp:paragraph --> |
|
180 * <p>Left</p> |
|
181 * <!-- /wp:paragraph --></div> |
|
182 * <!-- /wp:column --> |
|
183 * |
|
184 * <!-- wp:column --> |
|
185 * <div class="wp-block-column"><!-- wp:paragraph --> |
|
186 * <p><strong>Middle</strong></p> |
|
187 * <!-- /wp:paragraph --></div> |
|
188 * <!-- /wp:column --> |
|
189 * |
|
190 * <!-- wp:column --> |
|
191 * <div class="wp-block-column"></div> |
|
192 * <!-- /wp:column --></div> |
|
193 * <!-- /wp:columns --> |
|
194 * ``` |
|
195 * |
|
196 * Parsing code: |
|
197 * ```js |
|
198 * import { parse } from '@wordpress/block-serialization-default-parser'; |
|
199 * |
|
200 * parse( post ) === [ |
|
201 * { |
|
202 * blockName: "core/columns", |
|
203 * attrs: { |
|
204 * columns: 3 |
|
205 * }, |
|
206 * innerBlocks: [ |
|
207 * { |
|
208 * blockName: "core/column", |
|
209 * attrs: null, |
|
210 * innerBlocks: [ |
|
211 * { |
|
212 * blockName: "core/paragraph", |
|
213 * attrs: null, |
|
214 * innerBlocks: [], |
|
215 * innerHTML: "\n<p>Left</p>\n" |
|
216 * } |
|
217 * ], |
|
218 * innerHTML: '\n<div class="wp-block-column"></div>\n' |
|
219 * }, |
|
220 * { |
|
221 * blockName: "core/column", |
|
222 * attrs: null, |
|
223 * innerBlocks: [ |
|
224 * { |
|
225 * blockName: "core/paragraph", |
|
226 * attrs: null, |
|
227 * innerBlocks: [], |
|
228 * innerHTML: "\n<p><strong>Middle</strong></p>\n" |
|
229 * } |
|
230 * ], |
|
231 * innerHTML: '\n<div class="wp-block-column"></div>\n' |
|
232 * }, |
|
233 * { |
|
234 * blockName: "core/column", |
|
235 * attrs: null, |
|
236 * innerBlocks: [], |
|
237 * innerHTML: '\n<div class="wp-block-column"></div>\n' |
|
238 * } |
|
239 * ], |
|
240 * innerHTML: '\n<div class="wp-block-columns has-3-columns">\n\n\n\n</div>\n' |
|
241 * } |
|
242 * ]; |
|
243 * ``` |
|
244 * @return {Array} A block-based representation of the input HTML. |
|
245 */ |
|
246 |
|
247 |
|
248 var parse = function parse(doc) { |
|
249 document = doc; |
|
250 offset = 0; |
|
251 output = []; |
|
252 stack = []; |
|
253 tokenizer.lastIndex = 0; |
|
254 |
|
255 do {// twiddle our thumbs |
|
256 } while (proceed()); |
|
257 |
|
258 return output; |
|
259 }; |
|
260 |
|
261 function proceed() { |
|
262 var next = nextToken(); |
|
263 |
|
264 var _next = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(next, 5), |
|
265 tokenType = _next[0], |
|
266 blockName = _next[1], |
|
267 attrs = _next[2], |
|
268 startOffset = _next[3], |
|
269 tokenLength = _next[4]; |
|
270 |
|
271 var stackDepth = stack.length; // we may have some HTML soup before the next block |
|
272 |
|
273 var leadingHtmlStart = startOffset > offset ? offset : null; |
|
274 |
|
275 switch (tokenType) { |
|
276 case 'no-more-tokens': |
|
277 // if not in a block then flush output |
|
278 if (0 === stackDepth) { |
|
279 addFreeform(); |
|
280 return false; |
|
281 } // Otherwise we have a problem |
|
282 // This is an error |
|
283 // we have options |
|
284 // - treat it all as freeform text |
|
285 // - assume an implicit closer (easiest when not nesting) |
|
286 // for the easy case we'll assume an implicit closer |
|
287 |
|
288 |
|
289 if (1 === stackDepth) { |
|
290 addBlockFromStack(); |
|
291 return false; |
|
292 } // for the nested case where it's more difficult we'll |
|
293 // have to assume that multiple closers are missing |
|
294 // and so we'll collapse the whole stack piecewise |
|
295 |
|
296 |
|
297 while (0 < stack.length) { |
|
298 addBlockFromStack(); |
|
299 } |
|
300 |
|
301 return false; |
|
302 |
|
303 case 'void-block': |
|
304 // easy case is if we stumbled upon a void block |
|
305 // in the top-level of the document |
|
306 if (0 === stackDepth) { |
|
307 if (null !== leadingHtmlStart) { |
|
308 output.push(Freeform(document.substr(leadingHtmlStart, startOffset - leadingHtmlStart))); |
|
309 } |
|
310 |
|
311 output.push(Block(blockName, attrs, [], '', [])); |
|
312 offset = startOffset + tokenLength; |
|
313 return true; |
|
314 } // otherwise we found an inner block |
|
315 |
|
316 |
|
317 addInnerBlock(Block(blockName, attrs, [], '', []), startOffset, tokenLength); |
|
318 offset = startOffset + tokenLength; |
|
319 return true; |
|
320 |
|
321 case 'block-opener': |
|
322 // track all newly-opened blocks on the stack |
|
323 stack.push(Frame(Block(blockName, attrs, [], '', []), startOffset, tokenLength, startOffset + tokenLength, leadingHtmlStart)); |
|
324 offset = startOffset + tokenLength; |
|
325 return true; |
|
326 |
|
327 case 'block-closer': |
|
328 // if we're missing an opener we're in trouble |
|
329 // This is an error |
|
330 if (0 === stackDepth) { |
|
331 // we have options |
|
332 // - assume an implicit opener |
|
333 // - assume _this_ is the opener |
|
334 // - give up and close out the document |
|
335 addFreeform(); |
|
336 return false; |
|
337 } // if we're not nesting then this is easy - close the block |
|
338 |
|
339 |
|
340 if (1 === stackDepth) { |
|
341 addBlockFromStack(startOffset); |
|
342 offset = startOffset + tokenLength; |
|
343 return true; |
|
344 } // otherwise we're nested and we have to close out the current |
|
345 // block and add it as a innerBlock to the parent |
|
346 |
|
347 |
|
348 var stackTop = stack.pop(); |
|
349 var html = document.substr(stackTop.prevOffset, startOffset - stackTop.prevOffset); |
|
350 stackTop.block.innerHTML += html; |
|
351 stackTop.block.innerContent.push(html); |
|
352 stackTop.prevOffset = startOffset + tokenLength; |
|
353 addInnerBlock(stackTop.block, stackTop.tokenStart, stackTop.tokenLength, startOffset + tokenLength); |
|
354 offset = startOffset + tokenLength; |
|
355 return true; |
|
356 |
|
357 default: |
|
358 // This is an error |
|
359 addFreeform(); |
|
360 return false; |
|
361 } |
|
362 } |
|
363 /** |
|
364 * Parse JSON if valid, otherwise return null |
|
365 * |
|
366 * Note that JSON coming from the block comment |
|
367 * delimiters is constrained to be an object |
|
368 * and cannot be things like `true` or `null` |
|
369 * |
|
370 * @param {string} input JSON input string to parse |
|
371 * @return {Object|null} parsed JSON if valid |
|
372 */ |
|
373 |
|
374 |
|
375 function parseJSON(input) { |
|
376 try { |
|
377 return JSON.parse(input); |
|
378 } catch (e) { |
|
379 return null; |
|
380 } |
|
381 } |
|
382 |
|
383 function nextToken() { |
|
384 // aye the magic |
|
385 // we're using a single RegExp to tokenize the block comment delimiters |
|
386 // we're also using a trick here because the only difference between a |
|
387 // block opener and a block closer is the leading `/` before `wp:` (and |
|
388 // a closer has no attributes). we can trap them both and process the |
|
389 // match back in Javascript to see which one it was. |
|
390 var matches = tokenizer.exec(document); // we have no more tokens |
|
391 |
|
392 if (null === matches) { |
|
393 return ['no-more-tokens']; |
|
394 } |
|
395 |
|
396 var startedAt = matches.index; |
|
397 |
|
398 var _matches = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(matches, 7), |
|
399 match = _matches[0], |
|
400 closerMatch = _matches[1], |
|
401 namespaceMatch = _matches[2], |
|
402 nameMatch = _matches[3], |
|
403 attrsMatch = _matches[4], |
|
404 |
|
405 /* internal/unused */ |
|
406 voidMatch = _matches[6]; |
|
407 |
|
408 var length = match.length; |
|
409 var isCloser = !!closerMatch; |
|
410 var isVoid = !!voidMatch; |
|
411 var namespace = namespaceMatch || 'core/'; |
|
412 var name = namespace + nameMatch; |
|
413 var hasAttrs = !!attrsMatch; |
|
414 var attrs = hasAttrs ? parseJSON(attrsMatch) : {}; // This state isn't allowed |
|
415 // This is an error |
|
416 |
|
417 if (isCloser && (isVoid || hasAttrs)) {// we can ignore them since they don't hurt anything |
|
418 // we may warn against this at some point or reject it |
|
419 } |
|
420 |
|
421 if (isVoid) { |
|
422 return ['void-block', name, attrs, startedAt, length]; |
|
423 } |
|
424 |
|
425 if (isCloser) { |
|
426 return ['block-closer', name, null, startedAt, length]; |
|
427 } |
|
428 |
|
429 return ['block-opener', name, attrs, startedAt, length]; |
|
430 } |
|
431 |
|
432 function addFreeform(rawLength) { |
|
433 var length = rawLength ? rawLength : document.length - offset; |
|
434 |
|
435 if (0 === length) { |
|
436 return; |
|
437 } |
|
438 |
|
439 output.push(Freeform(document.substr(offset, length))); |
|
440 } |
|
441 |
|
442 function addInnerBlock(block, tokenStart, tokenLength, lastOffset) { |
|
443 var parent = stack[stack.length - 1]; |
|
444 parent.block.innerBlocks.push(block); |
|
445 var html = document.substr(parent.prevOffset, tokenStart - parent.prevOffset); |
|
446 |
|
447 if (html) { |
|
448 parent.block.innerHTML += html; |
|
449 parent.block.innerContent.push(html); |
|
450 } |
|
451 |
|
452 parent.block.innerContent.push(null); |
|
453 parent.prevOffset = lastOffset ? lastOffset : tokenStart + tokenLength; |
|
454 } |
|
455 |
|
456 function addBlockFromStack(endOffset) { |
|
457 var _stack$pop = stack.pop(), |
|
458 block = _stack$pop.block, |
|
459 leadingHtmlStart = _stack$pop.leadingHtmlStart, |
|
460 prevOffset = _stack$pop.prevOffset, |
|
461 tokenStart = _stack$pop.tokenStart; |
|
462 |
|
463 var html = endOffset ? document.substr(prevOffset, endOffset - prevOffset) : document.substr(prevOffset); |
|
464 |
|
465 if (html) { |
|
466 block.innerHTML += html; |
|
467 block.innerContent.push(html); |
|
468 } |
|
469 |
|
470 if (null !== leadingHtmlStart) { |
|
471 output.push(Freeform(document.substr(leadingHtmlStart, tokenStart - leadingHtmlStart))); |
|
472 } |
|
473 |
|
474 output.push(block); |
|
475 } |
|
476 |
|
477 |
|
478 /***/ }), |
|
479 |
|
480 /***/ 28: |
|
481 /***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
482 |
|
483 "use strict"; |
|
484 |
|
485 // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js |
|
486 var arrayWithHoles = __webpack_require__(37); |
|
487 |
|
488 // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js |
|
489 function _iterableToArrayLimit(arr, i) { |
|
490 var _arr = []; |
|
491 var _n = true; |
|
492 var _d = false; |
|
493 var _e = undefined; |
|
494 |
|
495 try { |
|
496 for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { |
|
497 _arr.push(_s.value); |
|
498 |
|
499 if (i && _arr.length === i) break; |
|
500 } |
|
501 } catch (err) { |
|
502 _d = true; |
|
503 _e = err; |
|
504 } finally { |
|
505 try { |
|
506 if (!_n && _i["return"] != null) _i["return"](); |
|
507 } finally { |
|
508 if (_d) throw _e; |
|
509 } |
|
510 } |
|
511 |
|
512 return _arr; |
|
513 } |
|
514 // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js |
|
515 var nonIterableRest = __webpack_require__(38); |
|
516 |
|
517 // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js |
|
518 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _slicedToArray; }); |
|
519 |
|
520 |
|
521 |
|
522 function _slicedToArray(arr, i) { |
|
523 return Object(arrayWithHoles["a" /* default */])(arr) || _iterableToArrayLimit(arr, i) || Object(nonIterableRest["a" /* default */])(); |
|
524 } |
|
525 |
|
526 /***/ }), |
|
527 |
|
528 /***/ 37: |
|
529 /***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
530 |
|
531 "use strict"; |
|
532 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _arrayWithHoles; }); |
|
533 function _arrayWithHoles(arr) { |
|
534 if (Array.isArray(arr)) return arr; |
|
535 } |
|
536 |
|
537 /***/ }), |
|
538 |
|
539 /***/ 38: |
|
540 /***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
541 |
|
542 "use strict"; |
|
543 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _nonIterableRest; }); |
|
544 function _nonIterableRest() { |
|
545 throw new TypeError("Invalid attempt to destructure non-iterable instance"); |
|
546 } |
|
547 |
|
548 /***/ }) |
|
549 |
|
550 /******/ }); |