├── .editorconfig
├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── .yardopts
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Gemfile
├── LICENSE
├── README.md
├── Rakefile
├── appveyor.yml
├── benchmark
├── benchmark_helper.rb
├── css
│ └── parser
│ │ └── parser_bench.rb
├── fixtures
│ ├── big.xml.gz
│ ├── kaf.xml.gz
│ └── with_entities.html
├── html
│ └── lexer
│ │ ├── lexer_bench.rb
│ │ ├── string_average_bench.rb
│ │ └── void_element_bench.rb
├── xml
│ ├── lexer
│ │ ├── io_average_bench.rb
│ │ ├── lexer_bench.rb
│ │ └── string_average_bench.rb
│ ├── node_set
│ │ └── push_bench.rb
│ ├── parser
│ │ ├── average_bench.rb
│ │ ├── comparing_gems_bench.rb
│ │ ├── html_bench.rb
│ │ └── parser_bench.rb
│ ├── pull_parser
│ │ ├── average_bench.rb
│ │ └── pull_parser_bench.rb
│ └── traversal
│ │ ├── average_each_node_bench.rb
│ │ └── each_node_bench.rb
└── xpath
│ ├── compiler
│ ├── big_xml_average_bench.rb
│ ├── comparing_gems_bench.rb
│ ├── concurrent_time_bench.rb
│ ├── descendant_or_self_bench.rb
│ └── simple_bench.rb
│ ├── lexer
│ └── lexer_bench.rb
│ └── parser
│ └── parser_bench.rb
├── checksum
├── .gitkeep
├── oga-0.1.0.gem.sha512
├── oga-0.1.1-java.gem.sha512
├── oga-0.1.1.gem.sha512
├── oga-0.1.2-java.gem.sha512
├── oga-0.1.2.gem.sha512
├── oga-0.1.3-java.gem.sha512
├── oga-0.1.3.gem.sha512
├── oga-0.2.0-java.gem.sha512
├── oga-0.2.0.gem.sha512
├── oga-0.2.1-java.gem.sha512
├── oga-0.2.1.gem.sha512
├── oga-0.2.2-java.gem.sha512
├── oga-0.2.2.gem.sha512
├── oga-0.2.3-java.gem.sha512
├── oga-0.2.3.gem.sha512
├── oga-0.3.0-java.gem.sha512
├── oga-0.3.0.gem.sha512
├── oga-0.3.1-java.gem.sha512
├── oga-0.3.1.gem.sha512
├── oga-0.3.2-java.gem.sha512
├── oga-0.3.2.gem.sha512
├── oga-0.3.3-java.gem.sha512
├── oga-0.3.3.gem.sha512
├── oga-0.3.4-java.gem.sha512
├── oga-0.3.4.gem.sha512
├── oga-1.0.0-java.gem.sha512
├── oga-1.0.0.gem.sha512
├── oga-1.0.1-java.gem.sha512
├── oga-1.0.1.gem.sha512
├── oga-1.0.2-java.gem.sha512
├── oga-1.0.2.gem.sha512
├── oga-1.0.3-java.gem.sha512
├── oga-1.0.3.gem.sha512
├── oga-1.1.0-java.gem.sha512
├── oga-1.1.0.gem.sha512
├── oga-1.2.0-java.gem.sha512
├── oga-1.2.0.gem.sha512
├── oga-1.2.1-java.gem.sha512
├── oga-1.2.1.gem.sha512
├── oga-1.2.2-java.gem.sha512
├── oga-1.2.2.gem.sha512
├── oga-1.2.3-java.gem.sha512
├── oga-1.2.3.gem.sha512
├── oga-1.3.0-java.gem.sha512
├── oga-1.3.0.gem.sha512
├── oga-1.3.1-java.gem.sha512
├── oga-1.3.1.gem.sha512
├── oga-2.0.0-java.gem.sha512
├── oga-2.0.0.gem.sha512
├── oga-2.1-java.gem.sha512
├── oga-2.1.gem.sha512
├── oga-2.10-java.gem.sha512
├── oga-2.10.gem.sha512
├── oga-2.11-java.gem.sha512
├── oga-2.11.gem.sha512
├── oga-2.12-java.gem.sha512
├── oga-2.12.gem.sha512
├── oga-2.13-java.gem.sha512
├── oga-2.13.gem.sha512
├── oga-2.14-java.gem.sha512
├── oga-2.14.gem.sha512
├── oga-2.15-java.gem.sha512
├── oga-2.15.gem.sha512
├── oga-2.16-java.gem.sha512
├── oga-2.16.gem.sha512
├── oga-2.17-java.gem.sha512
├── oga-2.17.gem.sha512
├── oga-2.2-java.gem.sha512
├── oga-2.2.gem.sha512
├── oga-2.3-java.gem.sha512
├── oga-2.3.gem.sha512
├── oga-2.4-java.gem.sha512
├── oga-2.4.gem.sha512
├── oga-2.5-java.gem.sha512
├── oga-2.5.gem.sha512
├── oga-2.6-java.gem.sha512
├── oga-2.6.gem.sha512
├── oga-2.7-java.gem.sha512
├── oga-2.7.gem.sha512
├── oga-2.8-java.gem.sha512
├── oga-2.8.gem.sha512
├── oga-2.9-java.gem.sha512
├── oga-2.9.gem.sha512
├── oga-3.0-java.gem.sha512
├── oga-3.0.gem.sha512
├── oga-3.1-java.gem.sha512
├── oga-3.1.gem.sha512
├── oga-3.2-java.gem.sha512
├── oga-3.2.gem.sha512
├── oga-3.3-java.gem.sha512
├── oga-3.3.gem.sha512
├── oga-3.4-java.gem.sha512
└── oga-3.4.gem.sha512
├── doc
├── .gitkeep
├── css
│ ├── .gitkeep
│ └── common.css
├── css_selectors.md
├── manually_creating_documents.md
├── migrating_from_nokogiri.md
└── xml_namespaces.md
├── ext
├── c
│ ├── extconf.rb
│ ├── lexer.h
│ ├── lexer.rl
│ ├── liboga.c
│ └── liboga.h
├── java
│ ├── Liboga.java
│ └── org
│ │ └── liboga
│ │ └── xml
│ │ └── Lexer.rl
└── ragel
│ └── base_lexer.rl
├── lib
├── oga.rb
└── oga
│ ├── blacklist.rb
│ ├── css
│ ├── lexer.rl
│ └── parser.rll
│ ├── entity_decoder.rb
│ ├── html
│ ├── entities.rb
│ ├── parser.rb
│ └── sax_parser.rb
│ ├── lru.rb
│ ├── oga.rb
│ ├── ruby
│ ├── generator.rb
│ └── node.rb
│ ├── version.rb
│ ├── whitelist.rb
│ ├── xml
│ ├── attribute.rb
│ ├── cdata.rb
│ ├── character_node.rb
│ ├── comment.rb
│ ├── default_namespace.rb
│ ├── doctype.rb
│ ├── document.rb
│ ├── element.rb
│ ├── entities.rb
│ ├── expanded_name.rb
│ ├── generator.rb
│ ├── html_void_elements.rb
│ ├── lexer.rb
│ ├── namespace.rb
│ ├── node.rb
│ ├── node_set.rb
│ ├── parser.rll
│ ├── processing_instruction.rb
│ ├── pull_parser.rb
│ ├── querying.rb
│ ├── sax_parser.rb
│ ├── text.rb
│ ├── to_xml.rb
│ ├── traversal.rb
│ └── xml_declaration.rb
│ └── xpath
│ ├── compiler.rb
│ ├── context.rb
│ ├── conversion.rb
│ ├── lexer.rl
│ └── parser.rll
├── oga.gemspec
├── profile
├── gnuplot
│ └── memory_time.gpi
├── plot.sh
├── profile_helper.rb
├── samples
│ ├── .gitkeep
│ └── xml
│ │ ├── lexer
│ │ └── .gitkeep
│ │ ├── parser
│ │ └── .gitkeep
│ │ └── pull_parser
│ │ └── .gitkeep
└── xml
│ ├── lexer
│ ├── big_xml.rb
│ └── big_xml_io.rb
│ ├── parser
│ └── big_xml.rb
│ └── pull_parser
│ └── big_xml.rb
├── spec
├── oga
│ ├── blacklist_spec.rb
│ ├── css
│ │ ├── compiler
│ │ │ ├── axes_spec.rb
│ │ │ ├── classes_spec.rb
│ │ │ ├── ids_spec.rb
│ │ │ ├── operators_spec.rb
│ │ │ ├── paths_spec.rb
│ │ │ ├── predicates_spec.rb
│ │ │ └── pseudo_classes
│ │ │ │ ├── empty_spec.rb
│ │ │ │ ├── first_child_spec.rb
│ │ │ │ ├── first_of_type_spec.rb
│ │ │ │ ├── last_child_spec.rb
│ │ │ │ ├── last_of_type_spec.rb
│ │ │ │ ├── nth_child_spec.rb
│ │ │ │ ├── nth_last_child_spec.rb
│ │ │ │ ├── nth_last_of_type_spec.rb
│ │ │ │ ├── nth_of_type_spec.rb
│ │ │ │ ├── nth_spec.rb
│ │ │ │ ├── only_child_spec.rb
│ │ │ │ ├── only_of_type_spec.rb
│ │ │ │ └── root_spec.rb
│ │ ├── lexer
│ │ │ ├── axes_spec.rb
│ │ │ ├── namespaces_spec.rb
│ │ │ ├── operators_spec.rb
│ │ │ ├── paths_spec.rb
│ │ │ ├── predicates_spec.rb
│ │ │ ├── pseudo_classes_spec.rb
│ │ │ └── strings_spec.rb
│ │ ├── lexer_spec.rb
│ │ └── parser
│ │ │ ├── axes_spec.rb
│ │ │ ├── cache_spec.rb
│ │ │ ├── classes_spec.rb
│ │ │ ├── ids_spec.rb
│ │ │ ├── operators_spec.rb
│ │ │ ├── paths_spec.rb
│ │ │ ├── predicates_spec.rb
│ │ │ ├── pseudo_classes
│ │ │ ├── empty_spec.rb
│ │ │ ├── first_child_spec.rb
│ │ │ ├── first_of_type_spec.rb
│ │ │ ├── last_child_spec.rb
│ │ │ ├── last_of_type_spec.rb
│ │ │ ├── not_spec.rb
│ │ │ ├── nth_child_spec.rb
│ │ │ ├── nth_last_child_spec.rb
│ │ │ ├── nth_last_of_type_spec.rb
│ │ │ ├── nth_of_type_spec.rb
│ │ │ ├── nth_spec.rb
│ │ │ ├── only_child_spec.rb
│ │ │ ├── only_of_type_spec.rb
│ │ │ └── root_spec.rb
│ │ │ └── wildcards_spec.rb
│ ├── entity_decoder_spec.rb
│ ├── html
│ │ ├── entities_spec.rb
│ │ ├── lexer
│ │ │ ├── attributes_spec.rb
│ │ │ ├── closing_mismatch_spec.rb
│ │ │ ├── closing_rules
│ │ │ │ ├── body_spec.rb
│ │ │ │ ├── caption_spec.rb
│ │ │ │ ├── colgroup_spec.rb
│ │ │ │ ├── dd_spec.rb
│ │ │ │ ├── dt_spec.rb
│ │ │ │ ├── head_spec.rb
│ │ │ │ ├── li_spec.rb
│ │ │ │ ├── optgroup_spec.rb
│ │ │ │ ├── option_spec.rb
│ │ │ │ ├── p_spec.rb
│ │ │ │ ├── rb_spec.rb
│ │ │ │ ├── rp_spec.rb
│ │ │ │ ├── rt_spec.rb
│ │ │ │ ├── rtc_spec.rb
│ │ │ │ ├── table_spec.rb
│ │ │ │ ├── tbody_spec.rb
│ │ │ │ ├── td_spec.rb
│ │ │ │ ├── tfoot_spec.rb
│ │ │ │ ├── th_spec.rb
│ │ │ │ ├── thead_spec.rb
│ │ │ │ ├── tr_spec.rb
│ │ │ │ └── ul_spec.rb
│ │ │ ├── elements_spec.rb
│ │ │ ├── inline_javascript_spec.rb
│ │ │ ├── script_spec.rb
│ │ │ ├── style_spec.rb
│ │ │ └── void_elements_spec.rb
│ │ ├── parser
│ │ │ └── element_spec.rb
│ │ └── sax_parser_spec.rb
│ ├── lru_spec.rb
│ ├── oga_spec.rb
│ ├── ruby
│ │ ├── generator_spec.rb
│ │ └── node_spec.rb
│ ├── whitelist_spec.rb
│ ├── xml
│ │ ├── attribute_spec.rb
│ │ ├── cdata_spec.rb
│ │ ├── character_node_spec.rb
│ │ ├── comment_spec.rb
│ │ ├── doctype_spec.rb
│ │ ├── document_spec.rb
│ │ ├── element_spec.rb
│ │ ├── entities_spec.rb
│ │ ├── generator_spec.rb
│ │ ├── lexer
│ │ │ ├── cdata_spec.rb
│ │ │ ├── comments_spec.rb
│ │ │ ├── doctype_spec.rb
│ │ │ ├── documents_spec.rb
│ │ │ ├── elements_spec.rb
│ │ │ ├── enumerator_spec.rb
│ │ │ ├── general_spec.rb
│ │ │ ├── invalid_elements_spec.rb
│ │ │ ├── io_spec.rb
│ │ │ ├── multibyte_spec.rb
│ │ │ ├── processing_instruction_spec.rb
│ │ │ ├── strict_spec.rb
│ │ │ └── xml_declaration_spec.rb
│ │ ├── namespace_spec.rb
│ │ ├── node_set_spec.rb
│ │ ├── node_spec.rb
│ │ ├── parser
│ │ │ ├── cdata_spec.rb
│ │ │ ├── comments_spec.rb
│ │ │ ├── doctype_spec.rb
│ │ │ ├── documents_spec.rb
│ │ │ ├── elements_spec.rb
│ │ │ ├── error_spec.rb
│ │ │ ├── hierarchy_spec.rb
│ │ │ ├── html_void_elements_spec.rb
│ │ │ ├── io_spec.rb
│ │ │ ├── processing_instruction_spec.rb
│ │ │ ├── text_spec.rb
│ │ │ └── xml_declaration_spec.rb
│ │ ├── processing_instruction_spec.rb
│ │ ├── pull_parser
│ │ │ ├── context_parsing_spec.rb
│ │ │ ├── doctype_spec.rb
│ │ │ ├── element_nesting_spec.rb
│ │ │ ├── element_spec.rb
│ │ │ ├── general_spec.rb
│ │ │ └── processing_instruction_spec.rb
│ │ ├── querying_spec.rb
│ │ ├── sax_parser_spec.rb
│ │ ├── text_spec.rb
│ │ ├── to_xml_spec.rb
│ │ ├── traversal_spec.rb
│ │ └── xml_declaration_spec.rb
│ └── xpath
│ │ ├── compiler
│ │ ├── axes
│ │ │ ├── ancestor_or_self_spec.rb
│ │ │ ├── ancestor_spec.rb
│ │ │ ├── attribute_spec.rb
│ │ │ ├── child_spec.rb
│ │ │ ├── descendant_or_self_spec.rb
│ │ │ ├── descendant_spec.rb
│ │ │ ├── following_sibling_spec.rb
│ │ │ ├── following_spec.rb
│ │ │ ├── namespace_spec.rb
│ │ │ ├── parent_spec.rb
│ │ │ ├── preceding_sibling_spec.rb
│ │ │ ├── preceding_spec.rb
│ │ │ └── self_spec.rb
│ │ ├── calls
│ │ │ ├── boolean_spec.rb
│ │ │ ├── ceiling_spec.rb
│ │ │ ├── concat_spec.rb
│ │ │ ├── contains_spec.rb
│ │ │ ├── count_spec.rb
│ │ │ ├── false_spec.rb
│ │ │ ├── floor_spec.rb
│ │ │ ├── id_spec.rb
│ │ │ ├── lang_spec.rb
│ │ │ ├── last_spec.rb
│ │ │ ├── local_name_spec.rb
│ │ │ ├── name_spec.rb
│ │ │ ├── namespace_uri_spec.rb
│ │ │ ├── normalize_space_spec.rb
│ │ │ ├── not_spec.rb
│ │ │ ├── number_spec.rb
│ │ │ ├── position_spec.rb
│ │ │ ├── round_spec.rb
│ │ │ ├── starts_with_spec.rb
│ │ │ ├── string_length_spec.rb
│ │ │ ├── string_spec.rb
│ │ │ ├── substring_after_spec.rb
│ │ │ ├── substring_before_spec.rb
│ │ │ ├── substring_spec.rb
│ │ │ ├── sum_spec.rb
│ │ │ ├── translate_spec.rb
│ │ │ └── true_spec.rb
│ │ ├── html_spec.rb
│ │ ├── namespace_aliases_spec.rb
│ │ ├── operators
│ │ │ ├── add_spec.rb
│ │ │ ├── and_spec.rb
│ │ │ ├── div_spec.rb
│ │ │ ├── eq_spec.rb
│ │ │ ├── gt_spec.rb
│ │ │ ├── gte_spec.rb
│ │ │ ├── lt_spec.rb
│ │ │ ├── lte_spec.rb
│ │ │ ├── mod_spec.rb
│ │ │ ├── mul_spec.rb
│ │ │ ├── neq_spec.rb
│ │ │ ├── or_spec.rb
│ │ │ ├── pipe_spec.rb
│ │ │ └── sub_spec.rb
│ │ ├── paths_spec.rb
│ │ ├── predicates_spec.rb
│ │ ├── type_tests
│ │ │ ├── comment_spec.rb
│ │ │ ├── node_spec.rb
│ │ │ ├── processing_instruction_spec.rb
│ │ │ └── text_spec.rb
│ │ ├── types
│ │ │ ├── float_spec.rb
│ │ │ ├── int_spec.rb
│ │ │ └── string_spec.rb
│ │ ├── variables_spec.rb
│ │ └── wildcard_spec.rb
│ │ ├── compiler_spec.rb
│ │ ├── context_spec.rb
│ │ ├── conversion_spec.rb
│ │ ├── lexer
│ │ ├── axes_spec.rb
│ │ ├── calls_spec.rb
│ │ ├── floats_spec.rb
│ │ ├── general_spec.rb
│ │ ├── integers_spec.rb
│ │ ├── node_type_spec.rb
│ │ ├── operators_spec.rb
│ │ ├── predicates_spec.rb
│ │ ├── strings_spec.rb
│ │ └── variable_spec.rb
│ │ └── parser
│ │ ├── axes_spec.rb
│ │ ├── cache_spec.rb
│ │ ├── calls_spec.rb
│ │ ├── grouping_spec.rb
│ │ ├── operator_precedence_spec.rb
│ │ ├── operators_spec.rb
│ │ ├── paths_spec.rb
│ │ ├── predicates_spec.rb
│ │ ├── type_tests_spec.rb
│ │ ├── variable_spec.rb
│ │ └── wildcard_spec.rb
├── spec_helper.rb
└── support
│ ├── evaluation_helpers.rb
│ ├── parsing_helpers.rb
│ ├── simplecov.rb
│ └── threading_helpers.rb
└── task
├── build.rake
├── checksum.rake
├── coverage.rake
├── doc.rake
├── fixtures.rake
├── generate.rake
├── lexer.rake
├── parser.rake
├── tag.rake
├── test.rake
└── todo.rake
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | end_of_line = lf
5 | indent_style = spaces
6 | trim_trailing_whitespace = true
7 |
8 | [*.{y,rb,rl,rll}]
9 | indent_size = 2
10 |
11 | [*.{h,c,java}]
12 | indent_size = 4
13 |
14 | [ext/c/*.rl]
15 | indent_size = 4
16 |
17 | [ext/java/org/liboga/xml/*.rl]
18 | indent_size = 4
19 |
20 | [ext/ragel/*.rl]
21 | indent_size = 4
22 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | ---
2 | name: Test
3 | on: push
4 |
5 | jobs:
6 | test:
7 | name: Run tests
8 | runs-on: ubuntu-latest
9 | strategy:
10 | fail-fast: false
11 | matrix:
12 | ruby:
13 | - '2.6'
14 | - '2.7'
15 | - '3.2'
16 | - jruby
17 | steps:
18 | - uses: actions/checkout@v3
19 |
20 | - uses: ruby/setup-ruby@v1
21 | with:
22 | ruby-version: ${{ matrix.ruby }}
23 | bundler-cache: true
24 |
25 | - run: sudo apt-get install -y ragel
26 |
27 | - run: bundle exec rake
28 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | yardoc
2 | coverage
3 | pkg
4 | Gemfile.lock
5 |
6 | lib/oga/xml/parser.rb
7 | lib/oga/xpath/lexer.rb
8 | lib/oga/xpath/parser.rb
9 | lib/oga/css/lexer.rb
10 | lib/oga/css/parser.rb
11 |
12 | lib/liboga.*
13 |
14 | benchmark/fixtures/big.xml
15 | benchmark/fixtures/kaf.xml
16 |
17 | profile/samples/xml/*.txt
18 | profile/samples/xml/*/*.txt
19 | *.so
20 | tmp
21 |
22 | ext/c/lexer.c
23 | ext/java/org/liboga/xml/Lexer.java
24 |
--------------------------------------------------------------------------------
/.yardopts:
--------------------------------------------------------------------------------
1 | ./lib/oga/**/*.rb ./lib/oga.rb
2 | -m markdown
3 | -M kramdown
4 | -o yardoc
5 | -r ./README.md
6 | --protected
7 | --asset ./doc/css/common.css:css/common.css
8 | --verbose
9 | -
10 | ./doc/*.md
11 | LICENSE
12 | CONTRIBUTING.md
13 | CHANGELOG.md
14 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gemspec
4 |
5 | group :benchmarking do
6 | gem 'ox', :platforms => [:mri, :rbx]
7 | gem 'nokogiri'
8 | end
9 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | require 'bundler'
2 | require 'bundler/gem_tasks'
3 | require 'digest/sha2'
4 | require 'rake/clean'
5 |
6 | if Gem.win_platform?
7 | task :devkit do
8 | begin
9 | require 'devkit'
10 | rescue LoadError
11 | warn 'Failed to load devkit, installation might fail'
12 | end
13 | end
14 |
15 | task :compile => [:devkit]
16 | end
17 |
18 | GEMSPEC = Gem::Specification.load('oga.gemspec')
19 |
20 | if RUBY_PLATFORM == 'java'
21 | require 'rake/javaextensiontask'
22 |
23 | Rake::JavaExtensionTask.new('liboga', GEMSPEC) do |task|
24 | task.ext_dir = 'ext/java'
25 | task.target_version = '1.8'
26 | task.source_version = '1.8'
27 | end
28 | else
29 | require 'rake/extensiontask'
30 |
31 | Rake::ExtensionTask.new('liboga', GEMSPEC) do |task|
32 | task.ext_dir = 'ext/c'
33 | end
34 | end
35 |
36 | CLEAN.include(
37 | 'coverage',
38 | 'yardoc',
39 | 'lib/oga/xml/parser.rb',
40 | 'lib/oga/xpath/lexer.rb',
41 | 'lib/oga/xpath/parser.rb',
42 | 'lib/oga/css/lexer.rb',
43 | 'lib/oga/css/parser.rb',
44 | 'benchmark/fixtures/big.xml',
45 | 'profile/samples/**/*.txt',
46 | 'lib/liboga.*',
47 | 'tmp',
48 | 'ext/c/lexer.c',
49 | 'ext/java/org/liboga/xml/Lexer.java'
50 | )
51 |
52 | Dir['./task/*.rake'].each do |task|
53 | import(task)
54 | end
55 |
56 | task :default => :test
57 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | ---
2 | image: Visual Studio 2017
3 |
4 | version: "{build}"
5 |
6 | install:
7 | - C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw-w64-x86_64-ragel"
8 | - SET PATH=C:\msys64\mingw64\bin;%PATH%
9 | - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
10 | - bundle install --retry 3
11 |
12 | build: off
13 |
14 | before_test:
15 | - ragel --version
16 | - ruby --version
17 | - gem --version
18 | - bundle --version
19 |
20 | test_script:
21 | - rake
22 |
23 | environment:
24 | matrix:
25 | - ruby_version: "22"
26 | - ruby_version: "22-x64"
27 | - ruby_version: "23"
28 | - ruby_version: "23-x64"
29 | - ruby_version: "24"
30 | - ruby_version: "24-x64"
31 |
32 | skip_tags: true
33 |
--------------------------------------------------------------------------------
/benchmark/benchmark_helper.rb:
--------------------------------------------------------------------------------
1 | require 'bundler/setup'
2 | require 'stringio'
3 | require 'benchmark'
4 | require 'benchmark/ips'
5 | require 'oga'
6 |
7 | # @return [File]
8 | def big_xml_file
9 | File.open(File.expand_path('../fixtures/big.xml', __FILE__), 'r')
10 | end
11 |
12 | # @return [File]
13 | def big_kaf_file
14 | File.open(File.expand_path('../fixtures/kaf.xml', __FILE__), 'r')
15 | end
16 |
17 | # @return [String]
18 | def read_big_xml
19 | big_xml_file.read
20 | end
21 |
22 | # @return [String]
23 | def read_big_kaf
24 | big_kaf_file.read
25 | end
26 |
27 | # @return [String]
28 | def read_html
29 | return File.read(File.expand_path('../fixtures/with_entities.html', __FILE__))
30 | end
31 |
32 | ##
33 | # Benchmarks the average runtime of the given block.
34 | #
35 | # @param [Fixnum] amount The amount of times to call the block.
36 | # @param [Fixnum] precision
37 | #
38 | def measure_average(amount = 10, precision = 3)
39 | timings = []
40 |
41 | amount.times do |iter|
42 | timing = Benchmark.measure { yield }.real
43 |
44 | timings << timing.real
45 |
46 | puts "Iteration: #{iter + 1}: #{timing.real.round(precision)}"
47 | end
48 |
49 | average = timings.inject(:+) / timings.length
50 |
51 | puts
52 | puts "Iterations: #{amount}"
53 | puts "Average: #{average.round(precision)} sec"
54 | end
55 |
--------------------------------------------------------------------------------
/benchmark/css/parser/parser_bench.rb:
--------------------------------------------------------------------------------
1 | require_relative '../../benchmark_helper'
2 |
3 | css = 'foo bar bar.some_class element#with_id[title="Foo"]'
4 |
5 | Benchmark.ips do |bench|
6 | bench.report 'without cache' do
7 | Oga::CSS::Parser.new(css).parse
8 | end
9 |
10 | bench.report 'with cache' do
11 | Oga::CSS::Parser.parse_with_cache(css)
12 | end
13 |
14 | bench.compare!
15 | end
16 |
--------------------------------------------------------------------------------
/benchmark/fixtures/big.xml.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yorickpeterse/oga/6c4356f0f5af0212e9c6043b45b660b61fc624b4/benchmark/fixtures/big.xml.gz
--------------------------------------------------------------------------------
/benchmark/fixtures/kaf.xml.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yorickpeterse/oga/6c4356f0f5af0212e9c6043b45b660b61fc624b4/benchmark/fixtures/kaf.xml.gz
--------------------------------------------------------------------------------
/benchmark/html/lexer/lexer_bench.rb:
--------------------------------------------------------------------------------
1 | require_relative '../../benchmark_helper'
2 |
3 | html = read_html
4 |
5 | Benchmark.ips do |bench|
6 | bench.report 'lex HTML' do
7 | Oga::XML::Lexer.new(html, :html => true).advance { }
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/benchmark/html/lexer/string_average_bench.rb:
--------------------------------------------------------------------------------
1 | require_relative '../../benchmark_helper'
2 |
3 | xml = read_big_xml
4 |
5 | measure_average do
6 | Oga::XML::Lexer.new(xml, :html => true).advance { }
7 | end
8 |
--------------------------------------------------------------------------------
/benchmark/html/lexer/void_element_bench.rb:
--------------------------------------------------------------------------------
1 | require_relative '../../benchmark_helper'
2 |
3 | content = ''
4 | max_size = 5 * 1024 * 1024
5 |
6 | while content.bytesize <= max_size
7 | content << "
"
8 | end
9 |
10 | html = "
element closed using a element' do 6 | expect(lex_html('
foo')).to eq([ 7 | [:T_ELEM_NAME, 'p', 1], 8 | [:T_TEXT, 'foo', 1], 9 | [:T_ELEM_END, nil, 1] 10 | ]) 11 | end 12 | 13 | it 'lexes a element' do 14 | expect(lex_html('')).to eq([ 15 | [:T_ELEM_NAME, 'object', 1], 16 | [:T_ELEM_NAME, 'param', 1], 17 | [:T_ELEM_END, nil, 1], 18 | [:T_ELEM_NAME, 'param', 1], 19 | [:T_ELEM_END, nil, 1], 20 | [:T_ELEM_END, nil, 1] 21 | ]) 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/oga/html/lexer/closing_rules/body_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Oga::XML::Lexer do 4 | describe 'using HTML
elements' do 5 | it 'lexes an unclosed followed by a as separate elements' do 6 | expect(lex_html('foobar')).to eq([ 7 | [:T_ELEM_NAME, 'body', 1], 8 | [:T_TEXT, 'foo', 1], 9 | [:T_ELEM_END, nil, 1], 10 | [:T_ELEM_NAME, 'head', 1], 11 | [:T_TEXT, 'bar', 1], 12 | [:T_ELEM_END, nil, 1] 13 | ]) 14 | end 15 | 16 | it 'lexes an unclosed followed by a as separate elements' do 17 | expect(lex_html('foobar')).to eq([ 18 | [:T_ELEM_NAME, 'body', 1], 19 | [:T_TEXT, 'foo', 1], 20 | [:T_ELEM_END, nil, 1], 21 | [:T_ELEM_NAME, 'body', 1], 22 | [:T_TEXT, 'bar', 1], 23 | [:T_ELEM_END, nil, 1] 24 | ]) 25 | end 26 | 27 | it 'lexes afollowing an unclosed
as a child element' do 28 | expect(lex_html('foo')).to eq([ 29 | [:T_ELEM_NAME, 'body', 1], 30 | [:T_ELEM_NAME, 'p', 1], 31 | [:T_TEXT, 'foo', 1], 32 | [:T_ELEM_END, nil, 1], 33 | [:T_ELEM_END, nil, 1] 34 | ]) 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /spec/oga/html/lexer/closing_rules/colgroup_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Oga::XML::Lexer do 4 | describe 'using HTML