rexml-css_selector 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []