改进 GeSHi 对 T-SQL 的语法高亮显示

31
我正在WordPress中使用WP-GeSHi,基本上我对它很满意。但是在以下几种情况下,高亮显示的颜色太过于激进:
  1. 变量名(以前缀@表示)
  2. 作为其他单词的一部分(例如,在INSERTED中的IN
  3. 组合(作为变量名的一部分,例如,在@JOINBING中的JOININ
  4. 在方括号内(例如,[status]
某些关键字区分大小写,而其他关键字则不区分大小写。以下屏幕截图总结了此类问题的各种情况: enter image description here 现在,在GeSHi.php中的代码相当冗长,而我绝非PHP专家。我并不害怕在这里动手脏活,但我希望其他人已经对此代码进行了更正,并且可以提供一些指针。我已经实现了解决方法,以防止错误地突出显示@@ROWCOUNT,但这很容易,因为@@ROWCOUNT已定义-我只是重新排列了数组,以便在ROWCOUNT之前找到它。
我的希望是GeSHi完全忽略不是整个单词的关键字(无论它们是否以前缀@或立即被其他字母/数字包围)。 JOIN应该是灰色的,但@JOINJOINS不应该。我还希望它忽略方括号内的关键字(毕竟,这就是我们告诉管理工具不要对其进行颜色突出显示的方法,也是我们告诉SQL引擎忽略保留字、关键字和无效标识符的方法)。
2个回答

31
你可以通过在数组末尾添加一个 PARSER_CONTROL 控件来实现这一点:
'PARSER_CONTROL' => array(
    'KEYWORDS' => array(
        1 => array( // "1" maps to the main keywords near the start of the array
            'DISALLOWED_BEFORE' => '(?![\(\w])',
            'DISALLOWED_AFTER' => '(?![\(\w])'
        ),
        5 => array( // "5" maps to the shorter keywords like "IN" that are further down
            'DISALLOWED_BEFORE' => '(?![\(\w])',
            'DISALLOWED_AFTER' => '(?![\(\w])'
        ),
    )
)

编辑

我修改了您的gist,将您添加到SYMBOLS的一些关键字移回到KEYWORDS(虽然在它们自己的组中,并且具有您的自定义样式),并更新了PARSER_CONTROL数组以与新的关键字数组索引匹配,并包括geshi生成的默认regex。这是链接:

https://gist.github.com/jamend/07e60bf0b9acdfdeee7a


我还有一件非常小的事情想要解决,对于你来说可能很容易。我希望变量(任何以 @ 开头的内容)能够以特定的颜色突出显示。这个难度大吗? - Aaron Bertrand
8
天才。再次感谢您的帮助。(很抱歉我没有一开始就说明所有要求——我觉得这个问题本来已经很难了,加上那些额外的、大部分无关的变化会更加困难。)现在,最后一个问题:为什么 Stack Overflow 不允许我在单个悬赏中给出超过 500 分的奖励?您知道我为这些小改变纠结了多久吗? - Aaron Bertrand
1
嘿,我是WP-GeSHi-Highlight的作者。我相信你已经意识到我只是在那里使用了GeSHi库。现在,你考虑过为GeSHi项目贡献自己的想法了吗?这是链接:https://github.com/GeSHi/geshi-1.0 -- 该存储库非常稳定,但语言更新拉取请求似乎会不时地合并。而我则会不时地将GeSHi更新合并到WP-GeSHi-Highlight中。干杯! - Dr. Jan-Philip Gehrcke
1
这里是翻译内容:我已经包含了Aaron Bertrand的其他改进。改善T-SQL语法高亮显示 - Jonathan Amend

3
根据我的看法,你现在所做的将需要很长时间。因此,我建议您安装一个不同的插件:它具有更好的功能,并以更好的方式支持多种语言,可以解决所有这些问题。
编辑:
嘿,我使用最新版本尝试了相同的代码,得到以下结果- enter image description here 编辑:
所以,如果您不想使用另一个插件,那么我会告诉您如何编码:
首先,在您的文本编辑器中打开\wp-content\plugins\wp-geshi-highlight\geshi\geshi\tsql.php。
然后,找到数组'KEYWORDS'或搜索它。
向它的结尾(在5之后)添加6,并在其中添加自定义关键字。例如:
5 => array(
'ALL', 'AND', 'ANY', 'BETWEEN', 'CROSS', 'EXISTS', 'IN', 'JOIN', 'LIKE', 'NOT', 'NULL',
'OR', 'OUTER', 'SOME',
),

6 => array(                          //This line has been added by me
'status'                             //This line has been added by me
)                                    //This line has been added by me

注意:我刚刚展示了数组元素5(已存在)和我创建的数组元素6。

然后,为了使其区分大小写,在'CASE_SENSITIVE'数组的末尾添加以下代码:

6 => true

“CASE_SENSITIVE”数组应该长成这样:

'CASE_SENSITIVE'

'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
        1 => false,
        2 => false,
        3 => false,
        4 => false,
        5 => false,
        6 => true                         //This line has been added by me
        ),

现在,您需要为自定义关键字添加样式。可以通过将以下行添加到'STYLES'数组的'KEYWORDS'元素中来实现。 'STYLES'数组的开始应该如下所示:

'STYLES' => array(
        'KEYWORDS' => array(
            1 => 'color: #0000FF;',
            2 => 'color: #FF00FF;',
            3 => 'color: #AF0000;',
            4 => 'color: #AF0000;',
            5 => 'color: #808080;',
            6 => 'color: #0000FF;'          //This line has been added by me
            ),

你可以通过上述指南解决问题,但是对于插件突出显示不完整单词的部分,我只找到了一个解决方案,那就是更新插件到最新版本,因为它解决了这个问题。

4
谢谢,但我已经为了适应我的需求而对GeSHi做出了很多工作,所以我宁愿继续努力工作,而不是完全更换插件。我也非常担心“草地更绿”的综合症 - 我可能只是为了不同的、或许更重要的问题而交换这些仅存的缺陷。 - Aaron Bertrand
此外,您展示的结果确实存在类似的问题。为什么第2行中的“status”没有以蓝色突出显示?为什么“AND mort IN”行中的本地变量的“join”部分以灰色突出显示?正如我所怀疑的那样,我将不得不经历很多麻烦,将150多篇文章迁移到使用略有不同的<pre>语法,只是为了用稍微不同的方式交换当前的格式化烦恼。 - Aaron Bertrand
我要投诉的关键字已经在一个数组中了。所有的数组都有我想要的样式,而且所有选项都设置为不区分大小写(我也希望它们是这样)。我发现它们被视为关键字的方式存在差异,因为我认为根据数组使用了不同的正则表达式。而我需要解决的真正问题是阻止这些正则表达式识别包含在更大单词中的关键字(或以@为前缀或用[方括号]括起来)。我正在使用最新版本的GeSHi插件,但问题仍然存在。 - Aaron Bertrand
如果您不介意进行一些混乱的更正,也许您可以定义另一个数组,在其中定义'@status'并将其样式设置为'color: #000000;'等。但是,请记住,包含'@status'之类单词的数组应该在包含关键字'status'之类的数组之上定义。 - prakhar19
抱歉,除此之外我找不到其他解决方案。因为如果您编辑任何其他wp-geshi文件,则会更改每种其他语言的规则,而wp-geshi不包含任何特定语言的选项。 - prakhar19
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接