ФорумПрограммированиеJavaScript → Функция гоняет теги в bbcode и обратно. Как вам решение?

Функция гоняет теги в bbcode и обратно. Как вам решение?

  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 1:54

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

    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].childNodes;
    fragment = this.iframe[name].doc.createDocumentFragment();
    fragment.appendChild(this.iframe[name].doc.createTextNode(''));
    for(var ic = 0; ic < cNodes.length; ic++) fragment.appendChild(cNodes[ic]);
    fragment.appendChild(this.iframe[name].doc.createTextNode('
    '));
    nodes[ig].parentNode.replaceChild(fragment, nodes[ig]);
    }
    }
    }
    }
    };

    Говно или круто?
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 2:09, спустя 15 минут 14 секунд

    Сука, из текстового в визуальный вложенные теги не конвертит.
    Спустя 232 сек.
    Хотя, что это я. Нахуй надо в вкладывать.
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 17:57, спустя 15 часов 48 минут 12 секунд

    Отдохнул, посмотрел на своё творение свежим взглядом и понял, что сотворил чудо. Этот код идеален! Аминь…
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 18:15, спустя 17 минут 22 секунды

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

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 24 августа 2011 г. 18:50, спустя 35 минут 44 секунды

    MOAR циклов
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 19:02, спустя 12 минут 5 секунд

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

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 22:22, спустя 3 часа 20 минут 5 секунд

    Вот она, красавица. Функция конвертации обычных тегов в ббкод.
    	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));
    for(var ig = 0; ig < nodes.length; ig++){
    for(var i = nodes[ig].length-1; i >= 0; i–){
    cNodes = nodes[ig].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].parentNode.replaceChild(fragment, nodes[ig]);
    }
    }
    }


    Вызывается так: this.tagsToBBCode(name, ['b', 'strong'], '', '');

    Ну сказка просто.
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 23:38, спустя 1 час 15 минут 27 секунд

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 24 августа 2011 г. 23:42, спустя 3 минуты 38 секунд


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

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 24 августа 2011 г. 23:44, спустя 2 минуты 45 секунд



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

    Сам ты говнокод. Ты сначала сам так наговнокодь, а потом пизди =)
    Спустя 40 сек.
    Короче, подсказка. Теряются ноды. Детишки теряются.
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 25 августа 2011 г. 0:20, спустя 35 минут 22 секунды

    Этим DOMом можно мозги в узел завязать:
    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));
    for(var ig = 0; ig < nodes.length; ig++){
    for(var i = nodes[ig].length-1; i >= 0; i–){
    cNodes = nodes[ig].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].parentNode.replaceChild(fragment, nodes[ig]);
    }
    }
    }

Пожалуйста, авторизуйтесь, чтобы написать комментарий!