@lottiefiles/relottie-parse
Version:
Parse Lottie JSON format to LAST
112 lines (110 loc) • 3.73 kB
JavaScript
import { traverseJsonExit, traverseJsonEnter } from './chunk-IIN7RTEO.js';
import { fileConstants } from './chunk-X5PT7L37.js';
import { Stack } from './chunk-VD77DRXR.js';
import { __publicField } from './chunk-V6TY7KAL.js';
import { traverse } from '@humanwhocodes/momoa';
import { TITLES } from '@lottiefiles/last';
var { element: ET, string: ST } = TITLES;
var Slots = class {
constructor(vfile, options) {
/**
* SlotID.value to ParentTitle mapping
*/
__publicField(this, "idTitles", /* @__PURE__ */ new Map());
/**
* Copy of all the SlotProperty nodes
*/
__publicField(this, "slotProperties", []);
/**
* Parser's VFile instance
*/
__publicField(this, "_file");
/**
* Parser's options
*/
__publicField(this, "_options");
this._file = vfile;
this._options = options;
}
/**
* Mutates SlotProperty node titles based on the SlotID value and its parent title
*
* @returns void
*/
mutateNodeTitles() {
const file = this._file;
const options = this._options;
for (const { jsonNode, node } of this.slotProperties) {
node.title = ET.slot;
const valueNode = node.children[0];
if (valueNode === void 0) continue;
const nodeKey = typeof node.key === "string" ? node.key : node.key.value;
const slotPropertyTitle = this.idTitles.get(nodeKey);
if (slotPropertyTitle === void 0) continue;
const stack = new Stack();
stack.push(node);
traverse(jsonNode, {
enter(currNode, parentNode) {
if (!parentNode) return;
traverseJsonEnter(currNode, parentNode, stack, file, options);
if (parentNode.type === "Member" && currNode.type === "Object" && parentNode.name.type === "String" && parentNode.name.value === `p`) {
const slotPropertyValueNode = stack.peek();
if (slotPropertyValueNode?.type !== "object") return;
slotPropertyValueNode.title = slotPropertyTitle;
}
},
exit(currNode, parentNode) {
if (!parentNode) return;
traverseJsonExit(currNode, parentNode, stack, file, options);
}
});
}
}
/**
* Collects SlotIdNode value and its parent title
*
* @param node - SlotID node
* @param parentNode - SlotID parent node
* @returns void
* @throws
* - collects vfile message if slotPropertyNode.value is not a string
* - collects vfile message if slotPropertyNode.value is already defined with a different title
*/
setIdTitle(node, parentNode) {
if (node.title !== ST.slotId) return;
const valueNode = node.children[0];
if (valueNode === void 0) return;
const id = valueNode.value;
if (typeof id !== "string") {
this._file.message(`slotProperty node.value must be a string`, node, fileConstants.sourceId);
return;
}
const title = this.idTitles.get(id);
const parentTitle = parentNode.title;
if (title === void 0) {
this.idTitles.set(id, parentTitle);
} else if (title !== parentTitle) {
this._file.message(
`SlotProperty (${id}) target's title already defined as "${title}", setting "${parentTitle}" is not possible.`,
node,
fileConstants.sourceId
);
}
}
/**
* Collects SlotProperty nodes
*
* @param node - SlotProperty node
* @param parent - SlotProperty parent node
* @param jsonNode - SlotProperty node in the JsonAST
* @returns void
*/
setNode(node, parent, jsonNode) {
if (parent.title === `${ET.slots}`) {
this.slotProperties.push({ node, jsonNode });
}
}
};
export { Slots };
//# sourceMappingURL=chunk-OZZ2WDEQ.js.map
//# sourceMappingURL=chunk-OZZ2WDEQ.js.map