jekyll-pdf/lib/jekyll/pdf/document.rb
Gleb Sinyavsky 8535e32d4a fixes
2017-09-28 14:57:38 -07:00

99 lines
3.0 KiB
Ruby

require 'pdfkit'
require File.dirname(__FILE__) + '/helper.rb'
module Jekyll
module PDF
class Document < Jekyll::Page
include Helper
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 = %w[cover header_html footer_html]
process(@name)
self.data = page.data.clone
self.content = page.content.clone
# Set layout to the PDF layout
data['layout'] = layout
# Get PDF settings from the layouts
Jekyll::Utils.deep_merge_hashes!(@settings, get_config(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'] = url
# Set html_url variable in the source page (for linking to the HTML version)
data['html_url'] = page.url
# create the partial objects
@partials.each do |partial|
@settings[partial] = Jekyll::PDF::Partial.new(self, @settings[partial]) unless @settings[partial].nil?
end
end
# Recursively merge settings from the page, layout, site config & jekyll-pdf defaults
def get_config(data)
settings = data['pdf'].is_a?(Hash) ? data['pdf'] : {}
layout = @site.layouts[data['layout']].data.clone unless 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)
get_config(layout)
end
# Write the PDF file
# todo: remove pdfkit dependency
def write(dest_prefix, _dest_suffix = nil)
render(@site.layouts, @site.site_payload) if output.nil?
path = File.join(dest_prefix, CGI.unescape(url))
dest = File.dirname(path)
# Create directory
FileUtils.mkdir_p(dest) unless File.exist?(dest)
# write partials
@partials.each do |partial|
@settings[partial].write unless @settings[partial].nil?
end
# Debugging - create html version of PDF
File.open("#{path}.html", 'w') { |f| f.write(output) } if @settings['debug']
@settings.delete('debug')
@settings.delete('layout')
# Build PDF file
fix_relative_paths
kit = PDFKit.new(output, @settings)
file = kit.to_file(path)
end
def layout
# Set page layout to the PDF layout
layout = data['pdf_layout'] || @settings['layout']
# Check if a PDF version exists for the current layout (e.g. layout_pdf)
if layout.nil? && !data['layout'].nil? && File.exist?('_layouts/' + data['layout'] + '_pdf.html')
layout = data['layout'] + '_pdf'
end
layout || 'pdf'
end
end
end
end