扩展:语法高亮

This page is a translated version of the page Extension:SyntaxHighlight and the translation is 67% complete.
Outdated translations are marked like this.
Other languages:
Deutsch • ‎English • ‎Türkçe • ‎dansk • ‎español • ‎français • ‎magyar • ‎беларуская (тарашкевіца)‎ • ‎русский • ‎українська • ‎中文 • ‎日本語 • ‎한국어
此扩展已绑定在MediaWiki 1.21及以上版本 因此您不需要再次下载。 然而,您仍需要跟随提供的其他指示。
要在源代码编辑时对维基文本进行语法高亮,参阅CodeMirror 扩展或用户脚本记住点Cacycle
MediaWiki扩展手册
OOjs UI icon advanced.svg
SyntaxHighlight
发布状态: 稳定版
SyntaxHighlighting with Pygments.png
实现 标签
描述 允许高亮显示在维基页面上的源代码
作者
  • Brion Vibber,
  • Tim Starling,
  • Rob Church,
  • Ori Livneh
最新版本 continuous updates
兼容性方针 主线(master)
MediaWiki 1.25+
数据庫更新
许可协议 GNU通用公眾授權條款2.0或更新版本
下载
README
  • $wgPygmentizePath
<syntaxhighlight>
翻译SyntaxHighlight扩展如果在translatewiki.net可用
检查使用和版本矩阵。
问题 开放的工作 · 报告错误

SyntaxHighlight扩展(语法高亮扩展),原先被称作SyntaxHighlight_GeSHi,使用<syntaxhighlight>扩展标签对源代码提供了丰富的格式。 它是由Pygments库提供支持的,并支持数百种不同的编程语言和文件格式。

就像<pre><poem >标签,文本将按照输入的内容准确呈现且保留所有空格。

用法

当您安装本扩展后,您就可以在你的wiki使用“syntaxhighlight”标签。举个例子,

1 def quick_sort(arr):
2 	less = []
3 	pivot_list = []
4 	more = []
5 	if len(arr) <= 1:
6 		return arr
7 	else:
8 		pass

这是实现上面内容的维基代码:

<syntaxhighlight lang="python" line='line'>
def quick_sort(arr):
	less = []
	pivot_list = []
	more = []
	if len(arr) <= 1:
		return arr
	else:
		pass
</syntaxhighlight>

在MediaWiki 1.16之前,这个扩展使用的是<source>标签。 它现在仍然可以使用,但已棄用,應使用<syntaxhighlight>

样式

如果您觉得标签里面的预览文字太大,您可以调整它通过把下面的代码拷贝到您wiki的MediaWiki:Common.css中 (创建它如果不存在的话):

/* 放置在这里的CSS会应用于全部皮肤 */
.mw-highlight pre {
	font-size: 90%;
}

代码块的外框可以通过在上方代码中插入一行border: 1px dashed blue;实现。 控制使用的字体也可以通过添加font-family: "Courier New", monospace;到上面的代码中。

语法高亮错误分类

该扩展将添加在<syntaxhighlight>标签中有错误lang属性的页面到一个追踪分类。 消息文字MediaWiki:syntaxhighlight-error-category决定了分类的名字,在本维基上为Category:Pages with syntax highlighting errors

导致页面被此类别标记的最常见错误是<syntaxhighlight>标记,根本没有lang属性,因为此扩展的旧版本支持“$wgSyntaxHighlightDefaultLang”的定义。 这些通常既可以替换为<pre>,也可以将lang="bash"lang="text"添加到标签。

The category may also be added, and the content will not be highlighted, if there are more than 1000 lines or more than 100 kB text.[1]

参数

语言

lang="name"属性定义了应使用什么词法分析器。 该语言会影响扩展如何高亮显示源代码。 参阅支持的语言这一章节获得关于受支持语言的详细内容。

def quick_sort(arr):
    less = []
<syntaxhighlight lang="python">
..
</syntaxhighlight>

指定了一个无效的或未知的语言名称,则该页面会被加入跟踪分类。 参阅语法高亮错误分类章节获取详细信息。

行号

line属性启用行号。

1 def quick_sort(arr):
2 	less = []
<syntaxhighlight lang="python" line>
..
</syntaxhighlight>

开始位置

start属性(与line相配合)定义了代码块的第一行行号。 例如,line start="55"将会使行号从55开始。

55 def quick_sort(arr):
56     less = []
<syntaxhighlight lang="python" line start="55">
..
</syntaxhighlight>

高亮

highlight属性将指定一行或多行将被标记(通过对指定的行显示不同的背景色)。 您可以指定多个行的数字通过逗号分隔(例如,highlight="1,4,8")或使用一个连字符和两个数字表示范围(例如,highlight="5-7")。 注意,行的数字将忽略任何start属性的重新标号。

3 def quick_sort(arr):
4     less = []
5     pivot_list = []
6     more = []
7     if len(arr) <= 1:
8         return arr

上面为下方代码的输出结果:

<syntaxhighlight lang="python" highlight="1,5-7" start='3' line>
..
</syntaxhighlight>

内联

MediaWiki版本: 1.26

该属性表示源代码将作为段落的一部分内联(而不是自己的块)。 该选项在MediaWiki 1.26版本开始可用。 为了保持向后兼容,enclose="none"也会有同样效果。

Note that using the "enclose" parameter is deprecated; if set to "none", it should be replaced with inline; otherwise, it can be removed entirely.

注意,换行符可以在标签开始和结束之间的任何空格处出现,若源代码带有class="nowrap"(在那些受支持的维基;见下方)或style=white-space:nowrap则是不换行的。

例如:

以下lambda x: x * 2是在Python的Lambda表达式

是下方的结果:

以下<syntaxhighlight lang="python" inline>lambda x: x * 2</syntaxhighlight>是在Python的[[w:zh:匿名函数|Lambda表达式]]。

class样式

当使用了inline时,指定class="nowrap"(在那些受到支持的维基上,而不是MediaWiki本身)不应在代码块内的空格处出现换行符。

例如:

没有class="nowrap"

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlambda x: x * 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

With style="white-space:nowrap":

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlambda x: x * 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

style样式

style属性允许CSS属性被直接包含。 这相当于将块封装在<div>标签(不是<span>标签)中。 tab‑size属性不能够通过这种方式指定。它需要<span>标签封装,像下方高级段落中描述的样子。

例如:

def quick_sort(arr):
	less = []
	pivot_list = []
	more = []
	if len(arr) <= 1:
		return arr
	else:
		pass

是下方的结果:

<syntaxhighlight lang="python" style="border:3px dashed blue">
def quick_sort(arr):
	less = []
	pivot_list = []
	more = []
	if len(arr) <= 1:
		return arr
	else:
		pass
</syntaxhighlight>

支持的语言

Pygments库为数百种计算机语言和文件格式提供支持。 截至2020年1月,完整清单为:

Programming languages

  • ActionScript
  • Ada
  • Agda (incl. literate)
  • Alloy
  • AMPL
  • ANTLR
  • APL
  • AppleScript
  • 组装(各种)
  • Asymptote
  • Augeas
  • AutoIt
  • Awk
  • BBC Basic
  • Befunge
  • BlitzBasic
  • Boa
  • Boo
  • Boogie
  • BrainFuck
  • C,C ++(包括方言,例如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

Template languages

  • Angular templates
  • Cheetah templates
  • ColdFusion
  • Django / Jinja模板
  • 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

Other markup

  • 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会话
  • 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脚本
  • Makefiles
  • MoinMoin/Trac Wiki markup
  • MQL
  • MySQL
  • NCAR command language
  • Nginx config files
  • Nix语言
  • NSIS脚本
  • 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
  • VGL
  • Vim Script
  • WDiff
  • Windows batch files
  • XML
  • XSLT
  • YAML
  • Windows Registry files

有關準確的語言代碼,請參閱[$external-link2 Pygments文档中的完整详细信息],并且GeSHi支持某些语言名称的映射([$external-link3 完整列表])。

Pygments还没有提过对"wikitext"或"mediawiki"提供词法分析(phab:T29828) 。 请使用"html+handlebars"或"moin"代替。

以下是GeSHi可以高亮显示的部分语言清单,在切换到Pygments之后不再支持语言的被用横线删去。

安装

MediaWiki 1.31捆绑在一起的此扩展版本需要在服务器上安装Python3(python3)。这是与MediaWiki 1.30捆绑在一起的版本的更改,后者使用的是Python2(python)。请注意,python3二进制文件必须安装在PHP解释器的执行PATH中。
尽管它已经更新到Pygments(并不使用GeSHi),尽管它的名称已更新,但此扩展在内部仍使用以下所述的前一个文件名。
  • 下载文件,并将其放置在您extensions/文件夹中的SyntaxHighlight_GeSHi目录内。
  • 只有從git安裝才运行Composer来安装PHP依赖,通过发行composer install --no-dev至扩展目录。 (参见T173141了解潜在问题。)
  • 将下列代码放置在您的LocalSettings.php的底部:
    wfLoadExtension( 'SyntaxHighlight_GeSHi' );
    
  • Linux中,请为pygmentize二进制文件设置可执行权限。 您可以使用FTP客户端或以下shell命令执行此操作:
chmod a+x /path/to/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize
  •   完成 – 在您的wiki上导航至Special:Version,以验证扩展已成功安装。

致使用MediaWiki 1.24或更早版本的用户:

上面的说明介绍的是安装此扩展的新方法,它使用wfLoadExtension()。 如果您需要在早期版本(MediaWiki 1.24和更早版本)中安装此扩展,而不是wfLoadExtension( 'SyntaxHighlight_GeSHi' );,您需要使用:

require_once "$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php";
当安装自Git时,请注意在MediaWiki 1.26版本开始,到MediaWiki 1.31版本,该扩展需要Composer

所以,在从Git安装之后,切换到包含该扩展的目录。例如:"../extensions/SyntaxHighlight_GeSHi/"并运行composer install --no-dev,或在更新时:composer update --no-dev

或者最好将"extensions/SyntaxHighlight_GeSHi/composer.json"添加到在Wiki根目录下的"composer.local.json"文件中,例如:
{
	"extra": {
		"merge-plugin": {
			"include": [
				"extensions/SyntaxHighlight_GeSHi/composer.json"
			]
		}
	}
}
现在运行composer update --no-dev。 Voilà!
  警告: 当通过FTP上传扩展时,请确保将pygments/pygmentize文件作为binary传输。

配置

Linux
  • $wgPygmentizePath(可选):Pygments包中pygmentize的绝对路径。 默认情况下,扩展中附带了Pygments包,$wgPygmentizePath指向默认了Pygments包,但如果需要,您可以指向不同的版本。 例如:$wgPygmentizePath = "/usr/local/bin/pygmentize";
  • $wgSyntaxHighlightModels:对一些维基页面配置默认的语法分析器。 默认情况下它会高亮显示javascript和css页面。 额外的内容模型可以通过扩展名配置(例如:Lua、JSON等)。 示例:
     $wgSyntaxHighlightModels[CONTENT_MODEL_SCRIBUNTO] = 'lua';
Windows
  • 若您在一台Windows主机上运行MediaWiki,您需要设置Pygmentize.exe的位置$wgPygmentizePath = "c:\\Python27\\Scripts\\pygmentize.exe";
    • 若没有pygmentize.exe,从命令行运行在Scripts目录中的easy_install Pygments来生成文件。

若您在使用附带的pygmentize二进制文件(extensions/SyntaxHighlight_GeSHi/pygments/pygmentize),确保您的网络服务器允许执行它。 若您的主机商不允许添加可执行文件到站点目录,安装python-pygments并添加$wgPygmentizePath = pygmentize到LocalSettings.php中。

问题排除

找升级到MediaWiki 1.26 版本及其以后,一些用户开始报告与这个扩展的问题。 有些情况下,当某些语言(如Lua)可能无法突出显示并打开调试中时,MediaWiki会抛出错误Notice: Failed to invoke Pygments: /usr/bin/env: python3: No such file or directory

  • 尝试在LocalSettings.php指定$wgPygmentizePath为外部pygmentize二进制文件。
  • In shared hosting environments with cPanel, this can be done by setting up a new Python application through the "Setup Python App" menu, and activating the virtual environment for the app through SSH (source /virtualenv/python/3.5/bin/activate). After this, the Pygments module can be added to the Python app, for which navigate to the virtual environment path (cd virtualenv/python/3.5/bin/), download and install Pygments (./pip install Pygments) and then activate the module by adding "Pygments" under the "Existing applications" section of the "Setup Python App" menu. This will create the required file at path: virtualenv/python/3.5/bin/pygmentize
  • 获取更多建议和信息,请参见P站任务

可视化编辑器集成

该插件可以使用可视化编辑器直接编辑。 一个对话框会被打开,当一个用户想要编辑syntaxhighlight段落。 要使其工作,可视化编辑器必须被安装且从最新git版本被配置,与Parsoid相同。 该功能在较老的Parsoid版本中随机地无法使用。 参见Extension:SyntaxHighlight/VisualEditor获取更多细节

高级

<pre><code>标记不同,HTML代码实体(例如&nbsp;)不需要(也不应该)将 & 字符转义为&amp;。 与<pre>标签一样,但与<code>标签不同,范围内的标签(除了自己的结束标签)不需要将<符号转义为&lt;,也不需要使用<nowiki>标签转义wikitext。

此外,虽然<pre>假定制表符每8个字符停止并在复制渲染文本时使用实际空格渲染制表符,<syntaxhighlight>使用4空格制表位(Internet Explorer使用8除外)并保留渲染文本中的制表符,后者可以使用封闭的<span style="-moz-tab-size:nn; -o-tab-size:nn; tab-size:nn;">标记(不是<div>,而不是使用自己的style属性)进行更改。 Firefox4.0起需要-moz-前缀,Opera需要-o-前缀(从10.60到15)。[2] (请注意,wiki编辑框采用8空格缩进。) 这仅适用于实际保存的页面,通过编辑框或Special:ExpandTemplates生成的预览可能会有所不同。

另请参阅

脚注