Romych
См пост 219 - перепарсить на span - потом each функцией привести к нужному виду (заодно обработается и вложенность - если есть
Отредактировано Deff (Сб, 10 Мар 2012 09:56:55)
Единый форум поддержки |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Единый форум поддержки » Архив » Обновленный спойлер
Romych
См пост 219 - перепарсить на span - потом each функцией привести к нужному виду (заодно обработается и вложенность - если есть
Отредактировано Deff (Сб, 10 Мар 2012 09:56:55)
я не настолько глуп, как ты думаешь,
ещё раз повторяю, я перепробовал множество вариантов регулярок, в том числе и с флагом m, и такой вариант тоже
Romych
Он не ищет, не потому что не ищет, а потому что в подстроке $('div.post-content p') просто нет начального тега (он остаёцо в предыдущем p
Все ш таки проще делать вид тега спойлера через мою методу, дабы не парсить потом непарные теги <p> в самом спойлере
Отредактировано Deff (Сб, 10 Мар 2012 11:25:43)
Deff, молодец. Понял в чём трабл
Допустим есть текст, и мы закроем его спойлером:
<p>[spoiler]Мама мыла раму.<br/> Рама мыла маму.[/spoler]</p>
Но если между "Мама мыла раму." и "Рама мыла маму." будет пустая строчка, то HTML-код будет таким:
<p>[spoiler]Мама мыла раму.</p> <p>Рама мыла маму.[/spoler]</p>
А теперь обратим внимание на код скрипта:
$(function(){
$('input.spoiler-button').live('click',function(){
$(this).parents('div.spoiler-box').find('blockquote.quote-box').toggle('normal');
var a = $(this).attr('value');$(this).attr('value',$(this).attr('id'));$(this).attr('id',a); }); });
$('div.post-box p').map(function () {
text = $(this).html();
if(text.indexOf("[/spoiler]" ) != -1) {
$(this).html(text.replace(/\[spoiler=(.*?)\|(.*?)\]([^`]*?)\[\/spoiler\]/gi, "<div class='spoiler-box' style='padding:1px;background: none;border: 0;'><input id='$2' class='spoiler-button' style='width:140px;font-size:10px; margin:0; cursor: pointer; font-weight:bold' type='button' value='$1'><blockquote class='quote-box' style='display:none; width:auto;margin:0;'>$3</blockquote></div>"))
} });
Я запарился) пытаясь найти нужную регулярочку
Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 14:52:27)
В связи с вышеуказанным фактом вместо этого скрипта спойлера лучше ставить этот:
Это в HTML-верх:
<style type="text/css"> #button-spoiler_r {background:url('http://img706.imageshack.us/img706/1943/spoiler.gif') no-repeat center !important;} </style> <script type="text/javascript"> FORUM.set('editor.spoiler_r', { name : 'Спойлер', onclick : function() {tag_spolier()} } ); </script>
А это в НТМL-низ:
<script type="text/javascript"> function tag_spolier() {var FoundErrors = ''; var enterTITLE = prompt("Введите описание закрытой кнопки", 'Спойлер'); var enterTITLE2 = prompt("Введите описание открытой кнопки", 'Закрыть'); bbcode('[spoiler='+enterTITLE+'|'+enterTITLE2+']','[/spoiler]');} $(function(){ $('input.spoiler-button').live('click',function(){ $(this).parents('div.spoiler-box').find('blockquote.quote-box').toggle('normal'); var a = $(this).attr('value');$(this).attr('value',$(this).attr('id'));$(this).attr('id',a); }); }); $('div.post-content').map(function () { text = $(this).html(); if(text.indexOf("[/spoiler]" ) != -1) { $(this).html(text.replace(/\[spoiler=(.*?)\|(.*?)\]([\s\S]*?)\[\/spoiler\]/gim, "<div class='spoiler-box' style='padding:1px;background: none;border: 0;'><input id='$2' class='spoiler-button' style='width:auto;font-size:11px; margin:0; cursor: pointer; font-weight:bold' type='button' value='$1'><blockquote class='quote-box' style='display:none; width:auto;margin:0;'>$3</blockquote></div>")) } }); </script>
А чтобы было описание только открытой кнопки, то вместо предыдущего кода в HTML-низ ставить этот:
<script type="text/javascript"> function tag_spolier() {var FoundErrors = ''; var enterTITLE = prompt("Введите описание открытой кнопки", 'Спойлер'); bbcode('[spoiler='+enterTITLE+']','[/spoiler]');} $(function(){ $('input.spoiler-button').live('click',function(){ $(this).parents('div.spoiler-box').find('blockquote.quote-box').toggle('normal'); var a = $(this).attr('value');$(this).attr('value',$(this).attr('id'));$(this).attr('id',a); }); }); $('div.post-content').map(function () { text = $(this).html(); if(text.indexOf("[/spoiler]" ) != -1) { $(this).html(text.replace(/\[spoiler=(.*?)\]([\s\S]*?)\[\/spoiler\]/gim, "<div class='spoiler-box' style='padding:1px;background: none;border: 0;'><input id='Закрыть' class='spoiler-button' style='width:auto;font-size:11px; margin:0; cursor: pointer; font-weight:bold' type='button' value='$1'><blockquote class='quote-box' style='display:none; width:auto;margin:0;'>$2</blockquote></div>")) } }); </script>
Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 15:44:17)
RUSSIAN_GOBLIN
Не факт что будет работать со всеми двойными пробелами - jQuery не позволит впихнуть код подмены, ежели в спойлере будут нечетное кол во тегов <p> или первый тег внутри </p>
Deff, работает даже несмотря на не закрытые теги <p> и </p>.
Мне кажется на форумах есть какая-то система защиты от дурака, а может дело в jquery.
RUSSIAN_GOBLIN
Хм - возможно разныя методики в браузерах (в Opere не вставляет при начальном теге </p>), давно уже тестил
.innerHTML - проходит
RUSSIAN_GOBLIN
Deff
Так какой лучше ставить?
ruslan_as
Я не наю, мой работает, но пока без доп названий и кнопка большая
Я не наю, мой работает, но пока без доп названий и кнопка большая
Это не беда
В HTML-верх:
<script type="text/javascript"> FORUM.set('editor.spoiler_d', {name:'Спойлер',onclick:function(){bbcode('[quote==Spoiler]','[/quote]');}}); </script> <style type="text/css"> #button-spoiler_d {background:url('http://img706.imageshack.us/img706/1943/spoiler.gif') no-repeat center !important;} </style> <style id="MakeSpoiler">.punbb .post .quote-box{display:none!important;}</style>
В HTML-низ:
<script type="text/javascript"> var spl_wrap_1='<div class="spoiler quote-box" style="border:none; background:transparent; margin:0;"><input type="button" onclick="spl_2(this);" value="Спойлер"/><div class="show-hide" style="margin-top:6px;width:100%!important;display:none;"></br><blockquote>'; var spl_wrap_2='</blockquote></div></div>'; function spl_2(n){ $(n).parents('div.spoiler').children('div.show-hide').toggle('slow'); if($(n).val()=='Спойлер')$(n).val('Закрыть'); else $(n).val('Спойлер'); } $(".post-box .quote-box cite:contains('=Spoiler написал(а):')").each(function (i) { $(this).parent(".quote-box").replaceWith(spl_wrap_1+$(this).parent(".quote-box").find("blockquote:first").html()+spl_wrap_2);}) $('#MakeSpoiler').replaceWith(""); </script>
В связи с вышеуказанным фактом вместо этого скрипта спойлера лучше ставить этот:
во всех этих вариантах один минус без указания тега <p> в селекторе, спойлер начинает работать в теге [ code ][ /code ]
так-то можно и без регулярки обойтись, типа так
для спойлера с описанием открытой и закрытой кнопки
<script language="javascript"> $('td#button-code').before('<td style=\'background-image:url("http://img706.imageshack.us/img706/1943/spoiler.gif");background-repeat:no-repeat;background-position:center center;\' onclick="tag_spolier()"><img src="/i/blank.gif" alt="Спойлер"></td>'); function tag_spolier() {var FoundErrors = ''; var enterTITLE = prompt("Введите описание закрытой кнопки", 'Спойлер'); var enterTITLE2 = prompt("Введите описание открытой кнопки", 'Закрыть'); bbcode('[spoiler='+enterTITLE+'|'+enterTITLE2+']','[/spoiler]');} $(function(){ $('input.spoiler-button').click(function(){ $(this).parents('div.spoiler-box').find('blockquote.quote-box').toggle('normal'); var a = $(this).attr('value');$(this).attr('value',$(this).attr('id'));$(this).attr('id',a); }); }); if ((document.URL.indexOf("viewtopic.php") != -1) || (document.URL.indexOf("post.php") != -1)) { var lis = document.querySelectorAll("div.post-content"); for (x in lis){ var post = lis[x].innerHTML; while (post.indexOf("[spoiler") != -1) { post = post.replace(/\[spoiler=(.*?)\|(.*?)\]/gim, "<div class='spoiler-box' style='padding:1px;background: none;border: 0;'><input id='$2' class='spoiler-button' style='width:140px;font-size:10px; margin:0; cursor: pointer; font-weight:bold' type='button' value='$1'><blockquote class='quote-box' style='display:none; width:97%;border: 1px solid #88b5df;margin:0;'>"); }; while (post.indexOf("[/spoiler]") != -1) { post = post.replace("[/spoiler]", "</blockquote></div>"); }; lis[x].innerHTML = post;}} </script>
с тегом <p> в селекторе не катит пустая строка, без тега <p> спойлер работает в бб-коде, дилемма остаётся,
так что исключение третьего подшаблона из регулярки проблему не решает
а может дело в jquery.
последний мой вариант здесь, который в посте №231, на обычном js, работает с любым количеством пустых строк и тегов <p> внутри спойлера
Romych
Для блока код - обычно стандартное решение, временное изъятие его в переменную с заменой на группу спецсимволов =>к примеру %%%%%%%%%%%%%%%%%%%%%%% - после перепарсивания со спойлером - данную группу опять заменяем на код, в нашей переменной
Romych
Для блока код - обычно стандартное решение, временное изъятие его в переменную с заменой на группу спецсимволов =>к примеру %%%%%%%%%%%%%%%%%%%%%%% - после перепарсивания со спойлером - данную группу опять заменяем на код, в нашей переменной
как вариант, оно то понятно, но всё это костыли по большому счёту, было бы здорово, если бы Макс в движке в парсере поколдовал с тегом бб-код
Romych
Да ясный фиг - Спойлер востребован везде, старый более 4кб, тем паче вроде Админ ориентирован на сокращение кодов на странице
Deff
а ещё было бы супер, если бы в Цензуре в поле Заменяющее слово, появилась бы поддержка html вместо слова,
пока срабатывает лишь замена слова на бб-теги или замена одного бб-тега на другой,
тогда бы можно было лепить собственные теги в любых количествах и любого качества
последний мой вариант здесь, который в посте №231, на обычном js, работает с любым количеством пустых строк и тегов <p> внутри спойлера
В мозилле и мой код работает также. В др. браузерах надо проверитьь. Но Deff пишет что в опере не пашет...
P.S.: сделал так, что при наличии в сообщении бб-кода [ code ][ /code ] спойлер не работает.
Осталось сделать так чтобы спойлер не работал, если он именно внутри бб-кода.
а ещё было бы супер, если бы в Цензуре в поле Заменяющее слово, появилась бы поддержка html вместо слова
Этого не будет. Админ делает наоборот, чтобы снизить нагрузку на сервер.
Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 17:32:55)
Осталось сделать так чтобы спойлер не работал, если он именно внутри бб-кода.
об этом и речь
В мозилле и мой код работает также.
если быть точным, то это тоже мой, но переделанный тобою
если быть точным, то это тоже мой, но переделанный тобою
Да, это действительно так
Суть вот в чём: нужно найти и подсчитать кол-во bb-code до спойлера - открытия их и закрытия, если они равны - спойлер не в bb-code.
Но есть и ещё варианты. Я думаю вообщем.
Добавлено:
Я сделал так чтобы код не работал внутри bb-code. Но он стал не работать при пустых строках
И ещё добавлено:
Сделал уже так что работает при пустых строках и не работает в bb-code,
но за одним исключением - не работает при пустых строчках, если в том же сообщении есть bb-code.
Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 19:43:35)
Универсальный парсер BB-кодов, с вложенностью тегов
и исключением из парсинга code-box
<script> // 888888 =SETTING-SECTION= 88888 var a='Spoiler'; //Имя тега; var b='[/'+a+']'; //Вид конечного тега; var c='['+a+'='; //Вид неизменяемой части начального тега; var patt1='\\['+a+'=(.*?)\\|(.*?)\\]'; //Паттерн начала; var patt2='\\[\/'+a+'\\]'; //Паттерн концовки; var zamena1 ="<div class='spoiler-box' style='padding:1px;background: none;border: 0;'><input id='$2' class='spoiler-button' style='width:auto;font-size:11px; margin:0; cursor: pointer; font-weight:bold' title='Cкрыть/показать' type='button' value='$1'><blockquote class='quote-box' style='display:none; width:auto;margin:0;'>"; var zamena2 ='</blockquote></div>'; //888888 =END//SETTING-SECTION = 88888 var regexp1 = new RegExp(patt1,"img"); var regexp2 = new RegExp(patt2,"img"); $("div.post-content").each(function (){ var Arr_CodeBox=[]; var d=$(this).html(); if(d.indexOf(b)==-1) return true; $(this).find('.code-box').each(function (j){ $(this).wrap('<p class=CodeBox alt='+j+'></p>') Arr_CodeBox[j]=$(this).remove(); }); d=$(this).html(); for(i=0; i<1000; i++){ if((x=d.indexOf(b))==-1)break; //alert(x); if((z=d.lastIndexOf(c,x))==-1)break; var kj=d.substring(z,x); N=kj.replace(regexp1,zamena1)//alert(kj+'=>'+N) if(N==kj)break; d=d.substring(0,z)+N+zamena2+d.substring(x+b.length);//alert(d) $(this).html(d); } $(this).find('p.CodeBox').each(function (j){ $(this).replaceWith(Arr_CodeBox[j]); }); }); </script>
В принципе мон приделать парсинг одним проходом нескольких различных BB-кодов
Ксать кликкер для вложенных чуть уточнить
<script>
$(function(){
$('input.spoiler-button').click(function(){
$(this).parents('div.spoiler-box:first').find('blockquote.quote-box:first').toggle('normal');
var a = $(this).attr('value');$(this).attr('value',$(this).attr('id'));$(this).attr('id',a);
});});
</script>
Отредактировано Deff (Вс, 11 Мар 2012 10:59:00)
Вы здесь » Единый форум поддержки » Архив » Обновленный спойлер