скрипт получения xhtml кода из html в IE. прошу протестировать и указать, где есть "пробел". 2 требования к странице: 1. все парные теги должны быть закрыты. 2. не использовать одинарные кавычки для обозначения атрибута (можно так ...="..." или так ...=..., или атрибут вообще без значения) Код | function getCode(node) { var code =node.outerHTML;
function fix_tagName() { function fn(match){return match.toLowerCase()} code = code.replace(/<\/?\w+/g, fn); } function fix_attributes() { function fn(code) { code = code .replace(/(\w+)=""/g, '$1="empty-attribute"') .split(/(?!\\)"/); for (var i=0; i < code.length; i+=2) code[i] = code[i] .replace(/\s([\w-]+)([\s//>])/g, ' $1=$1 $2') // fix empty attributes .replace(/=([^ <>]+)/g, '="$1"'); // fix attributes quoters code = code .join('"') .replace(/"empty-attribute"/g, '""'); return code; } code = code.replace(/<[^>]+>/g, fn); } function fix_namespace() { code = code.replace(/<html[^>]*>/i,'<html>'); } function delete_breaks() { code = code.replace(/\r?\n/g,''); } function fix_colgroup() { if (code.indexOf('<colgroup')!=-1) code = code.replace(/(<colgroup(?:[^>]+)?)>(?:[^<]+)?(?!<col)/g, '$&<\/colgroup>'); } function fix_empty_tags() { var emptyTags = ['area','base','basefont','br','col','frame','hr','img','input','isindex','link','param', 'meta'], seachedEmptyTags = [], re = new RegExp; for (var i=0; i<emptyTags.length; i++) if (code.indexOf('<'+emptyTags[i])!=-1) seachedEmptyTags.push(emptyTags[i]); if (seachedEmptyTags.length!=0) { re.compile('<(' + seachedEmptyTags.join('|') + ')\\b[^>]*', 'g'); code = code.replace(re,'$& /'); } } function fix_ul() { var re= new RegExp; if (code.indexOf('<li')!=-1) { re.compile('(<li\\b)', 'g'); code = code.replace(re,"</li>$1"); re.compile('(<[uo]l\\b[^>]*>\\s*)(<\\/li>)', 'g'); code = code.replace(re,"$1"); } } function fix_dl() { var re = RegExp(); if (code.indexOf('<dl')!=-1) { function fn(match, e1, e2, e3) { if (!match.match(/<\/?dl/)) return e1 +'<\/' + e2 + ">"; return match; } re.compile('(<(d[dt])(?:[^>]+)?>(?:.(?!<d[dt]))+.)', 'g'); code = code.replace(re, fn); } } function fix_dl2() { var re = new RegExp(); re.compile('(<(d[dt])(?:[^>]+)?>)(<d[dt](?:[^>]+)?>)', 'g'); code = code.replace(re, '$1<\/$2>$3'); re.compile('(<(d[dt])(?:[^>]+)?>\s*<dl(?:[^>]+)?>(?:(?:.(?!<\/?dl>))+.)?<\/dl>)(\s*<d[dt])', 'g'); code = code.replace(re, '$1<\/$2>$3'); /* dl fragment: <dl(?:[^>]+)?>(?:(?!<dl).)+</dl> */ re.compile('(<(d[dt])(?:[^>]+)?>(?:(?!<d[dtl]).)+(?:<dl(?:[^>]+)?>(?:(?!<dl).)+</dl>\s*)+(?:(?:(?!<d[dtl]).)+)?)(<d[dt])', 'g'); code = code.replace(re, '$1<\/$2>$3'); } function charFunction(match) { if ((match!='<') && (match!='<') && (match!='&') && (match!='&')) return DOM.getCharFromSpecialSymbol(match); return ((match!='<') && (match!='<'))?'&lt;':'&amp;'; } function fix_symbols() { // replace & and < code = code.replace(/&#?\w+;/g, charFunction); } function fix_p() { var re = new RegExp; //re.compile('(<thead(?:[^>]+)?)', 'g'); function fn(match) { if (match.indexOf('</p>')==-1) { //alert(match); return match+'</p>'; } return match; } re.compile('(<p\\b(?:[^>]+)?>)(?:.(?!<(?:p\\b|h[\dr]|\\/?div)))+.', 'g'); code = code.replace(re, fn); }
delete_breaks(); fix_tagName(); code = code. replace(/(<(script|style)\b[^>]*>)(?!<\/).+(<\/\2>)/gi, "$1$3") // kill cdata fix_attributes(); fix_namespace(); fix_empty_tags(); fix_colgroup(); fix_ul(); fix_dl(); fix_dl2(); fix_p(); fix_symbols();
var xml = XML.parseFromString('<?xml version="1.0" encoding="utf-8"?>' + code);
if (!xml.documentElement) document.body.innerText = code; // alert(XML.serialize(xml.documentElement)); return xml.documentElement; }
|
Добавлено через 14 минут и 58 секундплюс дополнительный код Код | DOM = { __element : document.createElement('span'),
getCharFromSpecialSymbol : function (symbol) { element = DOM.__element; element.innerHTML = symbol; return element.innerText || element.textContent; //return element.childNodes[0].nodeValue; } }
XML = { parseFromString : function (string) { var xml = XML.create(); xml.loadXML(string); return xml; },
create : function () { var versions = [ "Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "Msxml.DOMDocument", ]; for (var i = 0; i < versions.length; i++) { try { var ieXML = new ActiveXObject(versions[i]); return ieXML; } catch(e) {} }
},
serialize : function (node) { return node.xml; }
}
|
куски кода повырезал, за равнение не пенять. проверять так: window.onload = function () { getCode(document.documentElement); } в случае ошибки document.body заполняется текстом, который сгенерировался, но не является валидным xml. Прошу этот текст проверить в валидаторе и сказать в чем ошибка. Если все нормально, то будет alert(). Спасибо за внимание=)
|