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

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

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


Вы здесь » Единый форум поддержки » Корзина » [Гайд] Создание bb-кодов


[Гайд] Создание bb-кодов

Сообщений 1 страница 7 из 7

1

ВотЪ… Хочу представить то, над чем долго работал… Может быть, работал бы меньше, если бы между Delphi и js небыло такой разницы, как регистрозависимость :(. Так, не о том я…
Итак, представляю вашему вниманию:

Гайд по писанию собственного bb-кода
с использованием js и (немного) CSS


Гайд расчитан на среднего программиста в js, особенно его вторая реализация.

Предположим, нам надо создать bb-код, назовём его [mybb][/mybb]. В нём нет параметров, поэтому сделать его просто:

<script>
$(".post .post-content").each(function(){
var L = $(this).html();
var arr = L.split("[mybb]");
var R = arr[0];
for (var i = 1; i < arr.length; i++)
{
var st = arr[i];
var text = st.substring(0, st.indexOf("[/mybb]"));
var another = st.substring(st.indexOf("[/mybb]")+7); // 7 – длина закрывающего тега. В нашем случае – 7: [/mybb]
R += "<span style=\"" + /*Стиль, которым надо оформить текст в теге*/ + "\">" + text + "</span>" + another;
}
$(this).html(R);
});
</script>

Собственно говоря – всё, теперь всё, что находится в теге [mybb][/mybb] Будет выделяться нужным нам стилем.

Теперь задача сложнее: создать тег с условием. Примером такому тегу может служить тег

Код:
[quote=<имя>][/quote]

Предположим, нам надо создать тег [mybb1=<условие>][/mybb1], который будет выделять определённым стилем текст. Пусть это будет цвет (просто для примера). Тогда можно добавить функцию GenStyle, в которой будет генерироваться нужный нам стиль. Делается это так:

<script>
function GenStyle(name)
{
  var Result = "color:" + name;
  return Result;
}

$(".post .post-content").each(function(){
var L = $(this).html();
var arr = L.split("[mybb1=");
var R = arr[0];
for (var i = 1; i < arr.length; i++)
{
var st = arr[i];
var param = st.substring(0, st.indexOf("]"));
var text = st.substring(st.indexOf("]")+1, st.indexOf("[/mybb1]"));
var another = st.substring(st.indexOf("[/mybb1]")+8); // 8 – длина закрывающего тега. В нашем случае – 8: [/mybb1]
R += "<span style=\"" + GenStyle(param) + "\">" + text + "</span>" + another;
}
$(this).html(R);
});
</script>

Цветом выделено место, где задаётся стиль.
Вот и всё, готово.

Правда, надо сказать, что эта система далека от идеала. Его минусы:
- Отсутствие защиты от дураков;
- Невозможность «вложения» одинаковых bb-кодов друг в друга.
- Требуется знание CSS администратору, который занимается созданием этого bb-кода. Но этого никуда не уйти…
Возможно, я буду это делать, но я не уверен…

В ближайших планах:
1) Смешанное условие: условие состоящие из 2 и более параметров
2) Отслеживание наличия условия
3) Bb-коды для «извращенцев»: создание своих html-тегов, не являющихся индексируемыми браузерами (он их просто выидывает), но он индексируемых CSS. Делается это ещё проще, но условие добавлять к такому очень трудно.

А, чуть не забыл… Для тега [mybb][/mybb].

<style>
#button-mybb {
background-image:url('Ссылка на иконку');
padding:0;
line-height:0;
background-position:center;
background-repeat:no-repeat;
height:26px;
width:100%}
</style>
<script type="text/javascript">
if(form=document.getElementById("form-buttons"))
form.getElementsByTagName("tr")[0].insertCell(17).innerHTML="<img src='/i/blank.gif' title='Название вашего тега' id='button-mybb' onclick=\"bbcode('[mybb]', '[/mybb]');\"/>"
</script>

А теперь для тега [mybb1=<условие>][/mybb1]. Так как я ещё не заморачивался такими вещами, как выпадающие списки, то он вставляет пока просто имя пользователя, который его вставил.

<style>
#button-mybb1 {
background-image:url('Ссылка на иконку');
padding:0;
line-height:0;
background-position:center;
background-repeat:no-repeat;
height:26px;
width:100%}
</style>
<script type="text/javascript">
if(form=document.getElementById("form-buttons"))
form.getElementsByTagName("tr")[0].insertCell(17).innerHTML="<img src='/i/blank.gif' title='Название вашего тега' id='button-mybb1' onclick=\"bbcode('[mybb1='+ UserLogin+']', '[/mybb1]');\"/>"
</script>

Теперь по цветам:
- Красный цвет – вставить то, что написано этим цветом (ссылку, надпись)
- Синий цвет – место в панеле форматирования над полем ввода, куда надо всунуть иконку с вашим bb-кодом.
- Зелёный цвет – части, которые выделены этим цветом обязательно должны совпадать.

P.S. Данная редакция гайда далеко не последняя, она будет дополняться и дополняться. Я обещаю, что долго не брошу эту тему…
P.P.S. Система проверена на моём экспериментальным сайте и на сайте ролевой, на которой я являюсь администратором. Там это реализовано как «Персональные модераторские теги». Позже я выложу на этом форуме исходный код. Ссылку не кидаю, так как не хочу лишний раз нарываться на неприятности с рекламой…
P.P.P.S. Выражаю благодарность Deff за помощь с js. Ибо я бы сам никогда не справился. Правда, помог он мне только вытягивать html код из поста… Но всё равно спасибо!

Отредактировано kozhilya (Ср, 23 Ноя 2011 19:47:46)

+2

2

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

<span style=\"" + GenStyle(param) + "\">"

kozhilya
:hobo: А не проще - на этапе анализа HTML и превращения BB- кода в текст HTML - данному заменяющему
HTML присвоить свой класс - в соответствие этому классу - прописать(заранее) css ,

0

3

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

kozhilya
А не проще - на этапе анализа HTML и превращения BB- кода в текст HTML - данному заменяющему
HTML присвоить свой класс - в соответствие этому классу - прописать(заранее) css ,

Я понял, про что ты говоришь. Но есть одна загвоздка: а если параметр на русском языке? Ведь CSS не поддерживает русские символы.

0

4

ставлю плюс, но по большому счёту это изобретение велосипеда,
лично я знаю как минимум 3 способа (шаблона) по которым можно ваять свои бб-коды,
первый способ, если не ошибаюсь придумал karpoff, и его активно использует и пропагандирует Duka,
метод этот слишком громоздкий и на мой взгляд, напичкан излишними телодвижениями,
там значит формируется строка, надо высчитывать сколько из скольких символов состоит бб-код и прочая лабудень

ваш способ, kozhilya, очень напоминает метод, который распространён на ucoz,
код короткий и имеет место быть

но сам я предпочитаю регулярные выражения, из них можно составить скрипт по принципу "Всё в одном",
т.е. налепить новых бб-кодов сколько душе угодно в одном скрипте
принцип таков:

вот этот шаблон в регулярках - (.*?) весьма универсален, подходит для любых символов и любого их количества в сроках
значение из регулярки подставляется в html код, так

[tag](.*?)[/tag] заменяется на <какой-то html тег> (значение шаблона в атрибуте) $1</какой-то html тег>
теперь с двумя значениями, например ссылка
[tag=(.*?)](.*?)[/tag] заменяется на <a (значение первого шаблона в атрибуте, например href)="$1"> (значение второго шаблона в атрибуте, например текст ссылки)$2</a>

<script language="javascript">
elm=document.getElementsByTagName("div")
for(x in elm)
{if(elm[x].className=="post-content") {
var post = elm[x].innerHTML;
if(post.indexOf("[/tag1]") != -1) {
exs = /\[tag1\](.*?)\[\/tag1\]/gi
post = post.replace(exs, "<здесь html в который преобразуется всё что находится между тегами  tag1>$1</закрытие html тега>");
};
if(post.indexOf("[/tag2]") != -1) {
mods = /\[tag2\](.*?)\[\/tag2\]/gi
post = post.replace(mods, "<здесь html в который преобразуется всё что находится между тегами  tag2>$1</закрытие html тега>");
};
if(post.indexOf("[/tag3]") != -1) {
exs = /\[tag3\](.*?)\[\/tag3\]/gi
post = post.replace(exs, "<здесь html в который преобразуется всё что находится между тегами  tag3>$1</закрытие html тега>");
};
elm[x].innerHTML = post;}}
</script>

пример один из модераторских тегов:

if(post.indexOf("[/mod]") != -1) {
mods = /\[mod\](.*?)\[\/mod\]/gi
post = post.replace(mods, "<div id='mod'><p id='mod_title'><b>Внимание!</b> Уведомление от модератора:</p><div id='mode_text'>$1</div></div>");
};

кнопки тоже можно проще делать, применяя тот же jquery,
если интересно, распишу подробнее

как видите весьма короткий универсальный шаблон, три тега в одном скрипте и это не предел

0

5

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

изобретение велосипеда

Я знаю. Но не все знают, как создавать bb-коды (втч я) нормальными методами. Если честно, я вообще на js программирую меньше 2 месяцев.

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

ваш способ, kozhilya, очень напоминает метод, который распространён на ucoz

Опа... Не знал!

А ваш код, кстати, напоминают мне мою же идею, которую я назвал способом для «извращенцев» (уж простите меня!..) Вот только я их продумал не так... Мой способ действительно извращенский... А ваш адекватнее. Я, если честно, понимаю, что регулярные выражения лучше, но я с ними не дружу... Совсем не дружу (Хотя я уже давно задумывался, что стоит бы выучиться...)

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

кнопки тоже можно проще делать, применяя тот же jquery

А вот это мне интересно :)

Отредактировано kozhilya (Ср, 23 Ноя 2011 20:55:29)

0

6

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

А вот это мне интересно

я вставляю их очень просто

$('td#button-code').before('<td style=\'background-image:url("/uploads/0002/10/47/9721-2.gif")\' onclick="tag_spolier()"><img src="/i/blank.gif" title="Спойлер"></td>');
$('td#button-code').before('<td style=\'background-image:url("/uploads/0002/10/47/9721-1.gif")\' onclick="tag_play()"><img src="/i/blank.gif" title="Загрузить музыку"></td>');
$('td#button-hide').before('<td style=\'background-image:url("/uploads/0002/10/47/9720-1.png")\' onclick="tag_foto()"><img src="/i/blank.gif" title="Создать фотогалерею"></td>');

td#button-code - это id кнопки тега [ code ] - http://petushki-city.ru//i/script_code.png
а можно выбрать и другое место, например после кнопки смайлов - td#button-smile

p.s. с регулярками надо дружить ;)

0

7

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

я вставляю их очень просто

хм... посмотрю сегодня!

P.S. Отличный повод для начала дружбы :D

0


Вы здесь » Единый форум поддержки » Корзина » [Гайд] Создание bb-кодов