扩展MW:SyntaxHighlight
说明
SyntaxHighlight,原名SyntaxHighlight_GeSHi,提供了丰富的格式的源代码使用<syntaxhighlight>
标签。它由Pygments
库提供支持,并支持数百种不同的编程语言和文件格式。与<pre>
和标记一样,文本的显示方式与键入时完全相同,并保留所有空白。
启用SyntaxHighlight:
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
安装后,您可以在Wiki页面上使用<syntaxhighlight>
标签,如:
<syntaxhighlight lang="python" line='line'> def quick_sort(arr): less = [] pivot_list = [] more = [] if len(arr) <= 1: return arr else: pass </syntaxhighlight>
效果:
def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
else:
pass
安装
SyntaxHighlight需要用到pygments库,而pygments是用Python编写的语法高亮引擎,需要Python的支持[1][2]。
所以,SyntaxHighlight 的安装配置需要:
- (已集成 SyntaxHighlight_GeSHi 到 MediaWiki 项目,不需要单独下载)
- 安装 Python 到服务器,MediaWiki 1.31 之后需要 Python3。
- 确认服务器的站点用户(如:www)对支持组件(Python 路径和 pygments 文件)有读取、执行权限。
参数
参数 | 说明 |
---|---|
lang | 该属性定义应使用的词法分析器 |
line | 使用该line属性启用行号 |
start | 定义了代码块的开始行号(与line 结合使用)
|
highlight | 设定一个或多个行为高亮,使用“,”或“-”指定行号(如highlight="1,5-7" )。该行号为自然行号,而非以start 设定的行号
|
inline | 该属性指示源代内容是段落的一部分,而非像<pre> 标签一样自成一块
|
class | 当inline 使用时,class="nowrap" (在支持它的那些Wiki上;不在MediaWiki本身上)指定在代码块内的空格处不应出现换行符。
|
style | 该属性允许直接包含CSS属性。与在 (不是)标签中使用一样。
|
支持语言
- 支持“properties”(配置文件)【2020/10/07 22:17:38】
编程语言 |
---|
|
模板语言 |
|
标记语言 |
|
错误
存在语法高亮错误的页面
页面被添加到追踪分类“存在语法高亮错误的页面”(可在“特殊页面”-“追踪分类”中的“存在语法高亮错误的页面”查看统计信息),可能的原因为:
<syntaxhighlight>
标签中没有lang
属性;<syntaxhighlight>
标签中的lang
设置了不支持的语言;- 扩展syntaxhighlight的运行环境错误,不能正常运行(如:缺失Pygments库或python)
使用废弃标签的页面
页面被添加到追踪分类“使用废弃标签的页面”(可在“特殊页面”-“追踪分类”中的“使用已弃用source标签的页面”查看统计信息),可能的原因为:
- 使用了已废弃的
<source>
标签,而非<syntaxhighlight>
标签。
FAQ
关于SyntaxHighlight的安装
安装MediaWiki并在配置文件LocalSettings.php中加载SyntaxHighlight,此时使用<SyntaxHighlight>
的标签会出现“存在语法高亮错误的页面”的问题,因为没有Python支持。
而网上并没有详细的配置系列可供参考,只有MediaWiki的Extension:SyntaxHighlight页面有粗略的说明[1]:
The version of this extension bundled with MediaWiki 1.31 requires Python version 3 (python3) to be installed on the server. ... Note that the python3 binary must be installed in the execution PATH of the PHP interpreter.
所以需要安装Python3到服务器,并确保站点用户(如www)对Python文件夹有读取、执行权限。
- [显示MediaWiki错误],可以看到详细的错误信息。
安装Python
Notice: Failed to invoke Pygments: /usr/bin/env: python3: No such file or directory [Called from SyntaxHighlight::highlight in /www/wwwroot/wiki.eijux.com/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php at line 356] in /www/wwwroot/wiki.eijux.com/includes/debug/MWDebug.php on line 430
- (其中“/usr/bin/env: python3”,参见“/www/wwwroot/wiki.eijux.com/extensions/SyntaxHighlight_GeSHi/pygments”中pygmentize的shebang:“
#!/usr/bin/env python3
”,该shebang指定从PATH环境变量中来查找python3解释器来执行该脚本)
即:在系统环境中找不到 python3来执行pygmentize内容。
步骤:
- 安装Python3到服务器,可以采用的方式:
- 安装Python3,需防止和宝塔Python2.7冲突(服务器暂时没有测试和开发需求,单独安装调试不太必要。之后在本地开发环境再搞吧)
- 执行 “
python -V
”(或“python --version
”)可以看到已安装的python版本为Python 2.7.5,而非Python3
- 执行 “
- 使用BTPanel软件商店的“Python项目管理器”(方便统一管理BTPanel内的环境):
- pythonmamager安装在“/www/server/panel/plugin/pythonmamager”
- pythonmamager内安装的Python位于“/root/.pyenv/versions”(.pyenv为隐藏文件夹)
- 安装Python3,需防止和宝塔Python2.7冲突(服务器暂时没有测试和开发需求,单独安装调试不太必要。之后在本地开发环境再搞吧)
- 创建Python3的软连接到/usr/bin中:
ln -s /root/.pyenv/versions/3.6.11/bin/python3.6 /usr/bin/python3
设置权限
Notice: Failed to invoke Pygments: /usr/bin/env: python3: Permission denied [Called from SyntaxHighlight::highlight in /www/wwwroot/wiki.eijux.com/extensions/SyntaxHighlight_GeSHi/includes/SyntaxHighlight.php at line 356] in /www/wwwroot/wiki.eijux.com/includes/debug/MWDebug.php on line 430
即:(当前用户,如BTPanel的www)没有权限使用系统中的python3来执行pygmentize。(www用户不能读写、执行root下“/root/.pyenv/versions/3.6.11/bin”的内容)
步骤:
- 为“/root/.pyenv/versions/3.6.11/bin/python3.6”路径中的所有文件夹,都添加其他用户的读取、执行权限:
- (包括root、.pyenv、versions、3.6.11、bin文件夹,以及可执行文件python3.6,但并非全部子文件夹)
- 为pygmentize二进制文件设置执行权限
chmod a+x /www/wwwroot/wiki.eijux.com/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize
经验证(已验证各步骤有效、可重现),以上设置可以完成syntaxhighlight插件的配置,当前使用良好。【2020/09/14 01:46:30】
参考
- ↑ 1.0 1.1 Extension:SyntaxHighlight#Installation 引用错误:无效
<ref>
标签;name属性“SyntaxHighlight#Installation”使用不同内容定义了多次 - ↑ What are the system requirements?