bookshelf 1.2.1 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +23 -19
- data/README.md +6 -43
- data/bookshelf.gemspec +3 -4
- data/lib/bookshelf.rb +5 -18
- data/lib/bookshelf/adapters/markdown.rb +2 -20
- data/lib/bookshelf/cli.rb +2 -32
- data/lib/bookshelf/dependency.rb +0 -8
- data/lib/bookshelf/exporter.rb +1 -5
- data/lib/bookshelf/generator.rb +7 -6
- data/lib/bookshelf/parser.rb +1 -9
- data/lib/bookshelf/parser/epub.rb +166 -93
- data/lib/bookshelf/parser/html.rb +25 -102
- data/lib/bookshelf/parser/pdf.rb +2 -29
- data/lib/bookshelf/stats.rb +0 -8
- data/lib/bookshelf/version.rb +1 -1
- data/templates/cover.erb +6 -4
- data/templates/epub.erb +2 -2
- data/templates/helper.rb +0 -29
- data/templates/layout.erb +9 -17
- data/templates/toc.erb +20 -0
- metadata +179 -189
- data/lib/bookshelf/errors.rb +0 -3
- data/lib/bookshelf/extensions/redcloth.rb +0 -69
- data/lib/bookshelf/extensions/string.rb +0 -11
- data/lib/bookshelf/parser/mobi.rb +0 -14
- data/lib/bookshelf/parser/txt.rb +0 -18
- data/lib/bookshelf/stream.rb +0 -27
- data/lib/bookshelf/syntax.rb +0 -124
- data/lib/bookshelf/toc.rb +0 -6
- data/lib/bookshelf/toc/epub.rb +0 -41
- data/lib/bookshelf/toc/html.rb +0 -78
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ca72a0bb5534f5505ce7a5a4ae4c20711b083ec7
|
4
|
+
data.tar.gz: c979a59886cf912e078431ef202da4256c03d7bc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 378336cfdd6f6658858b0a03c8a29efac014a33b6812ab3aa868c230e0ad572f6baa4b4df5357381f94803b37825ca1c5f83226d994bc1c2820889880dae6d63
|
7
|
+
data.tar.gz: e4094652e1759e850c1e14a79f89bc8e798e6c9ab28f74642c2ff2b65d030ab0a1735a1f76f7dd9b06460e29a14c3308e68d02309436ef717849282029da5187
|
data/Gemfile.lock
CHANGED
@@ -1,35 +1,36 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bookshelf (1.
|
5
|
-
RedCloth
|
4
|
+
bookshelf (1.2.3)
|
6
5
|
activesupport
|
7
|
-
coderay
|
8
|
-
eeepub-with-cover-support
|
9
6
|
i18n
|
7
|
+
maruku
|
10
8
|
nokogiri
|
11
9
|
notifier
|
12
|
-
|
10
|
+
rubyzip
|
11
|
+
sass
|
13
12
|
thor
|
14
13
|
|
15
14
|
GEM
|
16
15
|
remote: https://rubygems.org/
|
17
16
|
specs:
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
activesupport (4.1.0)
|
18
|
+
i18n (~> 0.6, >= 0.6.9)
|
19
|
+
json (~> 1.7, >= 1.7.7)
|
20
|
+
minitest (~> 5.1)
|
21
|
+
thread_safe (~> 0.1)
|
22
|
+
tzinfo (~> 1.1)
|
22
23
|
awesome_print (1.1.0)
|
23
|
-
builder (3.2.0)
|
24
24
|
coderay (1.0.9)
|
25
25
|
diff-lcs (1.2.2)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
i18n (0.6.4)
|
26
|
+
i18n (0.6.9)
|
27
|
+
json (1.8.1)
|
28
|
+
maruku (0.7.0)
|
30
29
|
method_source (0.8.1)
|
31
|
-
|
32
|
-
|
30
|
+
mini_portile (0.5.3)
|
31
|
+
minitest (5.3.2)
|
32
|
+
nokogiri (1.6.1)
|
33
|
+
mini_portile (~> 0.5.0)
|
33
34
|
notifier (0.4.1)
|
34
35
|
pry (0.9.12)
|
35
36
|
coderay (~> 1.0.5)
|
@@ -38,7 +39,6 @@ GEM
|
|
38
39
|
pry-nav (0.2.3)
|
39
40
|
pry (~> 0.9.10)
|
40
41
|
rake (10.0.4)
|
41
|
-
rdiscount (2.0.7.1)
|
42
42
|
rspec (2.13.0)
|
43
43
|
rspec-core (~> 2.13.0)
|
44
44
|
rspec-expectations (~> 2.13.0)
|
@@ -47,11 +47,15 @@ GEM
|
|
47
47
|
rspec-expectations (2.13.0)
|
48
48
|
diff-lcs (>= 1.1.3, < 2.0)
|
49
49
|
rspec-mocks (2.13.0)
|
50
|
-
rubyzip (
|
50
|
+
rubyzip (1.1.3)
|
51
|
+
sass (3.3.4)
|
51
52
|
slop (3.4.4)
|
52
53
|
test_notifier (1.0.1)
|
53
54
|
notifier
|
54
|
-
thor (0.
|
55
|
+
thor (0.19.1)
|
56
|
+
thread_safe (0.3.3)
|
57
|
+
tzinfo (1.1.0)
|
58
|
+
thread_safe (~> 0.1)
|
55
59
|
|
56
60
|
PLATFORMS
|
57
61
|
ruby
|
data/README.md
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
Bookshelf is a tool for the self-publishing of books. It is inspired by (and heavily based off) the excellent Kitabu gem [https://github.com/fnando/kitabu]().
|
4
4
|
|
5
5
|
## Features
|
6
|
-
* Generate HTML, PDF
|
6
|
+
* Generate HTML, PDF and ePub files
|
7
7
|
* Multi book support
|
8
|
-
* Write using Markdown
|
8
|
+
* Write using Markdown or plain HTML
|
9
9
|
* Book layout support
|
10
10
|
* Custom font support
|
11
11
|
* SCSS support
|
@@ -26,12 +26,6 @@ dependencies.
|
|
26
26
|
Prince XML: Converts HTML files into PDF files.
|
27
27
|
Installed.
|
28
28
|
|
29
|
-
KindleGen: Converts ePub e-books into .mobi files.
|
30
|
-
Installed.
|
31
|
-
|
32
|
-
html2text: Converts HTML documents into plain text.
|
33
|
-
Not installed.
|
34
|
-
|
35
29
|
There's no requirements here; just make sure you cleared the correct dependency based
|
36
30
|
on the formats you want to export to.
|
37
31
|
|
@@ -60,31 +54,13 @@ This command creates a directory `my_book` with the following structure:
|
|
60
54
|
│ ├── page.erb
|
61
55
|
└── html
|
62
56
|
└── layout.erb
|
63
|
-
|
57
|
+
|
64
58
|
|
65
59
|
Update `my_book/config/config.yml` to reflect the books title, author and other attributes.
|
66
60
|
|
67
61
|
## Authoring
|
68
62
|
|
69
|
-
Now, create the content for your book by creating markdown or
|
70
|
-
|
71
|
-
*Option 1 - Directories for chapters:*
|
72
|
-
|
73
|
-
my_book
|
74
|
-
└── text
|
75
|
-
├── 01_introduction
|
76
|
-
│ ├── 01_section_1.markdown
|
77
|
-
│ ├── 02_section_2.markdown
|
78
|
-
│ └── ...
|
79
|
-
├── 02_chapter_1
|
80
|
-
│ ├── 01_section_1.markdown
|
81
|
-
│ ├── 02_section_2.markdown
|
82
|
-
│ └── ...
|
83
|
-
├── 03_chapter_2
|
84
|
-
├── 04_chapter_3
|
85
|
-
└── ...
|
86
|
-
|
87
|
-
*Option 2 - Files for chapters:*
|
63
|
+
Now, create the content for your book by creating markdown or html files into the `my_book/text` directory. The order is determined by the numeric prefix assigned to the file.
|
88
64
|
|
89
65
|
my_book
|
90
66
|
└── text
|
@@ -96,33 +72,20 @@ Now, create the content for your book by creating markdown or textile files into
|
|
96
72
|
|
97
73
|
Note that you if the number of chapters in your book is likely to exceed 10, you should add an extra 0 to the front of the chapter directory/file names
|
98
74
|
|
99
|
-
Note that you can use any format you want at the same time. Just use one of the following extensions: `.html`, `.markdown`, `.mkdn` or `.
|
75
|
+
Note that you can use any format you want at the same time. Just use one of the following extensions: `.html`, `.markdown`, `.mkdn` or `.md`
|
100
76
|
|
101
77
|
## Exporting
|
102
78
|
|
103
79
|
You'll want to see your progress eventually; it's time for you to generate the book PDF. Just run the command `bookshelf export` and your book will be created in the `output` directory.
|
104
80
|
|
105
|
-
Bookshelf can generate a Table of Contents (TOC) based on your `h2
|
81
|
+
Bookshelf can generate a Table of Contents (TOC) based on your `h2` tags.
|
106
82
|
|
107
83
|
To print the TOC, you need to print a variable called `toc`, using the eRb tag.
|
108
84
|
|
109
85
|
<%= toc %>
|
110
86
|
|
111
|
-
## Markdown Processors
|
112
|
-
|
113
|
-
By default, RDiscount[http://github.com/rtomayko/rdiscount/tree/master] is the Markdown processor. However, you can switch to different implementations by simply installing any of the following processors:
|
114
|
-
|
115
|
-
* Maruku: https://rubygems.org/gems/maruku
|
116
|
-
* PEGMarkdown: https://rubygems.org/gems/rpeg-markdown
|
117
|
-
* BlueCloth: https://rubygems.org/gems/bluecloth
|
118
|
-
* Redcarpet: https://rubygems.org/gems/redcarpet
|
119
|
-
|
120
|
-
Note: RDiscount will always be installed as Bookshelf's dependency but only used when no
|
121
|
-
alternative library is available.
|
122
|
-
|
123
87
|
## References
|
124
88
|
|
125
|
-
* Textile: http://hobix.com/textile
|
126
89
|
* Markdown: http://daringfireball.net/projects/markdown/syntax
|
127
90
|
|
128
91
|
## License
|
data/bookshelf.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.authors = ["Brad Crawford"]
|
11
11
|
s.email = ["brad.robert.crawford@gmail.com"]
|
12
12
|
s.homepage = "https://bitbucket.org/bradcrawford/bookshelf"
|
13
|
-
s.summary = "A framework that generates PDF and e-Pub from Markdown,
|
13
|
+
s.summary = "A framework that generates PDF and e-Pub from Markdown, and HTML files."
|
14
14
|
s.description = s.summary
|
15
15
|
s.license = "MIT"
|
16
16
|
|
@@ -21,13 +21,12 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_dependency "activesupport"
|
23
23
|
s.add_dependency "nokogiri"
|
24
|
-
s.add_dependency "
|
25
|
-
s.add_dependency "rdiscount"
|
24
|
+
s.add_dependency "maruku"
|
26
25
|
s.add_dependency "i18n"
|
27
26
|
s.add_dependency "thor"
|
28
|
-
s.add_dependency "eeepub-with-cover-support"
|
29
27
|
s.add_dependency "notifier"
|
30
28
|
s.add_dependency "sass"
|
29
|
+
s.add_dependency "rubyzip"
|
31
30
|
|
32
31
|
s.add_development_dependency "rspec"
|
33
32
|
s.add_development_dependency "test_notifier"
|
data/lib/bookshelf.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "active_support/all"
|
2
2
|
require "digest/md5"
|
3
|
-
require "eeepub"
|
4
3
|
require "erb"
|
5
4
|
require "logger"
|
6
5
|
require "nokogiri"
|
@@ -8,42 +7,26 @@ require "notifier"
|
|
8
7
|
require "open3"
|
9
8
|
require "optparse"
|
10
9
|
require "ostruct"
|
11
|
-
require "RedCloth"
|
12
10
|
require "tempfile"
|
13
11
|
require "pathname"
|
14
12
|
require "thor"
|
15
13
|
require "thor/group"
|
16
14
|
require "yaml"
|
17
15
|
require "cgi"
|
18
|
-
|
19
|
-
%w[maruku peg_markdown bluecloth redcarpet rdiscount].each do |lib|
|
20
|
-
begin
|
21
|
-
require lib
|
22
|
-
break
|
23
|
-
rescue LoadError => e
|
24
|
-
next
|
25
|
-
end
|
26
|
-
end
|
16
|
+
require "maruku"
|
27
17
|
|
28
18
|
Encoding.default_internal = "utf-8"
|
29
19
|
Encoding.default_external = "utf-8"
|
30
20
|
|
31
21
|
module Bookshelf
|
32
|
-
require "bookshelf/extensions/string"
|
33
|
-
require "bookshelf/extensions/redcloth"
|
34
|
-
require "bookshelf/errors"
|
35
|
-
|
36
22
|
ROOT = Pathname.new(File.dirname(__FILE__) + "/..")
|
37
23
|
|
38
24
|
autoload :Version, "bookshelf/version"
|
39
25
|
autoload :Generator, "bookshelf/generator"
|
40
|
-
autoload :TOC, "bookshelf/toc"
|
41
26
|
autoload :Cli, "bookshelf/cli"
|
42
27
|
autoload :Markdown, "bookshelf/adapters/markdown"
|
43
28
|
autoload :Parser, "bookshelf/parser"
|
44
29
|
autoload :Exporter, "bookshelf/exporter"
|
45
|
-
autoload :Syntax, "bookshelf/syntax"
|
46
|
-
autoload :Stream, "bookshelf/stream"
|
47
30
|
autoload :Dependency, "bookshelf/dependency"
|
48
31
|
autoload :Stats, "bookshelf/stats"
|
49
32
|
|
@@ -61,4 +44,8 @@ module Bookshelf
|
|
61
44
|
def self.root_dir
|
62
45
|
@root_dir ||= Pathname.new(Dir.pwd)
|
63
46
|
end
|
47
|
+
|
48
|
+
def self.render_template(file, locals = {})
|
49
|
+
ERB.new(File.read(file)).result OpenStruct.new(locals).instance_eval{ binding }
|
50
|
+
end
|
64
51
|
end
|
@@ -1,34 +1,16 @@
|
|
1
1
|
module Bookshelf
|
2
2
|
class Markdown
|
3
3
|
# Supported Markdown libraries
|
4
|
-
|
5
|
-
MARKDOWN_LIBRARIES = %w[Maruku BlueCloth PEGMarkdown Redcarpet RDiscount]
|
4
|
+
MARKDOWN_LIBRARIES = %w[Maruku]
|
6
5
|
|
7
6
|
# Retrieve preferred Markdown processor.
|
8
|
-
# You'll need one of the following libraries:
|
9
|
-
#
|
10
|
-
# # RDiscount: https://rubygems.org/gems/rdiscount
|
11
|
-
# # Maruku: https://rubygems.org/gems/maruku
|
12
|
-
# # PEGMarkdown: https://rubygems.org/gems/rpeg-markdown
|
13
|
-
# # BlueCloth: https://rubygems.org/gems/bluecloth
|
14
|
-
# # Redcarpet: https://rubygems.org/gems/redcarpet
|
15
|
-
#
|
16
|
-
# Note: RDiscount will always be installed as Bookshelf's dependency but only used when no
|
17
|
-
# alternative library is available.
|
18
|
-
#
|
19
7
|
def self.engine
|
20
8
|
@engine ||= Object.const_get(MARKDOWN_LIBRARIES.find {|lib| Object.const_defined?(lib)})
|
21
9
|
end
|
22
10
|
|
23
11
|
# Convert Markdown to HTML.
|
24
12
|
def self.to_html(content)
|
25
|
-
|
26
|
-
when "Redcarpet"
|
27
|
-
render = Redcarpet::Render::HTML.new(:hard_wrap => true, :xhtml => true)
|
28
|
-
Redcarpet::Markdown.new(render).render(content)
|
29
|
-
else
|
30
|
-
engine.new(content).to_html
|
31
|
-
end
|
13
|
+
engine.new(content).to_html
|
32
14
|
end
|
33
15
|
end
|
34
16
|
end
|
data/lib/bookshelf/cli.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
module Bookshelf
|
3
3
|
class Cli < Thor
|
4
|
-
FORMATS = %w[pdf html epub
|
4
|
+
FORMATS = %w[pdf html epub]
|
5
5
|
check_unknown_options!
|
6
6
|
|
7
7
|
def self.exit_on_failure?
|
@@ -53,16 +53,6 @@ module Bookshelf
|
|
53
53
|
:installed => Bookshelf::Dependency.prince?
|
54
54
|
}
|
55
55
|
|
56
|
-
result << {
|
57
|
-
:description => "KindleGen: Converts ePub e-books into .mobi files.",
|
58
|
-
:installed => Bookshelf::Dependency.kindlegen?
|
59
|
-
}
|
60
|
-
|
61
|
-
result << {
|
62
|
-
:description => "html2text: Converts HTML documents into plain text.",
|
63
|
-
:installed => Bookshelf::Dependency.html2text?
|
64
|
-
}
|
65
|
-
|
66
56
|
result.each do |result|
|
67
57
|
text = color(result[:name], :blue)
|
68
58
|
text << "\n" << result[:description]
|
@@ -73,24 +63,6 @@ module Bookshelf
|
|
73
63
|
end
|
74
64
|
end
|
75
65
|
|
76
|
-
desc "permalinks", "List title permalinks"
|
77
|
-
|
78
|
-
def permalinks
|
79
|
-
html = Bookshelf::Parser::HTML.new(Bookshelf.root_dir).content
|
80
|
-
toc = Bookshelf::TOC::HTML.generate(html)
|
81
|
-
|
82
|
-
toc.toc.each do |options|
|
83
|
-
level = options[:level] - 1
|
84
|
-
title = " #{options[:text]}: "
|
85
|
-
permalink = "##{options[:permalink]}"
|
86
|
-
|
87
|
-
text = "*" * level
|
88
|
-
text << color(title, :blue)
|
89
|
-
text << color(permalink, :yellow)
|
90
|
-
say(text)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
66
|
desc "stats", "Display some stats about your e-book"
|
95
67
|
def stats
|
96
68
|
stats = Bookshelf::Stats.new(Bookshelf.root_dir)
|
@@ -99,9 +71,7 @@ module Bookshelf
|
|
99
71
|
"Chapters: #{stats.chapters}",
|
100
72
|
"Words: #{stats.words}",
|
101
73
|
"Images: #{stats.images}",
|
102
|
-
"Links: #{stats.links}"
|
103
|
-
"Footnotes: #{stats.footnotes}",
|
104
|
-
"Code blocks: #{stats.code_blocks}"
|
74
|
+
"Links: #{stats.links}"
|
105
75
|
].join("\n")
|
106
76
|
end
|
107
77
|
|
data/lib/bookshelf/dependency.rb
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
module Bookshelf
|
2
2
|
class Dependency
|
3
|
-
def self.kindlegen?
|
4
|
-
@kindlegen ||= `which kindlegen` && $?.success?
|
5
|
-
end
|
6
|
-
|
7
3
|
def self.prince?
|
8
4
|
@prince ||= `which prince` && $?.success?
|
9
5
|
end
|
10
|
-
|
11
|
-
def self.html2text?
|
12
|
-
@html2text ||= `which html2text` && $?.success?
|
13
|
-
end
|
14
6
|
end
|
15
7
|
end
|
data/lib/bookshelf/exporter.rb
CHANGED
@@ -34,16 +34,12 @@ module Bookshelf
|
|
34
34
|
|
35
35
|
export_assets
|
36
36
|
export_pdf = [nil, "pdf"].include?(options[:only])
|
37
|
-
export_epub = [nil, "
|
38
|
-
export_mobi = [nil, "mobi"].include?(options[:only])
|
39
|
-
export_txt = [nil, "txt"].include?(options[:only])
|
37
|
+
export_epub = [nil, "epub"].include?(options[:only])
|
40
38
|
|
41
39
|
exported = []
|
42
40
|
exported << Parser::HTML.parse(book_dir)
|
43
41
|
exported << Parser::PDF.parse(book_dir) if export_pdf && Dependency.prince?
|
44
42
|
exported << Parser::Epub.parse(book_dir) if export_epub
|
45
|
-
exported << Parser::Mobi.parse(book_dir) if export_mobi && Dependency.kindlegen?
|
46
|
-
exported << Parser::Txt.parse(book_dir) if export_txt && Dependency.html2text?
|
47
43
|
|
48
44
|
if exported.all?
|
49
45
|
color = :green
|
data/lib/bookshelf/generator.rb
CHANGED
@@ -20,9 +20,9 @@ module Bookshelf
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def copy_assets
|
23
|
-
copy_file "epub.scss"
|
24
|
-
copy_file "html.scss"
|
25
|
-
copy_file "
|
23
|
+
copy_file "epub.scss", "assets/styles/epub.scss"
|
24
|
+
copy_file "html.scss", "assets/styles/html.scss"
|
25
|
+
copy_file "_fonts.scss", "assets/styles/_fonts.scss"
|
26
26
|
empty_directory "assets/fonts"
|
27
27
|
empty_directory "assets/images"
|
28
28
|
end
|
@@ -36,9 +36,10 @@ module Bookshelf
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def copy_templates
|
39
|
-
copy_file "layout.erb"
|
40
|
-
copy_file "cover.erb"
|
41
|
-
copy_file "epub.erb"
|
39
|
+
copy_file "layout.erb", "templates/html/layout.erb"
|
40
|
+
copy_file "cover.erb", "templates/epub/cover.erb"
|
41
|
+
copy_file "epub.erb", "templates/epub/page.erb"
|
42
|
+
copy_file "toc.erb", "templates/epub/toc.erb"
|
42
43
|
end
|
43
44
|
|
44
45
|
def create_empty_directories
|
data/lib/bookshelf/parser.rb
CHANGED
@@ -5,14 +5,12 @@ module Bookshelf
|
|
5
5
|
autoload :HTML , "bookshelf/parser/html"
|
6
6
|
autoload :PDF , "bookshelf/parser/pdf"
|
7
7
|
autoload :Epub , "bookshelf/parser/epub"
|
8
|
-
autoload :Mobi , "bookshelf/parser/mobi"
|
9
|
-
autoload :Txt , "bookshelf/parser/txt"
|
10
8
|
|
11
9
|
class Base
|
12
10
|
# The e-book directory.
|
13
11
|
#
|
14
12
|
attr_accessor :book_dir
|
15
|
-
|
13
|
+
|
16
14
|
def self.parse(book_dir)
|
17
15
|
new(book_dir).parse
|
18
16
|
end
|
@@ -33,12 +31,6 @@ module Bookshelf
|
|
33
31
|
Bookshelf.config
|
34
32
|
end
|
35
33
|
|
36
|
-
# Render a eRb template using +locals+ as data seed.
|
37
|
-
#
|
38
|
-
def render_template(file, locals = {})
|
39
|
-
ERB.new(File.read(file)).result OpenStruct.new(locals).instance_eval{ binding }
|
40
|
-
end
|
41
|
-
|
42
34
|
def spawn_command(cmd)
|
43
35
|
begin
|
44
36
|
stdout_and_stderr, status = Open3.capture2e(*cmd)
|