Расширение:SyntaxHighlight
![]() Статус релиза: стабильно |
|
---|---|
![]() |
|
Реализация | Тег |
Описание | Позволяет подсвечивать исходный код на вики-страницах |
Автор(ы) |
|
Последняя версия | постоянное обновление |
Политика совместимости | Master maintains backward compatibility. |
MediaWiki | 1.25+ |
Изменения в БД | Нет |
Composer | mediawiki/syntax-highlight |
Лицензия | GNU General Public License 2.0 или позднее |
Скачать | README |
|
|
<syntaxhighlight> |
|
Public wikis using | 8,187 (Ranked 7th) |
Переведите расширение SyntaxHighlight | |
Проблемы | Открытые задачи · Сообщить об ошибке |
Расширение SyntaxHighlight, ранее известное как SyntaxHighlight_GeSHi обеспечивает огромное количество подсветок синтаксиса кода используя тег <syntaxhighlight>
Расширение работает от библиотеки Pygments и поддерживает сотни различных языков программирования и форматов файлов.
Подобно тегам <pre>
и <poem >
, текст отображается точно так же, как и набранный, сохраняя любое пустое пространство.
The SyntaxHighlight extension does not work on hardened wiki installations due to lack of proc_open
, shell_exec
and friends.
See задача T250763.
Применение
После установки вы можете использовать теги «syntaxhighlight» на страницах вики. Например,
def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
else:
pass
является результатом следующей разметки wikitext:
def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
else:
pass
В старых версиях (до MediaWiki 1.16) расширение использовало тег <source>
.
Этот вариант по-прежнему поддерживается, но считается устаревшим. Вместо него необходимо использовать <syntaxhighlight>
.
Стайлинг
Если отображаемый код слишком велик, вы можете настроить его, поместив следующее на страницу MediaWiki:Common.css в своей вики (создайте её, если она не существует):
/* CSS, размещённый здесь, будет применяться ко всем скинам */
.mw-highlight pre {
font-size: 90%;
}
Выделение рамкой кодовых блоков в границах можно сделать, вставив строку, подобную border: 1px dashed blue;
, в секции выше.
Контроль над «семейством используемых шрифтов» также может быть осуществлен путем вставки строки, такой как font-family: "Courier New", monospace;
, в секции выше.
Категория подсветки ошибок синтаксиса
Расширение добавляет страницы, которые имеют неверный атрибут lang
в теге <syntaxhighlight>
, в отслеживающую категорию.
Ключ сообщения MediaWiki:syntaxhighlight-error-category определяет имя категории; на этой вики это Category:Pages with syntax highlighting errors.
Наиболее распространённой ошибкой, которая приводит к тому, что страницы помечаются этой категорией, является тег <syntaxhighlight>
вообще без атрибута lang
, поскольку более старые версии этого расширения поддерживали определение $wgSyntaxHighlightDefaultLang
.
Обычно их можно заменить на <pre>
, или к тегу можно добавить lang="bash"
или lang="text"
.
Категория также может быть добавлена, и её содержимое не будет выделено, если в тексте более 1000 строк или текст более 100 КБ.[1]
Параметры
lang
Атрибут lang="name"
определяет, какой lexer следует использовать.
Язык влияет на то, как расширение подсвечивает исходный код.
Подробнее о поддерживаемых языках см. в разделе Поддерживаемые языки.
def quick_sort(arr):
less = []
<syntaxhighlight lang="python">
...
</syntaxhighlight>
Указание недопустимого или неизвестного имени пометит страницу, что поместит её в категорию отслеживания. Подробнее см. в разделе Категория подсветки ошибок синтаксиса на этой странице.
line
Атрибут line
активирует нумерацию строк.
def quick_sort(arr):
less = []
<syntaxhighlight lang="python" line>
...
</syntaxhighlight>
start
Атрибут start
(в сочетании с line
) определяет номер первой строки кода.
Например, line start="55"
начнёт нумерацию строк с числа 55.
def quick_sort(arr):
less = []
<syntaxhighlight lang="python" line start="55">
...
</syntaxhighlight>
highlight
Атрибут highlight
указывает одну или несколько строк, которые должны быть отмечены (путем выделения этих строк другим цветом фона).
Вы можете указать несколько номеров строк, разделенных запятыми (например, highlight="1,4,8"
) или диапазоны, используя два номера строк и дефис (например, highlight="5-7"
).
start
.def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
является результатом
<syntaxhighlight lang="python" line start="3" highlight="1,5-7">
...
</syntaxhighlight>
inline
Версия MediaWiki: | ≥ 1.26 |
Атрибут указывает, что исходный код должен быть встроенным как часть абзаца (в отличие от отдельного блока). Эта опция доступна начиная с MediaWiki 1.26.
class="nowrap"
(на тех вики, которые это поддерживают, см. ниже) или style="white-space:nowrap"
.Например:
Следующий код lambda x: x * 2
- это aнонимная функция в Python.
Является результатом:
Следующий код <syntaxhighlight lang="python" inline>lambda x: x * 2</syntaxhighlight> - это [[w:ru:Анонимная функция|aнонимная функция]] в Python.
class
Использование inline
, class="nowrap"
(на тех вики, которые его поддерживают, а не на самой MediaWiki) указывает, что разрывы строк не должны возникать в пробелах внутри блока кода.
Например:
Без class="nowrap"
:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlambda x: x * 2
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
С style="white-space:nowrap"
:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlambda x: x * 2
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
style
Атрибут style
позволяет напрямую использовать атрибуты CSS.
Это эквивалентно включению блока в тег <div>
(не <span>
).
Атрибут tab‑size
не может быть указан таким образом; для этого требуется заключение в тег <span>
, как описано ниже, в разделе Дополнительно.
Например:
def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
else:
pass
Является результатом:
def quick_sort(arr):
less = []
pivot_list = []
more = []
if len(arr) <= 1:
return arr
else:
pass
Поддерживаемые языки
Библиотека Pygments обеспечивает поддержку для подсветки синтаксиса сотен компьютерных языков и форматированных файлов посредством различных "lexers", включённых в библиотеку.
In most cases, the lang=
attribute to be used with this extension is the lower-case version of the name of the language.
However, many have aliases, or "short names" as they're called in the Pygments documentation; see "Available lexers" for full details.
Some languages previously supported by GeSHi have been mapped to Pygments lexers; see SyntaxHighlightGeSHiCompat.php
for details.
Полный список поддерживаемых Pygments языков по состоянию на январь 2020 года:
Языки программирования
- ActionScript
- Ada
- Agda (включая Literate Agda)
- 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 (включая Literate Cryptol)
- Crystal
- Cypher
- Cython
- D
- Dart
- DCPU-16
- Delphi
- Dylan (включая консоль)
- Eiffel
- Elm
- Emacs Lisp
- Erlang (включая сессии в командной строке)
- Ezhil
- Factor
- Fancy
- Fantom
- Fennel
- FloScript
- Forth
- Fortran
- FreeFEM++
- F#
- GAP
- Gherkin (Cucumber)
- Шейдеры GLSL
- Golo
- Gosu
- Groovy
- Haskell (включая Literate Haskell)
- HLSL
- HSpec
- Hy
- IDL
- Idris (включая Literate Idris)
- Igor Pro
- Io
- Jags
- Java
- JavaScript
- Jasmin
- Jcl
- Julia
- Kotlin
- Lasso (включая шаблонизирование)
- 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 (включая сессии в командной строке и трассировки стека)
- QBasic
- Racket
- Raku a.k.a. Perl 6
- REBOL
- Red
- Redcode
- Rexx
- Ride
- Ruby (включая сессии irb)
- Rust
- S, S-Plus, R
- Scala
- Scdoc
- Scheme
- Scilab
- SGF
- Сценарии командной строки (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
- Шаблоны Cheetah
- ColdFusion
- Шаблонизатор Django / Jinja
- ERB (шаблонизатор Ruby)
- Evoque
- Genshi (шаблонизатор проекта Trac)
- Handlebars
- JSP (Java Server Pages)
- Liquid
- Myghty (фреймворк на основе HTML::Mason)
- Mako (преемник Myghty)
- Slim
- Smarty (шаблонизация для языка PHP)
- Tea
- Twig
Другая разметка
- Конфигурационные файлы Apache
- Apache Pig
- BBCode
- CapDL
- Cap'n Proto
- CMake
- Партитуры Csound
- CSS
- Управляющие (control) файлы Debianа
- Diff файлы
- Dockerfiles
- DTD
- EBNF
- Заголовки электронной почты
- Extempore
- Flatline
- Каталоги gettext
- Скрипт Gnuplot
- Groff разметка
- Hexdumps
- HTML
- HTTP сессии
- IDL
- Inform
- Конфигурационные файлы в стиле .ini
- Логи IRC (в стили irssi)
- Isabelle
- Нотация JSGF
- JSON, JSON-LD
- Доказатель теорем Lean
- Конфигурационные файлы lighttpd
- Сообщения ядра Linux (dmesg)
- Сборка LLVM
- Скрипты LSL
- Makefiles
- Вики-разметка MoinMoin/Trac
- MQL
- MySQL
- NCAR command language
- Конфигурационные файлы nginx
- Язык Nix
- Скрипты NSIS
- Notmuch
- сцены POV-Ray
- Puppet
- QML
- Ragel
- Redcode
- ReST
- Roboconf
- Robot Framework
- файлы спецификации RPM
- Rql
- RSL
- Scdoc
- SPARQL
- SQL, а также MySQL, SQLite
- Конфигурационные файлы Squidа
- TADS 3
- Terraform
- TeX
- Thrift
- TOML
- Спецификации грамматик на Treetop
- USD (Universal Scene Description)
- Конфигурационные файлы Varnish
- VGL
- Vim Script
- WDiff
- Пакетный файл Windows
- XML
- XSLT
- YAML
- Файлы реестра Windows
- ansys
- apdl
- asc
- gcode
- golang === go
- gsql
- jslt
- julia-repl
- kuin
- meson
- nestedtext
- nodejsrepl
- nt
- omg-idl
- output
- pem
- procfile
- pwsh
- smithy
- teal
- thingsdb
- ti
- wast
- wat
Лексические анализаторы ранее поддерживаемые при помощи GeSHi
Ниже приведен неполный список языков, которые GeSHi может подсвечивать, с пропуском для языков, которые больше не поддерживаются после переключения на Pygments.
Лексические анализаторы ранее поддерживаемые при помощи GeSHi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Установка
python3
) на сервере. Это изменение по сравнению с версией в комплекте с MediaWiki 1.30, в которой использовалась версия Python 2 (python
).- Скачайте и распакуйте файл(ы) в папку с названием
SyntaxHighlight_GeSHi
в вашей папкеextensions/
. - Если и только если устанавливаете из git, запустите Composer для установки зависимостей PHP, запустив
composer install --no-dev
в каталоге расширений. (Смотрите задача T173141 о возможных осложнениях.) - Добавьте следующий код внизу вашего
LocalSettings.php
:wfLoadExtension( 'SyntaxHighlight_GeSHi' );
- В Linux, установите разрешения для выполнения "pygmentize". Для этого вы можете использовать FTP-клиент или следующую команду:
chmod a+x /path/to/extensions/SyntaxHighlight_GeSHi/pygments/pygmentize
- Готово – Перейдите на страницу Special:Version на своей вики, чтобы удостовериться в том, что расширение успешно установлено.
Установка Vagrant:
- Если вы используете Vagrant , установите с помощью
vagrant roles enable syntaxhighlight --provision
Итак, после установки из Git измените на каталог, содержащий расширение, например.
"../extensions/SyntaxHighlight_GeSHi/"
и запустите composer install --no-dev
или при обновлении: composer update --no-dev
.Альтернативно, а также предпочтительно добавить строку
"extensions/SyntaxHighlight_GeSHi/composer.json"
в файл "composer.local.json" в корневой каталог вашей вики, например:
{
"extra": {
"merge-plugin": {
"include": [
"extensions/SyntaxHighlight_GeSHi/composer.json"
]
}
}
}
composer update --no-dev
. Voilà!
Настройка
$wgSyntaxHighlightMaxLines
and $wgSyntaxHighlightMaxBytes
(optional): For performance reasons, blobs or pages (JS, Lua and CSS pages) larger than these values will not be highlighted. (since 1.40)
- Linux
$wgPygmentizePath
(необязательно): Абсолютный путь к pygmentize пакета Pygments. Расширение связывает пакет Pygments и$wgPygmentizePath
с установленной версией по умолчанию, но вы можете указать другую версию, если хотите. Например:$wgPygmentizePath = "/usr/local/bin/pygmentize";
.
- Windows
- Если вы размещаете свою Mediawiki на компьютере с Windows, вам необходимо установить путь для Pygmentize.exe в
$wgPygmentizePath = "c:\\Python27\\Scripts\\pygmentize.exe";
- Если в директории нет
pygmentize.exe
запуститеeasy_install Pygments
из командной строки внутри папкиScripts
, чтобы сгенерировать файл.
- Если в директории нет
Если вы используете бинарный пакет pygmentize (extensions/SyntaxHighlight_GeSHi/pygments/pygmentize), убедитесь, что вашему веб-серверу разрешено его выполнение.
Если ваш хост не позволяет добавлять исполняемые файлы в ваш веб-каталог, установите python-pygments и добавьте $wgPygmentizePath = pygmentize
в LocalSettings.php.
- Поиск и устранение неисправностей
После обновления до MediaWiki v1.26 и выше некоторые пользователи начали сообщать о проблемах с расширением. Могут быть случаи, когда некоторые языки (например «Luа») могут не подсвечиваться, и при включении режима отладки MediaWiki выдает ошибку, Notice: Failed to invoke Pygments: /usr/bin/env: python3: No such file or directory
.
- Попробуйте указать в
$wgPygmentizePath
в LocalSettings.php на внешний двоичный файл 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. Это создаст требуемый файл по адресу:virtualenv/python/3.5/bin/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 (
- См. phab:T128993 для этого для дальнейших предложений и информации.
- SELinux can also prevent the extension from running with an error similar to
type=AVC msg=audit(1609598265.169:225924): avc: denied { execute } for pid=2360888 comm="bash" name="pygmentize" dev="dm-0" ino=50814399 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_user_content_t:s0 tclass=file permissive=0
in your audit.log. Это может быть разрешено сsetsebool -P httpd_unified 1
- In earlier versions of this extension, Windows would sometimes fail with an _Py_HashRandomization_Init error. This was a bug with the Windows environment not being passed to python executions. A fix was released in 1.40, with backports to 1.38 and 1.39.
Интеграция с VisualEditor
Плагин позволяет прямое редактирование с помощью VisualEditor.
Всплывающее окно открывается, когда пользователь хочет редактировать syntaxhighlight
секции.
Чтобы это работало, VisualEditor должен быть установлен и настроен с последней версии git, такой же для Parsoid.
Функция случайным образом не работает со старыми версиями Parsoid.
Для более подробной информации смотрите Extension:SyntaxHighlight/VisualEditor
Дополнительно
В отличие от тегов <pre>
и <code>
, символьные сущности HTML, такие как
, не имеют (и не должны) экранироваться символом &
как &
.
Подобно тегу <pre>
, но, в отличие от тега <code>
, теги в пределах диапазона (кроме собственного закрывающего тега) не должны иметь экранированный символ <
как <
, а также не нужно экранировать викитекст тегом <nowiki>
.
Кроме того, в то время как <pre>
предполагает, что табуляция останавливается каждые 8 символов и отображает вкладки с использованием фактических пробелов при копировании текста, <syntaxhighlight>
использует четырехпозиционные табуляции (кроме Internet Explorer, который использует 8) и сохраняет символы табуляции в визуализированном тексте ; последний может быть изменен с помощью охватывающего тега <span style="-moz-tab-size: nn; -o-tab-size: nn; tab-size: nn;">
(не <div>
, и не используя собственный атрибут style
).
Префикс -moz-
требуется для Firefox (для версий с 4.0 по 90), а префикс -o-
требуется для Opera (для версий с 10.60 по 15).[2]
(Обратите внимание, что в окне редактирования вики предполагаются 8-пробельные табуляции.)
Это относится только к сохранённым страницам; превью, сгенерированные в окне редактирования, или Special:ExpandTemplates имеют отличия.
См. также
- Pygments — Python syntax highlighter
- Расширения, зависящие от этого:
- Extension:SyntaxHighlightPages — выделяет страницы на основе суффиксов заголовков.
- Альтернативные расширения:
- Extension:Highlightjs Integration — расширение синтаксической подсветки, которое использует библиотеку HighlightJS (поддерживает некоторые языки которые Pygments не поддерживает, например Maxima)
- Extension:GoogleCodePrettify — расширение синтаксической подсветки, которое использует библиотеку Google Prettify.
Примечания
Это расширение используется в одном или нескольких проектах Викимедиа. Вероятно, это означает, что расширение стабильно и работает достаточно хорошо, чтобы использоваться такими сайтами с высоким трафиком. Найдите название этого расширения в файлах конфигурации Викимедиа CommonSettings.php и InitialiseSettings.php, чтобы узнать, где оно установлено. Полный список расширений, установленных на конкретной вики, можно увидеть на странице Special:Version wiki. |
Это расширение включено в следующие пакеты и/или вики-фермы: This is not an authoritative list. Some wiki farms/hosts may contain this extension even if they are not listed here. Always check with your wiki farms/hosts or bundle to confirm. |