class Jekyll::PDF::Document

Public Class Methods

new(site, base, page) click to toggle source
# File lib/jekyll/pdf/document.rb, line 9
def initialize(site, base, page)
  @site = site
  @base = base
  @dir = File.dirname(page.url)
  @name = File.basename(page.url, File.extname(page.url)) + '.pdf'
  @settings = site.config.key?('pdf') ? site.config['pdf'].clone : {}
  @partials = ['cover','header_html','footer_html']

  self.process(@name)
  self.data = page.data.clone
  self.content = page.content.clone

  # Set layout to the PDF layout
  self.data['layout'] = layout

  # Get PDF settings from the layouts
  Jekyll::Utils.deep_merge_hashes!(@settings, self.getConfig(self.data))

  PDFKit.configure do |config|
    config.verbose = site.config['verbose']
  end

  # Set pdf_url variable in the source page (for linking to the PDF version)
  page.data['pdf_url'] = self.url

  # Set html_url variable in the source page (for linking to the HTML version)
  self.data['html_url'] = page.url

  # create the partial objects
  @partials.each do |partial|
    @settings[partial] = Jekyll::PDF::Partial.new(self, @settings[partial]) if @settings[partial] != nil
  end
end

Public Instance Methods

getConfig(data) click to toggle source

Recursively merge settings from the page, layout, site config & jekyll-pdf defaults

# File lib/jekyll/pdf/document.rb, line 44
def getConfig(data)
  settings = data['pdf'].is_a?(Hash) ? data['pdf'] : {}
  layout = @site.layouts[data['layout']].data.clone if data['layout'] != nil

  # No parent layout found - return settings hash
  return settings if layout == nil

  # Merge settings with parent layout settings
  layout['pdf'] ||= {}
  Jekyll::Utils.deep_merge_hashes!(layout['pdf'], settings)

  return self.getConfig(layout)
end
layout() click to toggle source
# File lib/jekyll/pdf/document.rb, line 84
def layout()
  # Set page layout to the PDF layout
  layout = self.data['pdf_layout'] || @settings['layout']

  # Check if a PDF version exists for the current layout (e.g. layout_pdf)
  if layout == nil && self.data['layout'] != nil && File.exist?("_layouts/" + self.data['layout'] + "_pdf.html")
    layout = self.data['layout'] + "_pdf"
  end

  layout || 'pdf'
end
write(dest_prefix, dest_suffix = nil) click to toggle source

Write the PDF file todo: remove pdfkit dependency

# File lib/jekyll/pdf/document.rb, line 60
def write(dest_prefix, dest_suffix = nil)
  self.render(@site.layouts, @site.site_payload) if self.output == nil

  path = File.join(dest_prefix, CGI.unescape(self.url))
  dest = File.dirname(path)

  # Create directory
  FileUtils.mkdir_p(dest) unless File.exist?(dest)

  # write partials
  @partials.each do |partial|
    @settings[partial].write if @settings[partial] != nil
  end

  # Debugging - create html version of PDF
  File.open("#{path}.html", 'w') {|f| f.write(self.output) } if @settings["debug"]
  @settings.delete("debug")

  # Build PDF file
  fix_relative_paths
  kit = PDFKit.new(self.output, @settings)
  file = kit.to_file(path)
end