diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..bbb0e7a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + types: [opened, synchronize, reopened] + branches: [ master ] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - ruby-version: '2.7.8' + bundler-version: '2.4.22' + - ruby-version: '3.0.7' + bundler-version: '2.5.23' + - ruby-version: '3.1.6' + bundler-version: '2.6.1' + - ruby-version: '3.3.6' + bundler-version: '2.6.1' + - ruby-version: '3.4.0-rc1' + bundler-version: '2.6.1' + - ruby-version: 'jruby' + bundler-version: '2.6.1' + + steps: + - uses: actions/checkout@v4 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + bundler: ${{ matrix.bundler-version }} + bundler-cache: true + - name: Run tests + env: + COVERALLS: ${{ matrix.ruby-version != 'jruby' }} + JRUBY_OPTS: ${{ matrix.ruby-version == 'jruby' && '--debug' || '' }} + run: bundle exec rake \ No newline at end of file diff --git a/Gemfile b/Gemfile index d4fb76e..03418c5 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ group :test do gem 'rake' gem 'kramdown' gem "simplecov" - gem 'coveralls-ruby', :require => false + gem 'coveralls_reborn', :require => false gem 'minitest' end @@ -15,6 +15,11 @@ end platforms :rbx do gem 'racc' # if using gems like ruby_parser or parser # gem 'rubysl', '~> 2.0' - gem 'psych' + # gem 'psych' gem 'rubinius-developer_tools' end + +platforms :jruby do + gem 'jar-dependencies', '~> 0.4.1' + gem 'ruby-maven', '~> 3.3.11' +end diff --git a/lib/radius/context.rb b/lib/radius/context.rb index c682c62..97096cd 100644 --- a/lib/radius/context.rb +++ b/lib/radius/context.rb @@ -58,6 +58,7 @@ def render_tag(name, attributes = {}, &block) else tag_definition_block = @definitions[qualified_tag_name(name.to_s)] if tag_definition_block + # puts name: name, attributes: attributes stack(name, attributes, block) do |tag| tag_definition_block.call(tag).to_s end diff --git a/lib/radius/parser.rb b/lib/radius/parser.rb index 4260943..8e088fb 100644 --- a/lib/radius/parser.rb +++ b/lib/radius/parser.rb @@ -67,7 +67,11 @@ def stack_up def default_scanner if RUBY_PLATFORM == 'java' - require 'java' + if Gem::Version.new(JRUBY_VERSION) >= Gem::Version.new('9.3') + require 'jruby' + else + require 'java' + end require 'radius/parser/java_scanner.jar' ::Radius.send(:include_package, 'radius.parser') Radius::JavaScanner.new(JRuby.runtime) diff --git a/lib/radius/parser/JavaScanner.class b/lib/radius/parser/JavaScanner.class index e16e7b7..9c598a3 100644 Binary files a/lib/radius/parser/JavaScanner.class and b/lib/radius/parser/JavaScanner.class differ diff --git a/lib/radius/parser/JavaScanner.java b/lib/radius/parser/JavaScanner.java index b45cb73..36bb43a 100644 --- a/lib/radius/parser/JavaScanner.java +++ b/lib/radius/parser/JavaScanner.java @@ -1,7 +1,7 @@ // line 1 "JavaScanner.rl" -// line 84 "JavaScanner.rl" +// line 101 "JavaScanner.rl" package radius.parser; @@ -32,11 +32,23 @@ void pass_through(String str) { } void tag(String prefix, String name, RubyHash attr, RubySymbol flavor) { + // Validate both prefix and name + if ((prefix == null || prefix.trim().isEmpty()) && + (name == null || name.trim().isEmpty())) { + pass_through("<"); + return; + } + + if (name == null || name.trim().isEmpty()) { + pass_through("<" + prefix + ":"); + return; + } + RubyHash tag = RubyHash.newHash(runtime); tag.op_aset( runtime.getCurrentContext(), RubySymbol.newSymbol(runtime, "prefix"), - RubyString.newString(runtime, prefix) + RubyString.newString(runtime, prefix != null ? prefix : "") ); tag.op_aset( runtime.getCurrentContext(), @@ -61,7 +73,7 @@ public JavaScanner(Ruby runtime) { } -// line 65 "JavaScanner.java" +// line 77 "JavaScanner.java" private static byte[] init__parser_actions_0() { return new byte [] { @@ -82,11 +94,12 @@ private static byte[] init__parser_actions_0() private static short[] init__parser_key_offsets_0() { return new short [] { - 0, 0, 11, 21, 34, 47, 61, 65, 70, 72, 74, 87, - 100, 101, 103, 118, 133, 149, 155, 161, 176, 179, 182, 185, - 200, 202, 204, 219, 235, 241, 247, 250, 253, 269, 285, 302, - 309, 315, 331, 335, 351, 366, 369, 371, 381, 392, 402, 416, - 420, 420, 421, 430, 430, 430, 432, 434, 437, 440, 442, 444 + 0, 0, 11, 21, 35, 48, 62, 66, 71, 73, 75, 88, + 101, 102, 104, 119, 134, 150, 156, 162, 177, 180, 183, 186, + 201, 203, 205, 220, 236, 242, 248, 251, 254, 270, 286, 303, + 310, 316, 332, 336, 352, 367, 370, 372, 382, 392, 403, 413, + 428, 432, 442, 442, 443, 452, 452, 452, 454, 456, 459, 462, + 464, 466 }; } @@ -97,43 +110,44 @@ private static char[] init__parser_trans_keys_0() { return new char [] { 58, 63, 95, 45, 46, 48, 57, 65, 90, 97, 122, 63, - 95, 45, 46, 48, 58, 65, 90, 97, 122, 32, 47, 62, - 63, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 47, - 62, 63, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, - 61, 63, 95, 9, 13, 45, 46, 48, 58, 65, 90, 97, - 122, 32, 61, 9, 13, 32, 34, 39, 9, 13, 34, 92, - 34, 92, 32, 47, 62, 63, 95, 9, 13, 45, 58, 65, - 90, 97, 122, 32, 47, 62, 63, 95, 9, 13, 45, 58, - 65, 90, 97, 122, 62, 34, 92, 32, 34, 47, 62, 63, + 95, 45, 46, 48, 57, 65, 90, 97, 122, 32, 47, 58, + 62, 63, 95, 9, 13, 45, 57, 65, 90, 97, 122, 32, + 47, 62, 63, 95, 9, 13, 45, 58, 65, 90, 97, 122, + 32, 61, 63, 95, 9, 13, 45, 46, 48, 58, 65, 90, + 97, 122, 32, 61, 9, 13, 32, 34, 39, 9, 13, 34, + 92, 34, 92, 32, 47, 62, 63, 95, 9, 13, 45, 58, + 65, 90, 97, 122, 32, 47, 62, 63, 95, 9, 13, 45, + 58, 65, 90, 97, 122, 62, 34, 92, 32, 34, 47, 62, + 63, 92, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, + 34, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, 90, + 97, 122, 32, 34, 61, 63, 92, 95, 9, 13, 45, 46, + 48, 58, 65, 90, 97, 122, 32, 34, 61, 92, 9, 13, + 32, 34, 39, 92, 9, 13, 32, 34, 47, 62, 63, 92, + 95, 9, 13, 45, 58, 65, 90, 97, 122, 34, 62, 92, + 34, 39, 92, 34, 39, 92, 32, 39, 47, 62, 63, 92, + 95, 9, 13, 45, 58, 65, 90, 97, 122, 39, 92, 39, + 92, 32, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, + 65, 90, 97, 122, 32, 39, 61, 63, 92, 95, 9, 13, + 45, 46, 48, 58, 65, 90, 97, 122, 32, 39, 61, 92, + 9, 13, 32, 34, 39, 92, 9, 13, 34, 39, 92, 34, + 39, 92, 32, 34, 39, 47, 62, 63, 92, 95, 9, 13, + 45, 58, 65, 90, 97, 122, 32, 34, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 34, - 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, 90, 97, - 122, 32, 34, 61, 63, 92, 95, 9, 13, 45, 46, 48, - 58, 65, 90, 97, 122, 32, 34, 61, 92, 9, 13, 32, - 34, 39, 92, 9, 13, 32, 34, 47, 62, 63, 92, 95, - 9, 13, 45, 58, 65, 90, 97, 122, 34, 62, 92, 34, - 39, 92, 34, 39, 92, 32, 39, 47, 62, 63, 92, 95, - 9, 13, 45, 58, 65, 90, 97, 122, 39, 92, 39, 92, - 32, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, - 90, 97, 122, 32, 39, 61, 63, 92, 95, 9, 13, 45, - 46, 48, 58, 65, 90, 97, 122, 32, 39, 61, 92, 9, - 13, 32, 34, 39, 92, 9, 13, 34, 39, 92, 34, 39, - 92, 32, 34, 39, 47, 62, 63, 92, 95, 9, 13, 45, - 58, 65, 90, 97, 122, 32, 34, 39, 47, 62, 63, 92, - 95, 9, 13, 45, 58, 65, 90, 97, 122, 32, 34, 39, - 61, 63, 92, 95, 9, 13, 45, 46, 48, 58, 65, 90, - 97, 122, 32, 34, 39, 61, 92, 9, 13, 32, 34, 39, - 92, 9, 13, 32, 34, 39, 47, 62, 63, 92, 95, 9, - 13, 45, 58, 65, 90, 97, 122, 34, 39, 62, 92, 32, - 34, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, 65, - 90, 97, 122, 32, 39, 47, 62, 63, 92, 95, 9, 13, - 45, 58, 65, 90, 97, 122, 39, 62, 92, 39, 92, 63, - 95, 45, 46, 48, 57, 65, 90, 97, 122, 58, 63, 95, - 45, 46, 48, 57, 65, 90, 97, 122, 63, 95, 45, 46, - 48, 58, 65, 90, 97, 122, 32, 62, 63, 95, 9, 13, - 45, 46, 48, 58, 65, 90, 97, 122, 32, 62, 9, 13, - 60, 47, 63, 95, 45, 57, 65, 90, 97, 122, 34, 92, - 34, 92, 34, 39, 92, 34, 39, 92, 39, 92, 39, 92, - 0 + 39, 61, 63, 92, 95, 9, 13, 45, 46, 48, 58, 65, + 90, 97, 122, 32, 34, 39, 61, 92, 9, 13, 32, 34, + 39, 92, 9, 13, 32, 34, 39, 47, 62, 63, 92, 95, + 9, 13, 45, 58, 65, 90, 97, 122, 34, 39, 62, 92, + 32, 34, 39, 47, 62, 63, 92, 95, 9, 13, 45, 58, + 65, 90, 97, 122, 32, 39, 47, 62, 63, 92, 95, 9, + 13, 45, 58, 65, 90, 97, 122, 39, 62, 92, 39, 92, + 63, 95, 45, 46, 48, 57, 65, 90, 97, 122, 63, 95, + 45, 46, 48, 57, 65, 90, 97, 122, 58, 63, 95, 45, + 46, 48, 57, 65, 90, 97, 122, 63, 95, 45, 46, 48, + 57, 65, 90, 97, 122, 32, 58, 62, 63, 95, 9, 13, + 45, 46, 48, 57, 65, 90, 97, 122, 32, 62, 9, 13, + 63, 95, 45, 46, 48, 57, 65, 90, 97, 122, 60, 47, + 63, 95, 45, 57, 65, 90, 97, 122, 34, 92, 34, 92, + 34, 39, 92, 34, 39, 92, 39, 92, 39, 92, 0 }; } @@ -143,11 +157,12 @@ private static char[] init__parser_trans_keys_0() private static byte[] init__parser_single_lengths_0() { return new byte [] { - 0, 3, 2, 5, 5, 4, 2, 3, 2, 2, 5, 5, + 0, 3, 2, 6, 5, 4, 2, 3, 2, 2, 5, 5, 1, 2, 7, 7, 6, 4, 4, 7, 3, 3, 3, 7, 2, 2, 7, 6, 4, 4, 3, 3, 8, 8, 7, 5, - 4, 8, 4, 8, 7, 3, 2, 2, 3, 2, 4, 2, - 0, 1, 3, 0, 0, 2, 2, 3, 3, 2, 2, 0 + 4, 8, 4, 8, 7, 3, 2, 2, 2, 3, 2, 5, + 2, 2, 0, 1, 3, 0, 0, 2, 2, 3, 3, 2, + 2, 0 }; } @@ -160,8 +175,9 @@ private static byte[] init__parser_range_lengths_0() 0, 4, 4, 4, 4, 5, 1, 1, 0, 0, 4, 4, 0, 0, 4, 4, 5, 1, 1, 4, 0, 0, 0, 4, 0, 0, 4, 5, 1, 1, 0, 0, 4, 4, 5, 1, - 1, 4, 0, 4, 4, 0, 0, 4, 4, 4, 5, 1, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 1, 4, 0, 4, 4, 0, 0, 4, 4, 4, 4, 5, + 1, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; } @@ -171,73 +187,60 @@ private static byte[] init__parser_range_lengths_0() private static short[] init__parser_index_offsets_0() { return new short [] { - 0, 0, 8, 15, 25, 35, 45, 49, 54, 57, 60, 70, - 80, 82, 85, 97, 109, 121, 127, 133, 145, 149, 153, 157, - 169, 172, 175, 187, 199, 205, 211, 215, 219, 232, 245, 258, - 265, 271, 284, 289, 302, 314, 318, 321, 328, 336, 343, 353, - 357, 358, 360, 367, 368, 369, 372, 375, 379, 383, 386, 389 + 0, 0, 8, 15, 26, 36, 46, 50, 55, 58, 61, 71, + 81, 83, 86, 98, 110, 122, 128, 134, 146, 150, 154, 158, + 170, 173, 176, 188, 200, 206, 212, 216, 220, 233, 246, 259, + 266, 272, 285, 290, 303, 315, 319, 322, 329, 336, 344, 351, + 362, 366, 373, 374, 376, 383, 384, 385, 388, 391, 395, 399, + 402, 405 }; } private static final short _parser_index_offsets[] = init__parser_index_offsets_0(); -private static byte[] init__parser_indicies_0() -{ - return new byte [] { - 2, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, - 3, 3, 0, 4, 6, 7, 5, 5, 4, 5, 5, 5, - 0, 8, 10, 11, 9, 9, 8, 9, 9, 9, 0, 13, - 15, 14, 14, 13, 14, 14, 14, 14, 12, 16, 17, 16, - 12, 17, 18, 19, 17, 12, 21, 22, 20, 24, 25, 23, - 26, 28, 29, 27, 27, 26, 27, 27, 27, 12, 30, 32, - 33, 31, 31, 30, 31, 31, 31, 12, 34, 12, 35, 25, - 23, 36, 24, 38, 39, 37, 25, 37, 36, 37, 37, 37, - 23, 40, 24, 42, 43, 41, 25, 41, 40, 41, 41, 41, - 23, 44, 24, 46, 45, 25, 45, 44, 45, 45, 45, 45, - 23, 47, 24, 48, 25, 47, 23, 48, 49, 50, 25, 48, - 23, 51, 21, 53, 54, 52, 22, 52, 51, 52, 52, 52, - 20, 24, 55, 25, 23, 57, 58, 59, 56, 61, 35, 62, - 60, 64, 24, 66, 67, 65, 68, 65, 64, 65, 65, 65, - 63, 24, 68, 63, 61, 68, 63, 69, 24, 71, 72, 70, - 68, 70, 69, 70, 70, 70, 63, 73, 24, 75, 74, 68, - 74, 73, 74, 74, 74, 74, 63, 76, 24, 77, 68, 76, - 63, 77, 78, 79, 68, 77, 63, 80, 58, 59, 56, 81, - 81, 62, 60, 82, 61, 35, 84, 85, 83, 62, 83, 82, - 83, 83, 83, 60, 86, 61, 35, 88, 89, 87, 62, 87, - 86, 87, 87, 87, 60, 90, 61, 35, 92, 91, 62, 91, - 90, 91, 91, 91, 91, 60, 93, 61, 35, 94, 62, 93, - 60, 94, 95, 96, 62, 94, 60, 97, 80, 58, 99, 100, - 98, 59, 98, 97, 98, 98, 98, 56, 61, 35, 101, 62, - 60, 97, 57, 58, 99, 100, 98, 59, 98, 97, 98, 98, - 98, 56, 103, 21, 105, 106, 104, 107, 104, 103, 104, 104, - 104, 102, 24, 108, 68, 63, 21, 107, 102, 109, 109, 109, - 109, 109, 109, 0, 111, 110, 110, 110, 110, 110, 110, 0, - 112, 112, 112, 112, 112, 112, 0, 113, 115, 114, 114, 113, - 114, 114, 114, 114, 0, 116, 117, 116, 0, 118, 120, 119, - 123, 122, 122, 122, 122, 122, 121, 124, 125, 24, 25, 23, - 24, 25, 23, 61, 35, 62, 60, 61, 35, 62, 60, 24, - 68, 63, 24, 68, 63, 126, 0 - }; -} - -private static final byte _parser_indicies[] = init__parser_indicies_0(); - - private static byte[] init__parser_trans_targs_0() { return new byte [] { - 49, 1, 2, 3, 4, 3, 12, 52, 4, 5, 12, 52, - 49, 6, 5, 7, 6, 7, 8, 42, 9, 10, 13, 9, - 10, 13, 11, 5, 12, 52, 11, 5, 12, 52, 51, 14, - 15, 16, 20, 54, 15, 16, 20, 54, 17, 16, 18, 17, - 18, 19, 21, 15, 16, 20, 54, 53, 22, 23, 14, 31, - 22, 23, 31, 24, 26, 27, 41, 58, 25, 26, 27, 41, - 58, 28, 27, 29, 28, 29, 30, 40, 23, 32, 33, 34, - 38, 56, 33, 34, 38, 56, 35, 34, 36, 35, 36, 37, - 39, 33, 34, 38, 56, 55, 24, 26, 27, 41, 58, 25, - 57, 44, 44, 45, 46, 47, 46, 59, 47, 59, 0, 49, - 50, 49, 1, 43, 49, 49, 49 + 2, 1, 1, 1, 1, 1, 1, 51, 3, 3, 3, 3, + 3, 3, 51, 4, 12, 43, 54, 3, 3, 4, 3, 3, + 3, 51, 4, 12, 54, 5, 5, 4, 5, 5, 5, 51, + 6, 7, 5, 5, 6, 5, 5, 5, 5, 51, 6, 7, + 6, 51, 7, 8, 42, 7, 51, 10, 13, 9, 10, 13, + 9, 11, 12, 54, 5, 5, 11, 5, 5, 5, 51, 11, + 12, 54, 5, 5, 11, 5, 5, 5, 51, 53, 51, 14, + 13, 9, 15, 10, 20, 56, 16, 13, 16, 15, 16, 16, + 16, 9, 15, 10, 20, 56, 16, 13, 16, 15, 16, 16, + 16, 9, 17, 10, 18, 16, 13, 16, 17, 16, 16, 16, + 16, 9, 17, 10, 18, 13, 17, 9, 18, 19, 21, 13, + 18, 9, 15, 10, 20, 56, 16, 13, 16, 15, 16, 16, + 16, 9, 10, 55, 13, 9, 23, 14, 31, 22, 23, 14, + 31, 22, 26, 10, 41, 60, 27, 25, 27, 26, 27, 27, + 27, 24, 10, 25, 24, 23, 25, 24, 26, 10, 41, 60, + 27, 25, 27, 26, 27, 27, 27, 24, 28, 10, 29, 27, + 25, 27, 28, 27, 27, 27, 27, 24, 28, 10, 29, 25, + 28, 24, 29, 30, 40, 25, 29, 24, 23, 14, 31, 22, + 32, 32, 31, 22, 33, 23, 14, 38, 58, 34, 31, 34, + 33, 34, 34, 34, 22, 33, 23, 14, 38, 58, 34, 31, + 34, 33, 34, 34, 34, 22, 35, 23, 14, 36, 34, 31, + 34, 35, 34, 34, 34, 34, 22, 35, 23, 14, 36, 31, + 35, 22, 36, 37, 39, 31, 36, 22, 33, 23, 14, 38, + 58, 34, 31, 34, 33, 34, 34, 34, 22, 23, 14, 57, + 31, 22, 33, 23, 14, 38, 58, 34, 31, 34, 33, 34, + 34, 34, 22, 26, 10, 41, 60, 27, 25, 27, 26, 27, + 27, 27, 24, 10, 59, 25, 24, 10, 25, 24, 3, 3, + 3, 3, 3, 3, 51, 45, 45, 45, 45, 45, 45, 51, + 46, 45, 45, 45, 45, 45, 45, 51, 47, 47, 47, 47, + 47, 47, 51, 48, 49, 61, 47, 47, 48, 47, 47, 47, + 47, 51, 48, 61, 48, 51, 47, 47, 47, 47, 47, 47, + 51, 0, 52, 51, 44, 1, 1, 1, 1, 1, 51, 51, + 51, 10, 13, 9, 10, 13, 9, 23, 14, 31, 22, 23, + 14, 31, 22, 10, 25, 24, 10, 25, 24, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 0 }; } @@ -247,17 +250,45 @@ private static byte[] init__parser_trans_targs_0() private static byte[] init__parser_trans_actions_0() { return new byte [] { - 27, 0, 31, 3, 5, 0, 5, 5, 0, 11, 0, 0, - 29, 13, 0, 13, 0, 0, 0, 0, 15, 43, 15, 0, - 17, 0, 7, 64, 34, 34, 0, 37, 9, 9, 0, 17, - 7, 64, 34, 81, 0, 37, 9, 72, 13, 0, 13, 0, - 0, 17, 0, 40, 76, 68, 86, 58, 15, 46, 43, 15, - 0, 17, 0, 0, 7, 64, 34, 81, 0, 0, 37, 9, - 72, 13, 0, 13, 0, 0, 0, 17, 43, 17, 7, 64, - 34, 81, 0, 37, 9, 72, 13, 0, 13, 0, 0, 17, - 17, 40, 76, 68, 86, 58, 15, 40, 76, 68, 86, 15, - 58, 1, 0, 31, 3, 5, 0, 5, 0, 0, 0, 23, - 61, 25, 1, 0, 52, 49, 55 + 31, 0, 0, 0, 0, 0, 0, 27, 3, 3, 3, 3, + 3, 3, 27, 5, 5, 0, 5, 0, 0, 5, 0, 0, + 0, 27, 0, 0, 0, 11, 11, 0, 11, 11, 11, 27, + 13, 13, 0, 0, 13, 0, 0, 0, 0, 29, 0, 0, + 0, 29, 0, 0, 0, 0, 29, 43, 15, 15, 17, 0, + 0, 7, 34, 34, 64, 64, 7, 64, 64, 64, 29, 0, + 9, 9, 37, 37, 0, 37, 37, 37, 29, 0, 29, 17, + 0, 0, 7, 17, 34, 81, 64, 0, 64, 7, 64, 64, + 64, 0, 0, 17, 9, 72, 37, 0, 37, 0, 37, 37, + 37, 0, 13, 17, 13, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 40, 43, 68, 86, 76, 15, 76, 40, 76, 76, + 76, 15, 17, 58, 0, 0, 46, 43, 15, 15, 17, 17, + 0, 0, 7, 17, 34, 81, 64, 0, 64, 7, 64, 64, + 64, 0, 17, 0, 0, 17, 0, 0, 0, 17, 9, 72, + 37, 0, 37, 0, 37, 37, 37, 0, 13, 17, 13, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 43, 43, 15, 15, + 17, 17, 0, 0, 7, 17, 17, 34, 81, 64, 0, 64, + 7, 64, 64, 64, 0, 0, 17, 17, 9, 72, 37, 0, + 37, 0, 37, 37, 37, 0, 13, 17, 17, 13, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 17, 17, 0, 0, + 0, 0, 0, 17, 17, 0, 0, 0, 40, 43, 43, 68, + 86, 76, 15, 76, 40, 76, 76, 76, 15, 17, 17, 58, + 0, 0, 40, 46, 43, 68, 86, 76, 15, 76, 40, 76, + 76, 76, 15, 40, 43, 68, 86, 76, 15, 76, 40, 76, + 76, 76, 15, 17, 58, 0, 0, 43, 15, 15, 0, 0, + 0, 0, 0, 0, 27, 1, 1, 1, 1, 1, 1, 27, + 31, 0, 0, 0, 0, 0, 0, 27, 3, 3, 3, 3, + 3, 3, 27, 5, 0, 5, 0, 0, 5, 0, 0, 0, + 0, 27, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, + 27, 0, 61, 23, 0, 1, 1, 1, 1, 1, 25, 52, + 49, 17, 0, 0, 17, 0, 0, 17, 17, 0, 0, 17, + 17, 0, 0, 17, 0, 0, 17, 0, 0, 55, 27, 27, + 27, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 27, 27, 27, 27, 27, 27, 27, 25, + 52, 49, 52, 49, 52, 49, 52, 49, 55, 0 }; } @@ -271,7 +302,8 @@ private static byte[] init__parser_to_state_actions_0() 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; } @@ -285,7 +317,8 @@ private static byte[] init__parser_from_state_actions_0() 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; } @@ -295,26 +328,27 @@ private static byte[] init__parser_from_state_actions_0() private static short[] init__parser_eof_trans_0() { return new short [] { - 0, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, - 0, 0, 122, 125, 126, 125, 126, 125, 126, 125, 126, 127 + 0, 455, 455, 455, 455, 448, 448, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 448, 448, 448, 455, 455, 455, 455, 455, + 455, 455, 0, 0, 456, 463, 464, 463, 464, 463, 464, 463, + 464, 465 }; } private static final short _parser_eof_trans[] = init__parser_eof_trans_0(); -static final int parser_start = 49; -static final int parser_first_final = 49; +static final int parser_start = 51; +static final int parser_first_final = 51; static final int parser_error = 0; -static final int parser_en_Closeout = 48; -static final int parser_en_main = 49; +static final int parser_en_Closeout = 50; +static final int parser_en_main = 51; -// line 143 "JavaScanner.rl" +// line 172 "JavaScanner.rl" public RubyArray operate(String tag_prefix, String input) { char[] data = input.toCharArray(); @@ -347,7 +381,7 @@ public RubyArray operate(String tag_prefix, String input) { char[] remainder = data; -// line 351 "JavaScanner.java" +// line 385 "JavaScanner.java" { cs = parser_start; ts = -1; @@ -355,9 +389,9 @@ public RubyArray operate(String tag_prefix, String input) { act = 0; } -// line 175 "JavaScanner.rl" +// line 204 "JavaScanner.rl" -// line 361 "JavaScanner.java" +// line 395 "JavaScanner.java" { int _klen; int _trans = 0; @@ -386,7 +420,7 @@ public RubyArray operate(String tag_prefix, String input) { // line 1 "NONE" {ts = p;} break; -// line 390 "JavaScanner.java" +// line 424 "JavaScanner.java" } } @@ -439,7 +473,6 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) } } while (false); - _trans = _parser_indicies[_trans]; case 3: cs = _parser_trans_targs[_trans]; @@ -457,35 +490,52 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) case 1: // line 5 "JavaScanner.rl" { - prefix = input.substring(mark_pfx, p); + prefix = String.valueOf(input.substring(mark_pfx, p)); } break; case 2: // line 8 "JavaScanner.rl" { if ( !prefix.equals(tag_prefix) ) { - // have to manually add ':' / Sep - // pass the text through & reset state - pass_through(input.substring(tagstart, p) + ":"); + // Pass through the entire tag markup as text + pass_through(input.substring(tagstart, p + 1)); + // Reset all state prefix = ""; - {cs = 49; _goto_targ = 2; if (true) continue _goto;} + name = ""; + attributes = RubyHash.newHash(runtime); + flavor = RubySymbol.newSymbol(runtime, "tasteless".intern()); + tagstart = p + 1; + {cs = 51; _goto_targ = 2; if (true) continue _goto;} } } break; case 3: -// line 18 "JavaScanner.rl" +// line 22 "JavaScanner.rl" { mark_stg = p; } break; case 4: -// line 19 "JavaScanner.rl" - { name = input.substring(mark_stg, p); } +// line 23 "JavaScanner.rl" + { + name = String.valueOf(input.substring(mark_stg, p)); + if (name == null || name.trim().isEmpty()) { + // Pass through the entire tag markup as text + pass_through(input.substring(tagstart, p + 1)); + // Reset all state + prefix = ""; + name = ""; + attributes = RubyHash.newHash(runtime); + flavor = RubySymbol.newSymbol(runtime, "tasteless".intern()); + tagstart = p + 1; + {cs = 51; _goto_targ = 2; if (true) continue _goto;} + } + } break; case 5: -// line 20 "JavaScanner.rl" +// line 37 "JavaScanner.rl" { mark_attr = p; } break; case 6: -// line 21 "JavaScanner.rl" +// line 38 "JavaScanner.rl" { attributes.op_aset( runtime.getCurrentContext(), @@ -495,31 +545,31 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) } break; case 7: -// line 29 "JavaScanner.rl" +// line 46 "JavaScanner.rl" { mark_nat = p; } break; case 8: -// line 30 "JavaScanner.rl" +// line 47 "JavaScanner.rl" { nat = input.substring(mark_nat, p); } break; case 9: -// line 31 "JavaScanner.rl" +// line 48 "JavaScanner.rl" { mark_vat = p; } break; case 10: -// line 32 "JavaScanner.rl" +// line 49 "JavaScanner.rl" { vat = input.substring(mark_vat, p); } break; case 11: -// line 34 "JavaScanner.rl" +// line 51 "JavaScanner.rl" { flavor = RubySymbol.newSymbol(runtime, "open".intern()); } break; case 12: -// line 35 "JavaScanner.rl" +// line 52 "JavaScanner.rl" { flavor = RubySymbol.newSymbol(runtime, "self".intern()); } break; case 13: -// line 36 "JavaScanner.rl" +// line 53 "JavaScanner.rl" { flavor = RubySymbol.newSymbol(runtime, "close".intern()); } break; case 16: @@ -527,22 +577,22 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) {te = p+1;} break; case 17: -// line 72 "JavaScanner.rl" +// line 89 "JavaScanner.rl" {act = 1;} break; case 18: -// line 79 "JavaScanner.rl" +// line 96 "JavaScanner.rl" {act = 2;} break; case 19: -// line 79 "JavaScanner.rl" +// line 96 "JavaScanner.rl" {te = p+1;{ pass_through(input.substring(p, p + 1)); tagstart = p + 1; }} break; case 20: -// line 72 "JavaScanner.rl" +// line 89 "JavaScanner.rl" {te = p;p--;{ tag(prefix, name, attributes, flavor); prefix = ""; @@ -552,14 +602,14 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) }} break; case 21: -// line 79 "JavaScanner.rl" +// line 96 "JavaScanner.rl" {te = p;p--;{ pass_through(input.substring(p, p + 1)); tagstart = p + 1; }} break; case 22: -// line 79 "JavaScanner.rl" +// line 96 "JavaScanner.rl" {{p = ((te))-1;}{ pass_through(input.substring(p, p + 1)); tagstart = p + 1; @@ -586,7 +636,7 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) } } break; -// line 590 "JavaScanner.java" +// line 640 "JavaScanner.java" } } } @@ -600,7 +650,7 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) // line 1 "NONE" {ts = -1;} break; -// line 604 "JavaScanner.java" +// line 654 "JavaScanner.java" } } @@ -627,7 +677,7 @@ else if ( data[p] > _parser_trans_keys[_mid+1] ) break; } } -// line 176 "JavaScanner.rl" +// line 205 "JavaScanner.rl" return rv; } diff --git a/lib/radius/parser/JavaScanner.rl b/lib/radius/parser/JavaScanner.rl index b53601a..8f5e694 100644 --- a/lib/radius/parser/JavaScanner.rl +++ b/lib/radius/parser/JavaScanner.rl @@ -3,20 +3,37 @@ action _prefix { mark_pfx = p; } action prefix { - prefix = input.substring(mark_pfx, p); + prefix = String.valueOf(input.substring(mark_pfx, p)); } action _check_prefix { if ( !prefix.equals(tag_prefix) ) { - // have to manually add ':' / Sep - // pass the text through & reset state - pass_through(input.substring(tagstart, p) + ":"); + // Pass through the entire tag markup as text + pass_through(input.substring(tagstart, p + 1)); + // Reset all state prefix = ""; + name = ""; + attributes = RubyHash.newHash(runtime); + flavor = RubySymbol.newSymbol(runtime, "tasteless".intern()); + tagstart = p + 1; fgoto main; } } action _starttag { mark_stg = p; } - action starttag { name = input.substring(mark_stg, p); } + action starttag { + name = String.valueOf(input.substring(mark_stg, p)); + if (name == null || name.trim().isEmpty()) { + // Pass through the entire tag markup as text + pass_through(input.substring(tagstart, p + 1)); + // Reset all state + prefix = ""; + name = ""; + attributes = RubyHash.newHash(runtime); + flavor = RubySymbol.newSymbol(runtime, "tasteless".intern()); + tagstart = p + 1; + fgoto main; + } + } action _attr { mark_attr = p; } action attr { attributes.op_aset( @@ -40,7 +57,7 @@ # words PrefixChar = [\-A-Za-z0-9._?] ; NameChar = [\-A-Za-z0-9._:?] ; - TagName = NameChar+ >_starttag %starttag; + TagName = ([\-A-Za-z0-9._?]+ (':' [\-A-Za-z0-9._?]+)*) >_starttag %starttag; Prefix = PrefixChar+ >_prefix %prefix; Open = "<"; Sep = ":" >_check_prefix; @@ -111,11 +128,23 @@ public class JavaScanner { } void tag(String prefix, String name, RubyHash attr, RubySymbol flavor) { + // Validate both prefix and name + if ((prefix == null || prefix.trim().isEmpty()) && + (name == null || name.trim().isEmpty())) { + pass_through("<"); + return; + } + + if (name == null || name.trim().isEmpty()) { + pass_through("<" + prefix + ":"); + return; + } + RubyHash tag = RubyHash.newHash(runtime); tag.op_aset( runtime.getCurrentContext(), RubySymbol.newSymbol(runtime, "prefix"), - RubyString.newString(runtime, prefix) + RubyString.newString(runtime, prefix != null ? prefix : "") ); tag.op_aset( runtime.getCurrentContext(),