Sha256: 6839fc5d909d99a5ad5591cf06c7eb7443ef0e1e942f36ca2852ec1efc7a8fea

Contents?: true

Size: 1.16 KB

Versions: 3

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

module Webmention
  module Verification
    module Verifiers
      class HtmlVerifier < Verifier
        @mime_types = ['text/html']

        Client.register_verifier(self)

        HTML_ATTRIBUTE_MAP = {
          'cite'   => %w[blockquote del ins q],
          'data'   => %w[object],
          'href'   => %w[a area],
          'poster' => %w[video],
          'src'    => %w[audio embed img source track video],
          'srcset' => %w[img source]
        }.freeze

        private

        def doc
          @doc ||= Nokogiri::HTML(response_body)
        end

        def parse_response_body
          HTML_ATTRIBUTE_MAP.each_with_object([]) { |(*args), matches| matches << search_doc(*args) }.flatten
        end

        def search_doc(attribute, elements)
          regexp = attribute == 'srcset' ? srcset_attribute_regexp : target_regexp

          doc.css(*elements.map { |element| "#{element}[#{attribute}]" }).find_all do |node|
            node[attribute].match?(regexp)
          end
        end

        def srcset_attribute_regexp
          @srcset_attribute_regexp ||= /(?:^|\b)#{target_regexp_str}\s/
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
webmention-verification-6.0.2 lib/webmention/verification/verifiers/html_verifier.rb
webmention-verification-6.0.1 lib/webmention/verification/verifiers/html_verifier.rb
webmention-verification-6.0.0 lib/webmention/verification/verifiers/html_verifier.rb