Compare commits

...

5 Commits

Author SHA1 Message Date
8f47815ec3 Removed digest dependency 2019-05-06 12:09:24 +00:00
1aacd8de08 Update 'README.md' 2019-05-06 12:08:46 +00:00
Gleb Sinyavsky
631496a81a md rendering fix 2017-09-28 14:59:40 -07:00
Gleb Sinyavsky
8535e32d4a fixes 2017-09-28 14:57:38 -07:00
Gleb Sinyavsky
848c19001f rubocop, fixes 2017-09-28 14:50:07 -07:00
9 changed files with 51 additions and 62 deletions

View File

@ -2,9 +2,6 @@
Dynamically generate PDFs from Jekyll pages, posts & documents.
[![Build Status](https://travis-ci.org/abeMedia/jekyll-pdf.svg?branch=master)](https://travis-ci.org/abeMedia/jekyll-pdf)
[![Dependency Status](https://gemnasium.com/badges/github.com/abeMedia/jekyll-pdf.svg)](https://gemnasium.com/github.com/abeMedia/jekyll-pdf)
## Usage
Add `gem "jekyll-pdf"` to your `Gemfile` and run `bundle`, then add `jekyll-pdf` to your `_config.yml` like so:

View File

@ -15,7 +15,6 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency "wkhtmltopdf-installer", "~> 0.12"
spec.add_runtime_dependency "pdfkit", "~> 0.8"
spec.add_runtime_dependency "digest", "~> 0"
spec.add_runtime_dependency "jekyll", ">= 2.0", "~> 3.1"
spec.add_development_dependency "bundler", "~> 1.6"

View File

@ -1 +1 @@
require "jekyll/pdf"
require 'jekyll/pdf'

View File

@ -12,55 +12,56 @@ module Jekyll
@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']
@partials = %w[cover header_html footer_html]
self.process(@name)
process(@name)
@page = page
self.data = page.data.clone
self.content = page.content.clone
# Set layout to the PDF layout
self.data['layout'] = layout
data['layout'] = layout
# Get PDF settings from the layouts
Jekyll::Utils.deep_merge_hashes!(@settings, self.getConfig(self.data))
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'] = self.url
page.data['pdf_url'] = url
# Set html_url variable in the source page (for linking to the HTML version)
self.data['html_url'] = page.url
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
@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 getConfig(data)
def get_config(data)
settings = data['pdf'].is_a?(Hash) ? data['pdf'] : {}
layout = @site.layouts[data['layout']].data.clone if data['layout'] != nil
layout = @site.layouts[data['layout']].data.clone unless data['layout'].nil?
# No parent layout found - return settings hash
return settings if layout == nil
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)
get_config(layout)
end
# Write the PDF file
# todo: remove pdfkit dependency
def write(dest_prefix, dest_suffix = nil)
self.render(@site.layouts, @site.site_payload) if self.output == nil
def write(dest_prefix, _dest_suffix = nil)
@page.render(@site.layouts, @site.site_payload) if output.nil?
self.output = @page.output
path = File.join(dest_prefix, CGI.unescape(self.url))
path = File.join(dest_prefix, CGI.unescape(url))
dest = File.dirname(path)
# Create directory
@ -68,32 +69,31 @@ module Jekyll
# write partials
@partials.each do |partial|
@settings[partial].write if @settings[partial] != nil
@settings[partial].write unless @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")
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(self.output, @settings)
kit = PDFKit.new(output, @settings)
file = kit.to_file(path)
end
def layout()
def layout
# Set page layout to the PDF layout
layout = self.data['pdf_layout'] || @settings['layout']
layout = 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"
if layout.nil? && !data['layout'].nil? && File.exist?('_layouts/' + data['layout'] + '_pdf.html')
layout = data['layout'] + '_pdf'
end
layout || 'pdf'
end
end
end
end
end

View File

@ -5,14 +5,10 @@ module Jekyll
priority :lowest
def generate(site)
# Loop through pages & documents and build PDFs
[site.pages.clone, site.documents].each do |items|
items.each do |item|
[site.pages.clone, site.documents].flatten.each do |item|
site.pages << Document.new(site, site.source, item) if item.data['pdf']
end
end
end
end
end
end

View File

@ -2,7 +2,7 @@ module Jekyll
module PDF
module Helper
def fix_relative_paths
output.gsub!(/(href|src)=(['"])\/([^\/"']([^\"']*|[^"']*))?['"]/, "\\1=\\2file://#{site.dest}/\\3\\2") if output != nil
output.gsub!(/(href|src)=(['"])\/([^\/"']([^\"']*|[^"']*))?['"]/, "\\1=\\2file://#{site.dest}/\\3\\2") unless output.nil?
end
end
end

View File

@ -1,5 +1,5 @@
# Delete temp files
Jekyll::Hooks.register :site, :post_write do |jekyll, payload|
Jekyll::Hooks.register :site, :post_write do |jekyll, _payload|
if jekyll.data[:jekyll_pdf_partials]
jekyll.data[:jekyll_pdf_partials].each do |partial|
File.delete(partial) if File.exist?(partial)

View File

@ -33,19 +33,18 @@ module Jekyll
# Returns Hash of doc data
def data
@data ||= doc.data.dup
@data.delete("layout")
@data.delete('layout')
@data
end
def trigger_hooks(*)
end
def trigger_hooks(*); end
def path
File.join(doc.path, partial)
end
def id
File.basename(path, File.extname(path)) + "-" + Digest::MD5.hexdigest(to_s) + File.extname(path)
File.basename(path, File.extname(path)) + '-' + Digest::MD5.hexdigest(to_s) + File.extname(path)
end
# Returns the cache directory
@ -66,7 +65,7 @@ module Jekyll
# Returns the shorthand String identifier of this doc.
def inspect
"<Partial: #{self.id}>"
"<Partial: #{id}>"
end
def output
@ -85,7 +84,7 @@ module Jekyll
# store path for cleanup
site.data[:jekyll_pdf_partials] ||= []
site.data[:jekyll_pdf_partials] << "#{self}"
site.data[:jekyll_pdf_partials] << to_s
end
def place_in_layout?
@ -95,12 +94,12 @@ module Jekyll
protected
def cache_dir
return site.config["pdf"]["cache"] if site.config["pdf"] != nil && site.config["pdf"].has_key?('cache')
return site.config['pdf']['cache'] if !site.config['pdf'].nil? && site.config['pdf'].key?('cache')
# Use jekyll-assets cache directory if it exists
cache_dir = site.config["assets"]["cache"] || '.asset-cache' if site.config["assets"] != nil
cache_dir = site.config['assets']['cache'] || '.asset-cache' unless site.config['assets'].nil?
File.join(cache_dir || Dir.tmpdir(), 'pdf')
File.join(cache_dir || Dir.tmpdir, 'pdf')
end
# Internal: Generate partial html
@ -109,17 +108,16 @@ module Jekyll
#
# Returns partial html String
def build_partial(path)
# vars to insert into partial
vars = ['frompage','topage','page','webpage','section','subsection','subsubsection']
doc.data["pdf"] = {}
vars.each { |var| doc.data["pdf"][var] = "<span class='__#{var}'></span>" }
vars = %w[frompage topage page webpage section subsection subsubsection]
doc.data['pdf'] = {}
vars.each { |var| doc.data['pdf'][var] = "<span class='__#{var}'></span>" }
# JavaScript to replace var placeholders with content
script = "<script>!function(){var t={},n=document.location.search.substring(1).split('&');for(var e in n){var o=n[e].split('=',2);t[o[0]]=decodeURIComponent(o[1])}var n=#{vars};for(var e in n)for(var r=document.getElementsByClassName('__'+n[e]),a=0;a<r.length;++a)r[a].textContent=t[n[e]]}();</script>\n"
# Parse & render
content = File.read(File.join("_includes", path))
content = File.read(File.join('_includes', path))
# Add replacer script to body
if content =~ /<\/body>/i
@ -139,18 +137,17 @@ module Jekyll
</html>
eos
# No body found - insert html into default template
content = %{<!DOCTYPE html>
content = %(<!DOCTYPE html>
<html>
<body>
#{self.output}
#{output}
#{script}
</body>
</html>
}
)
end
content
end
end
end