Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> valid outerHTML in IE, тестирование скрипта 
:(
    Опции темы
JSman
Дата 27.9.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



скрипт получения 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!='&lt;') && (match!='<') && (match!='&amp;') && (match!='&'))
            return  DOM.getCharFromSpecialSymbol(match);
            return ((match!='&lt;') && (match!='<'))?'&amp;lt;':'&amp;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().

Спасибо за внимание=)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.