Сколько смотрел простых функций и библиотек - ни одна не понравилась. Поэтому уже очень давно хотел сделать свою, заступорился и забил. Сейчас хочу реализовать подсветку на JS. Посмотрел текущие реализации - не понравились. Начал писать свою, но напоролся на проблему. Например, возьмем код: Код (Text): require_once 'Zend2.php'; /** * @see getUri() */ $uri = explode(":", $uri, 2); По сути дела, подсвечивать необходимо следующее: 1. Строки 2. Числа 3. Операторы 4. Комментарии 5. Управляющие конструкции 6. Переменные На первый взгляд все просто. Но если посмотреть глубже - впадаю в ступор. 1. Допустим, подсвечиваю строки: Код (Text): require_once <span class="string">'Zend2.php'</span>; /** * @see getUri() */ $uri = explode(<span class="string">":"</span>, $uri, 2); 2. Подсвечиваю числа Код (Text): require_once <span class="string">'Zend<span class="digit">2</span>.php'</span>; /** * @see getUri() */ $uri = explode(<span class="string">":"</span>, $uri, <span class="digit">2</span>); Как видно, в первой же строке ошибка - число в комментарии подчеркиваться не должно 3. Подсвечиваю операторы Код (Text): require_once <span class="operator"><</span>span class="string"<span class="operator">></span>'Zend<span class="digit">2</span><span class="operator">.</span>php'</span>; ... ???
Не парья возьми готовую либу... Я уже два месяца пишу подсветку. Ты еще не представляешь сколько проблем. Могу сразу подсказать. Нужно парсить посимвольно и кусками в перемешку, иначе код типа : PHP: <?php /** *Привет мед' "1вед" */ $this->__toString('asdj"jdslkf', "sadf'asdjl"); тупо заменами, даже с коллбеками не поддастся...
И какую интересно простоту ты хочешь? Какие смотрел? PEAR? На JS видел одну библу. Принцип: разрисовывает всеми языками, какой больше подойдет - тот и оставляет. Ну это я так к слову о JS. Лично я забил на свою реализацию подсветки, ибо все довольно сложно. Даже в том же php. Разрисовать html, а в нем php. Это вобще жесть. Плюс куча всяких моментов. Короче остановился на GeSHi. Меня вполне устроило, окромя как ее глюки с mbstring.func_overload > 0. Сейчас парюсь по этому поводу в соседнем топике.
В принципе, там нужно смотреть, нет ли <span(.*?)>вокруг тегов</span> 9 Кб - это много. Основная идея хранить - подсчечивать в JS, чтобы не разукрашивать его каждый раз. И JS может сохранить много кб =)
Я кэширую и 9 кб только на один раз. В принципе? Ну-ну, я буду следить за этим топиком. Или ты мне не доверяешь?
PHP: <? $code = "void main()\n{\n\t/* Main Function */\n}\n\n"; if(preg_match('{/\*(.*?)\*/}s', $code, $commented_code)) { echo $code; print_r($commented_code); } ?> Outputs: Код (Text): void main() { /* Main Function */ } Array ( [0] => /* Main Function */ [1] => Main Function ) Али я не понял)
[js]var expr = RegExp('/\\*(.+?)\\*/'); var comm = expr.exec("void main()\n{\n\t/* Main Function */\n}\n\n"); document.write(comm[1]);[/js] Вот, теперь пойду похаваю
ПыСы: В объекте RegExp никаких ограничителей / — нет. В РНР они введены для указания модификаторов, в строковых реализациях JS — тоже, но когда используем объект, модификаторы указываются в качестве второго аргумента. Эти я так, ВДРУГ кто не знает. Всего лишь вдруг, но это наврядле.
Конечно сомнительно, но вдруг: [js]var expr = RegExp('/\\*(.+?)\\*/', "m"); var comm = expr.exec("void main()\n{\n\t/* Main Function */\n}\n\n"); document.write(comm[1]);[/js] Я использовать стараюсь только объекты: удобно и практично. Можно в студию реальный файл или его часть? Прям с ним будем пробовать.
Код (Text): require_once 'Zend.php'; require_once 'Zend/Uri/Exception.php'; require_once 'Zend/Uri/Http.php'; require_once 'Zend/Uri/Mailto.php'; abstract class Zend_Uri { /** * Return a string representation of this URI. * * @see getUri() * @return "string" */ public function __toString() { return $this->getUri(); } /* /* 'bl"a"bla' */ static public function factory($uri = 'http') { $uri = explode(":", $uri, 2); $scheme = strtolower($uri[0]); $schemeSpecific = isset($uri[1]) ? $uri[1] : ''; $string = 'LOL"!"'; // Security check: $scheme is used to load a class file, // so only alphanumerics are allowed. if (!ctype_alnum($scheme)) { throw new Zend_Uri_Exception('Illegal scheme'); } } }
Всему виной точка, которая не работает с переносами ... Думаем, чем заменить .. [js]var expr = RegExp('/\\*([^\x00]+?)\\*/'); var comm = expr.exec(document.getElementById('code').innerHTML); for(i = 0; i < comm.length; i++) { alert(comm); }[/js] Пробуем вписать нулевой символ, который, по-идее, не может присутствовать в тексте. Вроде работает корректно, проверял.
Эврика, спасибо! var reg = new RegExp('(/\\*((.|\r|\n)*?)\\*\/)', "gi"); Ага, так и есть! Блин, вчера всю ночь потратил с этим :cry:
Apple Там обязан быть флаг для много строчных текстов. в PHP PRCE это флаг m (http://lv.php.net/manual/ru/reference.p ... ifiers.php)