To create a custom Pygments lexer for MediaWiki, do the following:

  1. Download the latest version of Pygments at https://bitbucket.org/birkenfeld/pygments-main. Eg. https://bitbucket.org/birkenfeld/pygments-main/get/2.4.2.tar.gz
  2. Extract it to extensions/pygments
  3. Create your lexer in the extensions/pygments/pygments/lexers directory
  4. Update the mapfile by running Make mapfiles in the extensions/pygments directory
  5. Ensure your LocalSettings.php point to the extensions/pygments/pygmentize script
  6. Update the list of lexers by running extensions/SyntaxHighlight_GeSHi/maintenance/updateLexerList.php

Platform-Python[edit]

On CentOS 8, there is no longer 'python2' or 'python3' since python2 support ended with that version. Ensure that the pygments script references /usr/libexec/platform-python so that pygments continue to work.

Issue Updating Mapfiles[edit]

If you get the following error while updating the mapfiles and you are using Python 2:

# make mapfiles
...
Traceback (most recent call last):
  File "_mapping.py", line 491, in <module>
    module = __import__(module_name, None, None, [''])
  File "../../pygments/lexers/make.py", line 18, in <module>
    from pygments.lexers.shell import BashLexer
  File "../../pygments/lexers/shell.py", line 140
    EXTRA_KEYWORDS = {'srun'}
                            ^
SyntaxError: invalid syntax
make: *** [mapfiles] Error 1

Edit the lexers/shell.py and comment out line containing EXTRA_KEYWORDS = {'srun'}.

Terminal Lexer[edit]

A simple lexer used on this wiki is for the Terminal output. It has the following lexer code which is just a couple regexes.

# -*- coding: utf-8 -*-
"""
    pygments.lexers.terminal
    16:41, 23 November 2018 (UTC)16:41, 23 November 2018 (UTC)16:41, 23 November 2018 (UTC)[[User:Leo|Leo]] ([[User talk:Leo|talk]]) 16:41, 23 November 2018 (UTC)

    Lexers for terminal output

    :copyright:  Leo's stuff
    :license:  Leo's stuff
"""

import re

from pygments.lexer import RegexLexer, bygroups
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
    Number, Punctuation, Error

__all__ = ['TerminalLexer']

class TerminalLexer(RegexLexer):
    """
    For terminal output

    .. versionadded:: 0.1
    """

    name = 'terminal'
    aliases = ['terminal']

    tokens = {
        'root': [
            (r'^##.*\n', Comment),
            (r'^(\[*[a-zA-Z0-9\@:~\/\-\]*]*[\$#%]{1})', Name, 'command'),
            (r'^(\[+[a-zA-Z0-9\@:~\/\-\]+]*[\$#%]?)', Name, 'command'),
            (r'.*\n', Text)
        ],

        'command': [
                (r'[^\\\n]+', String),
                (r'\\\n', String),
                (r'\n', String, '#pop')
        ]


    }