Как расширить список ключевых слов для pygments.lexers.shell

Я использую Jekyll с Pygments для преобразования Markdown в статические HTML-страницы. Контент подготовлен для страниц GitHub. Чтобы отобразить образцы кода (команды оболочки в этом примере), я добавляю в файлы следующий раздел:

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

Параметр sh относится к оболочке, которая настраивает лексер. Вы также можете выбрать другие лексеры, такие как console, для выделения текста.

Я заметил, что некоторые базовые команды, такие как ls, не выделяются лексером оболочки. Это также можно увидеть в исходном коде лексера< /а>. В следующем отрывке показано определение ключевых слов лексера оболочки (в классе 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