#!/usr/bin/env ruby
# This program converts DocBook documents into .epub files.
# 
# Usage: dbtoepub [OPTIONS] [DocBook Files]
#
# .epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
# - Open Publication Structure (OPS)
# - Open Packaging Format (OPF) 
# - Open Container Format (OCF)
#
# Specific options:
#     -c, --css [FILE]                 Use FILE for CSS on generated XHTML.
#     -d, --debug                      Show debugging output.
#     -f, --font [OTF FILE]            Embed OTF FILE in .epub.
#     -h, --help                       Display usage info.
#     -s, --stylesheet [XSL FILE]      Use XSL FILE as a customization
#                                        layer (imports epub/docbook.xsl).
#     -v, --verbose                    Make output verbose.

lib = File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
$LOAD_PATH.unshift(lib) if File.exist?(lib)

require 'fileutils'
require 'optparse'
require 'tmpdir'

require 'docbook'

verbose = false
debug = false
css_file = nil
otf_files = []
customization_layer = nil
output_file = nil

#$DEBUG=true

# Set up the OptionParser
opts = OptionParser.new
opts.banner = "Usage: #{File.basename($0)} [OPTIONS] [DocBook Files]

#{File.basename($0)} converts DocBook <book> and <article>s into to .epub files.

.epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
- Open Publication Structure (OPS)
- Open Packaging Format (OPF) 
- Open Container Format (OCF)

Specific options:"
opts.on("-c", "--css [FILE]", "Use FILE for CSS on generated XHTML.") {|f| css_file = f}
opts.on("-d", "--debug", "Show debugging output.") {debug = true; verbose = true}
opts.on("-f", "--font [OTF FILE]", "Embed OTF FILE in .epub.") {|f| otf_files << f}
opts.on("-h", "--help", "Display usage info.") {puts opts.to_s; exit 0}
opts.on("-o", "--output [OUTPUT FILE]", "Output ePub file as OUTPUT FILE.") {|f| output_file = f}
opts.on("-s", "--stylesheet [XSL FILE]", "Use XSL FILE as a customization layer (imports epub/docbook.xsl).") {|f| customization_layer = f}
opts.on("-v", "--verbose", "Make output verbose.") {verbose = true}

db_files = opts.parse(ARGV)
if db_files.size == 0
  puts opts.to_s
  exit 0
end

db_files.each {|docbook_file|
  dir = File.expand_path(File.join(Dir.tmpdir, ".epubtmp#{Time.now.to_f.to_s}"))
  FileUtils.mkdir_p(dir)
  e = DocBook::Epub.new(docbook_file, dir, css_file, customization_layer, otf_files)

  if output_file
    epub_file = output_file
  else  
    epub_file = File.basename(docbook_file, ".xml") + ".epub"
  end  
  puts "Rendering DocBook file #{docbook_file} to #{epub_file}" if verbose
  e.render_to_file(epub_file)
}  
