Sha256: 61f02707e490a67c636dfbe22c224f85e86c5d9b0db569c57cb031a66751c68b

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 KB

Contents

require 'pdfkit'
require 'tilt'
require 'tilt/template'
require 'yaml'

module Tilt
  class PDFTemplate < Template
    self.default_mime_type = 'application/pdf'

    def prepare; end

    def evaluate(scope, locals, &block)
      html_file = find_html
      html = render_html(html_file, scope, locals, &block)

      css_files = find_css
      render_css(*css_files) do |*css|
        kit = PDFKit.new(html, pdfkit_options)
        css.each { |f| kit.stylesheets << f }
        @output = kit.to_pdf
      end

      @output
    end

    private

    def pdfkit_options
      YAML.load(data) || {}
    end

    def dirname
      eval_file.gsub(/#{basename}$/, '').chomp('/')
    end

    def find_html
      Dir.glob(File.join(dirname, name + '.html*')).first
    end

    def find_css
      Dir.glob(File.join(dirname, name + '.css*'))
    end

    def render_html(file, scope, locals, &block)
      Tilt.new(file).render(scope, locals, &block)
    end

    def render_css(*files)
      tmps = []

      files.each do |file|
        case file
        when /.*\.css$/
          yield file
        else
          tmp = Tempfile.new(File.basename(file))
          tmps << tmp
          css = Tilt.new(file).render
          tmp.write(css)
          tmp.close
          yield tmp.path
        end
      end
    ensure
      tmps.each { |tmp| tmp.close! }
    end
  end
end

Tilt.register Tilt::PDFTemplate, 'rpdf'

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tilt-pdf-0.1.2 lib/tilt/pdf.rb
tilt-pdf-0.1.1 lib/tilt/pdf.rb