rouge 4.6.1 → 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 (168) 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/gjs +23 -0
  8. data/lib/rouge/demos/gts +36 -0
  9. data/lib/rouge/demos/kick_assembler +14 -0
  10. data/lib/rouge/demos/pdf +29 -0
  11. data/lib/rouge/demos/thrift +15 -0
  12. data/lib/rouge/demos/veryl +24 -0
  13. data/lib/rouge/eager.rb +3 -0
  14. data/lib/rouge/formatters/html.rb +8 -1
  15. data/lib/rouge/formatters/html_debug.rb +16 -0
  16. data/lib/rouge/formatters/html_legacy.rb +15 -1
  17. data/lib/rouge/formatters/html_legacy_table.rb +57 -0
  18. data/lib/rouge/formatters/html_line_highlighter.rb +11 -4
  19. data/lib/rouge/formatters/html_line_table.rb +8 -3
  20. data/lib/rouge/formatters/html_linewise.rb +11 -2
  21. data/lib/rouge/formatters/html_pygments.rb +6 -1
  22. data/lib/rouge/formatters/html_table.rb +47 -21
  23. data/lib/rouge/formatters/terminal256.rb +3 -3
  24. data/lib/rouge/formatters/tex.rb +1 -1
  25. data/lib/rouge/guesser.rb +1 -1
  26. data/lib/rouge/guessers/disambiguation.rb +2 -2
  27. data/lib/rouge/guessers/glob_mapping.rb +2 -2
  28. data/lib/rouge/guessers/modeline.rb +2 -2
  29. data/lib/rouge/lexer.rb +40 -21
  30. data/lib/rouge/lexers/abap/builtins.rb +187 -0
  31. data/lib/rouge/lexers/abap.rb +70 -178
  32. data/lib/rouge/lexers/ada.rb +1 -1
  33. data/lib/rouge/lexers/apache/keywords.rb +3 -11
  34. data/lib/rouge/lexers/apache.rb +25 -24
  35. data/lib/rouge/lexers/apex.rb +2 -2
  36. data/lib/rouge/lexers/apiblueprint.rb +2 -2
  37. data/lib/rouge/lexers/bicep.rb +2 -2
  38. data/lib/rouge/lexers/biml.rb +36 -9
  39. data/lib/rouge/lexers/brightscript.rb +3 -4
  40. data/lib/rouge/lexers/c.rb +9 -5
  41. data/lib/rouge/lexers/cobol.rb +1 -1
  42. data/lib/rouge/lexers/console.rb +11 -5
  43. data/lib/rouge/lexers/cpp.rb +10 -12
  44. data/lib/rouge/lexers/crystal.rb +1 -1
  45. data/lib/rouge/lexers/css.rb +21 -2
  46. data/lib/rouge/lexers/cuda.rb +4 -4
  47. data/lib/rouge/lexers/cython.rb +26 -50
  48. data/lib/rouge/lexers/dafny.rb +1 -1
  49. data/lib/rouge/lexers/dart.rb +2 -0
  50. data/lib/rouge/lexers/datastudio.rb +1 -1
  51. data/lib/rouge/lexers/digdag.rb +2 -3
  52. data/lib/rouge/lexers/dylan.rb +109 -0
  53. data/lib/rouge/lexers/ecl.rb +3 -3
  54. data/lib/rouge/lexers/elixir.rb +14 -9
  55. data/lib/rouge/lexers/escape.rb +1 -1
  56. data/lib/rouge/lexers/factor.rb +1 -1
  57. data/lib/rouge/lexers/freefem.rb +2 -2
  58. data/lib/rouge/lexers/ghc_cmm.rb +1 -1
  59. data/lib/rouge/lexers/ghc_core.rb +1 -1
  60. data/lib/rouge/lexers/gherkin/keywords.rb +10 -6
  61. data/lib/rouge/lexers/gherkin.rb +28 -26
  62. data/lib/rouge/lexers/gjs.rb +39 -0
  63. data/lib/rouge/lexers/glsl/builtins.rb +17 -0
  64. data/lib/rouge/lexers/glsl.rb +50 -113
  65. data/lib/rouge/lexers/go.rb +8 -6
  66. data/lib/rouge/lexers/gradle.rb +2 -2
  67. data/lib/rouge/lexers/groovy.rb +6 -0
  68. data/lib/rouge/lexers/gts.rb +39 -0
  69. data/lib/rouge/lexers/hack.rb +4 -6
  70. data/lib/rouge/lexers/haxe.rb +2 -2
  71. data/lib/rouge/lexers/hlsl.rb +6 -6
  72. data/lib/rouge/lexers/hocon.rb +2 -2
  73. data/lib/rouge/lexers/hql.rb +15 -19
  74. data/lib/rouge/lexers/idris.rb +1 -1
  75. data/lib/rouge/lexers/igorpro/builtins.rb +1530 -0
  76. data/lib/rouge/lexers/igorpro.rb +49 -520
  77. data/lib/rouge/lexers/irb.rb +3 -3
  78. data/lib/rouge/lexers/isbl.rb +7 -43
  79. data/lib/rouge/lexers/j.rb +1 -1
  80. data/lib/rouge/lexers/json5.rb +2 -2
  81. data/lib/rouge/lexers/json_doc.rb +2 -2
  82. data/lib/rouge/lexers/jsp.rb +119 -119
  83. data/lib/rouge/lexers/jsx.rb +2 -2
  84. data/lib/rouge/lexers/kick_assembler.rb +100 -0
  85. data/lib/rouge/lexers/kotlin.rb +5 -0
  86. data/lib/rouge/lexers/lasso/keywords.rb +6 -6
  87. data/lib/rouge/lexers/lasso.rb +9 -11
  88. data/lib/rouge/lexers/liquid.rb +5 -6
  89. data/lib/rouge/lexers/llvm/keywords.rb +3 -12
  90. data/lib/rouge/lexers/llvm.rb +5 -16
  91. data/lib/rouge/lexers/lua/keywords.rb +11 -13
  92. data/lib/rouge/lexers/lua.rb +8 -7
  93. data/lib/rouge/lexers/lutin.rb +5 -4
  94. data/lib/rouge/lexers/m68k.rb +3 -3
  95. data/lib/rouge/lexers/mason.rb +110 -110
  96. data/lib/rouge/lexers/mathematica/keywords.rb +1 -3
  97. data/lib/rouge/lexers/mathematica.rb +6 -7
  98. data/lib/rouge/lexers/matlab/keywords.rb +2 -2
  99. data/lib/rouge/lexers/matlab.rb +5 -5
  100. data/lib/rouge/lexers/meson.rb +1 -1
  101. data/lib/rouge/lexers/mojo.rb +6 -2
  102. data/lib/rouge/lexers/moonscript.rb +19 -17
  103. data/lib/rouge/lexers/nesasm.rb +6 -6
  104. data/lib/rouge/lexers/nial.rb +7 -8
  105. data/lib/rouge/lexers/nim.rb +3 -3
  106. data/lib/rouge/lexers/nix.rb +10 -8
  107. data/lib/rouge/lexers/objective_c.rb +3 -3
  108. data/lib/rouge/lexers/objective_cpp.rb +3 -2
  109. data/lib/rouge/lexers/ocaml.rb +2 -2
  110. data/lib/rouge/lexers/openedge.rb +9 -9
  111. data/lib/rouge/lexers/pdf.rb +109 -0
  112. data/lib/rouge/lexers/php/keywords.rb +136 -188
  113. data/lib/rouge/lexers/php.rb +100 -11
  114. data/lib/rouge/lexers/plsql.rb +8 -9
  115. data/lib/rouge/lexers/postscript.rb +1 -1
  116. data/lib/rouge/lexers/powershell.rb +1 -1
  117. data/lib/rouge/lexers/python.rb +111 -66
  118. data/lib/rouge/lexers/qml.rb +2 -2
  119. data/lib/rouge/lexers/reasonml.rb +2 -2
  120. data/lib/rouge/lexers/rego.rb +53 -53
  121. data/lib/rouge/lexers/rescript.rb +2 -2
  122. data/lib/rouge/lexers/robot_framework.rb +12 -12
  123. data/lib/rouge/lexers/{coq.rb → rocq.rb} +15 -6
  124. data/lib/rouge/lexers/ruby.rb +33 -7
  125. data/lib/rouge/lexers/rust.rb +1 -0
  126. data/lib/rouge/lexers/sas.rb +164 -165
  127. data/lib/rouge/lexers/sass/common.rb +1 -1
  128. data/lib/rouge/lexers/sass.rb +2 -2
  129. data/lib/rouge/lexers/scss.rb +2 -2
  130. data/lib/rouge/lexers/sed.rb +1 -1
  131. data/lib/rouge/lexers/shell.rb +5 -5
  132. data/lib/rouge/lexers/slice.rb +2 -2
  133. data/lib/rouge/lexers/sparql.rb +1 -1
  134. data/lib/rouge/lexers/sqf/keywords.rb +5 -3
  135. data/lib/rouge/lexers/sqf.rb +3 -4
  136. data/lib/rouge/lexers/stan.rb +9 -15
  137. data/lib/rouge/lexers/svelte.rb +2 -2
  138. data/lib/rouge/lexers/swift.rb +2 -2
  139. data/lib/rouge/lexers/tcl.rb +1 -1
  140. data/lib/rouge/lexers/terraform.rb +3 -3
  141. data/lib/rouge/lexers/thrift.rb +120 -0
  142. data/lib/rouge/lexers/tsx.rb +3 -3
  143. data/lib/rouge/lexers/ttcn3.rb +1 -1
  144. data/lib/rouge/lexers/twig.rb +2 -2
  145. data/lib/rouge/lexers/typescript.rb +3 -3
  146. data/lib/rouge/lexers/varnish.rb +8 -8
  147. data/lib/rouge/lexers/veryl.rb +109 -0
  148. data/lib/rouge/lexers/viml/keywords.rb +5 -7
  149. data/lib/rouge/lexers/viml.rb +8 -10
  150. data/lib/rouge/lexers/vue.rb +2 -2
  151. data/lib/rouge/lexers/xquery.rb +2 -1
  152. data/lib/rouge/lexers/yaml.rb +13 -1
  153. data/lib/rouge/lexers/yang.rb +42 -74
  154. data/lib/rouge/lexers/zig.rb +10 -10
  155. data/lib/rouge/plugins/redcarpet.rb +3 -2
  156. data/lib/rouge/regex_lexer.rb +25 -14
  157. data/lib/rouge/themes/gruvbox.rb +3 -0
  158. data/lib/rouge/token.rb +1 -1
  159. data/lib/rouge/util.rb +1 -1
  160. data/lib/rouge/version.rb +1 -1
  161. data/lib/rouge.rb +70 -59
  162. data/lib/rubocop/cop/rouge/no_building_alternation_pattern_in_regexp.rb +71 -0
  163. data/lib/rubocop/cop/rouge/no_huge_collections.rb +37 -0
  164. data/rouge.gemspec +8 -5
  165. metadata +44 -9
  166. data/lib/rouge/lexers/isbl/builtins.rb +0 -17
  167. data/lib/rouge/lexers/matlab/builtins.rb +0 -11
  168. /data/lib/rouge/demos/{coq → rocq} +0 -0
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'lua'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'lua.rb'
7
-
8
8
  class Moonscript < RegexLexer
9
9
  title "MoonScript"
10
10
  desc "Moonscript (http://www.moonscript.org)"
@@ -16,6 +16,9 @@ module Rouge
16
16
  option :function_highlighting, 'Whether to highlight builtin functions (default: true)'
17
17
  option :disabled_modules, 'builtin modules to disable'
18
18
 
19
+ # depends on lua builtins
20
+ lazy { Lua.eager_load! }
21
+
19
22
  def initialize(*)
20
23
  super
21
24
 
@@ -31,7 +34,7 @@ module Rouge
31
34
  return [] unless @function_highlighting
32
35
 
33
36
  @builtins ||= Set.new.tap do |builtins|
34
- Rouge::Lexers::Lua.builtins.each do |mod, fns|
37
+ Lua::BUILTINS.each do |mod, fns|
35
38
  next if @disabled_modules.include? mod
36
39
  builtins.merge(fns)
37
40
  end
@@ -44,36 +47,35 @@ module Rouge
44
47
  end
45
48
 
46
49
  state :base do
47
- ident = '(?:\w\w*)'
48
-
49
- rule %r((?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?'), Num::Float
50
- rule %r((?i)\d+e[+-]?\d+), Num::Float
51
- rule %r((?i)0x[0-9a-f]*), Num::Hex
50
+ rule %r((\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?')i, Num::Float
51
+ rule %r(\d+e[+-]?\d+)i, Num::Float
52
+ rule %r(0x\h*), Num::Hex
52
53
  rule %r(\d+), Num::Integer
53
- rule %r(@#{ident}*), Name::Variable::Instance
54
+ rule %r(@\w+), Name::Variable::Instance
54
55
  rule %r([A-Z]\w*), Name::Class
55
56
  rule %r("?[^"]+":), Literal::String::Symbol
56
- rule %r(#{ident}:), Literal::String::Symbol
57
- rule %r(:#{ident}), Literal::String::Symbol
57
+ rule %r(\w+:), Literal::String::Symbol
58
+ rule %r(:\w+), Literal::String::Symbol
58
59
 
59
60
  rule %r(\s+), Text::Whitespace
60
61
  rule %r((==|~=|!=|<=|>=|\.\.\.|\.\.|->|=>|[=+\-*/%^<>#!\\])), Operator
61
62
  rule %r([\[\]\{\}\(\)\.,:;]), Punctuation
62
63
  rule %r((and|or|not)\b), Operator::Word
63
64
 
64
- keywords = %w{
65
- break class continue do else elseif end extends for if import in
65
+ keywords = Set.new %w{
66
+ break class continue do else elseif end extends for if import in from
66
67
  repeat return switch super then unless until using when with while
67
68
  }
68
- rule %r((#{keywords.join('|')})\b), Keyword
69
69
  rule %r((local|export)\b), Keyword::Declaration
70
70
  rule %r((true|false|nil)\b), Keyword::Constant
71
71
 
72
- rule %r([A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?) do |m|
72
+ rule %r([a-z_]\w*(\.[a-z_]\w*)?)i do |m|
73
73
  name = m[0]
74
- if self.builtins.include?(name)
74
+ if keywords.include?(name)
75
+ token Keyword
76
+ elsif self.builtins.include?(name)
75
77
  token Name::Builtin
76
- elsif name =~ /\./
78
+ elsif name.include?('.')
77
79
  a, b = name.split('.', 2)
78
80
  token Name, a
79
81
  token Punctuation, '.'
@@ -21,7 +21,7 @@ module Rouge
21
21
 
22
22
  def self.keywords_type
23
23
  @keywords_type ||= %w(
24
- DB DW BYTE WORD
24
+ DB DW BYTE WORD
25
25
  )
26
26
  end
27
27
 
@@ -32,12 +32,12 @@ module Rouge
32
32
  ENDIF FAIL INESPRG INESCHR INESMAP INESMIR FUNC
33
33
  )
34
34
  end
35
-
35
+
36
36
  state :root do
37
37
  rule %r/\s+/m, Text
38
38
  rule %r(;.*), Comment::Single
39
39
 
40
- rule %r/[\(\)\,\.\[\]]/, Punctuation
40
+ rule %r/[\(\)\,\.\[\]]/, Punctuation
41
41
  rule %r/\#?\%[0-1]+/, Num::Bin # #%00110011 %00110011
42
42
  rule %r/\#?\$\h+/, Num::Hex # $1f #$1f
43
43
  rule %r/\#?\d+/, Num # 10 #10
@@ -45,7 +45,7 @@ module Rouge
45
45
 
46
46
  rule %r/\#?\w+:?/i do |m|
47
47
  name = m[0].upcase
48
-
48
+
49
49
  if self.class.keywords.include? name
50
50
  token Keyword
51
51
  elsif self.class.keywords_type.include? name
@@ -58,13 +58,13 @@ module Rouge
58
58
  end
59
59
 
60
60
  rule %r/\#?(?:LOW|HIGH)\(.*\)/i, Keyword::Reserved # LOW() #HIGH()
61
-
61
+
62
62
  rule %r/\#\(/, Punctuation # #()
63
63
 
64
64
  rule %r/"/, Str, :string
65
65
 
66
66
  rule %r/'\w'/, Str::Char # 'A' for example
67
-
67
+
68
68
  rule %r/\\\??[\d@#]/, Name::Builtin # builtin parameters for use inside macros and functions: \1-\9 , \?1-\?9 , \# , \@
69
69
  end
70
70
 
@@ -8,7 +8,7 @@ module Rouge
8
8
  desc 'The Nial programming language (nial-array-language.org)'
9
9
  tag 'nial'
10
10
  filenames '*.ndf', '*.nlg'
11
-
11
+
12
12
  def self.keywords
13
13
  @keywords ||= Set.new ["is", "gets", "op", "tr", ";",
14
14
  "if", "then", "elseif", "else",
@@ -40,7 +40,7 @@ module Rouge
40
40
  "reduce", "reducecols", "reducerows",
41
41
  "sort", "team", "timeit", "twig"]
42
42
  end
43
-
43
+
44
44
  def self.funcs
45
45
  @funcs ||= Set.new ["operation", "expression", "and", "abs",
46
46
  "allbools", "allints", "allchars", "allin",
@@ -56,9 +56,9 @@ module Rouge
56
56
  "cutall", "cut", "display", "deparse",
57
57
  "deepupdate", "descan", "depth", "diagram",
58
58
  "div", "divide", "drop", "dropright", "edit",
59
- "empty", "expression", "exit", "except", "erase",
59
+ "empty", "exit", "except", "erase",
60
60
  "equal", "eval", "eraserecord", "execute", "exp",
61
- "external", "exprs", "findall", "find",
61
+ "external", "exprs", "findall", "find",
62
62
  "fault", "falsehood", "filestatus", "filelength",
63
63
  "filepath", "filetally", "floor", "first",
64
64
  "flip", "fuse", "fromraw", "front",
@@ -72,8 +72,7 @@ module Rouge
72
72
  "loaddefs", "nonlocal", "max", "match", "log",
73
73
  "lt", "lower", "lte", "mate", "min", "maxlength",
74
74
  "mod", "mix", "minus", "nialroot", "mold", "not",
75
- "numeric", "no_op", "no_expr", "notin",
76
- "operation", "open", "or", "opposite", "opp",
75
+ "numeric", "no_op", "no_expr", "notin", "open", "or", "opposite", "opp",
77
76
  "operators", "plus", "pick", "pack", "pass", "pair", "parse",
78
77
  "paste", "phrase", "place", "picture", "placeall",
79
78
  "power", "positions", "post", "quotient", "putfile",
@@ -137,7 +136,7 @@ module Rouge
137
136
  token Text
138
137
  end
139
138
  end
140
-
139
+
141
140
  rule %r/\b[_A-Za-z]\w*\b/ do |m|
142
141
  lower = m[0].downcase
143
142
  if self.class.keywords.include?(lower)
@@ -155,7 +154,7 @@ module Rouge
155
154
 
156
155
  rule %r/\s+/, Text
157
156
  end
158
-
157
+
159
158
  state :str do
160
159
  rule %r/''/, Str::Escape
161
160
  rule %r/[^']+/, Str::Single
@@ -134,9 +134,9 @@ module Rouge
134
134
  # Note: Have to do this with a block to push multiple states first,
135
135
  # since we can't pass array of states like w/ Pygments.
136
136
  rule(/[0-9][0-9_]*(?=([eE.]|'?[fF](32|64)))/) do
137
- push :floatsuffix
138
- push :floatnumber
139
- token Num::Float
137
+ push :floatsuffix
138
+ push :floatnumber
139
+ token Num::Float
140
140
  end
141
141
 
142
142
  rule(/0[xX][a-fA-F0-9][a-fA-F0-9_]*/, Num::Hex, :intsuffix)
@@ -10,6 +10,8 @@ module Rouge
10
10
  aliases 'nixos'
11
11
  filenames '*.nix'
12
12
 
13
+ id_boundary = /(?![a-zA-Z0-9_'-])/
14
+
13
15
  state :whitespaces do
14
16
  rule %r/^\s*\n\s*$/m, Text
15
17
  rule %r/\s+/, Text
@@ -30,15 +32,15 @@ module Rouge
30
32
  end
31
33
 
32
34
  state :null do
33
- rule %r/(null)/, Keyword::Constant
35
+ rule %r/null#{id_boundary}/, Keyword::Constant
34
36
  end
35
37
 
36
38
  state :boolean do
37
- rule %r/(true|false)/, Keyword::Constant
39
+ rule %r/(?:true|false)#{id_boundary}/, Keyword::Constant
38
40
  end
39
41
 
40
42
  state :binding do
41
- rule %r/[a-zA-Z_][a-zA-Z0-9-]*/, Name::Variable
43
+ rule %r/[a-zA-Z_][a-zA-Z0-9_'-]*/, Name::Variable
42
44
  end
43
45
 
44
46
  state :path do
@@ -161,22 +163,22 @@ module Rouge
161
163
 
162
164
  state :keywords_namespace do
163
165
  keywords = %w(with in inherit)
164
- rule %r/(?:#{keywords.join('|')})\b/, Keyword::Namespace
166
+ rule %r/(?:#{keywords.join('|')})#{id_boundary}/, Keyword::Namespace
165
167
  end
166
168
 
167
169
  state :keywords_declaration do
168
170
  keywords = %w(let)
169
- rule %r/(?:#{keywords.join('|')})\b/, Keyword::Declaration
171
+ rule %r/(?:#{keywords.join('|')})#{id_boundary}/, Keyword::Declaration
170
172
  end
171
173
 
172
174
  state :keywords_conditional do
173
175
  keywords = %w(if then else)
174
- rule %r/(?:#{keywords.join('|')})\b/, Keyword
176
+ rule %r/(?:#{keywords.join('|')})#{id_boundary}/, Keyword
175
177
  end
176
178
 
177
179
  state :keywords_reserved do
178
180
  keywords = %w(rec assert map)
179
- rule %r/(?:#{keywords.join('|')})\b/, Keyword::Reserved
181
+ rule %r/(?:#{keywords.join('|')})#{id_boundary}/, Keyword::Reserved
180
182
  end
181
183
 
182
184
  state :keywords_builtin do
@@ -192,7 +194,7 @@ module Rouge
192
194
  throw
193
195
  toString
194
196
  )
195
- rule %r/(?:#{keywords.join('|')})\b/, Keyword::Reserved
197
+ rule %r/(?:#{keywords.join('|')})#{id_boundary}/, Keyword::Reserved
196
198
  end
197
199
 
198
200
  state :ignore do
@@ -1,11 +1,11 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'c'
5
+ require_relative 'objective_c/common'
6
+
4
7
  module Rouge
5
8
  module Lexers
6
- load_lexer 'c.rb'
7
- load_lexer 'objective_c/common.rb'
8
-
9
9
  class ObjectiveC < C
10
10
  extend ObjectiveCCommon
11
11
 
@@ -1,10 +1,11 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'cpp'
5
+ require_relative 'objective_c/common'
6
+
4
7
  module Rouge
5
8
  module Lexers
6
- load_lexer 'cpp.rb'
7
- load_lexer 'objective_c/common.rb'
8
9
 
9
10
  class ObjectiveCpp < Cpp
10
11
  extend ObjectiveCCommon
@@ -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 OCaml < OCamlCommon
9
9
  title "OCaml"
10
10
  desc 'Objective Caml (ocaml.org)'
@@ -21,7 +21,7 @@ module Rouge
21
21
  ADD-BUFFER ADD-CALC-COL ADD-CALC-COLU ADD-CALC-COLUM ADD-CALC-COLUMN ADD-COLUMNS-FROM
22
22
  ADD-EVENTS-PROC ADD-EVENTS-PROCE ADD-EVENTS-PROCED ADD-EVENTS-PROCEDU ADD-EVENTS-PROCEDUR
23
23
  ADD-EVENTS-PROCEDURE ADD-FIELDS-FROM ADD-FIRST ADD-HEADER-ENTRY ADD-INDEX-FIELD ADD-INTERVAL
24
- ADD-LAST ADD-LIKE-COLUMN ADD-LIKE-FIELD ADD-LIKE-INDEX ADD-NEW-FIELD ADD-NEW-INDEX
24
+ ADD-LAST ADD-LIKE-COLUMN ADD-LIKE-FIELD ADD-LIKE-INDEX ADD-NEW-FIELD ADD-NEW-INDEX
25
25
  ADD-SCHEMA-LOCATION ADD-SOURCE-BUFFER ADD-SUPER-PROC ADD-SUPER-PROCE ADD-SUPER-PROCED
26
26
  ADD-SUPER-PROCEDU ADD-SUPER-PROCEDUR ADD-SUPER-PROCEDURE ADM-DATA ADVISE AFTER-BUFFER AFTER-ROWID
27
27
  AFTER-TABLE ALERT-BOX ALIAS ALL ALLOW-COLUMN-SEARCHING ALLOW-PREV-DESERIALIZATION ALLOW-REPLICATION
@@ -486,7 +486,7 @@ module Rouge
486
486
  WRITE-JSON WRITE-MESSAGE WRITE-PROCESSING-INSTRUCTION WRITE-STATUS WRITE-XML WRITE-XMLSCHEMA X XCODE
487
487
  XCODE-SESSION-KEY X-DOCUMENT XML-DATA-TYPE XML-ENTITY-EXPANSION-LIMIT XML-NODE-NAME XML-NODE-TYPE
488
488
  XML-SCHEMA-PAT XML-SCHEMA-PATH XML-STRICT-ENTITY-RESOLUTION XML-SUPPRESS-NAMESPACE-PROCESSING
489
- X-NODEREF X-OF XOR XREF XREF-XML Y YEAR YEAR-OFFSET YES YES-NO YES-NO-CANCEL Y-OF
489
+ X-NODEREF X-OF XOR XREF XREF-XML Y YEAR YEAR-OFFSET YES YES-NO YES-NO-CANCEL Y-OF
490
490
  )
491
491
  end
492
492
 
@@ -521,7 +521,7 @@ module Rouge
521
521
  end
522
522
 
523
523
  state :whitespace do
524
- rule %r/\s+/m, Text
524
+ rule %r/\s+/m, Text
525
525
  end
526
526
 
527
527
  state :singlelinecomment do
@@ -560,7 +560,7 @@ module Rouge
560
560
  rule %r([~!%^*+=\|?:<>/-]), Operator
561
561
  rule %r/[()\[\],.]/, Punctuation
562
562
  end
563
-
563
+
564
564
  state :doublequotedstring do
565
565
  rule %r/\~[~nrt"]?/, Str::Escape
566
566
  rule %r/[^\\"]+/, Str::Double
@@ -572,7 +572,7 @@ module Rouge
572
572
  rule %r/[^\\']+/, Str::Single
573
573
  rule %r/'/, Str::Delimiter, :pop!
574
574
  end
575
-
575
+
576
576
  state :preproc do
577
577
  rule %r/(\&analyze-suspend|\&analyze-resume)/i, Comment::Preproc, :analyze_suspend_resume_content
578
578
  rule %r/(\&scoped-define|\&global-define)\s*([\.\w\\\/-]*)/i , Comment::Preproc, :analyze_suspend_resume_content
@@ -584,18 +584,18 @@ module Rouge
584
584
  rule %r/.*\n/, Comment::Preproc, :pop!
585
585
  rule %r/.*/, Comment::Preproc, :pop!
586
586
  end
587
-
587
+
588
588
  state :preproc_content do
589
589
  rule %r/\n/, Text, :pop!
590
590
  rule %r/\s+/, Text
591
-
591
+
592
592
  rule %r/({?&)(\S+)/ do
593
593
  groups Comment::Preproc, Name::Other
594
594
  end
595
-
595
+
596
596
  rule %r/"/, Str, :string
597
597
  mixin :numeric
598
-
598
+
599
599
  rule %r/\S+/, Name
600
600
  end
601
601
 
@@ -0,0 +1,109 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+ # vim: set ts=2 sw=2 et:
4
+
5
+ # PDF = Portable Document Format page description language
6
+ # As defined by ISO 32000-2:2020 including resolved errata from https://pdf-issues.pdfa.org/
7
+ #
8
+ # The PDF syntax is also known as "COS" and can be used with FDF (Forms Data Field) files as
9
+ # per ISO 32000-2:2020 clause 12.7.8.
10
+ #
11
+ # This is a token-based parser ONLY! It is intended to syntax highlight full or partial fragments
12
+ # of nicely written hand-written PDF syntax in documentation such as ISO specifications. It is NOT
13
+ # intended to cope with real-world PDFs that will contain arbitrary binary data (that form invalid
14
+ # UTF-8 sequences and generate "ArgumentError: invalid byte sequence in UTF-8" Ruby errors) and
15
+ # other types of malformations or syntax errors.
16
+ #
17
+ # Author: Peter Wyatt, CTO, PDF Association. 2024
18
+ #
19
+ module Rouge
20
+ module Lexers
21
+ class Pdf < RegexLexer
22
+ title "PDF"
23
+ desc "PDF - Portable Document Format (ISO 32000)"
24
+ tag 'pdf'
25
+ aliases "fdf", 'cos'
26
+ filenames '*.pdf', '*.fdf'
27
+ mimetypes 'application/pdf', 'application/fdf' # IANA registered media types
28
+
29
+ # PDF and FDF files must start with "%PDF-x.y" or "%FDF-x.y"
30
+ # where x is the single digit major version and y is the single digit minor version.
31
+ # For simplicity as a syntax highlighter, assumes occurs at start of a line.
32
+ def self.detect?(text)
33
+ return true if /\A%(P|F)DF-\d\.\d/.match?(text)
34
+ end
35
+
36
+ # PDF Delimiters (ISO 32000-2:2020, Table 1 and Table 2).
37
+ # Ruby whitespace "\s" is /[ \t\r\n\f\v]/ which does not include NUL (ISO 32000-2:2020, Table 1).
38
+ # PDF also support 2 character EOL sequences.
39
+
40
+ state :root do
41
+ # Start-of-file header comment is special (comment is up to EOL)
42
+ rule %r/^%(P|F)DF-\d\.\d.*$/, Comment::Preproc
43
+
44
+ # End-of-file marker comment is special (comment is up to EOL)
45
+ rule %r/^%%EOF.*$/, Comment::Preproc
46
+
47
+ # PDF only has single-line comments: from "%" to EOL
48
+ rule %r/%.*$/, Comment::Single
49
+
50
+ # PDF Boolean and null object keywords
51
+ rule %r/(false|true|null)/, Keyword::Constant
52
+
53
+ # PDF Dictionary and array object start and end tokens
54
+ rule %r/(<<|>>|\[|\])/, Punctuation
55
+
56
+ # PDF Hex string - can contain whitespace and span multiple lines.
57
+ # This rule must be after "<<"/">>"
58
+ rule %r/<[0-9A-Fa-f\s]*>/m, Str::Other
59
+
60
+ # PDF literal strings are complex (multi-line, escapes, etc.). Use separate state machine.
61
+ rule %r/\(/, Str, :stringliteral
62
+
63
+ # PDF Name objects - can be empty (i.e., nothing after "/").
64
+ # No special processing required for 2-digit hex codes that start with "#".
65
+ rule %r/\/[^\(\)<>\[\]\/%\s]*/, Name::Other
66
+
67
+ # PDF objects and stream (no checking of object ID)
68
+ # Note that object number and generation numbers do not have sign.
69
+ rule %r/\d+\s\d+\sobj/, Keyword::Declaration
70
+ rule %r/endstream|endobj|stream/, Keyword::Declaration
71
+
72
+ # PDF conventional file layout keywords
73
+ rule %r/startxref|trailer|xref/, Keyword::Declaration
74
+
75
+ # PDF cross reference section entries (20 bytes including EOL).
76
+ # Explicit single SPACE separators.
77
+ rule %r/^\d{10} \d{5} (n|f)\s*$/, Keyword::Namespace
78
+
79
+ # PDF Indirect reference (lax, allows zero as the object number).
80
+ # Requires terminating delimiter lookahead to disambiguate from "RG" operator
81
+ rule %r/\d+\s\d+\sR(?=[\(\)<>\[\]\/%\s])/, Name::Decorator
82
+
83
+ # PDF Real object
84
+ rule %r/(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)/, Num::Float
85
+
86
+ # PDF Integer object
87
+ rule %r/(\-|\+)?[0-9]+/, Num::Integer
88
+
89
+ # A run of non-delimiters is most likely a PDF content stream
90
+ # operator (ISO 32000-2:2020, Annex A).
91
+ rule %r/[^\(\)<>\[\]\/%\s]+/, Operator::Word
92
+
93
+ # Whitespace (except inside strings and comments) is ignored = /[ \t\r\n\f\v]/.
94
+ # Ruby doesn't include NUL as whitespace (vs ISO 32000-2:2020 Table 1)
95
+ rule %r/\s+/, Text::Whitespace
96
+ end
97
+
98
+ # PDF literal string. See ISO 32000-2:2020 clause 7.3.4.2 and Table 3
99
+ state :stringliteral do
100
+ rule %r/\(/, Str, :stringliteral # recursive for internal bracketed strings
101
+ rule %r/\\\(/, Str::Escape, :stringliteral # recursive for internal escaped bracketed strings
102
+ rule %r/\)/, Str, :pop!
103
+ rule %r/\\\)/, Str::Escape, :pop!
104
+ rule %r/\\([0-7]{3}|n|r|t|b|f|\\)/, Str::Escape
105
+ rule %r/[^\(\)\\]+/, Str
106
+ end
107
+ end
108
+ end
109
+ end