react / wstein / node_modules / jest-cli / node_modules / jsdom / lib / jsdom / browser / domtohtml.js
80684 views//List from htmlparser21var voidElements = {2area: true,3base: true,4basefont: true,5br: true,6col: true,7command: true,8embed: true,9frame: true,10hr: true,11img: true,12input: true,13isindex: true,14keygen: true,15link: true,16meta: true,17param: true,18source: true,19track: true,20wbr: true21};2223var expr = {24upperCaseChars: /([A-Z])/g,25breakBetweenTags: /(<(\/?\w+).*?>)(?=<(?!\/\2))/gi,26voidElement: (function() {27var tags = [];28for (var i in voidElements) {29tags.push(i);30}31return new RegExp('<' + tags.join('|<'), 'i');32})()33};3435var uncanon = function(str, letter) {36return '-' + letter.toLowerCase();37};3839var HTMLEncode = require('./htmlencoding').HTMLEncode;4041exports.stringifyElement = function stringifyElement(element) {42var tagName = element.tagName.toLowerCase(),43ret = {44start: "<" + tagName,45end:''46},47attributes = [],48i,49attribute = null;5051if (element.attributes.length) {52ret.start += " ";53for (i = 0; i<element.attributes.length; i++) {54attribute = element.attributes.item(i);55attributes.push(attribute.name + '="' +56HTMLEncode(attribute.nodeValue, true) + '"');57}58}59ret.start += attributes.join(" ");6061if (voidElements[tagName]) {62ret.start += ">";63ret.end = '';64} else {65ret.start += ">";66ret.end = "</" + tagName + ">";67}6869return ret;70};7172var rawTextElements = /SCRIPT|STYLE/i;7374function stringifyDoctype (doctype) {75if (doctype.ownerDocument && doctype.ownerDocument._fullDT) {76return doctype.ownerDocument._fullDT;77}7879var dt = '<!DOCTYPE ' + doctype.name;80if (doctype.publicId) {81// Public ID may never contain double quotes, so this is always safe.82dt += ' PUBLIC "' + doctype.publicId + '" ';83}84if (!doctype.publicId && doctype.systemId) {85dt += ' SYSTEM ';86}87if (doctype.systemId) {88// System ID may contain double quotes OR single quotes, not never both.89if (doctype.systemId.indexOf('"') > -1) {90dt += "'" + doctype.systemId + "'";91} else {92dt += '"' + doctype.systemId + '"';93}94}95dt += '>';96return dt;97}9899exports.makeHtmlGenerator = function makeHtmlGenerator(indentUnit, eol) {100indentUnit = indentUnit || "";101eol = eol || "";102103return function generateHtmlRecursive(node, rawText, curIndent) {104var ret = "", parent, current, i;105curIndent = curIndent || "";106if (node) {107if (node.nodeType &&108node.nodeType === node.ENTITY_REFERENCE_NODE) {109node = node._entity;110}111112var childNodesRawText = rawText || rawTextElements.test(node.nodeName);113114switch (node.nodeType) {115case node.ELEMENT_NODE:116current = exports.stringifyElement(node);117if (childNodesRawText) {118ret += curIndent + current.start;119} else {120ret += curIndent + current.start;121}122var len = node._childNodes.length;123if (len > 0) {124if (node._childNodes[0].nodeType !== node.TEXT_NODE) {125ret += eol;126}127for (i=0; i<len; i++) {128ret += generateHtmlRecursive(node._childNodes[i], childNodesRawText, curIndent + indentUnit);129}130if (node._childNodes[len - 1].nodeType !== node.TEXT_NODE) {131ret += curIndent;132}133ret += current.end + eol;134} else {135ret += ((rawText ? node.nodeValue : HTMLEncode(node.nodeValue, false)) || '') + current.end + eol;136}137break;138case node.TEXT_NODE:139// Skip pure whitespace nodes if we're indenting140if (!indentUnit || !/^[\s\n]*$/.test(node.nodeValue)) {141ret += (rawText ? node.nodeValue : HTMLEncode(node.nodeValue, false)) || '';142}143break;144case node.COMMENT_NODE:145ret += curIndent + '<!--' + node.nodeValue + '-->' + eol;146break;147case node.DOCUMENT_NODE:148for (i=0; i<node._childNodes.length; i++) {149ret += generateHtmlRecursive(node._childNodes[i], childNodesRawText, curIndent);150}151break;152case node.DOCUMENT_TYPE_NODE:153ret += stringifyDoctype(node);154break;155}156}157return ret;158};159};160161exports.domToHtml = function(dom, noformat, raw) {162var htmlGenerator = exports.makeHtmlGenerator(noformat ? "" : " ",163noformat ? "" : "\n");164if (dom._toArray) {165// node list166dom = dom._toArray();167}168if (typeof dom.length !== 'undefined') {169var ret = "";170for (var i=0,len=dom.length; i<len; i++) {171ret += htmlGenerator(dom[i], raw);172}173return ret;174} else {175// single node176return htmlGenerator(dom, raw);177}178};179180181