"" "
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' ),
],
}
quality 25%
¤ Dauer der Verarbeitung: 0.6 Sekunden
¤
*© Formatika GbR, Deutschland