docs: function parseHTML(html) {
  	var temp = [];
  
  	function push(code, type, padding) {
  		code = code.replace(/\n/g, '');
  		if (padding) {
  			temp.push({code: code, type: type, padding: padding});
  		} else {
  			temp.push({code: code, type: type});
  		}
  	}
  
  	function dig(nodes) {
  		for (var i = 0; i < nodes.length; i ++) {
  			var node = nodes[i];
  			switch (node.type) {
  				case 'comment':
  				break;
  
  				case 'text':
  				var words = trim(node.raw).split(' ');
  				for (var j = 0, jj = words.length; j < jj; j++) {
  					push(words[j] + (j + 1 == jj ? '' : ' '), 'text');
  				}
  				break;
  
  				case 'directive':
  				push('<' + node.raw + '>', 'tag');
  				break;
  
  				default:
  				var tag = node.name;
  				var attribs = node.attribs || {};
  
  				push('<' + tag, 'tag', paddingHTML);
  				for (var key in attribs) {
  					push(' ' + key + '="' + attribs[key] + '"', 'tag', paddingHTML);
  				}
  				push('>', 'tag');
  
  				switch (tag) {
  					case 'br':
  					case 'input':
  					case 'hr':
  					case 'link':
  					case 'meta':
  					case 'img':
  					case 'embed':
  					case 'param':
  					case 'area':
  					case 'base':
  					case 'col':
  					case 'keygen':
  					case 'source':
  					continue;
  
  					case 'script':
  					if ((!attribs.type || attribs.type == 'text/javascript') && node.children && node.children[0]) {
  						temp = temp.concat(parseJS(node.children[0].raw));
  					}
  					break;
  
  					case 'style':
  					if ((!attribs.type || attribs.type == 'text/css') && node.children && node.children[0]) {
  						temp = temp.concat(parseCSS(node.children[0].raw));
  					}
  					break;
  
  					default:
  					if (node.children) dig(node.children);
  				}
  
  				push('</' + tag + '>', 'tag')
  			}
  		}
  	}
  
  	var handler = new htmlparser.DefaultHandler(function (error, dom) {});
  	new htmlparser.Parser(handler).parseComplete(html);
  	dig(handler.dom);
  
  	var nodes = [];
  	for (var i = 0, j = 0, ii = temp.length, lastType; i < ii; i++) {
  		var tmp = temp[i];
  		if (i && (lastType == tmp.type || !tmp.type)) {
  			nodes[++j] = tmp;
  		} else {
  			if (!nodes[j]) {
  				nodes[j] = tmp;
  			} else {
  				nodes[j].code += tmp.code;
  				nodes[j].padding = tmp.padding;
  			}
  		}
  		lastType = tmp.type;
  	}
  	return nodes;
  }