Class: Html2rss::AutoSource::Discovery::DomClustering::OverlapResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/html2rss/auto_source/discovery/dom_clustering/overlap_resolver.rb

Overview

Filters layout wrapper groups and resolves 1-to-1 nested card wrappers.

Instance Method Summary collapse

Constructor Details

#initialize(layout_tags:, word_counter:) ⇒ OverlapResolver

Returns a new instance of OverlapResolver.

Parameters:

  • layout_tags (Set<String>)

    tags treated as layout containers

  • word_counter (#avg_words)

    averages visible word counts for nodes



12
13
14
15
# File 'lib/html2rss/auto_source/discovery/dom_clustering/overlap_resolver.rb', line 12

def initialize(layout_tags:, word_counter:)
  @layout_tags = layout_tags
  @word_counter = word_counter
end

Instance Method Details

#filter_1_to_1_overlap(groups) ⇒ Hash{String => Array<Nokogiri::XML::Node>}

If group A contains group B with the same size, keep the real content card.

Parameters:

  • groups (Hash{String => Array<Nokogiri::XML::Node>})

    candidate groups

Returns:

  • (Hash{String => Array<Nokogiri::XML::Node>})

    groups after 1-to-1 resolution



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/html2rss/auto_source/discovery/dom_clustering/overlap_resolver.rb', line 31

def filter_1_to_1_overlap(groups)
  discarded = Set.new
  groups.each_key do |cls_a|
    groups.each_key do |cls_b|
      next if cls_a == cls_b || discarded.include?(cls_a) || discarded.include?(cls_b)

      resolve_1_to_1_overlap(cls_a, cls_b, groups, discarded)
    end
  end

  groups.except(*discarded)
end

#filter_containers(groups) ⇒ Hash{String => Array<Nokogiri::XML::Node>}

Discard group A if any node of A contains > 1 node of another group B

Parameters:

  • groups (Hash{String => Array<Nokogiri::XML::Node>})

    candidate groups

Returns:

  • (Hash{String => Array<Nokogiri::XML::Node>})

    groups that are not layout wrappers



21
22
23
24
25
# File 'lib/html2rss/auto_source/discovery/dom_clustering/overlap_resolver.rb', line 21

def filter_containers(groups)
  groups.reject do |cls_a, nodes_a|
    groups.any? { |cls_b, nodes_b| cls_a != cls_b && container_of?(nodes_a, nodes_b) }
  end
end