git-scribe 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/TODO.txt +4 -4
- data/git-scribe.gemspec +2 -1
- data/lib/git-scribe.rb +3 -1
- data/lib/git-scribe/check.rb +14 -14
- data/lib/git-scribe/generate.rb +114 -11
- data/lib/git-scribe/version.rb +1 -1
- data/site/default/book.opf +30 -0
- data/stylesheets/handbookish.css +1 -3
- data/template/.gitscribe +2 -0
- data/template/book/image/cover.jpg +0 -0
- data/test/gen_test.rb +10 -1
- metadata +6 -4
data/TODO.txt
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
To-Do List
|
2
2
|
=============
|
3
3
|
|
4
|
+
* git-init after git scribe init
|
5
|
+
|
4
6
|
* custom site layouts
|
5
7
|
* custom/alternate themes (stylesheets)
|
6
8
|
* cover page for site (author, about, etc)
|
7
9
|
* book cover (w/template)
|
8
|
-
*
|
9
|
-
|
10
|
+
* generate hashes for generated assets and do not regenerate them unneccesarily
|
11
|
+
|
10
12
|
* book search
|
11
13
|
* math formula
|
12
14
|
* generate different languages from branches/tags (site, epub, mobi)
|
13
15
|
|
14
|
-
* use options library
|
15
|
-
|
16
16
|
* workflow
|
17
17
|
- review / copy editing
|
18
18
|
- translation
|
data/git-scribe.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
$LOAD_PATH.unshift 'lib'
|
2
|
+
require 'git-scribe/version'
|
2
3
|
|
3
4
|
files = `git ls-files`.
|
4
5
|
split("\n").
|
@@ -9,7 +10,7 @@ puts files
|
|
9
10
|
# piece file back together and write...
|
10
11
|
Gem::Specification.new do |s|
|
11
12
|
s.name = "git-scribe"
|
12
|
-
s.version =
|
13
|
+
s.version = GitScribe::VERSION
|
13
14
|
s.date = Time.now.strftime('%Y-%m-%d')
|
14
15
|
s.summary = "git-scribe is an authors toolkit for writing and publishing books"
|
15
16
|
s.homepage = "http://github.com/schacon/git-scribe"
|
data/lib/git-scribe.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'liquid'
|
4
|
+
require 'yaml'
|
4
5
|
|
5
6
|
require 'git-scribe/generate'
|
6
7
|
require 'git-scribe/check'
|
@@ -19,13 +20,14 @@ class GitScribe
|
|
19
20
|
attr_reader :info
|
20
21
|
|
21
22
|
BOOK_FILE = 'book.asc'
|
22
|
-
OUTPUT_TYPES = ['
|
23
|
+
OUTPUT_TYPES = ['docbook', 'html', 'pdf', 'epub', 'mobi', 'site']
|
23
24
|
SCRIBE_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
24
25
|
|
25
26
|
def initialize
|
26
27
|
@subcommand = nil
|
27
28
|
@args = []
|
28
29
|
@options = {}
|
30
|
+
@config = YAML::parse(File.open(local('.gitscribe'))).transform rescue {}
|
29
31
|
end
|
30
32
|
|
31
33
|
## COMMANDS ##
|
data/lib/git-scribe/check.rb
CHANGED
@@ -7,28 +7,28 @@ class GitScribe
|
|
7
7
|
# check for asciidoc
|
8
8
|
if !check_can_run('asciidoc')
|
9
9
|
info "asciidoc is not present, please install it for anything to work"
|
10
|
-
status[:asciidoc] =
|
10
|
+
status[:asciidoc] = false
|
11
11
|
else
|
12
12
|
info "asciidoc - ok"
|
13
|
-
status[:asciidoc] =
|
13
|
+
status[:asciidoc] = true
|
14
14
|
end
|
15
15
|
|
16
16
|
# check for xsltproc
|
17
17
|
if !check_can_run('xsltproc --version')
|
18
18
|
info "xsltproc is not present, please install it for html generation"
|
19
|
-
status[:xsltproc] =
|
19
|
+
status[:xsltproc] = false
|
20
20
|
else
|
21
21
|
info "xsltproc - ok"
|
22
|
-
status[:xsltproc] =
|
22
|
+
status[:xsltproc] = true
|
23
23
|
end
|
24
24
|
|
25
25
|
# check for a2x - should be installed with asciidoc, but you never know
|
26
26
|
if !check_can_run('a2x')
|
27
27
|
info "a2x is not present, please install it for epub generation"
|
28
|
-
status[:a2x] =
|
28
|
+
status[:a2x] = false
|
29
29
|
else
|
30
30
|
info "a2x - ok"
|
31
|
-
status[:a2x] =
|
31
|
+
status[:a2x] = true
|
32
32
|
end
|
33
33
|
|
34
34
|
# check for source-highlight
|
@@ -44,19 +44,19 @@ class GitScribe
|
|
44
44
|
# check for fop
|
45
45
|
if !check_can_run('fop -version')
|
46
46
|
info "fop is not present, please install for PDF generation"
|
47
|
-
status[:fop] =
|
47
|
+
status[:fop] = false
|
48
48
|
else
|
49
49
|
info "fop - ok"
|
50
|
-
status[:fop] =
|
50
|
+
status[:fop] = true
|
51
51
|
end
|
52
52
|
|
53
|
-
# check for
|
54
|
-
if !check_can_run('
|
55
|
-
info "
|
56
|
-
status[:
|
53
|
+
# check for kindlegen
|
54
|
+
if !check_can_run('kindlegen')
|
55
|
+
info "kindlegen is not present, please install for mobi generation"
|
56
|
+
status[:mobi] = false
|
57
57
|
else
|
58
|
-
info "
|
59
|
-
status[:
|
58
|
+
info "kindlegen - ok"
|
59
|
+
status[:mobi] = true
|
60
60
|
end
|
61
61
|
|
62
62
|
|
data/lib/git-scribe/generate.rb
CHANGED
@@ -45,10 +45,19 @@ class GitScribe
|
|
45
45
|
a2x(type) + " --stylesheet=stylesheets/handbookish.css"
|
46
46
|
end
|
47
47
|
|
48
|
+
def do_docbook
|
49
|
+
return true if @done['docbook']
|
50
|
+
info "GENERATING DOCBOOK"
|
51
|
+
if ex("asciidoc -b docbook #{BOOK_FILE}")
|
52
|
+
@done['docbook'] = true
|
53
|
+
'book.xml'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
48
57
|
def do_pdf
|
49
58
|
info "GENERATING PDF"
|
59
|
+
do_docbook
|
50
60
|
# TODO: syntax highlighting (fop?)
|
51
|
-
ex("asciidoc -b docbook #{BOOK_FILE}")
|
52
61
|
strparams = {'callout.graphics' => 0,
|
53
62
|
'navig.graphics' => 0,
|
54
63
|
'admon.textlabel' => 1,
|
@@ -58,7 +67,6 @@ class GitScribe
|
|
58
67
|
ex(cmd)
|
59
68
|
cmd = "fop -fo #{local('book.fo')} -pdf #{local('book.pdf')}"
|
60
69
|
ex(cmd)
|
61
|
-
#puts `#{a2x('pdf')} -v --fop #{BOOK_FILE}`
|
62
70
|
if $?.exitstatus == 0
|
63
71
|
'book.pdf'
|
64
72
|
end
|
@@ -76,11 +84,9 @@ class GitScribe
|
|
76
84
|
def do_mobi
|
77
85
|
do_html
|
78
86
|
info "GENERATING MOBI"
|
79
|
-
|
80
|
-
#
|
81
|
-
|
82
|
-
# --language 'en'
|
83
|
-
cmd = "ebook-convert book.html book.mobi --level1-toc '//h:h1' --level2-toc '//h:h2' --level3-toc '//h:h3'"
|
87
|
+
generate_toc_files
|
88
|
+
# generate book.opf
|
89
|
+
cmd = "kindlegen -verbose book.opf -o book.mobi"
|
84
90
|
if ex(cmd)
|
85
91
|
'book.mobi'
|
86
92
|
end
|
@@ -90,7 +96,6 @@ class GitScribe
|
|
90
96
|
return true if @done['html']
|
91
97
|
info "GENERATING HTML"
|
92
98
|
# TODO: look for custom stylesheets
|
93
|
-
#puts `#{a2x_wss('xhtml')} -v #{BOOK_FILE}`
|
94
99
|
styledir = local('stylesheets')
|
95
100
|
cmd = "asciidoc -a stylesdir=#{styledir} -a theme=handbookish #{BOOK_FILE}"
|
96
101
|
if ex(cmd)
|
@@ -156,9 +161,8 @@ class GitScribe
|
|
156
161
|
files = Dir.glob(template_dir + '/*')
|
157
162
|
FileUtils.cp_r files, '.'
|
158
163
|
|
159
|
-
|
160
|
-
|
161
|
-
page_template = Liquid::Template.parse(File.read(File.join(template_dir, 'page.html')))
|
164
|
+
index_template = liquid_template('index.html')
|
165
|
+
page_template = liquid_template('page.html')
|
162
166
|
|
163
167
|
# write the index page
|
164
168
|
main_data = {
|
@@ -224,6 +228,105 @@ class GitScribe
|
|
224
228
|
sections
|
225
229
|
end
|
226
230
|
|
231
|
+
def generate_toc_files
|
232
|
+
# read book table of contents
|
233
|
+
toc = []
|
234
|
+
source = File.read("book.html")
|
235
|
+
|
236
|
+
# get the book title
|
237
|
+
book_title = 'Title'
|
238
|
+
if t = /\<title>(.*?)<\/title\>/.match(source)
|
239
|
+
book_title = t[0]
|
240
|
+
end
|
241
|
+
|
242
|
+
source.scan(/\<h([2|3]) id=\"(.*?)\"\>(.*?)\<\/h[2|3]\>/).each do |header|
|
243
|
+
sec = {'id' => header[1], 'name' => header[2]}
|
244
|
+
if header[0] == '2'
|
245
|
+
toc << {'section' => sec, 'subsections' => []}
|
246
|
+
else
|
247
|
+
toc[toc.size - 1]['subsections'] << sec
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
# write ncx table of contents
|
252
|
+
ncx = File.open('book.ncx', 'w+')
|
253
|
+
ncx.puts('<?xml version="1.0" encoding="UTF-8"?>
|
254
|
+
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
|
255
|
+
"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
|
256
|
+
|
257
|
+
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en-US">
|
258
|
+
<head>
|
259
|
+
<meta name="dtb:depth" content="2"/>
|
260
|
+
<meta name="dtb:totalPageCount" content="0"/>
|
261
|
+
<meta name="dtb:maxPageNumber" content="0"/>
|
262
|
+
</head>
|
263
|
+
<docTitle><text>Title</text></docTitle>
|
264
|
+
<docAuthor><text>Author</text></docAuthor>
|
265
|
+
<navMap>
|
266
|
+
<navPoint class="toc" id="toc" playOrder="1">
|
267
|
+
<navLabel>
|
268
|
+
<text>Table of Contents</text>
|
269
|
+
</navLabel>
|
270
|
+
<content src="toc.html"/>
|
271
|
+
</navPoint>')
|
272
|
+
|
273
|
+
chapters = 0
|
274
|
+
toc.each do |section|
|
275
|
+
chapters += 1
|
276
|
+
ch = section['section']
|
277
|
+
ncx.puts('<navPoint class="chapter" id="chapter_' + chapters.to_s + '" playOrder="' + (chapters + 1).to_s + '">')
|
278
|
+
ncx.puts('<navLabel><text>' + ch['name'].to_s + '</text></navLabel>')
|
279
|
+
ncx.puts('<content src="book.html#' + ch['id'].to_s + '"/>')
|
280
|
+
ncx.puts('</navPoint>')
|
281
|
+
end
|
282
|
+
ncx.puts('</navMap></ncx>')
|
283
|
+
ncx.close
|
284
|
+
|
285
|
+
# build html toc
|
286
|
+
# write ncx table of contents
|
287
|
+
html = File.open('toc.html', 'w+')
|
288
|
+
html.puts('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
289
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
290
|
+
<head><title>Table of Contents</title></head><body>
|
291
|
+
<div><h1><b>TABLE OF CONTENTS</b></h1><br/>')
|
292
|
+
|
293
|
+
chapters = 0
|
294
|
+
toc.each do |section|
|
295
|
+
chapters += 1
|
296
|
+
ch = section['section']
|
297
|
+
|
298
|
+
html.puts('<h3><b>Chapter ' + chapters.to_s + '<br/>')
|
299
|
+
html.puts('<a href="book.html#' + ch['id'] + '">' + ch['name'] + '</a></b></h3><br/>')
|
300
|
+
|
301
|
+
section['subsections'].each do |sub|
|
302
|
+
html.puts('<a href="book.html#' + sub['id'] + '"><b>' + sub['name'] + '</b></a><br/>')
|
303
|
+
end
|
304
|
+
end
|
305
|
+
html.puts('<h1 class="centered">* * *</h1></div></body></html>')
|
306
|
+
html.close
|
307
|
+
|
308
|
+
# build book.opf file
|
309
|
+
opf_template = liquid_template('book.opf')
|
310
|
+
File.open('book.opf', 'w+') do |f|
|
311
|
+
lang = @config['language'] || 'en'
|
312
|
+
author = @config['author'] || 'Author'
|
313
|
+
cover = @config['cover'] || 'image/cover.jpg'
|
314
|
+
data = {'title' => book_title,
|
315
|
+
'language' => lang,
|
316
|
+
'author' => author,
|
317
|
+
'pubdate' => Time.now.strftime("%Y-%m-%d"),
|
318
|
+
'cover_image' => cover}
|
319
|
+
f.puts opf_template.render( data )
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
|
324
|
+
def liquid_template(file)
|
325
|
+
template_dir = File.join(SCRIBE_ROOT, 'site', 'default')
|
326
|
+
Liquid::Template.parse(File.read(File.join(template_dir, file)))
|
327
|
+
end
|
328
|
+
|
329
|
+
|
227
330
|
# create a new file by concatenating all the ones we find
|
228
331
|
def gather_and_process
|
229
332
|
files = Dir.glob("book/*")
|
data/lib/git-scribe/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<package xmlns="http://www.idpf.org/2007/opf" version="2.0">
|
3
|
+
|
4
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
5
|
+
<dc:title>{{title}}</dc:title>
|
6
|
+
<dc:language>en</dc:language>
|
7
|
+
<dc:creator>{{author}}</dc:creator>
|
8
|
+
<dc:date>{{pubdate}}</dc:date>
|
9
|
+
<dc:publisher>GitHub.com</dc:publisher>
|
10
|
+
<meta name="cover" content="cover"/>
|
11
|
+
</metadata>
|
12
|
+
|
13
|
+
<manifest>
|
14
|
+
<item id="book" media-type="application/xhtml+xml" href="book.html"></item>
|
15
|
+
<item id="toc_file" media-type="application/xhtml+xml" href="toc.html"></item>
|
16
|
+
<item id="toc" media-type="application/x-dtbncx+xml" href="book.ncx"/>
|
17
|
+
<item id="cover" media-type="image/jpeg" href="{{cover_image}}"/>
|
18
|
+
</manifest>
|
19
|
+
|
20
|
+
<spine toc="toc">
|
21
|
+
<itemref idref="book"/>
|
22
|
+
</spine>
|
23
|
+
|
24
|
+
<guide>
|
25
|
+
<reference type="toc" title="Table of Contents" href="toc.html"></reference>
|
26
|
+
<reference type="text" title="Contents" href="book.html"></reference>
|
27
|
+
</guide>
|
28
|
+
|
29
|
+
</package>
|
30
|
+
|
data/stylesheets/handbookish.css
CHANGED
data/template/.gitscribe
CHANGED
Binary file
|
data/test/gen_test.rb
CHANGED
@@ -76,7 +76,16 @@ context "scribe gen tests" do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
|
79
|
+
test "scribe can generate docbook" do
|
80
|
+
in_temp_dir do
|
81
|
+
@scribe.init('t')
|
82
|
+
Dir.chdir('t') do
|
83
|
+
data = @scribe.gen('docbook')
|
84
|
+
assert_equal data, 'book.xml'
|
85
|
+
out = Dir.glob('output/**/*')
|
86
|
+
assert out.include? 'output/book.xml'
|
87
|
+
end
|
88
|
+
end
|
80
89
|
end
|
81
90
|
|
82
91
|
xtest "scribe can generate all" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-scribe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Scott Chacon
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-28 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -1183,6 +1183,7 @@ files:
|
|
1183
1183
|
- lib/git-scribe/init.rb
|
1184
1184
|
- lib/git-scribe/version.rb
|
1185
1185
|
- lib/subcommand.rb
|
1186
|
+
- site/default/book.opf
|
1186
1187
|
- site/default/index.html
|
1187
1188
|
- site/default/master.css
|
1188
1189
|
- site/default/page.html
|
@@ -1194,6 +1195,7 @@ files:
|
|
1194
1195
|
- template/README.asciidoc
|
1195
1196
|
- template/book/book.asc
|
1196
1197
|
- template/book/chapter2.asc
|
1198
|
+
- template/book/image/cover.jpg
|
1197
1199
|
- template/book/image/octocat_professor.png
|
1198
1200
|
- template/book/include/hello.c
|
1199
1201
|
- test/check_test.rb
|