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

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

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

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

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

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

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

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

    Все они, а также скобки, скобки и скобки должны быть выделены черным цветом.

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

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

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

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

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

Дополнительные пожелания:

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

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

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 <> "hello@world" 

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

f[x_?MatrixQ] := x + Transpose@x

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

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

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

enter image description here

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

Вот пример из этого моего ответа, который также показывает мой пункт 2 в разделе "Additional nice to haves", т.е. то, что строчные буквы выделяются синим цветом.

Также, вы можете заметить, что некоторые переменные выделены оранжевым цветом - я намеренно не включил это как требование, так как я думаю, что это будет намного сложнее сделать без парсера, который знает систему 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[First@prob[[i]], Bold, 18, "Helvetica"], {-4.5, 4.5}]}, 
  ImageSize -> 200], {i, Range[2, 20000, 1]}, 
 ControlType -> Manipulator, SaveDefinitions -> True]

enter image description here

Это выполнимо? Слишком много? Слишком сложно? Невозможно?

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

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

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

56
задан Community 23 May 2017 в 11:54
поделиться