UNPKG

@podlite/schema

Version:

AST tools for Podlite markup language

62 lines 2.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeInterator = exports.isSemanticBlock = void 0; const makeQuery_1 = require("./helpers/makeQuery"); // skip warnings for semantic blocks function isSemanticBlock(node) { const name = node.name || ''; const isTypeBlock = (node.type || '') === 'block'; return isTypeBlock && name === name.toUpperCase(); } exports.isSemanticBlock = isSemanticBlock; function flattenDeep(arr) { return arr.reduce((acc, val) => (Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val)), []); } const makeInterator = rule => { let rules = []; function use(key, fn) { if (key instanceof Array) { console.warn(`[podlite-interator] Unsupported param for ${key}`); } if (key instanceof Object) { for (var prop in key) { if (key.hasOwnProperty(prop)) { use(prop, key[prop]); } } return []; } rules.push((0, makeQuery_1.makeRule)((0, makeQuery_1.makePlug)(key), fn)); } function visiter(node, context = {}) { if (node instanceof Array) { return flattenDeep(node.map(item => visiter(item, context))).filter(Boolean); } if ('string' === typeof node) { // convert string to lex node with type return visiter({ type: 'text', value: node }, context); return node; } // get first rule for this node const reversed = rules.slice(); reversed.reverse(); const ruleIndex = reversed.findIndex(rule => rule.isFor(node)); if (ruleIndex !== -1) { return reversed[ruleIndex].fn(node, context, visiter); } else { // not found rule const newNode = { ...node }; if (newNode.hasOwnProperty('content')) { newNode.content = visiter(newNode.content, context); } return newNode; } } use(rule); visiter.rules = rules; return visiter; }; exports.makeInterator = makeInterator; exports.default = exports.makeInterator; //# sourceMappingURL=ast-inerator.js.map