Здесь курят мануал.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 25 Май, 2012, 03:23:52

Страниц: [1]
Печать
Автор Тема: Функция гоняет теги в bbcode и обратно. Как вам решение?  (Прочитано 192 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hight    ↓ 
24 Август, 2011, 01:54:13
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Что-то совсем мозг опух, не знаю как более элегантно или красиво решить задачку. Может и нельзя красивее и элегантнее. Данная функция гоняет теги: b, strong в соответствующий bbcode и обратно при переключении режима редактора. Зацените:
Javascript

textEditor.boldModeChangeContentSecond = function(name){
    if(this.config[name].mode){ /* Из текстового режима в визуальный */
        if(this.config[name].modeText == 'bbcode') this.textarea[name].value = this.textarea[name].value.replace(/\[b\](.*?)\[\/b\]/mig, '<b>$1</b>');
    }else{ /* Из визуального режима в текстовый */
        if(this.config[name].modeText == 'bbcode'){
            var nodes = [this.iframe[name].doc.getElementsByTagName('b'), this.iframe[name].doc.getElementsByTagName('strong')], cNodes, fragment;
            for(var ig = 0; ig < nodes.length; ig++){
                for(var i = nodes[ig].length-1; i >= 0; i--){
                    cNodes = nodes[ig][i].childNodes;
                    fragment = this.iframe[name].doc.createDocumentFragment();
                    fragment.appendChild(this.iframe[name].doc.createTextNode('[b]'));
                    for(var ic = 0; ic < cNodes.length; ic++) fragment.appendChild(cNodes[ic]);
                    fragment.appendChild(this.iframe[name].doc.createTextNode('[/b]'));
                    nodes[ig][i].parentNode.replaceChild(fragment, nodes[ig][i]);
                }
            }
        }
    }
};
 
Говно или круто?
Записан

Hight    ↓ 
24 Август, 2011, 02:09:27 , спустя 15 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Сука, из текстового в визуальный вложенные теги не конвертит.
Спустя 3 минуты 52 секунды добавил
Хотя, что это я. Нахуй надо [ b] в [ b] вкладывать.
Записан

Hight    ↓ 
24 Август, 2011, 05:57:39 , спустя 15 часов 48 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Отдохнул, посмотрел на своё творение свежим взглядом и понял, что сотворил чудо. Этот код идеален! Аминь...
« Последнее редактирование: 24 Август, 2011, 05:57:39 от Hight » Записан

Hight    ↓ 
24 Август, 2011, 06:15:01 , спустя 17 минут 22 секунды
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Блеать, как дурак тут сам с собой пижю.
Записан

Status    ↓ 
24 Август, 2011, 06:33:32 , спустя 18 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

Редкостная сволочь
Группа: Джедаи

Карма: 57
Сообщений: 1447
Сила слова: 3.94

Почему как?:D
Записан

Заткнись говно, я воевал!
Hight    ↓ 
24 Август, 2011, 06:39:20 , спустя 5 минут 48 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Status, ну ты и тролль! Коллега.
Записан

Frozzeg    ↓ 
24 Август, 2011, 06:50:45 , спустя 11 минут 25 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Пятросянище

Карма: 92
Сообщений: 5500
Сила слова: 1.67

MOAR циклов
Записан
Hight    ↓ 
24 Август, 2011, 07:02:50 , спустя 12 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Frozzeg, не-не. Там всё чётко с циклами. Всё красиво. Я сейчас в ядро этот код вынесу, оформлю отдельной универсальной функцией и будет ваще круто. Главное, что сделал всё без использования innerHTML. То-есть косяков быть не может как у других которые в innerHTML регулярками конвертят.
Записан

Hight    ↓ 
24 Август, 2011, 10:22:55 , спустя 3 часа 20 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Вот она, красавица. Функция конвертации обычных тегов в ббкод.
Javascript
    tagsToBBCode: function(name, tags, oTag, cTag){
        var nodes = [], cNodes, fragment;
        for(var i = 0; i < tags.length; i++) nodes.push(this.iframe[name].doc.getElementsByTagName(tags[i]));
        for(var ig = 0; ig < nodes.length; ig++){
            for(var i = nodes[ig].length-1; i >= 0; i--){
                cNodes = nodes[ig][i].childNodes;
                fragment = this.iframe[name].doc.createDocumentFragment();
                fragment.appendChild(this.iframe[name].doc.createTextNode(oTag));
                for(var ic = 0; ic < cNodes.length; ic++) fragment.appendChild(cNodes[ic]);
                fragment.appendChild(this.iframe[name].doc.createTextNode(cTag));
                nodes[ig][i].parentNode.replaceChild(fragment, nodes[ig][i]);
            }
        }
    }

Вызывается так: this.tagsToBBCode(name, ['b', 'strong'], '[ b]', '[ /b]');
 
Ну сказка просто.
Записан

Hight    ↓ 
24 Август, 2011, 11:38:22 , спустя 1 час 15 минут 27 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Ржунимагу. В функции есть ошибка, сцуко самая злая ошибка. Из тех, что не сразу видишь - логическая. Цикл кривой. Вопрос знатокам - какой?
Записан

phpdude    ↓ 
24 Август, 2011, 11:42:00 , спустя 3 минуты 38 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66


Ржунимагу. В функции есть ошибка, сцуко самая злая ошибка. Из тех, что не сразу видишь - логическая. Цикл кривой. Вопрос знатокам - какой?
гавнокод не разбираю :)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Hight    ↓ 
24 Август, 2011, 11:44:45 , спустя 2 минуты 45 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91



Ржунимагу. В функции есть ошибка, сцуко самая злая ошибка. Из тех, что не сразу видишь - логическая. Цикл кривой. Вопрос знатокам - какой?
гавнокод не разбираю :)
Сам ты говнокод. Ты сначала сам так наговнокодь, а потом пизди =)
Спустя 40 секунд добавил
Короче, подсказка. Теряются ноды. Детишки теряются.
Записан

Hight    ↓ 
25 Август, 2011, 12:20:07 , спустя 35 минут 22 секунды
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Этим DOMом можно мозги в узел завязать:
Javascript
tagsToBBCode: function(name, tags, oTag, cTag){
        var nodes = [], cNodes, fragment;
        for(var i = 0; i < tags.length; i++) nodes.push(this.iframe[name].doc.getElementsByTagName(tags[i]));
        for(var ig = 0; ig < nodes.length; ig++){
            for(var i = nodes[ig].length-1; i >= 0; i--){
                cNodes = nodes[ig][i].childNodes;
                fragment = this.iframe[name].doc.createDocumentFragment();
                fragment.appendChild(this.iframe[name].doc.createTextNode(oTag));
                fragment.appendChild(this.iframe[name].doc.createTextNode(cTag));
                for(var ic = cNodes.length-1; ic >= 0; ic--) fragment.insertBefore(cNodes[ic], fragment.childNodes[1]);
                nodes[ig][i].parentNode.replaceChild(fragment, nodes[ig][i]);
            }
        }
    }
Записан

Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd