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

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

  • Hight

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

    Spritz 23 августа 2011 г. 17:54

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

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

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

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

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

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

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

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

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

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

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

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

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

    Spritz 24 августа 2011 г. 10: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

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

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

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

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

    Spritz 24 августа 2011 г. 14: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, [&#39;b&#39;, &#39;strong&#39;], &#39;&#39;, &#39;&#39;);

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

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

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

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

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

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


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

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

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



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

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

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

    Spritz 24 августа 2011 г. 16: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]);
    }
    }
    }

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