docrails_kindle 0.0.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.
- data/README.markdown +47 -0
- data/Rakefile +71 -0
- data/bin/docrails_kindle +110 -0
- data/docrails_kindle.gemspec +25 -0
- data/images/screen1-sm.gif +0 -0
- data/images/screen1.gif +0 -0
- data/mobi/rails-guide.2012-01-18.mobi +0 -0
- metadata +75 -0
data/README.markdown
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# docrails_kindle
|
2
|
+
|
3
|
+
This gem lets you generate a Kindle version of the [Ruby on Rails Guides][railsguide] with
|
4
|
+
working section and article navigation.
|
5
|
+
|
6
|
+
[railsguide]:http://guides.rubyonrails.org/
|
7
|
+
|
8
|
+
## Install
|
9
|
+
|
10
|
+
gem install docrails_kindle
|
11
|
+
|
12
|
+
## Prerequisistes
|
13
|
+
|
14
|
+
Download [KindleGen 2][kindlegen] and put it on your PATH.
|
15
|
+
|
16
|
+
[kindlegen]:http://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000234621
|
17
|
+
|
18
|
+
## How to use
|
19
|
+
|
20
|
+
gem install railsguides_kindle
|
21
|
+
git clone git@github.com:lifo/docrails.git
|
22
|
+
cd docrails/railties/guides
|
23
|
+
KINDLE=1 rake generate_guides
|
24
|
+
cd output/kindle
|
25
|
+
docrails_kindle
|
26
|
+
|
27
|
+
The output document will be called something like
|
28
|
+
`rails-guide.2012-11-18.mobi`. Don't confuse it with the other mobi document
|
29
|
+
that gets generated by `rake genereate_guides`, which looks like
|
30
|
+
`ruby_on_rails_guides_16c5f48.mobi`.
|
31
|
+
|
32
|
+
You can transfer this mobi file to your Kindle.
|
33
|
+
|
34
|
+
|
35
|
+
## Contribute
|
36
|
+
|
37
|
+
This program is a rough prototype. Some internal links may not work. Other
|
38
|
+
defects in the resulting ebook may exist. Please file issues.
|
39
|
+
|
40
|
+
Also, if the `docsrails` team would like to incorporate this into their
|
41
|
+
`rake` tasks code, please take and modify my code as you see fit.
|
42
|
+
|
43
|
+
|
44
|
+
## Author
|
45
|
+
|
46
|
+
Daniel Choi http://github.com/danchoi
|
47
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'bundler'
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
|
7
|
+
|
8
|
+
desc "release and build and push new website"
|
9
|
+
task :push => [:release, :web]
|
10
|
+
|
11
|
+
desc "Bumps version number up one and git commits"
|
12
|
+
task :bump do
|
13
|
+
basefile = "lib/vmail/version.rb"
|
14
|
+
file = File.read(basefile)
|
15
|
+
oldver = file[/VERSION = '(\d.\d.\d)'/, 1]
|
16
|
+
newver_i = oldver.gsub(".", '').to_i + 1
|
17
|
+
newver = ("%.3d" % newver_i).split(//).join('.')
|
18
|
+
puts oldver
|
19
|
+
puts newver
|
20
|
+
puts "Bumping version: #{oldver} => #{newver}"
|
21
|
+
newfile = file.gsub("VERSION = '#{oldver}'", "VERSION = '#{newver}'")
|
22
|
+
File.open(basefile, 'w') {|f| f.write newfile}
|
23
|
+
`git commit -am 'Bump'`
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
desc "build and push website"
|
28
|
+
task :web => :build_webpage do
|
29
|
+
puts "Building and pushing website"
|
30
|
+
Dir.chdir "../project-webpages" do
|
31
|
+
`scp out/vmail.html zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
|
32
|
+
`rsync -avz out/images-vmail zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
|
33
|
+
`rsync -avz out/stylesheets zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
|
34
|
+
`rsync -avz out/lightbox2 zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
|
35
|
+
end
|
36
|
+
`open http://danielchoi.com/software/vmail.html`
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "build webpage"
|
40
|
+
task :build_webpage do
|
41
|
+
`cp README.markdown ../project-webpages/src/vmail.README.markdown`
|
42
|
+
`cp coverage.markdown ../project-webpages/src/vmail.coverage.markdown`
|
43
|
+
Dir.chdir "../project-webpages" do
|
44
|
+
puts `ruby gen.rb vmail #{Vmail::VERSION}`
|
45
|
+
#`open out/vmail.html`
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
desc "git push and rake release bumped version"
|
51
|
+
task :bumped do
|
52
|
+
puts `git push && rake release`
|
53
|
+
Rake::Task["web"].execute
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "Run tests"
|
57
|
+
task :test do
|
58
|
+
$:.unshift File.expand_path("test")
|
59
|
+
require 'test_helper'
|
60
|
+
Dir.chdir("test") do
|
61
|
+
Dir['*_test.rb'].each do |x|
|
62
|
+
puts "requiring #{x}"
|
63
|
+
require x
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
MiniTest::Unit.autorun
|
68
|
+
end
|
69
|
+
|
70
|
+
task :default => :test
|
71
|
+
|
data/bin/docrails_kindle
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# take toc.ncx
|
4
|
+
|
5
|
+
require 'nokogiri'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'yaml'
|
8
|
+
require 'date'
|
9
|
+
|
10
|
+
# Get html pages in document order
|
11
|
+
|
12
|
+
html_pages = Nokogiri::XML(File.read("toc.ncx")).search("navMap//content[@src]").map {|c| c[:src]}.uniq
|
13
|
+
|
14
|
+
frontmatter = []
|
15
|
+
|
16
|
+
html_pages.delete_if {|x|
|
17
|
+
# we need to treat frontmatter differently
|
18
|
+
if x =~ /(toc|welcome|credits|copyright).html/
|
19
|
+
frontmatter << x unless x =~ /toc/
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
}
|
24
|
+
|
25
|
+
puts "=> Making one section for all frontmatter."
|
26
|
+
html = frontmatter.map {|x|
|
27
|
+
Nokogiri::HTML(File.open(x)).at("body").inner_html
|
28
|
+
}.join("\n")
|
29
|
+
|
30
|
+
fdoc = Nokogiri::HTML(html)
|
31
|
+
|
32
|
+
# need to turn author h3's into h4's
|
33
|
+
fdoc.search("h3").each { |h3|
|
34
|
+
if h3[:class] != 'section'
|
35
|
+
h3.name = 'h4'
|
36
|
+
else # add an id
|
37
|
+
h3['id'] = h3.inner_text.gsub(/\s/, '-')
|
38
|
+
end
|
39
|
+
}
|
40
|
+
fdoc.search("h2").each { |h2|
|
41
|
+
h2.name = 'h3'
|
42
|
+
h2['id'] = h2.inner_text.gsub(/\s/, '-')
|
43
|
+
}
|
44
|
+
|
45
|
+
head = Nokogiri::XML::Node.new "head", fdoc
|
46
|
+
title_node = Nokogiri::XML::Node.new "title", fdoc
|
47
|
+
title_node.content = "Frontmatter"
|
48
|
+
title_node.parent = head
|
49
|
+
fdoc.at("body").before head
|
50
|
+
File.open("frontmatter.html",'w'){|f| f.puts fdoc.to_html}
|
51
|
+
|
52
|
+
html_pages.unshift "frontmatter.html"
|
53
|
+
|
54
|
+
puts "=> Making one section folder per original HTML file"
|
55
|
+
|
56
|
+
html_pages.each_with_index { |page, section_idx|
|
57
|
+
FileUtils::mkdir_p("sections/%03d" % section_idx)
|
58
|
+
doc = Nokogiri::HTML(File.open(page))
|
59
|
+
title = doc.at("title").inner_text.gsub("Ruby on Rails Guides: ", '')
|
60
|
+
title = page.capitalize.gsub('.html', '') if title.strip == ''
|
61
|
+
File.open("sections/%03d/_section.txt" % section_idx, 'w') {|f| f.puts title}
|
62
|
+
puts "sections/%03d -> #{title}" % section_idx
|
63
|
+
|
64
|
+
# Fragment the page file into subsections
|
65
|
+
doc.xpath("//h3[@id]").each_with_index { |h3,item_idx|
|
66
|
+
subsection = h3.inner_text
|
67
|
+
content = h3.xpath("./following-sibling::*").take_while {|x| x.name != "h3"}.map {|x| x.to_html}
|
68
|
+
item = Nokogiri::HTML(h3.to_html + content.join("\n"))
|
69
|
+
item_path = "sections/%03d/%03d.html" % [section_idx, item_idx]
|
70
|
+
|
71
|
+
# add head node and title node
|
72
|
+
head = Nokogiri::XML::Node.new "head", item
|
73
|
+
title_node = Nokogiri::XML::Node.new "title", item
|
74
|
+
title_node.content = subsection
|
75
|
+
title_node.parent = head
|
76
|
+
item.at("body").before head
|
77
|
+
|
78
|
+
# fix all image links
|
79
|
+
item.search("img").each { |img|
|
80
|
+
img['src'] = "#{Dir.pwd}/#{img['src']}"
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
File.open(item_path, 'w'){|f| f.puts item.to_html}
|
85
|
+
puts " #{item_path} -> #{subsection}"
|
86
|
+
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
puts "=> Generating _document.yml"
|
91
|
+
|
92
|
+
|
93
|
+
x = Nokogiri::XML(File.open("rails_guides.opf")).remove_namespaces!
|
94
|
+
|
95
|
+
document = {
|
96
|
+
'doc_uuid' => x.at("package")['unique-identifier'],
|
97
|
+
'title' => x.at("title").inner_text,
|
98
|
+
'publisher' => x.at("publisher").inner_text,
|
99
|
+
'author' => x.at("creator").inner_text,
|
100
|
+
'subject' => x.at("subject").inner_text,
|
101
|
+
'date' => x.at("date").inner_text,
|
102
|
+
'cover' => x.at("item[@id=cover]")[:href],
|
103
|
+
'masthead' => x.at("item[@id=cover]")[:href],
|
104
|
+
'mobi_outfile' => "rails-guide.#{Date.today.to_s}.mobi"
|
105
|
+
}
|
106
|
+
puts document.inspect
|
107
|
+
File.open("_document.yml", 'w'){|f| f.puts document.to_yaml}
|
108
|
+
|
109
|
+
exec "kindlerb ."
|
110
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "docrails_kindle"
|
6
|
+
s.version = '0.0.1'
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.required_ruby_version = '>= 1.9.0'
|
9
|
+
|
10
|
+
s.authors = ["Daniel Choi"]
|
11
|
+
s.email = ["dhchoi@gmail.com"]
|
12
|
+
s.homepage = "http://github.com/danchoi/docrails_kindle"
|
13
|
+
s.summary = %q{Read Rails Guides for your Kindle}
|
14
|
+
s.description = %q{Read Rails Guides for your Kindle}
|
15
|
+
|
16
|
+
s.rubyforge_project = "docrails_kindle"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_dependency 'nokogiri'
|
24
|
+
s.add_dependency 'kindlerb'
|
25
|
+
end
|
Binary file
|
data/images/screen1.gif
ADDED
Binary file
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: docrails_kindle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Daniel Choi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-18 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: &9708860 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *9708860
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: kindlerb
|
27
|
+
requirement: &9708360 !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: *9708360
|
36
|
+
description: Read Rails Guides for your Kindle
|
37
|
+
email:
|
38
|
+
- dhchoi@gmail.com
|
39
|
+
executables:
|
40
|
+
- docrails_kindle
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- README.markdown
|
45
|
+
- Rakefile
|
46
|
+
- bin/docrails_kindle
|
47
|
+
- docrails_kindle.gemspec
|
48
|
+
- images/screen1-sm.gif
|
49
|
+
- images/screen1.gif
|
50
|
+
- mobi/rails-guide.2012-01-18.mobi
|
51
|
+
homepage: http://github.com/danchoi/docrails_kindle
|
52
|
+
licenses: []
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.9.0
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project: docrails_kindle
|
71
|
+
rubygems_version: 1.8.10
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: Read Rails Guides for your Kindle
|
75
|
+
test_files: []
|