epub-maker 0.0.1

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.
@@ -0,0 +1,16 @@
1
+
2
+ default namespace = "urn:oasis:names:tc:opendocument:xmlns:container"
3
+ include "./mod/datatypes.rnc"
4
+
5
+ start = ocf.container
6
+
7
+ ocf.container = element container {
8
+ attribute version { '1.0' } &
9
+ element rootfiles {
10
+ element rootfile {
11
+ attribute full-path { datatype.URI } &
12
+ attribute media-type { 'application/oebps-package+xml' }
13
+ }+
14
+ }
15
+ }
16
+
@@ -0,0 +1,62 @@
1
+ require_relative 'helper'
2
+ require 'epub/maker'
3
+ require 'epzip'
4
+
5
+ class TestImplaceEditing < Test::Unit::TestCase
6
+ def setup
7
+ @assets_dir = Pathname(__dir__)/'fixtures'/'book'
8
+ @dir = Pathname.mktmpdir('epub-maker-test')
9
+ @file = @dir/'book.epub'
10
+ Epzip.zip @assets_dir.to_s, @file.to_path
11
+ @book = EPUB::Parser.parse(@file)
12
+ end
13
+
14
+ def teardown
15
+ (@assets_dir/'mimetype').rmtree
16
+ @dir.remove_entry_secure if @dir.exist?
17
+ end
18
+
19
+ def test_save_parsed_book
20
+ nav = @book.nav
21
+ doc = nav.content_document.nokogiri
22
+ title = doc.search('title').first
23
+ title.content = 'Edited Title'
24
+ nav.content = doc.to_xml
25
+ nav.save
26
+
27
+ assert_match '<title>Edited Title</title>', nav.read
28
+ end
29
+
30
+ def test_edit
31
+ item = @book.resources.find(&:xhtml?)
32
+ item.edit do
33
+ doc = Nokogiri.XML(item.read)
34
+ title = doc.search('title').first
35
+ title.content = 'Edited Title'
36
+ item.content = doc.to_xml
37
+ end
38
+
39
+ assert_match '<title>Edited Title</title>', item.read
40
+ end
41
+
42
+ def test_edit_with_rexml
43
+ require 'rexml/quickpath'
44
+ item = @book.resources.find(&:xhtml?)
45
+ item.edit_with_rexml do |doc|
46
+ title = REXML::QuickPath.first(doc, '//title')
47
+ title.text = 'Edited Title'
48
+ end
49
+
50
+ assert_match '<title>Edited Title</title>', item.read
51
+ end
52
+
53
+ def test_edit_with_nokogiri
54
+ item = @book.resources.find(&:xhtml?)
55
+ item.edit_with_nokogiri do |doc|
56
+ title = doc.search('title').first
57
+ title.content = 'Edited Title'
58
+ end
59
+
60
+ assert_match '<title>Edited Title</title>', item.read
61
+ end
62
+ end
@@ -0,0 +1,66 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'helper'
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+ require 'epub/maker'
6
+
7
+ class TestMaker < Test::Unit::TestCase
8
+ def setup
9
+ @fixture_dir = Pathname(__dir__) + 'fixtures' + 'book'
10
+ @dir = Pathname.mktmpdir('epub-maker-test')
11
+ @file = @dir + 'book.epub'
12
+ end
13
+
14
+ def teardown
15
+ @dir.remove_entry_secure if @dir.exist?
16
+ end
17
+
18
+ def test_make
19
+ EPUB::Maker.make @file do |book|
20
+ book.make_ocf do |ocf|
21
+ ocf.make_container do |container|
22
+ container.make_rootfile full_path: Addressable::URI.parse('OPS/content.opf')
23
+ end
24
+ end
25
+
26
+ book.make_package do |package|
27
+ package.dir = 'rtl'
28
+
29
+ package.make_metadata do |metadata|
30
+ metadata.title = 'Sample eBook'
31
+ metadata.language = 'ja'
32
+ end
33
+
34
+ package.make_manifest do |manifest|
35
+ Pathname.glob("#{@fixture_dir}/OPS/*.{xhtml,xml}").each_with_index do |content_path, index|
36
+ manifest.make_item do |item|
37
+ item.id = "item-#{index + 1}"
38
+ href = content_path.relative_path_from(@fixture_dir + File.dirname(book.rootfile_path))
39
+ item.href = Addressable::URI.parse(href.to_s)
40
+ item.media_type = case content_path.extname
41
+ when '.xhtml' then 'application/xhtml+xml'
42
+ when '.xml' then 'application/xml'
43
+ end
44
+ item.content_file = (@fixture_dir + item.entry_name).to_path
45
+ item.properties << 'nav' if content_path.basename.to_path == 'nav.xhtml'
46
+ item.properties << 'scripted' if content_path.basename.to_path == 'impl.xhtml'
47
+ end
48
+ end
49
+
50
+ package.make_spine do |spine|
51
+ spine.page_progression_direction = 'rtl'
52
+
53
+ package.manifest.items.select(&:xhtml?).each do |item|
54
+ spine.make_itemref do |itemref|
55
+ itemref.item = item
56
+ itemref.linear = true
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ assert_valid_epub @file.to_path
65
+ end
66
+ end
@@ -0,0 +1,61 @@
1
+ require_relative 'helper'
2
+ require 'nokogiri'
3
+ require 'epub/constants'
4
+ require 'epub/maker/ocf'
5
+
6
+ class TestMakerOCF < Test::Unit::TestCase
7
+ def setup
8
+ @container = EPUB::OCF::Container.new
9
+ end
10
+
11
+ def test_make_container_returns_container_object
12
+ ocf = EPUB::OCF.new
13
+ assert_kind_of EPUB::OCF::Container, ocf.make_container
14
+ end
15
+
16
+ def test_make_container_yields_container_object
17
+ ocf = EPUB::OCF.new
18
+ ocf.make_container do |container|
19
+ assert_kind_of EPUB::OCF::Container, container
20
+ end
21
+ end
22
+
23
+ def test_container_make_container_yeilds_is_a_container_of_the_ocf
24
+ ocf = EPUB::OCF.new
25
+ container = ocf.make_container
26
+ assert_same ocf.container, container
27
+ end
28
+
29
+ class TestMakerContainer < TestMakerOCF
30
+ def test_to_xml
31
+ rootfile = EPUB::OCF::Container::Rootfile.new
32
+ rootfile.full_path = 'OPS/contents.opf'
33
+ rootfile.media_type = 'application/oebps-package+xml'
34
+ @container.rootfiles << rootfile
35
+ expected = Nokogiri.XML(<<EOC)
36
+ <?xml version="1.0" encoding="UTF-8"?>
37
+ <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
38
+ <rootfiles>
39
+ <rootfile full-path="OPS/contents.opf" media-type="application/oebps-package+xml" />
40
+ </rootfiles>
41
+ </container>
42
+ EOC
43
+ assert_equal expected.to_s, Nokogiri.XML(@container.to_xml).to_s
44
+ end
45
+
46
+ def test_make_rootfile_returnes_rootfile_object
47
+ assert_kind_of EPUB::OCF::Container::Rootfile, @container.make_rootfile
48
+ end
49
+
50
+ def test_make_rootfile_yields_rootfile_object
51
+ @container.make_rootfile do |rootfile|
52
+ assert_kind_of EPUB::OCF::Container::Rootfile, rootfile
53
+ end
54
+ end
55
+
56
+ def test_rootfile_make_rootfile_yields_is_a_rootfile_of_the_container
57
+ rootfile = @container.make_rootfile
58
+ assert_include @container.rootfiles, rootfile
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'helper'
3
+ require 'epub/parser'
4
+ require 'epub/maker/publication'
5
+
6
+ class TestMakerPublication < Test::Unit::TestCase
7
+ def setup
8
+ rootfile = 'OPS/ルートファイル.opf'
9
+ @opf = File.read(File.expand_path("../fixtures/book/#{rootfile}", __FILE__))
10
+ @package = EPUB::Parser::Publication.new(@opf, rootfile).parse
11
+ end
12
+
13
+ def test_to_xml_attribute
14
+ doc = Nokogiri.XML(@package.to_xml)
15
+
16
+ identifier = doc.xpath('/opf:package/opf:metadata/dc:identifier', EPUB::NAMESPACES).first
17
+ assert_equal 'pub-id', identifier['id']
18
+
19
+ meta = doc.xpath('/opf:package/opf:metadata/opf:meta[@scheme]', EPUB::NAMESPACES).first
20
+ assert_equal 'marc:relators', meta['scheme']
21
+
22
+ link = doc.xpath('/opf:package/opf:metadata/opf:link[@refines]', EPUB::NAMESPACES).first
23
+ assert_equal 'http://example.org/onix/12389347', link['href']
24
+
25
+ manifest = doc.xpath('/opf:package/opf:manifest', EPUB::NAMESPACES).first
26
+ assert_equal 'manifest-id', manifest['id']
27
+
28
+ item = doc.xpath('/opf:package/opf:manifest/opf:item[@id="nav"]', EPUB::NAMESPACES).first
29
+ assert_equal 'application/xhtml+xml', item['media-type']
30
+
31
+ spine = doc.xpath('/opf:package/opf:spine', EPUB::NAMESPACES).first
32
+ assert_equal 'spine-id', spine['id']
33
+
34
+ itemref = doc.xpath('/opf:package/opf:spine/opf:itemref', EPUB::NAMESPACES).first
35
+ assert_equal 'cover', itemref['idref']
36
+
37
+ media_type = doc.xpath('/opf:package/opf:bindings/opf:mediaType', EPUB::NAMESPACES).first
38
+ assert_equal 'application/x-demo-slideshow', media_type['media-type']
39
+ end
40
+ end
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'helper'
3
+ require 'epub/maker/task'
4
+
5
+ class TestTask < Test::Unit::TestCase
6
+ def setup
7
+ @base_dir = File.join(__dir__, 'fixtures', 'book')
8
+ @epub_name = File.join(__dir__, 'fixtures', 'book.epub')
9
+ FileUtils::Verbose.rm @epub_name if File.exist? @epub_name
10
+
11
+ @task = EPUB::Maker::Task.new @epub_name do |task|
12
+ task.titles = ['EPUB Maker Rake Example'] # temporary
13
+
14
+ task.base_dir = @base_dir
15
+
16
+ task.files.include "#{@base_dir}/**/*"
17
+ task.files.exclude {|entry| ! File.file? entry}
18
+
19
+ task.rootfile = "#{@base_dir}/OPS/ルートファイル.opf"
20
+ task.make_rootfiles = true
21
+
22
+ task.resources = task.files.dup
23
+ task.resources.exclude /\.opf/
24
+ task.resources.exclude /META\-INF/
25
+
26
+ task.navs.include 'OPS/nav.xhtml'
27
+ task.media_types = {"#{@base_dir}/OPS/slideshow.xml" => 'application/x-demo-slideshow'}
28
+
29
+ task.spine = task.resources.dup
30
+ task.spine.exclude /OPS\/impl\.xhtml\z/
31
+ task.spine.exclude /\.xml\z/
32
+
33
+ task.bindings = {'application/x-demo-slideshow' => "#{@base_dir}/OPS/impl.xhtml"}
34
+ end
35
+ end
36
+
37
+ def test_execute
38
+ Rake::Task[:epub].execute
39
+ assert_path_exist @epub_name
40
+ assert_valid_epub @epub_name
41
+ end
42
+
43
+ def test_file_map
44
+ expected = {
45
+ File.join(@base_dir, 'META-INF/container.xml') => 'META-INF/container.xml',
46
+ File.join(@base_dir, 'OPS/ルートファイル.opf') => 'OPS/ルートファイル.opf',
47
+ File.join(@base_dir, 'OPS/item-1.xhtml') => 'OPS/item-1.xhtml',
48
+ File.join(@base_dir, 'OPS/item-2.xhtml') => 'OPS/item-2.xhtml',
49
+ File.join(@base_dir, 'OPS/nav.xhtml') => 'OPS/nav.xhtml',
50
+ File.join(@base_dir, 'OPS/impl.xhtml') => 'OPS/impl.xhtml',
51
+ File.join(@base_dir, 'OPS/slideshow.xml') => 'OPS/slideshow.xml'
52
+ }
53
+
54
+ assert_equal expected, @task.file_map
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,333 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: epub-maker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - KITAITI Makoto
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: zipruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: epub-parser
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: pathname-common_prefix
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mime-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby-uuid
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: archive-zip
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: test-unit-full
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: epubcheck
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: epzip
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry-doc
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: yard
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: redcarpet
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: gem-man
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - '>='
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: ronn
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - '>='
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ description: This library supports making and editing EPUB books
252
+ email:
253
+ - KitaitiMakoto@gmail.com
254
+ executables:
255
+ - epub-maker
256
+ extensions: []
257
+ extra_rdoc_files: []
258
+ files:
259
+ - .gitignore
260
+ - CHANGELOG.markdown
261
+ - Gemfile
262
+ - LICENSE.txt
263
+ - README.markdown
264
+ - Rakefile
265
+ - bin/epub-maker
266
+ - epub-maker.gemspec
267
+ - lib/epub/maker.rb
268
+ - lib/epub/maker/content_document.rb
269
+ - lib/epub/maker/ocf.rb
270
+ - lib/epub/maker/publication.rb
271
+ - lib/epub/maker/task.rb
272
+ - lib/epub/maker/version.rb
273
+ - test/fixtures/book/META-INF/container.xml
274
+ - test/fixtures/book/OPS/impl.xhtml
275
+ - test/fixtures/book/OPS/item-1.xhtml
276
+ - test/fixtures/book/OPS/item-2.xhtml
277
+ - test/fixtures/book/OPS/nav.xhtml
278
+ - test/fixtures/book/OPS/slideshow.xml
279
+ - test/helper.rb
280
+ - test/make_task.rake
281
+ - test/schemas/epub-nav-30.rnc
282
+ - test/schemas/epub-nav-30.sch
283
+ - test/schemas/epub-xhtml-30.sch
284
+ - test/schemas/ocf-container-30.rnc
285
+ - test/test_inplace_editing.rb
286
+ - test/test_maker.rb
287
+ - test/test_maker_ocf.rb
288
+ - test/test_maker_publication.rb
289
+ - test/test_task.rb
290
+ - test/fixtures/book/OPS/ルートファイル.opf
291
+ homepage: ''
292
+ licenses: []
293
+ metadata: {}
294
+ post_install_message:
295
+ rdoc_options: []
296
+ require_paths:
297
+ - lib
298
+ required_ruby_version: !ruby/object:Gem::Requirement
299
+ requirements:
300
+ - - '>='
301
+ - !ruby/object:Gem::Version
302
+ version: 2.0.0
303
+ required_rubygems_version: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - '>='
306
+ - !ruby/object:Gem::Version
307
+ version: '0'
308
+ requirements: []
309
+ rubyforge_project:
310
+ rubygems_version: 2.0.2
311
+ signing_key:
312
+ specification_version: 4
313
+ summary: EPUB Maker
314
+ test_files:
315
+ - test/fixtures/book/META-INF/container.xml
316
+ - test/fixtures/book/OPS/impl.xhtml
317
+ - test/fixtures/book/OPS/item-1.xhtml
318
+ - test/fixtures/book/OPS/item-2.xhtml
319
+ - test/fixtures/book/OPS/nav.xhtml
320
+ - test/fixtures/book/OPS/slideshow.xml
321
+ - test/helper.rb
322
+ - test/make_task.rake
323
+ - test/schemas/epub-nav-30.rnc
324
+ - test/schemas/epub-nav-30.sch
325
+ - test/schemas/epub-xhtml-30.sch
326
+ - test/schemas/ocf-container-30.rnc
327
+ - test/test_inplace_editing.rb
328
+ - test/test_maker.rb
329
+ - test/test_maker_ocf.rb
330
+ - test/test_maker_publication.rb
331
+ - test/test_task.rb
332
+ - test/fixtures/book/OPS/ルートファイル.opf
333
+ has_rdoc: