kindler 0.0.1 → 0.0.2
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/bin/kindler +29 -0
- data/lib/kindler/version.rb +1 -1
- data/lib/kindler.rb +65 -14
- data/spec/cases/generator_spec.rb +3 -3
- metadata +8 -8
- data/lib/kindler/html_generator.rb +0 -7
- data/lib/kindler/toc_generator.rb +0 -7
data/bin/kindler
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'optparse'
|
4
|
+
require 'open-uri'
|
5
|
+
require File.dirname(__FILE__) + "/../lib/kindler"
|
6
|
+
# get options
|
7
|
+
options = {:title=>'kindler_ebook',:urls=>ARGV}
|
8
|
+
option_parser = OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage kindler url1 url2 url3 [-t my_book] [-d]"
|
10
|
+
|
11
|
+
opts.on("-d",'--debug','show debug infos') do |d|
|
12
|
+
options[:debug] = d
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("-t",'--title','title of book') do |t|
|
16
|
+
options[:title] = t
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on_tail('-h','--help','show this message') do
|
20
|
+
puts opts
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
exit unless ARGV.length > 0
|
27
|
+
book = Kindler::Book.new(options)
|
28
|
+
book.generate
|
29
|
+
|
data/lib/kindler/version.rb
CHANGED
data/lib/kindler.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require File.dirname(__FILE__)+"/kindler/version"
|
2
3
|
require "readability"
|
3
4
|
require "open-uri"
|
4
5
|
# require 'mini_magick'
|
@@ -15,12 +16,17 @@ module Kindler
|
|
15
16
|
# @option urls [Array] urls to generate
|
16
17
|
# @option title [String] book title
|
17
18
|
# @option output_dir [String] directory want to generate
|
19
|
+
# @option debug [Boolean] whether puts debug infos
|
20
|
+
# @option keep_image [Boolean] whether keep images, default to true
|
18
21
|
def initialize(options={})
|
19
22
|
@urls = options[:urls] || {}
|
20
23
|
@title = options[:title] || ''
|
21
24
|
@output_dir = options[:output_dir] || './'
|
25
|
+
@keep_image = options[:keep_image] || true
|
26
|
+
@debug = options[:debug]
|
22
27
|
raise KindlerError.new("urls option could not be empty") if @urls.empty?
|
23
28
|
@author = options[:author] || ''
|
29
|
+
@images = []
|
24
30
|
@doc_infos = {}
|
25
31
|
# init doc infos by url
|
26
32
|
@urls.each {|url| @doc_infos[url]= {} }
|
@@ -41,9 +47,11 @@ module Kindler
|
|
41
47
|
make_generated_dirs
|
42
48
|
# generate
|
43
49
|
generate_html
|
50
|
+
localize_images
|
44
51
|
generate_toc
|
45
52
|
generate_opf
|
46
53
|
generate_ncx
|
54
|
+
write_to_disk
|
47
55
|
kindlegen
|
48
56
|
# clear
|
49
57
|
end
|
@@ -57,7 +65,7 @@ module Kindler
|
|
57
65
|
# make sure kindlegen is installed
|
58
66
|
# you can use "sudo brew install " to install it
|
59
67
|
def kindlegen
|
60
|
-
|
68
|
+
debug 'begin generate mobi'
|
61
69
|
system("kindlegen #{tmp_dir}/#{@title}.opf ")
|
62
70
|
end
|
63
71
|
|
@@ -80,9 +88,8 @@ module Kindler
|
|
80
88
|
end
|
81
89
|
# append footer
|
82
90
|
contents << "</ul></body></html>"
|
83
|
-
|
84
|
-
|
85
|
-
end
|
91
|
+
|
92
|
+
@toc = contents
|
86
93
|
end
|
87
94
|
|
88
95
|
# generate ncx , which is navigation
|
@@ -145,7 +152,7 @@ module Kindler
|
|
145
152
|
files_count += 1
|
146
153
|
end
|
147
154
|
contents << "</navMap></ncx>"
|
148
|
-
|
155
|
+
@ncx = contents
|
149
156
|
end
|
150
157
|
|
151
158
|
# generate the opf, manifest of book,including all articles and images and css
|
@@ -189,7 +196,7 @@ module Kindler
|
|
189
196
|
files_count += 1
|
190
197
|
end
|
191
198
|
contents << "</spine><guide><reference href='contents.html' type='toc' title='Table of Contents'/></guide></package>"
|
192
|
-
|
199
|
+
@opf = contents
|
193
200
|
end
|
194
201
|
|
195
202
|
# generate every url to article in readable format
|
@@ -200,13 +207,32 @@ module Kindler
|
|
200
207
|
infos[:content] = html_wrap(article.title,article.content)
|
201
208
|
infos[:title] = article.title
|
202
209
|
end
|
203
|
-
|
204
|
-
|
210
|
+
end
|
211
|
+
|
212
|
+
def localize_images
|
213
|
+
images_count = 1
|
205
214
|
@doc_infos.each do |url,infos|
|
206
|
-
|
207
|
-
|
215
|
+
article = Nokogiri::HTML(infos[:content])
|
216
|
+
article.css('img').each do |img|
|
217
|
+
image_remote_address = img.attr('src')
|
218
|
+
unless image_remote_address.start_with?('http')
|
219
|
+
image_remote_address = "http://#{URI(url).host}#{image_remote_address}"
|
220
|
+
end
|
221
|
+
image_local_address = File.join(tmp_dir,"#{images_count}#{File.extname(image_remote_address)}")
|
222
|
+
# download images
|
223
|
+
debug "begin fetch image #{image_remote_address}"
|
224
|
+
debug "save to #{image_local_address}"
|
225
|
+
File.open(image_local_address,'w') do |f|
|
226
|
+
f.puts open(image_remote_address).read
|
227
|
+
end
|
228
|
+
debug 'Image saved'
|
229
|
+
# replace local url address
|
230
|
+
img.attributes['src'].value = "#{images_count}#{File.extname(image_remote_address)}"
|
231
|
+
infos[:content] = article.inner_html
|
232
|
+
# add to manifest
|
233
|
+
@images << "#{images_count}#{File.extname(image_remote_address)}"
|
234
|
+
images_count += 1
|
208
235
|
end
|
209
|
-
files_count += 1
|
210
236
|
end
|
211
237
|
end
|
212
238
|
|
@@ -228,9 +254,13 @@ module Kindler
|
|
228
254
|
|
229
255
|
# get readable document by url, using ruby-readability here
|
230
256
|
def readable_article(url)
|
231
|
-
|
257
|
+
debug "begin fetch url : #{url}"
|
232
258
|
source = open(url).read
|
233
|
-
|
259
|
+
if @keep_image
|
260
|
+
Readability::Document.new(source,:tags=>%w(div p img a),:attributes => %w[src href],:remove_empty_nodes => false)
|
261
|
+
else
|
262
|
+
Readability::Document.new(source)
|
263
|
+
end
|
234
264
|
end
|
235
265
|
|
236
266
|
# the dir path to generated files
|
@@ -244,11 +274,32 @@ module Kindler
|
|
244
274
|
FileUtils.mkdir_p tmp_dir unless File.exist?(tmp_dir)
|
245
275
|
end
|
246
276
|
|
277
|
+
def write_to_disk
|
278
|
+
File.open("#{tmp_dir}/nav-contents.ncx",'w') { |f| f.puts @ncx }
|
279
|
+
File.open(file_path('contents'),'w') {|f| f.puts @toc }
|
280
|
+
File.open("#{tmp_dir}/#{@title}.opf",'w') {|f| f.puts @opf}
|
281
|
+
# make html files
|
282
|
+
files_count = 1
|
283
|
+
@doc_infos.each do |url,infos|
|
284
|
+
File.open(file_path(files_count.to_s.rjust(3,'0')),'w') do |f|
|
285
|
+
f.puts infos[:content]
|
286
|
+
end
|
287
|
+
files_count += 1
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|
291
|
+
|
247
292
|
# exist to clear tmp files such as ncx,opf or html other than mobi file
|
248
293
|
# keep them right now
|
249
294
|
def clear_tmp_dirs
|
250
295
|
|
251
296
|
end
|
252
297
|
|
298
|
+
def debug(str)
|
299
|
+
return unless @debug
|
300
|
+
Rails.logger.info(str) if defined?(Rails)
|
301
|
+
puts str
|
302
|
+
end
|
303
|
+
|
253
304
|
end
|
254
305
|
end
|
@@ -5,7 +5,7 @@ describe "Mobi html file generator" do
|
|
5
5
|
title = "Test_book"
|
6
6
|
book = Kindler::Book.new ({:urls=>["http://blog.farmostwood.net/643.html",
|
7
7
|
"http://www.ifanr.com/69878","http://www.oneplus.info/archives/455"],
|
8
|
-
:title=>title,:author=>'mike'})
|
8
|
+
:title=>title,:author=>'mike',:debug=>true})
|
9
9
|
book.generate
|
10
10
|
File.exist?(mobi_book_path(title)).should == true
|
11
11
|
end
|
@@ -20,7 +20,7 @@ describe "Mobi html file generator" do
|
|
20
20
|
urls << "http://tumblr.intranation.com/post/766290565/how-set-up-your-own-private-git-server-linux"
|
21
21
|
urls << "http://antirez.com/post/what-is-wrong-with-2006-programming.html"
|
22
22
|
urls << "http://fak3r.com/2009/09/14/howto-build-your-own-open-source-dropbox-clone/"
|
23
|
-
book = Kindler::Book.new :urls=>urls,:title=>title,:author=>'mike'
|
23
|
+
book = Kindler::Book.new :urls=>urls,:title=>title,:author=>'mike',:debug=>true
|
24
24
|
book.generate
|
25
25
|
File.exist?(mobi_book_path(title)).should == true
|
26
26
|
end
|
@@ -31,7 +31,7 @@ describe "Mobi html file generator" do
|
|
31
31
|
urls << "http://www.wowsai.com/home/space.php?uid=1&do=blog&id=4362&classid=2"
|
32
32
|
urls << "http://www.honeykennedy.com/2012/01/miss-moss-love-letters/"
|
33
33
|
urls << "http://www.mysenz.com/?p=3692"
|
34
|
-
book = Kindler::Book.new :urls=>urls,:title=>title,:author=>'mike',:output_dir=>'/Users/lidongbin/projects'
|
34
|
+
book = Kindler::Book.new :urls=>urls,:title=>title,:author=>'mike',:output_dir=>'/Users/lidongbin/projects',:debug=>true
|
35
35
|
book.generate
|
36
36
|
File.exist?(mobi_book_path(title,'/Users/lidongbin/projects')).should == true
|
37
37
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kindler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-30 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mini_magick
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157488800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157488800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby-readability
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157488380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,11 +32,12 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157488380
|
36
36
|
description: a simple gem to generate kindle mobi book
|
37
37
|
email:
|
38
38
|
- mike.d.1984@gmail.com
|
39
|
-
executables:
|
39
|
+
executables:
|
40
|
+
- kindler
|
40
41
|
extensions: []
|
41
42
|
extra_rdoc_files: []
|
42
43
|
files:
|
@@ -45,11 +46,10 @@ files:
|
|
45
46
|
- Guardfile
|
46
47
|
- Rakefile
|
47
48
|
- Readme.md
|
49
|
+
- bin/kindler
|
48
50
|
- kindler.gemspec
|
49
51
|
- lib/kindler.rb
|
50
|
-
- lib/kindler/html_generator.rb
|
51
52
|
- lib/kindler/railtie.rb
|
52
|
-
- lib/kindler/toc_generator.rb
|
53
53
|
- lib/kindler/version.rb
|
54
54
|
- spec/cases/generator_spec.rb
|
55
55
|
- spec/spec_helper.rb
|