1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
"""
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'),
],
}
|