var OffendersHelpers = function() { this.domPathToArray = function(str) { return str.split(/\s?>\s?/); }; this.listOfDomArraysToTree = function(listOfDomArrays) { var result = {}; function recursiveTreeBuilder(tree, domArray) { if (domArray.length > 0) { var currentDomElement = domArray.shift(domArray); if (tree === null) { tree = {}; } tree[currentDomElement] = recursiveTreeBuilder(tree[currentDomElement] || null, domArray); return tree; } else if (tree === null) { return 1; } else { return tree + 1; } } listOfDomArrays.forEach(function(domArray) { result = recursiveTreeBuilder(result, domArray); }); return result; }; this.domTreeToHTML = function(domTree) { function recursiveHtmlBuilder(tree) { var html = ''; var keys = Object.keys(tree); keys.forEach(function(key) { if (isNaN(tree[key])) { html += '
' + key + '' + recursiveHtmlBuilder(tree[key]) + '
'; } else if (tree[key] > 1) { html += '
' + key + ' (x' + tree[key] + ')
'; } else { html += '
' + key + '
'; } }); return html; } return '
' + recursiveHtmlBuilder(domTree) + '
'; }; this.listOfDomPathsToHTML = function(domPaths) { var domArrays = domPaths.map(this.domPathToArray); var domTree = this.listOfDomArraysToTree(domArrays); return this.domTreeToHTML(domTree); }; this.domPathToButton = function(domPath) { var domArray = this.domPathToArray(domPath); var domTree = this.listOfDomPathsToHTML([domPath]); if (domArray[0] === 'html') { return '
html
'; } if (domArray[0] === 'body') { if (domArray.length === 1) { return '
body
'; } else { return '
DOM element ' + domArray[domArray.length - 1] + '' + domTree + '
'; } } if (domArray[0] === 'head') { return '
head
'; } if (domArray[0] === 'DocumentFragment') { if (domArray.length === 1) { return '
Fragment
'; } else { return '
Fragment element ' + domArray[domArray.length - 1] + '' + domTree + '
'; } } // Not attached element, such as just created with document.createElement() if (domArray.length === 1) { return '
Created element ' + domPath + '
'; } else { return '
Created element ' + domArray[domArray.length - 1] + '' + domTree + '
'; } }; }; module.exports = new OffendersHelpers();