bookmaker 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -1 +1,2 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'jeweler'
@@ -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{ODO: Write a gem summary}
12
- s.description = %q{ODO: Write a gem description}
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
@@ -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 "cover.html", "templates/epub/cover.html"
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 + sections.map(&:filepath) + assets
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[root_dir.join("templates/epub/cover.html")]
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!(/``(.*?'?)''/) { "&ldquo;#{$1}&rdquo;"}
45
+ text.gsub!(/``(.*?'?)"/) { "&ldquo;#{$1}&rdquo;"}
44
46
  text.gsub!(/``/, "&ldquo;")
45
47
  text.gsub!(/\b'\b/) { "&#39;" }
46
48
  text.gsub!(/`(.*?)'/) { "&lsquo;#{$1}&rsquo;"}
47
49
  # \{([^\}]+?)\} Within the curly braces.
50
+ text.gsub!(/\\pf?break\{\}/,"<hr />")
51
+ text.gsub!(/\\ldots\{\}/,"&hellip;")
48
52
  text.gsub!(/\\Dash\{\}/, "&mdash;")
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}&nbsp;#{$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)
@@ -1,3 +1,3 @@
1
1
  module Bookmaker
2
- VERSION = "0.5.5"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -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>
@@ -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
- - "Bellicose"
55
- #
65
+ - "Book in Series"
66
+ - "Book in Series"
67
+ #
56
68
  fonts:
57
- serif: "Garamond"
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)", "&copy;") %></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>
@@ -6,7 +6,7 @@
6
6
  </head>
7
7
  <body>
8
8
  <div id="cover-image">
9
- <img src="cover.jpg" alt="Title of this Thing, Second Edition"/>
9
+ <img src="<%=epub_cover%>" alt="Cover Image for <%=title %>"/>
10
10
  </div>
11
11
  </body>
12
12
  </html>
@@ -0,0 +1 @@
1
+ % Extra LaTeX Commands
@@ -1,7 +1,7 @@
1
1
  \NeedsTeXFormat{LaTeX2e}[1996/06/01]
2
- \documentclass[12pt,twoside,makeidx,hidelinks]{memoir}
2
+ \documentclass[11pt,twoside,makeidx,hidelinks,<%= (status == 'final') ? '' : 'showtrims' %>]{memoir}
3
3
  \usepackage{layouts}[2001/04/29]
4
- \def\isfinal{<%= (status == 'final') ? 1 : 0 %>}
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 = %w(9in 6in)
39
- ul_margin = %w(0.8in 0.5in)
40
- trim_size = %w(9in 6in)
42
+ stock_size = [9, 6]
43
+ trims = [0, 0]
41
44
  else
42
- stock_size = %w(11in 8.5in)
43
- ul_margin = %w(1.8in 1.5in)
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
- \setstocksize{<%=stock_size[0]%>}{<%=stock_size[1]%>}
48
- \settrimmedsize{<%=trim_size[0]%>}{<%=trim_size[1]%>}{*} % Use entire page
49
- \settrims{0pt}{0pt}
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
- \setulmarginsandblock{<%=ul_margin[0]%>}{<%=ul_margin[1]%>}{*}
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.05}
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{#1}
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
- \notfinal{\section{#1}\slug{#2}}
157
- \input{#3}
158
- \pbreak
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}\newpage}
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{Luctation}
203
- \def\ReturningCharacters{Bophendze and Smee}
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.25\textwidth]{images/dp-logo.png}\\[0cm]
308
+ \includegraphics[width=0.75in]{images/dp-logo.png}\\[0cm]
259
309
  \hspace*{\fill}\textsf{Dausha}\hspace*{\fill}\newline%
260
- \textsf{Communications}
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 ficticiously, and any resemblance to
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
- \vspace*{\fill}
331
-
382
+ \vspace*{\fill}
383
+
332
384
  {\Large \par
333
- \noindent Thank you for reading
334
-
335
- \vspace*{0.125in}
336
- {\LARGE\textbf{\textsf{\thetitle}}}
337
- \vspace*{0.125in}
338
-
339
- \ifdefined\ReturningCharacters
340
- \par
341
- \noindent\ReturningCharacters{} will return in \emph{\NextBook}.} \vspace*{\fill}
342
- \fi
343
-
344
- {\LARGE\textbf{\textsf{Follow Me}}}
345
-
346
- \vspace*{0.125in}
347
-
348
- \textbf{\theauthor{}} can be followed on Twitter and Facebook.
349
- \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.
350
-
351
- \vspace*{\fill}
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
@@ -1 +1,7 @@
1
1
  /* add custom CSS */
2
+ span.smee {
3
+ font-family: monospace;
4
+ }
5
+ span.smee:before {
6
+ content: '$ ';
7
+ }
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.5
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: 2013-04-05 00:00:00.000000000 Z
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: ! 'ODO: Write a gem 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/cover.html
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: 1.8.24
224
+ rubygems_version: 2.2.2
210
225
  signing_key:
211
- specification_version: 3
212
- summary: ! 'ODO: Write a gem 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: