@wordpress/element
Version:
Element React module for WordPress.
189 lines (187 loc) • 5.96 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// packages/element/src/create-interpolate-element.ts
var create_interpolate_element_exports = {};
__export(create_interpolate_element_exports, {
default: () => create_interpolate_element_default
});
module.exports = __toCommonJS(create_interpolate_element_exports);
var import_react = require("./react.cjs");
var indoc;
var offset;
var output;
var stack;
var tokenizer = /<(\/)?(\w+)\s*(\/)?>/g;
function createFrame(element, tokenStart, tokenLength, prevOffset, leadingTextStart) {
return {
element,
tokenStart,
tokenLength,
prevOffset,
leadingTextStart,
children: []
};
}
function createInterpolateElement(interpolatedString, conversionMap) {
indoc = interpolatedString;
offset = 0;
output = [];
stack = [];
tokenizer.lastIndex = 0;
if (!isValidConversionMap(conversionMap)) {
throw new TypeError(
"The conversionMap provided is not valid. It must be an object with values that are React Elements"
);
}
do {
} while (proceed(conversionMap));
return (0, import_react.createElement)(import_react.Fragment, null, ...output);
}
var isValidConversionMap = (conversionMap) => {
const isObject = typeof conversionMap === "object" && conversionMap !== null;
const values = isObject && Object.values(conversionMap);
return isObject && values.length > 0 && values.every((element) => (0, import_react.isValidElement)(element));
};
function proceed(conversionMap) {
const next = nextToken();
const [tokenType, name, startOffset, tokenLength] = next;
const stackDepth = stack.length;
const leadingTextStart = startOffset > offset ? offset : null;
if (name && !conversionMap[name]) {
addText();
return false;
}
switch (tokenType) {
case "no-more-tokens":
if (stackDepth !== 0) {
const { leadingTextStart: stackLeadingText, tokenStart } = stack.pop();
output.push(indoc.substr(stackLeadingText, tokenStart));
}
addText();
return false;
case "self-closed":
if (0 === stackDepth) {
if (null !== leadingTextStart) {
output.push(
indoc.substr(
leadingTextStart,
startOffset - leadingTextStart
)
);
}
output.push(conversionMap[name]);
offset = startOffset + tokenLength;
return true;
}
addChild(
createFrame(conversionMap[name], startOffset, tokenLength)
);
offset = startOffset + tokenLength;
return true;
case "opener":
stack.push(
createFrame(
conversionMap[name],
startOffset,
tokenLength,
startOffset + tokenLength,
leadingTextStart
)
);
offset = startOffset + tokenLength;
return true;
case "closer":
if (1 === stackDepth) {
closeOuterElement(startOffset);
offset = startOffset + tokenLength;
return true;
}
const stackTop = stack.pop();
const text = indoc.substr(
stackTop.prevOffset,
startOffset - stackTop.prevOffset
);
stackTop.children.push(text);
stackTop.prevOffset = startOffset + tokenLength;
const frame = createFrame(
stackTop.element,
stackTop.tokenStart,
stackTop.tokenLength,
startOffset + tokenLength
);
frame.children = stackTop.children;
addChild(frame);
offset = startOffset + tokenLength;
return true;
default:
addText();
return false;
}
}
function nextToken() {
const matches = tokenizer.exec(indoc);
if (null === matches) {
return ["no-more-tokens"];
}
const startedAt = matches.index;
const [match, isClosing, name, isSelfClosed] = matches;
const length = match.length;
if (isSelfClosed) {
return ["self-closed", name, startedAt, length];
}
if (isClosing) {
return ["closer", name, startedAt, length];
}
return ["opener", name, startedAt, length];
}
function addText() {
const length = indoc.length - offset;
if (0 === length) {
return;
}
output.push(indoc.substr(offset, length));
}
function addChild(frame) {
const { element, tokenStart, tokenLength, prevOffset, children } = frame;
const parent = stack[stack.length - 1];
const text = indoc.substr(
parent.prevOffset,
tokenStart - parent.prevOffset
);
if (text) {
parent.children.push(text);
}
parent.children.push((0, import_react.cloneElement)(element, null, ...children));
parent.prevOffset = prevOffset ? prevOffset : tokenStart + tokenLength;
}
function closeOuterElement(endOffset) {
const { element, leadingTextStart, prevOffset, tokenStart, children } = stack.pop();
const text = endOffset ? indoc.substr(prevOffset, endOffset - prevOffset) : indoc.substr(prevOffset);
if (text) {
children.push(text);
}
if (null !== leadingTextStart) {
output.push(
indoc.substr(leadingTextStart, tokenStart - leadingTextStart)
);
}
output.push((0, import_react.cloneElement)(element, null, ...children));
}
var create_interpolate_element_default = createInterpolateElement;
//# sourceMappingURL=create-interpolate-element.cjs.map