За последние 24 часа нас посетил 22791 программист и 1267 роботов. Сейчас ищут 776 программистов ...

Подсветка исходников

Тема в разделе "Решения, алгоритмы", создана пользователем sobachnik, 17 май 2012.

  1. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот накалякал себе класс для разбора и подсветки исходников.
    Умеет подсвечивать HTML, JavaScript, CSS и PHP. Умеет автоматически переходить между режимами (т.е. разберёт и подсветит смесь из всех этих 4-х типов кода). Стили подсветки легко настраиваются редактированием конфига (просто вписываем нужные CSS-стили для определённых элементов). Легко добавляются новые ключевые слова PHP и JavaScript, можно создавать группы слов и для каждой группы свои стили подсветки.
    Дефолтные настройки подсветики похожи на подсветку программы Notepad++.
    Пока что там, конечно, немного хаотично всё наверно... И есть планы всё это немножко привести в порядок и хочу переделать в дальнейшем саму основу, чтобы было легко подключать новые парсеры (например, в планах сделать парсер SQL).

    Побаловаться можно тут: http://works.my-web-dev.16mb.com/php/codeparser/
    Найдёте косяки в подсветке - пишите :)
    Сверху-справа есть ссылка на исходники.
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    челюсть отвисла....но просто ЗЕ БЕСТ!!!!

    ЗЫ только сегодня думал одну думу, нужна была "раскраска"...есть готовое решение...но оно...мягко говоря около метра весит :)

    СПАСИБО!

    Добавлено спустя 3 минуты 36 секунд:
    хм....вставляю сам файл исходника в форму......и писец.....

    Ошибка 324 (net::ERR_EMPTY_RESPONSE): Сервер разорвал соединение, не отправив данные.

    Добавлено спустя 1 минуту 30 секунд:
    О! Родил :)

    Время раскраски: 23.47034 сек., съедено памяти: 39.16 Mb
     
  3. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Ничего себе =) а можешь подсказать учебник по php чтобы хоть рядышком быть у твоего уровня =) ?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Круто!

    Добавлено спустя 16 секунд:
    реально
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    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
    ,
    спасибо за отзывы :)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а я люблю переменные жирненьким делать, а строковые значения не серым, а то их не видно. =)
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я просто очень привык к дефолтным цветам Notepad++
    Тем не менее, я ж написал выше - стили легко правятся :)
     
  8. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    интересная штука :)
    на гитхаб будете выкладывать?

    кстати, а чем ненравятся клиентские решения на js?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а какие? =)
     
  10. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  12. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    незачто!

    но есть еще и редакторы с подсветкой! ;))

    http://codemirror.net/

    для встраивания в цмс-ки само то! шаблоны и стили править прямо с админки.
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот же блин! А я чё-то даже и не подумал, что есть готовые бесплатные решения и не пробовал их искать :) Даже не посетила такая мысль... Сел и накодил своё. Три дня ушло :)
    А вообще, интересно своё придумать :)
    Кстати, я вот незнаю, как оценить свою скорость работы. Три дня - это много или хорошо для такой программы?
    А те готовые бесплатные - умеют подсвечивать смесь и переходить от html к php, от php к html обратно и т.п.?

    То, что именно php, а не клиентский js-сценарий - это, наверно, моя ошибка... Даже не знаю.
     
  14. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    3 дня зря потратил)
    При необходимости подобные штуки стоит уже готовыми искать. И окромя самой подсветки как опция еще должно быть его авто форматирование из одной строки в нормальный вид с переносами. Ну и там примочки в виде нумерации строк, названия стандартных функций в виде ссылок сделать на мануал, свистелки-перделки...
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    практики шаолиня никогда не бывают зряшными :D
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    риспект! время не зря потратил. а то что медленно это не беда, можно прикрутить кеширование.
     
  17. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В результате некоторых размышлений решил переписать свой "codeparser" на JavaScript. Во-первых сервер не нагружается, во-вторых трафик экономится (никаких span-ов и div-ов со всякими "цветными" свойствами не передаётся при загрузке страницы).

    Был несколько удивлён, но оказалось, что JavaScript во всех браузерах (даже в тормозном FireFox) работает намного быстрее, чем PHP. Сам алгоритм остался практически неизменным, а скорость выполнения на одинаковых исходниках отличается в разы. JavaScript отрабатывает быстрее PHP раз так в 7-8 примерно.

    Стиль по умолчанию остался прежним, как дефолтный из Notepad++. Как и в PHP-версии, здесь (в JS-версии) тоже есть конфиг и стили легко правятся, можно легко добавить новые ключевые слова или удалить старые. Также можно создавать группы ключевых слов и для каждой группы свои цветовые правила.

    Потестить можно здесь:
    http://works.my-web-dev.16mb.com/js/codeparser/
    Примечание! [​IMG] Не вставляйте для тестирования раскраски какой-то важный для вас секретный код, так как данный тестовый вариант скрипта все раскрашенные коды отправляет на сервер и сохраняет в б.д. (простите уж моё любопытство)

    Ну и краткое "Как использовать", если вдруг у кого возникнет желание.

    Подключаем в head-разделе, как и всякие jquery:
    Код (Text):
    1. <head>
    2.     …
    3.     <script type="text/javascript" src="codeparser.js"></script>
    4.     …
    5. </head>
    В принципе этого достаточно, на onload он сам себя повесит. При загрузке страницы скрипт найдёт и подсветит вставки исходников. При этом должны выполняться следующие правила:

    • Каждый исходник должен быть засунут в тег <pre>, который в свою очередь должен находиться в каком-либо контейнере (например, <div>).
    • У тега <pre> должны быть атрибуты class="code" и title="начальный_режим", где начальный_режим – соответственно, html, js, css или php.
    • Естественно, исходный код должен быть пропущен через htmlspecialchars() (скрипт его раскодит перед раскрашиванием, раскрасит и закодит обратно перед отображением).

    Вот пример вставки исходника на страницу:
    Код (Text):
    1. <div><pre class="code" title="html">&lt;html&gt; &lt;/html&gt;</pre></div>
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    сервер разный бывает...
     
  19. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    браво, что тут еще скажешь! :) так держать!!!
     
  20. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну так сравнение с локалхостом. Т.е. и JavaScript и PHP работали на одном и том же компе...
     
  21. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ну, Зём, решил тут твой код пустить "в дело"...и выяснилось вот что:

    если на одной странице добавить 2 кода для раскраски

    Код (Text):
    1.  
    2. <body>
    3.     <div><pre class="code" title="php"><?php echo(htmlspecialchars($content, ENT_QUOTES, 'utf-8')); ?></pre></div>
    4.         <div><pre class="code" title="php"><?php echo(htmlspecialchars($content2, ENT_QUOTES, 'utf-8')); ?></pre></div>
    5. </body>
    то первый замечательно раскрасит, а вот второй кусок просто выведет в браузер код....но он будет не раскрашенный :(
    это у меня руки из ..опы и обе левые....или действительно косяк?

    да, использую JS файлик...

    Добавлено спустя 44 минуты 52 секунды:
    и еще вот какой косяк вылез, если строка кода длинная, то....код тянется и вылезает хрен знает куда....

    http://www.webpagescreenshot.info/img/599882-5312012115743AM

    внизу отметил красным
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Привет!
    Руки растут правильно, это я накосячил :) Причину нашёл, сейчас поправлю через полчасика. Правда не ожидал такого поведения (не знал просто) - в JavaScript, когда объект, на который ссылается элемент массива, перестаёт существовать в DOM - то и элемент массива удаляется. Но самое интересное дальше - после того, как исчез элемент массива - то все числовые ключи пересчитались заново с нуля. Таким образом, конструкция for(i in array) выполняется не так как надо, на второй итерации переменная i уже равна 1, а элемента такого - нет, он уже переименовался в 0...
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    И не говори. Js как минное поле.
     
  24. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ок, спасибо, жду!!!
     
  25. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Обновил архив и тестовый вариант.

    Изменения:
    + исправлена подсветка строк в JavaScript (теперь если перед символом перевода строки стоит backslash - то выход из режима строки не происходит)
    + html-теги перехода в режим JS/CSS (<script ...>, <style ...>) теперь не регистрозависимы (раньше воспринимались только теги, записанные в нижнем регистре)
    + исправлена ошибка, из-за которой подсвечивался только первый исходник на странице
    + длинные строки исходного кода, не умещающиеся в контейнер по ширине теперь будут переноситься (!Переносятся только по символам, по которым браузер переносит строки - например, пробел или дефис. Длинная строка, состоящая из одних букв и цифр не перенесётся).