Подключение 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); }); }); |
ureech,
М.б. инициализацию highlight делать не по $(document).ready, а по завершении работы bbcodeParser? |
Да, разобрался, спасибо.Заработало, но на половину.Спрошу здесь, если не по теме пойду на другой форум.Код работает только в одну строку, если есть перенос то не парсит.Т.е. так работает
[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, но что то не выходит |
ureech,
Перед парсером строку распарса нужно препарсить и заменить & на &и угловые скобки на < , > Затем из строки изымают блоки [code] в стек, заменяя их в строке на boundary+n.stack+boundary и вставляя назад после парсера BB-кодов(дабы не парсило BB-теги в блоках с кодами) |
Deff,
Сори, но я мало что понял, но главное не вижу в коде \n и что такое нун? :) Если можно, ткните носом или ссылку на пример. |
Цитата:
\n - спецсимвол перевода строки (обычно его и не увидишь, (просто следущая подстрока отображается с новой строчки) Цитата:
|
Понятно,сенкс.
|
Вложений: 1
Что то не выходит ничего. Пробовал в коде дописать сюда
'CODE' : '(.*?)' -> 'CODE' : '([.*?]\n)' ничего не меняется. Хотел добавить символ сюда var token_match = /{([A-Z_]+[0-9]*)\n}/ig; Вообще не работает. Может подскажите? :) |
В общем жрёт парсер символ \n. Посмотрел исходный код и там после записи в LocalStorage
{"mess":"[code=php] function b_2html($elem) {\n return '<strong>'.$this ->[/code]"} а после [code=php] function b_2html($elem) { return '<strong>'.$this ->[/code] |
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,'&').replace(/</g,'<').replace(/>/g,'>'); 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===='; |
Ещё на шаг ближе.:)
С переносом получилось. Но работает только с 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=='.Что это что с ним делать. |
Цитата:
s - найденная подсрока pn - найденная скобка (по порядковому номеру - три скобки - три параметра |
Цитата:
//После распарса парсером //вставляем назад перепарсенные теги код из стека (ток их надо самому распарсить, заменить начальный тег(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]; }); |
Вроде всё получилось. Большое спасибо, теперь попробую самостоятельно с audio и video справиться.:)
|
Вложений: 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>'); Для сойлера соответственно свой, для кода в спойлере я допишу, но как заставить использовать нужный? |
Цитата:
Либо заводить на каждый иной блок код новый массив стека, с иным именем(не вижу в этом смысла) И ставя второй раз stack = [] - вы убили все данные, добавленные в Первом цикле ================ Про спойлер, Есть некий Вариант с прописыванием своих собственных функций обработки http://javascript.ru/forum/misc/2493...tml#post403467 |
Понятно. Спасибо.
|
Часовой пояс GMT +3, время: 23:37. |