brice 0.2.8 → 0.4.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 17a8fb5226397ca8922e81decc7ac9257a2f55b2
4
- data.tar.gz: b982e783401e4135050b3c9a050cb4a6886b4d36
2
+ SHA256:
3
+ metadata.gz: 36999aee54c54f1de81d06593f1038074c2b9726c8201752cb692ba28c33a411
4
+ data.tar.gz: 6dd8b2419fc5e1f0a3192ba5fb3273c1ab9c66f1136d12e27865f4ba0e8104db
5
5
  SHA512:
6
- metadata.gz: 3ea3bf6fdbd2e9e78a4d007d648e0bd708fdaed2738ffd335dd1c17a91552a84743b5c0cde32effe076c517844bf9ebbc9d23f87c002514398ffe1907c4f10e7
7
- data.tar.gz: 6e36c1b51e274c1b804cfbc0806530cb2aa0d80277248c723bfecaa54dd66a399ba1c0cd59fe95b999aeabf5f1b163f308ae8f9033e18df58ab238364845c225
6
+ metadata.gz: 9d00c57bd13955221544ae079b8fe8f62553419544c716f1492fab2a3850fe4d8a5f92716b9ab5adfecc9c37b78c3716d02ad40c5d438d709e3c71a3408c3670
7
+ data.tar.gz: 10ab3f892e919a92a29b32e5c4d2064bb3045ea375adfe74648642dbd35af9c0ac9101a754ec31285ca4aa26a1fc3caa766a0c74b5af3a1b1fa46206b1b21afe
data/ChangeLog CHANGED
@@ -1,5 +1,23 @@
1
+ # markup: rd
2
+
1
3
  = Revision history for brice
2
4
 
5
+ == 0.4.2 [2020-09-17]
6
+
7
+ * Ruby 2.7 compatibility.
8
+
9
+ == 0.4.1 [2016-03-29]
10
+
11
+ * To mark default packages as optional, use underscore in addition to question
12
+ mark, since the latter is not supported on Windows file systems (issue #10
13
+ by Hovis Biddle).
14
+
15
+ == 0.4.0 [2014-10-31]
16
+
17
+ * Require at least Ruby 1.9.3.
18
+ * Only set prompt if left at default.
19
+ * Default package +added_methods+ now optional.
20
+
3
21
  == 0.0.1 [2008-11-14]
4
22
 
5
23
  * Birthday :-)
data/README CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to brice version 0.2.8
5
+ This documentation refers to brice version 0.4.2
6
6
 
7
7
 
8
8
  == DESCRIPTION
@@ -15,12 +15,10 @@ in that regard.
15
15
 
16
16
  Add this to your <tt>~/.irbrc</tt> and receive the default goodness:
17
17
 
18
- require 'rubygems'
19
18
  require 'brice/init' # equivalent to: require 'brice'; Brice.init
20
19
 
21
20
  Or get some more control over the configuration:
22
21
 
23
- require 'rubygems'
24
22
  require 'brice'
25
23
 
26
24
  Brice.init { |config|
@@ -64,10 +62,10 @@ guaranteed to have any effect after <tt>Brice.init</tt> has been called.
64
62
 
65
63
  == LINKS
66
64
 
67
- <b></b>
68
- Documentation:: http://blackwinter.github.com/brice
69
- Source code:: http://github.com/blackwinter/brice
70
- RubyGem:: http://rubygems.org/gems/brice
65
+ Documentation:: https://blackwinter.github.com/brice
66
+ Source code:: https://github.com/blackwinter/brice
67
+ RubyGem:: https://rubygems.org/gems/brice
68
+ Travis CI:: https://travis-ci.org/blackwinter/brice
71
69
 
72
70
 
73
71
  == AUTHORS
@@ -77,7 +75,7 @@ RubyGem:: http://rubygems.org/gems/brice
77
75
 
78
76
  == LICENSE AND COPYRIGHT
79
77
 
80
- Copyright (C) 2008-2013 Jens Wille
78
+ Copyright (C) 2008-2020 Jens Wille
81
79
 
82
80
  brice is free software: you can redistribute it and/or modify it under the
83
81
  terms of the GNU Affero General Public License as published by the Free
data/Rakefile CHANGED
@@ -1,17 +1,20 @@
1
- require File.expand_path(%q{../lib/brice/version}, __FILE__)
1
+ require_relative 'lib/brice/version'
2
2
 
3
3
  begin
4
4
  require 'hen'
5
5
 
6
6
  Hen.lay! {{
7
- :gem => {
8
- :name => %q{brice},
9
- :version => Brice::VERSION,
10
- :summary => %q{Extra cool IRb goodness for the masses},
11
- :author => %q{Jens Wille},
12
- :email => %q{jens.wille@gmail.com},
13
- :homepage => :blackwinter,
14
- :dependencies => [['ruby-nuggets', '>= 0.5.2']]
7
+ gem: {
8
+ name: %q{brice},
9
+ version: Brice::VERSION,
10
+ summary: %q{Extra cool IRb goodness for the masses},
11
+ author: %q{Jens Wille},
12
+ email: %q{jens.wille@gmail.com},
13
+ license: %q{AGPL-3.0},
14
+ homepage: :blackwinter,
15
+ dependencies: { nuggets: '~> 1.6' },
16
+
17
+ required_ruby_version: '>= 1.9.3'
15
18
  }
16
19
  }}
17
20
  rescue LoadError => err
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # brice -- Extra cool IRb goodness for the masses #
5
5
  # #
6
- # Copyright (C) 2008-2013 Jens Wille #
6
+ # Copyright (C) 2008-2016 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -27,16 +27,11 @@
27
27
  require 'irb'
28
28
  require 'nuggets/env/user_home'
29
29
 
30
- require 'brice/version'
30
+ require_relative 'brice/dsl'
31
+ require_relative 'brice/version'
31
32
 
32
33
  module Brice
33
34
 
34
- autoload :Config, 'brice/config'
35
- autoload :Colours, 'brice/colours'
36
- autoload :DSL, 'brice/dsl'
37
- autoload :History, 'brice/history'
38
- autoload :Shortcuts, 'brice/shortcuts'
39
-
40
35
  RC_DIR = __FILE__.sub(/\.rb\z/, '/rc')
41
36
 
42
37
  BRICE_HOME = File.join(ENV.user_home, '.brice')
@@ -53,24 +48,25 @@ module Brice
53
48
 
54
49
  # call-seq:
55
50
  # Brice.init { |config| ... }
56
- # Brice.init(:verbose => true) { |config| ... }
51
+ # Brice.init(verbose: true) { |config| ... }
57
52
  #
58
53
  # Initialize Brice and optionally configure any packages.
59
54
  def init(options = {})
60
55
  @irb_rc = []
61
56
 
62
- @config = Config.new(rc_files(true).map { |rc|
63
- File.basename(rc, '.rb').sub(/\A\d+_/, '')
64
- })
65
-
66
57
  options.each { |key, value|
67
- if respond_to?(method = "#{key}=")
68
- send(method, value)
69
- else
70
- raise ArgumentError, "illegal option: #{key}"
71
- end
58
+ respond_to?(set = "#{key}=") ? send(set, value) :
59
+ raise(ArgumentError, "illegal option: #{key}")
72
60
  }
73
61
 
62
+ packages = rc_files(true).map { |rc|
63
+ File.basename(rc, '.rb').sub(/\A\d+_/, '')
64
+ }.reject { |rc| rc.end_with?('?') || rc.end_with?('_') }
65
+
66
+ warn "Default packages: #{packages.join(', ')}" if verbose
67
+
68
+ @config = Config.new(packages)
69
+
74
70
  yield config if block_given?
75
71
 
76
72
  load_rc_files(true)
@@ -85,11 +81,8 @@ module Brice
85
81
  # Set config to +config+. Raises a TypeError if +config+ is not a
86
82
  # Brice::Config.
87
83
  def config=(config)
88
- if config.is_a?(Config)
89
- @config = config
90
- else
91
- raise TypeError, "expected Brice::Config, got #{config.class}"
92
- end
84
+ config.is_a?(Config) ? @config = config :
85
+ raise(TypeError, "Brice::Config expected, got #{config.class}")
93
86
  end
94
87
 
95
88
  # call-seq:
@@ -127,7 +120,11 @@ module Brice
127
120
  # Returns the value of +opt+ at +key+ if present, or +default+
128
121
  # otherwise.
129
122
  def opt(opt, key, default = true)
130
- opt.is_a?(Hash) && opt.has_key?(key) ? opt[key] : default
123
+ opt.is_a?(Hash) && opt.key?(key) ? opt[key] : default
124
+ end
125
+
126
+ def error(obj, met, err)
127
+ warn "Error in #{obj}##{met}: #{err.backtrace.first}: #{err} (#{err.class})"
131
128
  end
132
129
 
133
130
  private
@@ -145,7 +142,7 @@ module Brice
145
142
  brice_load rc
146
143
  }
147
144
 
148
- include_custom_extensions ? res += load_custom_extensions : res
145
+ include_custom_extensions ? res + load_custom_extensions : res
149
146
  end
150
147
 
151
148
  # call-seq:
@@ -164,7 +161,7 @@ module Brice
164
161
  #
165
162
  # Find the actual extension files in +dir+.
166
163
  def find_rc_files(dir = RC_DIR)
167
- File.directory?(dir) ? Dir["#{dir}/*.rb"].sort : []
164
+ File.directory?(dir) ? Dir["#{dir}/**/*.rb"].sort : []
168
165
  end
169
166
 
170
167
  # call-seq:
@@ -178,3 +175,8 @@ module Brice
178
175
  end
179
176
 
180
177
  end
178
+
179
+ require_relative 'brice/config'
180
+ require_relative 'brice/colours'
181
+ require_relative 'brice/history'
182
+ require_relative 'brice/shortcuts'
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # A component of brice, the extra cool IRb goodness donator #
5
5
  # #
6
- # Copyright (C) 2008-2012 Jens Wille #
6
+ # Copyright (C) 2008-2014 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -24,15 +24,13 @@
24
24
  ###############################################################################
25
25
  #++
26
26
 
27
- require 'brice'
28
-
29
27
  module Brice
30
28
 
31
29
  # Add colour support to IRb.
32
30
  #
33
- # Set your own colours with <tt>config.colours.opt = { :colours => { ... } }</tt>
31
+ # Set your own colours with <tt>config.colours.opt = { colours: { ... } }</tt>
34
32
  # or modify the default scheme (DEFAULT_COLOURS) with <tt>config.colours.opt =
35
- # { :colours => Brice::Colours::DEFAULT_COLOURS.merge(...) }</tt>.
33
+ # { colours: Brice::Colours::DEFAULT_COLOURS.merge(...) }</tt>.
36
34
 
37
35
  module Colours
38
36
 
@@ -41,61 +39,63 @@ module Brice
41
39
  # Default IRb colour scheme.
42
40
  DEFAULT_COLOURS = {
43
41
  # delimiter colours
44
- :comma => :blue,
45
- :refers => :blue,
42
+ comma: :blue,
43
+ refers: :blue,
46
44
 
47
45
  # container colours (hash and array)
48
- :open_hash => :green,
49
- :close_hash => :green,
50
- :open_array => :green,
51
- :close_array => :green,
46
+ open_hash: :green,
47
+ close_hash: :green,
48
+ open_array: :green,
49
+ close_array: :green,
52
50
 
53
51
  # object colours
54
- :open_object => :light_red,
55
- :object_class => :white,
56
- :object_addr_prefix => :blue,
57
- :object_line_prefix => :blue,
58
- :close_object => :light_red,
52
+ open_object: :light_red,
53
+ object_class: :white,
54
+ object_addr_prefix: :blue,
55
+ object_line_prefix: :blue,
56
+ close_object: :light_red,
59
57
 
60
58
  # symbol colours
61
- :symbol => :yellow,
62
- :symbol_prefix => :yellow,
59
+ symbol: :yellow,
60
+ symbol_prefix: :yellow,
63
61
 
64
62
  # string colours
65
- :open_string => :red,
66
- :string => :cyan,
67
- :close_string => :red,
63
+ open_string: :red,
64
+ string: :cyan,
65
+ close_string: :red,
68
66
 
69
67
  # misc colours
70
- :number => :cyan,
71
- :keyword => :green,
72
- :class => :light_green,
73
- :range => :red,
74
- :unknown => :green
68
+ number: :cyan,
69
+ keyword: :green,
70
+ class: :light_green,
71
+ range: :red,
72
+ unknown: :green
75
73
  }
76
74
 
77
75
  # Fruity testing colours.
78
76
  TESTING_COLOURS = {
79
- :comma => :red,
80
- :refers => :red,
81
- :open_hash => :blue,
82
- :close_hash => :blue,
83
- :open_array => :green,
84
- :close_array => :green,
85
- :open_object => :light_red,
86
- :object_class => :light_green,
87
- :object_addr => :purple,
88
- :object_line => :light_purple,
89
- :close_object => :light_red,
90
- :symbol => :yellow,
91
- :symbol_prefix => :yellow,
92
- :number => :cyan,
93
- :string => :cyan,
94
- :keyword => :white,
95
- :range => :light_blue
77
+ comma: :red,
78
+ refers: :red,
79
+ open_hash: :blue,
80
+ close_hash: :blue,
81
+ open_array: :green,
82
+ close_array: :green,
83
+ open_object: :light_red,
84
+ object_class: :light_green,
85
+ object_addr: :purple,
86
+ object_line: :light_purple,
87
+ close_object: :light_red,
88
+ symbol: :yellow,
89
+ symbol_prefix: :yellow,
90
+ number: :cyan,
91
+ string: :cyan,
92
+ keyword: :white,
93
+ range: :light_blue
96
94
  }
97
95
 
98
96
  def init(opt = {})
97
+ require 'ripper'
98
+
99
99
  enable_irb if Brice.opt(opt, :irb, STDOUT.tty?)
100
100
  enable_pp if Brice.opt(opt, :pp, STDOUT.tty?)
101
101
 
@@ -109,51 +109,26 @@ module Brice
109
109
 
110
110
  # Enable colourized IRb results.
111
111
  def enable_irb
112
- if IRB.const_defined?(:Inspector)
113
- IRB::Inspector.class_eval {
114
- unless method_defined?(:inspect_value_with_colour)
115
- alias_method :inspect_value_without_colour, :inspect_value
116
-
117
- def inspect_value_with_colour(value)
118
- Colours.colourize(inspect_value_without_colour(value))
119
- end
120
- end
112
+ IRB::Inspector.class_eval {
113
+ unless method_defined?(:inspect_value_with_colour)
114
+ alias_method :inspect_value_without_colour, :inspect_value
121
115
 
122
- alias_method :inspect_value, :inspect_value_with_colour
123
- }
124
- else
125
- IRB::Irb.class_eval {
126
- unless method_defined?(:output_value_with_colour)
127
- alias_method :output_value_without_colour, :output_value
128
-
129
- def output_value_with_colour
130
- value = @context.last_value
131
- value = Colours.colourize(value.inspect) if @context.inspect?
132
-
133
- printf(@context.return_format, value)
134
- end
116
+ def inspect_value_with_colour(value)
117
+ Colours.colourize(inspect_value_without_colour(value))
135
118
  end
119
+ end
136
120
 
137
- alias_method :output_value, :output_value_with_colour
138
- }
139
- end
121
+ alias_method :inspect_value, :inspect_value_with_colour
122
+ }
140
123
  end
141
124
 
142
125
  # Disable colourized IRb results.
143
126
  def disable_irb
144
- if IRB.const_defined?(:Inspector)
145
- IRB::Inspector.class_eval {
146
- if method_defined?(:inspect_value_without_colour)
147
- alias_method :inspect_value, :inspect_value_without_colour
148
- end
149
- }
150
- else
151
- IRB::Irb.class_eval {
152
- if method_defined?(:output_value_without_colour)
153
- alias_method :output_value, :output_value_without_colour
154
- end
155
- }
156
- end
127
+ IRB::Inspector.class_eval {
128
+ if method_defined?(:inspect_value_without_colour)
129
+ alias_method :inspect_value, :inspect_value_without_colour
130
+ end
131
+ }
157
132
  end
158
133
 
159
134
  def enable_pp
@@ -215,14 +190,11 @@ module Brice
215
190
 
216
191
  # Colourize the results of inspect
217
192
  def colourize(str)
218
- res = ''
219
-
220
- Tokenizer.tokenize(str) { |token, value|
193
+ ''.tap { |res| Tokenizer.tokenize(str.to_s) { |token, value|
221
194
  res << colourize_string(value, colours[token])
222
- }
223
-
224
- res
225
- rescue
195
+ } }
196
+ rescue => err
197
+ Brice.error(self, __method__, err)
226
198
  str
227
199
  end
228
200
 
@@ -233,28 +205,28 @@ module Brice
233
205
  extend self
234
206
 
235
207
  COLOURS = {
236
- :reset => '0;0',
237
- :black => '0;30',
238
- :red => '0;31',
239
- :green => '0;32',
240
- :brown => '0;33',
241
- :blue => '0;34',
242
- :cyan => '0;36',
243
- :purple => '0;35',
244
- :light_gray => '0;37',
245
- :dark_gray => '1;30',
246
- :light_red => '1;31',
247
- :light_green => '1;32',
248
- :yellow => '1;33',
249
- :light_blue => '1;34',
250
- :light_cyan => '1;36',
251
- :light_purple => '1;35',
252
- :white => '1;37'
208
+ reset: '0;0',
209
+ black: '0;30',
210
+ red: '0;31',
211
+ green: '0;32',
212
+ brown: '0;33',
213
+ blue: '0;34',
214
+ cyan: '0;36',
215
+ purple: '0;35',
216
+ light_gray: '0;37',
217
+ dark_gray: '1;30',
218
+ light_red: '1;31',
219
+ light_green: '1;32',
220
+ yellow: '1;33',
221
+ light_blue: '1;34',
222
+ light_cyan: '1;36',
223
+ light_purple: '1;35',
224
+ white: '1;37'
253
225
  }
254
226
 
255
227
  # Return the escape code for a given colour.
256
228
  def escape(key)
257
- "\033[#{COLOURS[key]}m" if COLOURS.has_key?(key)
229
+ "\033[#{COLOURS[key]}m" if COLOURS.key?(key)
258
230
  end
259
231
 
260
232
  alias_method :[], :escape
@@ -263,144 +235,174 @@ module Brice
263
235
 
264
236
  # Tokenize an inspection string.
265
237
 
266
- module Tokenizer
238
+ class Tokenizer
239
+
240
+ EVENT_MAP = {
241
+ # on_CHAR: :unknown,
242
+ # on___end__: :unknown,
243
+ # on_backref: :unknown,
244
+ # on_backtick: :unknown,
245
+ on_comma: :comma,
246
+ on_comment: :unknown,
247
+ on_const: :class,
248
+ # on_cvar: :unknown,
249
+ # on_embdoc: :unknown,
250
+ # on_embdoc_beg: :unknown,
251
+ # on_embdoc_end: :unknown,
252
+ # on_embexpr_beg: :unknown,
253
+ # on_embexpr_end: :unknown,
254
+ # on_embvar: :unknown,
255
+ on_float: :number,
256
+ # on_gvar: :unknown,
257
+ # on_heredoc_beg: :unknown,
258
+ # on_heredoc_end: :unknown,
259
+ on_ident: :symbol,
260
+ # on_ignored_nl: :unknown,
261
+ on_imaginary: :number,
262
+ on_int: :number,
263
+ # on_ivar: :unknown,
264
+ on_kw: :keyword,
265
+ on_label: :unknown,
266
+ on_lbrace: :open_hash,
267
+ on_lbracket: :open_array,
268
+ on_lparen: :unknown,
269
+ # on_nl: :unknown,
270
+ on_op: :refers,
271
+ on_period: :comma,
272
+ # on_qsymbols_beg: :unknown,
273
+ # on_qwords_beg: :unknown,
274
+ on_rational: :number,
275
+ on_rbrace: :close_hash,
276
+ on_rbracket: :close_array,
277
+ on_regexp_beg: :unknown,
278
+ on_regexp_end: :unknown,
279
+ on_rparen: :unknown,
280
+ on_semicolon: :comma,
281
+ on_sp: :whitespace,
282
+ on_symbeg: :symbol_prefix,
283
+ # on_symbols_beg: :unknown,
284
+ # on_tlambda: :unknown,
285
+ # on_tlambeg: :unknown,
286
+ on_tstring_beg: :open_string,
287
+ on_tstring_content: :string,
288
+ on_tstring_end: :close_string,
289
+ # on_words_beg: :unknown,
290
+ # on_words_sep: :unknown
291
+ }
267
292
 
268
- extend self
293
+ OBJECT_RE = %r{
294
+ \A
295
+ ( \#< )
296
+ ( .+ )
297
+ ( > )
298
+ \z
299
+ }x
300
+
301
+ OBJECT_CLASS_RE = %r{
302
+ \A
303
+ (?: \w | :: )+
304
+ }x
305
+
306
+ OBJECT_ADDR_RE = %r{
307
+ \A
308
+ ( : )
309
+ ( 0x [\hx]+ )
310
+ (?= \s | \z )
311
+ }x
312
+
313
+ IVAR_RE = %r{
314
+ \A
315
+ ( @ )
316
+ ( .+ )
317
+ \z
318
+ }x
319
+
320
+ RANGE_RE = %r{
321
+ \A
322
+ \.+
323
+ \z
324
+ }x
325
+
326
+ def self.tokenize(str, &block)
327
+ new(&block).tokenize(str)
328
+ end
329
+
330
+ def initialize(&block)
331
+ @block = block or raise ArgumentError, 'no block given'
332
+ end
333
+
334
+ attr_reader :block
269
335
 
270
336
  def tokenize(str)
271
- raise ArgumentError, 'no block given' unless block_given?
337
+ return if str.empty?
338
+ return if enc_event(str)
272
339
 
273
- chars = str.split(//)
274
- char = last_char = repeat = nil
275
- states, value, index = [], '', 0
340
+ lex, prev = Ripper.lex(str), nil
276
341
 
277
- reset = lambda { |*args|
278
- states.pop
342
+ len = lex[-1][0][-1] + lex[-1][-1].bytesize
343
+ str, rest = str.byteslice(0, len), str.byteslice(len .. -1)
279
344
 
280
- value = ''
281
- repeat = args.first unless args.empty?
282
- }
345
+ return block[:unknown, rest] if str.empty?
346
+
347
+ lex.each { |_, event, tok|
348
+ sym_event(event, tok, prev) ||
349
+ obj_event(event, tok) ||
350
+ rng_event(event, tok) ||
351
+ var_event(event, tok) ||
352
+ map_event(event, tok)
283
353
 
284
- yield_last = lambda { |*args|
285
- yield states.last, value
286
- reset[*args]
354
+ prev = event
287
355
  }
288
356
 
289
- until index > chars.size
290
- char, repeat = chars[index], false
291
-
292
- case states.last
293
- when nil
294
- case char
295
- when ':' then states << :symbol
296
- when '"' then states << :string
297
- when '#' then states << :object
298
- when /[a-z]/i
299
- states << :keyword
300
- repeat = true
301
- when /[0-9-]/
302
- states << :number
303
- repeat = true
304
- when '{' then yield :open_hash, '{'
305
- when '[' then yield :open_array, '['
306
- when ']' then yield :close_array, ']'
307
- when '}' then yield :close_hash, '}'
308
- when /\s/ then yield :whitespace, char
309
- when ',' then yield :comma, ','
310
- when '>' then yield :refers, '=>' if last_char == '='
311
- when '.' then yield :range, '..' if last_char == '.'
312
- when '=' then nil
313
- else yield :unknown, char
314
- end
315
- when :symbol
316
- if char =~ /[a-z0-9_!?]/ # should have =, but that messes up foo=>bar
317
- value << char
318
- else
319
- yield :symbol_prefix, ':'
320
- yield_last[true]
321
- end
322
- when :string
323
- if char == '"'
324
- if last_char == '\\'
325
- value[-1] = char
326
- else
327
- yield :open_string, char
328
- yield_last[]
329
- yield :close_string, char
330
- end
331
- else
332
- value << char
333
- end
334
- when :keyword
335
- if char =~ /[a-z0-9_]/i
336
- value << char
337
- else
338
- states[-1] = :class if value =~ /\A[A-Z]/
339
- yield_last[true]
340
-
341
- value << char if char == '.'
342
- end
343
- when :number
344
- case char
345
- when /[0-9e-]/
346
- value << char
347
- when '.'
348
- if last_char == char
349
- value.chop!
350
-
351
- yield_last[]
352
- yield :range, '..'
353
- else
354
- value << char
355
- end
356
- else
357
- yield_last[true]
358
- end
359
- when :object
360
- case char
361
- when '<'
362
- yield :open_object, '#<'
363
- states << :object_class
364
- when ':'
365
- states << :object_addr
366
- when '@'
367
- states << :object_line
368
- when '>'
369
- yield :close_object, '>'
370
- reset[]
371
- end
372
- when :object_class
373
- if char == ':'
374
- yield_last[true]
375
- else
376
- value << char
377
- end
378
- when :object_addr
379
- case char
380
- when '>'
381
- # ignore
382
- when '@'
383
- yield :object_addr_prefix, ':'
384
- yield_last[true]
385
- else
386
- value << char
387
- end
388
- when :object_line
389
- if char == '>'
390
- yield :object_line_prefix, '@'
391
- yield_last[true]
392
- else
393
- value << char
394
- end
395
- else
396
- raise "unknown state: #{states}"
397
- end
357
+ tokenize(rest)
358
+ end
359
+
360
+ private
361
+
362
+ def enc_event(str) # XXX /\A\s*#.*?coding\s*:\s*./
363
+ object($1, $2, $3) if str =~ OBJECT_RE && str.include?('coding')
364
+ end
365
+
366
+ def obj_event(event, tok)
367
+ object($1, $2, $3) if event == :on_comment && tok =~ OBJECT_RE
368
+ end
369
+
370
+ def sym_event(event, tok, prev)
371
+ block[:symbol, tok] if event == :on_kw && prev == :on_symbeg
372
+ end
398
373
 
399
- unless repeat
400
- index += 1
401
- last_char = char
374
+ def rng_event(event, tok)
375
+ block[:range, tok] if event == :on_op && tok =~ RANGE_RE
376
+ end
377
+
378
+ def var_event(event, tok)
379
+ if event == :on_ivar && tok =~ IVAR_RE
380
+ block[:object_line_prefix, $1]
381
+ block[:keyword, $2]
382
+ end
383
+ end
384
+
385
+ def map_event(event, tok)
386
+ block[EVENT_MAP[event], tok]
387
+ end
388
+
389
+ def object(open, str, close)
390
+ block[:open_object, open]
391
+
392
+ if str.sub!(OBJECT_CLASS_RE, '')
393
+ block[:object_class, $&]
394
+
395
+ if str.sub!(OBJECT_ADDR_RE, '')
396
+ block[:object_addr_prefix, $1]
397
+ block[:object_addr, $2]
398
+
399
+ str = tokenize(str)
402
400
  end
403
401
  end
402
+
403
+ block[:unknown, str] if str
404
+
405
+ block[:close_object, close]
404
406
  end
405
407
 
406
408
  end