kindler 0.2.1 → 0.3.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.
- checksums.yaml +7 -0
- data/Gemfile +0 -6
- data/Readme.md +5 -3
- data/lib/kindler/version.rb +1 -1
- data/lib/kindler.rb +36 -163
- data/lib/templates/book.ncx.erb +54 -0
- data/lib/templates/book.opf.erb +37 -0
- data/lib/templates/book.toc.erb +15 -0
- data/lib/templates/page.html.erb +13 -0
- data/spec/cases/generator_spec.rb +8 -15
- data/spec/cases/simple_book_spec.rb +23 -0
- data/spec/cases/title_space_spec.rb +17 -0
- metadata +22 -14
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 54b86a48ecb6126e28883da0626a65d822ecc303
|
4
|
+
data.tar.gz: 97904a93c1a6cf8e9a66f5d2146ed20aede7eb2b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4a25d4827e83efe983235188582b419ede58e065a5a82d0764f2a1acd623b4cd082b2a366895071ccd35f3dcba9e28d55600c63f47acf85374642b2835689e53
|
7
|
+
data.tar.gz: 55bfc5fa474e9f1c2dfbf720bf1fab88deb83334be3249d1caf86e6716132633ccfae1859f971af650d8872988744d78aee5cd225121dc5d11203cc186eec78a
|
data/Gemfile
CHANGED
data/Readme.md
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
## Todo
|
2
2
|
* support inner reference, inner link can take to that article
|
3
|
+
* refactor templates
|
4
|
+
* fix image download
|
3
5
|
|
4
6
|
## Is this gem is what you want?
|
5
|
-
There is a alternative gem called [kindlerb](https://github.com/danchoi/kindlerb) can generate mobi books, the gem is also used
|
7
|
+
There is a alternative gem called [kindlerb](https://github.com/danchoi/kindlerb) can generate mobi books, the gem is also used
|
6
8
|
for the website [KindleFeeder](http://kindlefeeder.com/) which is build by [Daniel Choi](http://danielchoi.com/software).
|
7
9
|
|
8
|
-
If you like to generate mobi book by some html files, you have to conform to the structure which author provide. But if you just
|
10
|
+
If you like to generate mobi book by some html files, you have to conform to the structure which author provide. But if you just
|
9
11
|
want to generate mobi book in the fly, then you should try this gem.
|
10
12
|
|
11
13
|
BTW, we share the same internal way to generating mobi book by [KindleGen 2](http://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000234621).
|
@@ -50,7 +52,7 @@ book.add_article {
|
|
50
52
|
:content => '<img src="http://media2.glamour-sales.com.cn/media/catalog/category/Stroili_banner_02.jpg"></img>this is the page 3',
|
51
53
|
:section => 'hate' }
|
52
54
|
# you will get my_first_mobi_book.mobi file
|
53
|
-
book.generate
|
55
|
+
book.generate
|
54
56
|
|
55
57
|
#or you can just generate simple mobi book
|
56
58
|
book.mobi_type = :flat
|
data/lib/kindler/version.rb
CHANGED
data/lib/kindler.rb
CHANGED
@@ -3,6 +3,9 @@ require 'rubygems'
|
|
3
3
|
require "open-uri"
|
4
4
|
require "nokogiri"
|
5
5
|
require "cgi"
|
6
|
+
require "erb"
|
7
|
+
require "shellwords"
|
8
|
+
require "fileutils"
|
6
9
|
# require 'mini_magick'
|
7
10
|
require_relative 'kindler/railtie' if defined?(Rails)
|
8
11
|
require_relative "kindler/version"
|
@@ -11,7 +14,7 @@ module Kindler
|
|
11
14
|
class Book
|
12
15
|
class KindlerError < StandardError;end
|
13
16
|
|
14
|
-
attr_accessor :title,:author,:pages,:pages_by_section,:local_images,:mobi_type
|
17
|
+
attr_accessor :title,:author,:pages,:pages_by_section,:local_images,:mobi_type,:style
|
15
18
|
|
16
19
|
TMP_DIR_PREFIX = '__km_'
|
17
20
|
DEFAULT_SECTION = "All Pages"
|
@@ -30,9 +33,11 @@ module Kindler
|
|
30
33
|
@title = options[:title] || ''
|
31
34
|
@author = options[:author] || 'unknown'
|
32
35
|
@mobi_type = options[:mobi_type] || :magzine
|
36
|
+
@cover = options[:cover] || ""
|
33
37
|
@pages = []
|
34
38
|
@local_images = []
|
35
39
|
@pages_by_section = {}
|
40
|
+
@style = options[:style] || ''
|
36
41
|
raise KindlerError.new("must provide the book title ") unless title
|
37
42
|
end
|
38
43
|
|
@@ -46,6 +51,7 @@ module Kindler
|
|
46
51
|
page[:author] = 'unknown' if (page[:author]==nil or page[:author]=='')
|
47
52
|
# escape special chars
|
48
53
|
page[:title] = CGI::escapeHTML(page[:title])
|
54
|
+
page[:title] = title if(page[:title] == "")
|
49
55
|
page[:author] = CGI::escapeHTML(page[:author])
|
50
56
|
pages << page
|
51
57
|
debug pages
|
@@ -66,6 +72,7 @@ module Kindler
|
|
66
72
|
generate_opf
|
67
73
|
generate_ncx
|
68
74
|
write_to_disk
|
75
|
+
prepare_conver_img
|
69
76
|
kindlegen
|
70
77
|
end
|
71
78
|
|
@@ -87,7 +94,7 @@ module Kindler
|
|
87
94
|
end
|
88
95
|
|
89
96
|
def book_path
|
90
|
-
"#{tmp_dir}/#{
|
97
|
+
"#{tmp_dir}/#{title}.mobi"
|
91
98
|
end
|
92
99
|
|
93
100
|
private
|
@@ -95,125 +102,21 @@ module Kindler
|
|
95
102
|
# you can use "sudo brew install " to install it
|
96
103
|
def kindlegen
|
97
104
|
debug 'begin generate mobi'
|
98
|
-
|
105
|
+
cmd = "kindleGen #{Shellwords.escape(tmp_dir)}/#{Shellwords.escape(title)}.opf "
|
106
|
+
system(cmd)
|
99
107
|
end
|
100
108
|
|
101
109
|
# generate contents.html
|
102
110
|
def generate_toc
|
103
|
-
|
104
|
-
|
105
|
-
<head>
|
106
|
-
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
|
107
|
-
<title>Table of Contents</title>
|
108
|
-
</head>
|
109
|
-
<body>
|
110
|
-
<h1>Contents</h1>
|
111
|
-
<h4>Main section</h4>
|
112
|
-
<ul>
|
113
|
-
CODE
|
114
|
-
files_count = 1
|
115
|
-
pages.each do |page|
|
116
|
-
contents << "<li><a href='#{files_count.to_s.rjust(3,'0')}.html'>#{page[:title]}</a></li>"
|
117
|
-
files_count += 1
|
118
|
-
end
|
119
|
-
# append footer
|
120
|
-
contents << "</ul></body></html>"
|
121
|
-
|
122
|
-
@toc = contents
|
111
|
+
template = ERB.new(open(File.join(File.dirname(__FILE__),"templates/book.toc.erb")).read)
|
112
|
+
@toc = template.result(binding)
|
123
113
|
end
|
124
114
|
|
125
115
|
# generate ncx , which is navigation
|
126
116
|
def generate_ncx
|
127
|
-
contents = <<-NCX
|
128
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
129
|
-
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
|
130
|
-
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en-US">
|
131
|
-
<head>
|
132
|
-
<meta name="dtb:uid" content="#{title}"/>
|
133
|
-
<meta name="dtb:depth" content="1"/>
|
134
|
-
<meta name="dtb:totalPageCount" content="0"/>
|
135
|
-
<meta name="dtb:maxPageNumber" content="0"/>
|
136
|
-
</head>
|
137
|
-
<docTitle>
|
138
|
-
<text>#{title}</text>
|
139
|
-
</docTitle>
|
140
|
-
<docAuthor>
|
141
|
-
<text>#{author}</text>
|
142
|
-
</docAuthor>
|
143
|
-
<navMap>
|
144
|
-
NCX
|
145
|
-
contents << (magzine? ? magzine_ncx : flat_ncx)
|
146
|
-
contents << "</navMap></ncx>"
|
147
|
-
@ncx = contents
|
148
|
-
end
|
149
|
-
|
150
|
-
def flat_ncx
|
151
|
-
contents = ''
|
152
|
-
files_count = 2
|
153
|
-
pages.each do |page|
|
154
|
-
nav_point = <<-NAV
|
155
|
-
<navPoint id="navpoint-#{files_count}" playOrder="#{files_count}">
|
156
|
-
<navLabel><text>#{page[:title]}</text></navLabel>
|
157
|
-
<content src="#{(files_count-1).to_s.rjust(3,'0')}.html"/>
|
158
|
-
</navPoint>
|
159
|
-
NAV
|
160
|
-
contents << nav_point
|
161
|
-
files_count += 1
|
162
|
-
end
|
163
|
-
contents
|
164
|
-
end
|
165
|
-
|
166
|
-
def magzine_ncx
|
167
|
-
contents = ''
|
168
|
-
|
169
|
-
contents << <<-MAG
|
170
|
-
<navPoint playOrder="0" class="periodical" id="periodical">
|
171
|
-
<navLabel>
|
172
|
-
<text>Table of Contents</text>
|
173
|
-
</navLabel>
|
174
|
-
<content src="contents.html"/>
|
175
|
-
|
176
|
-
MAG
|
177
|
-
|
178
117
|
play_order = 1
|
179
|
-
|
180
|
-
|
181
|
-
# add section header
|
182
|
-
contents << <<-SECHEADER
|
183
|
-
<navPoint playOrder="#{play_order}" class="section" id="#{section}">
|
184
|
-
<navLabel>
|
185
|
-
<text>#{section}</text>
|
186
|
-
</navLabel>
|
187
|
-
<content src="#{pages.first[:file_name]}"/>
|
188
|
-
SECHEADER
|
189
|
-
|
190
|
-
play_order += 1
|
191
|
-
# add pages nav
|
192
|
-
pages.each do |page|
|
193
|
-
contents << <<-PAGE
|
194
|
-
<navPoint playOrder="#{play_order}" class="article" id="item-#{page[:count].to_s.rjust(3,'0')}">
|
195
|
-
<navLabel>
|
196
|
-
<text>#{page[:title]}</text>
|
197
|
-
</navLabel>
|
198
|
-
<content src="#{page[:file_name]}"/>
|
199
|
-
<mbp:meta name="description">#{page[:title]}</mbp:meta>
|
200
|
-
<mbp:meta name="author">#{page[:author]}</mbp:meta>
|
201
|
-
</navPoint>
|
202
|
-
PAGE
|
203
|
-
play_order += 1
|
204
|
-
end
|
205
|
-
# add section footer
|
206
|
-
contents << "</navPoint>"
|
207
|
-
end
|
208
|
-
contents << "</navPoint>"
|
209
|
-
end
|
210
|
-
|
211
|
-
def magzine_meta
|
212
|
-
<<-META
|
213
|
-
<x-metadata>
|
214
|
-
<output content-type="application/x-mobipocket-subscription-magazine" encoding="utf-8"/>
|
215
|
-
</x-metadata>
|
216
|
-
META
|
118
|
+
template = ERB.new(open(File.join(File.dirname(__FILE__),"templates/book.ncx.erb")).read)
|
119
|
+
@ncx = template.result(binding)
|
217
120
|
end
|
218
121
|
|
219
122
|
def magzine?
|
@@ -222,43 +125,12 @@ module Kindler
|
|
222
125
|
|
223
126
|
# generate the opf, manifest of book,including all articles and images and css
|
224
127
|
def generate_opf
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
<dc:language>en-gb</dc:language>
|
232
|
-
<meta content="cover-image" name="cover"/>
|
233
|
-
<dc:creator>Kindler- 29decibel</dc:creator>
|
234
|
-
<dc:publisher>Kindler- 29decibel</dc:publisher>
|
235
|
-
<dc:subject>News</dc:subject>
|
236
|
-
<dc:identifier id="#{title}">#{title}</dc:identifier>
|
237
|
-
<dc:date>#{Time.now.to_date}</dc:date>
|
238
|
-
<dc:description>Kindler generated book</dc:description>
|
239
|
-
</dc-metadata>
|
240
|
-
#{magzine? ? magzine_meta : ''}
|
241
|
-
</metadata>
|
242
|
-
<manifest>
|
243
|
-
HTML
|
244
|
-
files_count = 1
|
245
|
-
pages.each do |page|
|
246
|
-
doc_id = files_count.to_s.rjust(3,'0')
|
247
|
-
contents << "<item href='#{doc_id}.html' media-type='application/xhtml+xml' id='#{doc_id}'/>"
|
248
|
-
files_count += 1
|
249
|
-
end
|
250
|
-
contents << "<item href='contents.html' media-type='application/xhtml+xml' id='contents'/>"
|
251
|
-
contents << "<item href='nav-contents.ncx' media-type='application/x-dtbncx+xml' id='nav-contents'/>"
|
252
|
-
contents << "</manifest>"
|
253
|
-
contents << "<spine toc='nav-contents'>"
|
254
|
-
contents << "<itemref idref='contents'/>"
|
255
|
-
files_count = 1
|
256
|
-
pages.each do |page|
|
257
|
-
contents << "<itemref idref='#{files_count.to_s.rjust(3,'0')}'/>"
|
258
|
-
files_count += 1
|
259
|
-
end
|
260
|
-
contents << "</spine><guide><reference href='contents.html' type='toc' title='Table of Contents'/></guide></package>"
|
261
|
-
@opf = contents
|
128
|
+
template = ERB.new(open(File.join(File.dirname(__FILE__),"templates/book.opf.erb")).read)
|
129
|
+
@opf = template.result(binding)
|
130
|
+
end
|
131
|
+
|
132
|
+
def meta_info
|
133
|
+
{}
|
262
134
|
end
|
263
135
|
|
264
136
|
def get_image_extname(image_data,url)
|
@@ -306,7 +178,7 @@ module Kindler
|
|
306
178
|
page[:content] = article.inner_html
|
307
179
|
# add to manifest
|
308
180
|
local_images << "#{image_local_address}"
|
309
|
-
images_count += 1
|
181
|
+
images_count += 1
|
310
182
|
rescue Exception => e
|
311
183
|
debug "got error when fetch and save image: #{e}"
|
312
184
|
end
|
@@ -320,23 +192,24 @@ module Kindler
|
|
320
192
|
end
|
321
193
|
|
322
194
|
# wrap readable contents with in html format
|
323
|
-
def html_wrap(
|
324
|
-
|
325
|
-
result
|
326
|
-
result << "<meta content='text/html; charset=utf-8' http-equiv='Content-Type'/>"
|
327
|
-
result << '</head><body>'
|
328
|
-
result << "<h3>#{title}</h3>"
|
329
|
-
result << content
|
330
|
-
result << '</body></html>'
|
195
|
+
def html_wrap(page)
|
196
|
+
template = ERB.new(open(File.join(File.dirname(__FILE__),"templates/page.html.erb")).read)
|
197
|
+
template.result(binding)
|
331
198
|
end
|
332
199
|
|
333
200
|
# the dir path to generated files
|
334
201
|
def tmp_dir
|
335
|
-
File.expand_path (@output_dir == '' ? "#{TMP_DIR_PREFIX}#{
|
202
|
+
File.expand_path (@output_dir == '' ? "#{TMP_DIR_PREFIX}#{title}" : @output_dir)
|
336
203
|
end
|
337
204
|
|
338
|
-
def
|
339
|
-
|
205
|
+
def prepare_conver_img
|
206
|
+
return unless @cover != ""
|
207
|
+
if @cover.start_with?("http")
|
208
|
+
# download conver to conver
|
209
|
+
# TODO find out a elegant way to do this
|
210
|
+
else
|
211
|
+
`cp #{@cover} #{tmp_dir}/` if File.exist?(@cover)
|
212
|
+
end
|
340
213
|
end
|
341
214
|
|
342
215
|
# create dirs of generated files
|
@@ -348,12 +221,12 @@ module Kindler
|
|
348
221
|
def write_to_disk
|
349
222
|
File.open("#{tmp_dir}/nav-contents.ncx",'wb') { |f| f.write @ncx }
|
350
223
|
File.open(file_path('contents.html'),'wb') {|f| f.write @toc }
|
351
|
-
File.open("#{tmp_dir}/#{
|
224
|
+
File.open("#{tmp_dir}/#{title}.opf",'wb') {|f| f.write @opf}
|
352
225
|
# make html files
|
353
226
|
files_count = 1
|
354
227
|
pages.each do |page|
|
355
228
|
File.open(file_path(page[:file_name]),'wb') do |f|
|
356
|
-
content_to_write = page[:wrap] ? html_wrap(page
|
229
|
+
content_to_write = page[:wrap] ? html_wrap(page) : page[:content]
|
357
230
|
debug "here is the page #{page[:title]} need to write"
|
358
231
|
debug content_to_write
|
359
232
|
f.write content_to_write
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
|
3
|
+
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en-US">
|
4
|
+
<head>
|
5
|
+
<meta name="dtb:uid" content="<%= title %>"/>
|
6
|
+
<meta name="dtb:depth" content="1"/>
|
7
|
+
<meta name="dtb:totalPageCount" content="0"/>
|
8
|
+
<meta name="dtb:maxPageNumber" content="0"/>
|
9
|
+
</head>
|
10
|
+
<docTitle>
|
11
|
+
<text><%= title %></text>
|
12
|
+
</docTitle>
|
13
|
+
<docAuthor>
|
14
|
+
<text><%= author %></text>
|
15
|
+
</docAuthor>
|
16
|
+
<navMap>
|
17
|
+
<% if magzine? %>
|
18
|
+
<navPoint playOrder="0" class="periodical" id="periodical">
|
19
|
+
<navLabel>
|
20
|
+
<text>Table of Contents</text>
|
21
|
+
</navLabel>
|
22
|
+
<content src="contents.html"/>
|
23
|
+
|
24
|
+
<% @pages_by_section.each do |section,pages| %>
|
25
|
+
<% next if pages.count==0 %>
|
26
|
+
<navPoint playOrder="<%= play_order %>" class="section" id="<%= section %>">
|
27
|
+
<navLabel>
|
28
|
+
<text><%= section %></text>
|
29
|
+
</navLabel>
|
30
|
+
<content src="<%= pages.first[:file_name] %>"/>
|
31
|
+
<% play_order += 1%>
|
32
|
+
<% pages.each do |page| %>
|
33
|
+
<navPoint playOrder="<%= play_order %>" class="article" id="item-<%= page[:count].to_s.rjust(3,'0') %>">
|
34
|
+
<navLabel>
|
35
|
+
<text><%= page[:title] %></text>
|
36
|
+
</navLabel>
|
37
|
+
<content src="<%= page[:file_name] %>"/>
|
38
|
+
<mbp:meta name="description"><%= page[:title] %></mbp:meta>
|
39
|
+
<mbp:meta name="author"><%= page[:author] %></mbp:meta>
|
40
|
+
</navPoint>
|
41
|
+
<% end %>
|
42
|
+
</navPoint>
|
43
|
+
<% end %>
|
44
|
+
</navPoint>
|
45
|
+
<% else %>
|
46
|
+
<% pages.each_with_index do |page,index| %>
|
47
|
+
<navPoint id="navpoint-<%= index +2 %>" playOrder="<%= index +2 %>">
|
48
|
+
<navLabel><text><%= page[:title] %></text></navLabel>
|
49
|
+
<content src="<%= (index+1).to_s.rjust(3,'0') %>.html"/>
|
50
|
+
</navPoint>
|
51
|
+
<% end %>
|
52
|
+
<% end %>
|
53
|
+
</navMap>
|
54
|
+
</ncx>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8'?>
|
2
|
+
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="#{title}">
|
3
|
+
<metadata>
|
4
|
+
<dc-metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
|
5
|
+
<dc:title><%= title %></dc:title>
|
6
|
+
<dc:language>en-gb</dc:language>
|
7
|
+
<meta content="cover-image" name="cover"/>
|
8
|
+
<dc:creator><%= author %></dc:creator>
|
9
|
+
<dc:publisher><%= author %></dc:publisher>
|
10
|
+
<dc:subject><%= title %></dc:subject>
|
11
|
+
<dc:identifier id="<%= title %>"><%= title %></dc:identifier>
|
12
|
+
<dc:date><%= Time.now.to_date %></dc:date>
|
13
|
+
<dc:description><%= title %></dc:description>
|
14
|
+
</dc-metadata>
|
15
|
+
<% if magzine? %>
|
16
|
+
<x-metadata>
|
17
|
+
<output content-type="application/x-mobipocket-subscription-magazine" encoding="utf-8"/>
|
18
|
+
</x-metadata>
|
19
|
+
<% end %>
|
20
|
+
</metadata>
|
21
|
+
<manifest>
|
22
|
+
<% pages.each_with_index do |page,index|%>
|
23
|
+
<item href='<%= (index+1).to_s.rjust(3,'0') %>.html' media-type='application/xhtml+xml' id='<%= (index+1).to_s.rjust(3,'0') %>'/>
|
24
|
+
<% end %>
|
25
|
+
<item href='contents.html' media-type='application/xhtml+xml' id='contents'/>
|
26
|
+
<item href='nav-contents.ncx' media-type='application/x-dtbncx+xml' id='nav-contents'/>
|
27
|
+
</manifest>
|
28
|
+
<spine toc='nav-contents'>
|
29
|
+
<itemref idref='contents'/>
|
30
|
+
<% pages.each_with_index do |page,index| %>
|
31
|
+
<itemref idref='<%= (index+1).to_s.rjust(3,'0') %>'/>
|
32
|
+
<% end %>
|
33
|
+
</spine>
|
34
|
+
<guide>
|
35
|
+
<reference href='contents.html' type='toc' title='Table of Contents'/>
|
36
|
+
</guide>
|
37
|
+
</package>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
|
4
|
+
<title>Table of Contents</title>
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h1>Contents</h1>
|
8
|
+
<h4>Main section</h4>
|
9
|
+
<ul>
|
10
|
+
<% pages.each_with_index do |page,index| %>
|
11
|
+
<li><a href='<%= (index+1).to_s.rjust(3,'0') %>.html'><%= page[:title] %></a></li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'/>
|
4
|
+
<style type="text/css"><%= style %></style>
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<h2>
|
8
|
+
<%= page[:title] %>
|
9
|
+
</h2>
|
10
|
+
<p><em><%= page[:author] %></em><p>
|
11
|
+
<div><%= page[:content] %></div>
|
12
|
+
</body>
|
13
|
+
</html>
|
@@ -49,7 +49,7 @@ describe "Mobi book file generator" do
|
|
49
49
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
50
50
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
51
51
|
book.add_page :title=>'page3',:author=>'mike1',:content=>'this is the page 3',:wrap=>true
|
52
|
-
book.generate
|
52
|
+
book.generate
|
53
53
|
book.should be_generated
|
54
54
|
end
|
55
55
|
|
@@ -59,7 +59,7 @@ describe "Mobi book file generator" do
|
|
59
59
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
60
60
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
61
61
|
book.add_page :title=>'page3',:author=>'mike1',:content=>'<img src="http://media2.glamour-sales.com.cn/media/catalog/category/Stroili_banner_02.jpg"/>this is the page 3',:wrap=>true
|
62
|
-
book.generate
|
62
|
+
book.generate
|
63
63
|
book.should be_generated
|
64
64
|
File.should be_exist("./#{Kindler::Book::TMP_DIR_PREFIX}#{title}/1.jpg")
|
65
65
|
end
|
@@ -82,19 +82,11 @@ describe "Mobi book file generator" do
|
|
82
82
|
book.add_page :title=>'love page2',:author=>'mike1',:content=>'this is the love page2',:section => 'love'
|
83
83
|
book.add_page :title=>'hate page1',:author=>'mike1',:content=>'this is the hate page1',:section => 'hate'
|
84
84
|
book.add_page :title=>'love page3',:author=>'mike1',:content=>'this is the love page3',:section => 'love'
|
85
|
-
book.generate
|
85
|
+
book.generate
|
86
86
|
book.should be_generated
|
87
87
|
book.pages_by_section.count.should == 2
|
88
88
|
end
|
89
89
|
|
90
|
-
it "should generate books given title contains space" do
|
91
|
-
title = 'title with space'
|
92
|
-
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true
|
93
|
-
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
94
|
-
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
95
|
-
book.generate
|
96
|
-
book.should be_generated
|
97
|
-
end
|
98
90
|
|
99
91
|
it "can support add_article" do
|
100
92
|
title = 'first-book'
|
@@ -111,7 +103,7 @@ describe "Mobi book file generator" do
|
|
111
103
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
112
104
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
113
105
|
book.add_page :title=>'page3',:author=>'mike1',:url => 'http://media2.glamour-sales.com.cn/media/some_url',:content=>'<img src="/media/catalog/category/Stroili_banner_02.jpg"/>this is the page 3',:wrap=>true
|
114
|
-
book.generate
|
106
|
+
book.generate
|
115
107
|
book.should be_generated
|
116
108
|
File.should be_exist("./#{Kindler::Book::TMP_DIR_PREFIX}#{title}/1.jpg")
|
117
109
|
end
|
@@ -122,7 +114,7 @@ describe "Mobi book file generator" do
|
|
122
114
|
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true, :output_dir => custom_dir
|
123
115
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
124
116
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
125
|
-
book.generate
|
117
|
+
book.generate
|
126
118
|
book.should be_generated
|
127
119
|
File.should be_exist(custom_dir)
|
128
120
|
end
|
@@ -133,7 +125,7 @@ describe "Mobi book file generator" do
|
|
133
125
|
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true, :output_dir => custom_dir
|
134
126
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
135
127
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
136
|
-
book.generate
|
128
|
+
book.generate
|
137
129
|
book.should be_generated
|
138
130
|
File.should be_exist(File.expand_path(custom_dir))
|
139
131
|
end
|
@@ -145,8 +137,9 @@ describe "Mobi book file generator" do
|
|
145
137
|
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
146
138
|
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
147
139
|
book.add_page :title=>'page3',:author=>'mike1',:content=>"<img src='#{image_url}'/>this is the page 3",:wrap=>true
|
148
|
-
book.generate
|
140
|
+
book.generate
|
149
141
|
book.should be_generated
|
150
142
|
end
|
151
143
|
|
144
|
+
|
152
145
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
describe "Mobi book file generator" do
|
4
|
+
|
5
|
+
after :all do
|
6
|
+
puts '==== clear tmp files ==='
|
7
|
+
#`rm -rf ./__*`
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have the title,author property" do
|
11
|
+
title = 'simple-book'
|
12
|
+
author = 'mike'
|
13
|
+
book = Kindler::Book.new :title=>title,:author=>author,:debug=>true,:mobi_type => :simple
|
14
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
15
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
16
|
+
book.add_page :title=>'page3',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
17
|
+
book.add_page :title=>'page4',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
18
|
+
book.title.should == title
|
19
|
+
book.author.should == author
|
20
|
+
book.generate
|
21
|
+
book.should be_generated
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe "Mobi book file generator" do
|
3
|
+
|
4
|
+
after :all do
|
5
|
+
puts '==== clear tmp files ==='
|
6
|
+
#`rm -rf ./__*`
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should generate books given title contains space" do
|
10
|
+
title = 'title with space'
|
11
|
+
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true
|
12
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
13
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
14
|
+
book.generate
|
15
|
+
book.should be_generated
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kindler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- dongbin.li
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-03-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: nokogiri
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
description: kindler is a rubygem allow you to generate kindle mobi book very easily
|
26
28
|
email:
|
27
29
|
- mike.d.1984@gmail.com
|
@@ -42,31 +44,36 @@ files:
|
|
42
44
|
- lib/kindler.rb
|
43
45
|
- lib/kindler/railtie.rb
|
44
46
|
- lib/kindler/version.rb
|
47
|
+
- lib/templates/book.ncx.erb
|
48
|
+
- lib/templates/book.opf.erb
|
49
|
+
- lib/templates/book.toc.erb
|
50
|
+
- lib/templates/page.html.erb
|
45
51
|
- spec/cases/generator_spec.rb
|
52
|
+
- spec/cases/simple_book_spec.rb
|
53
|
+
- spec/cases/title_space_spec.rb
|
46
54
|
- spec/spec_helper.rb
|
47
55
|
homepage: https://github.com/29decibel/kindler
|
48
56
|
licenses: []
|
57
|
+
metadata: {}
|
49
58
|
post_install_message:
|
50
59
|
rdoc_options: []
|
51
60
|
require_paths:
|
52
61
|
- lib
|
53
62
|
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
63
|
requirements:
|
56
|
-
- -
|
64
|
+
- - '>='
|
57
65
|
- !ruby/object:Gem::Version
|
58
66
|
version: '0'
|
59
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
68
|
requirements:
|
62
|
-
- -
|
69
|
+
- - '>='
|
63
70
|
- !ruby/object:Gem::Version
|
64
71
|
version: '0'
|
65
72
|
requirements: []
|
66
73
|
rubyforge_project: kindler
|
67
|
-
rubygems_version:
|
74
|
+
rubygems_version: 2.0.0
|
68
75
|
signing_key:
|
69
|
-
specification_version:
|
76
|
+
specification_version: 4
|
70
77
|
summary: kindler is a rubygem allow you to generate kindle mobi book very easily
|
71
78
|
test_files:
|
72
79
|
- features/basic.feature
|
@@ -74,5 +81,6 @@ test_files:
|
|
74
81
|
- features/step_definitions/basic_step.rb
|
75
82
|
- features/step_definitions/dsl_step.rb
|
76
83
|
- spec/cases/generator_spec.rb
|
84
|
+
- spec/cases/simple_book_spec.rb
|
85
|
+
- spec/cases/title_space_spec.rb
|
77
86
|
- spec/spec_helper.rb
|
78
|
-
has_rdoc:
|