Javascript 可以扩展prettify.js以支持Mathematica吗?

Javascript 可以扩展prettify.js以支持Mathematica吗?,javascript,css,wolfram-mathematica,prettify,Javascript,Css,Wolfram Mathematica,Prettify,该网站目前正在进行私人测试,几天后将向公众开放。堆栈溢出和相关站点使用,但是Mathematica不是受支持的语言。为我们的网站定制一个突出显示脚本将是非常棒的,我请求JavaScript和CSS社区帮助开发这样一个脚本和附带的CSS 我在下面列出了一些基本要求,以便它能够捕获Mathematica默认突出显示方案的大部分功能(忽略只有内部解析器才知道的内容)。我还对颜色进行了一般性命名——十六进制颜色代码可以从我提供的屏幕截图中选择(下文)。我还在截图中添加了代码示例,以便人们可以对其进行测试

该网站目前正在进行私人测试,几天后将向公众开放。堆栈溢出和相关站点使用,但是Mathematica不是受支持的语言。为我们的网站定制一个突出显示脚本将是非常棒的,我请求JavaScript和CSS社区帮助开发这样一个脚本和附带的CSS

我在下面列出了一些基本要求,以便它能够捕获Mathematica默认突出显示方案的大部分功能(忽略只有内部解析器才知道的内容)。我还对颜色进行了一般性命名——十六进制颜色代码可以从我提供的屏幕截图中选择(下文)。我还在截图中添加了代码示例,以便人们可以对其进行测试

基本要求
  • 评论
    这些输入为
    (*注释*)
    。因此,这两者之间的任何内容都应以灰色突出显示

  • 字符串
    它们作为
    “字符串”
    (不支持单引号)输入,并应以粉色突出显示

  • 运算符/简写符号
    除了标准的
    +,-,*,/,^,==
    等,Mathematica还有其他几种运算符和简写符号。最常见的是:

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

    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[First@prob[[i]], Bold, 18, "Helvetica"], {-4.5, 4.5}]}, 
      ImageSize -> 200], {i, Range[2, 20000, 1]}, 
     ControlType -> Manipulator, SaveDefinitions -> True]
    
    prob=MapIndexed[#1/#2&,
    积累[
    欧几里德距离[{0,0},#]<1&/@arrows//Boole]]~N~4;
    操纵[
    图形[{白色,矩形[{-5,-5},{5,5}],红色,磁盘[{0,0},1],
    黑色,点[箭头[;;i]],
    文本[样式][First@prob[[i]],粗体,18,“Helvetica”],{-4.5,4.5},
    图像大小->200],{i,范围[2,20000,1]},
    控制类型->操纵器,保存定义->真]
    

    这是否可行?太多太难了?不可能的? 坦率地说,我不知道这些问题的答案。我刚刚列出了mathematica.SE上的每个人都希望拥有的一些基本功能,以及一些附加功能,这些功能将是顶部的樱桃。但是,如果这些太难实现,请务必让我知道。我们可以计算出更小的特征子集

    为了表彰这一帮助,Mathematica社区将永远感谢你们,此外,我将向每一位对此做出重大贡献的人奖励500英镑(如果这部分是由不同的人完成的)——我将依靠你们对答案的投票/评论/输出来决定什么是重要的(如果一个人做了所有的工作,可能会得到不止一笔赏金)。实施“额外的好东西”无论之前的奖金是多少,都会自动获得+500奖金,因此即使你没有完成上半年的工作,你也可以在其他人的工作基础上再接再厉。我还可能定期发放较小的奖金,以吸引可能没有看到此问题的用户,因此如果你碰巧获得了这些奖金,这些奖金将是额外的“悬赏奖励现有答案”,将在最后决定

    最后,我不赶时间。所以请慢慢回答这个问题。在SE实施之前(或者如果已经确定现有答案完全满足要求),悬赏始终是一个选项。理想情况下,我希望在2个月后的beta版中实现2/3的悬赏。

    由于谷歌代码美化主要是为新网站开发的,请参见讨论

    介绍 我对所有这些都没有深入的了解,但有时我为Idea编写了一个cweb插件,以便在其中突出显示我的代码。在IDE中,所有这一切都不是一步一步的过程。它分为几个步骤,每个步骤都有更多的突出显示功能。让我解释一下这一点,稍后给出一些原因(imho)对于我们这里需要的代码高亮器来说是不可能的

    首先,代码被拆分为标记,这些标记是编程语言的单个部分。在此lexer之后,您可以将代码的间隔分类为空白、文字、字符串、注释等。此lexer通过测试正则表达式、存储文本范围的标记类型并在代码中前进来获取源代码

    在这个词法扫描之后,可以使用编程语言的规则、标记和底层代码来解析源代码。例如,如果我们有一个标记
    Plus
    ,它的类型是
    Keyword
    ,那么我们知道括号和参数应该在后面。如果没有,语法就不正确。你可以用这种解析称为AST,抽象语法树,基本上类似于Mathematica语法的
    TreeForm

    使用设计良好的语言,例如Java,可以在键入时检查代码,从而几乎不可能编写语法错误的代码

    prettify.js和Mathematica代码 首先,prettify.js只实现了一个词法扫描程序,但没有解析器。我很确定,就显示网页的时间限制而言,这无论如何都是不可能的。因此,让我解释一下哪些功能在prettify.js中不可能/不可行:

    此外,您可能会注意到一些以橙色突出显示的变量–I 故意不把它作为一项要求,我认为这是 如果没有一个知道 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]
    
    是的,因为这些变量的突出显示取决于上下文。您必须知道,您在
    表中
    
    Export["google-code-prettify/keywordsmma.txt", 
       StringJoin @@ Riffle[Apply[StringJoin, 
             Partition[Riffle[Names[RegularExpression["[A-Z].*"]], 
                 "|"], 100], {1}], "'+ \n '"], "TEXT"]
    
    /^\(\*[\s\S]*?\*\)/
    
    /^(?:\[|\]|{|}|\(|\))/
    
    /^[a-zA-Z$]+[a-zA-Z0-9$]*_+([a-zA-Z$]+[a-zA-Z0-9$]*)*/
    
    /^#+[0-9]?/
    
    /^[a-zA-Z$]+[a-zA-Z0-9$]*/
    
    /^(?:\+|\-|\*|\/|,|;|\.|:|@|~|=|\>|\<|&|\||_|`|\^)/
    
    <span class="tag">[</span>