/* jsonml-dom.js HTML to JsonML utility Created: 2007-02-15-2235 Modified: 2012-11-03-2051 Copyright (c)2006-2012 Stephen M. McKamey Distributed under The MIT License: http://jsonml.org/license */ var JsonML = JsonML || {}; if (typeof module === 'object') { module.exports = JsonML; } (function(JsonML, document){ 'use strict'; var addChildren = function(/*DOM*/ elem, /*function*/ filter, /*JsonML*/ jml) { if (elem.hasChildNodes()) { for (var i=0; i', ''); jml.push(child); } else if (elem.hasChildNodes()) { for (i=0; i', ''); jml.push(child); } } } break; case 'input': addChildren(elem, filter, jml); child = (elem.type !== 'password') && elem.value; if (child) { if (!hasAttrib) { // need to add an attribute object jml.shift(); props = {}; jml.unshift(props); jml.unshift(elem.tagName||''); } props.value = child; } break; case 'textarea': if (!addChildren(elem, filter, jml)) { child = elem.value || elem.innerHTML; if (child && 'string' === typeof child) { jml.push(child); } } break; default: addChildren(elem, filter, jml); break; } // filter result if ('function' === typeof filter) { jml = filter(jml, elem); } // free references elem = null; return jml; case 3: // text node case 4: // CDATA node var str = String(elem.nodeValue); // free references elem = null; return str; case 10: // doctype jml = ['!']; var type = ['DOCTYPE', (elem.name || 'html').toLowerCase()]; if (elem.publicId) { type.push('PUBLIC', '"' + elem.publicId + '"'); } if (elem.systemId) { type.push('"' + elem.systemId + '"'); } jml.push(type.join(' ')); // filter result if ('function' === typeof filter) { jml = filter(jml, elem); } // free references elem = null; return jml; case 8: // comment node if ((elem.nodeValue||'').indexOf('DOCTYPE') !== 0) { // free references elem = null; return null; } jml = ['!', elem.nodeValue]; // filter result if ('function' === typeof filter) { jml = filter(jml, elem); } // free references elem = null; return jml; default: // etc. // free references return (elem = null); } }; /** * @param {string} html HTML text * @param {function} filter * @return {array} JsonML */ JsonML.fromHTMLText = function(html, filter) { var elem = document.createElement('div'); elem.innerHTML = html; var jml = fromHTML(elem, filter); // free references elem = null; if (jml.length === 2) { return jml[1]; } // make wrapper a document fragment jml[0] = ''; return jml; }; })(JsonML, document);