Как да разширите списъка с ключови думи за pygments.lexers.shell

Използвам Jekyll с Pygments за конвертиране на Markdown в статични html страници. Съдържанието е подготвено за страници на GitHub. За да покажа примерни кодове (команди на shell в този пример), добавям следния раздел към файловете:

{% highlight sh %}
$ ls -1a
.
..
README
{% endhighlight %}

Параметърът sh се отнася до обвивката, която конфигурира лексера. Можете също да изберете други лексери като console за маркиране на текста.

Забелязах, че някои основни команди като ls не са маркирани от лексера на обвивката. Това може да се види и в изходния код на лексера. Следващият откъс показва дефиницията на ключовите думи на shell lexer (намерен в класа BashLexer).

...
'basic': [
    (r'\b(if|fi|else|while|do|done|for|then|return|function|case|'
     r'select|continue|until|esac|elif)\s*\b',
     Keyword),
    (r'\b(alias|bg|bind|break|builtin|caller|cd|command|compgen|'
     r'complete|declare|dirs|disown|echo|enable|eval|exec|exit|'
     r'export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|'
     r'local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|'
     r'shopt|source|suspend|test|time|times|trap|true|type|typeset|'
     r'ulimit|umask|unalias|unset|wait)\s*\b(?!\.)',
     Name.Builtin),
    (r'#.*\n', Comment),
    (r'\\[\w\W]', String.Escape),
    (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
    (r'[\[\]{}()=]', Operator),
    (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
    (r'&&|\|\|', Operator),
],
...

Има ли начин да разширите списъка с ключови думи или вместо това можете да препоръчате друг лексер?


person JJD    schedule 20.10.2012    source източник
comment
Вместо това можете да разгледате също популярния маркер на синтаксиса на дъгата. Неговият режим на обвивка е демонстриран тук. Той подчертава ls -1a от това, което съм пробвал и трябва да е лесен за интегриране.   -  person Thomas Klemm    schedule 21.10.2012


Отговори (1)


Можете да добавите ключови думи към лексер на Pygments, като напишете свой собствен лексер, който добавя новите ключови думи, като подкласирате друг лексер. Вижте документа за pygments за повече информация. Направих лексичен инструмент с подкласове, който добавя няколко ключови думи към C++ лексния инструмент, който може да се види в това хранилище на Github.

Не съм сигурен как да добавя ключови думи от друг тип освен EXTRA_KEYWORDS.

person Filip S.    schedule 05.04.2014
comment
Операторът if проверява само дали value се съдържа в списъка, дефиниран от вас, в този случай EXTRA_KEYWORDS. Можете да създадете колкото списъци желаете и да създадете elif клон и за тях, след което yield желания токен вместо Keyword. - person Botimoo; 13.06.2019