| """ | |
| pygments.lexers.bibtex | |
| ~~~~~~~~~~~~~~~~~~~~~~ | |
| Lexers for BibTeX bibliography data and styles | |
| :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. | |
| :license: BSD, see LICENSE for details. | |
| """ | |
| import re | |
| from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, default, \ | |
| words | |
| from pygments.token import Name, Comment, String, Error, Number, Keyword, \ | |
| Punctuation, Whitespace | |
| __all__ = ['BibTeXLexer', 'BSTLexer'] | |
| class BibTeXLexer(ExtendedRegexLexer): | |
| """ | |
| A lexer for BibTeX bibliography data format. | |
| .. versionadded:: 2.2 | |
| """ | |
| name = 'BibTeX' | |
| aliases = ['bibtex', 'bib'] | |
| filenames = ['*.bib'] | |
| mimetypes = ["text/x-bibtex"] | |
| flags = re.IGNORECASE | |
| ALLOWED_CHARS = r'@!$&*+\-./:;<>?\[\\\]^`|~' | |
| IDENTIFIER = '[{}][{}]*'.format('a-z_' + ALLOWED_CHARS, r'\w' + ALLOWED_CHARS) | |
| def open_brace_callback(self, match, ctx): | |
| opening_brace = match.group() | |
| ctx.opening_brace = opening_brace | |
| yield match.start(), Punctuation, opening_brace | |
| ctx.pos = match.end() | |
| def close_brace_callback(self, match, ctx): | |
| closing_brace = match.group() | |
| if ( | |
| ctx.opening_brace == '{' and closing_brace != '}' or | |
| ctx.opening_brace == '(' and closing_brace != ')' | |
| ): | |
| yield match.start(), Error, closing_brace | |
| else: | |
| yield match.start(), Punctuation, closing_brace | |
| del ctx.opening_brace | |
| ctx.pos = match.end() | |
| tokens = { | |
| 'root': [ | |
| include('whitespace'), | |
| (r'@comment(?!ary)', Comment), | |
| ('@preamble', Name.Class, ('closing-brace', 'value', 'opening-brace')), | |
| ('@string', Name.Class, ('closing-brace', 'field', 'opening-brace')), | |
| ('@' + IDENTIFIER, Name.Class, | |
| ('closing-brace', 'command-body', 'opening-brace')), | |
| ('.+', Comment), | |
| ], | |
| 'opening-brace': [ | |
| include('whitespace'), | |
| (r'[{(]', open_brace_callback, '#pop'), | |
| ], | |
| 'closing-brace': [ | |
| include('whitespace'), | |
| (r'[})]', close_brace_callback, '#pop'), | |
| ], | |
| 'command-body': [ | |
| include('whitespace'), | |
| (r'[^\s\,\}]+', Name.Label, ('#pop', 'fields')), | |
| ], | |
| 'fields': [ | |
| include('whitespace'), | |
| (',', Punctuation, 'field'), | |
| default('#pop'), | |
| ], | |
| 'field': [ | |
| include('whitespace'), | |
| (IDENTIFIER, Name.Attribute, ('value', '=')), | |
| default('#pop'), | |
| ], | |
| '=': [ | |
| include('whitespace'), | |
| ('=', Punctuation, '#pop'), | |
| ], | |
| 'value': [ | |
| include('whitespace'), | |
| (IDENTIFIER, Name.Variable), | |
| ('"', String, 'quoted-string'), | |
| (r'\{', String, 'braced-string'), | |
| (r'[\d]+', Number), | |
| ('#', Punctuation), | |
| default('#pop'), | |
| ], | |
| 'quoted-string': [ | |
| (r'\{', String, 'braced-string'), | |
| ('"', String, '#pop'), | |
| (r'[^\{\"]+', String), | |
| ], | |
| 'braced-string': [ | |
| (r'\{', String, '#push'), | |
| (r'\}', String, '#pop'), | |
| (r'[^\{\}]+', String), | |
| ], | |
| 'whitespace': [ | |
| (r'\s+', Whitespace), | |
| ], | |
| } | |
| class BSTLexer(RegexLexer): | |
| """ | |
| A lexer for BibTeX bibliography styles. | |
| .. versionadded:: 2.2 | |
| """ | |
| name = 'BST' | |
| aliases = ['bst', 'bst-pybtex'] | |
| filenames = ['*.bst'] | |
| flags = re.IGNORECASE | re.MULTILINE | |
| tokens = { | |
| 'root': [ | |
| include('whitespace'), | |
| (words(['read', 'sort']), Keyword), | |
| (words(['execute', 'integers', 'iterate', 'reverse', 'strings']), | |
| Keyword, ('group')), | |
| (words(['function', 'macro']), Keyword, ('group', 'group')), | |
| (words(['entry']), Keyword, ('group', 'group', 'group')), | |
| ], | |
| 'group': [ | |
| include('whitespace'), | |
| (r'\{', Punctuation, ('#pop', 'group-end', 'body')), | |
| ], | |
| 'group-end': [ | |
| include('whitespace'), | |
| (r'\}', Punctuation, '#pop'), | |
| ], | |
| 'body': [ | |
| include('whitespace'), | |
| (r"\'[^#\"\{\}\s]+", Name.Function), | |
| (r'[^#\"\{\}\s]+\$', Name.Builtin), | |
| (r'[^#\"\{\}\s]+', Name.Variable), | |
| (r'"[^\"]*"', String), | |
| (r'#-?\d+', Number), | |
| (r'\{', Punctuation, ('group-end', 'body')), | |
| default('#pop'), | |
| ], | |
| 'whitespace': [ | |
| (r'\s+', Whitespace), | |
| ('%.*?$', Comment.Single), | |
| ], | |
| } | |