class Bookify::Renderer

Attributes

column_spacer[RW]
columns[RW]
input_file[RW]
input_text[RW]
layout[RW]
margin[RW]
output_file[RW]
page_size[RW]

Public Class Methods

from_args(args) click to toggle source
# File lib/bookify/renderer.rb, line 4
def self.from_args(args)
  if ["-l", "--landscape"].include?(args[0])
    args.shift
    layout = :landscape
    columns = 3
  else
    layout = :portrait
    columns = 2
  end

  input_file = args[0]
  output_file = args[1] || input_file.split("/").last.gsub(/\.\w+/, ".pdf")

  new(layout: layout, columns: columns, input_file: input_file, output_file: output_file)
end
new(layout: :portrait, columns: 2, output_file:, input_file: nil, input_text: nil, column_spacer: nil, margin: 50, page_size: nil) click to toggle source
# File lib/bookify/renderer.rb, line 20
def initialize(layout: :portrait, columns: 2, output_file:, input_file: nil, input_text: nil, column_spacer: nil, margin: 50, page_size: nil)
  @layout = layout
  @columns = columns
  @output_file = output_file
  @input_file = input_file
  @input_text = input_text
  @column_spacer = column_spacer
  @margin = margin
  @page_size = page_size
end

Public Instance Methods

render() click to toggle source
# File lib/bookify/renderer.rb, line 31
def render
  doc_opts = {margin: margin, page_layout: layout, page_size: page_size}.compact
  Bookify::Sections.reset

  Prawn::Document.generate(output_file, doc_opts) do |pdf|
    font_path = "#{File.dirname(__FILE__)}/../../fonts"

    pdf.font_families["Book Antiqua"] = {
      normal: {file: "#{font_path}/BookAntiqua.ttf"},
      bold: {file: "#{font_path}/BookAntiqua-Bold.ttf"},
      italic: {file: "#{font_path}/BookAntiqua-Italic.ttf"},
      bold_italic: {file: "#{font_path}/BookAntiqua-BoldItalic.ttf"}
    }

    pdf.fill_color "000000"
    pdf.stroke_color "333333"
    pdf.line_width(0.5)
    pdf.default_leading 0.5

    pdf.column_box [0, pdf.cursor], columns: columns, width: pdf.bounds.width, spacer: (column_spacer || pdf.font_size) do
      doc.children.each { |c| Bookify::Node.render(c, pdf) }
    end

    Bookify::Sections.all.each do |section|
      pdf.outline.section(section[:title], destination: section[:dest]) do
        section[:subsections].each do |subsection|
          pdf.outline.page title: subsection[:title], destination: subsection[:dest]
        end
      end
    end
  end
end

Private Instance Methods

doc() click to toggle source
# File lib/bookify/renderer.rb, line 70
def doc
  @doc ||= Nokogiri::HTML(html)
end
html() click to toggle source
# File lib/bookify/renderer.rb, line 74
def html
  @html ||= markdown_converter.render(markdown)
end
markdown() click to toggle source
# File lib/bookify/renderer.rb, line 66
def markdown
  @markdown ||= (input_text || File.read(input_file))
end
markdown_converter() click to toggle source
# File lib/bookify/renderer.rb, line 78
def markdown_converter
  Redcarpet::Markdown.new(Bookify::Markdown, tables: true)
end