rouge_ecl 0.0.1 → 1.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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/lib/rouge.rb +7 -9
  4. data/lib/rouge/cli.rb +2 -36
  5. data/lib/rouge/guessers/glob_mapping.rb +6 -3
  6. data/lib/rouge/guessers/modeline.rb +3 -4
  7. data/lib/rouge/guessers/source.rb +16 -6
  8. data/lib/rouge/lexer.rb +11 -20
  9. data/lib/rouge/lexers/apiblueprint.rb +4 -0
  10. data/lib/rouge/lexers/awk.rb +2 -2
  11. data/lib/rouge/lexers/biml.rb +2 -2
  12. data/lib/rouge/lexers/c.rb +6 -1
  13. data/lib/rouge/lexers/coffeescript.rb +2 -2
  14. data/lib/rouge/lexers/coq.rb +4 -0
  15. data/lib/rouge/lexers/diff.rb +4 -4
  16. data/lib/rouge/lexers/digdag.rb +4 -0
  17. data/lib/rouge/lexers/ecl.rb +32 -20
  18. data/lib/rouge/lexers/erb.rb +4 -0
  19. data/lib/rouge/lexers/erlang.rb +4 -0
  20. data/lib/rouge/lexers/factor.rb +2 -2
  21. data/lib/rouge/lexers/fsharp.rb +1 -1
  22. data/lib/rouge/lexers/gherkin.rb +2 -2
  23. data/lib/rouge/lexers/go.rb +4 -0
  24. data/lib/rouge/lexers/groovy.rb +2 -2
  25. data/lib/rouge/lexers/haml.rb +4 -0
  26. data/lib/rouge/lexers/haskell.rb +5 -4
  27. data/lib/rouge/lexers/html.rb +5 -6
  28. data/lib/rouge/lexers/idlang.rb +6 -0
  29. data/lib/rouge/lexers/ini.rb +4 -0
  30. data/lib/rouge/lexers/io.rb +2 -2
  31. data/lib/rouge/lexers/javascript.rb +2 -2
  32. data/lib/rouge/lexers/julia.rb +2 -2
  33. data/lib/rouge/lexers/kotlin.rb +15 -10
  34. data/lib/rouge/lexers/lasso.rb +6 -3
  35. data/lib/rouge/lexers/llvm.rb +4 -0
  36. data/lib/rouge/lexers/lua.rb +2 -2
  37. data/lib/rouge/lexers/make.rb +4 -0
  38. data/lib/rouge/lexers/matlab.rb +4 -0
  39. data/lib/rouge/lexers/moonscript.rb +2 -2
  40. data/lib/rouge/lexers/mosel.rb +3 -3
  41. data/lib/rouge/lexers/nasm.rb +5 -0
  42. data/lib/rouge/lexers/objective_c.rb +14 -0
  43. data/lib/rouge/lexers/perl.rb +4 -3
  44. data/lib/rouge/lexers/php.rb +6 -6
  45. data/lib/rouge/lexers/plist.rb +4 -0
  46. data/lib/rouge/lexers/powershell.rb +1 -1
  47. data/lib/rouge/lexers/praat.rb +2 -2
  48. data/lib/rouge/lexers/prolog.rb +5 -0
  49. data/lib/rouge/lexers/properties.rb +4 -0
  50. data/lib/rouge/lexers/puppet.rb +3 -3
  51. data/lib/rouge/lexers/python.rb +2 -3
  52. data/lib/rouge/lexers/q.rb +4 -0
  53. data/lib/rouge/lexers/r.rb +2 -2
  54. data/lib/rouge/lexers/racket.rb +4 -5
  55. data/lib/rouge/lexers/ruby.rb +3 -3
  56. data/lib/rouge/lexers/rust.rb +4 -4
  57. data/lib/rouge/lexers/sass.rb +3 -3
  58. data/lib/rouge/lexers/scheme.rb +2 -2
  59. data/lib/rouge/lexers/scss.rb +2 -2
  60. data/lib/rouge/lexers/sed.rb +2 -2
  61. data/lib/rouge/lexers/shell.rb +9 -18
  62. data/lib/rouge/lexers/smarty.rb +11 -0
  63. data/lib/rouge/lexers/sml.rb +4 -0
  64. data/lib/rouge/lexers/swift.rb +1 -21
  65. data/lib/rouge/lexers/tap.rb +4 -0
  66. data/lib/rouge/lexers/tcl.rb +4 -4
  67. data/lib/rouge/lexers/tex.rb +2 -2
  68. data/lib/rouge/lexers/toml.rb +4 -0
  69. data/lib/rouge/lexers/tulip.rb +3 -2
  70. data/lib/rouge/lexers/turtle.rb +14 -5
  71. data/lib/rouge/lexers/vue.rb +6 -4
  72. data/lib/rouge/lexers/wollok.rb +4 -0
  73. data/lib/rouge/lexers/xml.rb +6 -4
  74. data/lib/rouge/lexers/yaml.rb +2 -2
  75. data/lib/rouge/version.rb +1 -1
  76. data/rouge.gemspec +1 -6
  77. metadata +4 -13
  78. data/lib/rouge/demos/ecl +0 -1
  79. data/lib/rouge/demos/elm +0 -4
  80. data/lib/rouge/demos/hack +0 -5
  81. data/lib/rouge/guessers/disambiguation.rb +0 -101
  82. data/lib/rouge/guessers/util.rb +0 -32
  83. data/lib/rouge/lexers/elm.rb +0 -89
  84. data/lib/rouge/lexers/hack.rb +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7edfb964a417fdfbb5cf50d7f290da8762f6e971
4
- data.tar.gz: 20e938abaa0fef4ad9dd6163de7745374a6b835a
3
+ metadata.gz: af56629a74d2aa10269cf04e548644d0671c3dbe
4
+ data.tar.gz: 9c408275361a52873876b46007aaf008d96bac38
5
5
  SHA512:
6
- metadata.gz: 9d4d3c5df7ab546716df8bfe7ec45bbb1e5702a5a23196d9c15d55cc9edb7985d7debafcd955bb43189a1bdf3b9be0a616237b8b6146bac5f32bab3bad318320
7
- data.tar.gz: 5ba4c4a9efa5e7db46f692350d5610d872284c518c326c03dd6e50682f34d7bac66c548def69703c6f2bbb22e3d791ba105f246f4e7e8c7dbc3bc51e5fc5162f
6
+ metadata.gz: 23f1ca340154e008b0714c48f6f525edc9d728040650ae8cadf2ac784dd78043c8bdc49c3c02daefd0a94d414dc0016b9fb375e4c17cfeb7f458d970c0794ced
7
+ data.tar.gz: 4f6a04e669eaae23f1c3be31b431b233404b86bb3a50fb4627b52a3440d581f25790f43851cbdb6bf02094744fa6e6769bc778df8213acf1543661ee047042f0
data/Gemfile CHANGED
@@ -3,12 +3,12 @@ source 'http://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'bundler', '~> 1.15'
6
- gem 'rake'
6
+ gem 'rake', '~> 12.0'
7
7
 
8
- gem 'minitest', '>= 5.0'
9
- gem 'minitest-power_assert'
8
+ gem 'minitest', '~> 4.0'
9
+ gem 'wrong'
10
10
 
11
- gem 'rubocop', '~> 0.49.1'
11
+ gem 'rubocop', '~> 0.49.1' if RUBY_VERSION >= '2.0.0'
12
12
 
13
13
  # don't try to install redcarpet under jruby
14
14
  gem 'redcarpet', :platforms => :ruby
data/lib/rouge.rb CHANGED
@@ -41,6 +41,13 @@ load load_dir.join('rouge/util.rb')
41
41
  load load_dir.join('rouge/text_analyzer.rb')
42
42
  load load_dir.join('rouge/token.rb')
43
43
 
44
+ load load_dir.join('rouge/guesser.rb')
45
+ load load_dir.join('rouge/guessers/glob_mapping.rb')
46
+ load load_dir.join('rouge/guessers/modeline.rb')
47
+ load load_dir.join('rouge/guessers/filename.rb')
48
+ load load_dir.join('rouge/guessers/mimetype.rb')
49
+ load load_dir.join('rouge/guessers/source.rb')
50
+
44
51
  load load_dir.join('rouge/lexer.rb')
45
52
  load load_dir.join('rouge/regex_lexer.rb')
46
53
  load load_dir.join('rouge/template_lexer.rb')
@@ -50,15 +57,6 @@ Dir.glob(lexers_dir.join('*.rb')).each do |f|
50
57
  Rouge::Lexers.load_lexer(Pathname.new(f).relative_path_from(lexers_dir).to_s)
51
58
  end
52
59
 
53
- load load_dir.join('rouge/guesser.rb')
54
- load load_dir.join('rouge/guessers/util.rb')
55
- load load_dir.join('rouge/guessers/glob_mapping.rb')
56
- load load_dir.join('rouge/guessers/modeline.rb')
57
- load load_dir.join('rouge/guessers/filename.rb')
58
- load load_dir.join('rouge/guessers/mimetype.rb')
59
- load load_dir.join('rouge/guessers/source.rb')
60
- load load_dir.join('rouge/guessers/disambiguation.rb')
61
-
62
60
  load load_dir.join('rouge/formatter.rb')
63
61
  load load_dir.join('rouge/formatters/html.rb')
64
62
  load load_dir.join('rouge/formatters/html_table.rb')
data/lib/rouge/cli.rb CHANGED
@@ -13,9 +13,9 @@ module Rouge
13
13
  def file
14
14
  case input
15
15
  when '-'
16
- IO.new($stdin.fileno, 'rt:bom|utf-8')
16
+ IO.new($stdin.fileno, 'r:utf-8')
17
17
  when String
18
- File.new(input, 'rt:bom|utf-8')
18
+ File.new(input, 'r:utf-8')
19
19
  when ->(i){ i.respond_to? :read }
20
20
  input
21
21
  end
@@ -44,7 +44,6 @@ module Rouge
44
44
  yield %| help #{Help.desc}|
45
45
  yield %| style #{Style.desc}|
46
46
  yield %| list #{List.desc}|
47
- yield %| guess #{Guess.desc}|
48
47
  yield %| version #{Version.desc}|
49
48
  yield %||
50
49
  yield %|See `rougify help <command>` for more info.|
@@ -98,8 +97,6 @@ module Rouge
98
97
  Style
99
98
  when 'list'
100
99
  List
101
- when 'guess'
102
- Guess
103
100
  end
104
101
  end
105
102
 
@@ -378,37 +375,6 @@ module Rouge
378
375
  end
379
376
  end
380
377
 
381
- class Guess < CLI
382
- def self.desc
383
- "guess the languages of file"
384
- end
385
-
386
- def self.parse(args)
387
- new(input_file: args.shift)
388
- end
389
-
390
- attr_reader :input_file, :input_source
391
-
392
- def initialize(opts)
393
- @input_file = opts[:input_file] || '-'
394
- @input_source = FileReader.new(@input_file).read
395
- end
396
-
397
- def lexers
398
- Lexer.guesses(
399
- filename: input_file,
400
- source: input_source,
401
- )
402
- end
403
-
404
- def run
405
- lexers.each do |l|
406
- puts "{ tag: #{l.tag.inspect}, title: #{l.title.inspect}, desc: #{l.desc.inspect} }"
407
- end
408
- end
409
- end
410
-
411
-
412
378
  private_class_method
413
379
  def self.normalize_syntax(argv)
414
380
  out = []
@@ -3,8 +3,6 @@ module Rouge
3
3
  # This class allows for custom behavior
4
4
  # with glob -> lexer name mappings
5
5
  class GlobMapping < Guesser
6
- include Util
7
-
8
6
  def self.by_pairs(mapping, filename)
9
7
  glob_map = {}
10
8
  mapping.each do |(glob, lexer_name)|
@@ -31,13 +29,18 @@ module Rouge
31
29
 
32
30
  collect_best(lexers) do |lexer|
33
31
  score = (@glob_map[lexer.name] || []).map do |pattern|
34
- if test_glob(pattern, basename)
32
+ if test_pattern(pattern, basename)
35
33
  # specificity is better the fewer wildcards there are
36
34
  -pattern.scan(/[*?\[]/).size
37
35
  end
38
36
  end.compact.min
39
37
  end
40
38
  end
39
+
40
+ private
41
+ def test_pattern(pattern, path)
42
+ File.fnmatch?(pattern, path, File::FNM_DOTMATCH | File::FNM_CASEFOLD)
43
+ end
41
44
  end
42
45
  end
43
46
  end
@@ -1,8 +1,6 @@
1
1
  module Rouge
2
2
  module Guessers
3
3
  class Modeline < Guesser
4
- include Util
5
-
6
4
  # [jneen] regexen stolen from linguist
7
5
  EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
8
6
 
@@ -27,9 +25,10 @@ module Rouge
27
25
  # don't bother reading the stream if we've already decided
28
26
  return lexers if lexers.size == 1
29
27
 
30
- source_text = get_source(@source)
28
+ source_text = @source
29
+ source_text = source_text.read if source_text.respond_to? :read
31
30
 
32
- lines = source_text.split(/\n/)
31
+ lines = source_text.split(/\r?\n/)
33
32
 
34
33
  search_space = (lines.first(@lines) + lines.last(@lines)).join("\n")
35
34
 
@@ -1,8 +1,6 @@
1
1
  module Rouge
2
2
  module Guessers
3
3
  class Source < Guesser
4
- include Util
5
-
6
4
  attr_reader :source
7
5
  def initialize(source)
8
6
  @source = source
@@ -13,15 +11,27 @@ module Rouge
13
11
  # we've already filtered to 1
14
12
  return lexers if lexers.size == 1
15
13
 
16
- source_text = get_source(@source)
14
+ # If we're filtering against *all* lexers, we only use confident return
15
+ # values from analyze_text. But if we've filtered down already, we can trust
16
+ # the analysis more.
17
+ threshold = lexers.size < 10 ? 0 : 0.5
18
+
19
+ source_text = case @source
20
+ when String
21
+ @source
22
+ when ->(s){ s.respond_to? :read }
23
+ @source.read
24
+ else
25
+ raise 'invalid source'
26
+ end
17
27
 
18
28
  Lexer.assert_utf8!(source_text)
19
29
 
20
30
  source_text = TextAnalyzer.new(source_text)
21
31
 
22
- collect_best(lexers) do |lexer|
23
- next unless lexer.methods(false).include? :detect?
24
- lexer.detect?(source_text) ? 1 : nil
32
+ collect_best(lexers, threshold: threshold) do |lexer|
33
+ next unless lexer.methods(false).include? :analyze_text
34
+ lexer.analyze_text(source_text)
25
35
  end
26
36
  end
27
37
  end
data/lib/rouge/lexer.rb CHANGED
@@ -22,9 +22,7 @@ module Rouge
22
22
  new(opts).lex(stream, &b)
23
23
  end
24
24
 
25
- # Given a name in string, return the correct lexer class.
26
- # @param [String] name
27
- # @return [Class<Rouge::Lexer>,nil]
25
+ # Given a string, return the correct lexer class.
28
26
  def find(name)
29
27
  registry[name.to_s]
30
28
  end
@@ -44,7 +42,6 @@ module Rouge
44
42
  # markdown lexer for highlighting internal code blocks.
45
43
  #
46
44
  def find_fancy(str, code=nil, additional_options={})
47
-
48
45
  if str && !str.include?('?') && str != 'guess'
49
46
  lexer_class = find(str)
50
47
  return lexer_class && lexer_class.new(additional_options)
@@ -112,7 +109,7 @@ module Rouge
112
109
  def demo(arg=:absent)
113
110
  return @demo = arg unless arg == :absent
114
111
 
115
- @demo = File.read(demo_file, mode: 'rt:bom|utf-8')
112
+ @demo = File.read(demo_file, encoding: 'utf-8')
116
113
  end
117
114
 
118
115
  # @return a list of all lexers.
@@ -136,7 +133,6 @@ module Rouge
136
133
  guessers << Guessers::Filename.new(filename) if filename
137
134
  guessers << Guessers::Modeline.new(source) if source
138
135
  guessers << Guessers::Source.new(source) if source
139
- guessers << Guessers::Disambiguation.new(filename, source) if source && filename
140
136
 
141
137
  Guesser.guess(guessers, Lexer.all)
142
138
  end
@@ -151,23 +147,16 @@ module Rouge
151
147
  # The source itself, which, if guessing by mimetype or filename
152
148
  # fails, will be searched for shebangs, <!DOCTYPE ...> tags, and
153
149
  # other hints.
154
- # @param [Proc] fallback called if multiple lexers are detected.
155
- # If omitted, Guesser::Ambiguous is raised.
156
150
  #
157
- # @see Lexer.detect?
151
+ # @see Lexer.analyze_text
158
152
  # @see Lexer.guesses
159
- # @return [Class<Rouge::Lexer>]
160
- def guess(info={}, &fallback)
153
+ def guess(info={})
161
154
  lexers = guesses(info)
162
155
 
163
156
  return Lexers::PlainText if lexers.empty?
164
157
  return lexers[0] if lexers.size == 1
165
158
 
166
- if fallback
167
- fallback.call(lexers)
168
- else
169
- raise Guesser::Ambiguous.new(lexers)
170
- end
159
+ raise Guesser::Ambiguous.new(lexers)
171
160
  end
172
161
 
173
162
  def guess_by_mimetype(mt)
@@ -436,14 +425,16 @@ module Rouge
436
425
 
437
426
  # @abstract
438
427
  #
439
- # Return true if there is an in-text indication (such as a shebang
440
- # or DOCTYPE declaration) that this lexer should be used.
428
+ # Return a number between 0 and 1 indicating the likelihood that
429
+ # the text given should be lexed with this lexer. The default
430
+ # implementation returns 0. Values under 0.5 will only be used
431
+ # to disambiguate filename or mimetype matches.
441
432
  #
442
433
  # @param [TextAnalyzer] text
443
434
  # the text to be analyzed, with a couple of handy methods on it,
444
435
  # like {TextAnalyzer#shebang?} and {TextAnalyzer#doctype?}
445
- def self.detect?(text)
446
- false
436
+ def self.analyze_text(text)
437
+ 0
447
438
  end
448
439
  end
449
440
 
@@ -11,6 +11,10 @@ module Rouge
11
11
  filenames '*.apib'
12
12
  mimetypes 'text/vnd.apiblueprint'
13
13
 
14
+ def self.analyze_text(text)
15
+ return 1 if text.start_with?('FORMAT: 1A\n')
16
+ end
17
+
14
18
  prepend :root do
15
19
  # Metadata
16
20
  rule(/(\S+)(:\s*)(.*)$/) do
@@ -10,8 +10,8 @@ module Rouge
10
10
  filenames '*.awk'
11
11
  mimetypes 'application/x-awk'
12
12
 
13
- def self.detect?(text)
14
- return true if text.shebang?('awk')
13
+ def self.analyze_text(text)
14
+ return 1 if text.shebang?('awk')
15
15
  end
16
16
 
17
17
  id = /[$a-zA-Z_][a-zA-Z0-9_]*/
@@ -8,8 +8,8 @@ module Rouge
8
8
  tag 'biml'
9
9
  filenames '*.biml'
10
10
 
11
- def self.detect?(text)
12
- return true if text =~ /<\s*Biml\b/
11
+ def self.analyze_text(text)
12
+ return 1 if text =~ /<\s*Biml\b/
13
13
  end
14
14
 
15
15
  prepend :root do
@@ -55,6 +55,11 @@ module Rouge
55
55
  )
56
56
  end
57
57
 
58
+ # high priority for filename matches
59
+ def self.analyze_text(*)
60
+ 0.3
61
+ end
62
+
58
63
  def self.builtins
59
64
  @builtins ||= []
60
65
  end
@@ -85,7 +90,7 @@ module Rouge
85
90
 
86
91
  state :whitespace do
87
92
  rule /\n+/m, Text, :bol
88
- rule %r(//(\\.|.)*?$), Comment::Single, :bol
93
+ rule %r(//(\\.|.)*?\n), Comment::Single, :bol
89
94
  mixin :inline_whitespace
90
95
  end
91
96
 
@@ -11,8 +11,8 @@ module Rouge
11
11
  title "CoffeeScript"
12
12
  desc 'The Coffeescript programming language (coffeescript.org)'
13
13
 
14
- def self.detect?(text)
15
- return true if text.shebang? 'coffee'
14
+ def self.analyze_text(text)
15
+ return 1 if text.shebang? 'coffee'
16
16
  end
17
17
 
18
18
  def self.keywords
@@ -8,6 +8,10 @@ module Rouge
8
8
  tag 'coq'
9
9
  mimetypes 'text/x-coq'
10
10
 
11
+ def self.analyze_text(text)
12
+ return 0.3 if text.include? "Require"
13
+ end
14
+
11
15
  def self.gallina
12
16
  @gallina ||= Set.new %w(
13
17
  as fun if in let match then else return end Type Set Prop
@@ -9,10 +9,10 @@ module Rouge
9
9
  filenames '*.diff', '*.patch'
10
10
  mimetypes 'text/x-diff', 'text/x-patch'
11
11
 
12
- def self.detect?(text)
13
- return true if text.start_with?('Index: ')
14
- return true if text =~ %r(\Adiff[^\n]*?\ba/[^\n]*\bb/)
15
- return true if text =~ /(---|[+][+][+]).*?\n(---|[+][+][+])/
12
+ def self.analyze_text(text)
13
+ return 1 if text.start_with?('Index: ')
14
+ return 1 if text.start_with?('diff ')
15
+ return 0.9 if text.start_with?('--- ')
16
16
  end
17
17
 
18
18
  state :root do
@@ -11,6 +11,10 @@ module Rouge
11
11
 
12
12
  mimetypes 'application/x-digdag'
13
13
 
14
+ def self.analyze_text(text)
15
+ # disable YAML.analyze_text
16
+ end
17
+
14
18
  # http://docs.digdag.io/operators.html
15
19
  # as of digdag v0.9.10
16
20
  KEYWORD_PATTERN = Regexp.union(%w(
@@ -67,50 +67,62 @@ module Rouge
67
67
 
68
68
  state :root do
69
69
  rule /\s+/m, Text
70
- rule %r(//(\\.|.)*?$), Comment::Single
71
- rule %r(/\*), Comment::Multiline, :multiline_comments
72
- rule /\d+/, Num::Integer
73
- rule /\b(?i:(abs|acos|aggregate|allnodes|apply|ascii|asin|asstring|atan|atan2|ave|case|catch|choose|choosen|choosesets|clustersize|combine|correlation|cos|cosh|count|covariance|cron|dataset|dedup|define|denormalize|dictionary|distribute|distributed|distribution|ebcdic|enth|error|evaluate|event|eventextra|eventname|exists|exp|failcode|failmessage|fetch|fromunicode|fromxml|getenv|getisvalid|global|graph|group|hash|hash32|hash64|hashcrc|hashmd5|having|httpcall|httpheader|if|iff|index|intformat|isvalid|iterate|join|keyunicode|length|library|limit|ln|local|log|loop|map|matched|matchlength|matchposition|matchtext|matchunicode|max|merge|mergejoin|min|nofold|nolocal|nonempty|normalize|parse|pipe|power|preload|process|project|pull|random|range|rank|ranked|realformat|recordof|regexfind|regexreplace|regroup|rejected|rollup|round|roundup|row|rowdiff|sample|set|sin|sinh|sizeof|soapcall|sort|sorted|sqrt|stepped|stored|sum|table|tan|tanh|thisnode|topn|tounicode|toxml|transfer|transform|trim|truncate|typeof|ungroup|unicodeorder|variance|which|workunit|xmldecode|xmlencode|xmltext|xmlunicode))\b/, Operator
74
- rule /\b(?i:(data|string|qstring|varstring|varunicode|unicode))\d+\b/, Keyword::Type
75
- rule /\b(?i:(integer|unsigned))[1-8]\b/, Keyword::Type
76
- rule /\b(?i:(ascii|big_endian|boolean|data|decimal|ebcdic|grouped|integer|linkcounted|pattern|qstring|real|record|rule|set of|streamed|string|token|udecimal|unicode|unsigned|varstring|varunicode))\b/, Keyword::Type
77
- rule /\b(?i)(u?)decimal(\d+(_\d+)?)\b/, Keyword::Type
78
- rule /\b(?i:(apply|assert|build|buildindex|evaluate|fail|keydiff|keypatch|loadxml|nothor|notify|output|parallel|sequential|soapcall|wait))\b/, Operator
79
-
70
+ rule %r(//(\\.|.)*?$), Literal::String::Regex
71
+ rule %r(/\*), Literal::String::Regex, :multiline_comments
72
+ rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Integer # hex 0x...
73
+ rule /0b[01]+(?:_[01]+)*/, Num::Integer # binary 0b...
74
+ rule /0[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*x/, Num::Integer # hex 0...x
75
+ rule /0[01]+(?:_[01]+)*b/, Num::Integer # binary 0...b
76
+ rule /\d+\.\d+(e[\+\-]?\d+)?/, Num::Integer # real
77
+ rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Integer # octal
78
+ rule /[\d]+(?:_\d+)*/, Num::Integer # integer
79
+ rule /\b(?i:(all|except|export|group|import|keyed|wild|left|right|self|shared|skip|true|false))\b/, Name::Builtin
80
+ rule /\b(?i:(abs|acos|aggregate|allnodes|apply|ascii|asin|asstring|atan|atan2|ave|case|catch|choose|choosen|choosesets|clustersize|combine|correlation|cos|cosh|count|covariance|cron|dataset|dedup|define|denormalize|dictionary|distribute|distributed|distribution|ebcdic|enth|error|evaluate|event|eventextra|eventname|exists|exp|failcode|failmessage|fetch|fromunicode|fromxml|getenv|getisvalid|global|graph|group|hash|hash32|hash64|hashcrc|hashmd5|having|httpcall|httpheader|if|iff|index|intformat|isvalid|iterate|join|keyunicode|length|library|limit|ln|local|log|loop|map|matched|matchlength|matchposition|matchtext|matchunicode|max|merge|mergejoin|min|nofold|nolocal|nonempty|normalize|parse|pipe|power|preload|process|project|pull|random|range|rank|ranked|realformat|recordof|regexfind|regexreplace|regroup|rejected|rollup|round|roundup|row|rowdiff|sample|set|sin|sinh|sizeof|soapcall|sort|sorted|sqrt|stepped|stored|sum|table|tan|tanh|thisnode|topn|tounicode|toxml|transfer|transform|trim|truncate|typeof|ungroup|unicodeorder|variance|which|workunit|xmldecode|xmlencode|xmltext|xmlunicode))\b/, Keyword::Type
81
+ rule /\b(?i:(data|string|qstring|varstring|varunicode|unicode))\d+\b/, Name::Attribute
82
+ rule /\b(?i:(integer|unsigned))[1-8]\b/, Name::Attribute
83
+ rule /\b(?i:(ascii|big_endian|boolean|data|decimal|ebcdic|grouped|integer|linkcounted|pattern|qstring|real|record|rule|set of|streamed|string|token|udecimal|unicode|unsigned|varstring|varunicode))\b/, Name::Attribute
84
+ rule /\b(?i)(u?)decimal(\d+(_\d+)?)\b/, Name::Attribute
85
+ rule /\b(?i:(apply|assert|build|buildindex|evaluate|fail|keydiff|keypatch|loadxml|nothor|notify|output|parallel|sequential|soapcall|wait))\b/, Name::Class
86
+ rule /\b(?i:(import|as|checkpoint|deprecated|failcode|failmessage|failure|global|independent|onwarning|persist|priority|recovery|stored|success|wait|when))\b/, Name::Entity
87
+
80
88
  rule /'/, Str::Single, :single_string
81
89
  rule /"/, Name::Variable, :double_string
82
90
  rule /`/, Name::Variable, :backtick
83
91
 
84
- rule /(#)(?i)(\w+)/, Operator
92
+ rule /(#)(?i)(\w+)/, Generic::Subheading
85
93
 
86
94
  rule /([A-Za-z_]+)\s*(\()/ do |m|
87
95
  if !(self.class.keywords.include? m[1].upcase or self.class.builtins.include? m[1].upcase)
88
- token Name::Function
96
+ token Name::Function, m[1]
97
+ token Punctuation, m[2]
89
98
  end
90
99
  if self.class.keywords.include? m[1].upcase
91
- token Keyword
100
+ token Generic::Traceback
92
101
  end
93
102
  if self.class.builtins.include? m[1].upcase
94
- token Operator
103
+ token Name::Builtin
95
104
  end
96
105
  end
106
+ rule /[\$\w][\w\d]*/ do |m|
107
+
108
+ #rule for all remaining tokens assigning token Name for those not being a keyword
97
109
  rule /[\$\w][\w\d]*/ do |m|
98
110
  if self.class.keywords.include? m[0].upcase
99
- token Keyword
111
+ token Generic::Traceback
100
112
  else
101
113
  token Name
102
114
  end
103
115
  end
104
116
 
105
117
  rule %r([+*/<>=~!@#%^&|?^-]), Operator
106
- rule /[;:()\[\],.]/, Punctuation
118
+ rule /[;:{}()\[\],.]/, Punctuation
107
119
  end
108
120
 
109
121
  state :multiline_comments do
110
- rule %r(/[*]), Comment::Multiline, :multiline_comments
111
- rule %r([*]/), Comment::Multiline, :pop!
112
- rule %r([^/*]+), Comment::Multiline
113
- rule %r([/*]), Comment::Multiline
122
+ rule %r(/[*]), Literal::String::Regex, :multiline_comments
123
+ rule %r([*]/), Literal::String::Regex, :pop!
124
+ rule %r([^/*]+), Literal::String::Regex
125
+ rule %r([/*]), Literal::String::Regex
114
126
  end
115
127
 
116
128
  state :backtick do