File: check.rb

package info (click to toggle)
ruby-html-proofer 3.19.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,040 kB
  • sloc: ruby: 3,203; sh: 9; makefile: 4; javascript: 1; php: 1
file content (75 lines) | stat: -rw-r--r-- 1,677 bytes parent folder | download | duplicates (2)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# frozen_string_literal: true

module HTMLProofer
  # Mostly handles issue management and collecting of external URLs.
  class Check
    attr_reader :node, :html, :element, :src, :path, :options, :issues, :internal_urls, :external_urls

    def initialize(src, path, html, logger, cache, options)
      @src    = src
      @path   = path
      @html   = remove_ignored(html)
      @logger = logger
      @cache = cache
      @options = options
      @issues = []
      @internal_urls = {}
      @external_urls = {}
    end

    def create_element(node)
      @node = node
      Element.new(node, self, @logger)
    end

    def run
      raise NotImplementedError, 'HTMLProofer::Check subclasses must implement #run'
    end

    def add_issue(desc, line: nil, path: nil, status: -1, content: nil)
      @issues << Issue.new(path || @path, desc, line: line, status: status, content: content)
      false
    end

    def add_to_internal_urls(url, internal_url)
      if @internal_urls[url]
        @internal_urls[url] << internal_url
      else
        @internal_urls[url] = [internal_url]
      end
    end

    def add_to_external_urls(url)
      return if @external_urls[url]

      if @external_urls[url]
        @external_urls[url] << @path
      else
        @external_urls[url] = [@path]
      end
    end

    def self.subchecks
      classes = []

      ObjectSpace.each_object(Class) do |c|
        next unless c.superclass == self

        classes << c
      end

      classes
    end

    def blank?(attr)
      attr.nil? || attr.empty?
    end

    private

    def remove_ignored(html)
      html.css('code, pre, tt').each(&:unlink)
      html
    end
  end
end