# frozen_string_literal: true require 'grover/version' require 'grover/utils' require 'active_support_ext/object/deep_dup' unless defined?(ActiveSupport) require 'grover/errors' require 'grover/html_preprocessor' require 'grover/middleware' require 'grover/configuration' require 'grover/options_builder' require 'grover/processor' require 'nokogiri' require 'yaml' # # Grover interface for converting HTML to PDF # class Grover DEFAULT_HEADER_TEMPLATE = "
" DEFAULT_FOOTER_TEMPLATE = <<~HTML
/
HTML attr_reader :front_cover_path, :back_cover_path # # @param [String] url URL of the page to convert # @param [Hash] options Optional parameters to pass to PDF processor # see https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions # def initialize(url, options = {}) @url = url.to_s @options = OptionsBuilder.new(options, @url) @root_path = @options.delete 'root_path' @front_cover_path = @options.delete 'front_cover_path' @back_cover_path = @options.delete 'back_cover_path' end # # Request URL with provided options and create PDF # # @param [String] path Optional path to write the PDF to # @return [String] The resulting PDF data # def to_pdf(path = nil) processor.convert :pdf, @url, normalized_options(path: path) end # # Request URL with provided options and create screenshot # # @param [String] path Optional path to write the screenshot to # @param [String] format Optional format of the screenshot # @return [String] The resulting image data # def screenshot(path: nil, format: nil) options = normalized_options(path: path) options['type'] = format if %w[png jpeg].include? format processor.convert :screenshot, @url, options end # # Request URL with provided options and create PNG # # @param [String] path Optional path to write the screenshot to # @return [String] The resulting PNG data # def to_png(path = nil) screenshot path: path, format: 'png' end # # Request URL with provided options and create JPEG # # @param [String] path Optional path to write the screenshot to # @return [String] The resulting JPEG data # def to_jpeg(path = nil) screenshot path: path, format: 'jpeg' end # # Returns whether a front cover (request) path has been specified in the options # # @return [Boolean] Front cover path is configured # def show_front_cover? front_cover_path.is_a?(::String) && front_cover_path.start_with?('/') end # # Returns whether a back cover (request) path has been specified in the options # # @return [Boolean] Back cover path is configured # def show_back_cover? back_cover_path.is_a?(::String) && back_cover_path.start_with?('/') end # # Instance inspection # def inspect format( '#<%s:0x%p @url="%s">', class_name: self.class.name, object_id: object_id, url: @url ) end # # Configuration for the conversion # def self.configuration @configuration ||= Configuration.new end def self.configure yield(configuration) end private def root_path @root_path ||= Dir.pwd end def processor Processor.new(root_path) end def normalized_options(path:) normalized_options = Utils.normalize_object @options normalized_options['path'] = path if path.is_a? ::String normalized_options end end