pygments.rb 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -1
  3. data/CHANGELOG.adoc +5 -0
  4. data/bench.rb +2 -2
  5. data/lib/pygments/lexer.rb +1 -1
  6. data/lib/pygments/mentos.py +6 -4
  7. data/lib/pygments/popen.rb +14 -7
  8. data/lib/pygments/version.rb +1 -1
  9. data/lib/pygments.rb +8 -2
  10. data/pygments.rb.gemspec +4 -4
  11. data/test/test_pygments.rb +13 -7
  12. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/AUTHORS +8 -1
  13. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/INSTALLER +0 -0
  14. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/LICENSE +0 -0
  15. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/METADATA +1 -1
  16. data/vendor/pygments-main/Pygments-2.10.0.dist-info/RECORD +524 -0
  17. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/REQUESTED +0 -0
  18. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/WHEEL +0 -0
  19. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/entry_points.txt +0 -0
  20. data/vendor/pygments-main/{Pygments-2.8.1.dist-info → Pygments-2.10.0.dist-info}/top_level.txt +0 -0
  21. data/vendor/pygments-main/bin/pygmentize +1 -1
  22. data/vendor/pygments-main/pygments/__init__.py +1 -1
  23. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -0
  24. data/vendor/pygments-main/pygments/formatters/html.py +20 -7
  25. data/vendor/pygments-main/pygments/formatters/pangomarkup.py +83 -0
  26. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +55 -14
  27. data/vendor/pygments-main/pygments/lexers/_julia_builtins.py +401 -0
  28. data/vendor/pygments-main/pygments/lexers/_mapping.py +68 -52
  29. data/vendor/pygments-main/pygments/lexers/actionscript.py +2 -2
  30. data/vendor/pygments-main/pygments/lexers/ambient.py +1 -1
  31. data/vendor/pygments-main/pygments/lexers/amdgpu.py +9 -4
  32. data/vendor/pygments-main/pygments/lexers/apdlexer.py +448 -0
  33. data/vendor/pygments-main/pygments/lexers/apl.py +6 -3
  34. data/vendor/pygments-main/pygments/lexers/asc.py +51 -0
  35. data/vendor/pygments-main/pygments/lexers/asm.py +86 -58
  36. data/vendor/pygments-main/pygments/lexers/automation.py +1 -1
  37. data/vendor/pygments-main/pygments/lexers/bibtex.py +2 -2
  38. data/vendor/pygments-main/pygments/lexers/c_cpp.py +60 -33
  39. data/vendor/pygments-main/pygments/lexers/c_like.py +102 -3
  40. data/vendor/pygments-main/pygments/lexers/cddl.py +2 -2
  41. data/vendor/pygments-main/pygments/lexers/chapel.py +53 -29
  42. data/vendor/pygments-main/pygments/lexers/clean.py +6 -6
  43. data/vendor/pygments-main/pygments/lexers/configs.py +133 -43
  44. data/vendor/pygments-main/pygments/lexers/csound.py +2 -2
  45. data/vendor/pygments-main/pygments/lexers/devicetree.py +1 -1
  46. data/vendor/pygments-main/pygments/lexers/dotnet.py +1 -1
  47. data/vendor/pygments-main/pygments/lexers/erlang.py +1 -1
  48. data/vendor/pygments-main/pygments/lexers/floscript.py +1 -1
  49. data/vendor/pygments-main/pygments/lexers/futhark.py +5 -4
  50. data/vendor/pygments-main/pygments/lexers/gcodelexer.py +36 -0
  51. data/vendor/pygments-main/pygments/lexers/go.py +1 -1
  52. data/vendor/pygments-main/pygments/lexers/graphics.py +1 -1
  53. data/vendor/pygments-main/pygments/lexers/graphviz.py +5 -4
  54. data/vendor/pygments-main/pygments/lexers/gsql.py +92 -0
  55. data/vendor/pygments-main/pygments/lexers/haskell.py +4 -4
  56. data/vendor/pygments-main/pygments/lexers/haxe.py +1 -1
  57. data/vendor/pygments-main/pygments/lexers/installers.py +2 -2
  58. data/vendor/pygments-main/pygments/lexers/javascript.py +145 -127
  59. data/vendor/pygments-main/pygments/lexers/jslt.py +94 -0
  60. data/vendor/pygments-main/pygments/lexers/julia.py +135 -183
  61. data/vendor/pygments-main/pygments/lexers/jvm.py +262 -202
  62. data/vendor/pygments-main/pygments/lexers/kuin.py +299 -0
  63. data/vendor/pygments-main/pygments/lexers/lisp.py +18 -15
  64. data/vendor/pygments-main/pygments/lexers/markup.py +3 -3
  65. data/vendor/pygments-main/pygments/lexers/matlab.py +23 -10
  66. data/vendor/pygments-main/pygments/lexers/meson.py +155 -0
  67. data/vendor/pygments-main/pygments/lexers/mime.py +6 -21
  68. data/vendor/pygments-main/pygments/lexers/ml.py +1 -1
  69. data/vendor/pygments-main/pygments/lexers/nimrod.py +1 -1
  70. data/vendor/pygments-main/pygments/lexers/objective.py +3 -3
  71. data/vendor/pygments-main/pygments/lexers/parsers.py +1 -1
  72. data/vendor/pygments-main/pygments/lexers/procfile.py +43 -0
  73. data/vendor/pygments-main/pygments/lexers/promql.py +1 -1
  74. data/vendor/pygments-main/pygments/lexers/python.py +19 -5
  75. data/vendor/pygments-main/pygments/lexers/resource.py +1 -1
  76. data/vendor/pygments-main/pygments/lexers/rnc.py +1 -1
  77. data/vendor/pygments-main/pygments/lexers/ruby.py +1 -1
  78. data/vendor/pygments-main/pygments/lexers/rust.py +9 -10
  79. data/vendor/pygments-main/pygments/lexers/scripting.py +7 -7
  80. data/vendor/pygments-main/pygments/lexers/shell.py +11 -8
  81. data/vendor/pygments-main/pygments/lexers/smithy.py +79 -0
  82. data/vendor/pygments-main/pygments/lexers/smv.py +1 -1
  83. data/vendor/pygments-main/pygments/lexers/special.py +15 -2
  84. data/vendor/pygments-main/pygments/lexers/supercollider.py +1 -1
  85. data/vendor/pygments-main/pygments/lexers/tcl.py +3 -3
  86. data/vendor/pygments-main/pygments/lexers/teal.py +88 -0
  87. data/vendor/pygments-main/pygments/lexers/templates.py +19 -19
  88. data/vendor/pygments-main/pygments/lexers/teraterm.py +1 -1
  89. data/vendor/pygments-main/pygments/lexers/testing.py +1 -1
  90. data/vendor/pygments-main/pygments/lexers/theorem.py +4 -2
  91. data/vendor/pygments-main/pygments/lexers/thingsdb.py +118 -0
  92. data/vendor/pygments-main/pygments/lexers/tnt.py +25 -15
  93. data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -1
  94. data/vendor/pygments-main/pygments/lexers/webassembly.py +120 -0
  95. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  96. data/vendor/pygments-main/pygments/style.py +1 -1
  97. data/vendor/pygments-main/pygments/styles/__init__.py +2 -0
  98. data/vendor/pygments-main/pygments/styles/friendly.py +1 -0
  99. data/vendor/pygments-main/pygments/styles/gruvbox.py +107 -0
  100. data/vendor/pygments-main/pygments/styles/native.py +1 -0
  101. metadata +29 -14
  102. 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)