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====';


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