diff --git a/lib/jekyll-pdf.rb b/lib/jekyll-pdf.rb index 6bb8bd2..15eff39 100644 --- a/lib/jekyll-pdf.rb +++ b/lib/jekyll-pdf.rb @@ -1 +1 @@ -require "jekyll/pdf" \ No newline at end of file +require 'jekyll/pdf' diff --git a/lib/jekyll/pdf.rb b/lib/jekyll/pdf.rb index 3804904..c17694b 100644 --- a/lib/jekyll/pdf.rb +++ b/lib/jekyll/pdf.rb @@ -1 +1 @@ -Dir[File.dirname(__FILE__) + '/pdf/**/*.rb'].each {|file| require file } \ No newline at end of file +Dir[File.dirname(__FILE__) + '/pdf/**/*.rb'].each { |file| require file } diff --git a/lib/jekyll/pdf/document.rb b/lib/jekyll/pdf/document.rb index 0b2ae72..edee2b7 100644 --- a/lib/jekyll/pdf/document.rb +++ b/lib/jekyll/pdf/document.rb @@ -12,55 +12,60 @@ 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) 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, getConfig(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 + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(File.join(dir, name), type, key) + end + Jekyll::Hooks.trigger :pages, :post_init, self end # Recursively merge settings from the page, layout, site config & jekyll-pdf defaults def getConfig(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) + getConfig(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) + render(@site.layouts, @site.site_payload) if output.nil? - 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 +73,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 diff --git a/lib/jekyll/pdf/generator.rb b/lib/jekyll/pdf/generator.rb index 2acc3ae..874fa7c 100644 --- a/lib/jekyll/pdf/generator.rb +++ b/lib/jekyll/pdf/generator.rb @@ -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 << Document.new(site, site.source, item) if item.data['pdf'] - end + [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 diff --git a/lib/jekyll/pdf/helper.rb b/lib/jekyll/pdf/helper.rb index cf12808..46bb3ea 100644 --- a/lib/jekyll/pdf/helper.rb +++ b/lib/jekyll/pdf/helper.rb @@ -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 diff --git a/lib/jekyll/pdf/hooks.rb b/lib/jekyll/pdf/hooks.rb index a9ca945..3105cec 100644 --- a/lib/jekyll/pdf/hooks.rb +++ b/lib/jekyll/pdf/hooks.rb @@ -1,9 +1,9 @@ # 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) end jekyll.data.delete(:jekyll_pdf_partials) end -end \ No newline at end of file +end diff --git a/lib/jekyll/pdf/partial.rb b/lib/jekyll/pdf/partial.rb index 0f0f1ee..fa9dc02 100644 --- a/lib/jekyll/pdf/partial.rb +++ b/lib/jekyll/pdf/partial.rb @@ -15,7 +15,7 @@ module Jekyll attr_writer :output def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, - :render_with_liquid?, :collection, :related_posts + :render_with_liquid?, :collection, :related_posts # Initialize this Partial instance. # @@ -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 - "" + "" end def output @@ -79,13 +78,13 @@ module Jekyll unless File.exist?(tempfile) FileUtils.mkdir_p(File.dirname(tempfile)) unless File.exist?(File.dirname(tempfile)) fix_relative_paths - File.open(tempfile, 'w') {|f| f.write(to_s) } + File.open(tempfile, 'w') { |f| f.write(to_s) } end @output = tempfile # 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,23 +108,22 @@ 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] = "" } + vars = %w[frompage topage page webpage section subsection subsubsection] + doc.data['pdf'] = {} + vars.each { |var| doc.data['pdf'][var] = "" } # JavaScript to replace var placeholders with content 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 content[/(<\/body>)/i] = script + content[/(<\/body>)/i] else - Jekyll.logger.warn <<-eos + Jekyll.logger.warn <<-eos Couldn't find in #{path}. Make sure your partial is a properly formatted HTML document (including DOCTYPE) e.g. @@ -139,19 +137,18 @@ module Jekyll eos # No body found - insert html into default template - content = %{ + content = %( - #{self.output} + #{output} #{script} - } + ) end content - end end end -end \ No newline at end of file +end