nokolexbor 0.3.1-x86_64-darwin → 0.3.3-x86_64-darwin

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f01016194dfcfb9cb81bca65c5e606c981bfea10ca241fb5c791957f00aa4b0e
4
- data.tar.gz: e95070cc353c7991be74f891c5c857218b5bb9e2c2b2506086c413ae511bd73f
3
+ metadata.gz: cead1d5973dbabeb2bac9e3e413d21e7dbe4e36e42e58fdf22ad110e02f3decf
4
+ data.tar.gz: 443c22b64508e785863c7e552ead72cc00f71369b216f6ea38d2e29d10bb4f8a
5
5
  SHA512:
6
- metadata.gz: 439d129a0b6cbd075f4b970f66e3234bfd8a278b373a9e53d8a91d94e861e7d977e05a34a8b532ec59725cd396be70d4db0a1d9705ab9254565451e35bc7b0ca
7
- data.tar.gz: '08b14ae65c496e31aaff33219173a8014f8e253c2965eb8af7556bd52626b1be03235d8473e3914233f67f90a1401cc4e23fb0cb0c7f13fabd2ade8d482dc753'
6
+ metadata.gz: 82efd32a9058e2e3ee63e1215dddfa3bb24fbe11a81d50f795738d10406b0d09eed48d00e301aab44796124150e7cf3d6cfd11295d833f0edfda3b21a50a5bb5
7
+ data.tar.gz: abce68297cb6cdfd144291d1ad40b8c1c5d16b512400890e5405eedf16976e3d8434a79838cab2690ebb54763f3770c996c1c4b5926b5196efb1ed25f3116524
Binary file
Binary file
Binary file
Binary file
@@ -93,5 +93,9 @@ module Nokolexbor
93
93
  head.prepend_child(element)
94
94
  end
95
95
  end
96
+
97
+ private
98
+
99
+ IMPLIED_XPATH_CONTEXTS = ["//"].freeze # :nodoc:
96
100
  end
97
101
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nokolexbor
4
+ class DocumentFragment < Nokolexbor::Node
5
+ def self.parse(tags)
6
+ new(Nokolexbor::Document.new, tags, nil)
7
+ end
8
+
9
+ def initialize(document, tags = nil, ctx = nil)
10
+ return self unless tags
11
+
12
+ ctx ||= document
13
+ node_set = ctx.parse(tags)
14
+ node_set.each { |child| child.parent = self } unless node_set.empty?
15
+ nil
16
+ end
17
+
18
+ def name
19
+ "#document-fragment"
20
+ end
21
+
22
+ alias_method :outer_html, :inner_html
23
+ alias_method :to_html, :outer_html
24
+ alias_method :to_s, :outer_html
25
+ alias_method :serialize, :outer_html
26
+
27
+ def fragment(data)
28
+ document.fragment(data)
29
+ end
30
+ end
31
+ end
@@ -182,6 +182,10 @@ module Nokolexbor
182
182
  end
183
183
  end
184
184
 
185
+ def fragment(tags)
186
+ Nokolexbor::DocumentFragment.new(document, tags, self)
187
+ end
188
+
185
189
  alias_method :inner_html=, :children=
186
190
 
187
191
  def css(*args)
@@ -192,6 +196,16 @@ module Nokolexbor
192
196
  at_css_impl(args.join(', '))
193
197
  end
194
198
 
199
+ def nokogiri_css(*args)
200
+ rules, handler, ns, _ = extract_params(args)
201
+
202
+ nokogiri_css_internal(self, rules, handler, ns)
203
+ end
204
+
205
+ def nokogiri_at_css(*args)
206
+ nokogiri_css(*args).first
207
+ end
208
+
195
209
  def xpath(*args)
196
210
  paths, handler, ns, binds = extract_params(args)
197
211
 
@@ -299,6 +313,10 @@ module Nokolexbor
299
313
 
300
314
  private
301
315
 
316
+ def nokogiri_css_internal(node, rules, handler, ns)
317
+ xpath_internal(node, css_rules_to_xpath(rules, ns), handler, ns, nil)
318
+ end
319
+
302
320
  def xpath_internal(node, paths, handler, ns, binds)
303
321
  # document = node.document
304
322
  # return NodeSet.new(document) unless document
@@ -326,6 +344,34 @@ module Nokolexbor
326
344
  ctx.evaluate(path, handler)
327
345
  end
328
346
 
347
+ def css_rules_to_xpath(rules, ns)
348
+ rules.map { |rule| xpath_query_from_css_rule(rule, ns) }
349
+ end
350
+
351
+ def ensure_nokogiri
352
+ unless defined?(Nokogiri) && defined?(Nokogiri::CSS)
353
+ require 'nokogiri'
354
+ end
355
+ rescue LoadError
356
+ fail('nokogiri_css and nokogiri_at_css require Nokogiri to be installed')
357
+ end
358
+
359
+ def xpath_query_from_css_rule(rule, ns)
360
+ ensure_nokogiri
361
+ if defined? Nokogiri::CSS::XPathVisitor::BuiltinsConfig
362
+ visitor = Nokogiri::CSS::XPathVisitor.new(
363
+ builtins: Nokogiri::CSS::XPathVisitor::BuiltinsConfig::OPTIMAL,
364
+ doctype: :html4,
365
+ )
366
+ else
367
+ visitor = Nokogiri::CSS::XPathVisitorOptimallyUseBuiltins.new
368
+ end
369
+ self.class::IMPLIED_XPATH_CONTEXTS.map do |implied_xpath_context|
370
+ Nokogiri::CSS.xpath_for(rule.to_s, { prefix: implied_xpath_context, ns: ns,
371
+ visitor: visitor, })
372
+ end.join(" | ")
373
+ end
374
+
329
375
  def extract_params(params)
330
376
  handler = params.find do |param|
331
377
  ![Hash, String, Symbol].include?(param.class)
@@ -344,5 +390,7 @@ module Nokolexbor
344
390
 
345
391
  [params, handler, ns, binds]
346
392
  end
393
+
394
+ IMPLIED_XPATH_CONTEXTS = [".//"].freeze
347
395
  end
348
- end
396
+ end
@@ -126,6 +126,23 @@ module Nokolexbor
126
126
  end
127
127
  end
128
128
  end
129
+
130
+ def nokogiri_css(*args)
131
+ rules, handler, ns, _ = extract_params(args)
132
+ paths = css_rules_to_xpath(rules, ns)
133
+
134
+ NodeSet.new(@document) do |set|
135
+ each do |node|
136
+ node.send(:xpath_internal, node, paths, handler, ns, nil).each do |inner_node|
137
+ set << inner_node
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ private
144
+
145
+ IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
129
146
 
130
147
  end
131
148
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nokolexbor
4
- VERSION = '0.3.1'
4
+ VERSION = '0.3.3'
5
5
  end
data/lib/nokolexbor.rb CHANGED
@@ -25,6 +25,7 @@ require 'nokolexbor/version'
25
25
  require 'nokolexbor/node'
26
26
  require 'nokolexbor/document'
27
27
  require 'nokolexbor/node_set'
28
+ require 'nokolexbor/document_fragment'
28
29
  require 'nokolexbor/attribute'
29
30
  require 'nokolexbor/xpath'
30
31
  require 'nokolexbor/xpath_context'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nokolexbor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: x86_64-darwin
6
6
  authors:
7
7
  - Yicheng Zhou
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-31 00:00:00.000000000 Z
11
+ date: 2023-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -52,6 +52,7 @@ files:
52
52
  - lib/nokolexbor/3.1/nokolexbor.bundle
53
53
  - lib/nokolexbor/attribute.rb
54
54
  - lib/nokolexbor/document.rb
55
+ - lib/nokolexbor/document_fragment.rb
55
56
  - lib/nokolexbor/node.rb
56
57
  - lib/nokolexbor/node_set.rb
57
58
  - lib/nokolexbor/version.rb