legacy/vendor/mithril-generative-trust.js
import m from 'mithril';
/**
* Convert a string to HTML entities
*/
String.prototype.toHtmlEntities = function() {
return this.replace(/./gm, function(s) {
return "&#" + s.charCodeAt(0) + ";";
});
};
/**
* Create string from HTML entities
*/
String.fromHtmlEntities = function(string) {
return (string+"").replace(/&#\d+;/gm,function(s) {
return String.fromCharCode(s.match(/\d+/gm)[0]);
})
};
/**
* @typedef {{tag: string, key: string, attrs: Object, children: VNode[], text: string, dom: Document, domSize: number, state: string, events: any[], instance: Document}} VNode
*/
/**
* @description Generates a mithril component tree based on parsed HTML provided.
* @param {string} text
* @param {{tagsToFilter:string[], tagsFilterIsWhitelist:boolean, eliminateScriptTags:boolean = true}} options
* @returns {VNode}
*/
export default function generativeTrust(text = '', options = {}, renderer = m) {
const parser = new DOMParser();
const parsedDom = parser.parseFromString(text, 'text/html');
const children = parsedDom.body.childNodes;
if (children.length > 0) {
return createElementsFromDom(children, renderer);
} else {
return htmlentities(text);
}
}
/**
* @typedef RenderedNode
* @property
*/
/**
* @param {NodeList} nodes
* @param {(string, Object, RenderedNode | string) => RenderedNode} renderer
*/
function createElementsFromDom(nodes, renderer) {
const elements = [];
for (let i = 0; i < nodes.length; i++) {
const child = nodes.item(i);
switch(child.nodeName) {
case '#text': {
elements.push(child.textContent);
break;
}
default: {
elements.push(createElementFromDom(child, renderer));
break;
}
}
}
return elements;
}
/**
*
* @param {Node} node
* @param {(string, Object, RenderedNode | string) => RenderedNode} renderer
*/
function createElementFromDom(node, renderer) {
const hasChildren = node.childNodes.length > 0;
if (hasChildren) {
return renderer(node.nodeName, createAttributesObject(node), createElementsFromDom(node.childNodes, renderer));
} else {
return renderer(node.nodeName, createAttributesObject(node));
}
}
/**
*
* @param {Node} node
*/
function createAttributesObject(node) {
const attributesObject = {};
/** @type {NamedNodeMap} */
const attributes = node.attributes;
for (let i = 0; i < attributes.length; i++) {
const attrib = attributes.item(i);
attributesObject[attrib.name] = attrib.value;
}
return attributesObject;
}
function htmlentities(text) {
return text
.replace(/\"/gi, '"')
.replace(/\'/gi, '\'')
.replace(/\&/gi, '&')
.replace(/\</gi, '<')
.replace(/\>/gi, '>')
.replace(/\ /gi, ' ')
.replace(/\¡/gi, '¡')
.replace(/\¢/gi, '¢')
.replace(/\£/gi, '£')
.replace(/\¤/gi, '¤')
.replace(/\¥/gi, '¥')
.replace(/\¦/gi, '¦')
.replace(/\§/gi, '§')
.replace(/\¨/gi, '¨')
.replace(/\©/gi, '©')
.replace(/\ª/gi, 'ª')
.replace(/\«/gi, '«')
.replace(/\¬/gi, '¬')
.replace(/\­/gi, '')
.replace(/\®/gi, '®')
.replace(/\¯/gi, '¯')
.replace(/\°/gi, '°')
.replace(/\±/gi, '±')
.replace(/\²/gi, '²')
.replace(/\³/gi, '³')
.replace(/\´/gi, '´')
.replace(/\µ/gi, 'µ')
.replace(/\¶/gi, '¶')
.replace(/\·/gi, '·')
.replace(/\¸/gi, '¸')
.replace(/\¹/gi, '¹')
.replace(/\º/gi, 'º')
.replace(/\»/gi, '»')
.replace(/\¼/gi, '¼')
.replace(/\½/gi, '½')
.replace(/\¾/gi, '¾')
.replace(/\¿/gi, '¿')
.replace(/\×/gi, '×')
.replace(/\÷/gi, '÷')
.replace(/\À/gi, 'À')
.replace(/\Á/gi, 'Á')
.replace(/\Â/gi, 'Â')
.replace(/\Ã/gi, 'Ã')
.replace(/\Ä/gi, 'Ä')
.replace(/\Å/gi, 'Å')
.replace(/\Æ/gi, 'Æ')
.replace(/\Ç/gi, 'Ç')
.replace(/\È/gi, 'È')
.replace(/\É/gi, 'É')
.replace(/\Ê/gi, 'Ê')
.replace(/\Ë/gi, 'Ë')
.replace(/\Ì/gi, 'Ì')
.replace(/\Í/gi, 'Í')
.replace(/\Î/gi, 'Î')
.replace(/\Ï/gi, 'Ï')
.replace(/\Ð/gi, 'Ð')
.replace(/\Ñ/gi, 'Ñ')
.replace(/\Ò/gi, 'Ò')
.replace(/\Ó/gi, 'Ó')
.replace(/\Ô/gi, 'Ô')
.replace(/\Õ/gi, 'Õ')
.replace(/\Ö/gi, 'Ö')
.replace(/\Ø/gi, 'Ø')
.replace(/\Ù/gi, 'Ù')
.replace(/\Ú/gi, 'Ú')
.replace(/\Û/gi, 'Û')
.replace(/\Ü/gi, 'Ü')
.replace(/\Ý/gi, 'Ý')
.replace(/\Þ/gi, 'Þ')
.replace(/\ß/gi, 'ß')
.replace(/\à/gi, 'à')
.replace(/\á/gi, 'á')
.replace(/\â/gi, 'â')
.replace(/\ã/gi, 'ã')
.replace(/\ä/gi, 'ä')
.replace(/\å/gi, 'å')
.replace(/\æ/gi, 'æ')
.replace(/\ç/gi, 'ç')
.replace(/\è/gi, 'è')
.replace(/\é/gi, 'é')
.replace(/\ê/gi, 'ê')
.replace(/\ë/gi, 'ë')
.replace(/\ì/gi, 'ì')
.replace(/\í/gi, 'í')
.replace(/\î/gi, 'î')
.replace(/\ï/gi, 'ï')
.replace(/\ð/gi, 'ð')
.replace(/\ñ/gi, 'ñ')
.replace(/\ò/gi, 'ò')
.replace(/\ó/gi, 'ó')
.replace(/\ô/gi, 'ô')
.replace(/\õ/gi, 'õ')
.replace(/\ö/gi, 'ö')
.replace(/\ø/gi, 'ø')
.replace(/\ù/gi, 'ù')
.replace(/\ú/gi, 'ú')
.replace(/\û/gi, 'û')
.replace(/\ü/gi, 'ü')
.replace(/\ý/gi, 'ý')
.replace(/\þ/gi, 'þ')
.replace(/\ÿ/gi, 'ÿ')
}