rouge 4.7.0 → 5.0.0

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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -4
  3. data/bin/rougify +3 -4
  4. data/lib/rouge/cli.rb +7 -10
  5. data/lib/rouge/demos/abap +30 -4
  6. data/lib/rouge/demos/dylan +8 -0
  7. data/lib/rouge/demos/kick_assembler +14 -0
  8. data/lib/rouge/demos/pdf +29 -0
  9. data/lib/rouge/demos/thrift +15 -0
  10. data/lib/rouge/demos/veryl +24 -0
  11. data/lib/rouge/eager.rb +3 -0
  12. data/lib/rouge/formatters/html.rb +8 -1
  13. data/lib/rouge/formatters/html_debug.rb +16 -0
  14. data/lib/rouge/formatters/html_legacy.rb +15 -1
  15. data/lib/rouge/formatters/html_legacy_table.rb +57 -0
  16. data/lib/rouge/formatters/html_line_highlighter.rb +11 -4
  17. data/lib/rouge/formatters/html_line_table.rb +8 -3
  18. data/lib/rouge/formatters/html_linewise.rb +11 -2
  19. data/lib/rouge/formatters/html_pygments.rb +6 -1
  20. data/lib/rouge/formatters/html_table.rb +47 -21
  21. data/lib/rouge/formatters/terminal256.rb +3 -3
  22. data/lib/rouge/formatters/tex.rb +1 -1
  23. data/lib/rouge/guesser.rb +1 -1
  24. data/lib/rouge/guessers/disambiguation.rb +2 -2
  25. data/lib/rouge/guessers/glob_mapping.rb +2 -2
  26. data/lib/rouge/guessers/modeline.rb +2 -2
  27. data/lib/rouge/lexer.rb +40 -21
  28. data/lib/rouge/lexers/abap/builtins.rb +187 -0
  29. data/lib/rouge/lexers/abap.rb +70 -178
  30. data/lib/rouge/lexers/ada.rb +1 -1
  31. data/lib/rouge/lexers/apache/keywords.rb +3 -11
  32. data/lib/rouge/lexers/apache.rb +25 -24
  33. data/lib/rouge/lexers/apex.rb +2 -2
  34. data/lib/rouge/lexers/apiblueprint.rb +2 -2
  35. data/lib/rouge/lexers/bicep.rb +2 -2
  36. data/lib/rouge/lexers/biml.rb +36 -9
  37. data/lib/rouge/lexers/brightscript.rb +3 -4
  38. data/lib/rouge/lexers/c.rb +9 -5
  39. data/lib/rouge/lexers/console.rb +11 -5
  40. data/lib/rouge/lexers/cpp.rb +10 -12
  41. data/lib/rouge/lexers/crystal.rb +1 -1
  42. data/lib/rouge/lexers/css.rb +21 -2
  43. data/lib/rouge/lexers/cuda.rb +4 -4
  44. data/lib/rouge/lexers/cython.rb +26 -50
  45. data/lib/rouge/lexers/dafny.rb +1 -1
  46. data/lib/rouge/lexers/dart.rb +2 -0
  47. data/lib/rouge/lexers/datastudio.rb +1 -1
  48. data/lib/rouge/lexers/digdag.rb +2 -3
  49. data/lib/rouge/lexers/dylan.rb +109 -0
  50. data/lib/rouge/lexers/ecl.rb +3 -3
  51. data/lib/rouge/lexers/elixir.rb +14 -9
  52. data/lib/rouge/lexers/escape.rb +1 -1
  53. data/lib/rouge/lexers/factor.rb +1 -1
  54. data/lib/rouge/lexers/freefem.rb +2 -2
  55. data/lib/rouge/lexers/ghc_cmm.rb +1 -1
  56. data/lib/rouge/lexers/ghc_core.rb +1 -1
  57. data/lib/rouge/lexers/gherkin/keywords.rb +10 -6
  58. data/lib/rouge/lexers/gherkin.rb +28 -26
  59. data/lib/rouge/lexers/gjs.rb +2 -2
  60. data/lib/rouge/lexers/glsl/builtins.rb +17 -0
  61. data/lib/rouge/lexers/glsl.rb +50 -113
  62. data/lib/rouge/lexers/go.rb +1 -1
  63. data/lib/rouge/lexers/gradle.rb +2 -2
  64. data/lib/rouge/lexers/groovy.rb +6 -0
  65. data/lib/rouge/lexers/gts.rb +2 -2
  66. data/lib/rouge/lexers/hack.rb +4 -6
  67. data/lib/rouge/lexers/haxe.rb +2 -2
  68. data/lib/rouge/lexers/hlsl.rb +6 -6
  69. data/lib/rouge/lexers/hocon.rb +2 -2
  70. data/lib/rouge/lexers/hql.rb +15 -19
  71. data/lib/rouge/lexers/idris.rb +1 -1
  72. data/lib/rouge/lexers/igorpro/builtins.rb +1530 -0
  73. data/lib/rouge/lexers/igorpro.rb +49 -520
  74. data/lib/rouge/lexers/irb.rb +3 -3
  75. data/lib/rouge/lexers/isbl.rb +7 -43
  76. data/lib/rouge/lexers/j.rb +1 -1
  77. data/lib/rouge/lexers/json5.rb +2 -2
  78. data/lib/rouge/lexers/json_doc.rb +2 -2
  79. data/lib/rouge/lexers/jsp.rb +119 -119
  80. data/lib/rouge/lexers/jsx.rb +2 -2
  81. data/lib/rouge/lexers/kick_assembler.rb +100 -0
  82. data/lib/rouge/lexers/kotlin.rb +5 -0
  83. data/lib/rouge/lexers/lasso/keywords.rb +6 -6
  84. data/lib/rouge/lexers/lasso.rb +9 -11
  85. data/lib/rouge/lexers/liquid.rb +5 -6
  86. data/lib/rouge/lexers/llvm/keywords.rb +3 -12
  87. data/lib/rouge/lexers/llvm.rb +5 -16
  88. data/lib/rouge/lexers/lua/keywords.rb +11 -13
  89. data/lib/rouge/lexers/lua.rb +8 -7
  90. data/lib/rouge/lexers/lutin.rb +5 -4
  91. data/lib/rouge/lexers/m68k.rb +3 -3
  92. data/lib/rouge/lexers/mason.rb +110 -110
  93. data/lib/rouge/lexers/mathematica/keywords.rb +1 -3
  94. data/lib/rouge/lexers/mathematica.rb +6 -7
  95. data/lib/rouge/lexers/matlab/keywords.rb +2 -2
  96. data/lib/rouge/lexers/matlab.rb +5 -5
  97. data/lib/rouge/lexers/meson.rb +1 -1
  98. data/lib/rouge/lexers/mojo.rb +6 -2
  99. data/lib/rouge/lexers/moonscript.rb +19 -17
  100. data/lib/rouge/lexers/nesasm.rb +6 -6
  101. data/lib/rouge/lexers/nial.rb +7 -8
  102. data/lib/rouge/lexers/nim.rb +3 -3
  103. data/lib/rouge/lexers/nix.rb +10 -8
  104. data/lib/rouge/lexers/objective_c.rb +3 -3
  105. data/lib/rouge/lexers/objective_cpp.rb +3 -2
  106. data/lib/rouge/lexers/ocaml.rb +2 -2
  107. data/lib/rouge/lexers/openedge.rb +9 -9
  108. data/lib/rouge/lexers/pdf.rb +109 -0
  109. data/lib/rouge/lexers/php/keywords.rb +136 -138
  110. data/lib/rouge/lexers/php.rb +58 -9
  111. data/lib/rouge/lexers/plsql.rb +8 -9
  112. data/lib/rouge/lexers/postscript.rb +1 -1
  113. data/lib/rouge/lexers/powershell.rb +1 -1
  114. data/lib/rouge/lexers/python.rb +110 -65
  115. data/lib/rouge/lexers/qml.rb +2 -2
  116. data/lib/rouge/lexers/reasonml.rb +2 -2
  117. data/lib/rouge/lexers/rego.rb +53 -53
  118. data/lib/rouge/lexers/rescript.rb +2 -2
  119. data/lib/rouge/lexers/robot_framework.rb +12 -12
  120. data/lib/rouge/lexers/{coq.rb → rocq.rb} +15 -6
  121. data/lib/rouge/lexers/ruby.rb +33 -7
  122. data/lib/rouge/lexers/rust.rb +1 -0
  123. data/lib/rouge/lexers/sas.rb +164 -165
  124. data/lib/rouge/lexers/sass/common.rb +1 -1
  125. data/lib/rouge/lexers/sass.rb +2 -2
  126. data/lib/rouge/lexers/scss.rb +2 -2
  127. data/lib/rouge/lexers/sed.rb +1 -1
  128. data/lib/rouge/lexers/shell.rb +5 -5
  129. data/lib/rouge/lexers/slice.rb +2 -2
  130. data/lib/rouge/lexers/sparql.rb +1 -1
  131. data/lib/rouge/lexers/sqf/keywords.rb +5 -3
  132. data/lib/rouge/lexers/sqf.rb +3 -4
  133. data/lib/rouge/lexers/stan.rb +9 -15
  134. data/lib/rouge/lexers/svelte.rb +2 -2
  135. data/lib/rouge/lexers/swift.rb +2 -2
  136. data/lib/rouge/lexers/tcl.rb +1 -1
  137. data/lib/rouge/lexers/terraform.rb +2 -2
  138. data/lib/rouge/lexers/thrift.rb +120 -0
  139. data/lib/rouge/lexers/tsx.rb +3 -3
  140. data/lib/rouge/lexers/ttcn3.rb +1 -1
  141. data/lib/rouge/lexers/twig.rb +2 -2
  142. data/lib/rouge/lexers/typescript.rb +3 -3
  143. data/lib/rouge/lexers/varnish.rb +8 -8
  144. data/lib/rouge/lexers/veryl.rb +109 -0
  145. data/lib/rouge/lexers/viml/keywords.rb +5 -7
  146. data/lib/rouge/lexers/viml.rb +8 -10
  147. data/lib/rouge/lexers/vue.rb +2 -2
  148. data/lib/rouge/lexers/xquery.rb +2 -1
  149. data/lib/rouge/lexers/yaml.rb +13 -1
  150. data/lib/rouge/lexers/yang.rb +42 -74
  151. data/lib/rouge/lexers/zig.rb +10 -10
  152. data/lib/rouge/plugins/redcarpet.rb +3 -2
  153. data/lib/rouge/regex_lexer.rb +25 -14
  154. data/lib/rouge/themes/gruvbox.rb +3 -0
  155. data/lib/rouge/token.rb +1 -1
  156. data/lib/rouge/util.rb +1 -1
  157. data/lib/rouge/version.rb +1 -1
  158. data/lib/rouge.rb +70 -59
  159. data/lib/rubocop/cop/rouge/no_building_alternation_pattern_in_regexp.rb +71 -0
  160. data/lib/rubocop/cop/rouge/no_huge_collections.rb +37 -0
  161. data/rouge.gemspec +8 -5
  162. metadata +40 -9
  163. data/lib/rouge/lexers/isbl/builtins.rb +0 -17
  164. data/lib/rouge/lexers/matlab/builtins.rb +0 -11
  165. /data/lib/rouge/demos/{coq → rocq} +0 -0
@@ -18,6 +18,10 @@ module Rouge
18
18
  option :funcnamehighlighting, 'Whether to highlight builtin functions (default: true)'
19
19
  option :disabledmodules, 'Disable certain modules from being highlighted as builtins (default: empty)'
20
20
 
21
+ lazy auto: false do
22
+ require_relative "php/keywords"
23
+ end
24
+
21
25
  def initialize(*)
22
26
  super
23
27
 
@@ -26,6 +30,8 @@ module Rouge
26
30
  @start_inline = bool_option(:start_inline) { :guess }
27
31
  @funcnamehighlighting = bool_option(:funcnamehighlighting) { true }
28
32
  @disabledmodules = list_option(:disabledmodules)
33
+
34
+ eager_load! if @funcnamehighlighting
29
35
  end
30
36
 
31
37
  def self.detect?(text)
@@ -48,16 +54,11 @@ module Rouge
48
54
  )
49
55
  end
50
56
 
51
- def self.builtins
52
- Kernel::load File.join(Lexers::BASE_DIR, 'php/keywords.rb')
53
- builtins
54
- end
55
-
56
57
  def builtins
57
58
  return [] unless @funcnamehighlighting
58
59
 
59
60
  @builtins ||= Set.new.tap do |builtins|
60
- self.class.builtins.each do |mod, fns|
61
+ BUILTINS.each do |mod, fns|
61
62
  next if @disabledmodules.include? mod
62
63
  builtins.merge(fns)
63
64
  end
@@ -109,7 +110,7 @@ module Rouge
109
110
  name = m[0].downcase
110
111
  if self.class.keywords.include? name
111
112
  token Keyword
112
- elsif self.builtins.include? name
113
+ elsif builtins.include? name
113
114
  token Name::Builtin
114
115
  else
115
116
  token Name::Function
@@ -324,7 +325,7 @@ module Rouge
324
325
  rule %r/=/, Operator, :in_assign
325
326
  rule %r/\b(?:public|protected|private|readonly)(?:\(set\)|\b)/i, Keyword
326
327
  rule %r/\breadonly\b/i, Keyword
327
- rule %r/\??#{id}/, Keyword::Type, :in_assign
328
+ rule %r/\??#{id}/, Keyword::Type, :in_property
328
329
  mixin :escape
329
330
  mixin :whitespace
330
331
  mixin :variables
@@ -388,7 +389,10 @@ module Rouge
388
389
  rule %r/\b(?:public|protected|private)(?:\(set\)|\b)/i, Keyword
389
390
  rule %r/\b(?:readonly|static)\b/i, Keyword
390
391
  rule %r/(?=(abstract|const|function)\b)/i, Keyword, :pop!
391
- rule %r/\??#{id}/, Keyword::Type, :pop!
392
+ rule %r/\??#{id}/ do
393
+ token Keyword::Type
394
+ goto :in_property
395
+ end
392
396
  mixin :escape
393
397
  mixin :whitespace
394
398
  mixin :return
@@ -416,6 +420,51 @@ module Rouge
416
420
  end
417
421
  mixin :php
418
422
  end
423
+
424
+ state :in_property do
425
+ rule %r/\$+#{id}/, Name::Variable
426
+ rule %r/\{/ do
427
+ token Punctuation
428
+ goto :in_property_hooks
429
+ end
430
+ rule %r/[;,]/, Punctuation, :pop!
431
+ rule %r/(?==)/ do
432
+ pop!
433
+ end
434
+ rule %r/[|&]/, Operator
435
+ rule %r/\??#{id}/, Keyword::Type
436
+ mixin :escape
437
+ mixin :whitespace
438
+ mixin :return
439
+ end
440
+
441
+ state :in_property_hooks do
442
+ rule %r/\}/, Punctuation, :pop!
443
+ rule %r/\bfinal\b/i, Keyword
444
+ rule %r/&(?=get\b)/, Operator
445
+ rule %r/(\bset\b)(\s*)(\()/ do
446
+ groups Keyword, Text, Punctuation
447
+ push :in_property_hook_params
448
+ end
449
+ rule %r/\b(?:get|set)\b/, Keyword
450
+ rule %r/\{/, Punctuation, :in_function_body
451
+ rule %r/[;,\(\)\[\]]/, Punctuation
452
+ mixin :escape
453
+ mixin :whitespace
454
+ mixin :variables
455
+ mixin :values
456
+ mixin :names
457
+ mixin :operators
458
+ rule %r/[=?]/, Operator
459
+ end
460
+
461
+ state :in_property_hook_params do
462
+ rule %r/\)/, Punctuation, :pop!
463
+ rule %r/\??#{id}/, Keyword::Type
464
+ mixin :escape
465
+ mixin :whitespace
466
+ mixin :variables
467
+ end
419
468
  end
420
469
  end
421
470
  end
@@ -22,7 +22,7 @@ module Rouge
22
22
  OCIDURATION OCIINTERVAL OCILOBLOCATOR OCINUMBER OCIRAW OCIREF OCIREFCURSOR
23
23
  OCIROWID OCISTRING OCITYPE OF ON OPTION OR ORACLE ORADATA ORDER ORLANY ORLVARY
24
24
  OUT OVERRIDING PARALLEL_ENABLE PARAMETER PASCAL PCTFREE PIPE PIPELINED POLYMORPHIC
25
- PRAGMA PRIOR PUBLIC RAISE RECORD RELIES_ON REM RENAME RESOURCE RESULT REVOKE ROWID
25
+ PRAGMA PRIOR PUBLIC RAISE RECORD RELIES_ON REM RENAME RESOURCE RESULT REVOKE ROWID
26
26
  SB1 SB2 SELECT SEPARATE SET SHARE SHORT SIZE SIZE_T SPARSE SQLCODE SQLDATA
27
27
  SQLNAME SQLSTATE STANDARD START STORED STRUCT STYLE SYNONYM TABLE TDO THEN
28
28
  TRANSACTIONAL TRIGGER UB1 UB4 UNION UNIQUE UNSIGNED UNTRUSTED UPDATE VALIST
@@ -414,7 +414,7 @@ module Rouge
414
414
  PREDICTION PREDICTION_BOUNDS PREDICTION_COST PREDICTION_DETAILS PREDICTION_PROBABILITY
415
415
  PREDICTION_SET PRESENTNNV PRESENTV PREVIOUS RANK RATIO_TO_REPORT RAWTOHEX
416
416
  RAWTONHEX REFTOHEX REGEXP_COUNT REGEXP_INSTR REGEXP_REPLACE REGEXP_SUBSTR
417
- REMAINDER REPLACE ROUND ROUND ROWIDTOCHAR ROWIDTONCHAR ROW_NUMBER RPAD RTRIM
417
+ REMAINDER REPLACE ROUND ROWIDTOCHAR ROWIDTONCHAR ROW_NUMBER RPAD RTRIM
418
418
  SCN_TO_TIMESTAMP SESSIONTIMEZONE SET SIGN SIN SINH SOUNDEX SQRT STANDARD_HASH
419
419
  STATS_BINOMIAL_TEST STATS_CROSSTAB STATS_F_TEST STATS_KS_TEST STATS_MODE STATS_MW_TEST
420
420
  STATS_ONE_WAY_ANOVA STATS_WSR_TEST STDDEV STDDEV_POP STDDEV_SAMP SUBSTR SUM
@@ -439,9 +439,8 @@ module Rouge
439
439
  DATE TIMESTAMP INTERVAL LOCAL TIME ZONE TO MONTH SECOND YEAR DAY
440
440
  BLOB CLOB NCLOB BFILE
441
441
  UROWID
442
- CHARACTER VARYING VARCHAR NATIONAL CHARACTER
443
- NUMERIC DECIMAL DEC INTEGER INT SMALLINT
444
- FLOAT DOUBLE PRECISION REAL
442
+ CHARACTER VARYING VARCHAR NATIONAL
443
+ NUMERIC DECIMAL DEC INTEGER INT SMALLINT DOUBLE PRECISION REAL
445
444
  SDO_GEOMETRY SDO_TOPO_GEOMETRY SDO_GEORASTER
446
445
  REF ANYTYPE ANYDATA ANYDATASET XMLTYPE HTTPURITYPE XDBURITYPE DUBRITYPE
447
446
  BOOLEAN PLS_INTEGER BINARY_INTEGER SIMPLE_FLOAT SIMPLE_INTEGER SIMPLE_DOUBLE SYS_REFCURSOR
@@ -479,7 +478,7 @@ module Rouge
479
478
  # Numbers
480
479
  rule %r/[+-]?(?:(?:\.\d+(?:[eE][+-]?\d+)?)|\d+\.(?:\d+(?:[eE][+-]?\d+)?)?)[fFdD]?/, Num::Float
481
480
  rule %r/[+-]?\d+/, Num::Integer
482
-
481
+
483
482
  # Operators
484
483
  # Special semi-operator, but this seems an appropriate classification
485
484
  rule %r/%(?:TYPE|ROWTYPE|FOUND|ISOPEN|NOTFOUND|ROWCOUNT)\b/i, Name::Attribute
@@ -517,7 +516,7 @@ module Rouge
517
516
  #
518
517
  rule %r/([a-zA-Z][\w$]*)(\.(?=\w))?/ do |m|
519
518
  if self.class.keywords_type.include? m[1].upcase
520
- tok = Keyword::Type
519
+ tok = Keyword::Type
521
520
  elsif self.class.keywords_func.include? m[1].upcase
522
521
  tok = Name::Function
523
522
  elsif self.class.keywords_reserved.include? m[1].upcase
@@ -562,12 +561,12 @@ module Rouge
562
561
  # this rule WILL be true if something pushed into our state. That is our state contract
563
562
  rule %r/[a-zA-Z][\w\$]*/ do |m|
564
563
  if self.class.keywords_func.include? m[0].upcase
565
- # The Function lookup allows collection methods like COUNT, FIRST, LAST, etc.. to be
564
+ # The Function lookup allows collection methods like COUNT, FIRST, LAST, etc.. to be
566
565
  # classified correctly. Occasionally misidentifies ordinary names as builtin functions,
567
566
  # but seems to be as correct as we can get without becoming a full blown parser
568
567
  token Name::Function
569
568
  else
570
- token Name
569
+ token Name
571
570
  end
572
571
  pop!
573
572
  end
@@ -16,7 +16,7 @@ module Rouge
16
16
  return true if /^%!/ =~ text
17
17
  end
18
18
 
19
- delimiter = %s"()<>\[\]{}/%\s"
19
+ delimiter = :"()<>\\[\\]{}/%\\s"
20
20
  delimiter_end = Regexp.new("(?=[#{delimiter}])")
21
21
  valid_name_chars = Regexp.new("[^#{delimiter}]")
22
22
  valid_name = /#{valid_name_chars}+#{delimiter_end}/
@@ -8,7 +8,7 @@ module Rouge
8
8
  title 'powershell'
9
9
  desc 'powershell'
10
10
  tag 'powershell'
11
- aliases 'posh', 'microsoftshell', 'msshell'
11
+ aliases 'posh', 'microsoftshell', 'msshell', 'pwsh'
12
12
  filenames '*.ps1', '*.psm1', '*.psd1', '*.psrc', '*.pssc'
13
13
  mimetypes 'text/x-powershell'
14
14
 
@@ -17,7 +17,7 @@ module Rouge
17
17
  end
18
18
 
19
19
  def self.keywords
20
- @keywords ||= %w(
20
+ @keywords ||= Set.new %w(
21
21
  assert break continue del elif else except exec
22
22
  finally for global if lambda pass print raise
23
23
  return try while yield as with from import
@@ -26,7 +26,7 @@ module Rouge
26
26
  end
27
27
 
28
28
  def self.builtins
29
- @builtins ||= %w(
29
+ @builtins ||= Set.new %w(
30
30
  __import__ abs aiter all anext any apply ascii
31
31
  basestring bin bool buffer breakpoint bytearray bytes
32
32
  callable chr classmethod cmp coerce compile complex
@@ -42,11 +42,11 @@ module Rouge
42
42
  end
43
43
 
44
44
  def self.builtins_pseudo
45
- @builtins_pseudo ||= %w(None Ellipsis NotImplemented False True)
45
+ @builtins_pseudo ||= Set.new %w(None Ellipsis NotImplemented False True)
46
46
  end
47
47
 
48
48
  def self.exceptions
49
- @exceptions ||= %w(
49
+ @exceptions ||= Set.new %w(
50
50
  ArithmeticError AssertionError AttributeError BaseException
51
51
  BaseExceptionGroup BlockingIOError BrokenPipeError BufferError
52
52
  BytesWarning ChildProcessError ConnectionAbortedError ConnectionError
@@ -72,57 +72,49 @@ module Rouge
72
72
 
73
73
  identifier = /[[:alpha:]_][[:alnum:]_]*/
74
74
  dotted_identifier = /[[:alpha:]_.][[:alnum:]_.]*/
75
+ inline_ws = /(?:[ \t]|\\\n)*?/
76
+ inline_content = /(?:[^\\\n]|\\[\n.])*?/
75
77
 
76
78
  def current_string
77
- @string_register ||= StringRegister.new
79
+ @current_string ||= StringRegister.new
80
+ end
81
+
82
+ operator_words = %r/(in|is|and|or|not)\b/
83
+ operators = %r{(<<|>>|//|[*][*])=?|!=|[-~+\/*%=<>&^|@]=?|!=}
84
+
85
+ start do
86
+ push :newline
87
+ end
88
+
89
+ state :inline_whitespace do
90
+ rule %r/[ \t]+/, Text
91
+ rule %r/\\\n/, Str::Escape
78
92
  end
79
93
 
80
94
  state :root do
81
- rule %r/\n+/m, Text
95
+ rule %r/\n+/m, Text, :newline
82
96
  rule %r/^(:)(\s*)([ru]{,2}""".*?""")/mi do
83
97
  groups Punctuation, Text, Str::Doc
84
98
  end
85
99
 
86
100
  rule %r/\.\.\.\B$/, Name::Builtin::Pseudo
87
101
 
88
- rule %r/[^\S\n]+/, Text
89
- rule %r(#(.*)?\n?), Comment::Single
90
- rule %r/[\[\]{}:(),;.]/, Punctuation
91
- rule %r/\\\n/, Text
92
- rule %r/\\/, Text
93
-
94
- rule %r/@#{dotted_identifier}/i, Name::Decorator
102
+ mixin :inline_whitespace
95
103
 
96
- rule %r/(in|is|and|or|not)\b/, Operator::Word
97
- rule %r/(<<|>>|\/\/|\*\*)=?/, Operator
98
- rule %r/[-~+\/*%=<>&^|@]=?|!=/, Operator
104
+ rule %r(#(.*)?\n?), Comment::Single, :newline
105
+ rule %r/[\[\]{}:(),;]/, Punctuation
106
+ rule %r/[.]/, Punctuation, :post_dot
107
+ rule %r/\\/, Str::Escape
99
108
 
100
- rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(import)/ do
101
- groups Keyword::Namespace,
102
- Text,
103
- Name,
104
- Text,
105
- Keyword::Namespace
106
- end
107
-
108
- rule %r/(import)(\s+)(#{dotted_identifier})/ do
109
- groups Keyword::Namespace, Text, Name
110
- end
109
+ rule %r/@#{dotted_identifier}/i, Name::Decorator
111
110
 
112
- rule %r/(def)((?:\s|\\\s)+)/ do
113
- groups Keyword, Text
114
- push :funcname
115
- end
111
+ rule operator_words, Operator::Word
112
+ rule operators, Operator
116
113
 
117
- rule %r/(class)((?:\s|\\\s)+)/ do
118
- groups Keyword, Text
119
- push :classname
120
- end
114
+ rule %r/def\b/, Keyword, :funcname
121
115
 
122
- rule %r/([a-z_]\w*)[ \t]*(?=(\(.*\)))/m, Name::Function
123
- rule %r/([A-Z_]\w*)[ \t]*(?=(\(.*\)))/m, Name::Class
116
+ rule %r/class\b/, Keyword, :classname
124
117
 
125
- # TODO: not in python 3
126
118
  rule %r/`.*?`/, Str::Backtick
127
119
  rule %r/([rtfbu]{0,2})('''|"""|['"])/i do |m|
128
120
  groups Str::Affix, Str::Heredoc
@@ -130,17 +122,15 @@ module Rouge
130
122
  push :generic_string
131
123
  end
132
124
 
133
- mixin :soft_keywords
134
-
135
125
  # using negative lookbehind so we don't match property names
136
126
  rule %r/(?<!\.)#{identifier}/ do |m|
137
- if self.class.keywords.include? m[0]
127
+ if self.class.keywords.include?(m[0])
138
128
  token Keyword
139
- elsif self.class.exceptions.include? m[0]
140
- token Name::Builtin
141
- elsif self.class.builtins.include? m[0]
129
+ elsif self.class.exceptions.include?(m[0])
130
+ token Name::Exception
131
+ elsif self.class.builtins.include?(m[0])
142
132
  token Name::Builtin
143
- elsif self.class.builtins_pseudo.include? m[0]
133
+ elsif self.class.builtins_pseudo.include?(m[0])
144
134
  token Name::Builtin::Pseudo
145
135
  else
146
136
  token Name
@@ -163,34 +153,80 @@ module Rouge
163
153
  rule %r/([1-9](_?[0-9])*|0(_?0)*)/, Num::Integer
164
154
  end
165
155
 
156
+ state :import do
157
+ mixin :inline_whitespace
158
+ rule dotted_identifier, Name::Namespace, :pop!
159
+ rule(//) { pop! }
160
+ end
161
+
162
+ state :from do
163
+ mixin :inline_whitespace
164
+
165
+ rule dotted_identifier do
166
+ token Name::Namespace
167
+ goto :from_import
168
+ end
169
+
170
+ rule(//) { pop! }
171
+ end
172
+
173
+ # import after from, meaning we don't push the :import state
174
+ state :from_import do
175
+ mixin :inline_whitespace
176
+ rule %r/import\b/, Keyword::Namespace, :pop!
177
+ rule(//) { pop! }
178
+ end
179
+
180
+ state :post_dot do
181
+ mixin :inline_whitespace
182
+ rule %r/([A-Z]\w*)(?=#{inline_ws}[(])/m, Name::Class
183
+ rule %r/(#{identifier})(?=#{inline_ws}[(])/m, Name::Function
184
+ rule(//) { pop! }
185
+ end
186
+
187
+ state :newline do
188
+ mixin :inline_whitespace
189
+
190
+ rule %r/from\b/, Keyword::Namespace, :from
191
+ rule %r/import\b/, Keyword::Namespace, :import
192
+
193
+ # [jneen] This lookahead is a best-effort hack, since soft keywords are
194
+ # technically not possible to detect in the lexing stage. If we see an
195
+ # operator like `and`, `or`, inline `if`, etc which would expect an
196
+ # expression beforehand, we know that it is almost certainly not a keyword.
197
+ inline_ops = /#{operator_words}|if\b|#{operators}/
198
+ rule %r/(?:case|match)(?=#{inline_ws}#{inline_ops})/, Name::Other, :pop!
199
+
200
+ rule %r/(?:case|match)(?=#{inline_content}:#{inline_ws}[#\n])/ do |m|
201
+ token Keyword
202
+ if m[0] == 'case'
203
+ goto :case_pattern
204
+ else
205
+ pop!
206
+ end
207
+ end
208
+
209
+ rule(//) { pop! }
210
+ end
211
+
166
212
  state :funcname do
213
+ mixin :inline_whitespace
167
214
  rule identifier, Name::Function, :pop!
168
215
  end
169
216
 
170
217
  state :classname do
218
+ mixin :inline_whitespace
171
219
  rule identifier, Name::Class, :pop!
172
220
  end
173
221
 
174
- state :soft_keywords do
175
- rule %r/
176
- (^[ \t]*)
177
- (match|case)\b
178
- (?![ \t]*
179
- (?:[:,;=^&|@~)\]}] |
180
- (?:#{Python.keywords.join('|')})\b))
181
- /x do |m|
182
- token Text::Whitespace, m[1]
183
- token Keyword, m[2]
184
- push :soft_keywords_inner
185
- end
186
- end
187
-
188
- state :soft_keywords_inner do
189
- rule %r((\s+)([^\n_]*)(_\b)) do |m|
190
- groups Text::Whitespace, Text, Keyword
222
+ state :case_pattern do
223
+ rule %r/\n/ do
224
+ token Text
225
+ goto :newline
191
226
  end
192
227
 
193
- rule(//) { pop! }
228
+ rule %r/_\b/, Keyword
229
+ mixin :root
194
230
  end
195
231
 
196
232
  state :raise do
@@ -207,8 +243,8 @@ module Rouge
207
243
  end
208
244
 
209
245
  state :generic_string do
210
- rule %r/^\s*(>>>|\.\.\.)\B/, Generic::Prompt, :doctest
211
- rule %r/[^'"\\{]+?/, Str
246
+ rule %r/\n/, Str, :generic_string_newline
247
+ rule %r/[^'"\\{\n]+/, Str
212
248
  rule %r/{{/, Str
213
249
 
214
250
  rule %r/'''|"""|['"]/ do |m|
@@ -231,6 +267,15 @@ module Rouge
231
267
  end
232
268
  end
233
269
 
270
+ state :generic_string_newline do
271
+ rule %r/[ \t]+/, Str
272
+ rule %r/(>>>|\.\.\.)\B/ do
273
+ token Generic::Prompt
274
+ goto :doctest
275
+ end
276
+ rule(//) { pop! }
277
+ end
278
+
234
279
  state :generic_escape do
235
280
  rule %r(\\
236
281
  ( [\\abfnrtv"']
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'javascript'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'javascript.rb'
7
-
8
8
  class Qml < Javascript
9
9
  title "QML"
10
10
  desc 'QML, a UI markup language'
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'ocaml/common'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'ocaml/common.rb'
7
-
8
8
  class ReasonML < OCamlCommon
9
9
  title "ReasonML"
10
10
  desc 'New syntax on top of OCaml ecosystem (reasonml.github.io)'
@@ -2,59 +2,59 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Rouge
5
- module Lexers
6
- class Rego < RegexLexer
7
- title "Rego"
8
- desc "The Rego open-policy-agent (OPA) policy language (openpolicyagent.org)"
9
- tag 'rego'
10
- filenames '*.rego'
11
-
12
- def self.constants
13
- @constants ||= Set.new %w(
14
- true false null
15
- )
16
- end
17
-
18
- def self.operators
19
- @operators ||= Set.new %w(
20
- as default else import not package some with
21
- )
22
- end
23
-
24
- state :basic do
25
- rule %r/\s+/, Text
26
- rule %r/#.*/, Comment::Single
27
-
28
- rule %r/[\[\](){}|.,;!]/, Punctuation
29
-
30
- rule %r/"[^"]*"/, Str::Double
31
-
32
- rule %r/-?\d+\.\d+([eE][+-]?\d+)?/, Num::Float
33
- rule %r/-?\d+([eE][+-]?\d+)?/, Num
34
-
35
- rule %r/\\u[0-9a-fA-F]{4}/, Num::Hex
36
- rule %r/\\["\/bfnrt]/, Str::Escape
37
- end
38
-
39
- state :operators do
40
- rule %r/(=|!=|>=|<=|>|<|\+|-|\*|%|\/|\||&|:=)/, Operator
41
- rule %r/[\/:?@^~]+/, Operator
42
- end
43
-
44
- state :root do
45
- mixin :basic
46
- mixin :operators
47
-
48
- rule %r/[[:word:]]+/ do |m|
49
- if self.class.constants.include? m[0]
50
- token Keyword::Constant
51
- elsif self.class.operators.include? m[0]
52
- token Operator::Word
53
- else
54
- token Name
55
- end
56
- end
57
- end
5
+ module Lexers
6
+ class Rego < RegexLexer
7
+ title "Rego"
8
+ desc "The Rego open-policy-agent (OPA) policy language (openpolicyagent.org)"
9
+ tag 'rego'
10
+ filenames '*.rego'
11
+
12
+ def self.constants
13
+ @constants ||= Set.new %w(
14
+ true false null
15
+ )
16
+ end
17
+
18
+ def self.operators
19
+ @operators ||= Set.new %w(
20
+ as default else import not package some with
21
+ )
22
+ end
23
+
24
+ state :basic do
25
+ rule %r/\s+/, Text
26
+ rule %r/#.*/, Comment::Single
27
+
28
+ rule %r/[\[\](){}|.,;!]/, Punctuation
29
+
30
+ rule %r/"[^"]*"/, Str::Double
31
+
32
+ rule %r/-?\d+\.\d+([eE][+-]?\d+)?/, Num::Float
33
+ rule %r/-?\d+([eE][+-]?\d+)?/, Num
34
+
35
+ rule %r/\\u[0-9a-fA-F]{4}/, Num::Hex
36
+ rule %r/\\["\/bfnrt]/, Str::Escape
37
+ end
38
+
39
+ state :operators do
40
+ rule %r/(=|!=|>=|<=|>|<|\+|-|\*|%|\/|\||&|:=)/, Operator
41
+ rule %r/[\/:?@^~]+/, Operator
42
+ end
43
+
44
+ state :root do
45
+ mixin :basic
46
+ mixin :operators
47
+
48
+ rule %r/[[:word:]]+/ do |m|
49
+ if self.class.constants.include? m[0]
50
+ token Keyword::Constant
51
+ elsif self.class.operators.include? m[0]
52
+ token Operator::Word
53
+ else
54
+ token Name
55
+ end
58
56
  end
57
+ end
59
58
  end
59
+ end
60
60
  end
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'ocaml/common'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'ocaml/common.rb'
7
-
8
8
  class ReScript < OCamlCommon
9
9
  title "ReScript"
10
10
  desc "The ReScript programming language (rescript-lang.org)"