work on pagination

This commit is contained in:
John Bintz 2010-01-06 22:56:52 -05:00
parent ffd0a583dd
commit ff8b447b6c
4 changed files with 141 additions and 0 deletions

View File

@ -0,0 +1,28 @@
require File.dirname(__FILE__) + '/OutputFilter.rb'
#
# Process an input file for the Web
#
class TempBitmapToWeb < OutputFilter
attr_accessor :schedule
def initialize
super
@schedule = nil
end
def requires_schedule(schedule)
@schedule = schedule
end
def build(input, output)
quality = @config['quality'] ? @config['quality'] : 80
convert("\"#{input}\" -quality #{quality} \"#{output}\"")
end
def filename(info)
index = info['index'].to_i
info['date'] = @schedule[index].strftime(@config['date_format'])
super(info)
end
end

47
modules/Pagination.rb Normal file
View File

@ -0,0 +1,47 @@
#
# Code to help with pagination
#
module Pagination
def paginate(files)
if !files.instance_of? Array; raise "File list must be an array"; end
if files.length == 0; raise "File list cannot be empty"; end
if (files.length % 4) != 0; raise "File list must be divisible by 4"; end
tmp_pdf_files = []
sheet_faces = setup_sheet_faces(files)
sheet_faces.each_index do |i|
f = @config['target'] + "-#{i}.pdf"
process_pagination(f, i, sheet_faces.length, *sheet_faces[i])
tmp_pdf_files << f
end
system("pdfjoin #{tmp_pdf_files.collect { |f| "\"#{f}\"" }.join(" ")} --outfile \"#{@config['target']}\"")
end
def setup_sheet_faces(files)
number_of_sheet_faces = (files.length / 4) * 2
sheet_faces = []
is_right = 1
is_descending = 1
sheet_face_index = 0
files.each do |file|
if !sheet_faces[sheet_face_index]; sheet_faces[sheet_face_index] = []; end
sheet_faces[sheet_face_index][is_right] = file
is_right = 1 - is_right
sheet_face_index += is_descending
if sheet_face_index == number_of_sheet_faces
sheet_face_index -= 1
is_descending = -1
end
end
sheet_faces
end
end

27
tests/TestPagination.rb Normal file
View File

@ -0,0 +1,27 @@
require 'rubygems'
require 'test/unit'
require File.dirname(__FILE__) + '/../modules/Pagination.rb'
class TestPagination < Test::Unit::TestCase
def setup
@pagination = Class.new do
include Pagination
end.new
end
def test_paginate_raises
[ '', [], [''] ].each do |files|
assert_raise RuntimeError do
@pagination.paginate(files)
end
end
end
def test_setup_sheet_faces
assert_equal [
[ 'file4', 'file1' ], [ 'file2', 'file3' ]
], @pagination.setup_sheet_faces([
'file1', 'file2', 'file3', 'file4'
])
end
end

View File

@ -0,0 +1,39 @@
require 'rubygems'
require 'test/unit'
require 'mocha'
require File.dirname(__FILE__) + '/../classes/TempBitmapToWeb.rb'
class TestTempBitmapToWeb < Test::Unit::TestCase
def setup
@filter = TempBitmapToWeb.new
@filter.stubs(:convert_pixels)
end
def test_build
[
[ nil, 80 ],
[ 75, 75 ]
]. each do |quality, expected_quality|
@filter.expects(:convert).with("\"file\" -quality #{expected_quality} \"outfile\"")
@filter.config = {
'quality' => quality
}
@filter.build('file', 'outfile')
end
end
def test_requires_schedule
@filter.requires_schedule('test')
assert_equal 'test', @filter.schedule
end
def test_filename
@filter.schedule = [ Date.parse('2010-01-01') ]
@filter.config = {
'target' => 'test{date}',
'date_format' => '%Y-%m-%d'
}
assert_equal 'test2010-01-01', @filter.filename({'index' => 0})
end
end