rpub 0.3.0 → 0.4.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.
- data/.rspec +1 -0
- data/.yardopts +2 -0
- data/Gemfile.lock +28 -20
- data/HISTORY.md +6 -0
- data/README.md +99 -13
- data/lib/rpub/chapter.rb +5 -0
- data/lib/rpub/epub/content.rb +7 -2
- data/lib/rpub/epub/toc.rb +34 -10
- data/lib/rpub/version.rb +1 -1
- data/spec/rpub/epub/content_spec.rb +1 -0
- data/spec/rpub/epub/toc_spec.rb +20 -5
- data/support/config.yml +1 -0
- metadata +5 -5
data/.rspec
CHANGED
data/.yardopts
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rpub (0.
|
4
|
+
rpub (0.4.0)
|
5
5
|
builder
|
6
6
|
kramdown
|
7
7
|
nokogiri
|
@@ -17,35 +17,43 @@ GEM
|
|
17
17
|
diff-lcs (1.1.3)
|
18
18
|
ffi (1.0.11)
|
19
19
|
growl (1.0.3)
|
20
|
-
guard (1.
|
21
|
-
|
22
|
-
thor (
|
23
|
-
guard-rspec (0.
|
24
|
-
guard (>=
|
25
|
-
kramdown (0.13.
|
26
|
-
|
27
|
-
|
20
|
+
guard (1.1.1)
|
21
|
+
listen (>= 0.4.2)
|
22
|
+
thor (>= 0.14.6)
|
23
|
+
guard-rspec (1.0.0)
|
24
|
+
guard (>= 1.1)
|
25
|
+
kramdown (0.13.7)
|
26
|
+
listen (0.4.3)
|
27
|
+
rb-fchange (~> 0.0.5)
|
28
|
+
rb-fsevent (~> 0.9.1)
|
29
|
+
rb-inotify (~> 0.8.8)
|
30
|
+
multi_json (1.3.6)
|
31
|
+
nokogiri (1.5.3)
|
28
32
|
rake (0.9.2.2)
|
33
|
+
rb-fchange (0.0.5)
|
34
|
+
ffi
|
29
35
|
rb-fsevent (0.9.1)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
rspec-
|
34
|
-
|
35
|
-
|
36
|
+
rb-inotify (0.8.8)
|
37
|
+
ffi (>= 0.5.0)
|
38
|
+
rspec (2.10.0)
|
39
|
+
rspec-core (~> 2.10.0)
|
40
|
+
rspec-expectations (~> 2.10.0)
|
41
|
+
rspec-mocks (~> 2.10.0)
|
42
|
+
rspec-core (2.10.1)
|
43
|
+
rspec-expectations (2.10.0)
|
36
44
|
diff-lcs (~> 1.1.3)
|
37
|
-
rspec-mocks (2.
|
45
|
+
rspec-mocks (2.10.1)
|
38
46
|
rubypants (0.2.0)
|
39
47
|
rubyzip (0.9.8)
|
40
|
-
simplecov (0.6.
|
41
|
-
multi_json (~> 1.
|
48
|
+
simplecov (0.6.4)
|
49
|
+
multi_json (~> 1.0)
|
42
50
|
simplecov-html (~> 0.5.3)
|
43
51
|
simplecov-html (0.5.3)
|
44
52
|
textstats (0.0.2)
|
45
|
-
thor (0.
|
53
|
+
thor (0.15.2)
|
46
54
|
typogruby (1.0.15)
|
47
55
|
rubypants
|
48
|
-
yard (0.
|
56
|
+
yard (0.8.2)
|
49
57
|
|
50
58
|
PLATFORMS
|
51
59
|
ruby
|
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Rpub -- an ePub generator in Ruby [](http://travis-ci.org/avdgaag/rpub)
|
1
|
+
# Rpub -- an ePub generator in Ruby [](http://travis-ci.org/avdgaag/rpub) [](https://gemnasium.com/avdgaag/rpub)
|
2
2
|
|
3
3
|
## Introduction
|
4
4
|
|
@@ -10,6 +10,7 @@ make working with ePub files a little easier:
|
|
10
10
|
* Packaging your eBook in an archive with additional README file
|
11
11
|
* Embedding fonts
|
12
12
|
* Easy previewing as you write
|
13
|
+
* .mobi compatibility
|
13
14
|
|
14
15
|
## Installation
|
15
16
|
|
@@ -53,7 +54,8 @@ in a special configuration file called `config.yml`:
|
|
53
54
|
title: My new book
|
54
55
|
version: 0.1.0
|
55
56
|
|
56
|
-
This file is written in [YAML](http://yaml.org) and sets basic properties of
|
57
|
+
This file is written in [YAML](http://yaml.org) and sets basic properties of
|
58
|
+
your book project.
|
57
59
|
|
58
60
|
Since regenerating your ePub file and opening it in a suitable reader
|
59
61
|
application is cumbersome, Rpub can generate a simple preview document for you:
|
@@ -67,6 +69,24 @@ easy viewing in any browser.
|
|
67
69
|
[Markdown]: http://daringfireball.net/projects/markdown
|
68
70
|
[John gruber]: http://daringfireball.net
|
69
71
|
|
72
|
+
### Generating a .mobi file
|
73
|
+
|
74
|
+
Since the ePub and Mobipocket file formats are very (_very_) similar it is
|
75
|
+
quite easy to create a `.mobi` version of your book, suitable for reading on
|
76
|
+
Amazon's Kindle. To do so, you will need to install the [kindlegen program
|
77
|
+
Amazon provides][kindlegen].
|
78
|
+
|
79
|
+
Here's how it works:
|
80
|
+
|
81
|
+
1. Install `kindlegen` ([download it here][kindlegen])
|
82
|
+
2. Compile your book as usual using `rpub compile`
|
83
|
+
3. Compile `my-book.epub` to `my-book.mobi`: `kindlegen my-book.epub`.
|
84
|
+
|
85
|
+
Optionally, include your `my-book.mobi` in your package by adding it to your
|
86
|
+
list of packaged files (see "Packaging for distribution").
|
87
|
+
|
88
|
+
[kindlegen]: http://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211
|
89
|
+
|
70
90
|
### Advanced features
|
71
91
|
|
72
92
|
#### Packaging for distribution
|
@@ -104,6 +124,15 @@ configuration to your `config.yml` file:
|
|
104
124
|
|
105
125
|
toc: true
|
106
126
|
|
127
|
+
Note that this only affects the human-readable table of contents, represented
|
128
|
+
as a page in your book. Rpub will alway generate the .epub table of contents
|
129
|
+
for you, which contains the machine-readable references to your chapters. It
|
130
|
+
will, by default, reference all chapter titles and subheadings for you, but
|
131
|
+
you can customize the number of levels that will be included using the
|
132
|
+
following in your `config.yml` file:
|
133
|
+
|
134
|
+
max_level: 3
|
135
|
+
|
107
136
|
#### Custom layout and styles
|
108
137
|
|
109
138
|
When you compile a set of Markdown files to an ePub file, rpub uses a default
|
@@ -113,15 +142,22 @@ inclined.
|
|
113
142
|
|
114
143
|
Simply define a `layout.html` and/or `styles.css` in your project directory.
|
115
144
|
Your HTML file will be parsed with Erb, an so you can include your writing
|
116
|
-
using the `
|
145
|
+
using the `@body` instance variable:
|
117
146
|
|
118
147
|
<html>
|
119
148
|
<body>
|
120
|
-
<%=
|
149
|
+
<%= @body %>
|
121
150
|
</body>
|
122
151
|
</html>
|
123
152
|
|
124
|
-
**Note**:
|
153
|
+
**Note 1**: this feature is actually provided by the [Kramdown gem][kramdown],
|
154
|
+
so have a look at [the standard Kramdown document template][doc] to see some
|
155
|
+
nifty tricks.
|
156
|
+
|
157
|
+
[kramdown]: http://kramdown.rubyforge.org
|
158
|
+
[doc]: https://github.com/gettalong/kramdown/blob/master/data/kramdown/document.html
|
159
|
+
|
160
|
+
**Note 2**: despite the name 'html' and `.html` extension, your file actually has
|
125
161
|
to be XHTML-compliant.
|
126
162
|
|
127
163
|
You can also provide custom layouts or styles to use when invoking the `compile`
|
@@ -136,16 +172,66 @@ those files into your project using the `generate` subcommand:
|
|
136
172
|
|
137
173
|
### Command reference
|
138
174
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
175
|
+
`rpub compile`
|
176
|
+
: generate .epub file
|
177
|
+
|
178
|
+
`rpub package`
|
179
|
+
: create zip file with compiled book and other listed files
|
180
|
+
|
181
|
+
`rpub preview`
|
182
|
+
: generate preview HTML file
|
183
|
+
|
184
|
+
`rpub generate`
|
185
|
+
: copy default layout.html, styles.css and config.yml
|
186
|
+
|
187
|
+
`rpub help`
|
188
|
+
: get help on subcommands
|
189
|
+
|
190
|
+
`rpub clean`
|
191
|
+
: remove generated files
|
192
|
+
|
193
|
+
### Configuration reference
|
194
|
+
|
195
|
+
`title`
|
196
|
+
: the book title (string)
|
197
|
+
|
198
|
+
`descrption`
|
199
|
+
: one-line summary of the book (string)
|
200
|
+
|
201
|
+
`creator`
|
202
|
+
: author name (string)
|
203
|
+
|
204
|
+
`publisher`
|
205
|
+
: publisher name (string)
|
206
|
+
|
207
|
+
`subject`
|
208
|
+
: book subject/category (string)
|
209
|
+
|
210
|
+
`language`
|
211
|
+
: language code of the book contents, e.g. 'en' (string)
|
212
|
+
|
213
|
+
`rights`
|
214
|
+
: copyright line (string)
|
215
|
+
|
216
|
+
`version`
|
217
|
+
: version number of the book to include in the .epub filename (string)
|
218
|
+
|
219
|
+
`toc`
|
220
|
+
: whether to generate a table of contents as book page (boolean, default false)
|
221
|
+
|
222
|
+
`max_level`
|
223
|
+
: the maximum depth of the .epub table of contents (number, default 2)
|
224
|
+
|
225
|
+
`ignore`
|
226
|
+
: list of files not to include in the epub, that otherwise would (array)
|
227
|
+
|
228
|
+
`package`
|
229
|
+
: list of files to be included in the archive created by the package task (array)
|
230
|
+
|
145
231
|
|
146
232
|
### Examples
|
147
233
|
|
148
|
-
See the [examples directory](https://github.com/avdgaag/rpub/example) for two example projects.
|
234
|
+
See the [examples directory](https://github.com/avdgaag/rpub/tree/master/example) for two example projects.
|
149
235
|
|
150
236
|
### Documentation
|
151
237
|
|
@@ -171,7 +257,7 @@ tracker](https://github.com/avdgaag/rpub/issues).
|
|
171
257
|
|
172
258
|
### What has changed?
|
173
259
|
|
174
|
-
See the [HISTORY](https://github.com/avdgaag/rpub/HISTORY) file for a detailed changelog.
|
260
|
+
See the [HISTORY](https://github.com/avdgaag/rpub/blob/master/HISTORY.md) file for a detailed changelog.
|
175
261
|
|
176
262
|
### Credits
|
177
263
|
|
data/lib/rpub/chapter.rb
CHANGED
@@ -17,6 +17,11 @@ module Rpub
|
|
17
17
|
@content, @number, @layout = content, number, layout
|
18
18
|
@document = Kramdown::Document.new(content, KRAMDOWN_OPTIONS.merge(:template => layout))
|
19
19
|
end
|
20
|
+
|
21
|
+
# @return [Kramdown::Element] Toc elements hierarchy
|
22
|
+
def toc
|
23
|
+
Kramdown::Converter::Toc.convert(@document.root).first
|
24
|
+
end
|
20
25
|
|
21
26
|
# @return [String] Unique identifier for this chapter.
|
22
27
|
def uid
|
data/lib/rpub/epub/content.rb
CHANGED
@@ -71,9 +71,14 @@ module Rpub
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
if book.has_cover?
|
74
|
+
if book.has_cover? || book.has_toc?
|
75
75
|
xml.guide do
|
76
|
-
|
76
|
+
if book.has_cover?
|
77
|
+
xml.reference :type => 'cover', :title => 'Cover', :href => 'cover.html'
|
78
|
+
end
|
79
|
+
if book.has_toc?
|
80
|
+
xml.reference :type => 'toc', :title => 'Table of Contents', :href => 'toc.html'
|
81
|
+
end
|
77
82
|
end
|
78
83
|
end
|
79
84
|
end
|
data/lib/rpub/epub/toc.rb
CHANGED
@@ -4,7 +4,9 @@ module Rpub
|
|
4
4
|
attr_reader :book
|
5
5
|
|
6
6
|
def initialize(book)
|
7
|
-
@book
|
7
|
+
@book = book
|
8
|
+
@play_order = -1
|
9
|
+
@max_level = book.config.fetch(:max_level) { 2 }
|
8
10
|
super()
|
9
11
|
end
|
10
12
|
|
@@ -13,23 +15,45 @@ module Rpub
|
|
13
15
|
xml.declare! :DOCTYPE, :ncx, :PUBLIC, "-//W3C//DTD XHTML 1.1//EN", 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
|
14
16
|
xml.ncx :xmlns => 'http://www.daisy.org/z3986/2005/ncx/', :version => '2005-1' do
|
15
17
|
xml.head do
|
16
|
-
xml.meta :name => 'dtb:uid',
|
17
|
-
xml.meta :name => 'dtb:depth',
|
18
|
+
xml.meta :name => 'dtb:uid', :content => book.uid
|
19
|
+
xml.meta :name => 'dtb:depth', :content => @max_level
|
18
20
|
xml.meta :name => 'dtb:totalPageCount', :content => '0'
|
19
|
-
xml.meta :name => 'dtb:maxPageNumber',
|
21
|
+
xml.meta :name => 'dtb:maxPageNumber', :content => '0'
|
20
22
|
end
|
21
23
|
xml.docTitle { xml.text book.title }
|
22
24
|
xml.navMap do
|
23
|
-
book.chapters.
|
24
|
-
|
25
|
-
xml.navLabel { xml.text chapter.title }
|
26
|
-
xml.content :src => chapter.filename
|
27
|
-
end
|
25
|
+
book.chapters.each do |chapter|
|
26
|
+
nav_points_nested_by_level chapter.toc, chapter.filename
|
28
27
|
end
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def next_play_order
|
35
|
+
@play_order += 1
|
36
|
+
end
|
37
|
+
|
38
|
+
def nav_points_nested_by_level(heading, filename, level = 1)
|
39
|
+
heading.children.each do |heading|
|
40
|
+
html_id = heading.attr[:id]
|
41
|
+
source = filename+'#'+html_id
|
42
|
+
if heading.value.options[:level] <= @max_level
|
43
|
+
nav_point html_id, next_play_order, heading.value.options[:raw_text], source do
|
44
|
+
nav_points_nested_by_level heading, filename, level + 1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def nav_point(id, play_order, text, filename)
|
51
|
+
xml.navPoint :id => id, :playOrder => play_order do
|
52
|
+
xml.navLabel { xml.text text }
|
53
|
+
xml.content :src => filename
|
54
|
+
yield if block_given?
|
55
|
+
end
|
56
|
+
end
|
32
57
|
end
|
33
58
|
end
|
34
59
|
end
|
35
|
-
|
data/lib/rpub/version.rb
CHANGED
@@ -58,6 +58,7 @@ describe Rpub::Epub::Content do
|
|
58
58
|
context 'when the book has a ToC' do
|
59
59
|
before { book.stub! :has_toc? => true }
|
60
60
|
it { should have_xpath('/xmlns:package/xmlns:manifest/xmlns:item[@id="toc"][@href="toc.html"][@media-type="application/xhtml+xml"]') }
|
61
|
+
it { should have_xpath('/xmlns:package/xmlns:guide/xmlns:reference[@type="toc"][@title="Table of Contents"][@href="toc.html"]') }
|
61
62
|
end
|
62
63
|
|
63
64
|
context 'when the book has images' do
|
data/spec/rpub/epub/toc_spec.rb
CHANGED
@@ -2,12 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Rpub::Epub::Toc do
|
4
4
|
let(:chapters) { [] }
|
5
|
-
let(:
|
5
|
+
let(:config) { {} }
|
6
|
+
let(:book) { double('book', :uid => 'foo', :title => 'title', :chapters => chapters, :config => config) }
|
6
7
|
let(:subject) { described_class.new(book).render }
|
7
8
|
|
8
9
|
it { should have_xpath('/xmlns:ncx') }
|
9
10
|
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:uid"][@content="foo"]') }
|
10
|
-
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:depth"][@content="
|
11
|
+
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:depth"][@content="2"]') }
|
11
12
|
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:totalPageCount"][@content="0"]') }
|
12
13
|
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:maxPageNumber"][@content="0"]') }
|
13
14
|
it { should have_xpath('/xmlns:ncx/xmlns:docTitle/xmlns:text[text()="title"]') }
|
@@ -17,9 +18,23 @@ describe Rpub::Epub::Toc do
|
|
17
18
|
end
|
18
19
|
|
19
20
|
context 'with chapters' do
|
20
|
-
let(:
|
21
|
-
|
21
|
+
let(:heading1) { double('heading', :children => [heading2], :value => double('value', :options => { :level => 1, :raw_text => 'chapter title' }), :attr => { :id => 'foo' }) }
|
22
|
+
let(:heading2) { double('heading', :children => [], :value => double('value', :options => { :level => 2, :raw_text => 'chapter title 2' }), :attr => { :id => 'bar' }) }
|
23
|
+
let(:toc) { double('toc', :children => [heading1])}
|
24
|
+
let(:chapters) { [double('chapter', :title => 'chapter title', :filename => 'filename', :xml_id => 'id', :toc => toc)] }
|
25
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint[@id="foo"]') }
|
22
26
|
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title"]') }
|
23
|
-
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:content[@src="filename"]') }
|
27
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:content[@src="filename#foo"]') }
|
28
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint[@id="bar"]') }
|
29
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title 2"]') }
|
30
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:content[@src="filename#bar"]') }
|
31
|
+
|
32
|
+
context 'with low max_level' do
|
33
|
+
let(:config) { { :max_level => 1 } }
|
34
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint[@id="foo"]') }
|
35
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title"]') }
|
36
|
+
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:content[@src="filename#foo"]') }
|
37
|
+
it { should_not have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint') }
|
38
|
+
end
|
24
39
|
end
|
25
40
|
end
|
data/support/config.yml
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typogruby
|
@@ -349,7 +349,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
349
349
|
version: '0'
|
350
350
|
segments:
|
351
351
|
- 0
|
352
|
-
hash:
|
352
|
+
hash: 2837060171432617966
|
353
353
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
354
354
|
none: false
|
355
355
|
requirements:
|
@@ -358,10 +358,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
358
358
|
version: '0'
|
359
359
|
segments:
|
360
360
|
- 0
|
361
|
-
hash:
|
361
|
+
hash: 2837060171432617966
|
362
362
|
requirements: []
|
363
363
|
rubyforge_project:
|
364
|
-
rubygems_version: 1.8.
|
364
|
+
rubygems_version: 1.8.24
|
365
365
|
signing_key:
|
366
366
|
specification_version: 3
|
367
367
|
summary: ! 'rPub is a command-line tool that generates a collection of plain text
|