pdbook 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/Manifest.txt +6 -0
- data/Rakefile +8 -0
- data/bin/pdbook +14 -0
- data/lib/pdbook.rb +8 -0
- data/lib/pdbook/converter.rb +112 -0
- metadata +75 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/Rakefile
ADDED
data/bin/pdbook
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "rubygems"
|
3
|
+
require "pdbook"
|
4
|
+
|
5
|
+
if ARGV.size != 2 && ARGV.size != 3
|
6
|
+
puts "pdbook - Convert PDB Ebook to PDF"
|
7
|
+
puts " pdbook <input-pdb-file> <output-pdf-file> [font-file]"
|
8
|
+
|
9
|
+
else
|
10
|
+
conv = Pdbook::Converter.new(ARGV[0], ARGV[1], ARGV[2])
|
11
|
+
conv.convert!
|
12
|
+
|
13
|
+
end
|
14
|
+
|
data/lib/pdbook.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "prawn"
|
3
|
+
require "palm"
|
4
|
+
require 'iconv'
|
5
|
+
require 'UniversalDetector' # chardet gem
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
require "prawn/measurement_extensions"
|
9
|
+
|
10
|
+
module Pdbook
|
11
|
+
class Converter
|
12
|
+
def initialize(input, output, font = "#{Prawn::BASEDIR}/data/fonts/gkai00mp.ttf", options = {:page_size => "A4", :margin => 0.6.in, :compress => true})
|
13
|
+
@input = input
|
14
|
+
@output = output
|
15
|
+
@font = font
|
16
|
+
@options = options
|
17
|
+
@pdb = Palm::PDB.new(input)
|
18
|
+
@log = Logger.new($STDOUT)
|
19
|
+
end
|
20
|
+
|
21
|
+
def convert!
|
22
|
+
data = @pdb.data
|
23
|
+
Prawn::Document.generate @output, @options do |doc|
|
24
|
+
doc.font @font
|
25
|
+
toc = data.shift.data
|
26
|
+
content = data
|
27
|
+
|
28
|
+
# render cover & toc
|
29
|
+
render_toc(doc, toc)
|
30
|
+
|
31
|
+
# render content
|
32
|
+
doc.text_options.update(:wrap => :character, :size => 20, :spacing => 4)
|
33
|
+
content.each do |record|
|
34
|
+
render_content(doc, record.data)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
# find current document charset
|
41
|
+
def charset
|
42
|
+
text_check = @pdb.data.first.data.gsub("\e", "")
|
43
|
+
enc = UniversalDetector::chardet(text_check)["encoding"]
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
# First \e\e\e is marker for first page
|
48
|
+
# Subsequent \e is link
|
49
|
+
def render_toc(doc, data)
|
50
|
+
current_charset = charset
|
51
|
+
data = to_utf8(current_charset, data)
|
52
|
+
|
53
|
+
cover, toc = data.split("\e\e\e")
|
54
|
+
if toc.nil?
|
55
|
+
toc = cover
|
56
|
+
cover = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# print cover
|
60
|
+
unless cover.nil?
|
61
|
+
doc.text_options.update(:wrap => :character, :size => 40, :spacing => 4)
|
62
|
+
doc.bounding_box [doc.bounds.left, 2*doc.bounds.top/3], :width => doc.bounds.width do
|
63
|
+
doc.text cover
|
64
|
+
end
|
65
|
+
doc.start_new_page
|
66
|
+
end
|
67
|
+
|
68
|
+
# print toc
|
69
|
+
unless toc.nil?
|
70
|
+
doc.text_options.update(:wrap => :character, :size => 20, :spacing => 4)
|
71
|
+
toc = toc.split("\e")
|
72
|
+
section_cnt = toc.shift.to_i
|
73
|
+
if section_cnt == toc.size
|
74
|
+
@log.debug "Print TOC"
|
75
|
+
# details
|
76
|
+
toc.each do |line|
|
77
|
+
doc.text line
|
78
|
+
end
|
79
|
+
doc.start_new_page
|
80
|
+
else
|
81
|
+
@log.error "TOC size not equals to number of section! #{toc.size} != #{section_cnt}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def render_content(doc, content)
|
87
|
+
current_charset = self.charset
|
88
|
+
doc.bounding_box([doc.bounds.left, doc.bounds.top], :width => doc.bounds.width) do
|
89
|
+
# main text
|
90
|
+
content = to_utf8(current_charset, content)
|
91
|
+
section = cleanup_content_text(content).split("\r\n")
|
92
|
+
section.each do |line|
|
93
|
+
doc.text line
|
94
|
+
end
|
95
|
+
doc.start_new_page
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def cleanup_content_text(text)
|
100
|
+
text.gsub!('﹁', '「')
|
101
|
+
text.gsub!('﹂', '」')
|
102
|
+
text.gsub!('︽', '《')
|
103
|
+
text.gsub!('︾', '》')
|
104
|
+
text.gsub!('|', 'ー')
|
105
|
+
text
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_utf8(charset, text)
|
109
|
+
Iconv.conv("UTF-8//IGNORE", charset, text)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pdbook
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Francis Chong
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-02 00:00:00 +08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.4.0
|
24
|
+
version:
|
25
|
+
description: |-
|
26
|
+
Convert PDB (Palm Database) Ebook to PDF format.
|
27
|
+
|
28
|
+
Specially handle document from haodoo.net.
|
29
|
+
email:
|
30
|
+
- francis@ignition.hk
|
31
|
+
executables:
|
32
|
+
- pdbook
|
33
|
+
extensions: []
|
34
|
+
|
35
|
+
extra_rdoc_files:
|
36
|
+
- History.txt
|
37
|
+
- Manifest.txt
|
38
|
+
files:
|
39
|
+
- History.txt
|
40
|
+
- Manifest.txt
|
41
|
+
- Rakefile
|
42
|
+
- lib/pdbook.rb
|
43
|
+
- lib/pdbook/converter.rb
|
44
|
+
- bin/pdbook
|
45
|
+
has_rdoc: true
|
46
|
+
homepage:
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options:
|
51
|
+
- --main
|
52
|
+
- README.txt
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project: pdbook
|
70
|
+
rubygems_version: 1.3.5
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Convert PDB (Palm Database) Ebook to PDF format
|
74
|
+
test_files: []
|
75
|
+
|