Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Подключение bbcode к LocalStorage (https://javascript.ru/forum/dom-window/61404-podklyuchenie-bbcode-k-localstorage.html)

ureech 17.02.2016 09:32

Подключение bbcode к LocalStorage
 
Вложений: 1
Здравствуйте. Имею код, спасибо за помощь сообществу,для предосмотра сообщений.Для работы bbcode подключил ф-цию bbcodeParser, нашёл в инете. Всё работает, но не хватает кое чего, в том числе [code=php]. Решил использовать скрипт highlight.js. Дописал в bbcodeParser что надо, что бы парсил bbcode [code=php] в то, что нужно highlight.js но как его связать с bbcodeParser не понимаю.Прошу помощи. :help:
Вот подключение bbcodeParser и вывода LocalStorage

function GetStorage() {
if (localStorage.currPerson !== undefined) {
var user = JSON.parse(localStorage.currPerson)
var bbcode = bbcodeParser.bbcodeToHtml(user.mess);
            $(get_mes).empty().append(bbcode)
..................................
}
}

bbcodeParser во вложении.
Сейчас на выходе имею
<pre><code class="php">/**здесь мой код**/</code></pre>
Но класс не подхватывается, как в прочем наверное и сам js. Класс и скрипт подключил в шаблоне в котором выводится код.

<script src="/components/forum/highlight/highlight.pack.js" type="text/javascript"></script>
<link href="/components/forum/highlight/styles/default.css" rel="stylesheet" type="text/css">
$(document).ready(function() {
  $('pre code').each(function(i, block) {
    hljs.highlightBlock(block);
  });
});

Dilettante_Pro 17.02.2016 13:07

ureech,
М.б. инициализацию highlight делать не по $(document).ready, а по завершении работы bbcodeParser?

ureech 17.02.2016 15:08

Да, разобрался, спасибо.Заработало, но на половину.Спрошу здесь, если не по теме пойду на другой форум.Код работает только в одну строку, если есть перенос то не парсит.Т.е. так работает
[code=php]$model = new cms_model_forum();[/code]
или так
[code=php]$model = new cms_model_forum();[/code]
[code=php]$model = new cms_model_forum();[/code]
а так нет
[code=php]$model = new cms_model_forum();
$model = new cms_model_forum();[/code]


Думаю дело в регулярке, пытался опции дописать в bbcodeParser, но что то не выходит

Deff 17.02.2016 15:14

ureech,
Перед парсером строку распарса нужно препарсить и заменить & на &и угловые скобки на &lt; , &gt;
Затем из строки изымают блоки [code] в стек, заменяя их в строке на boundary+n.stack+boundary и вставляя назад после парсера BB-кодов(дабы не парсило BB-теги в блоках с кодами)

ureech 17.02.2016 15:39

Deff,
Сори, но я мало что понял, но главное не вижу в коде \n и что такое нун?
:) Если можно, ткните носом или ссылку на пример.

Deff 17.02.2016 17:40

Цитата:

Сообщение от ureech
нун

нужно
\n - спецсимвол перевода строки (обычно его и не увидишь, (просто следущая подстрока отображается с новой строчки)
Цитата:

Сообщение от ureech
Если можно, ткните носом или ссылку на пример.

Просмотрите таблицу в регулярных выражениях http://javascript.ru/basic/regular-e...nom-vyrazhenii

ureech 17.02.2016 19:53

Понятно,сенкс.

ureech 18.02.2016 11:45

Вложений: 1
Что то не выходит ничего. Пробовал в коде дописать сюда
'CODE' : '(.*?)' -> 'CODE' : '([.*?]\n)'
ничего не меняется.
Хотел добавить символ сюда
var token_match = /{([A-Z_]+[0-9]*)\n}/ig;

Вообще не работает. Может подскажите? :)

ureech 18.02.2016 14:00

В общем жрёт парсер символ \n. Посмотрел исходный код и там после записи в LocalStorage
{"mess":"[code=php]    function b_2html($elem) {\n        return '<strong>'.$this ->[/code]"}


а после

[code=php]    function b_2html($elem) {
        return '<strong>'.$this ->[/code]

Deff 18.02.2016 21:51

ureech,
Ну просто входную строку перед парсером
var str ="asdasdasdasd\nasdasdasd";
str = str.replace(/\n/g,'<br>');
alert(str)

Блоки BB-код [code=...]что-то[/code] нун вытаскивать из строки до парсера
ну короче:

var str = "asdas&da<sda>sd\nas[code=XXX]dasdasd[/code]asdasdasdasd\nas[code=YYY]dasdasd[/code]вавапвапвапва";
//Тут парсим & и угловые скобки
str = str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
alert(str);
//Вынимаем теги [code] из строки
var stack = [], j=-1, bound = '==bound==';
str = str.replace(/(\[code(:?=[^\]]+)?\])(.*?)(\[\/code\])/gi, function (s,p1,p2,p3){
    stack[++j]=[p1,p2,p3]; return bound+j+bound;
});
//Заменяем \n на <br>
str = str.replace(/\n/g,'<br>');
alert(str); /*Эту строку можно запихивать в парсер*/

Теги [code] парсим в стеке, вставляем их обратно в стек же, вместо [p1,p2,p3] и значение стека(распарсенный тег [code]) вставляем после распарса всей строки в парсере, заменяя ==bound==NUMstack==bound== на значение стека.

Типично boundary(разделитель или селектор) более длинный, типо bound = '====12358====';

ureech 19.02.2016 12:09

Ещё на шаг ближе.:)
С переносом получилось. Но работает только с php и css кодом, c html не хочет.Потому, как в этой части кода
var stack = [], j=-1, bound = '==bound==';
str = str.replace(/(\[code(:?=[^\]]+)?\])(.*?)(\[\/code\])/gi, function (s,p1,p2,p3){
    stack[++j]=[p1,p2,p3]; return bound+j+bound;
});

мне не понятно,что такое s,p1,p2,p3?
И не понятен '==bound=='.Что это что с ним делать.

Deff 19.02.2016 18:39

Цитата:

Сообщение от ureech
s,p1,p2,p3?

Ну давал жи ссылку на страницу с регулярками
s - найденная подсрока
pn - найденная скобка (по порядковому номеру - три скобки - три параметра

Deff 19.02.2016 18:44

Цитата:

Сообщение от ureech
И не понятен '==bound=='.Что это что с ним делать.

//После распарса парсером
//вставляем назад перепарсенные теги код из стека (ток их надо самому распарсить, заменить начальный тег(p1), к примеру на '<div><pre>', конечный(p3) - на '</pre></div>'; меж ними p2 =>(контент), т.е в каждой ячейке стека должен быть распарсенный тег, вместо массива [p1,p2,p3]
//str - строка после парсера, меняем "==bound==NUMstack==bound==", на распарсенный тег из стека
str = str.replace(/==bound==(\d+)==bound==/g, function (s,p1){
   return stack[+p1];
});

ureech 19.02.2016 21:11

Вроде всё получилось. Большое спасибо, теперь попробую самостоятельно с audio и video справиться.:)

ureech 20.02.2016 14:31

Вложений: 1
Возник небольшой баг. Если я оборачиваю строку в код, а затем в спойлер, то при сохранении строка в спойлере выглядит как строка, а не код.
Путь для решения ясен.
Добавляю к существующей
var cod = /(\[code(:?=[^\]]+)?\])(.*?)(\[\/code\])/gi;

переменную
var sp_cod = /(\[spoiler(:?=[^\]]+)?\]\[code(:?=[^\]]+)?\])(.*?)(\[\/code\]\[\/spoiler\])/gi;

для использования в стеке
a.mess = (a.mess).replace(sp_cod, function (s,p1,p2,p3){
    stack[++j]=[p1,p2,p3]; return bound+j+bound;
});

Но не могу сообразить как правильно условие прописать здесь, а затем и в парсере.
Если здесь думаю что так
if(cod){
var stack = [], j=-1, bound = '==bound==';
a.mess = (a.mess).replace(cod, function (s,p1,p2,p3){
    stack[++j]=[p1,p2,p3]; return bound+j+bound;
});
}
if(sp_cod){
var stack = [], j=-1, bound = '==bound==';
a.mess = (a.mess).replace(sp_cod, function (s,p1,p2,p3){
    stack[++j]=[p1,p2,p3]; return bound+j+bound;
});
}


То в парсере вообще не знаю. Там используется такой метод
me.addBBCode('[code=php]{CODE}[/code]', '<code>{CODE}</code>');

Для сойлера соответственно свой, для кода в спойлере я допишу, но как заставить использовать нужный?

Deff 20.02.2016 15:51

Цитата:

if(cod){
var stack = [], j=-1, bound = '==bound==';
a.mess = (a.mess).replace(cod, function (s,p1,p2,p3){
stack[++j]=[p1,p2,p3]; return bound+j+bound;
});
}
if(sp_cod){
var stack = [], j=-1, bound = '==bound=='; //строка лишняя
a.mess = (a.mess).replace(sp_cod, function (s,p1,p2,p3){
stack[++j]=[p1,p2,p3]; return bound+j+bound;
});
}
По идее все блоки c кодами нужно складывать в один стек и индекс j продолжать наращивать, а не сбрасывать в -1
Либо заводить на каждый иной блок код новый массив стека, с иным именем(не вижу в этом смысла)
И ставя второй раз stack = [] - вы убили все данные, добавленные в Первом цикле
================
Про спойлер,
Есть некий Вариант с прописыванием своих собственных функций обработки
http://javascript.ru/forum/misc/2493...tml#post403467

ureech 20.02.2016 16:10

Понятно. Спасибо.


Часовой пояс GMT +3, время: 23:37.