День добрый!
Возникла необходимость добавить ббкоды для подсветки синтаксиса нескольких экзотичных программерских-языков.
Естественно, написать свой обработчик для подсветки, мне не по силам. Возникла идея использовать чужие библиотеки. Остановил свой выбор на
GeSHi http://qbnz.com/highlighter/
Порывшись по тырнету, посмыкав тут и там коды(оказалось я не первый такой умник
), наваял вот такой продукт:
http://1drv.ms/1LeRqDv
-----------------------------
Сам по себе ббкод работает нормально. Но...
GeSHi, позволяет генерировать номера строк в выводимом результате, и это очень полезно для нас, так как при разборе кода, можно ссылаться на эти номера. Однако, если понадобиться скопировать код или его кусок, то тут эти номера - очень не кстати. Избавляться от них довольно муторно и не удобно.
Поэтому возникла необходимость избавляться от этих номеров и желательно "на лету".
Можно конечно добавить в юзерцп опцию вкл/выкл номеров строк или сделать два ббкода для каждого языка(с параметром вкл номера строк). И если последнее, более менее лаконичное решение, а первое более грамоздкое, то оба они всё-равно потребуют перезагрузки страницы. Ну и тот кто захочет скопировать код, не сможет изменить параметр в чужом сообщении.
Вот я и задался вопросом, а вообще реально ли сделать так, что-бы можно было изменять отображение выводимого ббкодом куска на лету?
Рыть начал в сторону ajax-а, но пока без особых успехов. Столкнулся с проблемой полного непонимания, того как можно сторонним php скриптом, вмешаться в содержимое сообщения? Так сказать, правильно сформированной цепочке классов, благодаря которой это станет возможным.
Что я предпринял?
На хуке
bbcode_create, я добавил функцию из класса geshi:
PHP Code:
$geshi->set_header_content('<script type="text/javascript" src="/geshi/scripts/geshi.js"></script><a href="#" onclick="loadXMLDoc()">click to call function</a>');
Эта функция в div-е хидера вставляет html код из параметра.
Вот содержимое js который я впихнул в хидер:
HTML Code:
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
// do something if the page loaded successfully
}
}
xmlhttp.open("GET","ajax_geshi.php",true);
xmlhttp.send();
}
Вот содержимое файла
ajax_geshi.php(точнее одна из его вариаций):
PHP Code:
<?php
require_once('global.php');
function call_me(){
$geshi->enable_line_numbers(GESHI_NO_LINE_NUMBERS);
}
call_me();
?>
В ответ вполне резонно получаю:
PHP Code:
PHP Fatal error: Call to a member function enable_line_numbers() on a non-object in myroot\-maint-\ajax_geshi.php on line 4
Возможно ли это побороть, или я вообще НЕ на верном пути?