kindler 0.0.7 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -2
- data/Readme.md +15 -15
- data/kindler.gemspec +4 -4
- data/lib/kindler/version.rb +1 -1
- data/lib/kindler.rb +112 -88
- data/spec/cases/generator_spec.rb +24 -70
- metadata +7 -22
- data/bin/kindler +0 -29
data/Gemfile
CHANGED
@@ -13,8 +13,7 @@ group :development, :test do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
gem "
|
17
|
-
gem 'mini_magick'
|
16
|
+
gem "nokogiri"
|
18
17
|
|
19
18
|
# Specify your gem's dependencies in kindler.gemspec
|
20
19
|
gemspec
|
data/Readme.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
###
|
2
|
-
|
1
|
+
### Prerequisite
|
2
|
+
#### 1.kindlegen execute file from amazon
|
3
|
+
#### 2.that's all
|
3
4
|
|
4
5
|
|
5
6
|
### Installation
|
@@ -15,22 +16,21 @@ gem 'kindler',:git=>'git@github.com:29decibel/kindler.git'
|
|
15
16
|
### A kindle mobi book generator
|
16
17
|
which receive a couple of urls then output one mobi file
|
17
18
|
|
18
|
-
###
|
19
|
-
kindler url1 url2 url3 url4 -t my_book
|
20
|
-
|
21
|
-
outputs : my_book.mobi
|
22
|
-
|
23
|
-
### Api use
|
19
|
+
### Usage
|
24
20
|
```ruby
|
25
|
-
|
26
|
-
book = Kindler::Book.new
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
title = 'my_first_mobi_book'
|
22
|
+
book = Kindler::Book.new :title=>title,:author=>'mike'
|
23
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true,:section => 'love'
|
24
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true,:section => 'hate'
|
25
|
+
book.add_page :title=>'page_with_image',:author=>'mike1',:content=>'<img src="http://media2.glamour-sales.com.cn/media/catalog/category/Stroili_banner_02.jpg"></img>this is the page 3',:wrap=>true,:section=>'hate'
|
26
|
+
# you will get my_first_mobi_book.mobi file
|
27
|
+
book.generate
|
28
|
+
|
29
|
+
#or you can just generate simple mobi book
|
30
|
+
book.mobi_type = :flat
|
31
|
+
book.generate
|
31
32
|
```
|
32
33
|
|
33
|
-
|
34
34
|
Hope you love it !
|
35
35
|
|
36
36
|
|
data/kindler.gemspec
CHANGED
@@ -4,13 +4,13 @@ require File.expand_path('../lib/kindler/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["dongbin.li"]
|
6
6
|
gem.email = ["mike.d.1984@gmail.com"]
|
7
|
-
gem.description = %q{kindler is a rubygem allow you to generate kindle mobi book
|
8
|
-
gem.summary = %q{kindler is a rubygem allow you to generate kindle mobi book
|
7
|
+
gem.description = %q{kindler is a rubygem allow you to generate kindle mobi book very easily}
|
8
|
+
gem.summary = %q{kindler is a rubygem allow you to generate kindle mobi book very easily}
|
9
9
|
gem.homepage = "https://github.com/29decibel/kindler"
|
10
10
|
|
11
11
|
gem.rubyforge_project = "kindler"
|
12
|
-
|
13
|
-
gem.add_dependency '
|
12
|
+
|
13
|
+
gem.add_dependency 'nokogiri'
|
14
14
|
|
15
15
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
16
|
gem.files = `git ls-files`.split("\n")
|
data/lib/kindler/version.rb
CHANGED
data/lib/kindler.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
require 'rubygems'
|
3
|
-
require "readability"
|
4
3
|
require "open-uri"
|
4
|
+
require "nokogiri"
|
5
5
|
# require 'mini_magick'
|
6
6
|
require_relative 'kindler/railtie' if defined?(Rails)
|
7
7
|
require_relative "kindler/version"
|
@@ -9,52 +9,48 @@ require_relative "kindler/version"
|
|
9
9
|
module Kindler
|
10
10
|
class Book
|
11
11
|
class KindlerError < StandardError;end
|
12
|
-
attr_accessor :
|
12
|
+
attr_accessor :title,:author,:pages,:local_images,:mobi_type
|
13
13
|
TMP_DIR = 'kindler_generated_mobi'
|
14
|
+
DEFAULT_SECTION = "All Pages"
|
15
|
+
PAGE_ATTRIBUTES = %w(wrap title author content section)
|
14
16
|
|
15
17
|
# availabel options
|
16
18
|
# @param options [Hash]
|
17
|
-
# @option urls [Array] urls to generate
|
18
19
|
# @option title [String] book title
|
19
20
|
# @option output_dir [String] directory want to generate
|
20
21
|
# @option debug [Boolean] whether puts debug infos
|
21
22
|
# @option keep_image [Boolean] whether keep images, default to true
|
22
23
|
def initialize(options={})
|
23
|
-
@urls = options[:urls] || {}
|
24
|
-
@title = options[:title] || ''
|
25
24
|
@output_dir = options[:output_dir] || './'
|
26
25
|
@keep_image = options[:keep_image] || true
|
27
26
|
@debug = options[:debug]
|
28
|
-
|
27
|
+
@title = options[:title] || ''
|
29
28
|
@author = options[:author] || ''
|
30
|
-
@
|
31
|
-
@
|
32
|
-
|
33
|
-
|
29
|
+
@mobi_type = options[:mobi_type] || :magzine
|
30
|
+
@pages = []
|
31
|
+
@local_images = []
|
32
|
+
raise KindlerError.new("must provide the book title ") unless title
|
34
33
|
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
def add_page(options={})
|
36
|
+
raise KindlerError.new('must provide title when add page') unless options[:title]
|
37
|
+
page = options.reject{|k,v| PAGE_ATTRIBUTES.include?(k)}
|
38
|
+
page[:wrap] ||= true
|
39
|
+
page[:section] ||= DEFAULT_SECTION
|
40
|
+
page[:count] = pages.count + 1
|
41
|
+
page[:file_name] = "#{page[:count].to_s.rjust(3,'0')}.html"
|
42
|
+
pages << page
|
43
|
+
debug pages
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
|
-
def generate(title='')
|
46
|
+
def generate
|
48
47
|
make_generated_dirs
|
49
|
-
|
50
|
-
generate_html
|
51
|
-
localize_images
|
48
|
+
localize_images if @keep_image
|
52
49
|
generate_toc
|
53
50
|
generate_opf
|
54
51
|
generate_ncx
|
55
52
|
write_to_disk
|
56
53
|
kindlegen
|
57
|
-
# clear
|
58
54
|
end
|
59
55
|
|
60
56
|
# check mobi file is generated already
|
@@ -83,8 +79,8 @@ module Kindler
|
|
83
79
|
<ul>
|
84
80
|
CODE
|
85
81
|
files_count = 1
|
86
|
-
|
87
|
-
contents << "<li><a href='#{files_count.to_s.rjust(3,'0')}.html'>#{
|
82
|
+
pages.each do |page|
|
83
|
+
contents << "<li><a href='#{files_count.to_s.rjust(3,'0')}.html'>#{page[:title]}</a></li>"
|
88
84
|
files_count += 1
|
89
85
|
end
|
90
86
|
# append footer
|
@@ -100,60 +96,124 @@ module Kindler
|
|
100
96
|
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
|
101
97
|
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en-US">
|
102
98
|
<head>
|
103
|
-
<meta name="dtb:uid" content="#{
|
99
|
+
<meta name="dtb:uid" content="#{title}"/>
|
104
100
|
<meta name="dtb:depth" content="1"/>
|
105
101
|
<meta name="dtb:totalPageCount" content="0"/>
|
106
102
|
<meta name="dtb:maxPageNumber" content="0"/>
|
107
103
|
</head>
|
108
104
|
<docTitle>
|
109
|
-
<text>#{
|
105
|
+
<text>#{title}</text>
|
110
106
|
</docTitle>
|
111
107
|
<docAuthor>
|
112
|
-
<text>#{
|
108
|
+
<text>#{author}</text>
|
113
109
|
</docAuthor>
|
114
110
|
<navMap>
|
115
111
|
NCX
|
112
|
+
contents << (magzine? ? magzine_ncx : flat_ncx)
|
113
|
+
contents << "</navMap></ncx>"
|
114
|
+
@ncx = contents
|
115
|
+
end
|
116
|
+
|
117
|
+
def flat_ncx
|
118
|
+
contents = ''
|
116
119
|
files_count = 2
|
117
|
-
|
120
|
+
pages.each do |page|
|
118
121
|
nav_point = <<-NAV
|
119
122
|
<navPoint id="navpoint-#{files_count}" playOrder="#{files_count}">
|
120
|
-
<navLabel><text>#{
|
123
|
+
<navLabel><text>#{page[:title]}</text></navLabel>
|
121
124
|
<content src="#{(files_count-1).to_s.rjust(3,'0')}.html"/>
|
122
125
|
</navPoint>
|
123
126
|
NAV
|
124
127
|
contents << nav_point
|
125
128
|
files_count += 1
|
126
129
|
end
|
127
|
-
contents
|
128
|
-
|
130
|
+
contents
|
131
|
+
end
|
132
|
+
|
133
|
+
def magzine_ncx
|
134
|
+
contents = ''
|
135
|
+
pages_by_section = {}
|
136
|
+
pages.each do |page|
|
137
|
+
pages_by_section[page[:title]] ||= []
|
138
|
+
pages_by_section[page[:title]] << page
|
139
|
+
end
|
140
|
+
contents << <<-MAG
|
141
|
+
<navPoint playOrder="0" class="periodical" id="periodical">
|
142
|
+
<navLabel>
|
143
|
+
<text>Table of Contents</text>
|
144
|
+
</navLabel>
|
145
|
+
<content src="contents.html"/>
|
146
|
+
|
147
|
+
MAG
|
148
|
+
|
149
|
+
play_order = 1
|
150
|
+
pages_by_section.each do |section,pages|
|
151
|
+
next if pages.count==0
|
152
|
+
# add section header
|
153
|
+
contents << <<-SECHEADER
|
154
|
+
<navPoint playOrder="#{play_order}" class="section" id="#{section}">
|
155
|
+
<navLabel>
|
156
|
+
<text>#{section}</text>
|
157
|
+
</navLabel>
|
158
|
+
<content src="#{pages.first[:file_name]}"/>
|
159
|
+
SECHEADER
|
160
|
+
|
161
|
+
play_order += 1
|
162
|
+
# add pages nav
|
163
|
+
pages.each do |page|
|
164
|
+
contents << <<-PAGE
|
165
|
+
<navPoint playOrder="#{play_order}" class="article" id="item-#{page[:count].to_s.rjust(3,'0')}">
|
166
|
+
<navLabel>
|
167
|
+
<text>#{page[:title]}</text>
|
168
|
+
</navLabel>
|
169
|
+
<content src="#{page[:file_name]}"/>
|
170
|
+
<mbp:meta name="description">#{page[:title]}</mbp:meta>
|
171
|
+
<mbp:meta name="author">#{page[:author]}</mbp:meta>
|
172
|
+
</navPoint>
|
173
|
+
PAGE
|
174
|
+
play_order += 1
|
175
|
+
end
|
176
|
+
# add section footer
|
177
|
+
contents << "</navPoint>"
|
178
|
+
end
|
179
|
+
contents << "</navPoint>"
|
180
|
+
end
|
181
|
+
|
182
|
+
def magzine_meta
|
183
|
+
<<-META
|
184
|
+
<x-metadata>
|
185
|
+
<output content-type="application/x-mobipocket-subscription-magazine" encoding="utf-8"/>
|
186
|
+
</x-metadata>
|
187
|
+
META
|
188
|
+
end
|
189
|
+
|
190
|
+
def magzine?
|
191
|
+
@mobi_type == :magzine
|
129
192
|
end
|
130
193
|
|
131
194
|
# generate the opf, manifest of book,including all articles and images and css
|
132
195
|
def generate_opf
|
133
|
-
# mark mobi as magzine format
|
134
|
-
# <x-metadata>
|
135
|
-
# <output content-type="application/x-mobipocket-subscription-magazine" encoding="utf-8"/>
|
136
|
-
# </x-metadata>
|
137
196
|
contents = <<-HTML
|
138
197
|
<?xml version='1.0' encoding='utf-8'?>
|
139
|
-
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="#{
|
198
|
+
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="#{title}">
|
140
199
|
<metadata>
|
141
200
|
<dc-metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
|
142
|
-
<dc:title>#{
|
201
|
+
<dc:title>#{title}</dc:title>
|
143
202
|
<dc:language>en-gb</dc:language>
|
144
203
|
<meta content="cover-image" name="cover"/>
|
145
204
|
<dc:creator>Kindler- 29decibel</dc:creator>
|
146
205
|
<dc:publisher>Kindler- 29decibel</dc:publisher>
|
147
206
|
<dc:subject>News</dc:subject>
|
148
|
-
<dc:identifier id="#{
|
207
|
+
<dc:identifier id="#{title}">#{title}</dc:identifier>
|
149
208
|
<dc:date>#{Time.now.to_date}/dc:date>
|
150
209
|
<dc:description>Kindler generated book</dc:description>
|
151
210
|
</dc-metadata>
|
211
|
+
#{magzine? ? magzine_meta : ''}
|
152
212
|
</metadata>
|
153
213
|
<manifest>
|
154
214
|
HTML
|
155
215
|
files_count = 1
|
156
|
-
|
216
|
+
pages.each do |page|
|
157
217
|
doc_id = files_count.to_s.rjust(3,'0')
|
158
218
|
contents << "<item href='#{doc_id}.html' media-type='application/xhtml+xml' id='#{doc_id}'/>"
|
159
219
|
files_count += 1
|
@@ -164,7 +224,7 @@ module Kindler
|
|
164
224
|
contents << "<spine toc='nav-contents'>"
|
165
225
|
contents << "<itemref idref='contents'/>"
|
166
226
|
files_count = 1
|
167
|
-
|
227
|
+
pages.each do |page|
|
168
228
|
contents << "<itemref idref='#{files_count.to_s.rjust(3,'0')}'/>"
|
169
229
|
files_count += 1
|
170
230
|
end
|
@@ -172,27 +232,10 @@ module Kindler
|
|
172
232
|
@opf = contents
|
173
233
|
end
|
174
234
|
|
175
|
-
# generate every url to article in readable format
|
176
|
-
def generate_html
|
177
|
-
@doc_infos.each do |url,infos|
|
178
|
-
article = readable_article(url)
|
179
|
-
if article
|
180
|
-
begin
|
181
|
-
# puts article.images
|
182
|
-
infos[:content] = html_wrap(article.title,article.content)
|
183
|
-
infos[:title] = article.title
|
184
|
-
rescue Exception => e
|
185
|
-
debug "error when get contents from article, #{e}"
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
@doc_infos = @doc_infos.reject{|url,infos| infos[:content]==nil or infos[:title]==nil }
|
190
|
-
end
|
191
|
-
|
192
235
|
def localize_images
|
193
236
|
images_count = 1
|
194
|
-
|
195
|
-
article = Nokogiri::HTML(
|
237
|
+
pages.each do |page|
|
238
|
+
article = Nokogiri::HTML(page[:content])
|
196
239
|
article.css('img').each do |img|
|
197
240
|
begin
|
198
241
|
image_remote_address = img.attr('src')
|
@@ -209,9 +252,9 @@ module Kindler
|
|
209
252
|
debug 'Image saved'
|
210
253
|
# replace local url address
|
211
254
|
img.attributes['src'].value = "#{images_count}#{File.extname(image_remote_address)}"
|
212
|
-
|
255
|
+
page[:content] = article.inner_html
|
213
256
|
# add to manifest
|
214
|
-
|
257
|
+
local_images << "#{images_count}#{File.extname(image_remote_address)}"
|
215
258
|
images_count += 1
|
216
259
|
rescue Exception => e
|
217
260
|
debug "got error when fetch and save image: #{e}"
|
@@ -236,22 +279,6 @@ module Kindler
|
|
236
279
|
result << '</body></html>'
|
237
280
|
end
|
238
281
|
|
239
|
-
# get readable document by url, using ruby-readability here
|
240
|
-
def readable_article(url)
|
241
|
-
debug "begin fetch url : #{url}"
|
242
|
-
begin
|
243
|
-
source = open(url).read
|
244
|
-
rescue Exception => e
|
245
|
-
debug "got some erros,#{e}"
|
246
|
-
return nil
|
247
|
-
end
|
248
|
-
if @keep_image
|
249
|
-
Readability::Document.new(source,:tags=>%w(div p img a),:attributes => %w[src href],:remove_empty_nodes => false)
|
250
|
-
else
|
251
|
-
Readability::Document.new(source)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
282
|
# the dir path to generated files
|
256
283
|
def tmp_dir
|
257
284
|
File.join @output_dir,"#{TMP_DIR}_#{@title.gsub(' ','_')}"
|
@@ -266,24 +293,21 @@ module Kindler
|
|
266
293
|
def write_to_disk
|
267
294
|
File.open("#{tmp_dir}/nav-contents.ncx",'wb') { |f| f.write @ncx }
|
268
295
|
File.open(file_path('contents'),'wb') {|f| f.write @toc }
|
269
|
-
File.open("#{tmp_dir}/#{
|
296
|
+
File.open("#{tmp_dir}/#{title}.opf",'wb') {|f| f.write @opf}
|
270
297
|
# make html files
|
271
298
|
files_count = 1
|
272
|
-
|
299
|
+
pages.each do |page|
|
273
300
|
File.open(file_path(files_count.to_s.rjust(3,'0')),'wb') do |f|
|
274
|
-
|
301
|
+
content_to_write = page[:wrap] ? html_wrap(page[:title],page[:content]) : page[:content]
|
302
|
+
debug "here is the page #{page[:title]} need to write"
|
303
|
+
debug content_to_write
|
304
|
+
f.write content_to_write
|
275
305
|
end
|
276
306
|
files_count += 1
|
277
307
|
end
|
278
308
|
|
279
309
|
end
|
280
310
|
|
281
|
-
# exist to clear tmp files such as ncx,opf or html other than mobi file
|
282
|
-
# keep them right now
|
283
|
-
def clear_tmp_dirs
|
284
|
-
|
285
|
-
end
|
286
|
-
|
287
311
|
def debug(str)
|
288
312
|
return unless @debug
|
289
313
|
Rails.logger.info(str) if defined?(Rails)
|
@@ -1,47 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe "Mobi html file generator" do
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# it "should generate hacker news book" do
|
15
|
-
# title = 'haker_news'
|
16
|
-
# urls = []
|
17
|
-
# urls << "http://jseliger.com/2010/09/26/how-universities-work-or-what-i-wish-i%E2%80%99d-known-freshman-year-a-guide-to-american-university-life-for-the-uninitiated/"
|
18
|
-
# urls << "http://randykepple.com/photoblog/2010/10/8-bad-habits-that-crush-your-creativity-and-stifle-your-success/"
|
19
|
-
# urls << "http://nathanmarz.com/blog/how-to-get-a-job-at-a-kick-ass-startup-for-programmers.html"
|
20
|
-
# urls << "http://tumblr.intranation.com/post/766290565/how-set-up-your-own-private-git-server-linux"
|
21
|
-
# urls << "http://antirez.com/post/what-is-wrong-with-2006-programming.html"
|
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',:debug=>true
|
24
|
-
# book.generate
|
25
|
-
# File.exist?(mobi_book_path(title)).should == true
|
26
|
-
# end
|
4
|
+
it "should not generate a mobi book" do
|
5
|
+
title = 'good_book'
|
6
|
+
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true
|
7
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
8
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
9
|
+
book.add_page :title=>'page3',:author=>'mike1',:content=>'this is the page 3',:wrap=>true
|
10
|
+
book.generate
|
11
|
+
File.exist?(mobi_book_path(title)).should == true
|
12
|
+
end
|
27
13
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
# end
|
14
|
+
it "should generate book contains images" do
|
15
|
+
title = 'book_with_image'
|
16
|
+
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true
|
17
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true
|
18
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true
|
19
|
+
book.add_page :title=>'page3',:author=>'mike1',:content=>'<img src="http://media2.glamour-sales.com.cn/media/catalog/category/Stroili_banner_02.jpg"></img>this is the page 3',:wrap=>true
|
20
|
+
book.generate
|
21
|
+
File.exist?(mobi_book_path(title)).should == true
|
22
|
+
end
|
38
23
|
|
39
|
-
it "should
|
40
|
-
title = '
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
book
|
24
|
+
it "should generate book with sections" do
|
25
|
+
title = 'first_section_book'
|
26
|
+
book = Kindler::Book.new :title=>title,:author=>'mike',:debug=>true
|
27
|
+
book.add_page :title=>'page1',:author=>'mike1',:content=>'this is the page 1',:wrap=>true,:section => 'love'
|
28
|
+
book.add_page :title=>'page2',:author=>'mike1',:content=>'this is the page 2',:wrap=>true,:section => 'hate'
|
29
|
+
book.add_page :title=>'page3',:author=>'mike1',:content=>'<img src="http://media2.glamour-sales.com.cn/media/catalog/category/Stroili_banner_02.jpg"></img>this is the page 3',:wrap=>true,:section=>'hate'
|
45
30
|
book.generate
|
46
31
|
File.exist?(mobi_book_path(title)).should == true
|
47
32
|
end
|
@@ -50,35 +35,4 @@ describe "Mobi html file generator" do
|
|
50
35
|
File.join(output_dir,"kindler_generated_mobi_#{title}/#{title}.mobi")
|
51
36
|
end
|
52
37
|
|
53
|
-
|
54
|
-
# this navPoint seems not useful
|
55
|
-
# contents << <<-NAV
|
56
|
-
# <navPoint id="navpoint-1" playOrder="1">
|
57
|
-
# <navLabel><text>Table Of Contents</text></navLabel>
|
58
|
-
# <content src="contents.html"/>
|
59
|
-
# </navPoint>
|
60
|
-
# NAV
|
61
|
-
####################### periodocal , magzine like format #########################
|
62
|
-
# <navPoint playOrder="0" class="periodical" id="periodical">
|
63
|
-
# <mbp:meta-img src="masthead.gif" name="mastheadImage"/>
|
64
|
-
# <navLabel>
|
65
|
-
# <text>Table of Contents</text>
|
66
|
-
# </navLabel>
|
67
|
-
# <content src="contents.html"/>
|
68
|
-
# <navPoint playOrder="1" class="section" id="Main-section">
|
69
|
-
# <navLabel>
|
70
|
-
# <text>Main section</text>
|
71
|
-
# </navLabel>
|
72
|
-
# <content src="001.html"/>
|
73
|
-
# <navPoint playOrder="2" class="article" id="item-001">
|
74
|
-
# <navLabel>
|
75
|
-
# <text>Nick Clegg and David Cameron agree key changes on NHS plans</text>
|
76
|
-
# </navLabel>
|
77
|
-
# <content src="001.html"/>
|
78
|
-
# <mbp:meta name="description">Deputy PM tells Andrew Marr show that GPs should not be forced to sign up to new commissioning consortiums</mbp:meta>
|
79
|
-
# <mbp:meta name="author">Nicholas Watt and Denis Campbell</mbp:meta>
|
80
|
-
# </navPoint>
|
81
|
-
# ####################################################################################
|
82
|
-
|
83
|
-
|
84
38
|
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.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,8 +12,8 @@ cert_chain: []
|
|
12
12
|
date: 2012-02-04 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
15
|
+
name: nokogiri
|
16
|
+
requirement: &2156313120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,24 +21,11 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
|
26
|
-
name: ruby-readability
|
27
|
-
requirement: &2155014220 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ! '>='
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '0'
|
33
|
-
type: :runtime
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *2155014220
|
36
|
-
description: kindler is a rubygem allow you to generate kindle mobi book from urls
|
37
|
-
very easily
|
24
|
+
version_requirements: *2156313120
|
25
|
+
description: kindler is a rubygem allow you to generate kindle mobi book very easily
|
38
26
|
email:
|
39
27
|
- mike.d.1984@gmail.com
|
40
|
-
executables:
|
41
|
-
- kindler
|
28
|
+
executables: []
|
42
29
|
extensions: []
|
43
30
|
extra_rdoc_files: []
|
44
31
|
files:
|
@@ -47,7 +34,6 @@ files:
|
|
47
34
|
- Guardfile
|
48
35
|
- Rakefile
|
49
36
|
- Readme.md
|
50
|
-
- bin/kindler
|
51
37
|
- kindler.gemspec
|
52
38
|
- lib/kindler.rb
|
53
39
|
- lib/kindler/railtie.rb
|
@@ -77,8 +63,7 @@ rubyforge_project: kindler
|
|
77
63
|
rubygems_version: 1.8.11
|
78
64
|
signing_key:
|
79
65
|
specification_version: 3
|
80
|
-
summary: kindler is a rubygem allow you to generate kindle mobi book
|
81
|
-
easily
|
66
|
+
summary: kindler is a rubygem allow you to generate kindle mobi book very easily
|
82
67
|
test_files:
|
83
68
|
- spec/cases/generator_spec.rb
|
84
69
|
- spec/spec_helper.rb
|
data/bin/kindler
DELETED
@@ -1,29 +0,0 @@
|
|
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
|
-
|