mkbok 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/mkbok +173 -114
  2. data/lib/mkbok_version.rb +1 -1
  3. metadata +2 -2
data/bin/mkbok CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
2
3
 
3
4
  require 'optparse'
4
5
  require 'fileutils'
@@ -8,10 +9,10 @@ require 'yaml'
8
9
  include FileUtils
9
10
 
10
11
  options = {
11
- :build=> "pdf",
12
- :lang => "zh",
13
- :config => "latex/config.yml",
14
- :template => "latex/template.tex"
12
+ "build"=> "pdf",
13
+ "lang" => "zh",
14
+ "config" => "latex/config.yml",
15
+ "template" => "latex/template.tex"
15
16
  }
16
17
  CONFIG_FILE = File.join('.mkbok.yml')
17
18
  if File.exists? CONFIG_FILE
@@ -25,39 +26,43 @@ option_parser = OptionParser.new do |opts|
25
26
  Usage: #{executable_name} [options]
26
27
  "
27
28
  # Create a switch
28
- opts.on("-b","--build FORMAT","build") do |format|
29
- unless format=="pdf"
30
- raise ArgumentError,"FORMAT must be in 'pdf' format"
29
+ opts.on("-b","--build FORMAT","build format:epub,pdf,html. seperated by ','") do |format|
30
+ formatOptions = format.split(",")
31
+ formatOptions.each do | fmt |
32
+ #puts fmt
33
+ unless ["pdf","epub","html"].include?(fmt)
34
+ raise ArgumentError,"FORMAT must be one of 'pdf,epub,html' format"
35
+ end
31
36
  end
32
- options[:build] = format
37
+ options["outputformat"] = formatOptions
33
38
  end
34
39
  opts.on("-d","--debug","debug") do
35
- options[:debug] = true
40
+ options["debug"] = true
36
41
  end
37
42
  # Create a flag
38
43
  opts.on("-l","--lang LANG","language selection") do |lang|
39
44
  unless lang=="zh" or lang=="en"
40
45
  raise ArgumentError,"LANG must be in zh or en"
41
46
  end
42
- options[:lang] = lang
47
+ options["lang"] = lang
43
48
  end
44
49
  opts.on("-c","--config CONFIG","config file") do |config|
45
50
  unless File.exists? config
46
51
  raise ArgumentError,"config file \"#{config}\" doesn't exist"
47
52
  end
48
- options[:config] = config
53
+ options["config"] = config
49
54
  end
50
55
  opts.on("-t","--template template.tex","latex template file") do |template|
51
56
  unless File.exists? template
52
57
  raise ArgumentError,"template file \"#{template}\" doesn't exist"
53
58
  end
54
- options[:template] = template
59
+ options["template"] = template
55
60
  end
56
61
  opts.on("-n","--name book name","book name") do |name|
57
62
  unless name =~ /^[a-zA-Z0-9]+$/
58
63
  raise ArgumentError,"name should be [a-zA-Z0-9]"
59
64
  end
60
- options[:name] = name
65
+ options["name"] = name
61
66
  end
62
67
  end
63
68
 
@@ -67,9 +72,9 @@ option_parser.parse!
67
72
  $here = Dir.getwd
68
73
  $root = File.join($here)
69
74
  $outDir = File.join($root, 'pdf')
70
- options[:name] = File.basename(Dir.getwd) unless options[:name]
75
+ options["name"] = File.basename(Dir.getwd) unless options["name"]
71
76
 
72
- puts options.inspect if options[:debug]
77
+ puts options.inspect if options["debug"]
73
78
 
74
79
  def figures(&block)
75
80
  begin
@@ -190,109 +195,163 @@ def post_pandoc(string, config, lang, chapter=true)
190
195
  end
191
196
  end
192
197
 
193
- $config = YAML.load_file(options[:config])
194
- template = ERB.new(File.read(options[:template]))
195
- languages = [options[:lang]]
196
- missing = ['pandoc', 'xelatex'].reject{|command| command_exists?(command)}
197
- unless missing.empty?
198
- puts "Missing dependencies: #{missing.join(', ')}."
199
- puts "Install these and try again."
200
- exit
198
+ def generate_pdf(options)
199
+ $config = YAML.load_file(options["config"])
200
+ template = ERB.new(File.read(options["template"]))
201
+ languages = [options["lang"]]
202
+ missing = ['pandoc', 'xelatex'].reject{|command| command_exists?(command)}
203
+ unless missing.empty?
204
+ puts "Missing dependencies: #{missing.join(', ')}."
205
+ puts "Install these and try again."
206
+ exit
207
+ end
208
+
209
+ puts "Will generate pdf for the following languages using template #{options["template"]}:"
210
+ puts " #{languages}"
211
+ puts
212
+
213
+ figures do
214
+ languages.each do |lang|
215
+ config = $config['default'].merge($config[lang]) rescue $config['default']
216
+
217
+ puts "#{lang}:"
218
+ puts "\tParsing preface markdown... "
219
+ prefacemarkdown = Dir["#$root/#{lang}/*preface/*.markdown"].sort.map do |file|
220
+ puts "\t =>"+file
221
+ File.read(file)
222
+ end.join("\n\n")
223
+
224
+ preface = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
225
+ pipe.write(pre_pandoc(prefacemarkdown, config))
226
+ pipe.close_write
227
+ post_pandoc(pipe.read, config, lang, false)
228
+ end
229
+
230
+ puts "\n\tParsing main chapters markdown... "
231
+ found = false
232
+ chaptersmarkdown = Dir["#$root/#{lang}/*chapters/*.markdown"].sort.map do |file|
233
+ found = true
234
+ puts "\t =>"+file
235
+ File.read(file)
236
+ end.join("\n\n")
237
+ chaptersmarkdown = Dir["#$root/#{lang}/*/*.markdown"].sort.map do |file|
238
+ puts "\t =>"+file
239
+ File.read(file)
240
+ end.join("\n\n") unless found
241
+ # puts "done"
242
+
243
+ latex = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
244
+ pipe.write(pre_pandoc(chaptersmarkdown, config))
245
+ pipe.close_write
246
+ post_pandoc(pipe.read, config, lang)
247
+ end
248
+ # puts "done"
249
+
250
+ puts "\n\tParsing appendix markdown... "
251
+ appendixmarkdown = Dir["#$root/#{lang}/*appendix/*.markdown"].sort.map do |file|
252
+ puts "\t =>"+file
253
+ File.read(file)
254
+ end.join("\n\n")
255
+
256
+ appendix = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
257
+ pipe.write(pre_pandoc(appendixmarkdown, config))
258
+ pipe.close_write
259
+ post_pandoc(pipe.read, config, lang)
260
+ end
261
+ #puts "done"
262
+
263
+ print "\n\tCreating main.tex for #{lang}... "
264
+ dir = "latex/#{lang}"
265
+ mkdir_p(dir)
266
+
267
+ File.open("#{dir}/main.tex", 'w') do |file|
268
+ file.write(template.result(binding))
269
+ end
270
+ puts "done"
271
+
272
+ abort = false
273
+
274
+ puts "\tRunning XeTeX:"
275
+ cd($root)
276
+ 3.times do |i|
277
+ print "\t\tPass #{i + 1}... "
278
+ IO.popen("xelatex -output-directory=\"#{dir}\" \"#{dir}/main.tex\" 2>&1",'r:UTF-16LE:UTF-8') do |pipe|
279
+ unless $DEBUG
280
+ if ~ /^!\s/
281
+ puts "failed with:\n\t\t\t#{$_.strip}"
282
+ puts "\tConsider running this again with --debug."
283
+ abort = true
284
+ end while pipe.gets and not abort
285
+ else
286
+ STDERR.print while pipe.gets rescue abort = true
287
+ end
288
+ end
289
+ break if abort
290
+ puts "done"
291
+ end
292
+
293
+ unless abort
294
+ print "\tMoving output to #{options["name"]}.#{lang}.pdf... "
295
+ mv("#{dir}/main.pdf", "#$root/#{options["name"]}.#{lang}.pdf")
296
+ puts "done"
297
+ else
298
+ print "\tConvert error, exit !\n"
299
+ exit 1
300
+ end
301
+ end
302
+ end
201
303
  end
202
304
 
203
- puts "Will generate pdf for the following languages using template #{options[:template]}:"
204
- puts " #{languages}"
205
- puts
206
-
207
- figures do
208
- languages.each do |lang|
209
- config = $config['default'].merge($config[lang]) rescue $config['default']
210
-
211
- puts "#{lang}:"
212
- puts "\tParsing preface markdown... "
213
- prefacemarkdown = Dir["#$root/#{lang}/*preface/*.markdown"].sort.map do |file|
214
- puts "\t =>"+file
215
- File.read(file)
216
- end.join("\n\n")
217
-
218
- preface = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
219
- pipe.write(pre_pandoc(prefacemarkdown, config))
220
- pipe.close_write
221
- post_pandoc(pipe.read, config, lang, false)
222
- end
223
-
224
- puts "\n\tParsing main chapters markdown... "
225
- found = false
226
- chaptersmarkdown = Dir["#$root/#{lang}/*chapters/*.markdown"].sort.map do |file|
227
- found = true
228
- puts "\t =>"+file
229
- File.read(file)
230
- end.join("\n\n")
231
- chaptersmarkdown = Dir["#$root/#{lang}/*/*.markdown"].sort.map do |file|
232
- puts "\t =>"+file
233
- File.read(file)
234
- end.join("\n\n") unless found
235
- # puts "done"
236
-
237
- latex = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
238
- pipe.write(pre_pandoc(chaptersmarkdown, config))
239
- pipe.close_write
240
- post_pandoc(pipe.read, config, lang)
241
- end
242
- # puts "done"
243
-
244
- puts "\n\tParsing appendix markdown... "
245
- appendixmarkdown = Dir["#$root/#{lang}/*appendix/*.markdown"].sort.map do |file|
246
- puts "\t =>"+file
247
- File.read(file)
248
- end.join("\n\n")
249
-
250
- appendix = IO.popen('pandoc -p --no-wrap -f markdown -t latex', 'w+') do |pipe|
251
- pipe.write(pre_pandoc(appendixmarkdown, config))
252
- pipe.close_write
253
- post_pandoc(pipe.read, config, lang)
254
- end
255
- #puts "done"
305
+ def generate_ebook(options)
306
+ name = File.basename(Dir.getwd)
256
307
 
257
- print "\n\tCreating main.tex for #{lang}... "
258
- dir = "latex/#{lang}"
259
- mkdir_p(dir)
260
-
261
- File.open("#{dir}/main.tex", 'w') do |file|
262
- file.write(template.result(binding))
263
- end
264
- puts "done"
265
-
266
- abort = false
267
-
268
- puts "\tRunning XeTeX:"
269
- cd($root)
270
- 3.times do |i|
271
- print "\t\tPass #{i + 1}... "
272
- IO.popen("xelatex -output-directory=\"#{dir}\" \"#{dir}/main.tex\" 2>&1",'r:UTF-16LE:UTF-8') do |pipe|
273
- unless $DEBUG
274
- if ~ /^!\s/
275
- puts "failed with:\n\t\t\t#{$_.strip}"
276
- puts "\tConsider running this again with --debug."
277
- abort = true
278
- end while pipe.gets and not abort
279
- else
280
- STDERR.print while pipe.gets rescue abort = true
281
- end
282
- end
283
- break if abort
284
- puts "done"
285
- end
308
+ puts " "
309
+ puts "Will generate ebooks [#{options["outputformat"].join(',')}] for the following languages #{options["lang"]}"
310
+ puts " "
311
+
312
+ options["lang"].each do |lang|
313
+ puts "convert content for '#{lang}' language"
286
314
 
287
- unless abort
288
- print "\tMoving output to #{options[:name]}.#{lang}.pdf... "
289
- mv("#{dir}/main.pdf", "#$root/#{options[:name]}.#{lang}.pdf")
290
- puts "done"
291
- else
292
- print "\tConvert error, exit !\n"
293
- exit 1
294
- end
295
- end
315
+ if lang == 'zh'
316
+ figure_title = '图'
317
+ else
318
+ figure_title = 'Figure'
319
+ end
320
+
321
+ dir = File.expand_path(File.join(File.dirname(__FILE__), lang))
322
+ book_content = ""
323
+ Dir[File.join(dir, '**', '*.markdown')].sort.each do |input|
324
+ puts "\tProcessing #{input}"
325
+ content = File.read(input)
326
+ content.gsub!(/Insert\s+(.*)(\.png)\s*\n?\s*#{figure_title}\s+(.*)/, '![\3](figures/\1-tn\2 "\3")')
327
+ book_content << content
328
+ end
329
+
330
+ File.open("#{name}.#{lang}.markdown", 'w') do |output|
331
+ output.write(book_content)
332
+ end
333
+ # pandoc -S -s --epub-metadata=metadata.xml -o sdcamp.zh.html --epub-stylesheet=epub/ProGit.css epub/title.txt sdcamp.zh.markdown
334
+ options["outputformat"].each do | format |
335
+ system('pandoc',
336
+ '--standalone',
337
+ '--table-of-contents',
338
+ '--epub-metadata', 'epub/metadata.xml',
339
+ '--epub-stylesheet', 'epub/book.css', # this doesn't work
340
+ '--output', "#{name}.#{lang}.#{format}",
341
+ "title.#{lang}.txt", # little strange, if this put under epub, pandoc reports error
342
+ "#{name}.#{lang}.markdown")
343
+ # pandoc -S --epub-metadata=metadata.xml -o progit.epub title.txt
344
+ puts("#{name}.#{lang}.#{format} is generated")
345
+ end
346
+ end
296
347
  end
297
348
 
349
+ if options["outputformat"].include?("pdf")
350
+ #puts "pdf"
351
+ generate_pdf(options)
352
+ end
353
+ options["outputformat"].delete("pdf")
354
+ if options["outputformat"].count>0
355
+ generate_ebook(options)
356
+ end
298
357
 
data/lib/mkbok_version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MkBok
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mkbok
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-10 00:00:00.000000000 Z
12
+ date: 2012-02-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: the ebook generate tools from markdown plain text
15
15
  email: