radius 0.6.1 → 0.7.0.prerelease

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 (43) hide show
  1. data/CHANGELOG +21 -12
  2. data/LICENSE +19 -0
  3. data/QUICKSTART.rdoc +7 -7
  4. data/README.rdoc +10 -28
  5. data/Rakefile +8 -31
  6. data/VERSION +1 -0
  7. data/lib/radius.rb +3 -2
  8. data/lib/radius/context.rb +21 -13
  9. data/lib/radius/delegating_open_struct.rb +6 -0
  10. data/lib/radius/ord_string.rb +13 -0
  11. data/lib/radius/parse_tag.rb +1 -1
  12. data/lib/radius/parser.rb +25 -11
  13. data/lib/radius/parser/JavaScanner$Flavor.class +0 -0
  14. data/lib/radius/parser/JavaScanner$Tag.class +0 -0
  15. data/lib/radius/parser/JavaScanner.class +0 -0
  16. data/lib/radius/parser/JavaScanner.java +634 -0
  17. data/lib/radius/parser/JavaScanner.rl +179 -0
  18. data/lib/radius/parser/java_scanner.jar +0 -0
  19. data/lib/radius/parser/scanner.rb +1255 -0
  20. data/lib/radius/parser/{scan.rl → scanner.rl} +6 -4
  21. data/lib/radius/parser/squiggle_scanner.rb +1238 -0
  22. data/lib/radius/parser/squiggle_scanner.rl +126 -0
  23. data/lib/radius/utility.rb +10 -0
  24. data/lib/radius/version.rb +6 -12
  25. data/tasks/jeweler.rake +22 -0
  26. data/tasks/rdoc.rake +13 -0
  27. data/tasks/rubinius.rake +4 -0
  28. data/tasks/scan.rake +64 -12
  29. data/tasks/test.rake +7 -0
  30. data/test/benchmarks.rb +35 -0
  31. data/test/context_test.rb +2 -2
  32. data/test/multithreaded_test.rb +63 -0
  33. data/test/ord_string_test.rb +18 -0
  34. data/test/parser_test.rb +21 -4
  35. data/test/quickstart_test.rb +9 -11
  36. data/test/squiggle_test.rb +281 -0
  37. data/test/test_helper.rb +10 -2
  38. data/test/utility_test.rb +30 -0
  39. metadata +67 -64
  40. data.tar.gz.sig +0 -0
  41. data/Manifest.txt +0 -21
  42. data/lib/radius/parser/scan.rb +0 -700
  43. metadata.gz.sig +0 -0
data/CHANGELOG CHANGED
@@ -1,20 +1,29 @@
1
1
  = Change Log
2
- === 0.6.1
3
- * Fixed a problem with non-tags that have no prefix or tagname (see test_parse_chirpy_bird)
4
2
 
5
- === 0.6.0
3
+ == edge
4
+ * Support for Rubinius [jlong]
5
+ * Support for Ruby 1.9 [aemadrid]
6
+ * More tests [aemadrid]
7
+ * Fixed issue #5 - problem with other namespace tags [jemmyw]
8
+ * Switched to Jeweler for better gem management [jlong]
9
+ * Allow operation in a threaded environment (parser per-thread, shared context)
10
+ * Allow switching scanners that tokenize templates.
11
+ * Include SquiggleScanner to parse tags that look like "{ hello /}"
12
+
13
+ == 0.6.1
14
+ * Fixed a problem with non-tags that have no prefix or tag name (see test_parse_chirpy_bird)
15
+
16
+ == 0.6.0 (private release)
6
17
  * Split radius.rb into multiple files.
7
- * Port the really hairy regexes from Radius::Parser to a single Ragel machine.
18
+ * Ported the really hairy regexes from Radius::Parser to a single Ragel machine.
8
19
  * Added and refactored tests.
9
20
  * Refactored Rakefile and other administrativia.
10
21
 
11
- === 0.5.1
12
- * Fixed a problem with parsing quotes where a single tag preceding a double tag would consume the start
13
- tag of the double tag if both contained attributes.
22
+ == 0.5.1
23
+ * Fixed a problem with parsing quotes where a single tag preceding a double tag would consume the start tag of the double tag if both contained attributes.
14
24
 
15
- === 0.5.0
16
- * Created a DSL for tag definitions (introducing a DSL makes this version of Radiant incompatible with
17
- the last). The DSL has the following features:
25
+ == 0.5.0
26
+ * Created a DSL for tag definitions (introducing a DSL makes this version of Radiant incompatible with the last). The DSL has the following features:
18
27
  - full support for nested tags
19
28
  - global and local tag variables
20
29
  - Contexts can now be defined dynamically (instead of being subclassed)
@@ -24,10 +33,10 @@
24
33
  * Updated documentation to reflect the changes.
25
34
  * Updated the version number to reflect the maturity of the code base.
26
35
 
27
- === 0.0.2
36
+ == 0.0.2
28
37
  * Refactored Parser to use Context#render_tag instead of #send when rendering tags defined on a Context.
29
38
  * UndefinedTagError is now thrown when Parser tries to render a tag which doesn't exist on a Context.
30
39
  * Added Context#tag_missing which works like method_method missing on Object, but is tag specific.
31
40
 
32
- === 0.0.1
41
+ == 0.0.1
33
42
  * First release.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2006-2010, John W. Long
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -256,8 +256,8 @@ tags to redefine variables. This is valuable when defining context sensitive tag
256
256
  parser.parse('<r:name />') # raises a Radius::UndefinedTagError exception
257
257
 
258
258
  Notice how TagBinding#locals enables intelligent nesting. "<r:jill:name />" evaluates to
259
- "Jill", but "<r:jill:friend:name />" evaluates to "Jack". Locals loose scope as soon as
260
- the tag they were defined in closes. Globals on the other hand, never loose scope.
259
+ "Jill", but "<r:jill:friend:name />" evaluates to "Jack". Locals lose scope as soon as
260
+ the tag they were defined in closes. Globals on the other hand, never lose scope.
261
261
 
262
262
  The final line in the example above demonstrates that calling "<r:name />" raises a
263
263
  TagMissing error. This is because of the way the name tag was defined:
@@ -315,8 +315,8 @@ specificity a tag could be assigned would be:
315
315
 
316
316
  One point for each of the levels.
317
317
 
318
- A deep understanding of tag specificity is not necessary to be effective with
319
- Radius. For the most part you will find that Radius resolves tags precisely the
320
- way that you would expect. If you find this section confusing forget about it and
321
- refer back to it if you find that tags are resolving differently from the way that
322
- you expected.
318
+ In practice, you don't need to understand this topic to be effective with Radius.
319
+ For the most part you will find that Radius resolves tags precisely the way that
320
+ you would expect. If you find this section confusing forget about it and refer
321
+ back to it if you find that tags are resolving differently from the way that you
322
+ expected.
@@ -1,9 +1,10 @@
1
1
  = Radius -- Powerful Tag-Based Templates
2
2
 
3
- Radius is a powerful tag-based template language for Ruby inspired by the template languages
4
- used in MovableType[http://www.movabletype.org] and TextPattern[http://www.textpattern.com].
5
- It uses tags similar to XML, but can be used to generate any form of plain text (HTML, e-mail,
6
- etc...).
3
+ Radius is a powerful tag-based template language for Ruby inspired by the
4
+ template languages used in MovableType[http://www.movabletype.org] and
5
+ TextPattern[http://www.textpattern.com]. It uses tags similar to XML, but can
6
+ be used to generate any form of plain text (HTML, e-mail, etc...).
7
+
7
8
 
8
9
  == Usage
9
10
 
@@ -44,7 +45,7 @@ Output:
44
45
  Read the QUICKSTART file to get up and running with Radius.
45
46
 
46
47
 
47
- = Requirements
48
+ == Requirements
48
49
 
49
50
  Radius does not have any external requirements for using the library in your
50
51
  own programs.
@@ -60,30 +61,11 @@ It is recommended that you install Radius using the RubyGems packaging system:
60
61
 
61
62
  % gem install --remote radius
62
63
 
63
- You can also install Radius by copying lib/radius.rb into the Ruby load path.
64
-
65
64
 
66
65
  == License
67
66
 
68
- Radius is free software and may be redistributed under the terms of the MIT-LICENSE:
69
-
70
- Copyright (c) 2006-2009, John W. Long
71
-
72
- Permission is hereby granted, free of charge, to any person obtaining a copy of this
73
- software and associated documentation files (the "Software"), to deal in the Software
74
- without restriction, including without limitation the rights to use, copy, modify, merge,
75
- publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
76
- to whom the Software is furnished to do so, subject to the following conditions:
77
-
78
- The above copyright notice and this permission notice shall be included in all copies or
79
- substantial portions of the Software.
80
-
81
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
82
- INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
83
- PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
84
- FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
85
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
86
- DEALINGS IN THE SOFTWARE.
67
+ Radius is released under the MIT license and is copyright (c) 2006-2010
68
+ John W. Long. A copy of the MIT license can be found in the LICENSE file.
87
69
 
88
70
 
89
71
  == Roadmap
@@ -110,9 +92,9 @@ Experimental and development versions of Radius can be found on Github:
110
92
 
111
93
  http://github.com/jlong/radius
112
94
 
113
- If you are interested in helping with the development of Radiant, feel free to
95
+ If you are interested in helping with the development of Radius, feel free to
114
96
  fork the project on GitHub and send me a pull request.
115
97
 
116
98
 
117
99
  John Long ::
118
- http://wiseheartdesign.com
100
+ http://wiseheartdesign.com
data/Rakefile CHANGED
@@ -1,31 +1,8 @@
1
- %w(rubygems rake rake/clean fileutils newgem rubigen hoe).each { |f| require f }
2
-
3
- require 'lib/radius/version'
4
-
5
- # Generate all the Rake tasks
6
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
7
- Hoe.spec 'radius' do |p|
8
- p.version = Radius::Version.to_s
9
- p.url = "http://radius.rubyforge.org"
10
- p.developer('John W. Long', 'me@johnwlong.com')
11
- p.author = [
12
- "John W. Long (me@johnwlong.com)",
13
- "David Chelimsky (dchelimsky@gmail.com)",
14
- "Bryce Kerley (bkerley@brycekerley.net)"
15
- ]
16
- p.changes = p.paragraphs_of("CHANGELOG", 1..2).join("\n\n")
17
- p.rubyforge_name = p.name
18
- p.extra_dev_deps = [
19
- ['newgem', ">= #{::Newgem::VERSION}"]
20
- ]
21
- p.readme_file = 'README.rdoc'
22
- p.extra_rdoc_files |= %w(README.rdoc QUICKSTART.rdoc)
23
- p.clean_globs |= %w(**/.DS_Store tmp *.log) # Remove these files on "rake clean"
24
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
25
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
26
- p.rsync_args = '-av --delete --ignore-errors'
27
- p.test_globs = "test/**/*_test.rb"
28
- end
29
-
30
- require 'newgem/tasks' # load /tasks/*.rake
31
- Dir['tasks/**/*.rake'].each { |t| load t }
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ require File.dirname(__FILE__) + '/lib/radius/version'
5
+
6
+ Dir['tasks/**/*.rake'].each { |t| load t }
7
+
8
+ task :default => :test
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.7.0.prerelease
@@ -5,6 +5,7 @@ require 'radius/delegating_open_struct'
5
5
  require 'radius/tag_binding'
6
6
  require 'radius/context'
7
7
  require 'radius/parse_tag'
8
- require 'radius/parser/scan'
8
+ require 'radius/ord_string'
9
+ require 'radius/parser/scanner'
9
10
  require 'radius/parser'
10
- require 'radius/utility'
11
+ require 'radius/utility'
@@ -7,8 +7,8 @@ module Radius
7
7
  class Context
8
8
  # A hash of tag definition blocks that define tags accessible on a Context.
9
9
  attr_accessor :definitions # :nodoc:
10
- attr_accessor :globals # :nodoc:
11
-
10
+ attr_accessor :globals # :nodoc:
11
+
12
12
  # Creates a new Context object.
13
13
  def initialize(&block)
14
14
  @definitions = {}
@@ -16,8 +16,8 @@ module Radius
16
16
  @globals = DelegatingOpenStruct.new
17
17
  with(&block) if block_given?
18
18
  end
19
-
20
- # Yeild an instance of self for tag definitions:
19
+
20
+ # Yield an instance of self for tag definitions:
21
21
  #
22
22
  # context.with do |c|
23
23
  # c.define_tag 'test' do
@@ -29,10 +29,10 @@ module Radius
29
29
  yield self
30
30
  self
31
31
  end
32
-
32
+
33
33
  # Creates a tag definition on a context. Several options are available to you
34
34
  # when creating a tag:
35
- #
35
+ #
36
36
  # +for+:: Specifies an object that the tag is in reference to. This is
37
37
  # applicable when a block is not passed to the tag, or when the
38
38
  # +expose+ option is also used.
@@ -66,27 +66,35 @@ module Radius
66
66
  end
67
67
  end
68
68
  end
69
-
69
+
70
70
  # Like method_missing for objects, but fired when a tag is undefined.
71
71
  # Override in your own Context to change what happens when a tag is
72
72
  # undefined. By default this method raises an UndefinedTagError.
73
73
  def tag_missing(name, attributes, &block)
74
74
  raise UndefinedTagError.new(name)
75
75
  end
76
-
76
+
77
77
  # Returns the state of the current render stack. Useful from inside
78
78
  # a tag definition. Normally just use TagBinding#nesting.
79
79
  def current_nesting
80
80
  @tag_binding_stack.collect { |tag| tag.name }.join(':')
81
81
  end
82
-
82
+
83
+ # make a usable copy of this context
84
+ def dup # :nodoc:
85
+ rv = self.class.new
86
+ rv.globals = globals.dup
87
+ rv.definitions = definitions.dup
88
+ rv
89
+ end
90
+
83
91
  private
84
-
92
+
85
93
  # A convienence method for managing the various parts of the
86
94
  # tag binding stack.
87
95
  def stack(name, attributes, block)
88
96
  previous = @tag_binding_stack.last
89
- previous_locals = previous.nil? ? @globals : previous.locals
97
+ previous_locals = previous.nil? ? globals : previous.locals
90
98
  locals = DelegatingOpenStruct.new(previous_locals)
91
99
  binding = TagBinding.new(self, locals, name, attributes, block)
92
100
  @tag_binding_stack.push(binding)
@@ -94,7 +102,7 @@ module Radius
94
102
  @tag_binding_stack.pop
95
103
  result
96
104
  end
97
-
105
+
98
106
  # Returns a fully qualified tag name based on state of the
99
107
  # tag binding stack.
100
108
  def qualified_tag_name(name)
@@ -114,7 +122,7 @@ module Radius
114
122
  specific_name
115
123
  end
116
124
  end
117
-
125
+
118
126
  # Returns the specificity for +tag_name+ at nesting defined
119
127
  # by +nesting_parts+ as a number.
120
128
  def numeric_specificity(tag_name, nesting_parts)
@@ -6,6 +6,12 @@ module Radius
6
6
  @object = object
7
7
  @hash = {}
8
8
  end
9
+
10
+ def dup
11
+ rv = self.class.new
12
+ rv.instance_variable_set(:@hash, @hash.dup)
13
+ rv
14
+ end
9
15
 
10
16
  def method_missing(method, *args, &block)
11
17
  symbol = (method.to_s =~ /^(.*?)=$/) ? $1.intern : method
@@ -0,0 +1,13 @@
1
+ module Radius
2
+ class OrdString < String
3
+ if RUBY_VERSION[0,3] == '1.9'
4
+ def [](*args)
5
+ if args.size == 1 && args.first.is_a?(Integer)
6
+ slice(args.first).ord
7
+ else
8
+ super
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -9,7 +9,7 @@ module Radius
9
9
  end
10
10
 
11
11
  def to_s
12
- @block.call(self)
12
+ @block.call(self) if @block
13
13
  end
14
14
  end
15
15
 
@@ -7,34 +7,37 @@ module Radius
7
7
  class Parser
8
8
  # The Context object used to expand template tags.
9
9
  attr_accessor :context
10
-
10
+
11
11
  # The string that prefixes all tags that are expanded by a parser
12
12
  # (the part in the tag name before the first colon).
13
13
  attr_accessor :tag_prefix
14
+
15
+ # The class that performs tokenization of the input string
16
+ attr_accessor :scanner
14
17
 
15
18
  # Creates a new parser object initialized with a Context.
16
19
  def initialize(context = Context.new, options = {})
17
20
  if context.kind_of?(Hash) and options.empty?
18
- options = context
19
- context = options[:context] || options['context'] || Context.new
21
+ options, context = context, (context[:context] || context['context'])
20
22
  end
21
23
  options = Utility.symbolize_keys(options)
22
- @context = context
23
- @tag_prefix = options[:tag_prefix] || 'radius'
24
+ self.context = context ? context.dup : Context.new
25
+ self.tag_prefix = options[:tag_prefix] || 'radius'
26
+ self.scanner = options[:scanner] || default_scanner
24
27
  end
25
-
28
+
26
29
  # Parses string for tags, expands them, and returns the result.
27
30
  def parse(string)
28
- @stack = [ParseContainerTag.new { |t| t.contents.to_s }]
31
+ @stack = [ ParseContainerTag.new { |t| Utility.array_to_s(t.contents) } ]
29
32
  tokenize(string)
30
33
  stack_up
31
34
  @stack.last.to_s
32
35
  end
33
-
36
+
34
37
  protected
35
38
  # Convert the string into a list of text blocks and scanners (tokens)
36
39
  def tokenize(string)
37
- @tokens = Scanner::operate(tag_prefix, string)
40
+ @tokens = scanner.operate(tag_prefix, string)
38
41
  end
39
42
 
40
43
  def stack_up
@@ -51,7 +54,7 @@ module Radius
51
54
  when :close
52
55
  popped = @stack.pop
53
56
  raise WrongEndTagError.new(popped.name, t[:name], @stack) if popped.name != t[:name]
54
- popped.on_parse { |b| @context.render_tag(popped.name, popped.attributes) { b.contents.to_s } }
57
+ popped.on_parse { |b| @context.render_tag(popped.name, popped.attributes) { Utility.array_to_s(b.contents) } }
55
58
  @stack.last.contents << popped
56
59
  when :tasteless
57
60
  raise TastelessTagError.new(t, @stack)
@@ -61,5 +64,16 @@ module Radius
61
64
  end
62
65
  raise MissingEndTagError.new(@stack.last.name, @stack) if @stack.length != 1
63
66
  end
67
+
68
+ def default_scanner
69
+ if RUBY_PLATFORM == 'java'
70
+ require 'java'
71
+ require 'radius/parser/java_scanner.jar'
72
+ ::Radius.send(:include_package, 'radius.parser')
73
+ Radius::JavaScanner.new(JRuby.runtime)
74
+ else
75
+ Radius::Scanner.new
76
+ end
77
+ end
64
78
  end
65
- end
79
+ end
@@ -0,0 +1,634 @@
1
+
2
+ // line 1 "JavaScanner.rl"
3
+
4
+ // line 84 "JavaScanner.rl"
5
+
6
+
7
+ package radius.parser;
8
+
9
+ import java.util.HashMap;
10
+ import java.util.LinkedList;
11
+ import org.jruby.Ruby; // runtime
12
+ import org.jruby.RubyObject;
13
+ import org.jruby.runtime.builtin.IRubyObject;
14
+ import org.jruby.RubyArray;
15
+ import org.jruby.RubyString;
16
+ import org.jruby.RubyHash;
17
+ import org.jruby.RubySymbol;
18
+
19
+ public class JavaScanner {
20
+
21
+ Ruby runtime = null;
22
+ RubyArray rv = null;
23
+
24
+ void pass_through(String str) {
25
+ RubyObject last = ((RubyObject)rv.last());
26
+ if ( rv.size() > 0 && last != null && (last instanceof RubyString) ){
27
+ // XXX concat changes for ruby 1.9
28
+ ((RubyString) last).concat(RubyString.newString(runtime, str));
29
+ } else {
30
+ rv.append(RubyString.newString(runtime, str));
31
+ }
32
+ }
33
+
34
+ void tag(String prefix, String name, RubyHash attr, RubySymbol flavor) {
35
+ RubyHash tag = RubyHash.newHash(runtime);
36
+ tag.op_aset(
37
+ runtime.getCurrentContext(),
38
+ RubySymbol.newSymbol(runtime, "prefix"),
39
+ RubyString.newString(runtime, prefix)
40
+ );
41
+ tag.op_aset(
42
+ runtime.getCurrentContext(),
43
+ RubySymbol.newSymbol(runtime, "name"),
44
+ RubyString.newString(runtime, name)
45
+ );
46
+ tag.op_aset(
47
+ runtime.getCurrentContext(),
48
+ RubySymbol.newSymbol(runtime, "attrs"),
49
+ attr
50
+ );
51
+ tag.op_aset(
52
+ runtime.getCurrentContext(),
53
+ RubySymbol.newSymbol(runtime, "flavor"),
54
+ flavor
55
+ );
56
+ rv.append(tag);
57
+ }
58
+
59
+ public JavaScanner(Ruby runtime) {
60
+ this.runtime = runtime;
61
+ }
62
+
63
+
64
+ // line 65 "JavaScanner.java"
65
+ private static byte[] init__parser_actions_0()
66
+ {
67
+ return new byte [] {
68
+ 0, 1, 0, 1, 3, 1, 4, 1, 5, 1, 6, 1,
69
+ 7, 1, 8, 1, 9, 1, 10, 1, 14, 1, 15, 1,
70
+ 19, 1, 21, 1, 22, 1, 23, 2, 1, 2, 2, 5,
71
+ 6, 2, 6, 7, 2, 9, 5, 2, 9, 10, 2, 10,
72
+ 9, 2, 11, 20, 2, 12, 20, 2, 13, 20, 2, 16,
73
+ 17, 2, 16, 18, 3, 5, 6, 7, 3, 9, 5, 6,
74
+ 3, 16, 6, 17, 4, 9, 5, 6, 7, 4, 16, 5,
75
+ 6, 17, 5, 16, 9, 5, 6, 17
76
+ };
77
+ }
78
+
79
+ private static final byte _parser_actions[] = init__parser_actions_0();
80
+
81
+
82
+ private static short[] init__parser_key_offsets_0()
83
+ {
84
+ return new short [] {
85
+ 0, 0, 11, 21, 34, 47, 61, 65, 70, 72, 74, 87,
86
+ 100, 101, 103, 118, 133, 149, 155, 161, 176, 179, 182, 185,
87
+ 200, 202, 204, 219, 235, 241, 247, 250, 253, 269, 285, 302,
88
+ 309, 315, 331, 335, 351, 366, 369, 371, 381, 392, 402, 416,
89
+ 420, 420, 421, 430, 430, 430, 432, 434, 437, 440, 442, 444
90
+ };
91
+ }
92
+
93
+ private static final short _parser_key_offsets[] = init__parser_key_offsets_0();
94
+
95
+
96
+ private static char[] init__parser_trans_keys_0()
97
+ {
98
+ return new char [] {
99
+ 58, 63, 95, 45, 46, 48, 57, 65, 90, 97, 122, 63,
100
+ 95, 45, 46, 48, 58, 65, 90, 97, 122, 32, 47, 62,
101
+ 63, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 47,
102
+ 62, 63, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32,
103
+ 61, 63, 95, 9, 13, 45, 46, 48, 58, 65, 90, 97,
104
+ 122, 32, 61, 9, 13, 32, 34, 39, 9, 13, 34, 92,
105
+ 34, 92, 32, 47, 62, 63, 95, 9, 13, 45, 58, 65,
106
+ 90, 97, 122, 32, 47, 62, 63, 95, 9, 13, 45, 58,
107
+ 65, 90, 97, 122, 62, 34, 92, 32, 34, 47, 62, 63,
108
+ 92, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 34,
109
+ 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, 90, 97,
110
+ 122, 32, 34, 61, 63, 92, 95, 9, 13, 45, 46, 48,
111
+ 58, 65, 90, 97, 122, 32, 34, 61, 92, 9, 13, 32,
112
+ 34, 39, 92, 9, 13, 32, 34, 47, 62, 63, 92, 95,
113
+ 9, 13, 45, 58, 65, 90, 97, 122, 34, 62, 92, 34,
114
+ 39, 92, 34, 39, 92, 32, 39, 47, 62, 63, 92, 95,
115
+ 9, 13, 45, 58, 65, 90, 97, 122, 39, 92, 39, 92,
116
+ 32, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65,
117
+ 90, 97, 122, 32, 39, 61, 63, 92, 95, 9, 13, 45,
118
+ 46, 48, 58, 65, 90, 97, 122, 32, 39, 61, 92, 9,
119
+ 13, 32, 34, 39, 92, 9, 13, 34, 39, 92, 34, 39,
120
+ 92, 32, 34, 39, 47, 62, 63, 92, 95, 9, 13, 45,
121
+ 58, 65, 90, 97, 122, 32, 34, 39, 47, 62, 63, 92,
122
+ 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 34, 39,
123
+ 61, 63, 92, 95, 9, 13, 45, 46, 48, 58, 65, 90,
124
+ 97, 122, 32, 34, 39, 61, 92, 9, 13, 32, 34, 39,
125
+ 92, 9, 13, 32, 34, 39, 47, 62, 63, 92, 95, 9,
126
+ 13, 45, 58, 65, 90, 97, 122, 34, 39, 62, 92, 32,
127
+ 34, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65,
128
+ 90, 97, 122, 32, 39, 47, 62, 63, 92, 95, 9, 13,
129
+ 45, 58, 65, 90, 97, 122, 39, 62, 92, 39, 92, 63,
130
+ 95, 45, 46, 48, 57, 65, 90, 97, 122, 58, 63, 95,
131
+ 45, 46, 48, 57, 65, 90, 97, 122, 63, 95, 45, 46,
132
+ 48, 58, 65, 90, 97, 122, 32, 62, 63, 95, 9, 13,
133
+ 45, 46, 48, 58, 65, 90, 97, 122, 32, 62, 9, 13,
134
+ 60, 47, 63, 95, 45, 57, 65, 90, 97, 122, 34, 92,
135
+ 34, 92, 34, 39, 92, 34, 39, 92, 39, 92, 39, 92,
136
+ 0
137
+ };
138
+ }
139
+
140
+ private static final char _parser_trans_keys[] = init__parser_trans_keys_0();
141
+
142
+
143
+ private static byte[] init__parser_single_lengths_0()
144
+ {
145
+ return new byte [] {
146
+ 0, 3, 2, 5, 5, 4, 2, 3, 2, 2, 5, 5,
147
+ 1, 2, 7, 7, 6, 4, 4, 7, 3, 3, 3, 7,
148
+ 2, 2, 7, 6, 4, 4, 3, 3, 8, 8, 7, 5,
149
+ 4, 8, 4, 8, 7, 3, 2, 2, 3, 2, 4, 2,
150
+ 0, 1, 3, 0, 0, 2, 2, 3, 3, 2, 2, 0
151
+ };
152
+ }
153
+
154
+ private static final byte _parser_single_lengths[] = init__parser_single_lengths_0();
155
+
156
+
157
+ private static byte[] init__parser_range_lengths_0()
158
+ {
159
+ return new byte [] {
160
+ 0, 4, 4, 4, 4, 5, 1, 1, 0, 0, 4, 4,
161
+ 0, 0, 4, 4, 5, 1, 1, 4, 0, 0, 0, 4,
162
+ 0, 0, 4, 5, 1, 1, 0, 0, 4, 4, 5, 1,
163
+ 1, 4, 0, 4, 4, 0, 0, 4, 4, 4, 5, 1,
164
+ 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0
165
+ };
166
+ }
167
+
168
+ private static final byte _parser_range_lengths[] = init__parser_range_lengths_0();
169
+
170
+
171
+ private static short[] init__parser_index_offsets_0()
172
+ {
173
+ return new short [] {
174
+ 0, 0, 8, 15, 25, 35, 45, 49, 54, 57, 60, 70,
175
+ 80, 82, 85, 97, 109, 121, 127, 133, 145, 149, 153, 157,
176
+ 169, 172, 175, 187, 199, 205, 211, 215, 219, 232, 245, 258,
177
+ 265, 271, 284, 289, 302, 314, 318, 321, 328, 336, 343, 353,
178
+ 357, 358, 360, 367, 368, 369, 372, 375, 379, 383, 386, 389
179
+ };
180
+ }
181
+
182
+ private static final short _parser_index_offsets[] = init__parser_index_offsets_0();
183
+
184
+
185
+ private static byte[] init__parser_indicies_0()
186
+ {
187
+ return new byte [] {
188
+ 2, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3,
189
+ 3, 3, 0, 4, 6, 7, 5, 5, 4, 5, 5, 5,
190
+ 0, 8, 10, 11, 9, 9, 8, 9, 9, 9, 0, 13,
191
+ 15, 14, 14, 13, 14, 14, 14, 14, 12, 16, 17, 16,
192
+ 12, 17, 18, 19, 17, 12, 21, 22, 20, 24, 25, 23,
193
+ 26, 28, 29, 27, 27, 26, 27, 27, 27, 12, 30, 32,
194
+ 33, 31, 31, 30, 31, 31, 31, 12, 34, 12, 35, 25,
195
+ 23, 36, 24, 38, 39, 37, 25, 37, 36, 37, 37, 37,
196
+ 23, 40, 24, 42, 43, 41, 25, 41, 40, 41, 41, 41,
197
+ 23, 44, 24, 46, 45, 25, 45, 44, 45, 45, 45, 45,
198
+ 23, 47, 24, 48, 25, 47, 23, 48, 49, 50, 25, 48,
199
+ 23, 51, 21, 53, 54, 52, 22, 52, 51, 52, 52, 52,
200
+ 20, 24, 55, 25, 23, 57, 58, 59, 56, 61, 35, 62,
201
+ 60, 64, 24, 66, 67, 65, 68, 65, 64, 65, 65, 65,
202
+ 63, 24, 68, 63, 61, 68, 63, 69, 24, 71, 72, 70,
203
+ 68, 70, 69, 70, 70, 70, 63, 73, 24, 75, 74, 68,
204
+ 74, 73, 74, 74, 74, 74, 63, 76, 24, 77, 68, 76,
205
+ 63, 77, 78, 79, 68, 77, 63, 80, 58, 59, 56, 81,
206
+ 81, 62, 60, 82, 61, 35, 84, 85, 83, 62, 83, 82,
207
+ 83, 83, 83, 60, 86, 61, 35, 88, 89, 87, 62, 87,
208
+ 86, 87, 87, 87, 60, 90, 61, 35, 92, 91, 62, 91,
209
+ 90, 91, 91, 91, 91, 60, 93, 61, 35, 94, 62, 93,
210
+ 60, 94, 95, 96, 62, 94, 60, 97, 80, 58, 99, 100,
211
+ 98, 59, 98, 97, 98, 98, 98, 56, 61, 35, 101, 62,
212
+ 60, 97, 57, 58, 99, 100, 98, 59, 98, 97, 98, 98,
213
+ 98, 56, 103, 21, 105, 106, 104, 107, 104, 103, 104, 104,
214
+ 104, 102, 24, 108, 68, 63, 21, 107, 102, 109, 109, 109,
215
+ 109, 109, 109, 0, 111, 110, 110, 110, 110, 110, 110, 0,
216
+ 112, 112, 112, 112, 112, 112, 0, 113, 115, 114, 114, 113,
217
+ 114, 114, 114, 114, 0, 116, 117, 116, 0, 118, 120, 119,
218
+ 123, 122, 122, 122, 122, 122, 121, 124, 125, 24, 25, 23,
219
+ 24, 25, 23, 61, 35, 62, 60, 61, 35, 62, 60, 24,
220
+ 68, 63, 24, 68, 63, 126, 0
221
+ };
222
+ }
223
+
224
+ private static final byte _parser_indicies[] = init__parser_indicies_0();
225
+
226
+
227
+ private static byte[] init__parser_trans_targs_0()
228
+ {
229
+ return new byte [] {
230
+ 49, 1, 2, 3, 4, 3, 12, 52, 4, 5, 12, 52,
231
+ 49, 6, 5, 7, 6, 7, 8, 42, 9, 10, 13, 9,
232
+ 10, 13, 11, 5, 12, 52, 11, 5, 12, 52, 51, 14,
233
+ 15, 16, 20, 54, 15, 16, 20, 54, 17, 16, 18, 17,
234
+ 18, 19, 21, 15, 16, 20, 54, 53, 22, 23, 14, 31,
235
+ 22, 23, 31, 24, 26, 27, 41, 58, 25, 26, 27, 41,
236
+ 58, 28, 27, 29, 28, 29, 30, 40, 23, 32, 33, 34,
237
+ 38, 56, 33, 34, 38, 56, 35, 34, 36, 35, 36, 37,
238
+ 39, 33, 34, 38, 56, 55, 24, 26, 27, 41, 58, 25,
239
+ 57, 44, 44, 45, 46, 47, 46, 59, 47, 59, 0, 49,
240
+ 50, 49, 1, 43, 49, 49, 49
241
+ };
242
+ }
243
+
244
+ private static final byte _parser_trans_targs[] = init__parser_trans_targs_0();
245
+
246
+
247
+ private static byte[] init__parser_trans_actions_0()
248
+ {
249
+ return new byte [] {
250
+ 27, 0, 31, 3, 5, 0, 5, 5, 0, 11, 0, 0,
251
+ 29, 13, 0, 13, 0, 0, 0, 0, 15, 43, 15, 0,
252
+ 17, 0, 7, 64, 34, 34, 0, 37, 9, 9, 0, 17,
253
+ 7, 64, 34, 81, 0, 37, 9, 72, 13, 0, 13, 0,
254
+ 0, 17, 0, 40, 76, 68, 86, 58, 15, 46, 43, 15,
255
+ 0, 17, 0, 0, 7, 64, 34, 81, 0, 0, 37, 9,
256
+ 72, 13, 0, 13, 0, 0, 0, 17, 43, 17, 7, 64,
257
+ 34, 81, 0, 37, 9, 72, 13, 0, 13, 0, 0, 17,
258
+ 17, 40, 76, 68, 86, 58, 15, 40, 76, 68, 86, 15,
259
+ 58, 1, 0, 31, 3, 5, 0, 5, 0, 0, 0, 23,
260
+ 61, 25, 1, 0, 52, 49, 55
261
+ };
262
+ }
263
+
264
+ private static final byte _parser_trans_actions[] = init__parser_trans_actions_0();
265
+
266
+
267
+ private static byte[] init__parser_to_state_actions_0()
268
+ {
269
+ return new byte [] {
270
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
271
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
272
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274
+ 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
275
+ };
276
+ }
277
+
278
+ private static final byte _parser_to_state_actions[] = init__parser_to_state_actions_0();
279
+
280
+
281
+ private static byte[] init__parser_from_state_actions_0()
282
+ {
283
+ return new byte [] {
284
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
285
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
288
+ 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
289
+ };
290
+ }
291
+
292
+ private static final byte _parser_from_state_actions[] = init__parser_from_state_actions_0();
293
+
294
+
295
+ private static short[] init__parser_eof_trans_0()
296
+ {
297
+ return new short [] {
298
+ 0, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13,
299
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
300
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
301
+ 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1,
302
+ 0, 0, 122, 125, 126, 125, 126, 125, 126, 125, 126, 127
303
+ };
304
+ }
305
+
306
+ private static final short _parser_eof_trans[] = init__parser_eof_trans_0();
307
+
308
+
309
+ static final int parser_start = 49;
310
+ static final int parser_first_final = 49;
311
+ static final int parser_error = 0;
312
+
313
+ static final int parser_en_Closeout = 48;
314
+ static final int parser_en_main = 49;
315
+
316
+
317
+ // line 143 "JavaScanner.rl"
318
+
319
+ public RubyArray operate(String tag_prefix, String input) {
320
+ char[] data = input.toCharArray();
321
+ String disposable_string;
322
+
323
+ String name = "";
324
+ String prefix = "";
325
+ RubySymbol flavor = RubySymbol.newSymbol(runtime, "tasteless".intern());
326
+ RubyHash attributes = RubyHash.newHash(runtime);
327
+
328
+ int tagstart = 0;
329
+ int mark_pfx = 0;
330
+ int mark_stg = 0;
331
+ int mark_attr = 0;
332
+ int mark_nat = 0;
333
+ int mark_vat = 0;
334
+
335
+ String nat = "";
336
+ String vat = "";
337
+
338
+ int cs;
339
+ int p = 0;
340
+ int pe = data.length;
341
+ int eof = pe;
342
+ int act;
343
+ int ts;
344
+ int te;
345
+
346
+ rv = RubyArray.newArray(runtime);
347
+ char[] remainder = data;
348
+
349
+
350
+ // line 351 "JavaScanner.java"
351
+ {
352
+ cs = parser_start;
353
+ ts = -1;
354
+ te = -1;
355
+ act = 0;
356
+ }
357
+
358
+ // line 175 "JavaScanner.rl"
359
+
360
+ // line 361 "JavaScanner.java"
361
+ {
362
+ int _klen;
363
+ int _trans = 0;
364
+ int _acts;
365
+ int _nacts;
366
+ int _keys;
367
+ int _goto_targ = 0;
368
+
369
+ _goto: while (true) {
370
+ switch ( _goto_targ ) {
371
+ case 0:
372
+ if ( p == pe ) {
373
+ _goto_targ = 4;
374
+ continue _goto;
375
+ }
376
+ if ( cs == 0 ) {
377
+ _goto_targ = 5;
378
+ continue _goto;
379
+ }
380
+ case 1:
381
+ _acts = _parser_from_state_actions[cs];
382
+ _nacts = (int) _parser_actions[_acts++];
383
+ while ( _nacts-- > 0 ) {
384
+ switch ( _parser_actions[_acts++] ) {
385
+ case 15:
386
+ // line 1 "NONE"
387
+ {ts = p;}
388
+ break;
389
+ // line 390 "JavaScanner.java"
390
+ }
391
+ }
392
+
393
+ _match: do {
394
+ _keys = _parser_key_offsets[cs];
395
+ _trans = _parser_index_offsets[cs];
396
+ _klen = _parser_single_lengths[cs];
397
+ if ( _klen > 0 ) {
398
+ int _lower = _keys;
399
+ int _mid;
400
+ int _upper = _keys + _klen - 1;
401
+ while (true) {
402
+ if ( _upper < _lower )
403
+ break;
404
+
405
+ _mid = _lower + ((_upper-_lower) >> 1);
406
+ if ( data[p] < _parser_trans_keys[_mid] )
407
+ _upper = _mid - 1;
408
+ else if ( data[p] > _parser_trans_keys[_mid] )
409
+ _lower = _mid + 1;
410
+ else {
411
+ _trans += (_mid - _keys);
412
+ break _match;
413
+ }
414
+ }
415
+ _keys += _klen;
416
+ _trans += _klen;
417
+ }
418
+
419
+ _klen = _parser_range_lengths[cs];
420
+ if ( _klen > 0 ) {
421
+ int _lower = _keys;
422
+ int _mid;
423
+ int _upper = _keys + (_klen<<1) - 2;
424
+ while (true) {
425
+ if ( _upper < _lower )
426
+ break;
427
+
428
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
429
+ if ( data[p] < _parser_trans_keys[_mid] )
430
+ _upper = _mid - 2;
431
+ else if ( data[p] > _parser_trans_keys[_mid+1] )
432
+ _lower = _mid + 2;
433
+ else {
434
+ _trans += ((_mid - _keys)>>1);
435
+ break _match;
436
+ }
437
+ }
438
+ _trans += _klen;
439
+ }
440
+ } while (false);
441
+
442
+ _trans = _parser_indicies[_trans];
443
+ case 3:
444
+ cs = _parser_trans_targs[_trans];
445
+
446
+ if ( _parser_trans_actions[_trans] != 0 ) {
447
+ _acts = _parser_trans_actions[_trans];
448
+ _nacts = (int) _parser_actions[_acts++];
449
+ while ( _nacts-- > 0 )
450
+ {
451
+ switch ( _parser_actions[_acts++] )
452
+ {
453
+ case 0:
454
+ // line 4 "JavaScanner.rl"
455
+ { mark_pfx = p; }
456
+ break;
457
+ case 1:
458
+ // line 5 "JavaScanner.rl"
459
+ {
460
+ prefix = input.substring(mark_pfx, p);
461
+ }
462
+ break;
463
+ case 2:
464
+ // line 8 "JavaScanner.rl"
465
+ {
466
+ if ( !prefix.equals(tag_prefix) ) {
467
+ // have to manually add ':' / Sep
468
+ // pass the text through & reset state
469
+ pass_through(input.substring(tagstart, p) + ":");
470
+ prefix = "";
471
+ {cs = 49; _goto_targ = 2; if (true) continue _goto;}
472
+ }
473
+ }
474
+ break;
475
+ case 3:
476
+ // line 18 "JavaScanner.rl"
477
+ { mark_stg = p; }
478
+ break;
479
+ case 4:
480
+ // line 19 "JavaScanner.rl"
481
+ { name = input.substring(mark_stg, p); }
482
+ break;
483
+ case 5:
484
+ // line 20 "JavaScanner.rl"
485
+ { mark_attr = p; }
486
+ break;
487
+ case 6:
488
+ // line 21 "JavaScanner.rl"
489
+ {
490
+ attributes.op_aset(
491
+ runtime.getCurrentContext(),
492
+ RubyString.newString(runtime, nat),
493
+ RubyString.newString(runtime, vat)
494
+ );
495
+ }
496
+ break;
497
+ case 7:
498
+ // line 29 "JavaScanner.rl"
499
+ { mark_nat = p; }
500
+ break;
501
+ case 8:
502
+ // line 30 "JavaScanner.rl"
503
+ { nat = input.substring(mark_nat, p); }
504
+ break;
505
+ case 9:
506
+ // line 31 "JavaScanner.rl"
507
+ { mark_vat = p; }
508
+ break;
509
+ case 10:
510
+ // line 32 "JavaScanner.rl"
511
+ { vat = input.substring(mark_vat, p); }
512
+ break;
513
+ case 11:
514
+ // line 34 "JavaScanner.rl"
515
+ { flavor = RubySymbol.newSymbol(runtime, "open".intern()); }
516
+ break;
517
+ case 12:
518
+ // line 35 "JavaScanner.rl"
519
+ { flavor = RubySymbol.newSymbol(runtime, "self".intern()); }
520
+ break;
521
+ case 13:
522
+ // line 36 "JavaScanner.rl"
523
+ { flavor = RubySymbol.newSymbol(runtime, "close".intern()); }
524
+ break;
525
+ case 16:
526
+ // line 1 "NONE"
527
+ {te = p+1;}
528
+ break;
529
+ case 17:
530
+ // line 72 "JavaScanner.rl"
531
+ {act = 1;}
532
+ break;
533
+ case 18:
534
+ // line 79 "JavaScanner.rl"
535
+ {act = 2;}
536
+ break;
537
+ case 19:
538
+ // line 79 "JavaScanner.rl"
539
+ {te = p+1;{
540
+ pass_through(input.substring(p, p + 1));
541
+ tagstart = p + 1;
542
+ }}
543
+ break;
544
+ case 20:
545
+ // line 72 "JavaScanner.rl"
546
+ {te = p;p--;{
547
+ tag(prefix, name, attributes, flavor);
548
+ prefix = "";
549
+ name = "";
550
+ attributes = RubyHash.newHash(runtime);
551
+ flavor = RubySymbol.newSymbol(runtime, "tasteless".intern());
552
+ }}
553
+ break;
554
+ case 21:
555
+ // line 79 "JavaScanner.rl"
556
+ {te = p;p--;{
557
+ pass_through(input.substring(p, p + 1));
558
+ tagstart = p + 1;
559
+ }}
560
+ break;
561
+ case 22:
562
+ // line 79 "JavaScanner.rl"
563
+ {{p = ((te))-1;}{
564
+ pass_through(input.substring(p, p + 1));
565
+ tagstart = p + 1;
566
+ }}
567
+ break;
568
+ case 23:
569
+ // line 1 "NONE"
570
+ { switch( act ) {
571
+ case 1:
572
+ {{p = ((te))-1;}
573
+ tag(prefix, name, attributes, flavor);
574
+ prefix = "";
575
+ name = "";
576
+ attributes = RubyHash.newHash(runtime);
577
+ flavor = RubySymbol.newSymbol(runtime, "tasteless".intern());
578
+ }
579
+ break;
580
+ case 2:
581
+ {{p = ((te))-1;}
582
+ pass_through(input.substring(p, p + 1));
583
+ tagstart = p + 1;
584
+ }
585
+ break;
586
+ }
587
+ }
588
+ break;
589
+ // line 590 "JavaScanner.java"
590
+ }
591
+ }
592
+ }
593
+
594
+ case 2:
595
+ _acts = _parser_to_state_actions[cs];
596
+ _nacts = (int) _parser_actions[_acts++];
597
+ while ( _nacts-- > 0 ) {
598
+ switch ( _parser_actions[_acts++] ) {
599
+ case 14:
600
+ // line 1 "NONE"
601
+ {ts = -1;}
602
+ break;
603
+ // line 604 "JavaScanner.java"
604
+ }
605
+ }
606
+
607
+ if ( cs == 0 ) {
608
+ _goto_targ = 5;
609
+ continue _goto;
610
+ }
611
+ if ( ++p != pe ) {
612
+ _goto_targ = 1;
613
+ continue _goto;
614
+ }
615
+ case 4:
616
+ if ( p == eof )
617
+ {
618
+ if ( _parser_eof_trans[cs] > 0 ) {
619
+ _trans = _parser_eof_trans[cs] - 1;
620
+ _goto_targ = 3;
621
+ continue _goto;
622
+ }
623
+ }
624
+
625
+ case 5:
626
+ }
627
+ break; }
628
+ }
629
+
630
+ // line 176 "JavaScanner.rl"
631
+
632
+ return rv;
633
+ }
634
+ }