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)
| Не получается установить спойлер. | Корзина | Вс, 10 Янв 2010 |
| Спойлеры. | Корзина | Пт, 11 Июн 2010 |
| Спойлер | Корзина | Ср, 30 Мар 2011 |
| Спойлер | Корзина | Ср, 22 Июн 2011 |
| Поставил скрипт спойлера и форум "сломался" | Корзина | Чт, 14 Июл 2011 |
Вы здесь » Единый форум поддержки » Архив » Обновленный спойлер