canon 0.3.48 → 0.3.49

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fcfa53c5436e38941e6c789536bf9c268fb5b587930aeaca6020c22993def0a2
4
- data.tar.gz: a814221d4dd934e35f8f6eb1169f8694fadf2e2fd60e49a9f8f61e6355ff9853
3
+ metadata.gz: 8f3f2bed07760530a3f122f18e184ac0e925db9d6551bacc46ef896552fb79ce
4
+ data.tar.gz: 4de5e38b9be98f354a843bb3fdd1c725534fab28f6078cbf95a7c278d0c2596b
5
5
  SHA512:
6
- metadata.gz: 1ac2772108ab1d9cae92a479a98c94cbc02bff2a431a64e3dc9052ff4df5ec595a38c81849c3d9ddc1c1329b6a86bdfbb7d3aeae6b5bbacfa2d6d8d283acc0a6
7
- data.tar.gz: 7794b9a9392eaa18bb43b85ec7a2e830d3c0f172bfd827e13b7e3f6290c82cb6b3491312090f8230671c1a7442e722a7c1b3d66a44398965b89ab4664ec11a4d
6
+ metadata.gz: '002904526d2626e462005b4a3627540a1d6587c458b60adb871ad03134054485c2712707579106f727fa00066b213d8db903f96be5d695470aed08ec82157461'
7
+ data.tar.gz: 537566ace8ff29b3124bbd9fd2789250d95d539de60b0e8ba89a3d5ebf83dee871fe0e7525d8d76381286f8adf71886957a3c4a29b1887f861fc0201b44bd862
@@ -41,6 +41,11 @@ module Canon
41
41
  # Track occurrences for text_content dimension to find correct element instance
42
42
  @text_occurrence1 = Hash.new(0)
43
43
  @text_occurrence2 = Hash.new(0)
44
+ # Opener-offset caches: one scan per unique element name per
45
+ # document replaces the per-call regex walk (which was also
46
+ # quadratic on repeated element names).
47
+ @opener_offsets1 = {}
48
+ @opener_offsets2 = {}
44
49
  end
45
50
 
46
51
  def enrich
@@ -1461,27 +1466,44 @@ range_start, range_end)
1461
1466
  # tag (no inside-the-element correction — see
1462
1467
  # locate_element_at_index).
1463
1468
  def count_elements_before_position_open(text, char_offset, opener)
1464
- count = 0
1465
- pos = 0
1466
- while (hit = text.index(opener, pos)) && hit < char_offset
1467
- count += 1
1468
- pos = hit + 1
1469
- end
1470
- count
1469
+ count_openers_before(opener_offsets(text, opener), char_offset)
1471
1470
  end
1472
1471
 
1473
1472
  def count_elements_before_position(text, char_offset, element_name)
1474
- # Index loop instead of copying the prefix per call — the
1475
- # copy was O(offset) on every occurrence check.
1476
- opener = /<#{element_name}[>\s]/
1477
- count = 0
1473
+ # Subtract 1 because the count includes the element we are inside
1474
+ [count_openers_before(opener_offsets(text, opener_for(element_name)),
1475
+ char_offset) - 1, 0].max
1476
+ end
1477
+
1478
+ # Count of opener offsets strictly before char_offset — binary
1479
+ # search over the cached, ascending offset array.
1480
+ def count_openers_before(offsets, char_offset)
1481
+ idx = offsets.bsearch_index { |offset| offset >= char_offset }
1482
+ idx || offsets.length
1483
+ end
1484
+
1485
+ # All opener offsets for one opener regex in one document,
1486
+ # cached per text (one linear scan per unique element name per
1487
+ # document — callers previously re-scanned per occurrence
1488
+ # check, which was also quadratic on repeated element names).
1489
+ def opener_offsets(text, opener)
1490
+ if text.equal?(@text1)
1491
+ (@opener_offsets1[opener.source] ||= scan_opener_offsets(text, opener))
1492
+ elsif text.equal?(@text2)
1493
+ (@opener_offsets2[opener.source] ||= scan_opener_offsets(text, opener))
1494
+ else
1495
+ scan_opener_offsets(text, opener)
1496
+ end
1497
+ end
1498
+
1499
+ def scan_opener_offsets(text, opener)
1500
+ offsets = []
1478
1501
  pos = 0
1479
- while (hit = text.index(opener, pos)) && hit < char_offset
1480
- count += 1
1502
+ while (hit = text.index(opener, pos))
1503
+ offsets << hit
1481
1504
  pos = hit + 1
1482
1505
  end
1483
- # Subtract 1 because the count includes the element we are inside
1484
- [count - 1, 0].max
1506
+ offsets
1485
1507
  end
1486
1508
  end
1487
1509
  end
data/lib/canon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canon
4
- VERSION = "0.3.48"
4
+ VERSION = "0.3.49"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.48
4
+ version: 0.3.49
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.