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
@@ -9,23 +9,6 @@ module Rouge
9
9
  tag 'isbl'
10
10
  filenames '*.isbl'
11
11
 
12
- def self.builtins
13
- Kernel::load File.join(Lexers::BASE_DIR, 'isbl/builtins.rb')
14
- self.builtins
15
- end
16
-
17
- def self.constants
18
- @constants ||= self.builtins["const"].merge(self.builtins["enum"]).collect!(&:downcase)
19
- end
20
-
21
- def self.interfaces
22
- @interfaces ||= self.builtins["interface"].collect!(&:downcase)
23
- end
24
-
25
- def self.globals
26
- @globals ||= self.builtins["global"].collect!(&:downcase)
27
- end
28
-
29
12
  def self.keywords
30
13
  @keywords = Set.new %w(
31
14
  and и else иначе endexcept endfinally endforeach конецвсе endif конецесли endwhile
@@ -41,30 +24,16 @@ module Rouge
41
24
 
42
25
  state :dotted do
43
26
  mixin :whitespace
44
- rule %r/[a-zа-яё_0-9]+/i do |m|
45
- name = m[0]
46
- if self.class.constants.include? name.downcase
47
- token Name::Builtin
48
- elsif in_state? :type
49
- token Keyword::Type
50
- else
51
- token Name
52
- end
27
+ rule %r/\p{Alnum}+/i do |m|
28
+ token(in_state?(:type) ? Keyword::Type : Name)
29
+
53
30
  pop!
54
31
  end
55
32
  end
56
33
 
57
34
  state :type do
58
35
  mixin :whitespace
59
- rule %r/[a-zа-яё_0-9]+/i do |m|
60
- name = m[0]
61
- if self.class.interfaces.include? name.downcase
62
- token Keyword::Type
63
- else
64
- token Name
65
- end
66
- pop!
67
- end
36
+ rule %r/\p{Word}+/, Name, :pop!
68
37
  rule %r/[.]/, Punctuation, :dotted
69
38
  rule(//) { pop! }
70
39
  end
@@ -75,15 +44,10 @@ module Rouge
75
44
  rule %r/[.]/, Punctuation, :dotted
76
45
  rule %r/[\[\]();]/, Punctuation
77
46
  rule %r([&*+=<>/-]), Operator
78
- rule %r/\b[a-zа-яё_][a-zа-яё_0-9]*(?=[(])/i, Name::Function
79
- rule %r/[a-zа-яё_!][a-zа-яё_0-9]*/i do |m|
80
- name = m[0]
81
- if self.class.keywords.include? name.downcase
47
+ rule %r/[\p{Alpha}_!]\p{Word}*(?=[(])/i, Name::Function
48
+ rule %r/[\p{Alpha}_!]\p{Word}*/i do |m|
49
+ if self.class.keywords.include?(m[0].downcase)
82
50
  token Keyword
83
- elsif self.class.constants.include? name.downcase
84
- token Name::Builtin
85
- elsif self.class.globals.include? name.downcase
86
- token Name::Variable::Global
87
51
  else
88
52
  token Name::Variable
89
53
  end
@@ -32,7 +32,7 @@ module Rouge
32
32
  end
33
33
 
34
34
  def self.primitive_table
35
- @primitive_table ||= Hash.new([:name]).tap do |h|
35
+ @primitive_table ||= Hash.new([:name].freeze).tap do |h|
36
36
  {
37
37
  '()' => [:other],
38
38
  '=' => [:verb, :other, :other],
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'json'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'json.rb'
7
-
8
8
  class JSON5 < JSON
9
9
  title 'JSON 5'
10
10
  tag 'json5'
@@ -1,10 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'json'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'json.rb'
7
-
8
8
  class JSONDOC < JSON
9
9
  desc "JavaScript Object Notation with extensions for documentation"
10
10
  tag 'json-doc'
@@ -1,119 +1,119 @@
1
- # -*- coding: utf-8 -*- #
2
- # frozen_string_literal: true
3
-
4
- module Rouge
5
- module Lexers
6
- class JSP < TemplateLexer
7
- desc 'JSP'
8
- tag 'jsp'
9
- filenames '*.jsp'
10
- mimetypes 'text/x-jsp', 'application/x-jsp'
11
-
12
- def initialize(*)
13
- super
14
- @java = Java.new
15
- end
16
-
17
- directives = %w(page include taglib)
18
- actions = %w(scriptlet declaration expression)
19
-
20
- state :root do
21
-
22
- rule %r/<%--/, Comment, :jsp_comment
23
-
24
- rule %r/<%@\s*(#{directives.join('|')})\s*/, Name::Tag, :jsp_directive
25
-
26
- rule %r/<jsp:directive\.(#{directives.join('|')})/, Name::Tag, :jsp_directive2
27
-
28
- rule %r/<jsp:(#{actions.join('|')})>/, Name::Tag, :jsp_expression
29
-
30
- # start of tag, e.g. <c:if>
31
- rule %r/<[a-zA-Z]*:[a-zA-Z]*\s*/, Name::Tag, :jsp_tag
32
-
33
- # end of tag, e.g. </c:if>
34
- rule %r(</[a-zA-Z]*:[a-zA-Z]*>), Name::Tag
35
-
36
- rule %r/<%[!=]?/, Name::Tag, :jsp_expression2
37
-
38
- # fallback to HTML
39
- rule(/(.+?)(?=(<%|<\/?[a-zA-Z]*:))/m) { delegate parent }
40
- rule(/.+/m) { delegate parent }
41
- end
42
-
43
- state :jsp_comment do
44
- rule %r/(--%>)/, Comment, :pop!
45
- rule %r/./m, Comment
46
- end
47
-
48
- state :jsp_directive do
49
- rule %r/(%>)/, Name::Tag, :pop!
50
- mixin :attributes
51
- rule(/(.+?)(?=%>)/m) { delegate parent }
52
- end
53
-
54
- state :jsp_directive2 do
55
- rule %r!(/>)!, Name::Tag, :pop!
56
- mixin :attributes
57
- rule(/(.+?)(?=\/>)/m) { delegate parent }
58
- end
59
-
60
- state :jsp_expression do
61
- rule %r/<\/jsp:(#{actions.join('|')})>/, Name::Tag, :pop!
62
- mixin :attributes
63
- rule(/[^<\/]+/) { delegate @java }
64
- end
65
-
66
- state :jsp_expression2 do
67
- rule %r/%>/, Name::Tag, :pop!
68
- rule(/[^%>]+/) { delegate @java }
69
- end
70
-
71
- state :jsp_tag do
72
- rule %r/\/?>/, Name::Tag, :pop!
73
- mixin :attributes
74
- rule(/(.+?)(?=\/?>)/m) { delegate parent }
75
- end
76
-
77
- state :attributes do
78
- rule %r/\s*[a-zA-Z0-9_:-]+\s*=\s*/m, Name::Attribute, :attr
79
- end
80
-
81
- state :attr do
82
- rule %r/"/ do
83
- token Str
84
- goto :double_quotes
85
- end
86
-
87
- rule %r/'/ do
88
- token Str
89
- goto :single_quotes
90
- end
91
-
92
- rule %r/[^\s>]+/, Str, :pop!
93
- end
94
-
95
- state :double_quotes do
96
- rule %r/"/, Str, :pop!
97
- rule %r/\$\{/, Str::Interpol, :jsp_interp
98
- rule %r/[^"]+/, Str
99
- end
100
-
101
- state :single_quotes do
102
- rule %r/'/, Str, :pop!
103
- rule %r/\$\{/, Str::Interpol, :jsp_interp
104
- rule %r/[^']+/, Str
105
- end
106
-
107
- state :jsp_interp do
108
- rule %r/\}/, Str::Interpol, :pop!
109
- rule %r/'/, Literal, :jsp_interp_literal_start
110
- rule(/[^'\}]+/) { delegate @java }
111
- end
112
-
113
- state :jsp_interp_literal_start do
114
- rule %r/'/, Literal, :pop!
115
- rule %r/[^']+/, Literal
116
- end
117
- end
118
- end
119
- end
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class JSP < TemplateLexer
7
+ desc 'JSP'
8
+ tag 'jsp'
9
+ filenames '*.jsp'
10
+ mimetypes 'text/x-jsp', 'application/x-jsp'
11
+
12
+ def initialize(*)
13
+ super
14
+ @java = Java.new
15
+ end
16
+
17
+ directives = %w(page include taglib)
18
+ actions = %w(scriptlet declaration expression)
19
+
20
+ state :root do
21
+
22
+ rule %r/<%--/, Comment, :jsp_comment
23
+
24
+ rule %r/<%@\s*(#{directives.join('|')})\s*/, Name::Tag, :jsp_directive
25
+
26
+ rule %r/<jsp:directive\.(#{directives.join('|')})/, Name::Tag, :jsp_directive2
27
+
28
+ rule %r/<jsp:(#{actions.join('|')})>/, Name::Tag, :jsp_expression
29
+
30
+ # start of tag, e.g. <c:if>
31
+ rule %r/<[a-zA-Z]*:[a-zA-Z]*\s*/, Name::Tag, :jsp_tag
32
+
33
+ # end of tag, e.g. </c:if>
34
+ rule %r(</[a-zA-Z]*:[a-zA-Z]*>), Name::Tag
35
+
36
+ rule %r/<%[!=]?/, Name::Tag, :jsp_expression2
37
+
38
+ # fallback to HTML
39
+ rule(/(.+?)(?=(<%|<\/?[a-zA-Z]*:))/m) { delegate parent }
40
+ rule(/.+/m) { delegate parent }
41
+ end
42
+
43
+ state :jsp_comment do
44
+ rule %r/(--%>)/, Comment, :pop!
45
+ rule %r/./m, Comment
46
+ end
47
+
48
+ state :jsp_directive do
49
+ rule %r/(%>)/, Name::Tag, :pop!
50
+ mixin :attributes
51
+ rule(/(.+?)(?=%>)/m) { delegate parent }
52
+ end
53
+
54
+ state :jsp_directive2 do
55
+ rule %r!(/>)!, Name::Tag, :pop!
56
+ mixin :attributes
57
+ rule(/(.+?)(?=\/>)/m) { delegate parent }
58
+ end
59
+
60
+ state :jsp_expression do
61
+ rule %r/<\/jsp:(#{actions.join('|')})>/, Name::Tag, :pop!
62
+ mixin :attributes
63
+ rule(/[^<\/]+/) { delegate @java }
64
+ end
65
+
66
+ state :jsp_expression2 do
67
+ rule %r/%>/, Name::Tag, :pop!
68
+ rule(/[^%>]+/) { delegate @java }
69
+ end
70
+
71
+ state :jsp_tag do
72
+ rule %r/\/?>/, Name::Tag, :pop!
73
+ mixin :attributes
74
+ rule(/(.+?)(?=\/?>)/m) { delegate parent }
75
+ end
76
+
77
+ state :attributes do
78
+ rule %r/\s*[a-zA-Z0-9_:-]+\s*=\s*/m, Name::Attribute, :attr
79
+ end
80
+
81
+ state :attr do
82
+ rule %r/"/ do
83
+ token Str
84
+ goto :double_quotes
85
+ end
86
+
87
+ rule %r/'/ do
88
+ token Str
89
+ goto :single_quotes
90
+ end
91
+
92
+ rule %r/[^\s>]+/, Str, :pop!
93
+ end
94
+
95
+ state :double_quotes do
96
+ rule %r/"/, Str, :pop!
97
+ rule %r/\$\{/, Str::Interpol, :jsp_interp
98
+ rule %r/[^"]+/, Str
99
+ end
100
+
101
+ state :single_quotes do
102
+ rule %r/'/, Str, :pop!
103
+ rule %r/\$\{/, Str::Interpol, :jsp_interp
104
+ rule %r/[^']+/, Str
105
+ end
106
+
107
+ state :jsp_interp do
108
+ rule %r/\}/, Str::Interpol, :pop!
109
+ rule %r/'/, Literal, :jsp_interp_literal_start
110
+ rule(/[^'\}]+/) { delegate @java }
111
+ end
112
+
113
+ state :jsp_interp_literal_start do
114
+ rule %r/'/, Literal, :pop!
115
+ rule %r/[^']+/, Literal
116
+ end
117
+ end
118
+ end
119
+ end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'javascript'
4
+
3
5
  module Rouge
4
6
  module Lexers
5
- load_lexer 'javascript.rb'
6
-
7
7
  class JSX < Javascript
8
8
  title 'JSX'
9
9
  desc 'An XML-like syntax extension to JavaScript (facebook.github.io/jsx/)'
@@ -0,0 +1,100 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+
7
+ # Find the reference for the KickAssembler syntax at
8
+ # https://www.theweb.dk/KickAssembler/KickAssembler.pdf
9
+ class KickAssembler < RegexLexer
10
+ title 'KickAssembler'
11
+ desc 'Kick assembler NMOS 65xx syntax'
12
+ tag 'kick_assembler'
13
+ aliases 'kickass'
14
+ filenames '*.asm'
15
+ mimetypes 'text/x-asm', 'text/x-assembly'
16
+
17
+ def self.mnemonics
18
+ @mnemonics ||= Set.new %w(
19
+ lda ldx ldy sta stx sty tax tay txa tya tsx txs pha php pla plp
20
+ and eor ora bit adc sbc cmp cpx cpy inc inx iny dec dex dey asl
21
+ lsr rol ror jmp jsr rts rti bcc bcs beq bmi bne bpl bvc bvs
22
+ clc cld cli clv sec sed sei brk nop
23
+ phx plx phy ply
24
+ stz trb tsb bra
25
+ neg asr dea ina
26
+ ahx alr anc anc2 arr axs dcp isc las lax rla rra sax shx shy slo sre tas xaa
27
+ )
28
+ end
29
+
30
+ def self.type_directives
31
+ @type_directives ||= Set.new %w(
32
+ .align .assert .asserterror .break .by .byte .cpu
33
+ .disk .dword .dw .encoding .enum .error .errorif .eval
34
+ .file .fill .fillword .for .function .import .importonce
35
+ .label .lohifill .macro .memblock .modify .namespace
36
+ .pc .print .printnow .pseudocommand .pseudopc .return
37
+ .segment .segmentdef .struct .text .var .word .while .zp
38
+ )
39
+ end
40
+
41
+ def self.preprocessor_directives
42
+ @preprocessor_directives ||= Set.new %w(
43
+ define undef import importonce importif
44
+ if endif else elif
45
+ print printnow error asserterror
46
+ )
47
+ end
48
+
49
+ state :root do
50
+ rule %r(//.*?$), Comment::Single
51
+
52
+ rule %r/"(?:[^"\\]|\\.)*"/, Literal::String
53
+ rule %r/'.'/, Literal::String::Char
54
+
55
+ rule %r/\#?\%[0-1]+/, Literal::Number # Binary
56
+ rule %r/\#?\$[0-9a-fA-F]+/, Literal::Number # Hexa
57
+ rule %r/\#?\d+/, Literal::Number # Decimal
58
+
59
+ rule %r/[+\-*\/=<>!]/, Operator
60
+
61
+ rule %r/#\w+/i do |m|
62
+ directive = m[0][1..-1].downcase
63
+ if self.class.preprocessor_directives.include?(directive)
64
+ token Keyword
65
+ else
66
+ token Punctuation
67
+ end
68
+ end
69
+
70
+ rule %r/#/, Punctuation
71
+ rule %r/[(){},]/, Punctuation
72
+
73
+ rule %r/[a-z$._?][\w$.?#@~]*:/i, Name::Label
74
+
75
+ rule %r/\.\w+/i do |m|
76
+ if m[0] == '.const'
77
+ token Keyword::Constant
78
+ elsif m[0] =~ /^\.(for|while|macro|function|pseudopc|pseudocommand)$/io
79
+ token Keyword::Reserved
80
+ elsif self.class.type_directives.include?(m[0].downcase)
81
+ token Keyword::Declaration
82
+ else
83
+ token Keyword
84
+ end
85
+ end
86
+
87
+ rule %r/\b\w+\b/i do |m|
88
+ word = m[0].downcase
89
+ if self.class.mnemonics.include?(word)
90
+ token Keyword
91
+ else
92
+ token Name
93
+ end
94
+ end
95
+
96
+ rule %r/[ \t\r\n]+/, Text
97
+ end
98
+ end
99
+ end
100
+ end
@@ -24,6 +24,8 @@ module Rouge
24
24
  while yield
25
25
  )
26
26
 
27
+ use_site_targets = %w(file property field get set receiver param setparam delegate)
28
+
27
29
  name_chars = %r'[-\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
28
30
 
29
31
  class_name = %r'`?[\p{Lu}]#{name_chars}`?'
@@ -85,6 +87,9 @@ module Rouge
85
87
  rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str
86
88
  rule %r"'\\.'|'[^\\]'", Str::Char
87
89
  rule %r'(@#{class_name})', Name::Decorator
90
+ rule %r'(@)(#{use_site_targets.join('|')})(:)' do
91
+ groups Name::Decorator, Keyword, Punctuation
92
+ end
88
93
  rule %r'(#{class_name})(<)' do
89
94
  groups Name::Class, Punctuation
90
95
  push :generic_parameters