Ответ 1
Введение
Так как Поддержка Mathematica для google-code-prettify была в основном разработана для нового Mathematica.Stackexchange, см. также обсуждение здесь.
Введение
У меня нет глубоких знаний обо всем этом, но были времена, когда я написал плагин cweb для Idea, чтобы там был выделен мой код. В среде IDE все это не одношаговый процесс. Он разделен на несколько этапов, и каждый шаг имеет больше возможностей подсветки. Позвольте мне объяснить это немного, чтобы дать несколько причин, почему некоторые вещи (imho) невозможны для выделенного кода, который нам нужен здесь.
Сначала код разбивается на токены, которые являются отдельными частями языка программирования. После этого lexer вы можете классифицировать интервалы своего кода, например. пробел, литерал, строка, комментарий и т.д. Этот лексер использует исходный код, проверяя регулярные выражения, сохраняя тип токена для текстового диапазона и делая шаг вперед в коде.
После этого лексического сканирования исходный код может быть проанализирован с использованием правил языка программирования, токенов и базового кода. Например, если у нас есть токен Plus
, который имеет тип Keyword
, то мы знаем, что должны следовать скобки и параметр. Если нет, синтаксис неверен. То, что вы можете построить с помощью этого синтаксического анализа, называется абстрактным синтаксическим деревом AST, и выглядит в основном как TreeForm
синтаксиса Mathematica.
С хорошо разработанным языком, например Java, можно проверить код во время ввода и сделать почти невозможным запись синтаксически неправильного кода.
prettify.js и Mathematica Code
Во-первых, prettify.js реализует только лексический сканер, но не парсер. Я уверен, что в любом случае это будет невозможно в отношении ограничений времени для отображения веб-страницы. Поэтому позвольте мне объяснить, какие функции невозможны/возможны с помощью prettify.js:
Кроме того, вы можете заметить некоторые из переменных, выделенных оранжевым - я Целенаправленно не включал это как требование, поскольку я думаю, что это будет намного сложнее обойтись без парсера, который знает Mathematica.
Правильно, потому что выделение этих переменных зависит от контекста. Вы должны знать, что вы находитесь внутри конструкции Table
или что-то в этом роде.
Взлом prettify.js
Я думаю, что взломать расширение для prettify.js не так сложно. Я абсолютное регулярное выражение noob, поэтому будьте готовы к тому, что следует.
Нам не нужно столько материала для простой лексики Mathematica. У нас есть пробелы, комментарии, строковые литералы, фигурные скобки, множество операторов, обычные литералы, такие как переменные и гигантский список ключевых слов.
Давайте начнем с ключевых слов в java- script regexp-form:
Export["google-code-prettify/keywordsmma.txt",
StringJoin @@ Riffle[Apply[StringJoin,
Partition[Riffle[Names[RegularExpression["[A-Z].*"]],
"|"], 100], {1}], "'+ \n '"], "TEXT"]
Регулярное выражение для пробелов и строковых литералов может быть скопировано с другого языка. Комментарии сопоставляются чем-то вроде
/^\(\*[\s\S]*?\*\)/
Это происходит неправильно, если у нас есть комментарии внутри комментариев, но на данный момент мне все равно. У нас есть скобки и скобки
/^(?:\[|\]|{|}|\(|\))/
У нас есть что-то вроде blub_boing
, которое должно быть сопоставлено отдельно.
/^[a-zA-Z$]+[a-zA-Z0-9$]*_+([a-zA-Z$]+[a-zA-Z0-9$]*)*/
У нас есть слоты #, ##, # 1, ## 9 (в настоящее время может следовать только одна цифра)
/^#+[0-9]?/
У нас есть имена переменных и другие литералы. Им нужно начинать с буквы или $, а затем следовать буквам, цифрам и $. В настоящее время \[Gamma]
не сопоставляется как один литерал, но на данный момент это нормально.
/^[a-zA-Z$]+[a-zA-Z0-9$]*/
И у нас есть операторы (я не уверен, что этот список завершен).
/^(?:\+|\-|\*|\/|,|;|\.|:|@|~|=|\>|\<|&|\||_|`|\^)/
Update
Я немного почистил материал, немного отлаживал и создал стиль цвета, который выглядит красиво для меня. Следующие вещи работают, насколько я могу видеть правильно:
- Все системные символы, которые можно найти через
Names[RegularExpression["[A-Z].*"]]
, сопоставляются и выделяются синим цветом - Скобки и скобки - черные, но жирные шрифты. Это было предложение от Szabolcs, и мне это очень нравится, поскольку он определенно добавляет некоторую энергию к появлению кода
- Шаблоны, как они появляются в определениях функций, и слоты с чистыми функциями выделяются зеленым цветом. Это было предложено Йодой и идет вместе с маркером в интерфейсе Mathematica. Шаблоны только зеленые в сочетании с переменной, как в
blub__Integer
,a1_
или вb34_Integer32
. Тестовые функции для шаблона, как вnum_?NumericQ
, являются только зелеными границами вопросительного знака. - Комментарии и строки имеют одинаковый цвет. Комментарии и строки могут переходить по нескольким строкам. Строки могут включать в себя цитаты с обратной косой чертой. Комментарии не могут быть вложенными.
- Для окраски я последовательно использовал схему
ColorData[1]
, чтобы цвета выглядели красиво рядом.
В настоящее время это выглядит так:
Тестирование и отладка
Сабольч спросил, можно ли и как это проверить. Это очень просто: вам нужен мой источник для кода google-code-prettify (Где я могу поместить это, чтобы каждый имел доступ?). Распакуйте источники и откройте файл tests/mathematica_test.html
в веб-браузере. Этот файл загружает сами файлы src/prettify.js
, src/lang-mma.js
и src/prettify-mma-1.css
.
- в
lang-mma.js
вы находите регулярное выражение, которое использует лексер при разбиении кода на токены. - в
prettify-mma-1.css
вы найдете определения стилей, которые я использую
Чтобы протестировать свой собственный код, просто откройте mathematica_test.html
в редакторе и вставьте материал между тегами pre
. Перезагрузите страницу, и ваш код должен появиться.
Отладка: Если маркер работает неправильно, вы можете отлаживать его с помощью IDE или с помощью Google-Chrome. В Chrome вы отмечаете слово, в котором маркер начинает сбой и делает правый клик и Inspect Element
. То, что вы видите тогда, является базовым кодом html-highlight. Там вы можете увидеть каждый отдельный токен, и вы видите, какой тип маркера. Тогда это выглядит как
<span class="tag">[</span>
Вы видите, что открытая скобка имеет тип tag
. Это соответствует определению regexp, которое я сделал в lang-mma.js
. В Chrome можно даже просматривать JS-код, устанавливать точки останова и отлаживать его при перезагрузке вашей страницы.
Локальная установка для Google Chrome и Firefox
Тим Стоун был так добр, чтобы написать script, который вводит маркер во время загрузки сайтов под http://stackoverflow.com/questions/
. Как только google-code-prettify включен для mathematica.stackexchange.com
, он тоже должен работать.
Я адаптировал этот script для использования моих лексических правил сканирования и цветов. Я слышал, что в Firefox script работает не всегда, но вот как его установить:
- Chrome: Следуйте по этой ссылке https://github.com/halirutan/Mathematica-Source-Highlighting/raw/master/mathematica-source-highlighter.user.js, и вам будет предложено установить это расширение.
- Firefox: убедитесь, что установлен плагин Greasemonkey. Затем загрузите ту же ссылку, что и для Chrome.
- Теперь вы настроены, и когда вы перезагружаете эту страницу, комментарии, функции ядра, строки и шаблоны должны быть правильно подсвечены.
Версия
В https://github.com/halirutan/Mathematica-Source-Highlighting/raw/master/mathematica-source-highlighter.user.js вы всегда найдете самую последнюю версию. Вот история изменений.
- 02/23/2013 Обновлены списки символов и ключевых слов в Mathematica версии 9.0.1 - 09/02/2012 были исправлены некоторые незначительные проблемы с окраской шаблонов Mathematica. Подробный обзор функций с Pattern
-operator :
см. Также здесь
- 02/02/2012 поддержка многих форматов ввода чисел, таких как
.123`10.2
или1.2`100.3*^-12
, выделениеIn[23]
иOut[4]
,::usage
или других сообщений, таких какblub::boing
, выделяя такие шаблоны, какProblemTest[prob:(findp_[pfun_, pvars_, {popts___}, ___]), opts___]
, исправления ошибок (я проверил синтаксический анализатор на 3500 строк кода пакета из каталога AddOns. Для запуска потребовалось около 3-4 секунд, что для наших целей должно быть более чем достаточно быстрым). - 01/30/2012 Исправлено отсутствие '?' в списке операторов. Включены именованные символы, такие как
\\[Gamma]
, чтобы дать полное соответствие таким символам. Добавлены переменные $в список ключевых слов. Улучшено соответствие шаблонов. Добавлено сопоставление построений контекста, таких как Developer`PackedArrayQ. Переключение цветовой схемы из-за многих запросов. Теперь это похоже на интерфейс Mathematica. Ключевые слова черный, переменные синие. - 01/29/2012 Тим взломал код инъекции. Теперь подсветка работает и на mathematica.stackexchange тоже.
- 01/25/2012 Добавлено распознавание чисел Mathematica. Теперь следует выделить такие вещи, как
{1, 1.0, 1., .12, 16^^1.34f, ...}
. Кроме того, он должен распознать обратную линию за номером. Я переключил комментарии и строки на серый и использовал темно-красный цвет для чисел. - 01/23/2012 Исходная версия. Возможности описаны в разделе Обновить.