扩展MW:SyntaxHighlight

来自Wikioe
跳到导航 跳到搜索


说明

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 的安装配置需要:

  1. (已集成 SyntaxHighlight_GeSHi 到 MediaWiki 项目,不需要单独下载)
  2. 安装 Python 到服务器,MediaWiki 1.31 之后需要 Python3。
  3. 确认服务器的站点用户(如: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】
编程语言
  • ActionScript, Ada, Agda (incl. literate), Alloy, AMPL, ANTLR, APL, AppleScript, Assembly (various), Asymptote, Augeas, AutoIt, Awk
  • BBC Basic, Befunge, BlitzBasic, Boa, Boo, Boogie, BrainFuck
  • C, C++ (incl. dialects like Arduino), C#, Chapel, Charm++ CI, Cirru, Clay, Clean, Clojure, CoffeeScript, ColdFusion, Common Lisp, Component Pascal, Coq, Croc (MiniD), Cryptol (incl. Literate Cryptol), Crystal, Cypher, Cython
  • D, Dart, DCPU-16, Delphi, Dylan (incl. console)
  • Eiffel, Elm, Emacs Lisp, Email, Erlang (incl. shell sessions), Ezhil
  • Factor, Fancy, Fantom, Fennel, FloScript, Fortran, FreeFEM++, F#
  • GAP, Gherkin (Cucumber), GLSL shaders, Golo, Gosu, Groovy
  • Haskell (incl. Literate Haskell), HLSL, HSpec, Hy
  • IDL, Idris (incl. Literate Idris), Igor Pro, Io
  • Jags, Java, JavaScript, Jasmin, Jcl, Julia
  • Kotlin
  • Lasso (incl. templating), Limbo, LiveScript, Logtalk, Logos, Lua
  • Mathematica, Matlab, Modelica, Modula-2, Monkey, Monte, MoonScript, Mosel, MuPad
  • NASM, Nemerle, NesC, NewLISP, Nimrod, Nit, Notmuch, NuSMV
  • Objective-C, Objective-J, Octave, OCaml, Opa, OpenCOBOL
  • ParaSail, Pawn, PHP, Perl 5, Pike, Pony, PovRay, PostScript, PowerShell, Praat, Prolog, Python (incl. console sessions and tracebacks)
  • QBasic
  • Racket, Raku a.k.a. Perl 6, REBOL, Red, Redcode, Rexx, Ride, Ruby (incl. irb sessions)Rust
  • S, S-Plus, R, Scala, Scdoc, Scheme, Scilab, SGF, Shell scripts (Bash, Tcsh, Fish), Shen, Silver, Slash, Slurm, Smalltalk, SNOBOL, Snowball, Solidity, SourcePawn, Stan, Standard ML, Stata, Swift, Swig, SuperCollider
  • Tcl, Tera Term language, TypeScript, TypoScript
  • USD, Unicon, Urbiscript
  • Vala, VBScript, Verilog, SystemVerilog, VHDL, Visual Basic.NET, Visual FoxPro
  • Whiley
  • Xtend, XQuery
  • Zeek, Zephir, Zig
模板语言
  • Angular templates
  • Cheetah templates, ColdFusion
  • Django / Jinja templates
  • ERB (Ruby templating), Evoque
  • Genshi (the Trac template language)
  • Handlebars
  • JSP (Java Server Pages)
  • Liquid
  • Myghty (the HTML::Mason based framework), Mako (the Myghty successor)
  • Slim, Smarty templates (PHP templating)
  • Tea, Twig
标记语言
  • Apache config files, Apache Pig
  • BBCode
  • CapDL, Cap'n Proto, CMake, Csound scores, CSS
  • Debian control files, Diff files, Dockerfiles, DTD
  • EBNF, E-mail headers, Extempore
  • Flatline
  • Gettext catalogs, Gnuplot script, Groff markup
  • Hexdumps, HTML, HTTP sessions
  • IDL, Inform, INI-style config files, IRC logs (irssi style), Isabelle
  • JSGF notation, JSON,JSON-LD
  • Lean theorem prover, Lighttpd config files, Linux kernel log (dmesg), LLVM assembly, LSL scripts
  • Makefiles, MoinMoin/Trac Wiki markup, MQL, MySQL
  • NCAR command language, Nginx config files, Nix language, NSIS scripts, Notmuch
  • POV-Ray scenes, Puppet
  • QML
  • Ragel, Redcode, ReST, Roboconf, Robot Framework, RPM spec files, Rql, RSL
  • Scdoc, SPARQL, SQL,also MySQL,SQLite, Squid configuration
  • TADS 3, Terraform, TeX, Thrift, TOML, Treetop grammars
  • USD (Universal Scene Description)
  • Varnish configs, VGLVim Script
  • WDiffWindows batch files
  • XML, XSLT
  • YAML
  • Windows Registry files

错误

存在语法高亮错误的页面

存在语法高亮错误的页面.png

页面被添加到追踪分类“存在语法高亮错误的页面”(可在“特殊页面”-“追踪分类”中的“存在语法高亮错误的页面”查看统计信息),可能的原因为:

  1. <syntaxhighlight>标签中没有lang属性;
  2. <syntaxhighlight>标签中的lang设置了不支持的语言;
  3. 扩展syntaxhighlight的运行环境错误,不能正常运行(如:缺失Pygments库或python)

使用废弃标签的页面

使用废弃标签的页面.png

页面被添加到追踪分类“使用废弃标签的页面”(可在“特殊页面”-“追踪分类”中的“使用已弃用source标签的页面”查看统计信息),可能的原因为:

  1. 使用了已废弃的<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”中pygmentizeshebang:“#!/usr/bin/env python3”,该shebang指定从PATH环境变量中来查找python3解释器来执行该脚本)

即:在系统环境中找不到 python3来执行pygmentize内容。
步骤:

  1. 安装Python3到服务器,可以采用的方式:
    1. 安装Python3,需防止和宝塔Python2.7冲突(服务器暂时没有测试和开发需求,单独安装调试不太必要。之后在本地开发环境再搞吧)
      • 执行 “python -V”(或“python --version”)可以看到已安装的python版本为Python 2.7.5,而非Python3
    2. 使用BTPanel软件商店的“Python项目管理器”(方便统一管理BTPanel内的环境):
      • pythonmamager安装在“/www/server/panel/plugin/pythonmamager”
      • pythonmamager内安装的Python位于“/root/.pyenv/versions”(.pyenv为隐藏文件夹)
  2. 创建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”的内容)
步骤:

  1. 为“/root/.pyenv/versions/3.6.11/bin/python3.6”路径中的所有文件夹,都添加其他用户的读取执行权限:
    (包括root、.pyenv、versions、3.6.11、bin文件夹,以及可执行文件python3.6,但并非全部子文件夹)
  2. 为pygmentize二进制文件设置执行权限
    chmod a+x /www/wwwroot/wiki.eijux.com/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize


经验证(已验证各步骤有效、可重现),以上设置可以完成syntaxhighlight插件的配置,当前使用良好。【2020/09/14 01:46:30】

参考

  1. 1.0 1.1 Extension:SyntaxHighlight#Installation 引用错误:无效<ref>标签;name属性“SyntaxHighlight#Installation”使用不同内容定义了多次
  2. What are the system requirements?