kindler 0.0.7 → 0.1.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/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
|
-
|