Вот накалякал себе класс для разбора и подсветки исходников. Умеет подсвечивать HTML, JavaScript, CSS и PHP. Умеет автоматически переходить между режимами (т.е. разберёт и подсветит смесь из всех этих 4-х типов кода). Стили подсветки легко настраиваются редактированием конфига (просто вписываем нужные CSS-стили для определённых элементов). Легко добавляются новые ключевые слова PHP и JavaScript, можно создавать группы слов и для каждой группы свои стили подсветки. Дефолтные настройки подсветики похожи на подсветку программы Notepad++. Пока что там, конечно, немного хаотично всё наверно... И есть планы всё это немножко привести в порядок и хочу переделать в дальнейшем саму основу, чтобы было легко подключать новые парсеры (например, в планах сделать парсер SQL). Побаловаться можно тут: http://works.my-web-dev.16mb.com/php/codeparser/ Найдёте косяки в подсветке - пишите Сверху-справа есть ссылка на исходники.
челюсть отвисла....но просто ЗЕ БЕСТ!!!! ЗЫ только сегодня думал одну думу, нужна была "раскраска"...есть готовое решение...но оно...мягко говоря около метра весит СПАСИБО! Добавлено спустя 3 минуты 36 секунд: хм....вставляю сам файл исходника в форму......и писец..... Ошибка 324 (net::ERR_EMPTY_RESPONSE): Сервер разорвал соединение, не отправив данные. Добавлено спустя 1 минуту 30 секунд: О! Родил Время раскраски: 23.47034 сек., съедено памяти: 39.16 Mb
Dmitriy A. Arteshuk, Да, есть такая проблема, работает он медленно. Я и не стремился писать скрипт так, чтобы он расходовал как можно меньше ресурсов - я не рассчитывал на то, чтобы он обрабатывал код на 2500 строк и почти 100 Кбайт Предназначение класса - для раскраски небольших фрагментов кода на сайте. На сайтах/форумах всё-таки редко выкладывают огромные куски, обычно это в пределах 50 строк и с этой задачей класс справляется. Если говорить о форумах (где администратор не знает заранее, какой фрагмент запостит очередной зашедшей юзер) - то можно перед тем, как передать код классу и заставить парсить, сперва проверить длину фрагмента кода и, например, обрезать, оставив первые 2-3 тысячи символов или просто не подсвечивать особо большие фрагменты. Основная проблема тут в частых вызовах mb_substr(). Парсер посимвольно проходится по загруженному коду и в зависимости от символа - принимает то или иное решение о текущем фрагменте кода. Для того, чтобы выделить текущий символ я использовал mb_substr($code, $pos, 1) - и эта функция вызывается для каждого символа, то есть если в коде 100 000 символов - значит как минимум будет 100 000 вызовов mb_substr(). Это основной тормоз. Если заменить её на $code{$pos} - время раскраски сокращается примерно в 4-5 раз (с 23 секунд до примерно пяти на собственный исходник). Но при этом, естественно, перестаёт нормально восприниматься utf-8. Вообще, оптимизация класса входит в мои планы, как и расширение его возможностей - может придумаю, как ускорить. Есть пара идеек, но это так, чуть-чуть ускорит, конечно, но лишь чуть-чуть. Есть ещё мысля закодить его на Си и скомпилировать как либу для PHP... oksana, igordata, спасибо за отзывы
Я просто очень привык к дефолтным цветам Notepad++ Тем не менее, я ж написал выше - стили легко правятся
незачто! но есть еще и редакторы с подсветкой! ) http://codemirror.net/ для встраивания в цмс-ки само то! шаблоны и стили править прямо с админки.
Вот же блин! А я чё-то даже и не подумал, что есть готовые бесплатные решения и не пробовал их искать Даже не посетила такая мысль... Сел и накодил своё. Три дня ушло А вообще, интересно своё придумать Кстати, я вот незнаю, как оценить свою скорость работы. Три дня - это много или хорошо для такой программы? А те готовые бесплатные - умеют подсвечивать смесь и переходить от html к php, от php к html обратно и т.п.? То, что именно php, а не клиентский js-сценарий - это, наверно, моя ошибка... Даже не знаю.
3 дня зря потратил) При необходимости подобные штуки стоит уже готовыми искать. И окромя самой подсветки как опция еще должно быть его авто форматирование из одной строки в нормальный вид с переносами. Ну и там примочки в виде нумерации строк, названия стандартных функций в виде ссылок сделать на мануал, свистелки-перделки...
В результате некоторых размышлений решил переписать свой "codeparser" на JavaScript. Во-первых сервер не нагружается, во-вторых трафик экономится (никаких span-ов и div-ов со всякими "цветными" свойствами не передаётся при загрузке страницы). Был несколько удивлён, но оказалось, что JavaScript во всех браузерах (даже в тормозном FireFox) работает намного быстрее, чем PHP. Сам алгоритм остался практически неизменным, а скорость выполнения на одинаковых исходниках отличается в разы. JavaScript отрабатывает быстрее PHP раз так в 7-8 примерно. Стиль по умолчанию остался прежним, как дефолтный из Notepad++. Как и в PHP-версии, здесь (в JS-версии) тоже есть конфиг и стили легко правятся, можно легко добавить новые ключевые слова или удалить старые. Также можно создавать группы ключевых слов и для каждой группы свои цветовые правила. Потестить можно здесь: http://works.my-web-dev.16mb.com/js/codeparser/ Примечание! Не вставляйте для тестирования раскраски какой-то важный для вас секретный код, так как данный тестовый вариант скрипта все раскрашенные коды отправляет на сервер и сохраняет в б.д. (простите уж моё любопытство) Ну и краткое "Как использовать", если вдруг у кого возникнет желание. Подключаем в head-разделе, как и всякие jquery: Код (Text): <head> … <script type="text/javascript" src="codeparser.js"></script> … </head> В принципе этого достаточно, на onload он сам себя повесит. При загрузке страницы скрипт найдёт и подсветит вставки исходников. При этом должны выполняться следующие правила: Каждый исходник должен быть засунут в тег <pre>, который в свою очередь должен находиться в каком-либо контейнере (например, <div>). У тега <pre> должны быть атрибуты class="code" и title="начальный_режим", где начальный_режим – соответственно, html, js, css или php. Естественно, исходный код должен быть пропущен через htmlspecialchars() (скрипт его раскодит перед раскрашиванием, раскрасит и закодит обратно перед отображением). Вот пример вставки исходника на страницу: Код (Text): <div><pre class="code" title="html"><html> </html></pre></div>
ну, Зём, решил тут твой код пустить "в дело"...и выяснилось вот что: если на одной странице добавить 2 кода для раскраски Код (Text): <body> <div><pre class="code" title="php"><?php echo(htmlspecialchars($content, ENT_QUOTES, 'utf-8')); ?></pre></div> <div><pre class="code" title="php"><?php echo(htmlspecialchars($content2, ENT_QUOTES, 'utf-8')); ?></pre></div> </body> то первый замечательно раскрасит, а вот второй кусок просто выведет в браузер код....но он будет не раскрашенный это у меня руки из ..опы и обе левые....или действительно косяк? да, использую JS файлик... Добавлено спустя 44 минуты 52 секунды: и еще вот какой косяк вылез, если строка кода длинная, то....код тянется и вылезает хрен знает куда.... http://www.webpagescreenshot.info/img/599882-5312012115743AM внизу отметил красным
Привет! Руки растут правильно, это я накосячил Причину нашёл, сейчас поправлю через полчасика. Правда не ожидал такого поведения (не знал просто) - в JavaScript, когда объект, на который ссылается элемент массива, перестаёт существовать в DOM - то и элемент массива удаляется. Но самое интересное дальше - после того, как исчез элемент массива - то все числовые ключи пересчитались заново с нуля. Таким образом, конструкция for(i in array) выполняется не так как надо, на второй итерации переменная i уже равна 1, а элемента такого - нет, он уже переименовался в 0...
Обновил архив и тестовый вариант. Изменения: + исправлена подсветка строк в JavaScript (теперь если перед символом перевода строки стоит backslash - то выход из режима строки не происходит) + html-теги перехода в режим JS/CSS (<script ...>, <style ...>) теперь не регистрозависимы (раньше воспринимались только теги, записанные в нижнем регистре) + исправлена ошибка, из-за которой подсвечивался только первый исходник на странице + длинные строки исходного кода, не умещающиеся в контейнер по ширине теперь будут переноситься (!Переносятся только по символам, по которым браузер переносит строки - например, пробел или дефис. Длинная строка, состоящая из одних букв и цифр не перенесётся).