Предисловие
Поскольку поддержка Mathematica для google-code-prettify была в основном разработана для нового сайта Mathematica.Stackexchange , см. Также обсуждение здесь .
Введение
У меня нет глубоких знаний обо всем этом, но были случаи, когда я писал плагин cweb для Idea, чтобы мой код был выделен там.В IDE все это не одношаговый процесс.Он разделен на несколько шагов, и каждый шаг имеет больше возможностей выделения.Позвольте мне объяснить это немного, чтобы позже объяснить некоторые причины, по которым некоторые вещи (imho) невозможны для нужного нам средства подсветки кода.
Сначала код разбивается на токены, которые являются отдельными частямиязык программирования.После этого лексера вы можете классифицировать интервалы вашего кода, например, через пробел, литерал, строку, комментарий и т. Д.Этот лексер ест исходный код, проверяя регулярные выражения, сохраняя тип токена для текстового промежутка и продвигаясь вперед в коде.
После этого лексического сканирования исходный код можетбыть проанализирован с использованием правил языка программирования, токенов и основного кода.Например, если у нас есть токен Plus
типа Keyword
, мы знаем, что должны следовать скобки и параметр.Если нет, синтаксис неправильный.То, что вы можете построить с помощью этого синтаксического анализа, называется абстрактным синтаксическим деревом AST и выглядит в основном как TreeForm
синтаксиса Mathematica.
С хорошо разработанным языком, таким как, например, Java, возможнопроверяйте код во время ввода и делайте практически невозможным синтаксически неправильный код.
prettify.js и Mathematica Code
Во-первых, prettify.js реализует только лексический сканер, но не анализатор.Я почти уверен, что это все равно невозможно из-за временных ограничений на отображение веб-страницы.Итак, позвольте мне объяснить, какие функции невозможны / выполнимы с prettify.js:
Кроме того, вы можете заметить некоторые переменные, выделенные оранжевым - я специально не включил это в качестве требования, так какЯ думаю, что будет намного сложнее обойтись без парсера, который знает Mathematica.
Верно, потому что выделение этих переменных зависит от контекста.Вы должны знать, что вы находитесь внутри Table
конструкции или чего-то в этом роде.
Взлом prettify.js
Я думаю, что взломать расширение для prettify.js не так сложно.Я абсолютное регулярное выражение noob, так что будьте готовы к тому, что следует.
Нам не нужно так много вещей для простого лексера Mathematica.У нас есть пробелы, комментарии, строковые литералы, фигурные скобки, множество операторов, обычные литералы, такие как переменные, и гигантский список ключевых слов.
Давайте начнем с ключевых слов в форме регулярного выражения java-script:
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$]*/
И у нас есть операторы (я не уверен, что этот список завершен).
/^(?:\+|\-|\*|\/|,|;|\.|:|@|~|=|\>|\<|&|\||_|`|\^)/
Обновление
Я немного почистил вещи, отладил их и создал цветовой стиль, который мне нравится.Следующие вещи работают, насколько я могу видеть правильно:
- Все системные символы, которые можно найти через
Names[RegularExpression["[A-Z].*"]]
, сопоставляются и подсвечиваются синим - Подтяжки и скобки черного цвета, но жирный шрифт. Это было предложение от Сабольча, и мне оно очень нравится, поскольку оно определенно добавляет энергии к появлению кода
- Шаблоны, как они появляются в определениях функций, а слоты чистых функций выделены зеленым цветом. Это было предложено Йодой и идет вместе с маркером в интерфейсе Mathematica. Шаблоны только зеленого цвета в сочетании с переменной, как в
blub__Integer
, a1_
или в b34_Integer32
. Тестовые функции для шаблона, как в num_?NumericQ
, помечены зеленым перед знаком вопроса.
- Комментарии и строки имеют одинаковый цвет. Комментарии и строки могут занимать несколько строк. Строки могут содержать кавычки с обратной косой чертой. Комментарии не могут быть вложенными.
- Для раскраски я последовательно использовал схему
ColorData[1]
, чтобы цвета хорошо выглядели рядом.
В настоящее время это выглядит так:
Тестирование и отладка
Сабольч спросил, можно ли и как это проверить. Это просто: вам нужен мой источник gt-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-подсветки. Там вы можете увидеть каждый токен, и вы увидите, какой тип токен. Это выглядит тогда как
<span class="tag">[</span>
Вы видите, что открытая скобка имеет тип tag
. Это соответствует определению регулярного выражения, которое я сделал в lang-mma.js
. В Chrome даже можно просматривать код JS, устанавливать точки останова и отлаживать его при перезагрузке страницы.
Локальная установка для Google Chrome и Firefox
Тим Стоун любезно написал скрипт, который вставляет маркер при загрузке сайтов под http://stackoverflow.com/questions/
. Как только google-code-prettify включен для mathematica.stackexchange.com
, он также должен работать там.
Я адаптировал этот скрипт, чтобы использовать мои лексические правила сканирования и цвета. Я слышал, что в Firefox скрипт не всегда работает, но вот как его установить:
Версия
Под 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
-оператором :
см. Также обсуждение здесь
- 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 Начальная версия. Возможности описаны в разделе Обновление .