bookmaker 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +1 -0
- data/bookmaker.gemspec +8 -4
- data/lib/bookmaker/generator.rb +9 -4
- data/lib/bookmaker/parser/epub.rb +45 -19
- data/lib/bookmaker/parser/html.rb +39 -31
- data/lib/bookmaker/version.rb +1 -1
- data/templates/back.erb +22 -0
- data/templates/config.erb +18 -7
- data/templates/copyright.erb +46 -0
- data/templates/{cover.html → cover.erb} +1 -1
- data/templates/extras.tex +1 -0
- data/templates/latex.erb +115 -63
- data/templates/rakefile.rb +103 -0
- data/templates/user.css +6 -0
- metadata +60 -46
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0c8b1d582a901ba759895f7f49d1202d67b19cd3
|
4
|
+
data.tar.gz: bde5a00f50c3f462050acc839ff117828d5dda43
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 24f58f0999ceea22446566b1aa81a207c1a2a4cea87cdffe9114668ae535b18fdec10176629e881a53670b4b9aa05eba46c8c4adc6c232f88cdb7c52f109fa79
|
7
|
+
data.tar.gz: f503abfa57f9e1ec655578e4ea65a36e24e8f7845b9cdba79cfee3f7df83883e497b6845162d095a2a7746cdd1c2815e766ea5abe607087c7c51808304c0fa66
|
data/Rakefile
CHANGED
data/bookmaker.gemspec
CHANGED
@@ -7,9 +7,9 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Bookmaker::VERSION
|
8
8
|
s.authors = ["Merovex"]
|
9
9
|
s.email = ["dausha@gmail.com"]
|
10
|
-
s.homepage = "http://dausha.net"
|
11
|
-
s.summary = %q{
|
12
|
-
s.description = %q{
|
10
|
+
s.homepage = "http://dausha.net/bookmaker"
|
11
|
+
s.summary = %q{Bookmaker is a Ruby & LaTeX based production toolchain for self-publishers.}
|
12
|
+
s.description = %q{Bookmaker provides authors a free, ruby-based production toolchain for self-published paper and electronic books using the LaTeX document preparation system.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "bookmaker"
|
15
15
|
|
@@ -18,13 +18,17 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
+
# https://github.com/technicalpickles/jeweler
|
22
|
+
|
21
23
|
# specify any dependencies here; for example:
|
22
24
|
s.add_dependency "activesupport"
|
23
25
|
s.add_development_dependency "aruba"
|
24
26
|
s.add_development_dependency "cucumber"
|
27
|
+
s.add_dependency "rubyzip"
|
28
|
+
s.add_dependency "zip-zip"
|
25
29
|
s.add_dependency "eeepub"
|
26
30
|
s.add_dependency "kramdown"
|
27
31
|
s.add_dependency "thor"
|
28
32
|
s.add_dependency "nokogiri"
|
29
33
|
s.add_dependency "notifier"
|
30
|
-
end
|
34
|
+
end
|
data/lib/bookmaker/generator.rb
CHANGED
@@ -4,7 +4,7 @@ module Bookmaker
|
|
4
4
|
def self.source_root
|
5
5
|
File.dirname(__FILE__) + "/../../templates"
|
6
6
|
end
|
7
|
-
def build_config_file
|
7
|
+
def build_config_file
|
8
8
|
@title = File.basename(destination_root).gsub('-', ' ')
|
9
9
|
@name = full_name
|
10
10
|
@uid = Digest::MD5.hexdigest("#{Time.now}--#{rand}")
|
@@ -14,16 +14,21 @@ module Bookmaker
|
|
14
14
|
def copy_templates
|
15
15
|
copy_file "latex.erb", "templates/pdf/layout.erb"
|
16
16
|
copy_file "dp-logo.png", "images/dp-logo.png"
|
17
|
-
|
17
|
+
|
18
18
|
copy_file "html.erb", "templates/html/layout.erb"
|
19
19
|
copy_file "user.css", "templates/html/user.css"
|
20
20
|
copy_file "layout.css", "templates/html/layout.css"
|
21
21
|
copy_file "syntax.css", "templates/html/syntax.css"
|
22
|
-
|
23
|
-
copy_file "
|
22
|
+
|
23
|
+
copy_file "back.erb", "templates/epub/back.erb"
|
24
|
+
copy_file "copyright.erb", "templates/epub/copyright.erb"
|
25
|
+
copy_file "cover.erb", "templates/epub/cover.erb"
|
24
26
|
copy_file "epub.erb", "templates/epub/page.erb"
|
25
27
|
copy_file "epub.css", "templates/epub/user.css"
|
26
28
|
copy_file "cover.jpg", "images/cover.jpg"
|
29
|
+
copy_file "rakefile.rb", "Rakefile"
|
30
|
+
copy_file "extras.tex", "extras/characters.tex"
|
31
|
+
copy_file "extras.tex", "extras/dedicationls.tex"
|
27
32
|
end
|
28
33
|
def copy_sample_text
|
29
34
|
copy_file "sample.tex" , "text/01_First-Chapter/01-Welcome.tex"
|
@@ -27,19 +27,49 @@ module Bookmaker
|
|
27
27
|
else
|
28
28
|
epub.cover cover_image
|
29
29
|
end
|
30
|
+
write_coverpage!
|
31
|
+
write_copyright!
|
30
32
|
write_sections!
|
33
|
+
write_backpage!
|
31
34
|
write_toc!
|
32
|
-
epub.files cover_page
|
35
|
+
epub.files cover_page + sections.map(&:filepath) + back_page + copyright_page + assets
|
33
36
|
epub.nav navigation
|
34
|
-
|
37
|
+
|
35
38
|
epub.save(epub_path)
|
36
39
|
true
|
37
40
|
rescue Exception
|
38
41
|
p $!, $@
|
39
42
|
false
|
40
43
|
end
|
44
|
+
def back_page
|
45
|
+
return Dir[back_path] if File.exist?(back_path)
|
46
|
+
[]
|
47
|
+
end
|
41
48
|
def cover_page
|
42
|
-
Dir[
|
49
|
+
Dir[cover_path]
|
50
|
+
end
|
51
|
+
def copyright_page
|
52
|
+
Dir[copyright_path]
|
53
|
+
end
|
54
|
+
def write_backpage!
|
55
|
+
contents = render_template(root_dir.join("templates/epub/back.html"), config)
|
56
|
+
File.open(back_path,"w") do |file|
|
57
|
+
file << contents
|
58
|
+
end
|
59
|
+
end
|
60
|
+
def write_coverpage!
|
61
|
+
contents = render_template(root_dir.join("templates/epub/cover.html"), config)
|
62
|
+
File.open(cover_path,"w") do |file|
|
63
|
+
file << contents
|
64
|
+
end
|
65
|
+
end
|
66
|
+
def write_copyright!
|
67
|
+
contents = render_template(root_dir.join("templates/html/copyright.erb"), config)
|
68
|
+
# File.open('help.html','w').write(contents)
|
69
|
+
File.open(copyright_path,"w") do |file|
|
70
|
+
file << contents
|
71
|
+
# puts file
|
72
|
+
end
|
43
73
|
end
|
44
74
|
def write_toc!
|
45
75
|
toc = TOC::Epub.new(navigation)
|
@@ -79,21 +109,16 @@ module Bookmaker
|
|
79
109
|
end
|
80
110
|
|
81
111
|
FileUtils.mkdir_p(tmp_dir)
|
82
|
-
|
83
|
-
# Save file to disk.
|
84
|
-
#
|
85
112
|
File.open(section.filepath, "w") do |file|
|
86
113
|
body = section.html.css("body").to_xhtml.gsub(%r[<body>(.*?)</body>]m, "\\1")
|
87
114
|
file << render_chapter(body)
|
88
115
|
end
|
89
116
|
end
|
90
117
|
end
|
91
|
-
|
92
118
|
def render_chapter(content)
|
93
119
|
locals = config.merge(:content => content)
|
94
120
|
render_template(template_path, locals)
|
95
121
|
end
|
96
|
-
|
97
122
|
def assets
|
98
123
|
@assets ||= begin
|
99
124
|
assets = Dir[root_dir.join("templates/epub/*.css")]
|
@@ -101,40 +126,41 @@ module Bookmaker
|
|
101
126
|
assets
|
102
127
|
end
|
103
128
|
end
|
104
|
-
|
105
129
|
def cover_image
|
106
|
-
path = Dir[root_dir.join("images/cover.{jpg,png,gif}").to_s].first
|
130
|
+
path = Dir[root_dir.join("images/cover-#{name}.{jpg,png,gif}").to_s.downcase].first
|
107
131
|
return File.basename(path) if path && File.exist?(path)
|
108
132
|
end
|
109
|
-
|
110
133
|
def navigation
|
111
|
-
sections.map do |section|
|
112
|
-
{
|
134
|
+
sections.map do |section| {
|
113
135
|
:label => section.html.css("h2:first-of-type").text,
|
114
136
|
:content => section.filename
|
115
137
|
}
|
116
138
|
end
|
117
139
|
end
|
118
|
-
|
119
140
|
def template_path
|
120
141
|
root_dir.join("templates/epub/page.erb")
|
121
142
|
end
|
122
|
-
|
123
143
|
def html_path
|
124
144
|
root_dir.join("output/#{name}.html")
|
125
145
|
end
|
126
|
-
|
127
146
|
def epub_path
|
128
147
|
root_dir.join("output/#{name}.epub")
|
129
148
|
end
|
130
|
-
|
131
149
|
def tmp_dir
|
132
150
|
root_dir.join("output/tmp")
|
133
151
|
end
|
134
|
-
|
152
|
+
def cover_path
|
153
|
+
tmp_dir.join("cover.html")
|
154
|
+
end
|
155
|
+
def back_path
|
156
|
+
tmp_dir.join("back.html")
|
157
|
+
end
|
158
|
+
def copyright_path
|
159
|
+
tmp_dir.join("copyright.html")
|
160
|
+
end
|
135
161
|
def toc_path
|
136
162
|
tmp_dir.join("toc.html")
|
137
163
|
end
|
138
164
|
end
|
139
165
|
end
|
140
|
-
end
|
166
|
+
end
|
@@ -26,7 +26,7 @@ module Bookmaker
|
|
26
26
|
:contents => toc.content,
|
27
27
|
:toc => toc.to_html,
|
28
28
|
})
|
29
|
-
output = render_template(root_dir.join("templates/html/layout.erb"), locals)
|
29
|
+
output = render_template(root_dir.join("templates/html/layout.erb"), locals)
|
30
30
|
f = File.open(root_dir.join("output/#{name}.html"), 'w')
|
31
31
|
f.write(output)
|
32
32
|
f.close
|
@@ -40,20 +40,28 @@ module Bookmaker
|
|
40
40
|
chapters.each do |text|
|
41
41
|
# text.gsub!("{%", "{")
|
42
42
|
# text.gsub!(/%.*/,'')
|
43
|
+
text = text.split("\n\n").map{|s| s.gsub("\n", " ")}.join("\n\n")
|
43
44
|
text.gsub!(/``(.*?'?)''/) { "“#{$1}”"}
|
45
|
+
text.gsub!(/``(.*?'?)"/) { "“#{$1}”"}
|
44
46
|
text.gsub!(/``/, "“")
|
45
47
|
text.gsub!(/\b'\b/) { "'" }
|
46
48
|
text.gsub!(/`(.*?)'/) { "‘#{$1}’"}
|
47
49
|
# \{([^\}]+?)\} Within the curly braces.
|
50
|
+
text.gsub!(/\\pf?break\{\}/,"<hr />")
|
51
|
+
text.gsub!(/\\ldots\{\}/,"…")
|
48
52
|
text.gsub!(/\\Dash\{\}/, "—")
|
49
53
|
text.gsub!(/\\begin\{quote\}(.*?)\\end\{quote\}/m) { "<blockquote>#{$1.strip}</blockquote>"}
|
50
54
|
text.gsub!(/<\/blockquote>\s+?<blockquote>/m, "\n")
|
51
55
|
text.gsub!(/\\begin\{([^\}]+?)\}(.*?)\\end\{[^\}]+?\}/m) { "<div class='#{$1.strip}'>#{$2.strip}</div>"}
|
52
56
|
text.gsub!(/\\section\{([^\}]+?)\}/m) { "<h3>#{$1.strip}</h3>"}
|
57
|
+
['Character','Equipment'].each do |s|
|
58
|
+
text.gsub!(/\\#{s}\{[^\}]+?\}\{([^\}]+?)\}/) { "<span class='#{s}'>#{$1.strip}</span>"}
|
59
|
+
text.gsub!(/\\#{s}\{([^\}]+?)\}/) { "<span class='#{s.downcase}'>#{$1.strip}</span>"}
|
60
|
+
end
|
53
61
|
text.gsub!(/\\emph\{([^\}]+?)\}/m) { "<em>#{$1.strip}</em>"}
|
54
62
|
text.gsub!(/\\thought\{([^\}]+?)\}/m) { "<em>#{$1.strip}</em>"}
|
55
|
-
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1}'>#{$2.strip}</span>"}
|
56
|
-
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1}'>#{$2.strip}</span>"}
|
63
|
+
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1.downcase}'>#{$2.strip}</span>"}
|
64
|
+
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1.downcase}'>#{$2.strip}</span>"}
|
57
65
|
text.gsub!(/<\/span>\{[^\}]+?}/, "</span>")
|
58
66
|
text.gsub!(/<p><h([1-6])>(.*?)<\/h[1-6]><\/p>/) { "<h#{$1}>#{$2.strip}</h#{$1}>"}
|
59
67
|
text.gsub!(/(\S+)~(\S+)/) { "#{$1} #{$2}"}
|
@@ -67,28 +75,28 @@ module Bookmaker
|
|
67
75
|
# # List of directories that should be skipped.
|
68
76
|
# #
|
69
77
|
# IGNORE_DIR = %w[. .. .svn]
|
70
|
-
#
|
78
|
+
#
|
71
79
|
# # Files that should be skipped.
|
72
80
|
# #
|
73
81
|
# IGNORE_FILES = /^(CHANGELOG|TOC)\..*?$/
|
74
|
-
#
|
82
|
+
#
|
75
83
|
# # List of recognized extensions.
|
76
84
|
# #
|
77
85
|
# EXTENSIONS = %w[md mkdn markdown]
|
78
|
-
#
|
86
|
+
#
|
79
87
|
# class << self
|
80
88
|
# # The footnote index control. We have to manipulate footnotes
|
81
89
|
# # because each chapter starts from 1, so we have duplicated references.
|
82
90
|
# #
|
83
91
|
# attr_accessor :footnote_index
|
84
92
|
# end
|
85
|
-
#
|
93
|
+
#
|
86
94
|
# # Parse all files and save the parsed content
|
87
95
|
# # to <tt>output/book_name.html</tt>.
|
88
96
|
# #
|
89
97
|
# def parse
|
90
98
|
# reset_footnote_index!
|
91
|
-
#
|
99
|
+
#
|
92
100
|
# # File.open(root_dir.join("output/#{name}.html"), "w") do |file|
|
93
101
|
# # file << parse_layout(content)
|
94
102
|
# # end
|
@@ -96,11 +104,11 @@ module Bookmaker
|
|
96
104
|
# rescue Exception
|
97
105
|
# false
|
98
106
|
# end
|
99
|
-
#
|
107
|
+
#
|
100
108
|
# def reset_footnote_index!
|
101
109
|
# self.class.footnote_index = 1
|
102
110
|
# end
|
103
|
-
#
|
111
|
+
#
|
104
112
|
# private
|
105
113
|
# def chapter_files(entry)
|
106
114
|
# # Chapters can be files outside a directory.
|
@@ -110,34 +118,34 @@ module Bookmaker
|
|
110
118
|
# Dir.glob("#{entry}/**/*.{#{EXTENSIONS.join(",")}}").sort
|
111
119
|
# end
|
112
120
|
# end
|
113
|
-
#
|
121
|
+
#
|
114
122
|
# # Check if path is a valid entry.
|
115
123
|
# # Files/directories that start with a dot or underscore will be skipped.
|
116
124
|
# #
|
117
125
|
# def valid_entry?(entry)
|
118
126
|
# entry !~ /^(\.|_)/ && (valid_directory?(entry) || valid_file?(entry))
|
119
127
|
# end
|
120
|
-
#
|
128
|
+
#
|
121
129
|
# # Check if path is a valid directory.
|
122
130
|
# #
|
123
131
|
# def valid_directory?(entry)
|
124
132
|
# File.directory?(source.join(entry)) && !IGNORE_DIR.include?(File.basename(entry))
|
125
133
|
# end
|
126
|
-
#
|
134
|
+
#
|
127
135
|
# # Check if path is a valid file.
|
128
136
|
# #
|
129
137
|
# def valid_file?(entry)
|
130
138
|
# ext = File.extname(entry).gsub(/\./, "").downcase
|
131
139
|
# File.file?(source.join(entry)) && EXTENSIONS.include?(ext) && entry !~ IGNORE_FILES
|
132
140
|
# end
|
133
|
-
#
|
141
|
+
#
|
134
142
|
# # Render +file+ considering its extension.
|
135
143
|
# #
|
136
144
|
# def render_file(file, plain_syntax = false)
|
137
145
|
# file_format = format(file)
|
138
|
-
#
|
146
|
+
#
|
139
147
|
# content = Bookmaker::Syntax.render(root_dir, file_format, File.read(file), plain_syntax)
|
140
|
-
#
|
148
|
+
#
|
141
149
|
# content = case file_format
|
142
150
|
# when :markdown
|
143
151
|
# Markdown.to_html(content)
|
@@ -146,42 +154,42 @@ module Bookmaker
|
|
146
154
|
# else
|
147
155
|
# content
|
148
156
|
# end
|
149
|
-
#
|
157
|
+
#
|
150
158
|
# render_footnotes(content, plain_syntax)
|
151
159
|
# end
|
152
|
-
#
|
160
|
+
#
|
153
161
|
# def render_footnotes(content, plain_syntax = false)
|
154
162
|
# html = Nokogiri::HTML(content)
|
155
163
|
# footnotes = html.css("p[id^='fn']")
|
156
|
-
#
|
164
|
+
#
|
157
165
|
# return content if footnotes.empty?
|
158
|
-
#
|
166
|
+
#
|
159
167
|
# reset_footnote_index! unless self.class.footnote_index
|
160
|
-
#
|
168
|
+
#
|
161
169
|
# footnotes.each do |fn|
|
162
170
|
# index = self.class.footnote_index
|
163
171
|
# actual_index = fn["id"].gsub(/[^\d]/, "")
|
164
|
-
#
|
172
|
+
#
|
165
173
|
# fn.set_attribute("id", "_fn#{index}")
|
166
|
-
#
|
174
|
+
#
|
167
175
|
# html.css("a[href='#fn#{actual_index}']").each do |link|
|
168
176
|
# link.set_attribute("href", "#_fn#{index}")
|
169
177
|
# end
|
170
|
-
#
|
178
|
+
#
|
171
179
|
# html.css("a[href='#fnr#{actual_index}']").each do |link|
|
172
180
|
# link.set_attribute("href", "#_fnr#{index}")
|
173
181
|
# end
|
174
|
-
#
|
182
|
+
#
|
175
183
|
# html.css("[id=fnr#{actual_index}]").each do |tag|
|
176
184
|
# tag.set_attribute("id", "_fnr#{index}")
|
177
185
|
# end
|
178
|
-
#
|
186
|
+
#
|
179
187
|
# self.class.footnote_index += 1
|
180
188
|
# end
|
181
|
-
#
|
189
|
+
#
|
182
190
|
# html.css("body").inner_html
|
183
191
|
# end
|
184
|
-
#
|
192
|
+
#
|
185
193
|
# def format(file)
|
186
194
|
# case File.extname(file).downcase
|
187
195
|
# when ".markdown", ".mkdn", ".md"
|
@@ -192,7 +200,7 @@ module Bookmaker
|
|
192
200
|
# :html
|
193
201
|
# end
|
194
202
|
# end
|
195
|
-
#
|
203
|
+
#
|
196
204
|
# # Parse layout file, making available all configuration entries.
|
197
205
|
# #
|
198
206
|
# def parse_layout(html)
|
@@ -205,7 +213,7 @@ module Bookmaker
|
|
205
213
|
# })
|
206
214
|
# render_template(root_dir.join("templates/html/layout.erb"), locals)
|
207
215
|
# end
|
208
|
-
#
|
216
|
+
#
|
209
217
|
# # Render changelog file.
|
210
218
|
# # This file can be used to inform any book change.
|
211
219
|
# #
|
@@ -214,7 +222,7 @@ module Bookmaker
|
|
214
222
|
# return render_file(changelog) if changelog
|
215
223
|
# nil
|
216
224
|
# end
|
217
|
-
#
|
225
|
+
#
|
218
226
|
# # Render all +files+ from a given chapter.
|
219
227
|
# #
|
220
228
|
# def render_chapter(files, plain_syntax = false)
|
data/lib/bookmaker/version.rb
CHANGED
data/templates/back.erb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<title>Back Page</title>
|
5
|
+
<style type="text/css"> img { max-width: 100%; } </style>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<div class="copyright">
|
9
|
+
|
10
|
+
<h2 class="no-toc"><%= title %></h2>
|
11
|
+
|
12
|
+
<p><%= returning_characters %> will return in <em><%= next_book %></em>.</p>
|
13
|
+
|
14
|
+
<h3>Follow Me</h3>
|
15
|
+
|
16
|
+
<strong><%= authors.join(', ') %></strong> can be followed on Twitter and Facebook.
|
17
|
+
|
18
|
+
Visit his web site at <%= "<a href='#{base_url}'>#{base_url}</a>" %> for more information. You can also sign up for announcements of other books in this series at <%= "<a href='#{base_url}'>#{base_url}</a>" %>.
|
19
|
+
</div>
|
20
|
+
|
21
|
+
</body>
|
22
|
+
</html>
|
data/templates/config.erb
CHANGED
@@ -1,14 +1,25 @@
|
|
1
1
|
# The book's title. Will be used everywhere!
|
2
2
|
title: "<%= @title %>"
|
3
3
|
|
4
|
+
epub_cover: "cover.jpg" # Name of bookcover
|
5
|
+
|
6
|
+
# If you have returning characters, put them here:
|
7
|
+
# returning_characters: ""
|
8
|
+
#next_book: Title of next book in series
|
9
|
+
|
4
10
|
# The book's language.
|
5
11
|
language: "en"
|
6
12
|
|
7
13
|
# Type: 'fiction' or 'nonfiction'
|
8
|
-
type: 'fiction'
|
14
|
+
type: 'fiction'
|
15
|
+
|
9
16
|
# Status: 'draft' or 'final'
|
10
17
|
status: "draft"
|
11
18
|
|
19
|
+
# Chapter Style based on Memoir class
|
20
|
+
# ftp://ftp.tex.ac.uk/tex-archive/documentation/MemoirChapStyles/MemoirChapStyles.pdf
|
21
|
+
chapter_style: "chappell"
|
22
|
+
|
12
23
|
# Your book copyright info.
|
13
24
|
# Here's some examples:
|
14
25
|
#
|
@@ -49,19 +60,20 @@ authors:
|
|
49
60
|
base_url: http://example.com
|
50
61
|
|
51
62
|
series:
|
52
|
-
title:
|
63
|
+
title: "Series TItle"
|
53
64
|
books:
|
54
|
-
- "
|
55
|
-
|
65
|
+
- "Book in Series"
|
66
|
+
- "Book in Series"
|
67
|
+
#
|
56
68
|
fonts:
|
57
|
-
serif: "
|
69
|
+
serif: "Georgia"
|
58
70
|
sans: "Tahoma"
|
59
71
|
mono: "Courier"
|
60
72
|
|
61
73
|
designer:
|
62
74
|
book: "Ben Wilson"
|
63
75
|
cover: "<%= @name %>"
|
64
|
-
|
76
|
+
|
65
77
|
editors:
|
66
78
|
text:
|
67
79
|
|
@@ -70,4 +82,3 @@ editors:
|
|
70
82
|
sections:
|
71
83
|
- 01-Welcome.md
|
72
84
|
|
73
|
-
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<title>Copyright Page</title>
|
5
|
+
<style type="text/css"> img { max-width: 100%; } </style>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<div class="copyright">
|
9
|
+
<h2 class="no-toc"><%= title %></h2>
|
10
|
+
<% if type == 'fiction' %>
|
11
|
+
<p>This is a work of fiction. Names, characters, places and incidents are either
|
12
|
+
the product of the author's imagination or are used fictitiously, and any resemblance to
|
13
|
+
actual persons, living or dead, business establishments, events or locales is entirely
|
14
|
+
coincidental.</p>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<p><em><%= copyright.gsub("(C)", "©") %></em></p>
|
18
|
+
|
19
|
+
<% unless designer['cover'].nil? || designer['cover'].empty? %>
|
20
|
+
<p> Cover Design by <%= designer['cover'] %></p>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<% unless designer['book'].nil? || designer['book'].empty? %>
|
24
|
+
<p> Book Design by <%= designer['book'] %></p>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<% unless editors['text'].nil? || editors['text'].empty? %>
|
28
|
+
<p> Book Design by <%= editors['text'].join(',') %></p>
|
29
|
+
<% end %>
|
30
|
+
|
31
|
+
|
32
|
+
<p> All rights reserved.</p>
|
33
|
+
|
34
|
+
<p> No part of this publication may be reproduced, stored in a retrieval system, posted on the Internet, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without prior written permission from the author. The only exception is by a reviewer, who may quote short excerpts in a review.</p>
|
35
|
+
|
36
|
+
<p> Visit my website at <%= "<a href='#{base_url}'>#{base_url}</a>" %></p>
|
37
|
+
|
38
|
+
<p> Printed in the United States of America</p>
|
39
|
+
|
40
|
+
<p><em>First Printing, <%= published_at %></em></p>
|
41
|
+
|
42
|
+
<p> <%= identifier['type'] %> <%= identifier['id'] %></p>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
</body>
|
46
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
% Extra LaTeX Commands
|
data/templates/latex.erb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
|
2
|
-
\documentclass[
|
2
|
+
\documentclass[11pt,twoside,makeidx,hidelinks,<%= (status == 'final') ? '' : 'showtrims' %>]{memoir}
|
3
3
|
\usepackage{layouts}[2001/04/29]
|
4
|
-
|
4
|
+
<%= (status == 'final') ? '\def\isfinal{1}' : '' %>
|
5
5
|
|
6
6
|
% Packages
|
7
7
|
%=========
|
@@ -17,43 +17,51 @@
|
|
17
17
|
microtype,
|
18
18
|
fancybox,
|
19
19
|
glossaries,
|
20
|
-
titling
|
20
|
+
titling,
|
21
|
+
xspace,
|
21
22
|
}
|
23
|
+
\renewcommand*{\thefootnote}{\fnsymbol{footnote}}
|
24
|
+
\input{./extras/characters.tex}
|
22
25
|
|
23
26
|
% Boolean-ness
|
24
27
|
%=============
|
25
|
-
\newcommand{\onlyfinal}[1]{\ifdefined\isfinal{#1}\fi}
|
26
|
-
\newcommand{\notfinal}[1]{\ifdefined\isfinal\else{#1}\fi}
|
28
|
+
\newcommand{\onlyfinal}[1]{\ifdefined\isfinal{#1}\fi}%
|
29
|
+
\newcommand{\notfinal}[1]{\ifdefined\isfinal\else{#1}\fi}%
|
27
30
|
\newcommand{\whenfinal}[2]{%
|
28
31
|
\ifdefined\isfinal%
|
29
|
-
#1
|
32
|
+
#1%
|
30
33
|
\else%
|
31
|
-
#2
|
34
|
+
#2%
|
32
35
|
\fi}%
|
33
36
|
|
37
|
+
%
|
34
38
|
% Page Layout
|
35
39
|
%============
|
36
|
-
<%
|
40
|
+
<%
|
37
41
|
if status == 'final'
|
38
|
-
stock_size =
|
39
|
-
|
40
|
-
trim_size = %w(9in 6in)
|
42
|
+
stock_size = [9, 6]
|
43
|
+
trims = [0, 0]
|
41
44
|
else
|
42
|
-
stock_size =
|
43
|
-
|
44
|
-
trim_size = %w(11in 6in)
|
45
|
+
stock_size = [11 , 8.5]
|
46
|
+
trims = [0.8, 0.5]
|
45
47
|
end
|
48
|
+
ul_margin = [0.8, 0.5]
|
49
|
+
lr_margin = [0.8, 0.6]
|
50
|
+
type_block = [(9 - ul_margin.sum), (6 - lr_margin.sum)]
|
51
|
+
|
46
52
|
%>
|
47
|
-
\
|
48
|
-
\
|
49
|
-
\
|
53
|
+
<%= (status == 'final') ? '' : '\trimFrame' %>
|
54
|
+
\setstocksize{<%=stock_size[0]%>in}{<%=stock_size[1]%>in}
|
55
|
+
\setulmarginsandblock{0.8in}{0.5in}{*}
|
56
|
+
\settrims{<%=trims[0]%>in}{<%=trims[1]%>in}
|
50
57
|
\setlrmarginsandblock{0.8in}{0.5in}{*}
|
51
|
-
\
|
58
|
+
\settrimmedsize{9in}{6in}{*}
|
59
|
+
\settypeblocksize{<%=type_block[0]%>in}{<%=type_block[1]%>in}{*}
|
52
60
|
|
53
61
|
\setmarginnotes{0.1pt}{0.2in}{\onelineskip}
|
54
62
|
\setheadfoot{\onelineskip}{2\onelineskip}
|
55
63
|
\setheaderspaces{*}{2\onelineskip}{*}
|
56
|
-
\linespread{1.
|
64
|
+
\linespread{1.15}
|
57
65
|
|
58
66
|
\checkandfixthelayout
|
59
67
|
|
@@ -127,7 +135,8 @@
|
|
127
135
|
\newcounter{renewsection}
|
128
136
|
\newcommand{\Chapter}[1]{
|
129
137
|
\setcounter{renewsection}{\value{section}}
|
130
|
-
\chapter{
|
138
|
+
\chapter{}
|
139
|
+
%\chapter{#1}
|
131
140
|
\setcounter{section}{\value{renewsection}}
|
132
141
|
}
|
133
142
|
\chapterstyle{<%= chapter_style || 'ell'%>}
|
@@ -140,9 +149,33 @@
|
|
140
149
|
% Novel Tweaks
|
141
150
|
%=============
|
142
151
|
|
152
|
+
\newenvironment{xdedication}%
|
153
|
+
{\vspace*{6ex}\begin{quotation}\begin{center}\begin{em}}%
|
154
|
+
{\par\end{em}\end{center}\end{quotation}}%
|
155
|
+
|
156
|
+
\newenvironment{dedication}
|
157
|
+
{\clearpage % we want a new page
|
158
|
+
\thispagestyle{empty}% no header and footer
|
159
|
+
\vspace*{\stretch{1}}% some space at the top
|
160
|
+
\itshape % the text is in italics
|
161
|
+
\raggedleft % flush to the right margin
|
162
|
+
}
|
163
|
+
{\par % end the paragraph
|
164
|
+
\vspace{\stretch{3}} % space at bottom is three times that at the top
|
165
|
+
\clearpage % finish off the page
|
166
|
+
}
|
167
|
+
|
143
168
|
% Scene Formatting
|
144
169
|
%-----------------
|
145
170
|
|
171
|
+
\newcommand*\thoughtbreak{
|
172
|
+
\begin{center}
|
173
|
+
\vspace{1cm}
|
174
|
+
\noindent\rule{0.5\textwidth}{0.4pt}
|
175
|
+
\vspace{1cm}
|
176
|
+
\end{center}
|
177
|
+
}
|
178
|
+
|
146
179
|
\newcommand{\thought}[1]{\emph{#1}}
|
147
180
|
\newcommand{\email}[1]{\texttt{#1}}
|
148
181
|
\newcommand{\status}[1]{\notfinal{\textbf{Status:} #1\newline}}
|
@@ -152,17 +185,18 @@
|
|
152
185
|
\newcommand{\slugline}[2]{\notfinal{\section{#1}}\onlyfinal{\section{}}\slug{#2}}
|
153
186
|
\newcommand{\interlude}[1]{\plainfancybreak{\AfterFancyBreakMin}{1}{#1}}
|
154
187
|
|
155
|
-
\newcommand{\scene}[3]{%
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
}%
|
188
|
+
% \newcommand{\scene}[3]{%
|
189
|
+
% \notfinal{\section{#1}\slug{#2}}
|
190
|
+
% \input{#3}
|
191
|
+
% \pbreak
|
192
|
+
% }%
|
160
193
|
|
161
194
|
\newcommand{\smee}[1]{\${-} \textsc{\small#1}}
|
162
195
|
\whenfinal%
|
163
196
|
{\newcommand{\pbreak}{\pfbreak}}%
|
164
197
|
{\newcommand{\pbreak}{\begin{center} \# \# \# \end{center}}}
|
165
198
|
|
199
|
+
% \renewcommand{\pbreak}{\thoughtbreak}
|
166
200
|
% Series Title Page
|
167
201
|
%==================
|
168
202
|
\def\seriestitle#1{\def\theseriestitle{\uppercase{#1}}}
|
@@ -173,7 +207,7 @@
|
|
173
207
|
\noindent Other Books in the series:
|
174
208
|
\vskip4pt
|
175
209
|
\theseriesbooks
|
176
|
-
\end{center}\
|
210
|
+
\end{center}\cleardoublepage}
|
177
211
|
\def\seriesbook#1{\vskip.5pt{\noindent\hskip8pt\emph{#1}}\vskip1sp}
|
178
212
|
\def\seriesbooks#1\endseriesbooks{\def\theseriesbooks{\let\book\seriesbook{#1}}}
|
179
213
|
|
@@ -181,12 +215,14 @@
|
|
181
215
|
%=========
|
182
216
|
\makeglossary
|
183
217
|
\makeindex
|
184
|
-
\let\oldindex\index
|
218
|
+
\let\oldindex\index{}%
|
185
219
|
\newcommand{\marked}[1]{\whenfinal{#1}{\underline{#1}}}%
|
186
220
|
\renewcommand{\index}[1]{\oldindex{#1}\marked{#1}}%
|
187
221
|
\newcommand{\Index}[2]{\oldindex{#1}\marked{#2}}%
|
188
222
|
\newcommand{\orbital}[1]{\oldindex{Orbital!#1}\marked{#1}}%
|
189
223
|
\newcommand{\equipment}[1]{\oldindex{Equipment!#1}\marked{#1}}%
|
224
|
+
\newcommand{\Equipment}[2]{\oldindex{Equipment!#1}\marked{#2}}%
|
225
|
+
\newcommand{\System}[2]{\oldindex{System!#1}\marked{#2}}%
|
190
226
|
\newcommand{\system}[1]{\oldindex{System!#1}\marked{#1}}%
|
191
227
|
\newcommand{\character}[1]{\oldindex{Character!#1}\marked{#1}}%
|
192
228
|
\newcommand{\Character}[2]{\oldindex{Character!#1}\marked{#2}}%
|
@@ -199,8 +235,8 @@
|
|
199
235
|
% Book-Specific Metadata
|
200
236
|
%========================
|
201
237
|
|
202
|
-
\def\NextBook{
|
203
|
-
\def\ReturningCharacters{
|
238
|
+
\def\NextBook{<%=next_book%>}
|
239
|
+
\def\ReturningCharacters{<%=returning_characters%>}
|
204
240
|
\title{<%= title %>}
|
205
241
|
\author{<%= authors.join(', ') %>}
|
206
242
|
\date{<%= published_at %>}
|
@@ -229,15 +265,29 @@
|
|
229
265
|
% Document
|
230
266
|
%========================
|
231
267
|
\begin{document}
|
232
|
-
|
268
|
+
|
233
269
|
% Frontmatter
|
234
270
|
%-------------
|
235
271
|
\frontmatter
|
236
272
|
% r.1 - Half-Title
|
237
|
-
|
273
|
+
\begin{titlingpage}
|
274
|
+
\pagestyle{empty}
|
275
|
+
\begin{center}
|
276
|
+
\vspace*{2in}
|
277
|
+
|
278
|
+
\Huge\textbf{\textsf\thetitle}
|
279
|
+
|
280
|
+
\vspace*{0.75in}
|
281
|
+
|
282
|
+
\Large\textsf\theauthor
|
283
|
+
|
284
|
+
\vspace*{\fill}
|
285
|
+
\end{center}
|
286
|
+
\end{titlingpage}
|
287
|
+
|
238
288
|
% r.2 - Series Title Page
|
239
289
|
<%= "\\seriespage" unless series.nil? %>
|
240
|
-
|
290
|
+
\newpage
|
241
291
|
% r.3 Titlepage
|
242
292
|
\begin{titlingpage}
|
243
293
|
\pagestyle{empty}
|
@@ -255,9 +305,9 @@
|
|
255
305
|
\vspace*{\fill}
|
256
306
|
|
257
307
|
\vspace*{\fill}
|
258
|
-
\includegraphics[width=0.
|
308
|
+
\includegraphics[width=0.75in]{images/dp-logo.png}\\[0cm]
|
259
309
|
\hspace*{\fill}\textsf{Dausha}\hspace*{\fill}\newline%
|
260
|
-
\textsf{
|
310
|
+
\textsf{Publishing}
|
261
311
|
\end{center}
|
262
312
|
\end{titlingpage}
|
263
313
|
|
@@ -267,17 +317,17 @@
|
|
267
317
|
|
268
318
|
\par\noindent\emph{\thetitle}
|
269
319
|
\newline
|
270
|
-
|
320
|
+
|
271
321
|
<% if type == 'fiction' %>
|
272
|
-
|
322
|
+
|
273
323
|
\par\noindent This is a work of fiction. Names, characters, places and incidents are either
|
274
|
-
the product of the author's imagination or are used
|
324
|
+
the product of the author's imagination or are used fictitiously, and any resemblance to
|
275
325
|
actual persons, living or dead, business establishments, events or locales is entirely
|
276
326
|
coincidental.\newline
|
277
327
|
<% end %>
|
278
328
|
|
279
329
|
\par\noindent\emph{<%= copyright %>}\newline
|
280
|
-
|
330
|
+
|
281
331
|
<% unless designer['cover'].nil? || designer['cover'].empty? %>
|
282
332
|
\par\noindent Cover Design by <%= designer['cover'] %>\newline
|
283
333
|
<% end %>
|
@@ -289,7 +339,7 @@
|
|
289
339
|
<% unless editors['text'].nil? || editors['text'].empty? %>
|
290
340
|
\par\noindent Book Design by <%= editors['text'].join(',') %>\newline
|
291
341
|
<% end %>
|
292
|
-
|
342
|
+
|
293
343
|
|
294
344
|
\par\noindent All rights reserved.\newline
|
295
345
|
|
@@ -303,15 +353,17 @@
|
|
303
353
|
|
304
354
|
\par\noindent\textit{First Printing, \usmonthyear\displaydate{firstprint}}
|
305
355
|
\newline
|
306
|
-
|
356
|
+
|
307
357
|
\par\noindent <%= identifier['type'] %> <%= identifier['id'] %>
|
308
358
|
\vspace*{\fill}
|
309
|
-
\newpage
|
310
359
|
|
311
360
|
% r.5 - Dedication
|
361
|
+
<%= "\\begin{dedication}\n#{File.open('extras/dedication.tex').read}\\end{dedication}" if File.exist?('extras/dedication.tex')
|
362
|
+
%>
|
363
|
+
<%= (status != 'final') ? '\tableofcontents' : '' %>
|
312
364
|
|
313
|
-
\tableofcontents
|
314
365
|
|
366
|
+
\newpage
|
315
367
|
\mainmatter
|
316
368
|
\pagestyle{ebook}
|
317
369
|
\sloppy
|
@@ -327,28 +379,28 @@
|
|
327
379
|
% \bibliocommand
|
328
380
|
% \pagestyle{empty}
|
329
381
|
\begin{center}
|
330
|
-
|
331
|
-
|
382
|
+
\vspace*{\fill}
|
383
|
+
|
332
384
|
{\Large \par
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
385
|
+
\noindent Thank you for reading
|
386
|
+
|
387
|
+
\vspace*{0.125in}
|
388
|
+
{\LARGE\textbf{\textsf{\thetitle}}}
|
389
|
+
\vspace*{0.125in}
|
390
|
+
|
391
|
+
\ifdefined\ReturningCharacters
|
392
|
+
\par
|
393
|
+
\noindent\ReturningCharacters{} will return in \emph{\NextBook}.} \vspace*{\fill}
|
394
|
+
\fi
|
395
|
+
|
396
|
+
{\LARGE\textbf{\textsf{Follow Me}}}
|
397
|
+
|
398
|
+
\vspace*{0.125in}
|
399
|
+
|
400
|
+
\textbf{\theauthor{}} can be followed on Twitter and Facebook.
|
401
|
+
\newline Visit his web site at http://dausha.net for more information. You can also sign up for announcements of other books in this series at http://dausha.net.
|
402
|
+
|
403
|
+
\vspace*{\fill}
|
352
404
|
\end{center}
|
353
405
|
|
354
406
|
<% if (type == 'fiction' and status != 'final') or type == 'nonfiction' %>
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'awesome_print'
|
2
|
+
require 'json'
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
if true
|
6
|
+
require 'cli-colorize'
|
7
|
+
cli = true
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Make copies via git to remote Repositories"
|
11
|
+
task :archive do
|
12
|
+
puts "## Archival Branch to Repositories!"
|
13
|
+
system "git add -A ."
|
14
|
+
puts "\n## Commiting: Site updated at #{Time.now.utc}"
|
15
|
+
message = "Project updated at #{Time.now.utc}"
|
16
|
+
system "git commit -m \"#{message}\""
|
17
|
+
["github", "bitbucket"].each do |remote|
|
18
|
+
puts "\n## Pushing to **#{remote}** website"
|
19
|
+
system "git push #{remote} master"
|
20
|
+
end
|
21
|
+
puts "\n## Archival complete"
|
22
|
+
end
|
23
|
+
desc "Find a word in the text files. Good for error finding.."
|
24
|
+
task :find, :item do |t, args|
|
25
|
+
c = "find text -type f |xargs grep -l '#{args[:item]}'"
|
26
|
+
system c
|
27
|
+
end
|
28
|
+
desc "Show a word in context. Good for error finding.."
|
29
|
+
task :show, :item do |t, args|
|
30
|
+
c = "find text -type f |xargs grep --color=auto '#{args[:item]}'"
|
31
|
+
system c
|
32
|
+
end
|
33
|
+
task :findc, :item do |t, args|
|
34
|
+
c = "find text -type f -name \"*#{args[:item]}*\""
|
35
|
+
system c
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Compile PDF and display."
|
39
|
+
task :preview do
|
40
|
+
puts "## Creating another craptacular preview for your viewing pleasure."
|
41
|
+
puts "## Give me a second to start as looking at this stuff makes me puke."
|
42
|
+
system "bookmaker compile --only pdf;"
|
43
|
+
pdf = Dir.glob("output/*.pdf").first
|
44
|
+
system "open #{pdf}" unless pdf.nil?
|
45
|
+
end
|
46
|
+
task :progress do
|
47
|
+
log_file = "../../writing.log"
|
48
|
+
if (!File.exist?(log_file))
|
49
|
+
puts "You don't have a log file."
|
50
|
+
return
|
51
|
+
end
|
52
|
+
j = JSON.parse(File.open(log_file,'r').read)
|
53
|
+
# puts j.inspect
|
54
|
+
s = j[Date.today.prev_day.strftime('%Y-%m-%d')]
|
55
|
+
progress = s[File.basename(Dir.pwd)]
|
56
|
+
text = Dir["text/**/[0-9]*.tex"].map{|f| File.open(f,'r').read}.join("\n\n\n")
|
57
|
+
|
58
|
+
file = Tempfile.new('foo.tex')
|
59
|
+
file.write(text)
|
60
|
+
file.close
|
61
|
+
today = `detex #{file.path}| wc -w`.to_i
|
62
|
+
file.unlink
|
63
|
+
target = (500.0 * (300.0 / 365.0)).to_i
|
64
|
+
delta = today - progress
|
65
|
+
puts "So far today: #{today} - #{progress} = #{delta} (#{delta / 333} & #{progress/333} pages) (Target: #{delta - target}) - #{Time.now}}"
|
66
|
+
end
|
67
|
+
task :wc, :target do |t, args|
|
68
|
+
files = Dir["text/**/[0-9]*.tex"]
|
69
|
+
detex = "/usr/texbin/detex"
|
70
|
+
|
71
|
+
counts = {}
|
72
|
+
total = 0
|
73
|
+
sections = 0
|
74
|
+
chapters = {}
|
75
|
+
files.each do |f|
|
76
|
+
next if !args[:target].nil? and !f.include?(args[:target])
|
77
|
+
counts[f] = `detex #{f} | wc -w`.to_i
|
78
|
+
chapter = File.dirname(f)
|
79
|
+
chapters[chapter] = chapters.fetch(chapter,0) + counts[f]
|
80
|
+
total += counts[f]
|
81
|
+
if cli
|
82
|
+
case
|
83
|
+
when counts[f] == 0 then
|
84
|
+
next
|
85
|
+
when counts[f] > 1500 then
|
86
|
+
puts CLIColorize.safe_colorize("...counting #{f} : #{counts[f]}", :yellow)
|
87
|
+
when counts[f] < 1000 then
|
88
|
+
puts CLIColorize.safe_colorize("...counting #{f} : #{counts[f]}", :red)
|
89
|
+
else
|
90
|
+
puts CLIColorize.safe_colorize("...counting #{f} : #{counts[f]}", :green)
|
91
|
+
end
|
92
|
+
else
|
93
|
+
next if counts[f] == 0
|
94
|
+
puts "...counting #{f} : #{counts[f]}"
|
95
|
+
end
|
96
|
+
sections += 1
|
97
|
+
end
|
98
|
+
# sections = 1 if sections == 0
|
99
|
+
puts "Total: #{total} (#{sections} sections). Average #{total/(sections || 1)}"
|
100
|
+
|
101
|
+
# chapters.keys.each {|k| chapters[k] /= 1}
|
102
|
+
# ap chapters
|
103
|
+
end
|
data/templates/user.css
CHANGED
metadata
CHANGED
@@ -1,145 +1,157 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bookmaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Merovex
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-04-13 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: aruba
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: cucumber
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubyzip
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: zip-zip
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
60
81
|
- !ruby/object:Gem::Version
|
61
82
|
version: '0'
|
62
83
|
- !ruby/object:Gem::Dependency
|
63
84
|
name: eeepub
|
64
85
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
86
|
requirements:
|
67
|
-
- -
|
87
|
+
- - '>='
|
68
88
|
- !ruby/object:Gem::Version
|
69
89
|
version: '0'
|
70
90
|
type: :runtime
|
71
91
|
prerelease: false
|
72
92
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
93
|
requirements:
|
75
|
-
- -
|
94
|
+
- - '>='
|
76
95
|
- !ruby/object:Gem::Version
|
77
96
|
version: '0'
|
78
97
|
- !ruby/object:Gem::Dependency
|
79
98
|
name: kramdown
|
80
99
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
100
|
requirements:
|
83
|
-
- -
|
101
|
+
- - '>='
|
84
102
|
- !ruby/object:Gem::Version
|
85
103
|
version: '0'
|
86
104
|
type: :runtime
|
87
105
|
prerelease: false
|
88
106
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
107
|
requirements:
|
91
|
-
- -
|
108
|
+
- - '>='
|
92
109
|
- !ruby/object:Gem::Version
|
93
110
|
version: '0'
|
94
111
|
- !ruby/object:Gem::Dependency
|
95
112
|
name: thor
|
96
113
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
114
|
requirements:
|
99
|
-
- -
|
115
|
+
- - '>='
|
100
116
|
- !ruby/object:Gem::Version
|
101
117
|
version: '0'
|
102
118
|
type: :runtime
|
103
119
|
prerelease: false
|
104
120
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
121
|
requirements:
|
107
|
-
- -
|
122
|
+
- - '>='
|
108
123
|
- !ruby/object:Gem::Version
|
109
124
|
version: '0'
|
110
125
|
- !ruby/object:Gem::Dependency
|
111
126
|
name: nokogiri
|
112
127
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
128
|
requirements:
|
115
|
-
- -
|
129
|
+
- - '>='
|
116
130
|
- !ruby/object:Gem::Version
|
117
131
|
version: '0'
|
118
132
|
type: :runtime
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
135
|
requirements:
|
123
|
-
- -
|
136
|
+
- - '>='
|
124
137
|
- !ruby/object:Gem::Version
|
125
138
|
version: '0'
|
126
139
|
- !ruby/object:Gem::Dependency
|
127
140
|
name: notifier
|
128
141
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
142
|
requirements:
|
131
|
-
- -
|
143
|
+
- - '>='
|
132
144
|
- !ruby/object:Gem::Version
|
133
145
|
version: '0'
|
134
146
|
type: :runtime
|
135
147
|
prerelease: false
|
136
148
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
149
|
requirements:
|
139
|
-
- -
|
150
|
+
- - '>='
|
140
151
|
- !ruby/object:Gem::Version
|
141
152
|
version: '0'
|
142
|
-
description:
|
153
|
+
description: Bookmaker provides authors a free, ruby-based production toolchain for
|
154
|
+
self-published paper and electronic books using the LaTeX document preparation system.
|
143
155
|
email:
|
144
156
|
- dausha@gmail.com
|
145
157
|
executables:
|
@@ -174,44 +186,46 @@ files:
|
|
174
186
|
- lib/bookmaker/toc/epub.rb
|
175
187
|
- lib/bookmaker/toc/html.rb
|
176
188
|
- lib/bookmaker/version.rb
|
189
|
+
- templates/back.erb
|
177
190
|
- templates/config.erb
|
178
|
-
- templates/
|
191
|
+
- templates/copyright.erb
|
192
|
+
- templates/cover.erb
|
179
193
|
- templates/cover.jpg
|
180
194
|
- templates/dp-logo.png
|
181
195
|
- templates/epub.css
|
182
196
|
- templates/epub.erb
|
197
|
+
- templates/extras.tex
|
183
198
|
- templates/html.erb
|
184
199
|
- templates/latex.erb
|
185
200
|
- templates/layout.css
|
201
|
+
- templates/rakefile.rb
|
186
202
|
- templates/sample.tex
|
187
203
|
- templates/syntax.css
|
188
204
|
- templates/user.css
|
189
|
-
homepage: http://dausha.net
|
205
|
+
homepage: http://dausha.net/bookmaker
|
190
206
|
licenses: []
|
207
|
+
metadata: {}
|
191
208
|
post_install_message:
|
192
209
|
rdoc_options: []
|
193
210
|
require_paths:
|
194
211
|
- lib
|
195
212
|
required_ruby_version: !ruby/object:Gem::Requirement
|
196
|
-
none: false
|
197
213
|
requirements:
|
198
|
-
- -
|
214
|
+
- - '>='
|
199
215
|
- !ruby/object:Gem::Version
|
200
216
|
version: '0'
|
201
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
|
-
none: false
|
203
218
|
requirements:
|
204
|
-
- -
|
219
|
+
- - '>='
|
205
220
|
- !ruby/object:Gem::Version
|
206
221
|
version: '0'
|
207
222
|
requirements: []
|
208
223
|
rubyforge_project: bookmaker
|
209
|
-
rubygems_version:
|
224
|
+
rubygems_version: 2.2.2
|
210
225
|
signing_key:
|
211
|
-
specification_version:
|
212
|
-
summary:
|
226
|
+
specification_version: 4
|
227
|
+
summary: Bookmaker is a Ruby & LaTeX based production toolchain for self-publishers.
|
213
228
|
test_files:
|
214
229
|
- features/basic.feature
|
215
230
|
- features/export.feature
|
216
231
|
- features/support/setup.rb
|
217
|
-
has_rdoc:
|