/*
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);