repub 0.3.3 → 0.3.4
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 +11 -0
- data/README.rdoc +14 -8
- data/TODO +0 -2
- data/lib/repub.rb +1 -1
- data/lib/repub/app.rb +3 -0
- data/lib/repub/app/builder.rb +151 -154
- data/lib/repub/app/fetcher.rb +10 -23
- data/lib/repub/app/filter.rb +30 -0
- data/lib/repub/app/options.rb +0 -6
- data/lib/repub/app/parser.rb +63 -73
- data/lib/repub/app/post_filters.rb +135 -0
- data/lib/repub/app/pre_filters.rb +50 -0
- data/lib/repub/app/profile.rb +1 -1
- data/lib/repub/epub.rb +4 -3
- data/lib/repub/epub/container_item.rb +49 -0
- data/lib/repub/epub/{toc.rb → ncx.rb} +137 -139
- data/lib/repub/epub/ocf.rb +62 -0
- data/lib/repub/epub/opf.rb +136 -0
- data/repub.gemspec +4 -4
- data/test/epub/{test_toc.rb → test_ncx.rb} +14 -12
- data/test/epub/test_ocf.rb +28 -0
- data/test/epub/{test_content.rb → test_opf.rb} +25 -19
- data/test/test_filter.rb +28 -0
- data/test/test_parser.rb +3 -4
- metadata +17 -11
- data/lib/repub/epub/container.rb +0 -28
- data/lib/repub/epub/content.rb +0 -178
- data/test/epub/test_container.rb +0 -15
data/lib/repub/epub/content.rb
DELETED
@@ -1,178 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'builder'
|
3
|
-
|
4
|
-
module Repub
|
5
|
-
module Epub
|
6
|
-
|
7
|
-
class Content
|
8
|
-
|
9
|
-
def initialize(uid)
|
10
|
-
@metadata = Metadata.new('Untitled', 'en', uid, Date.today.to_s)
|
11
|
-
@manifest_items = []
|
12
|
-
@spine_items = []
|
13
|
-
@manifest_items << ContentItem.new('ncx', 'toc.ncx')
|
14
|
-
end
|
15
|
-
|
16
|
-
class Metadata < Struct.new(
|
17
|
-
:title,
|
18
|
-
:language,
|
19
|
-
:identifier,
|
20
|
-
:date,
|
21
|
-
:subject,
|
22
|
-
:description,
|
23
|
-
:relation,
|
24
|
-
:creator,
|
25
|
-
:publisher,
|
26
|
-
:rights
|
27
|
-
)
|
28
|
-
end
|
29
|
-
|
30
|
-
attr_reader :metadata
|
31
|
-
|
32
|
-
def add_item(href, id = nil)
|
33
|
-
item = ContentItem.new(id || "item_#{@manifest_items.size}", href)
|
34
|
-
@manifest_items << item
|
35
|
-
@spine_items << item if item.document?
|
36
|
-
end
|
37
|
-
|
38
|
-
#def add_stylesheet(href, id = nil)
|
39
|
-
# @manifest_items << ContentItem.new(id || "css_#{@css_counter += 1}", href, 'text/css')
|
40
|
-
#end
|
41
|
-
#
|
42
|
-
#def add_image(href, id = nil)
|
43
|
-
# image_type = case(href.strip.downcase)
|
44
|
-
# when /.*\.(jpeg|jpg)$/
|
45
|
-
# 'image/jpeg'
|
46
|
-
# when /.*\.png$/
|
47
|
-
# 'image/png'
|
48
|
-
# when /.*\.gif$/
|
49
|
-
# 'image/gif'
|
50
|
-
# when /.*\.svg$/
|
51
|
-
# 'image/svg+xml'
|
52
|
-
# else
|
53
|
-
# raise 'Unsupported image type'
|
54
|
-
# end
|
55
|
-
# @manifest_items << ContentItem.new(id || "img_#{@img_counter += 1}", href, image_type)
|
56
|
-
#end
|
57
|
-
#
|
58
|
-
#def add_document(href, id = nil)
|
59
|
-
# manifest_item = ContentItem.new(id || "item_#{@html_counter += 1}", href, 'application/xhtml+xml')
|
60
|
-
# @manifest_items << manifest_item
|
61
|
-
# @spine_items << manifest_item
|
62
|
-
#end
|
63
|
-
|
64
|
-
def to_xml
|
65
|
-
out = ''
|
66
|
-
builder = Builder::XmlMarkup.new(:target => out)
|
67
|
-
builder.instruct!
|
68
|
-
builder.package :xmlns => "http://www.idpf.org/2007/opf",
|
69
|
-
'unique-identifier' => "dcidid",
|
70
|
-
'version' => "2.0" do
|
71
|
-
metadata_to_xml(builder)
|
72
|
-
manifest_to_xml(@manifest_items, builder)
|
73
|
-
spine_to_xml(@spine_items, builder)
|
74
|
-
end
|
75
|
-
out
|
76
|
-
end
|
77
|
-
|
78
|
-
def save(path = 'content.opf')
|
79
|
-
File.open(path, 'w') do |f|
|
80
|
-
f << to_xml
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def metadata_to_xml(builder)
|
87
|
-
builder.metadata 'xmlns:dc' => "http://purl.org/dc/elements/1.1/",
|
88
|
-
'xmlns:dcterms' => "http://purl.org/dc/terms/",
|
89
|
-
'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
|
90
|
-
'xmlns:opf' => "http://www.idpf.org/2007/opf" do
|
91
|
-
# Required elements
|
92
|
-
builder.dc :title do
|
93
|
-
builder << @metadata.title
|
94
|
-
end
|
95
|
-
builder.dc :language, 'xsi:type' => "dcterms:RFC3066" do
|
96
|
-
builder << @metadata.language
|
97
|
-
end
|
98
|
-
builder.dc :identifier, :id => 'dcidid', 'opf:scheme' => 'URI' do
|
99
|
-
builder << @metadata.identifier
|
100
|
-
end
|
101
|
-
# Optional elements
|
102
|
-
builder.dc :subject do
|
103
|
-
builder << @metadata.subject
|
104
|
-
end if @metadata.subject
|
105
|
-
builder.dc :description do
|
106
|
-
builder << @metadata.description
|
107
|
-
end if @metadata.description
|
108
|
-
builder.dc :relation do
|
109
|
-
builder << @metadata.relation
|
110
|
-
end if @metadata.relation
|
111
|
-
builder.dc :creator do
|
112
|
-
builder << @metadata.creator
|
113
|
-
end if @metadata.creator
|
114
|
-
builder.dc :publisher do
|
115
|
-
builder << @metadata.publisher
|
116
|
-
end if @metadata.publisher
|
117
|
-
builder.dc :date do
|
118
|
-
builder << @metadata.date.to_s
|
119
|
-
end if @metadata.date
|
120
|
-
builder.dc :rights do
|
121
|
-
builder << @metadata.rights
|
122
|
-
end if @metadata.rights
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
class ContentItem < Struct.new(
|
127
|
-
:id,
|
128
|
-
:href,
|
129
|
-
:media_type
|
130
|
-
)
|
131
|
-
|
132
|
-
def initialize(id, href)
|
133
|
-
super(id, href)
|
134
|
-
self.media_type = case href.strip.downcase
|
135
|
-
when /.*\.html?$/
|
136
|
-
'application/xhtml+xml'
|
137
|
-
when /.*\.css$/
|
138
|
-
'text/css'
|
139
|
-
when /.*\.(jpeg|jpg)$/
|
140
|
-
'image/jpeg'
|
141
|
-
when /.*\.png$/
|
142
|
-
'image/png'
|
143
|
-
when /.*\.gif$/
|
144
|
-
'image/gif'
|
145
|
-
when /.*\.svg$/
|
146
|
-
'image/svg+xml'
|
147
|
-
when /.*\.ncx$/
|
148
|
-
'application/x-dtbncx+xml'
|
149
|
-
else
|
150
|
-
raise 'Unknown media type'
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def document?
|
155
|
-
self.media_type == 'application/xhtml+xml'
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def manifest_to_xml(manifest_items, builder)
|
160
|
-
builder.manifest do
|
161
|
-
manifest_items.each do |i|
|
162
|
-
builder.item :id => i[:id], :href => i[:href], 'media-type' => i[:media_type]
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def spine_to_xml(spine_items, builder)
|
168
|
-
builder.spine do
|
169
|
-
spine_items.each do |i|
|
170
|
-
builder.itemref :idref => i[:id]
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
178
|
-
end
|
data/test/epub/test_container.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'repub/epub'
|
5
|
-
|
6
|
-
class TestContainer < Test::Unit::TestCase
|
7
|
-
def test_container_create
|
8
|
-
c = Repub::Epub::Container.new
|
9
|
-
s = c.to_xml
|
10
|
-
doc = Nokogiri::XML.parse(s)
|
11
|
-
assert_not_nil(doc.at('rootfile'))
|
12
|
-
assert_equal('content.opf', doc.at('rootfile')['full-path'])
|
13
|
-
assert_equal('application/oebps-package+xml', doc.at('rootfile')['media-type'])
|
14
|
-
end
|
15
|
-
end
|