gepub 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -20,8 +20,10 @@ pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
22
  testepub.epub
23
+ testepub2.epub
24
+ example_test.epub
23
25
 
24
26
  ## BUNDLER
25
27
  Gemfile.lock
26
28
  vendor/**
27
- .bundle/**
29
+ .bundle/**
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ script: bundle exec rspec spec
data/README.rdoc CHANGED
@@ -1,70 +1,24 @@
1
1
  = gepub
2
+ {<img src="https://secure.travis-ci.org/skoji/gepub.png" />}[http://travis-ci.org/skoji/gepub]
2
3
 
3
4
  * http://github.com/skoji/gepub
4
5
 
5
6
  == DESCRIPTION:
6
7
 
7
- a good-enough EPUB generator library.
8
+ a generic EPUB parser/generator library.
8
9
 
9
10
  == FEATURES/PROBLEMS:
10
11
 
11
- * GEPUB::Book provides functionality to create ncx/opf, and epub file.
12
+ * GEPUB::Book provides functionality to create EPUB file, and parsing EPUB file
13
+ * from version 0.6, GEPUB::Book will be able handle almost every metadata in EPUB2/EPUB3.
14
+ .. but is still beta version. Please inform me when you find bugs.
12
15
 
13
- * opf: can't specify creators with role
14
- * opf: can't specify date with event
15
- * opf: unique-identifier's scheme is fixed to 'URL'
16
- * ncx: can't nest navPoint elements
17
- * ...and many other restrictions
18
-
19
- * GEPUB::Generator has been removed. Use GEPUB::Book instead.
16
+ * Will provide easy to generate EPUB class, like Nokogiri::XML::Generator.
20
17
 
21
18
  == SYNOPSIS:
22
19
 
23
- require 'rubygems'
24
- require 'gepub'
25
- require 'fileutils'
26
-
27
- epubname = "testepub.epub"
28
- title = "samplepub"
29
-
30
- epub = GEPUB::Book.new(title)
31
- epub.author="the author"
32
- epub.publisher="the publisher"
33
- epub.date = "2010-11-27"
34
- epub.identifier = "http://www.skoji.jp/testepub/2010-06-26"
35
- epub.locale = 'ja' #defaults to 'en'
36
-
37
- # create test contents files
38
- contents = {}
39
- [ 'coverpage', 'chapter1', 'chapter2' ].each {
40
- |name|
41
- contents[name] = <<EOF
42
- <?xml version="1.0" encoding="UTF-8"?>
43
- <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
44
- <head>
45
- <title>sample #{name} </title>
46
- </head>
47
- <body>
48
- <h1>#{name}</h1>
49
- <p>here comes the contents for #{name}</p>
50
- </body>
51
- </html>
52
- EOF
53
- }
54
-
55
- # coverpage won't appear on toc, so do not call addNav
56
- epub.add_ordered_item('coverpage.html', StringIO.new(contents['coverpage']))
57
-
58
- chap1 = epub.add_ordered_item("chapter1.html", StringIO.new(contents['chapter1']))
59
- epub.add_nav(chap1, 'Chapter 1')
60
- chap2 = epub.add_ordered_item("chapter2.html", StringIO.new(contents['chapter2']))
61
- epub.add_nav(chap2, 'Chapter 2')
62
-
63
- # GEPUB::Book#add_ordered_item will added on <manifest> and <spine> section.
64
- # if you want to add image file, use GEPUB::Book#add_item instead.
65
-
66
- epub.generate_epub(epubname)
67
-
20
+ see examples directory.
21
+
68
22
  == INSTALL:
69
23
 
70
24
  * gem install gepub
@@ -73,7 +27,7 @@ a good-enough EPUB generator library.
73
27
 
74
28
  (The New BSD License)
75
29
 
76
- Copyright (c) 2010-2011, KOJIMA Satoshi
30
+ Copyright (c) 2010-2012, KOJIMA Satoshi
77
31
  All rights reserved.
78
32
 
79
33
  Redistribution and use in source and binary forms, with or without
data/bin/gepuber CHANGED
@@ -2,17 +2,17 @@ require 'gepub'
2
2
  require 'optparse'
3
3
 
4
4
  def usage
5
- STDERR.print "gepuber [-d destination ] <source-directory>\r\n"
5
+ STDERR.print "gepuber [-d destination ] [-c configfilename] <source-directory>\r\n"
6
6
  exit 1
7
7
  end
8
8
 
9
- def srccheck(srcdir)
9
+ def srccheck(srcdir, configfilename)
10
10
  if !File.exist?(srcdir) || !File.directory?(srcdir)
11
11
  STDERR.print "#{srcdir} is not a directory"
12
12
  exit 1
13
13
  end
14
- if !File.exist?(File.join(srcdir, 'gepuber.conf'))
15
- STDERR.print "gepuber.conf does not exists in#{srcdir}."
14
+ if !File.exist?(File.join(srcdir, configfilename))
15
+ STDERR.print "#{configfilename} does not exists in#{srcdir}."
16
16
  exit 1
17
17
  end
18
18
  end
@@ -25,6 +25,7 @@ def destcheck(destdir)
25
25
  end
26
26
 
27
27
  destbasedir = "."
28
+ configfilename = 'gepuber.conf'
28
29
 
29
30
  opt = OptionParser.new
30
31
 
@@ -34,14 +35,18 @@ opt.on('-d [directory]') { |dir|
34
35
  destbasedir = dir
35
36
  }
36
37
 
38
+ opt.on('-c [configfilename]') { |name|
39
+ configfilename = name
40
+ }
41
+
37
42
  destbasedir = File.expand_path(destbasedir)
38
43
 
39
44
  srcdir = opt.parse(ARGV)[0]
40
- srccheck(srcdir)
45
+ srccheck(srcdir, configfilename)
41
46
 
42
47
  Dir.chdir(srcdir)
43
48
  begin
44
- File.open('gepuber.conf', 'rb') {
49
+ File.open(configfilename, 'rb') {
45
50
  |io|
46
51
  gepuber = GEPUB::Gepuber.new(eval("#{io.read}"))
47
52
  gepuber.create destbasedir
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'rubygem'
3
+ require 'gepub'
4
+
5
+ book = GEPUB::Book.new
6
+ book.set_main_id('http:/example.jp/bookid_in_url', 'BookID', 'URL')
7
+ book.language = 'ja'
8
+
9
+ # you can add metadata and its property using block
10
+ book.add_title('GEPUBサンプル文書', nil, GEPUB::TITLE_TYPE::MAIN) {
11
+ |title|
12
+ title.lang = 'ja'
13
+ title.file_as = 'GEPUB Sample Book'
14
+ title.display_seq = 1
15
+ title.add_alternates(
16
+ 'en' => 'GEPUB Sample Book (Japanese)',
17
+ 'el' => 'GEPUB δείγμα (Ιαπωνικά)',
18
+ 'th' => 'GEPUB ตัวอย่าง (ญี่ปุ่น)')
19
+ }
20
+ # you can do the same thing using method chain
21
+ book.add_title('これはあくまでサンプルです',nil, GEPUB::TITLE_TYPE::SUBTITLE).set_display_seq(1).add_alternates('en' => 'this book is just a sample.')
22
+ book.add_creator('小嶋智') {
23
+ |creator|
24
+ creator.display_seq = 1
25
+ creator.add_alternates('en' => 'KOJIMA Satoshi')
26
+ }
27
+ book.add_contributor('電書部').set_display_seq(1).add_alternates('en' => 'Denshobu')
28
+ book.add_contributor('アサガヤデンショ').set_display_seq(2).add_alternates('en' => 'Asagaya Densho')
29
+ book.add_contributor('湘南電書鼎談').set_display_seq(3).add_alternates('en' => 'Shonan Densho Teidan')
30
+ book.add_contributor('電子雑誌トルタル').set_display_seq(4).add_alternates('en' => 'eMagazine Torutaru')
31
+
32
+ imgfile = File.join(File.dirname(__FILE__), 'img', 'image1.jpg')
33
+ File.open(imgfile) do
34
+ |io|
35
+ book.add_item('img/image1.jpg',io).cover_image
36
+ end
37
+
38
+ # within ordered block, add_item will be added to spine.
39
+ book.ordered {
40
+ book.add_item('text/chap1.xhtml').add_content(StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c1</title></head><body><p>the first page</p></body></html>')).toc_text('Chapter 1')
41
+ book.add_item('text/chap1-1.xhtml').add_content(StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c2</title></head><body><p>the second page</p></body></html>')) # do not appear on table of contents
42
+ book.add_item('text/chap2.xhtml').add_content(StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c3</title></head><body><p>the third page</p></body></html>')).toc_text('Chapter 2')
43
+ # to add nav file:
44
+ # book.add_item('path/to/nav').add_content(nav_html_content).add_property('nav')
45
+ }
46
+ epubname = File.join(File.dirname(__FILE__), 'example_test.epub')
47
+
48
+ # if you do not specify your own nav document with add_item,
49
+ # simple navigation text will be generated in generate_epub.
50
+ # auto-generated nav file will not appear on spine.
51
+ book.generate_epub(epubname)
52
+
Binary file
data/gepub.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["KOJIMA Satoshi"]
9
9
  s.email = ["skoji@mac.com"]
10
10
  s.homepage = %q{http://github.com/skoji/gepub}
11
- s.summary = %q{a good-enough EPUB generator.}
12
- s.description = %q{an easy-to-use EPUB generator.}
11
+ s.summary = %q{a generic EPUB parser/generator.}
12
+ s.description = %q{gepub is a EPUB parser/generator. Generates EPUB2 opf. will support EPUB3 parse/generation}
13
13
 
14
14
  s.rubyforge_project = "gepub"
15
15
 
@@ -19,7 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_development_dependency "rspec", ">= 2"
22
- s.add_development_dependency "epubcheck", ">= 0.1.0"
23
22
  s.add_runtime_dependency "nokogiri", ">= 1.5.0"
24
- s.add_runtime_dependency "rubyzip", ">= 0.9.4"
23
+ s.add_runtime_dependency "rubyzip", ">= 0.9.6"
25
24
  end
data/lib/gepub/book.rb CHANGED
@@ -7,109 +7,134 @@ require 'fileutils'
7
7
 
8
8
  module GEPUB
9
9
  class Book
10
- attr_accessor :spine, :locale, :epub_version, :epub_backword_compat
10
+ MIMETYPE='mimetype'
11
+ MIMETYPE_CONTENTS='application/epub+zip'
12
+ CONTAINER='META-INF/container.xml'
13
+ ROOTFILE_PATTERN=/^.+\.opf$/
14
+ CONTAINER_NS='urn:oasis:names:tc:opendocument:xmlns:container'
15
+
16
+ def self.rootfile_from_container(rootfile)
17
+ doc = Nokogiri::XML::Document.parse(rootfile)
18
+ ns = doc.root.namespaces
19
+ defaultns = ns.select{ |name, value| value == CONTAINER_NS }.keys[0]
20
+ doc.css("#{defaultns}|rootfiles > #{defaultns}|rootfile")[0]['full-path']
21
+ end
11
22
 
12
- def self.def_meta(name, key = nil)
13
- key ||= name
14
- define_method name.to_sym do
15
- instance_variable_get('@metadata')[key.to_sym]
16
- end
17
- define_method ( name.to_s + "=" ).to_sym do
18
- |v|
19
- instance_variable_get('@metadata')[key.to_sym] = v
20
- end
23
+ def self.parse(io)
24
+ files = {}
25
+ package = nil
26
+ package_path = nil
27
+ Zip::ZipInputStream::open_buffer(io) {
28
+ |zis|
29
+ while entry = zis.get_next_entry
30
+ if !entry.directory?
31
+ files[entry.name] = zis.read
32
+ case entry.name
33
+ when MIMETYPE then
34
+ files[MIMETYPE] = nil
35
+ when CONTAINER then
36
+ package_path = rootfile_from_container(files[entry.name])
37
+ files[CONTAINER] = nil
38
+ when ROOTFILE_PATTERN then
39
+ package = Package.parse_opf(files[entry.name], entry.name)
40
+ end
41
+ end
42
+ end
43
+ if package_path != package.path
44
+ warn 'inconsistend EPUB file: container says opf is #{package_path}, but actually #{package.path}'
45
+ end
46
+ files.each {
47
+ |k, content|
48
+ item = package.manifest.item_by_href(k.sub(/^#{package.contents_prefix}/,''))
49
+ if !item.nil?
50
+ files[k] = nil
51
+ item.add_raw_content(content)
52
+ end
53
+ }
54
+ book = Book.new(package.path)
55
+ book.instance_eval { @package = package; @stray_files = files }
56
+ book
57
+ }
21
58
  end
22
59
 
23
- def initialize(title, contents_prefix="")
24
- @metadata = {}
25
- @metadata[:identifier] = []
26
- @metadata[:title] = title
27
- @metadata[:gepub_version] = '0.1'
28
- @manifest = []
29
- @spine = []
60
+ def initialize(path='OEBPS/package.opf', attributes = {})
61
+ if File.extname(path) != '.opf'
62
+ warn 'GEPUB::Book#new interface changed. You must supply path to package.opf as first argument. If you want to set title, please use GEPUB::Book#title='
63
+ end
64
+ @package = Package.new(path, attributes)
30
65
  @toc = []
31
- @contents_prefix = contents_prefix # may insert "OEBPS"
32
- @contents_prefix = @contents_prefix + "/" if contents_prefix != ""
33
- @itemcount = 0
34
- @locale = 'en'
35
- @epub_version = 2.1
36
- @epub_backword_compat = false
37
- end
38
-
39
- def_meta :title
40
- def_meta :author, :creator
41
- def_meta :contributor
42
- def_meta :publisher
43
- def_meta :date
44
-
45
- def identifier
46
- @main_identifier
66
+ yield book if block_given?
47
67
  end
48
68
 
49
- def identifier=(id)
50
- @metadata[:identifier] << { :scheme => 'URL', :identifier => id, :main_id => true }
51
- @main_identifier = id
52
- end
53
-
54
- def setIdentifier(scheme, identfier)
55
- @metadata[:identifier] << { :scheme => scheme, :identifier => identifier }
69
+ def add_nav(item, text, id = nil)
70
+ warn 'add_nav is deprecated: please use Item#toc_text'
71
+ @toc.push({ :item => item, :text => text, :id => id})
56
72
  end
57
73
 
58
- def add_ref_to_item(href, itemid = nil)
59
- itemid ||= 'item' + @itemcount.to_s + "_" + File.basename(href, '.*')
60
- @itemcount = @itemcount + 1
61
- item = Item.new(itemid, href)
62
- @manifest << item
74
+ def add_item(href, io = nil, id = nil, attributes = {})
75
+ item = @package.add_item(href,io,id,attributes)
76
+ toc = @toc
77
+ (class << item;self;end).send(:define_method, :toc_text,
78
+ Proc.new { |text, id = nil|
79
+ toc.push(:item => item, :text => text, :id => id)
80
+ item
81
+ })
82
+ yield item if block_given?
63
83
  item
64
84
  end
65
85
 
66
- def add_item(href, io, itemid = nil)
67
- add_ref_to_item(href, itemid).add_content(io)
68
- end
69
-
70
- def add_ordered_item(href, io, itemid = nil)
71
- item = add_item(href, io, itemid)
72
- @spine.push(item)
86
+ def add_ordered_item(href, io = nil, id = nil, attributes = {})
87
+ item = @package.add_ordered_item(href,io,id,attributes)
88
+ toc = @toc
89
+ (class << item;self;end).send(:define_method, :toc_text,
90
+ Proc.new { |text, id = nil|
91
+ toc.push(:item => item, :text => text, :id => id)
92
+ item
93
+ })
94
+ yield item if block_given?
73
95
  item
74
96
  end
75
-
76
- def add_nav(item, text, id = nil)
77
- @toc.push({ :item => item, :text => text, :id => id})
78
- end
79
-
80
- def specify_cover_image(item)
81
- @metadata[:cover] = item.itemid
97
+
98
+ def method_missing(name,*args)
99
+ @package.send(name, *args)
82
100
  end
83
-
84
- def cover_image_item
85
- @metadata[:cover]
101
+
102
+ def ordered(&block)
103
+ @package.ordered(&block)
86
104
  end
87
-
88
105
  def generate_epub(path_to_epub)
89
106
  if (@toc.size == 0)
90
- @toc << { :item => @spine[0], :text => " " }
107
+ @toc << { :item => @package.spine.itemref_list[0] }
108
+ end
109
+
110
+ if version.to_f < 3.0 || @package.epub_backward_compat
111
+ add_item('toc.ncx', StringIO.new(ncx_xml), 'ncx')
91
112
  end
92
113
 
93
- add_item('toc.ncx', StringIO.new(ncx_xml), 'ncx')
114
+ if version.to_f >=3.0
115
+ @package.metadata.set_lastmodified
116
+ if @package.manifest.item_list.select {
117
+ |href, item|
118
+ (item.properties||[]).member? 'nav'
119
+ }.size == 0
120
+ generate_nav_doc
121
+ end
122
+ end
94
123
 
95
124
  File.delete(path_to_epub) if File.exist?(path_to_epub)
96
125
  Zip::ZipOutputStream::open(path_to_epub) {
97
126
  |epub|
98
-
99
- # create metadata files
100
127
  epub.put_next_entry('mimetype', '', '', Zip::ZipEntry::STORED)
101
128
  epub << "application/epub+zip"
102
-
103
129
  epub.put_next_entry('META-INF/container.xml')
104
130
  epub << container_xml
105
131
 
106
- epub.put_next_entry(@contents_prefix + 'content.opf')
132
+ epub.put_next_entry(@package.path)
107
133
  epub << opf_xml
108
134
 
109
- # create items
110
- @manifest.each {
111
- |item|
112
- epub.put_next_entry(@contents_prefix + item.href)
135
+ @package.manifest.item_list.each {
136
+ |k, item|
137
+ epub.put_next_entry(@package.contents_prefix + item.href)
113
138
  epub << item.content
114
139
  }
115
140
  }
@@ -120,120 +145,73 @@ module GEPUB
120
145
  <?xml version="1.0" encoding="UTF-8"?>
121
146
  <container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
122
147
  <rootfiles>
123
- <rootfile full-path="#{@contents_prefix}content.opf" media-type="application/oebps-package+xml"/>
148
+ <rootfile full-path="#{@package.path}" media-type="application/oebps-package+xml"/>
124
149
  </rootfiles>
125
150
  </container>
126
151
  EOF
127
152
  end
128
153
 
129
- def opf_xml
130
- opf = Nokogiri::XML::Document.new
131
- opf.root = package = Nokogiri::XML::Node.new('package', opf)
132
- package.add_namespace(nil, 'http://www.idpf.org/2007/opf')
133
- package['version'] = '2.0'
134
- package['unique-identifier'] = 'BookID'
135
- package << metadataelem = Nokogiri::XML::Node.new('metadata', opf)
136
- metadataelem.add_namespace('opf', 'http://www.idpf.org/2007/opf')
137
- metadataelem.add_namespace('dc', "http://purl.org/dc/elements/1.1/")
138
- metadataelem << lang = Nokogiri::XML::Node.new('dc:language', opf)
139
- lang.content = @locale
140
- @metadata.each { |k,v|
141
- if (k == :cover)
142
- metadataelem << node = Nokogiri::XML::Node.new("meta", opf)
143
- node['name'] = 'cover'
144
- node['content'] = v
145
- elsif (k == :identifier)
146
- v.each {
147
- |id|
148
- metadataelem << node = Nokogiri::XML::Node.new("dc:#{k}", opf)
149
- node.content = id[:identifier]
150
- if (id[:main_id])
151
- node['id'] = 'BookID'
152
- end
153
- node['opf:scheme'] = id[:scheme]
154
- }
155
- elsif (k == :gepub_version)
156
- metadataelem << node = Nokogiri::XML::Node.new("meta", opf)
157
- node['name'] = 'gepub version'
158
- node['content'] = v
159
- else
160
- metadataelem << node = Nokogiri::XML::Node.new("dc:#{k}",opf)
161
- node.content = v
162
- end
163
- }
164
-
165
- package << manifestelem = Nokogiri::XML::Node.new('manifest', opf)
166
- @manifest.each {
167
- |item|
168
- manifestelem << node = Nokogiri::XML::Node.new("item", opf)
169
- node['id'] = "#{item.itemid}"
170
- node['href'] = "#{item.href}"
171
- node['media-type'] = "#{item.mediatype}"
172
- }
173
-
174
- package << spineelem = Nokogiri::XML::Node.new('spine', opf)
175
- spineelem['toc'] = 'ncx'
154
+ def generate_nav_doc(title = 'Table of Contents')
155
+ add_item('nav.html', StringIO.new(nav_doc(title)), 'nav').add_property('nav')
156
+ end
176
157
 
177
- @spine.each {
178
- |v|
179
- spineelem << node = Nokogiri::XML::Node.new('itemref', opf)
180
- node['idref'] = "#{v.itemid}"
158
+ def nav_doc(title = 'Table of Contents')
159
+ builder = Nokogiri::XML::Builder.new {
160
+ |doc|
161
+ doc.html('xmlns' => "http://www.w3.org/1999/xhtml",'xmlns:epub' => "http://www.idpf.org/2007/ops") {
162
+ doc.head { doc.text ' ' }
163
+ doc.body {
164
+ doc.nav('epub:type' => 'toc', 'id' => 'toc') {
165
+ doc.h1 "#{title}"
166
+ doc.ol {
167
+ @toc.each {
168
+ |x|
169
+ doc.li {
170
+ doc.a({'href' => x[:item].href} ,x[:text])
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
181
177
  }
182
- opf.to_s
178
+ builder.to_xml
183
179
  end
184
-
185
180
 
186
181
  def ncx_xml
187
- ncx = Nokogiri::XML::Document.new
188
- ncx.root = root = Nokogiri::XML::Node.new('ncx', ncx)
189
- root.add_namespace(nil, "http://www.daisy.org/z3986/2005/ncx/")
190
- root['version'] = "2005-1"
191
- root << head = Nokogiri::XML::Node.new('head', ncx)
192
- head << uid = Nokogiri::XML::Node.new('meta', ncx)
193
- uid['name'] = 'dtb:uid'
194
- uid['content'] = "#{@main_identifier}"
195
-
196
- head << depth = Nokogiri::XML::Node.new('meta', ncx)
197
- depth['name'] = 'dtb:depth'
198
- depth['content'] = '1'
199
-
200
- head << totalPageCount = Nokogiri::XML::Node.new('meta', ncx)
201
- totalPageCount['name'] = 'dtb:totalPageCount'
202
- totalPageCount['content'] = '0'
203
-
204
- head << maxPageNumber = Nokogiri::XML::Node.new('meta', ncx)
205
- maxPageNumber['name'] = 'dtb:maxPageNumber'
206
- maxPageNumber['content'] = '0'
207
-
208
- root << docTitle = Nokogiri::XML::Node.new('docTitle', ncx)
209
- docTitle << docTitleText = Nokogiri::XML::Node.new('text', ncx)
210
- docTitleText.content = "#{@metadata[:title]}"
211
-
212
- root << nav_map = Nokogiri::XML::Node.new('navMap', ncx)
213
- count = 1
214
- @toc.each {
215
- |x|
216
- nav_point = Nokogiri::XML::Node.new('navPoint', ncx)
217
- nav_point['id'] = "#{x[:item].itemid}"
218
- nav_point['playOrder'] = "#{count}"
219
-
220
- nav_label = Nokogiri::XML::Node.new('navLabel', ncx)
221
- nav_label << navtxt = Nokogiri::XML::Node.new('text', ncx)
222
- navtxt.content = "#{x[:text]}"
223
-
224
- nav_content = Nokogiri::XML::Node.new('content', ncx)
225
- if x[:id].nil?
226
- nav_content['src'] = "#{x[:item].href}"
227
- else
228
- nav_content['src'] = "#{x[:item].href}##{x[:id]}"
229
- end
230
-
231
- count = count + 1
232
- nav_map << nav_point
233
- nav_point << nav_label
234
- nav_point << nav_content
182
+ builder = Nokogiri::XML::Builder.new {
183
+ |xml|
184
+ xml.ncx('xmlns' => 'http://www.daisy.org/z3986/2005/ncx/', 'version' => '2005-1') {
185
+ xml.head {
186
+ xml.meta('name' => 'dtb:uid', 'content' => "#{self.identifier}")
187
+ xml.meta('name' => 'dtb:depth', 'content' => '1')
188
+ xml.meta('name' => 'dtb:totalPageCount','content' => '0')
189
+ xml.meta('name' => 'dtb:maxPageNumber', 'content' => '0')
190
+ }
191
+ xml.docTitle {
192
+ xml.text_ "#{@package.metadata.title}"
193
+ }
194
+ count = 1
195
+ xml.navMap {
196
+ @toc.each {
197
+ |x|
198
+ xml.navPoint('id' => "#{x[:item].itemid}", 'playOrder' => "#{count}") {
199
+ xml.navLabel {
200
+ xml.text_ "#{x[:text]}"
201
+ }
202
+ if x[:id].nil?
203
+ xml.content('src' => "#{x[:item].href}")
204
+ else
205
+ xml.content('src' => "#{x[:item].href}##{x[:id]}")
206
+ end
207
+ }
208
+ count += 1
209
+ }
210
+ }
211
+ }
235
212
  }
236
- ncx.to_s
213
+ builder.to_xml
237
214
  end
215
+
238
216
  end
239
217
  end
data/lib/gepub/gepuber.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
 
3
3
  module GEPUB
4
- class Gepuber < GEPUB::Book
4
+ class Gepuber
5
5
  class FileProvider
6
6
  include Enumerable
7
7
  def initialize(pattern)
@@ -21,8 +21,12 @@ module GEPUB
21
21
 
22
22
  attr_accessor :texts, :resources, :epubname, :coverimg, :table_of_contents, :provider
23
23
 
24
+ def method_missing(name, *args)
25
+ @package.send(name, *args)
26
+ end
27
+
24
28
  def initialize(param)
25
- super('', 'OEBPS')
29
+ @package = GEPUB::Package.new()
26
30
  param.each {
27
31
  |k,v|
28
32
  self.send "#{k}=", v