| "use strict"; | 
| var __assign = (this && this.__assign) || function () { | 
|     __assign = Object.assign || function(t) { | 
|         for (var s, i = 1, n = arguments.length; i < n; i++) { | 
|             s = arguments[i]; | 
|             for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | 
|                 t[p] = s[p]; | 
|         } | 
|         return t; | 
|     }; | 
|     return __assign.apply(this, arguments); | 
| }; | 
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | 
|     if (k2 === undefined) k2 = k; | 
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | 
| }) : (function(o, m, k, k2) { | 
|     if (k2 === undefined) k2 = k; | 
|     o[k2] = m[k]; | 
| })); | 
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | 
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | 
| }) : function(o, v) { | 
|     o["default"] = v; | 
| }); | 
| var __importStar = (this && this.__importStar) || function (mod) { | 
|     if (mod && mod.__esModule) return mod; | 
|     var result = {}; | 
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | 
|     __setModuleDefault(result, mod); | 
|     return result; | 
| }; | 
| Object.defineProperty(exports, "__esModule", { value: true }); | 
| /* | 
|  * Module dependencies | 
|  */ | 
| var ElementType = __importStar(require("domelementtype")); | 
| var entities_1 = require("entities"); | 
| /** | 
|  * Mixed-case SVG and MathML tags & attributes | 
|  * recognized by the HTML parser. | 
|  * | 
|  * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign | 
|  */ | 
| var foreignNames_1 = require("./foreignNames"); | 
| var unencodedElements = new Set([ | 
|     "style", | 
|     "script", | 
|     "xmp", | 
|     "iframe", | 
|     "noembed", | 
|     "noframes", | 
|     "plaintext", | 
|     "noscript", | 
| ]); | 
| /** | 
|  * Format attributes | 
|  */ | 
| function formatAttributes(attributes, opts) { | 
|     if (!attributes) | 
|         return; | 
|     return Object.keys(attributes) | 
|         .map(function (key) { | 
|         var _a, _b; | 
|         var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : ""; | 
|         if (opts.xmlMode === "foreign") { | 
|             /* Fix up mixed-case attribute names */ | 
|             key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key; | 
|         } | 
|         if (!opts.emptyAttrs && !opts.xmlMode && value === "") { | 
|             return key; | 
|         } | 
|         return key + "=\"" + (opts.decodeEntities !== false | 
|             ? entities_1.encodeXML(value) | 
|             : value.replace(/"/g, """)) + "\""; | 
|     }) | 
|         .join(" "); | 
| } | 
| /** | 
|  * Self-enclosing tags | 
|  */ | 
| var singleTag = new Set([ | 
|     "area", | 
|     "base", | 
|     "basefont", | 
|     "br", | 
|     "col", | 
|     "command", | 
|     "embed", | 
|     "frame", | 
|     "hr", | 
|     "img", | 
|     "input", | 
|     "isindex", | 
|     "keygen", | 
|     "link", | 
|     "meta", | 
|     "param", | 
|     "source", | 
|     "track", | 
|     "wbr", | 
| ]); | 
| /** | 
|  * Renders a DOM node or an array of DOM nodes to a string. | 
|  * | 
|  * Can be thought of as the equivalent of the `outerHTML` of the passed node(s). | 
|  * | 
|  * @param node Node to be rendered. | 
|  * @param options Changes serialization behavior | 
|  */ | 
| function render(node, options) { | 
|     if (options === void 0) { options = {}; } | 
|     var nodes = "length" in node ? node : [node]; | 
|     var output = ""; | 
|     for (var i = 0; i < nodes.length; i++) { | 
|         output += renderNode(nodes[i], options); | 
|     } | 
|     return output; | 
| } | 
| exports.default = render; | 
| function renderNode(node, options) { | 
|     switch (node.type) { | 
|         case ElementType.Root: | 
|             return render(node.children, options); | 
|         case ElementType.Directive: | 
|         case ElementType.Doctype: | 
|             return renderDirective(node); | 
|         case ElementType.Comment: | 
|             return renderComment(node); | 
|         case ElementType.CDATA: | 
|             return renderCdata(node); | 
|         case ElementType.Script: | 
|         case ElementType.Style: | 
|         case ElementType.Tag: | 
|             return renderTag(node, options); | 
|         case ElementType.Text: | 
|             return renderText(node, options); | 
|     } | 
| } | 
| var foreignModeIntegrationPoints = new Set([ | 
|     "mi", | 
|     "mo", | 
|     "mn", | 
|     "ms", | 
|     "mtext", | 
|     "annotation-xml", | 
|     "foreignObject", | 
|     "desc", | 
|     "title", | 
| ]); | 
| var foreignElements = new Set(["svg", "math"]); | 
| function renderTag(elem, opts) { | 
|     var _a; | 
|     // Handle SVG / MathML in HTML | 
|     if (opts.xmlMode === "foreign") { | 
|         /* Fix up mixed-case element names */ | 
|         elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name; | 
|         /* Exit foreign mode at integration points */ | 
|         if (elem.parent && | 
|             foreignModeIntegrationPoints.has(elem.parent.name)) { | 
|             opts = __assign(__assign({}, opts), { xmlMode: false }); | 
|         } | 
|     } | 
|     if (!opts.xmlMode && foreignElements.has(elem.name)) { | 
|         opts = __assign(__assign({}, opts), { xmlMode: "foreign" }); | 
|     } | 
|     var tag = "<" + elem.name; | 
|     var attribs = formatAttributes(elem.attribs, opts); | 
|     if (attribs) { | 
|         tag += " " + attribs; | 
|     } | 
|     if (elem.children.length === 0 && | 
|         (opts.xmlMode | 
|             ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags | 
|                 opts.selfClosingTags !== false | 
|             : // User explicitly asked for self-closing tags, even in HTML mode | 
|                 opts.selfClosingTags && singleTag.has(elem.name))) { | 
|         if (!opts.xmlMode) | 
|             tag += " "; | 
|         tag += "/>"; | 
|     } | 
|     else { | 
|         tag += ">"; | 
|         if (elem.children.length > 0) { | 
|             tag += render(elem.children, opts); | 
|         } | 
|         if (opts.xmlMode || !singleTag.has(elem.name)) { | 
|             tag += "</" + elem.name + ">"; | 
|         } | 
|     } | 
|     return tag; | 
| } | 
| function renderDirective(elem) { | 
|     return "<" + elem.data + ">"; | 
| } | 
| function renderText(elem, opts) { | 
|     var data = elem.data || ""; | 
|     // If entities weren't decoded, no need to encode them back | 
|     if (opts.decodeEntities !== false && | 
|         !(!opts.xmlMode && | 
|             elem.parent && | 
|             unencodedElements.has(elem.parent.name))) { | 
|         data = entities_1.encodeXML(data); | 
|     } | 
|     return data; | 
| } | 
| function renderCdata(elem) { | 
|     return "<![CDATA[" + elem.children[0].data + "]]>"; | 
| } | 
| function renderComment(elem) { | 
|     return "<!--" + elem.data + "-->"; | 
| } |