123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- """
- pygments.lexers.typst
- ~~~~~~~~~~~~~~~~~~~~~
- Lexers for Typst language.
- :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.lexer import RegexLexer, words, bygroups, include
- from pygments.token import Comment, Keyword, Name, String, Punctuation, \
- Whitespace, Generic, Operator, Number, Text
- __all__ = ['TypstLexer']
- class TypstLexer(RegexLexer):
- """
- For Typst code.
- """
- name = 'Typst'
- aliases = ['typst']
- filenames = ['*.typ']
- mimetypes = ['text/x-typst']
- url = 'https://typst.app'
- version_added = '2.18'
- tokens = {
- 'root': [
- include('markup'),
- ],
- 'common': [
- (r'[ \t]+', Whitespace),
- (r'((?!=[*_$`\-+0-9/<@\\#\[]|https?://).)+', Text),
- ],
- 'markup': [
- include('comment'),
- (r'^\s*=+.*$', Generic.Heading),
- (r'[*][^*]*[*]', Generic.Strong),
- (r'_[^_]*_', Generic.Emph),
- (r'\$', Punctuation, 'maths'),
- (r'`[^`]*`', String.Backtick), # inline code
- (r'^\s*-', Punctuation), # unnumbered list
- (r'^\s*\+', Punctuation), # numbered list
- (r'^\s*[0-9.]+', Punctuation), # numbered list variant
- (r'^(\s*/\s+)([^:]+)(:)', bygroups(Punctuation, Name.Variable, Punctuation)), # definitions
- (r'<[a-zA-Z_][a-zA-Z0-9_-]*>', Name.Label), # label
- (r'@[a-zA-Z_][a-zA-Z0-9_-]*', Name.Label), # reference
- (r'\\#', Text), # escaped
- (words(('#let', '#set', '#show'), suffix=r'\b'), Keyword.Declaration, 'inline_code'),
- (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\[)', bygroups(Name.Function, Punctuation), 'markup'),
- (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), 'inline_code'),
- (r'#[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable),
- (r'```(?:.|\n)*?```', String.Backtick), # code block
- (r'https?://[0-9a-zA-Z~/%#&=\',;.+?]*', Generic.Emph), # links
- (words((r'---', r'\\', r'~', r'--', r'...'), suffix=r'\b'), Punctuation), # special chars shorthand
- (r'\\\[', Punctuation), # escaped
- (r'\\\]', Punctuation), # escaped
- (r'\[', Punctuation, '#push'),
- (r'\]', Punctuation, '#pop'),
- include('common'),
- ],
- 'maths': [
- include('comment'),
- (words(('_', '^', '+', '-', '/', '*', '->', '<-', '!=', '=='),
- suffix=r'\b'), Operator),
- (words((r'\\', '$='), suffix=r'\b'), Operator), # maths markup operators
- (r'\\\$', Punctuation), # escaped
- (r'\$', Punctuation, '#pop'), # end of math mode
- include('code'),
- ],
- 'comment': [
- (r'//.*$', Comment.Single),
- (r'/[*](.|\n)*?[*]/', Comment.Multiline),
- ],
- 'code': [
- include('comment'),
- (r'\[', Punctuation, 'markup'),
- (r'\(|\{', Punctuation, 'code'),
- (r'\)|\}', Punctuation, '#pop'),
- (r'"[^"]*"', String.Double),
- (r'[=,]', Operator),
- (words(('and', 'or', 'not'), suffix=r'\b'), Operator.Word),
- (r'=>|<=|==|!=|>|<|-=|\+=|\*=|/=|\+|-|\\|\*', Operator), # comparisons
- (r'([a-zA-Z_][a-zA-Z0-9_]*)(:)', bygroups(Name.Variable, Punctuation), '#push'),
- (r'([a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), '#push'),
- (words(('as', 'break', 'export', 'continue', 'else', 'for', 'if',
- 'import', 'in', 'include', 'return', 'while'), suffix=r'\b'),
- Keyword.Reserved),
- (words(('auto', 'none', 'true', 'false'), suffix=r'\b'), Keyword.Constant),
- (r'([0-9.]+)(mm|pt|cm|in|em|fr|%)', bygroups(Number, Keyword.Reserved)),
- (words(('let', 'set', 'show'), suffix=r'\b'), Keyword.Declaration),
- # FIXME: make this work
- ## (r'(import|include)( *)(")([^"])(")',
- ## bygroups(Keyword.Reserved, Text, Punctuation, String.Double, Punctuation)),
- include('common'),
- ],
- 'inline_code': [
- (r';$', Punctuation, '#pop'),
- include('code'),
- ],
- }
|