react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / htmlparser2 / node_modules / domutils / node_modules / dom-serializer / index.js
81153 views/*1Module dependencies2*/3var ElementType = require('domelementtype');4var entities = require('entities');56/*7Boolean Attributes8*/9var booleanAttributes = {10__proto__: null,11allowfullscreen: true,12async: true,13autofocus: true,14autoplay: true,15checked: true,16controls: true,17default: true,18defer: true,19disabled: true,20hidden: true,21ismap: true,22loop: true,23multiple: true,24muted: true,25open: true,26readonly: true,27required: true,28reversed: true,29scoped: true,30seamless: true,31selected: true,32typemustmatch: true33};3435var unencodedElements = {36__proto__: null,37style: true,38script: true,39xmp: true,40iframe: true,41noembed: true,42noframes: true,43plaintext: true,44noscript: true45};4647/*48Format attributes49*/50function formatAttrs(attributes, opts) {51if (!attributes) return;5253var output = '',54value;5556// Loop through the attributes57for (var key in attributes) {58value = attributes[key];59if (output) {60output += ' ';61}6263if (!value && booleanAttributes[key]) {64output += key;65} else {66output += key + '="' + (opts.decodeEntities ? entities.encodeXML(value) : value) + '"';67}68}6970return output;71}7273/*74Self-enclosing tags (stolen from node-htmlparser)75*/76var singleTag = {77__proto__: null,78area: true,79base: true,80basefont: true,81br: true,82col: true,83command: true,84embed: true,85frame: true,86hr: true,87img: true,88input: true,89isindex: true,90keygen: true,91link: true,92meta: true,93param: true,94source: true,95track: true,96wbr: true,97};9899100var render = module.exports = function(dom, opts) {101if (!Array.isArray(dom) && !dom.cheerio) dom = [dom];102opts = opts || {};103104var output = '';105106for(var i = 0; i < dom.length; i++){107var elem = dom[i];108109if (elem.type === 'root')110output += render(elem.children, opts);111else if (ElementType.isTag(elem))112output += renderTag(elem, opts);113else if (elem.type === ElementType.Directive)114output += renderDirective(elem);115else if (elem.type === ElementType.Comment)116output += renderComment(elem);117else if (elem.type === ElementType.CDATA)118output += renderCdata(elem);119else120output += renderText(elem, opts);121}122123return output;124};125126function renderTag(elem, opts) {127// Handle SVG128if (elem.name === "svg") opts = {decodeEntities: opts.decodeEntities, xmlMode: true};129130var tag = '<' + elem.name,131attribs = formatAttrs(elem.attribs, opts);132133if (attribs) {134tag += ' ' + attribs;135}136137if (138opts.xmlMode139&& (!elem.children || elem.children.length === 0)140) {141tag += '/>';142} else {143tag += '>';144if (elem.children) {145tag += render(elem.children, opts);146}147148if (!singleTag[elem.name] || opts.xmlMode) {149tag += '</' + elem.name + '>';150}151}152153return tag;154}155156function renderDirective(elem) {157return '<' + elem.data + '>';158}159160function renderText(elem, opts) {161var data = elem.data || '';162163// if entities weren't decoded, no need to encode them back164if (opts.decodeEntities && !(elem.parent && elem.parent.name in unencodedElements)) {165data = entities.encodeXML(data);166}167168return data;169}170171function renderCdata(elem) {172return '<![CDATA[' + elem.children[0].data + ']]>';173}174175function renderComment(elem) {176return '<!--' + elem.data + '-->';177}178179180