Sha256: 64edc238cd34e2b6eb9422badf4ed1b35d1156944e891aea8e82dc2e9093916f

Contents?: true

Size: 1.05 KB

Versions: 3

Compression:

Stored size: 1.05 KB

Contents

# frozen_string_literal: true

module IndieWeb
  module Endpoints
    # @api private
    class ResponseBodyParser
      # @param response [HTTP::Response]
      def initialize(response)
        @body = response.body.to_s
        @mime_type = response.mime_type
        @uri = response.uri
      end

      # @param identifier [Symbol]
      # @param nodes [Array<String>]
      # @return [Array<string>, nil]
      def results_for(identifier, nodes = ['link'])
        return unless mime_type == 'text/html'

        # Reject endpoints that contain a fragment identifier
        selectors = nodes.map { |node| %(#{node}[rel~="#{identifier}"][href]:not([href*="#"])) }.join(',')

        parsed_body.css(selectors).map { |element| element['href'] }
      end

      private

      # @return [String]
      attr_reader :body

      # @return [String]
      attr_reader :mime_type

      # @return [HTTP::URI]
      attr_reader :uri

      # @return [Nokogiri::HTML5::Document]
      def parsed_body
        @parsed_body ||= Nokogiri::HTML5(body)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
indieweb-endpoints-8.0.0 lib/indieweb/endpoints/response_body_parser.rb
indieweb-endpoints-7.2.0 lib/indieweb/endpoints/response_body_parser.rb
indieweb-endpoints-7.1.0 lib/indieweb/endpoints/response_body_parser.rb