epubber 0.1.5 → 0.2.0
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +4 -0
- data/epubber.gemspec +1 -0
- data/lib/epubber/generator.rb +3 -1
- data/lib/epubber/generators/cover.rb +15 -0
- data/lib/epubber/generators/generator.rb +1 -1
- data/lib/epubber/generators/static.rb +1 -1
- data/lib/epubber/models/book.rb +6 -3
- data/lib/epubber/models/chapter.rb +4 -2
- data/lib/epubber/models/concerns/has_chapters.rb +18 -16
- data/lib/epubber/models/concerns/has_cover.rb +19 -0
- data/lib/epubber/models/concerns/has_endnotes.rb +13 -11
- data/lib/epubber/models/concerns/has_html.rb +11 -0
- data/lib/epubber/models/concerns/has_introduction.rb +13 -11
- data/lib/epubber/models/cover.rb +34 -0
- data/lib/epubber/models/endnotes.rb +4 -2
- data/lib/epubber/models/introduction.rb +4 -2
- data/lib/epubber/services/persistance.rb +5 -1
- data/lib/epubber/version.rb +1 -1
- data/lib/templates/OEBPS/Text/cover.xhtml +1 -1
- data/lib/templates/OEBPS/content.opf +11 -9
- data/lib/templates/OEBPS/toc.ncx +9 -6
- data/test/assets/test-cover.png +0 -0
- data/test/test_epubber.rb +5 -0
- metadata +21 -2
- data/lib/epubber/models/model.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ebe4058b733ff70f76d730d422d3581e9b81fa3
|
4
|
+
data.tar.gz: ab4bf44f7f4b7747f46cb48e78afa63bce32044d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37d018c5a57e2a3fe08a504d2070ff0e54ba2ab1dad98fe84e49a396a8c64bc17e3ca7834addeccfb01591d95c092ad94cf3e4e876094c9fa72c020befcea785
|
7
|
+
data.tar.gz: 34f6c36dec17d26f8fb1fc4a69262c1229cf0f2c4743ab4f012a293817b8d2306762a503bf5cff4e15559af8d098c555b9bc960a755cb243af4e17b23cbbef8e
|
data/.gitignore
CHANGED
data/README.md
CHANGED
data/epubber.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "minitest"
|
24
|
+
spec.add_development_dependency "pry-byebug"
|
24
25
|
|
25
26
|
spec.add_runtime_dependency "liquid", "~> 3.0"
|
26
27
|
spec.add_runtime_dependency "rubyzip", ">= 1.0.0"
|
data/lib/epubber/generator.rb
CHANGED
@@ -4,6 +4,7 @@ require 'epubber/generators/toc'
|
|
4
4
|
require 'epubber/generators/introduction'
|
5
5
|
require 'epubber/generators/static'
|
6
6
|
require 'epubber/generators/endnotes'
|
7
|
+
require 'epubber/generators/cover'
|
7
8
|
require 'epubber/services/persistance'
|
8
9
|
require 'epubber/services/compressor'
|
9
10
|
|
@@ -22,11 +23,12 @@ class Epubber::Generator
|
|
22
23
|
|
23
24
|
def register_generators(params)
|
24
25
|
add_generator Epubber::Generators::Content.new(params)
|
26
|
+
add_generator Epubber::Generators::Cover.new(params)
|
25
27
|
add_generator Epubber::Generators::Introduction.new(params)
|
26
28
|
add_generator Epubber::Generators::Toc.new(params)
|
27
29
|
add_generator Epubber::Generators::Chapters.new(params)
|
28
|
-
add_generator Epubber::Generators::Static.new(params)
|
29
30
|
add_generator Epubber::Generators::Endnotes.new(params)
|
31
|
+
add_generator Epubber::Generators::Static.new(params)
|
30
32
|
end
|
31
33
|
|
32
34
|
def generate
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'epubber/generators/generator'
|
2
|
+
|
3
|
+
module Epubber::Generators
|
4
|
+
class Cover < Generator
|
5
|
+
def generate
|
6
|
+
# Because this is an optional generator, don't do anything if there's no
|
7
|
+
# introduction in the book
|
8
|
+
return if book.cover.nil?
|
9
|
+
|
10
|
+
content = template.parse file: 'OEBPS/Text/cover.xhtml', context: book_context
|
11
|
+
persist file: 'OEBPS/Text/cover.xhtml', content: content
|
12
|
+
persist file: "OEBPS/Images/#{book_context['book']['cover']['filename']}", content: book_context['book']['cover']['file']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -4,7 +4,7 @@ module Epubber::Generators
|
|
4
4
|
class Static < Generator
|
5
5
|
def generate
|
6
6
|
files = ['mimetype', 'META-INF/container.xml', 'META-INF/com.apple.ibooks.display-options.xml',
|
7
|
-
'OEBPS/
|
7
|
+
'OEBPS/Styles/style.css']
|
8
8
|
files.each do |file|
|
9
9
|
copy file
|
10
10
|
end
|
data/lib/epubber/models/book.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
require 'epubber/models/model'
|
3
2
|
require 'epubber/models/concerns/has_chapters'
|
4
3
|
require 'epubber/models/concerns/has_introduction'
|
5
4
|
require 'epubber/models/concerns/has_endnotes'
|
5
|
+
require 'epubber/models/concerns/has_cover'
|
6
6
|
|
7
7
|
# Represents a book with it's chapters.
|
8
8
|
module Epubber::Models
|
9
|
-
class Book
|
9
|
+
class Book
|
10
10
|
# Related models and their DSL goodies
|
11
11
|
include Epubber::Models::Concerns::HasChapters
|
12
12
|
include Epubber::Models::Concerns::HasIntroduction
|
13
13
|
include Epubber::Models::Concerns::HasEndnotes
|
14
|
+
include Epubber::Models::Concerns::HasCover
|
14
15
|
|
15
16
|
def initialize
|
16
17
|
@title = not_specified
|
@@ -70,7 +71,9 @@ module Epubber::Models
|
|
70
71
|
context["chapters"] = contextified_chapters
|
71
72
|
context["introduction"] = contextified_introduction
|
72
73
|
context["endnotes"] = contextified_endnotes
|
73
|
-
|
74
|
+
context["cover"] = contextified_cover
|
75
|
+
|
76
|
+
context
|
74
77
|
end
|
75
78
|
|
76
79
|
protected
|
@@ -1,8 +1,10 @@
|
|
1
|
-
require 'epubber/models/
|
1
|
+
require 'epubber/models/concerns/has_html'
|
2
2
|
|
3
3
|
# Represents a book's chapter
|
4
4
|
module Epubber::Models
|
5
|
-
class Chapter
|
5
|
+
class Chapter
|
6
|
+
include Epubber::Models::Concerns::HasHTML
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@id = 0
|
8
10
|
@title = 'Not specified'
|
@@ -1,23 +1,25 @@
|
|
1
1
|
require 'epubber/models/chapter'
|
2
2
|
|
3
|
-
module Epubber::Models
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Epubber::Models
|
4
|
+
module Concerns
|
5
|
+
module HasChapters
|
6
|
+
def chapters
|
7
|
+
@chapters ||= []
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
# Add chapter
|
11
|
+
def chapter
|
12
|
+
raise 'No block given' unless block_given?
|
13
|
+
chapter = Epubber::Models::Chapter.new
|
14
|
+
yield chapter
|
15
|
+
chapter.id(chapters.count + 1)
|
16
|
+
chapters << chapter
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
def contextified_chapters
|
20
|
+
chapters.map do |chapter|
|
21
|
+
chapter.contextify
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'epubber/models/cover'
|
2
|
+
|
3
|
+
module Epubber::Models
|
4
|
+
module Concerns
|
5
|
+
module HasCover
|
6
|
+
def cover(&block)
|
7
|
+
@cover ||= nil
|
8
|
+
return @cover unless block_given?
|
9
|
+
@cover = Epubber::Models::Cover.new
|
10
|
+
yield @cover
|
11
|
+
end
|
12
|
+
|
13
|
+
def contextified_cover
|
14
|
+
return nil if cover.nil?
|
15
|
+
return cover.contextify
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'epubber/models/endnotes'
|
2
2
|
|
3
|
-
module Epubber::Models
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
module Epubber::Models
|
4
|
+
module Concerns
|
5
|
+
module HasEndnotes
|
6
|
+
def endnotes
|
7
|
+
@endnotes ||= nil
|
8
|
+
return @endnotes unless block_given?
|
9
|
+
@endnotes = Epubber::Models::Endnotes.new
|
10
|
+
yield @endnotes
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
def contextified_endnotes
|
14
|
+
return nil if endnotes.nil?
|
15
|
+
return endnotes.contextify
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'epubber/models/introduction'
|
2
2
|
|
3
|
-
module Epubber::Models
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
module Epubber::Models
|
4
|
+
module Concerns
|
5
|
+
module HasIntroduction
|
6
|
+
def introduction(&block)
|
7
|
+
@introduction ||= nil
|
8
|
+
return @introduction unless block_given?
|
9
|
+
@introduction = Epubber::Models::Introduction.new
|
10
|
+
yield @introduction
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
def contextified_introduction
|
14
|
+
return nil if introduction.nil?
|
15
|
+
return introduction.contextify
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Represents a book's introduction
|
2
|
+
module Epubber::Models
|
3
|
+
class Cover
|
4
|
+
def initialize
|
5
|
+
@file = nil
|
6
|
+
end
|
7
|
+
|
8
|
+
def file(image = nil)
|
9
|
+
if image
|
10
|
+
@file = image
|
11
|
+
else
|
12
|
+
@file
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def filename
|
17
|
+
File.basename(@file.path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_mime
|
21
|
+
if /(?:jpg|jpeg)/ =~ filename
|
22
|
+
'image/jpeg'
|
23
|
+
elsif /(?:png)/ =~ filename
|
24
|
+
'image/png'
|
25
|
+
else
|
26
|
+
raise 'Invalid file type: Only JPG and PNG images are allowed.'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def contextify
|
31
|
+
{ 'filename' => filename, 'file' => file, 'file_mime' => file_mime }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
require 'epubber/models/
|
1
|
+
require 'epubber/models/concerns/has_html'
|
2
2
|
|
3
3
|
# Represents a book's introduction
|
4
4
|
module Epubber::Models
|
5
|
-
class Endnotes
|
5
|
+
class Endnotes
|
6
|
+
include Epubber::Models::Concerns::HasHTML
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@content = '<p>Not specified</p>'
|
8
10
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
require 'epubber/models/
|
1
|
+
require 'epubber/models/concerns/has_html'
|
2
2
|
|
3
3
|
# Represents a book's introduction
|
4
4
|
module Epubber::Models
|
5
|
-
class Introduction
|
5
|
+
class Introduction
|
6
|
+
include Epubber::Models::Concerns::HasHTML
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@content = '<p>Not specified</p>'
|
8
10
|
end
|
@@ -20,7 +20,11 @@ module Epubber::Services
|
|
20
20
|
protected
|
21
21
|
|
22
22
|
def write(file, content)
|
23
|
-
|
23
|
+
if content.is_a?(File)
|
24
|
+
FileUtils.cp content.path, File.dirname(path(file))
|
25
|
+
else
|
26
|
+
File.write path(file), content
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
def create_path_for(file)
|
data/lib/epubber/version.rb
CHANGED
@@ -49,7 +49,7 @@
|
|
49
49
|
<!-- Language code: http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes -->
|
50
50
|
<dc:language>{{ book.language }}</dc:language>
|
51
51
|
|
52
|
-
<meta name="cover" content="
|
52
|
+
<meta name="cover" content="{{ book.cover.filename }}" />
|
53
53
|
|
54
54
|
<!-- UUID generator: http://www.famkruithof.net/uuid/uuidgen -->
|
55
55
|
<dc:identifier opf:scheme="UUID">urn:uuid:{{ book.uuid }}</dc:identifier>
|
@@ -64,10 +64,10 @@
|
|
64
64
|
-->
|
65
65
|
|
66
66
|
<manifest>
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
{% if book.cover %}
|
68
|
+
<item href="Images/{{ book.cover.filename }}" id="{{ book.cover.filename }}" media-type="{{ book.cover.file_mime }}" />
|
69
|
+
<item href="Text/cover.xhtml" id="cover" media-type="application/xhtml+xml" />
|
70
|
+
{% endif %}
|
71
71
|
<item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml" />
|
72
72
|
<item href="Styles/style.css" id="css" media-type="text/css" />
|
73
73
|
<!--
|
@@ -115,8 +115,10 @@
|
|
115
115
|
|
116
116
|
-->
|
117
117
|
<spine toc="ncx">
|
118
|
+
{% if book.cover %}
|
119
|
+
<itemref idref="cover" />
|
120
|
+
{% endif %}
|
118
121
|
<!--
|
119
|
-
<itemref idref="cover" />
|
120
122
|
<itemref idref="frontmatter" />
|
121
123
|
-->
|
122
124
|
<itemref idref="toc" />
|
@@ -152,9 +154,9 @@
|
|
152
154
|
|
153
155
|
-->
|
154
156
|
<guide>
|
155
|
-
|
156
|
-
|
157
|
-
|
157
|
+
{% if book.cover %}
|
158
|
+
<reference href="Text/cover.xhtml" title="Cover" type="cover" />
|
159
|
+
{% endif %}
|
158
160
|
<reference href="Text/toc.xhtml" title="Table of Contents" type="toc" />
|
159
161
|
<!--
|
160
162
|
<reference href="Text/frontmatter.xhtml" type="copyright-page" />
|
data/lib/templates/OEBPS/toc.ncx
CHANGED
@@ -13,13 +13,16 @@
|
|
13
13
|
<text>{{ book.title }}</text>
|
14
14
|
</docTitle>
|
15
15
|
<navMap>
|
16
|
+
{% if book.cover %}
|
17
|
+
<navPoint id="navpoint-cover">
|
18
|
+
<navLabel>
|
19
|
+
<text>Cover</text>
|
20
|
+
</navLabel>
|
21
|
+
<content src="Text/cover.xhtml" />
|
22
|
+
</navPoint>
|
23
|
+
{% endif %}
|
24
|
+
|
16
25
|
<!--
|
17
|
-
<navPoint id="navpoint-cover">
|
18
|
-
<navLabel>
|
19
|
-
<text>Cover</text>
|
20
|
-
</navLabel>
|
21
|
-
<content src="Text/cover.xhtml" />
|
22
|
-
</navPoint>
|
23
26
|
<navPoint id="navpoint-frontmatter">
|
24
27
|
<navLabel>
|
25
28
|
<text>Front Matter</text>
|
Binary file
|
data/test/test_epubber.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
+
require 'pry-byebug'
|
2
3
|
require 'epubber'
|
3
4
|
|
4
5
|
class EpubberTest < Minitest::Test
|
@@ -7,6 +8,10 @@ class EpubberTest < Minitest::Test
|
|
7
8
|
b.title 'My First EPUB book'
|
8
9
|
b.author 'Ramirez, Federico'
|
9
10
|
|
11
|
+
b.cover do |c|
|
12
|
+
c.file File.new("#{File.dirname(__FILE__)}/assets/test-cover.png")
|
13
|
+
end
|
14
|
+
|
10
15
|
b.introduction do |i|
|
11
16
|
i.content "<p>This is the introduction, and it's optional. What is this book about?</p>"
|
12
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epubber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Federico Ramirez
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: liquid
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,6 +125,7 @@ files:
|
|
111
125
|
- lib/epubber/generator.rb
|
112
126
|
- lib/epubber/generators/chapters.rb
|
113
127
|
- lib/epubber/generators/content.rb
|
128
|
+
- lib/epubber/generators/cover.rb
|
114
129
|
- lib/epubber/generators/endnotes.rb
|
115
130
|
- lib/epubber/generators/generator.rb
|
116
131
|
- lib/epubber/generators/introduction.rb
|
@@ -119,11 +134,13 @@ files:
|
|
119
134
|
- lib/epubber/models/book.rb
|
120
135
|
- lib/epubber/models/chapter.rb
|
121
136
|
- lib/epubber/models/concerns/has_chapters.rb
|
137
|
+
- lib/epubber/models/concerns/has_cover.rb
|
122
138
|
- lib/epubber/models/concerns/has_endnotes.rb
|
139
|
+
- lib/epubber/models/concerns/has_html.rb
|
123
140
|
- lib/epubber/models/concerns/has_introduction.rb
|
141
|
+
- lib/epubber/models/cover.rb
|
124
142
|
- lib/epubber/models/endnotes.rb
|
125
143
|
- lib/epubber/models/introduction.rb
|
126
|
-
- lib/epubber/models/model.rb
|
127
144
|
- lib/epubber/services/compressor.rb
|
128
145
|
- lib/epubber/services/persistance.rb
|
129
146
|
- lib/epubber/services/template.rb
|
@@ -143,6 +160,7 @@ files:
|
|
143
160
|
- lib/templates/OEBPS/content.opf
|
144
161
|
- lib/templates/OEBPS/toc.ncx
|
145
162
|
- lib/templates/mimetype
|
163
|
+
- test/assets/test-cover.png
|
146
164
|
- test/test_epubber.rb
|
147
165
|
homepage: https://github.com/gosukiwi/epubber
|
148
166
|
licenses:
|
@@ -169,4 +187,5 @@ signing_key:
|
|
169
187
|
specification_version: 4
|
170
188
|
summary: Generate EPUB files programatically
|
171
189
|
test_files:
|
190
|
+
- test/assets/test-cover.png
|
172
191
|
- test/test_epubber.rb
|
data/lib/epubber/models/model.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
|
-
module Epubber::Models
|
4
|
-
class Model
|
5
|
-
# Because the EPUB format always uses XHTML, let's make sure things like
|
6
|
-
# `<br>` gets transformed to `<br />`.
|
7
|
-
def clean_html(html)
|
8
|
-
Nokogiri::HTML::DocumentFragment.parse(html).to_xhtml
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|