pygments.rb 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +12 -7
  3. data/.github/workflows/release.yml +5 -5
  4. data/CHANGELOG.adoc +9 -0
  5. data/README.adoc +1 -1
  6. data/bench.rb +2 -2
  7. data/lib/pygments/lexer.rb +1 -1
  8. data/lib/pygments/mentos.py +6 -4
  9. data/lib/pygments/popen.rb +20 -11
  10. data/lib/pygments/version.rb +1 -1
  11. data/lib/pygments.rb +8 -2
  12. data/pygments.rb.gemspec +4 -4
  13. data/test/test_pygments.rb +14 -8
  14. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/AUTHORS +8 -1
  15. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/INSTALLER +0 -0
  16. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/LICENSE +0 -0
  17. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/METADATA +1 -1
  18. data/vendor/pygments-main/Pygments-2.10.0.dist-info/RECORD +524 -0
  19. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/REQUESTED +0 -0
  20. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/WHEEL +0 -0
  21. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/entry_points.txt +0 -0
  22. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/top_level.txt +0 -0
  23. data/vendor/pygments-main/bin/pygmentize +1 -1
  24. data/vendor/pygments-main/pygments/__init__.py +1 -1
  25. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -0
  26. data/vendor/pygments-main/pygments/formatters/html.py +20 -7
  27. data/vendor/pygments-main/pygments/formatters/pangomarkup.py +83 -0
  28. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +55 -14
  29. data/vendor/pygments-main/pygments/lexers/_julia_builtins.py +401 -0
  30. data/vendor/pygments-main/pygments/lexers/_mapping.py +68 -52
  31. data/vendor/pygments-main/pygments/lexers/actionscript.py +2 -2
  32. data/vendor/pygments-main/pygments/lexers/ambient.py +1 -1
  33. data/vendor/pygments-main/pygments/lexers/amdgpu.py +9 -4
  34. data/vendor/pygments-main/pygments/lexers/apdlexer.py +448 -0
  35. data/vendor/pygments-main/pygments/lexers/apl.py +6 -3
  36. data/vendor/pygments-main/pygments/lexers/asc.py +51 -0
  37. data/vendor/pygments-main/pygments/lexers/asm.py +86 -58
  38. data/vendor/pygments-main/pygments/lexers/automation.py +1 -1
  39. data/vendor/pygments-main/pygments/lexers/bibtex.py +2 -2
  40. data/vendor/pygments-main/pygments/lexers/c_cpp.py +60 -33
  41. data/vendor/pygments-main/pygments/lexers/c_like.py +102 -3
  42. data/vendor/pygments-main/pygments/lexers/cddl.py +2 -2
  43. data/vendor/pygments-main/pygments/lexers/chapel.py +53 -29
  44. data/vendor/pygments-main/pygments/lexers/clean.py +6 -6
  45. data/vendor/pygments-main/pygments/lexers/configs.py +133 -43
  46. data/vendor/pygments-main/pygments/lexers/csound.py +2 -2
  47. data/vendor/pygments-main/pygments/lexers/devicetree.py +1 -1
  48. data/vendor/pygments-main/pygments/lexers/dotnet.py +1 -1
  49. data/vendor/pygments-main/pygments/lexers/erlang.py +1 -1
  50. data/vendor/pygments-main/pygments/lexers/floscript.py +1 -1
  51. data/vendor/pygments-main/pygments/lexers/futhark.py +5 -4
  52. data/vendor/pygments-main/pygments/lexers/gcodelexer.py +36 -0
  53. data/vendor/pygments-main/pygments/lexers/go.py +1 -1
  54. data/vendor/pygments-main/pygments/lexers/graphics.py +1 -1
  55. data/vendor/pygments-main/pygments/lexers/graphviz.py +5 -4
  56. data/vendor/pygments-main/pygments/lexers/gsql.py +92 -0
  57. data/vendor/pygments-main/pygments/lexers/haskell.py +4 -4
  58. data/vendor/pygments-main/pygments/lexers/haxe.py +1 -1
  59. data/vendor/pygments-main/pygments/lexers/installers.py +2 -2
  60. data/vendor/pygments-main/pygments/lexers/javascript.py +145 -127
  61. data/vendor/pygments-main/pygments/lexers/jslt.py +94 -0
  62. data/vendor/pygments-main/pygments/lexers/julia.py +135 -183
  63. data/vendor/pygments-main/pygments/lexers/jvm.py +262 -202
  64. data/vendor/pygments-main/pygments/lexers/kuin.py +299 -0
  65. data/vendor/pygments-main/pygments/lexers/lisp.py +18 -15
  66. data/vendor/pygments-main/pygments/lexers/markup.py +3 -3
  67. data/vendor/pygments-main/pygments/lexers/matlab.py +23 -10
  68. data/vendor/pygments-main/pygments/lexers/meson.py +155 -0
  69. data/vendor/pygments-main/pygments/lexers/mime.py +6 -21
  70. data/vendor/pygments-main/pygments/lexers/ml.py +1 -1
  71. data/vendor/pygments-main/pygments/lexers/nimrod.py +1 -1
  72. data/vendor/pygments-main/pygments/lexers/objective.py +3 -3
  73. data/vendor/pygments-main/pygments/lexers/parsers.py +1 -1
  74. data/vendor/pygments-main/pygments/lexers/procfile.py +43 -0
  75. data/vendor/pygments-main/pygments/lexers/promql.py +1 -1
  76. data/vendor/pygments-main/pygments/lexers/python.py +19 -5
  77. data/vendor/pygments-main/pygments/lexers/resource.py +1 -1
  78. data/vendor/pygments-main/pygments/lexers/rnc.py +1 -1
  79. data/vendor/pygments-main/pygments/lexers/ruby.py +1 -1
  80. data/vendor/pygments-main/pygments/lexers/rust.py +9 -10
  81. data/vendor/pygments-main/pygments/lexers/scripting.py +7 -7
  82. data/vendor/pygments-main/pygments/lexers/shell.py +11 -8
  83. data/vendor/pygments-main/pygments/lexers/smithy.py +79 -0
  84. data/vendor/pygments-main/pygments/lexers/smv.py +1 -1
  85. data/vendor/pygments-main/pygments/lexers/special.py +15 -2
  86. data/vendor/pygments-main/pygments/lexers/supercollider.py +1 -1
  87. data/vendor/pygments-main/pygments/lexers/tcl.py +3 -3
  88. data/vendor/pygments-main/pygments/lexers/teal.py +88 -0
  89. data/vendor/pygments-main/pygments/lexers/templates.py +19 -19
  90. data/vendor/pygments-main/pygments/lexers/teraterm.py +1 -1
  91. data/vendor/pygments-main/pygments/lexers/testing.py +1 -1
  92. data/vendor/pygments-main/pygments/lexers/theorem.py +4 -2
  93. data/vendor/pygments-main/pygments/lexers/thingsdb.py +118 -0
  94. data/vendor/pygments-main/pygments/lexers/tnt.py +25 -15
  95. data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -1
  96. data/vendor/pygments-main/pygments/lexers/webassembly.py +120 -0
  97. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  98. data/vendor/pygments-main/pygments/style.py +1 -1
  99. data/vendor/pygments-main/pygments/styles/__init__.py +2 -0
  100. data/vendor/pygments-main/pygments/styles/friendly.py +1 -0
  101. data/vendor/pygments-main/pygments/styles/gruvbox.py +107 -0
  102. data/vendor/pygments-main/pygments/styles/native.py +1 -0
  103. metadata +29 -14
  104. data/vendor/pygments-main/Pygments-2.8.1.dist-info/RECORD +0 -494
@@ -15,12 +15,16 @@ from pygments.lexer import Lexer, RegexLexer, bygroups, do_insertions, \
15
15
  from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
16
16
  Number, Punctuation, Generic
17
17
  from pygments.util import shebang_matches
18
+ from pygments.lexers._julia_builtins import OPERATORS_LIST, DOTTED_OPERATORS_LIST, \
19
+ KEYWORD_LIST, BUILTIN_LIST, LITERAL_LIST
18
20
 
19
21
  __all__ = ['JuliaLexer', 'JuliaConsoleLexer']
20
22
 
23
+ # see https://docs.julialang.org/en/v1/manual/variables/#Allowed-Variable-Names
21
24
  allowed_variable = \
22
- '(?:[a-zA-Z_\u00A1-\U0010ffff]|%s)(?:[a-zA-Z_0-9\u00A1-\U0010ffff])*!*'
23
-
25
+ '(?:[a-zA-Z_\u00A1-\U0010ffff][a-zA-Z_0-9!\u00A1-\U0010ffff]*)'
26
+ # see https://github.com/JuliaLang/julia/blob/master/src/flisp/julia_opsuffs.h
27
+ operator_suffixes = r'[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*'
24
28
 
25
29
  class JuliaLexer(RegexLexer):
26
30
  """
@@ -42,21 +46,35 @@ class JuliaLexer(RegexLexer):
42
46
  (r'[^\S\n]+', Text),
43
47
  (r'#=', Comment.Multiline, "blockcomment"),
44
48
  (r'#.*$', Comment),
45
- (r'[\[\]{}(),;]', Punctuation),
49
+ (r'[\[\](),;]', Punctuation),
50
+
51
+ # symbols
52
+ # intercept range expressions first
53
+ (r'(' + allowed_variable + r')(\s*)(:)(' + allowed_variable + ')',
54
+ bygroups(Name, Text, Operator, Name)),
55
+ # then match :name which does not follow closing brackets, digits, or the
56
+ # ::, <:, and :> operators
57
+ (r'(?<![\]):<>\d.])(:' + allowed_variable + ')', String.Symbol),
58
+
59
+ # type assertions - excludes expressions like ::typeof(sin) and ::avec[1]
60
+ (r'(?<=::)(\s*)(' + allowed_variable + r')\b(?![(\[])', bygroups(Text, Keyword.Type)),
61
+ # type comparisons
62
+ # - MyType <: A or MyType >: A
63
+ ('(' + allowed_variable + r')(\s*)([<>]:)(\s*)(' + allowed_variable + r')\b(?![(\[])',
64
+ bygroups(Keyword.Type, Text, Operator, Text, Keyword.Type)),
65
+ # - <: B or >: B
66
+ (r'([<>]:)(\s*)(' + allowed_variable + r')\b(?![(\[])',
67
+ bygroups(Operator, Text, Keyword.Type)),
68
+ # - A <: or A >:
69
+ (r'\b(' + allowed_variable + r')(\s*)([<>]:)',
70
+ bygroups(Keyword.Type, Text, Operator)),
46
71
 
47
- # keywords
48
- (r'in\b', Keyword.Pseudo),
49
- (r'isa\b', Keyword.Pseudo),
50
- (r'(true|false)\b', Keyword.Constant),
51
- (r'(local|global|const)\b', Keyword.Declaration),
52
- (words([
53
- 'function', 'type', 'typealias', 'abstract', 'immutable',
54
- 'baremodule', 'begin', 'bitstype', 'break', 'catch', 'ccall',
55
- 'continue', 'do', 'else', 'elseif', 'end', 'export', 'finally',
56
- 'for', 'if', 'import', 'importall', 'let', 'macro', 'module',
57
- 'mutable', 'primitive', 'quote', 'return', 'struct', 'try',
58
- 'using', 'while'],
59
- suffix=r'\b'), Keyword),
72
+ # operators
73
+ # Suffixes aren't actually allowed on all operators, but we'll ignore that
74
+ # since those cases are invalid Julia code.
75
+ (words([*OPERATORS_LIST, *DOTTED_OPERATORS_LIST], suffix=operator_suffixes), Operator),
76
+ (words(['.' + o for o in DOTTED_OPERATORS_LIST], suffix=operator_suffixes), Operator),
77
+ (words(['...', '..']), Operator),
60
78
 
61
79
  # NOTE
62
80
  # Patterns below work only for definition sites and thus hardly reliable.
@@ -64,160 +82,67 @@ class JuliaLexer(RegexLexer):
64
82
  # functions
65
83
  # (r'(function)(\s+)(' + allowed_variable + ')',
66
84
  # bygroups(Keyword, Text, Name.Function)),
67
- #
68
- # types
69
- # (r'(type|typealias|abstract|immutable)(\s+)(' + allowed_variable + ')',
70
- # bygroups(Keyword, Text, Name.Class)),
71
-
72
- # type names
73
- (words([
74
- 'ANY', 'ASCIIString', 'AbstractArray', 'AbstractChannel',
75
- 'AbstractFloat', 'AbstractMatrix', 'AbstractRNG',
76
- 'AbstractSparseArray', 'AbstractSparseMatrix',
77
- 'AbstractSparseVector', 'AbstractString', 'AbstractVecOrMat',
78
- 'AbstractVector', 'Any', 'ArgumentError', 'Array',
79
- 'AssertionError', 'Associative', 'Base64DecodePipe',
80
- 'Base64EncodePipe', 'Bidiagonal', 'BigFloat', 'BigInt',
81
- 'BitArray', 'BitMatrix', 'BitVector', 'Bool', 'BoundsError',
82
- 'Box', 'BufferStream', 'CapturedException', 'CartesianIndex',
83
- 'CartesianRange', 'Cchar', 'Cdouble', 'Cfloat', 'Channel',
84
- 'Char', 'Cint', 'Cintmax_t', 'Clong', 'Clonglong',
85
- 'ClusterManager', 'Cmd', 'Coff_t', 'Colon', 'Complex',
86
- 'Complex128', 'Complex32', 'Complex64', 'CompositeException',
87
- 'Condition', 'Cptrdiff_t', 'Cshort', 'Csize_t', 'Cssize_t',
88
- 'Cstring', 'Cuchar', 'Cuint', 'Cuintmax_t', 'Culong',
89
- 'Culonglong', 'Cushort', 'Cwchar_t', 'Cwstring', 'DataType',
90
- 'Date', 'DateTime', 'DenseArray', 'DenseMatrix',
91
- 'DenseVecOrMat', 'DenseVector', 'Diagonal', 'Dict',
92
- 'DimensionMismatch', 'Dims', 'DirectIndexString', 'Display',
93
- 'DivideError', 'DomainError', 'EOFError', 'EachLine', 'Enum',
94
- 'Enumerate', 'ErrorException', 'Exception', 'Expr',
95
- 'Factorization', 'FileMonitor', 'FileOffset', 'Filter',
96
- 'Float16', 'Float32', 'Float64', 'FloatRange', 'Function',
97
- 'GenSym', 'GlobalRef', 'GotoNode', 'HTML', 'Hermitian', 'IO',
98
- 'IOBuffer', 'IOStream', 'IPv4', 'IPv6', 'InexactError',
99
- 'InitError', 'Int', 'Int128', 'Int16', 'Int32', 'Int64', 'Int8',
100
- 'IntSet', 'Integer', 'InterruptException', 'IntrinsicFunction',
101
- 'InvalidStateException', 'Irrational', 'KeyError', 'LabelNode',
102
- 'LambdaStaticData', 'LinSpace', 'LineNumberNode', 'LoadError',
103
- 'LocalProcess', 'LowerTriangular', 'MIME', 'Matrix',
104
- 'MersenneTwister', 'Method', 'MethodError', 'MethodTable',
105
- 'Module', 'NTuple', 'NewvarNode', 'NullException', 'Nullable',
106
- 'Number', 'ObjectIdDict', 'OrdinalRange', 'OutOfMemoryError',
107
- 'OverflowError', 'Pair', 'ParseError', 'PartialQuickSort',
108
- 'Pipe', 'PollingFileWatcher', 'ProcessExitedException',
109
- 'ProcessGroup', 'Ptr', 'QuoteNode', 'RandomDevice', 'Range',
110
- 'Rational', 'RawFD', 'ReadOnlyMemoryError', 'Real',
111
- 'ReentrantLock', 'Ref', 'Regex', 'RegexMatch',
112
- 'RemoteException', 'RemoteRef', 'RepString', 'RevString',
113
- 'RopeString', 'RoundingMode', 'SegmentationFault',
114
- 'SerializationState', 'Set', 'SharedArray', 'SharedMatrix',
115
- 'SharedVector', 'Signed', 'SimpleVector', 'SparseMatrixCSC',
116
- 'StackOverflowError', 'StatStruct', 'StepRange', 'StridedArray',
117
- 'StridedMatrix', 'StridedVecOrMat', 'StridedVector', 'SubArray',
118
- 'SubString', 'SymTridiagonal', 'Symbol', 'SymbolNode',
119
- 'Symmetric', 'SystemError', 'TCPSocket', 'Task', 'Text',
120
- 'TextDisplay', 'Timer', 'TopNode', 'Tridiagonal', 'Tuple',
121
- 'Type', 'TypeConstructor', 'TypeError', 'TypeName', 'TypeVar',
122
- 'UDPSocket', 'UInt', 'UInt128', 'UInt16', 'UInt32', 'UInt64',
123
- 'UInt8', 'UTF16String', 'UTF32String', 'UTF8String',
124
- 'UndefRefError', 'UndefVarError', 'UnicodeError', 'UniformScaling',
125
- 'Union', 'UnitRange', 'Unsigned', 'UpperTriangular', 'Val',
126
- 'Vararg', 'VecOrMat', 'Vector', 'VersionNumber', 'Void', 'WString',
127
- 'WeakKeyDict', 'WeakRef', 'WorkerConfig', 'Zip'], suffix=r'\b'),
128
- Keyword.Type),
129
-
130
- # builtins
131
- (words([
132
- 'ARGS', 'CPU_CORES', 'C_NULL', 'DevNull', 'ENDIAN_BOM',
133
- 'ENV', 'I', 'Inf', 'Inf16', 'Inf32', 'Inf64',
134
- 'InsertionSort', 'JULIA_HOME', 'LOAD_PATH', 'MergeSort',
135
- 'NaN', 'NaN16', 'NaN32', 'NaN64', 'OS_NAME',
136
- 'QuickSort', 'RoundDown', 'RoundFromZero', 'RoundNearest',
137
- 'RoundNearestTiesAway', 'RoundNearestTiesUp',
138
- 'RoundToZero', 'RoundUp', 'STDERR', 'STDIN', 'STDOUT',
139
- 'VERSION', 'WORD_SIZE', 'catalan', 'e', 'eu',
140
- 'eulergamma', 'golden', 'im', 'nothing', 'pi', 'γ', 'π', 'φ'],
141
- suffix=r'\b'), Name.Builtin),
142
-
143
- # operators
144
- # see: https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm
145
- (words((
146
- # prec-assignment
147
- '=', ':=', '+=', '-=', '*=', '/=', '//=', './/=', '.*=', './=',
148
- '\\=', '.\\=', '^=', '.^=', '÷=', '.÷=', '%=', '.%=', '|=', '&=',
149
- '$=', '=>', '<<=', '>>=', '>>>=', '~', '.+=', '.-=',
150
- # prec-conditional
151
- '?',
152
- # prec-arrow
153
- '--', '-->',
154
- # prec-lazy-or
155
- '||',
156
- # prec-lazy-and
157
- '&&',
158
- # prec-comparison
159
- '>', '<', '>=', '≥', '<=', '≤', '==', '===', '≡', '!=', '≠',
160
- '!==', '≢', '.>', '.<', '.>=', '.≥', '.<=', '.≤', '.==', '.!=',
161
- '.≠', '.=', '.!', '<:', '>:', '∈', '∉', '∋', '∌', '⊆',
162
- '⊈', '⊂',
163
- '⊄', '⊊',
164
- # prec-pipe
165
- '|>', '<|',
166
- # prec-colon
167
- ':',
168
- # prec-plus
169
- '.+', '.-', '|', '∪', '$',
170
- # prec-bitshift
171
- '<<', '>>', '>>>', '.<<', '.>>', '.>>>',
172
- # prec-times
173
- '*', '/', './', '÷', '.÷', '%', '⋅', '.%', '.*', '\\', '.\\', '&', '∩',
174
- # prec-rational
175
- '//', './/',
176
- # prec-power
177
- '^', '.^',
178
- # prec-decl
179
- '::',
180
- # prec-dot
181
- '.',
182
- # unary op
183
- '+', '-', '!', '√', '∛', '∜',
184
- )), Operator),
185
85
 
186
86
  # chars
187
87
  (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|"
188
88
  r"\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'", String.Char),
189
89
 
190
90
  # try to match trailing transpose
191
- (r'(?<=[.\w)\]])\'+', Operator),
192
-
193
- # strings
194
- (r'"""', String, 'tqstring'),
195
- (r'"', String, 'string'),
91
+ (r'(?<=[.\w)\]])(\'' + operator_suffixes + ')+', Operator),
196
92
 
93
+ # raw strings
94
+ (r'(raw)(""")', bygroups(String.Affix, String), 'tqrawstring'),
95
+ (r'(raw)(")', bygroups(String.Affix, String), 'rawstring'),
197
96
  # regular expressions
198
- (r'r"""', String.Regex, 'tqregex'),
199
- (r'r"', String.Regex, 'regex'),
97
+ (r'(r)(""")', bygroups(String.Affix, String.Regex), 'tqregex'),
98
+ (r'(r)(")', bygroups(String.Affix, String.Regex), 'regex'),
99
+ # other strings
100
+ (r'(' + allowed_variable + ')?(""")', bygroups(String.Affix, String), 'tqstring'),
101
+ (r'(' + allowed_variable + ')?(")', bygroups(String.Affix, String), 'string'),
200
102
 
201
103
  # backticks
202
- (r'`', String.Backtick, 'command'),
104
+ (r'(' + allowed_variable + ')?(```)', bygroups(String.Affix, String.Backtick), 'tqcommand'),
105
+ (r'(' + allowed_variable + ')?(`)', bygroups(String.Affix, String.Backtick), 'command'),
106
+
107
+ # type names
108
+ # - names that begin a curly expression
109
+ ('(' + allowed_variable + r')(\{)',
110
+ bygroups(Keyword.Type, Punctuation), 'curly'),
111
+ # - names as part of bare 'where'
112
+ (r'(where)(\s+)(' + allowed_variable + ')',
113
+ bygroups(Keyword, Text, Keyword.Type)),
114
+ # - curly expressions in general
115
+ (r'(\{)', Punctuation, 'curly'),
116
+ # - names as part of type declaration
117
+ (r'(abstract[ \t]+type|primitive[ \t]+type|mutable[ \t]+struct|struct)([\s()]+)(' +
118
+ allowed_variable + r')', bygroups(Keyword, Text, Keyword.Type)),
119
+
120
+ # macros
121
+ (r'@' + allowed_variable, Name.Decorator),
122
+ (words([*OPERATORS_LIST, '..', '.', *DOTTED_OPERATORS_LIST],
123
+ prefix='@', suffix=operator_suffixes), Name.Decorator),
124
+
125
+ # keywords
126
+ (words(KEYWORD_LIST, suffix=r'\b'), Keyword),
127
+ # builtin types
128
+ (words(BUILTIN_LIST, suffix=r'\b'), Keyword.Type),
129
+ # builtin literals
130
+ (words(LITERAL_LIST, suffix=r'\b'), Name.Builtin),
203
131
 
204
132
  # names
205
133
  (allowed_variable, Name),
206
- (r'@' + allowed_variable, Name.Decorator),
207
134
 
208
135
  # numbers
209
- (r'(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?', Number.Float),
210
- (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
211
- (r'\d+(_\d+)+[eEf][+-]?[0-9]+', Number.Float),
212
- (r'\d+[eEf][+-]?[0-9]+', Number.Float),
213
- (r'0b[01]+(_[01]+)+', Number.Bin),
214
- (r'0b[01]+', Number.Bin),
215
- (r'0o[0-7]+(_[0-7]+)+', Number.Oct),
216
- (r'0o[0-7]+', Number.Oct),
217
- (r'0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+', Number.Hex),
218
- (r'0x[a-fA-F0-9]+', Number.Hex),
219
- (r'\d+(_\d+)+', Number.Integer),
220
- (r'\d+', Number.Integer)
136
+ (r'(\d+((_\d+)+)?\.(?!\.)(\d+((_\d+)+)?)?|\.\d+((_\d+)+)?)([eEf][+-]?[0-9]+)?', Number.Float),
137
+ (r'\d+((_\d+)+)?[eEf][+-]?[0-9]+', Number.Float),
138
+ (r'0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?(\.([a-fA-F0-9]+((_[a-fA-F0-9]+)+)?)?)?p[+-]?\d+', Number.Float),
139
+ (r'0b[01]+((_[01]+)+)?', Number.Bin),
140
+ (r'0o[0-7]+((_[0-7]+)+)?', Number.Oct),
141
+ (r'0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?', Number.Hex),
142
+ (r'\d+((_\d+)+)?', Number.Integer),
143
+
144
+ # single dot operator matched last to permit e.g. ".1" as a float
145
+ (words(['.']), Operator),
221
146
  ],
222
147
 
223
148
  "blockcomment": [
@@ -227,53 +152,80 @@ class JuliaLexer(RegexLexer):
227
152
  (r'[=#]', Comment.Multiline),
228
153
  ],
229
154
 
230
- 'string': [
155
+ 'curly': [
156
+ (r'\{', Punctuation, '#push'),
157
+ (r'\}', Punctuation, '#pop'),
158
+ (allowed_variable, Keyword.Type),
159
+ include('root'),
160
+ ],
161
+
162
+ 'tqrawstring': [
163
+ (r'"""', String, '#pop'),
164
+ (r'([^"]|"[^"][^"])+', String),
165
+ ],
166
+ 'rawstring': [
231
167
  (r'"', String, '#pop'),
232
- # FIXME: This escape pattern is not perfect.
233
- (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
234
- # Interpolation is defined as "$" followed by the shortest full
235
- # expression, which is something we can't parse.
236
- # Include the most common cases here: $word, and $(paren'd expr).
168
+ (r'\\"', String.Escape),
169
+ (r'([^"\\]|\\[^"])+', String),
170
+ ],
171
+
172
+ # Interpolation is defined as "$" followed by the shortest full expression, which is
173
+ # something we can't parse.
174
+ # Include the most common cases here: $word, and $(paren'd expr).
175
+ 'interp': [
237
176
  (r'\$' + allowed_variable, String.Interpol),
238
- # (r'\$[a-zA-Z_]+', String.Interpol),
239
177
  (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
178
+ ],
179
+ 'in-intp': [
180
+ (r'\(', Punctuation, '#push'),
181
+ (r'\)', Punctuation, '#pop'),
182
+ include('root'),
183
+ ],
184
+
185
+ 'string': [
186
+ (r'(")(' + allowed_variable + r'|\d+)?', bygroups(String, String.Affix), '#pop'),
187
+ # FIXME: This escape pattern is not perfect.
188
+ (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
189
+ include('interp'),
240
190
  # @printf and @sprintf formats
241
191
  (r'%[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]',
242
192
  String.Interpol),
243
- (r'.|\s', String),
193
+ (r'[^"$%\\]+', String),
194
+ (r'.', String),
244
195
  ],
245
-
246
196
  'tqstring': [
247
- (r'"""', String, '#pop'),
197
+ (r'(""")(' + allowed_variable + r'|\d+)?', bygroups(String, String.Affix), '#pop'),
248
198
  (r'\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)', String.Escape),
249
- (r'\$' + allowed_variable, String.Interpol),
250
- (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
251
- (r'.|\s', String),
199
+ include('interp'),
200
+ (r'[^"$%\\]+', String),
201
+ (r'.', String),
252
202
  ],
253
203
 
254
204
  'regex': [
255
- (r'"', String.Regex, '#pop'),
205
+ (r'(")([imsxa]*)?', bygroups(String.Regex, String.Affix), '#pop'),
256
206
  (r'\\"', String.Regex),
257
- (r'.|\s', String.Regex),
207
+ (r'[^\\"]+', String.Regex),
258
208
  ],
259
209
 
260
210
  'tqregex': [
261
- (r'"""', String.Regex, '#pop'),
262
- (r'.|\s', String.Regex),
211
+ (r'(""")([imsxa]*)?', bygroups(String.Regex, String.Affix), '#pop'),
212
+ (r'[^"]+', String.Regex),
263
213
  ],
264
214
 
265
215
  'command': [
266
- (r'`', String.Backtick, '#pop'),
267
- (r'\$' + allowed_variable, String.Interpol),
268
- (r'(\$)(\()', bygroups(String.Interpol, Punctuation), 'in-intp'),
269
- (r'.|\s', String.Backtick)
216
+ (r'(`)(' + allowed_variable + r'|\d+)?', bygroups(String.Backtick, String.Affix), '#pop'),
217
+ (r'\\[`$]', String.Escape),
218
+ include('interp'),
219
+ (r'[^\\`$]+', String.Backtick),
220
+ (r'.', String.Backtick),
221
+ ],
222
+ 'tqcommand': [
223
+ (r'(```)(' + allowed_variable + r'|\d+)?', bygroups(String.Backtick, String.Affix), '#pop'),
224
+ (r'\\\$', String.Escape),
225
+ include('interp'),
226
+ (r'[^\\`$]+', String.Backtick),
227
+ (r'.', String.Backtick),
270
228
  ],
271
-
272
- 'in-intp': [
273
- (r'\(', Punctuation, '#push'),
274
- (r'\)', Punctuation, '#pop'),
275
- include('root'),
276
- ]
277
229
  }
278
230
 
279
231
  def analyse_text(text):
@@ -287,7 +239,7 @@ class JuliaConsoleLexer(Lexer):
287
239
  .. versionadded:: 1.6
288
240
  """
289
241
  name = 'Julia console'
290
- aliases = ['jlcon']
242
+ aliases = ['jlcon', 'julia-repl']
291
243
 
292
244
  def get_tokens_unprocessed(self, text):
293
245
  jllexer = JuliaLexer(**self.options)