kindler 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|