rexml-css_selector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +8 -0
  3. data/.rubocop.yml +48 -0
  4. data/CODE_OF_CONDUCT.md +84 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +74 -0
  7. data/Rakefile +27 -0
  8. data/example/prism.rb +13 -0
  9. data/lib/rexml/css_selector/adapters/prism_adapter.rb +77 -0
  10. data/lib/rexml/css_selector/adapters/rexml_adapter.rb +77 -0
  11. data/lib/rexml/css_selector/ast.rb +107 -0
  12. data/lib/rexml/css_selector/base_adapter.rb +88 -0
  13. data/lib/rexml/css_selector/compiler.rb +287 -0
  14. data/lib/rexml/css_selector/parser.rb +430 -0
  15. data/lib/rexml/css_selector/pseudo_class_def.rb +19 -0
  16. data/lib/rexml/css_selector/queries/adjacent_query.rb +18 -0
  17. data/lib/rexml/css_selector/queries/attribute_matcher_query.rb +58 -0
  18. data/lib/rexml/css_selector/queries/attribute_presence_query.rb +20 -0
  19. data/lib/rexml/css_selector/queries/checked_query.rb +18 -0
  20. data/lib/rexml/css_selector/queries/child_query.rb +18 -0
  21. data/lib/rexml/css_selector/queries/class_name_query.rb +18 -0
  22. data/lib/rexml/css_selector/queries/descendant_query.rb +41 -0
  23. data/lib/rexml/css_selector/queries/disabled_query.rb +18 -0
  24. data/lib/rexml/css_selector/queries/empty_query.rb +17 -0
  25. data/lib/rexml/css_selector/queries/has_query.rb +34 -0
  26. data/lib/rexml/css_selector/queries/id_query.rb +18 -0
  27. data/lib/rexml/css_selector/queries/nested_query.rb +18 -0
  28. data/lib/rexml/css_selector/queries/not_query.rb +18 -0
  29. data/lib/rexml/css_selector/queries/nth_child_of_query.rb +40 -0
  30. data/lib/rexml/css_selector/queries/nth_child_query.rb +32 -0
  31. data/lib/rexml/css_selector/queries/nth_last_child_of_query.rb +40 -0
  32. data/lib/rexml/css_selector/queries/nth_last_child_query.rb +33 -0
  33. data/lib/rexml/css_selector/queries/nth_last_of_type_query.rb +44 -0
  34. data/lib/rexml/css_selector/queries/nth_of_type_query.rb +44 -0
  35. data/lib/rexml/css_selector/queries/one_of_query.rb +17 -0
  36. data/lib/rexml/css_selector/queries/only_child_query.rb +23 -0
  37. data/lib/rexml/css_selector/queries/only_of_type_query.rb +34 -0
  38. data/lib/rexml/css_selector/queries/root_query.rb +17 -0
  39. data/lib/rexml/css_selector/queries/scope_query.rb +17 -0
  40. data/lib/rexml/css_selector/queries/sibling_query.rb +21 -0
  41. data/lib/rexml/css_selector/queries/tag_name_type_query.rb +30 -0
  42. data/lib/rexml/css_selector/queries/true_query.rb +15 -0
  43. data/lib/rexml/css_selector/queries/universal_type_query.rb +22 -0
  44. data/lib/rexml/css_selector/query_context.rb +25 -0
  45. data/lib/rexml/css_selector/version.rb +8 -0
  46. data/lib/rexml/css_selector.rb +197 -0
  47. data/sig/rexml/css_selector.rbs +5 -0
  48. metadata +137 -0
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rexml/document"
4
+ require "set"
5
+ require "strscan"
6
+
7
+ module REXML
8
+ module CSSSelector
9
+ # Error is a base class of errors in this library.
10
+ class Error < ::StandardError
11
+ end
12
+ end
13
+ end
14
+
15
+ require_relative "css_selector/ast"
16
+ require_relative "css_selector/base_adapter"
17
+ require_relative "css_selector/parser"
18
+ require_relative "css_selector/pseudo_class_def"
19
+ require_relative "css_selector/query_context"
20
+ require_relative "css_selector/version"
21
+
22
+ require_relative "css_selector/adapters/rexml_adapter"
23
+
24
+ require_relative "css_selector/queries/adjacent_query"
25
+ require_relative "css_selector/queries/attribute_matcher_query"
26
+ require_relative "css_selector/queries/attribute_presence_query"
27
+ require_relative "css_selector/queries/checked_query"
28
+ require_relative "css_selector/queries/child_query"
29
+ require_relative "css_selector/queries/class_name_query"
30
+ require_relative "css_selector/queries/descendant_query"
31
+ require_relative "css_selector/queries/disabled_query"
32
+ require_relative "css_selector/queries/empty_query"
33
+ require_relative "css_selector/queries/has_query"
34
+ require_relative "css_selector/queries/id_query"
35
+ require_relative "css_selector/queries/nested_query"
36
+ require_relative "css_selector/queries/nth_child_of_query"
37
+ require_relative "css_selector/queries/nth_child_query"
38
+ require_relative "css_selector/queries/nth_last_child_of_query"
39
+ require_relative "css_selector/queries/nth_last_child_query"
40
+ require_relative "css_selector/queries/nth_last_of_type_query"
41
+ require_relative "css_selector/queries/nth_of_type_query"
42
+ require_relative "css_selector/queries/not_query"
43
+ require_relative "css_selector/queries/only_child_query"
44
+ require_relative "css_selector/queries/only_of_type_query"
45
+ require_relative "css_selector/queries/one_of_query"
46
+ require_relative "css_selector/queries/root_query"
47
+ require_relative "css_selector/queries/scope_query"
48
+ require_relative "css_selector/queries/sibling_query"
49
+ require_relative "css_selector/queries/tag_name_type_query"
50
+ require_relative "css_selector/queries/true_query"
51
+ require_relative "css_selector/queries/universal_type_query"
52
+
53
+ require_relative "css_selector/compiler"
54
+
55
+ module REXML
56
+ # CSSSelector provides CSS selector matching for +REXML+.
57
+ module CSSSelector
58
+ # DEFAULT_CONFIG is the default configuration value.
59
+ DEFAULT_CONFIG = {
60
+ pseudo_classes: {
61
+ "first-child" => PseudoClassDef::FIRST_CHILD,
62
+ "last-child" => PseudoClassDef::LAST_CHILD,
63
+ "only-child" => PseudoClassDef::ONLY_CHILD,
64
+ "nth-child" => PseudoClassDef::NTH_CHILD,
65
+ "nth-last-child" => PseudoClassDef::NTH_LAST_CHILD,
66
+ "first-of-type" => PseudoClassDef::FIRST_OF_TYPE,
67
+ "last-of-type" => PseudoClassDef::LAST_OF_TYPE,
68
+ "only-of-type" => PseudoClassDef::ONLY_OF_TYPE,
69
+ "nth-of-type" => PseudoClassDef::NTH_OF_TYPE,
70
+ "nth-last-of-type" => PseudoClassDef::NTH_LAST_OF_TYPE,
71
+ "root" => PseudoClassDef::ROOT,
72
+ "is" => PseudoClassDef::IS,
73
+ "where" => PseudoClassDef::WHERE,
74
+ "not" => PseudoClassDef::NOT,
75
+ "scope" => PseudoClassDef::SCOPE,
76
+ "has" => PseudoClassDef::HAS,
77
+ "empty" => PseudoClassDef::EMPTY,
78
+ "checked" => PseudoClassDef::CHECKED,
79
+ "disabled" => PseudoClassDef::DISABLED
80
+ }.freeze,
81
+ adapter: Adapters::REXMLAdapter::INSTANCE,
82
+ substitutions: {}.freeze,
83
+ options: {
84
+ tag_name_case: :sensitive,
85
+ attribute_name_case: :sensitive,
86
+ case_sensitive_attribute_values: [].freeze,
87
+ checked_elements: [].freeze,
88
+ disabled_elements: [].freeze
89
+ }.freeze
90
+ }.freeze
91
+
92
+ # HTML_OPTIONS is a set of options.
93
+ #
94
+ # This value is used when <tt>html: true</tt> is specified.
95
+ HTML_OPTIONS = {
96
+ tag_name_case: :insensitive,
97
+ attribute_name_case: :insensitive,
98
+ # See https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors.
99
+ case_sensitive_attribute_values:
100
+ Set[
101
+ *%w[
102
+ accept
103
+ accept-charset
104
+ align
105
+ alink
106
+ axis
107
+ bgcolor
108
+ charset
109
+ checked
110
+ clear
111
+ codetype
112
+ color
113
+ compact
114
+ declare
115
+ defer
116
+ dir
117
+ direction
118
+ disabled
119
+ enctype
120
+ face
121
+ frame
122
+ hreflang
123
+ http-equiv
124
+ lang
125
+ language
126
+ link
127
+ media
128
+ method
129
+ multiple
130
+ nohref
131
+ noresize
132
+ noshade
133
+ nowrap
134
+ readonly
135
+ rel
136
+ rev
137
+ rules
138
+ scope
139
+ scrolling
140
+ selected
141
+ shape
142
+ target
143
+ text
144
+ type
145
+ valign
146
+ valuetype
147
+ vlink
148
+ ]
149
+ ].freeze,
150
+ checked_elements: [].freeze,
151
+ disabled_elements: [].freeze
152
+ }.freeze
153
+
154
+ def self.setup_config(config) # :nodoc:
155
+ pseudo_classes = DEFAULT_CONFIG[:pseudo_classes]
156
+ pseudo_classes = pseudo_classes.merge(config[:pseudo_classes]) if config[:pseudo_classes]
157
+
158
+ adapter = config[:adapter] || DEFAULT_CONFIG[:adapter]
159
+
160
+ substitutions = DEFAULT_CONFIG[:substitutions]
161
+ substitutions = substitutions.merge(config[:substitutions]) if config[:substitutions]
162
+
163
+ options = config[:html] ? HTML_OPTIONS : DEFAULT_CONFIG[:options]
164
+ options = options.merge(config[:options]) if config[:options]
165
+
166
+ [pseudo_classes, adapter, substitutions, options]
167
+ end
168
+
169
+ def self.is(node, selector, scope: nil, **config)
170
+ pseudo_classes, adapter, substitutions, options = setup_config(config)
171
+ scope ||= adapter.get_document_node(node)
172
+ selector = Parser.new(pseudo_classes:).parse(selector)
173
+ query = Compiler.new(pseudo_classes:).compile(selector)
174
+ context = QueryContext.new(scope:, adapter:, substitutions:, options:)
175
+ query.call(node, context)
176
+ end
177
+
178
+ def self.each_select(scope, selector, **config)
179
+ pseudo_classes, adapter, substitutions, options = setup_config(config)
180
+ selector = Parser.new(pseudo_classes:).parse(selector)
181
+ query = Compiler.new(pseudo_classes:).compile(selector)
182
+ context = QueryContext.new(scope:, adapter:, substitutions:, options:)
183
+ adapter.each_recursive_element(scope) { yield _1 if query.call(_1, context) }
184
+ nil
185
+ end
186
+
187
+ def self.select(scope, selector, **config)
188
+ each_select(scope, selector, **config) { |node| break node }
189
+ end
190
+
191
+ def self.select_all(scope, selector, **config)
192
+ elements = []
193
+ each_select(scope, selector, **config) { |node| elements << node }
194
+ elements
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,5 @@
1
+ module REXML
2
+ module CSSSelector
3
+ VERSION: String
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rexml-css_selector
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hiroya Fujinami
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-05-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rexml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.8
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: set
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: strscan
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
55
+ description: |
56
+ This library is a REXML extension for supporting CSS selector.
57
+ It provides CSS selector matching.
58
+ email:
59
+ - make.just.on@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".editorconfig"
65
+ - ".rubocop.yml"
66
+ - CODE_OF_CONDUCT.md
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - example/prism.rb
71
+ - lib/rexml/css_selector.rb
72
+ - lib/rexml/css_selector/adapters/prism_adapter.rb
73
+ - lib/rexml/css_selector/adapters/rexml_adapter.rb
74
+ - lib/rexml/css_selector/ast.rb
75
+ - lib/rexml/css_selector/base_adapter.rb
76
+ - lib/rexml/css_selector/compiler.rb
77
+ - lib/rexml/css_selector/parser.rb
78
+ - lib/rexml/css_selector/pseudo_class_def.rb
79
+ - lib/rexml/css_selector/queries/adjacent_query.rb
80
+ - lib/rexml/css_selector/queries/attribute_matcher_query.rb
81
+ - lib/rexml/css_selector/queries/attribute_presence_query.rb
82
+ - lib/rexml/css_selector/queries/checked_query.rb
83
+ - lib/rexml/css_selector/queries/child_query.rb
84
+ - lib/rexml/css_selector/queries/class_name_query.rb
85
+ - lib/rexml/css_selector/queries/descendant_query.rb
86
+ - lib/rexml/css_selector/queries/disabled_query.rb
87
+ - lib/rexml/css_selector/queries/empty_query.rb
88
+ - lib/rexml/css_selector/queries/has_query.rb
89
+ - lib/rexml/css_selector/queries/id_query.rb
90
+ - lib/rexml/css_selector/queries/nested_query.rb
91
+ - lib/rexml/css_selector/queries/not_query.rb
92
+ - lib/rexml/css_selector/queries/nth_child_of_query.rb
93
+ - lib/rexml/css_selector/queries/nth_child_query.rb
94
+ - lib/rexml/css_selector/queries/nth_last_child_of_query.rb
95
+ - lib/rexml/css_selector/queries/nth_last_child_query.rb
96
+ - lib/rexml/css_selector/queries/nth_last_of_type_query.rb
97
+ - lib/rexml/css_selector/queries/nth_of_type_query.rb
98
+ - lib/rexml/css_selector/queries/one_of_query.rb
99
+ - lib/rexml/css_selector/queries/only_child_query.rb
100
+ - lib/rexml/css_selector/queries/only_of_type_query.rb
101
+ - lib/rexml/css_selector/queries/root_query.rb
102
+ - lib/rexml/css_selector/queries/scope_query.rb
103
+ - lib/rexml/css_selector/queries/sibling_query.rb
104
+ - lib/rexml/css_selector/queries/tag_name_type_query.rb
105
+ - lib/rexml/css_selector/queries/true_query.rb
106
+ - lib/rexml/css_selector/queries/universal_type_query.rb
107
+ - lib/rexml/css_selector/query_context.rb
108
+ - lib/rexml/css_selector/version.rb
109
+ - sig/rexml/css_selector.rbs
110
+ homepage: https://github.com/makenowjust/rexml-css_selector/
111
+ licenses:
112
+ - MIT
113
+ metadata:
114
+ homepage_uri: https://github.com/makenowjust/rexml-css_selector/
115
+ source_code_uri: https://github.com/makenowjust/rexml-css_selector.git
116
+ changelog_uri: https://github.com/makenowjust/rexml-css_selector/blob/releases/
117
+ rubygems_mfa_required: 'true'
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.1.0
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.5.9
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: A REXML extension for supporting CSS selector.
137
+ test_files: []