-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathutils.rb
51 lines (47 loc) · 1.45 KB
/
utils.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# frozen_string_literal: true
# Base module ValidateWebsite
module ValidateWebsite
# Utils class for CSS helpers
class Utils
# Extract urls from CSS page
#
# @param [Spidr::Page] a Spidr::Page object
# @return [Set] Lists of urls
#
def self.extract_urls_from_css(page)
return Set[] unless page
return Set[] if page.body.nil?
nodes = Crass::Parser.parse_stylesheet(page.body)
extract_urls_from_nodes nodes, page
end
# Return urls as absolute from Crass nodes
#
# @param [Hash] node from Crass
# @param [Spidr::Page] a Spidr::Page object
# @return [Set] list of obsolute urls
def self.urls_to_absolute(node, page)
if node[:node] == :function && node[:name] == 'url' || node[:node] == :url
Array(node[:value]).map do |v|
url = v.is_a?(String) ? v : v[:value]
page.to_absolute(url).to_s
end
else
Set.new
end
end
# Extract urls from Crass nodes
# @param [Array] Array of nodes from Crass
# @param [Spidr::Page] a Spidr::Page object
# @param [Set] memo for recursivity
# @return [Set] list of urls
def self.extract_urls_from_nodes(nodes, page, memo = Set[])
nodes.each_with_object(memo) do |node, result|
result.merge urls_to_absolute(node, page)
if node[:children]
extract_urls_from_nodes node.delete(:children), page, result
end
result
end
end
end
end