Единый форум поддержки

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Единый форум поддержки » Архив » Обновленный спойлер


Обновленный спойлер

Сообщений 221 страница 240 из 328

221

Romych
См пост 219 - перепарсить на span - потом each функцией привести к нужному виду (заодно обработается и вложенность - если есть

Отредактировано Deff (Сб, 10 Мар 2012 09:56:55)

0

222

Romych написал(а):

я не настолько глуп, как ты думаешь,
ещё раз повторяю, я перепробовал множество вариантов регулярок, в том числе и с флагом m, и такой вариант тоже

Romych
Он не ищет, не потому что не ищет, а потому что в подстроке $('div.post-content p') просто нет начального тега (он остаёцо в предыдущем p

Все ш таки проще делать вид тега спойлера через мою методу, дабы не парсить потом непарные теги <p> в самом спойлере

Отредактировано Deff (Сб, 10 Мар 2012 11:25:43)

0

223

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>"))
} });

Я запарился) пытаясь найти нужную регулярочку  :D

Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 14:52:27)

0

224

В связи с вышеуказанным фактом  ^^  вместо этого скрипта спойлера лучше ставить этот:

Это в 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)

0

225

RUSSIAN_GOBLIN
Не факт что будет работать со всеми двойными пробелами - jQuery не позволит впихнуть код подмены, ежели в спойлере будут нечетное кол во тегов <p> или первый тег внутри </p>

0

226

Deff, работает даже несмотря на не закрытые теги <p> и </p>.
Мне кажется на форумах есть какая-то система защиты от дурака, а может дело в jquery.

0

227

RUSSIAN_GOBLIN
Хм - возможно разныя методики в браузерах (в Opere не вставляет при начальном теге </p>), давно уже тестил
.innerHTML - проходит

0

228

RUSSIAN_GOBLIN
Deff

Так какой лучше ставить? :D

0

229

ruslan_as
Я не наю, мой работает, но пока без доп названий и кнопка большая

0

230

Deff написал(а):

Я не наю, мой работает, но пока без доп названий и кнопка большая

Это не беда  :D

В 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>

0

231

RUSSIAN_GOBLIN написал(а):

В связи с вышеуказанным фактом  ^^  вместо этого скрипта спойлера лучше ставить этот:

во всех этих вариантах один минус без указания тега <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> спойлер работает в бб-коде, дилемма остаётся,
так что исключение третьего подшаблона из регулярки проблему не решает

0

232

RUSSIAN_GOBLIN написал(а):

а может дело в jquery.

последний мой вариант здесь, который в посте №231, на обычном js, работает с любым количеством пустых строк и тегов <p> внутри спойлера

+1

233

Romych
Для блока код - обычно стандартное решение, временное изъятие его в переменную с заменой на группу спецсимволов =>к примеру %%%%%%%%%%%%%%%%%%%%%%% - после перепарсивания со спойлером - данную группу опять заменяем на код, в нашей переменной

0

234

Deff написал(а):

Romych
Для блока код - обычно стандартное решение, временное изъятие его в переменную с заменой на группу спецсимволов =>к примеру %%%%%%%%%%%%%%%%%%%%%%% - после перепарсивания со спойлером - данную группу опять заменяем на код, в нашей переменной

как вариант, оно то понятно, но всё это костыли по большому счёту, было бы здорово, если бы Макс в движке в парсере поколдовал с тегом бб-код

0

235

Romych
Да ясный фиг - Спойлер востребован везде, старый более 4кб, тем паче вроде Админ ориентирован на сокращение кодов на странице

0

236

Deff
а ещё было бы супер, если бы в Цензуре в поле Заменяющее слово, появилась бы поддержка html вместо слова,
пока срабатывает лишь замена слова на бб-теги или замена одного бб-тега на другой,
тогда бы можно было лепить собственные теги в любых количествах и любого качества ;)

0

237

Romych написал(а):

последний мой вариант здесь, который в посте №231, на обычном js, работает с любым количеством пустых строк и тегов <p> внутри спойлера

В мозилле и мой код работает также. В др. браузерах надо проверитьь. Но Deff пишет что в опере не пашет...

P.S.: сделал так, что при наличии в сообщении бб-кода [ code ][ /code ] спойлер не работает.
Осталось сделать так чтобы спойлер не работал, если он именно внутри бб-кода.  :insane:

а ещё было бы супер, если бы в Цензуре в поле Заменяющее слово, появилась бы поддержка html вместо слова

Этого не будет. Админ делает наоборот, чтобы снизить нагрузку на сервер.

Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 17:32:55)

0

238

RUSSIAN_GOBLIN написал(а):

Осталось сделать так чтобы спойлер не работал, если он именно внутри бб-кода.

об этом и речь

RUSSIAN_GOBLIN написал(а):

В мозилле и мой код работает также.

если быть точным, то это тоже мой, но переделанный тобою ;)

+1

239

Romych написал(а):

если быть точным, то это тоже мой, но переделанный тобою

Да, это действительно так  :yep:

Суть вот в чём: нужно найти и подсчитать кол-во bb-code до спойлера - открытия их и закрытия, если они равны - спойлер не в bb-code.

Но есть и ещё варианты. Я думаю вообщем.

Добавлено:

Я сделал так чтобы код не работал внутри bb-code. Но он стал не работать при пустых строках  :suspicious:

И ещё добавлено:

Сделал уже так что работает при пустых строках и не работает в bb-code,
но за одним исключением - не работает при пустых строчках, если в том же сообщении есть bb-code:disappointed:

Отредактировано RUSSIAN_GOBLIN (Сб, 10 Мар 2012 19:43:35)

0

240

Универсальный парсер 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)

+1


Вы здесь » Единый форум поддержки » Архив » Обновленный спойлер