Подтвердить что ты не робот

Можно ли расшифровать prettify.js для поддержки Mathematica?

mathematica.SE в настоящее время находится в частной бета-версии и откроется для общественности через несколько дней. Переполнение стека и связанные с ним сайты используют prettify.js, однако Mathematica не поддерживается. Было бы замечательно иметь пользовательское выделение script для нашего сайта, и я прошу помощь сообщества JavaScript и CSS в разработке такого script и сопровождающего CSS.

Ниже перечислены некоторые основные требования, так что он захватывает большинство функций схемы выделения по умолчанию Mathematica (игнорируя информацию, которая будет знать только внутренний парсер). Я также назвал цвета в целом - шестнадцатеричные цветовые коды можно выбрать из скриншотов, которые я предоставил (ниже). Я также добавил образцы кода, чтобы сопровождать скриншоты, чтобы люди могли проверить его.

Основные требования

  • Комментарии
    Они вводятся как (* comment *). Поэтому все, что между ними должно быть выделено серым цветом.

  • Строки
    Они вводятся как "string" (одинарные кавычки не поддерживаются) и должны быть выделены розовым цветом.

  • Операторы/короткие нотные обозначения
    Помимо стандартного +, -, *, /, ^, == и т.д., Mathematica имеет несколько других операторов и короткие обозначения. Наиболее часто встречаются следующие:

    @, @@, @@@, /@, //@, //, ~, /., //., ->, :>, /:, /;, :=, :^=, =., 
    &, |, ||, &&, _, __, ___, ;;, [[, ]], <<, >>, ~~, <>
    

    Эти и скобки, скобки и фигурные скобки должны быть выделены черным цветом.

  • Шаблоны объектов и слотов
    Объекты шаблона начинаются с буквы и имеют либо _, либо __ или ___, как, например, x_, x__ и x___. Они также могут иметь дополнительные буквы после подчеркивания, как x_abc и т.д. Все они должны быть выделены зеленым цветом.

    Слоты # и ##, а за ним может следовать целое число #1, ##4 и т.д., а также должно быть зеленым.

    Оба эти объекта (шаблонные объекты и слоты) обычно завершаются оператором/скобкой/короткой формой из пункта 3. выше.

  • Функции/переменные
    Функции и переменные здесь являются довольно свободной терминологией, но служат для целей этой публикации. Все, что не попадает в вышеуказанные 4, может быть выделено черным цветом. Mathematica часто использует backticks ` в коде и должна считаться частью имени функции/переменной. Например, abcd`defg. Знаки доллара $ в любом месте имени переменной должны обрабатываться точно так же, как буква (т.е. Ничего особенного).

Для всех вышеперечисленных, если они появляются внутри строк, их следует рассматривать как таковые, т.е. "@~# должен быть выделен розовым цветом.

Дополнительные приятные возможности:

  • В объектах шаблона в пункте 3 выше, если под подчеркиванием (s) следует символ ?, а затем некоторые буквы, то часть, следующая за _, должна быть черной. Например, в x__?abc часть x__ должна быть зеленой, а ?abc - черной.
  • Если функция/переменная начинается с заглавной буквы, то она подсвечивается черным цветом. Если она начинается с маленькой буквы, она подсвечивается синим цветом. Внутренне это отличает встроенные функции от определенных пользователем функций. Тем не менее, сообщество математики (почти везде) придерживается этого соглашения об именах довольно хорошо, поэтому различение двух будет служить определенной цели.

Скриншоты и примеры кода:

1. Простые примеры

Вот небольшой пример, содержащий скриншот в конце, показывающий, как он выглядит в Mathematica:

(*simple pattern objects & operators*)
f[x_, y__] := x Times @@ y  

(*pattern objects with chars at the end and strings*)

f[x_String] := x <> "[email protected]" 

(*pattern objects with ?xxx at the end*)

f[x_?MatrixQ] := x + [email protected]

<< Combinatorica` (*example with backticks and inline comment*)

(*Slightly more complicated example with a mix of stuff*)

Developer`PartitionMap[Total, [email protected], 3][[3 ;; -3]]~Partition~2 //
  Times @@@ # &

enter image description here

2. Пример реального мира

Вот пример из этого моего ответа, который также указывает мою точку 2 в разделе "Дополнительные приятные вещи", т.е. строчные элементы выделяются синим цветом.

Кроме того, вы можете заметить некоторые из переменных, выделенных оранжевым цветом - я целенаправленно не включил это как требование, так как мне кажется, что гораздо сложнее обойтись без парсера, который знает Mathematica.

prob = MapIndexed[#1/#2 &, 
    Accumulate[
     EuclideanDistance[{0, 0}, #] < 1 & /@ arrows // Boole]]~N~4;

Manipulate[
 Graphics[{White, Rectangle[{-5, -5}, {5, 5}], Red, Disk[{0, 0}, 1], 
   Black, Point[arrows[[;; i]]], 
   Text[Style[[email protected][[i]], Bold, 18, "Helvetica"], {-4.5, 4.5}]}, 
  ImageSize -> 200], {i, Range[2, 20000, 1]}, 
 ControlType -> Manipulator, SaveDefinitions -> True]

enter image description here

Возможно ли это? Слишком много? Слишком сложно? Невозможно?

Совершенно откровенно, я не знаю ответа ни на один из них. Я только что перечислил некоторые основные функции, которые каждый на математике .SE хотел бы иметь и некоторые дополнительные вещи, которые были бы вишней на вершине. Однако, дайте мне знать, если их слишком сложно реализовать. Мы можем разработать меньший набор функций.

В знак признания этой помощи у вас у всех есть вечная благодарность сообщества Mathematica, и кроме того, , я награжу 500 бонусов каждому человеку, который вносит значительный вклад в это (если это делается по частям разные люди). Я буду опираться на ваши голоса/комментарии/выходы по ответам, чтобы решить, какой значительный (возможно, более чем один баунти одному человеку, если они выполняют всю работу). Реализация "Дополнительный приятный для использования" получает автоматическую +500 независимо от предыдущих бонусов, поэтому вы также можете опираться на работу других, даже если вы не делаете первую половину. Я также мог бы периодически размещать меньшие награды, чтобы привлекать пользователей, которые, возможно, не видели этого вопроса, поэтому, если вам случится заработать эти награды, они будут в дополнение к "щедрости, чтобы вознаградить существующий ответ", который будет решен до конца,

Наконец, я не тороплюсь. Поэтому, пожалуйста, не спешите с этим вопросом. Баунти всегда является опцией до тех пор, пока она не будет реализована SE (или если было определено, что существующие ответы полностью удовлетворяют требованиям). В идеале я надеюсь, что это реализовано 2/3rs нашего пути в бета-версию, которая проходит через 2 месяца.

4b9b3361

Ответ 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], чтобы цвета выглядели красиво рядом.

В настоящее время это выглядит так:

enter image description here

Тестирование и отладка

Сабольч спросил, можно ли и как это проверить. Это очень просто: вам нужен мой источник для кода 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 Исходная версия. Возможности описаны в разделе Обновить.

Ответ 2

Не совсем то, о чем вы просите, но я создал аналогичное расширение для MATLAB (на основе отличной работы, уже проделанной здесь). Проект размещен на github.

script должен решить некоторые проблемы, общие для кода MATLAB при переполнении стека:

  • комментарии (нет необходимости использовать трюки типа %# ..) Оператор транспонирования
  • (одинарная кавычка) правильно распознается как таковой (путается с цитированными строками с помощью префитера по умолчанию)
  • выделение популярных встроенных функций

Помните, что подсветка синтаксиса не идеальна; среди прочего, он терпит неудачу во вложенных блочных комментариях (я могу жить с этим пока). Как всегда, комментарии/исправления/проблемы приветствуются.

Включен отдельный пользовательский указатель, он позволяет переключать язык, используемый, как показано на скриншоте ниже:

--- before ---

before

--- после ---

after

Для тех, кто заинтересован, предоставляется третий пользовательский указатель, адаптированный для работы на веб-сайте "Ответы на вопросы MATLAB".


TL; DR

Установите usercript для SO непосредственно из:

https://github.com/amroamroamro/prettify-matlab/raw/master/js/prettify-matlab.user.js