@ng-doc/core
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>
76 lines • 3.41 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.NgDocHtmlParser = void 0;
const CSSWhat = require("css-what");
const css_what_1 = require("css-what");
const posthtml_parser_1 = require("posthtml-parser");
const posthtml_render_1 = require("posthtml-render");
const helpers_1 = require("../helpers");
class NgDocHtmlParser {
constructor(html) {
this.html = html;
this.parsedHTML = (0, posthtml_parser_1.parser)(this.html);
}
find(selector) {
const selectors = CSSWhat.parse(selector)[0];
const tagSelectors = selectors.filter((selector) => selector.type === css_what_1.SelectorType.Tag);
const attrSelectors = selectors.filter((selector) => selector.type === css_what_1.SelectorType.Attribute);
const nodes = [...this.parsedHTML];
while (nodes.length) {
const shiftNode = nodes.shift();
const node = !(0, helpers_1.isPresent)(shiftNode) || !(0, helpers_1.isNodeTag)(shiftNode) ? undefined : shiftNode;
const tagSelectorMatch = tagSelectors.every((tagSelector) => tagSelector.name.toLowerCase() === String(node?.tag).toLowerCase()) || !tagSelectors.length;
const attrSelectorsMatch = attrSelectors.every((attrSelector) => {
const nodeAttrs = node?.attrs ?? {};
const hasAttr = Object.keys(nodeAttrs).includes(attrSelector.name) ||
Object.keys(nodeAttrs).includes(`[${attrSelector.name}]`);
const attrValue = nodeAttrs[attrSelector.name] ?? nodeAttrs[`[${attrSelector.name}]`];
return (hasAttr && !attrSelector.value) || attrValue === attrSelector.value;
}) || !attrSelectors.length;
if (tagSelectorMatch && attrSelectorsMatch) {
return node;
}
else {
nodes.push(...(0, helpers_1.asArray)(node?.content).flat());
}
}
return undefined;
}
removeAttribute(node, name) {
if ((0, helpers_1.isNodeTag)(node) && Object.keys(node?.attrs ?? {}).includes(name) && node.attrs) {
delete node.attrs[name];
}
if ((0, helpers_1.isNodeTag)(node) && Object.keys(node?.attrs ?? {}).includes(`[${name}]`) && node.attrs) {
delete node.attrs[`[${name}]`];
}
}
setAttribute(node, name, value) {
if ((0, helpers_1.isNodeTag)(node)) {
if (!node.attrs) {
node.attrs = {};
}
node.attrs[name] = value ?? '';
}
}
setAttributesFromSelectors(element, selectors) {
const elementAttrs = element.attrs ?? {};
selectors.forEach((selector) => {
if (selector.type === 'attribute' &&
!elementAttrs[selector.name] &&
!elementAttrs[`[${selector.name}]`]) {
this.setAttribute(element, selector.name, selector.value);
}
});
}
fillAngularAttributes(element, properties) {
(0, helpers_1.objectKeys)(properties).forEach((key) => {
this.removeAttribute(element, String(key));
this.setAttribute(element, `[${String(key)}]`, properties[key]);
});
}
serialize() {
return (0, posthtml_render_1.render)(this.parsedHTML);
}
}
exports.NgDocHtmlParser = NgDocHtmlParser;
//# sourceMappingURL=html-parser.js.map
;