bin/review-pdfmaker in review-1.3.0 vs bin/review-pdfmaker in review-1.4.0

- old
+ new

@@ -7,268 +7,12 @@ # You can distribute or modify this program under the terms of # the GNU LGPL, Lesser General Public License version 2.1. # For details of the GNU LGPL, see the file "COPYING". # -require 'tmpdir' -require 'yaml' -require 'fileutils' -require 'erb' -require 'optparse' - require 'pathname' bindir = Pathname.new(__FILE__).realpath.dirname $LOAD_PATH.unshift((bindir + '../lib').realpath) -require 'review' -require 'review/i18n' +require 'review/pdfmaker' -include ReVIEW::LaTeXUtils - -include FileUtils - -def error(msg) - $stderr.puts "#{File.basename($0, '.*')}: error: #{msg}" - exit 1 -end - -def warn(msg) - $stderr.puts "#{File.basename($0, '.*')}: warning: #{msg}" -end - -def check_book(config) - pdf_file = config["bookname"]+".pdf" - if File.exist? pdf_file - error "file already exists:#{pdf_file}" - end -end - -def build_path(config) - "./#{config["bookname"]}-pdf" -end - -def check_compile_status(ignore_errors) - return unless @compile_errors - - if ignore_errors - $stderr.puts "compile error, but try to generate PDF file" - else - error "compile error, No PDF file output." - end -end - - -def main - config = ReVIEW::Configure.values - cmd_config = Hash.new - - opts = OptionParser.new - opts.banner = "Usage: #{File.basename($0)} configfile" - opts.version = ReVIEW::VERSION - opts.on('--help', 'Prints this message and quit.') do - puts opts.help - exit 0 - end - opts.on('--[no-]debug', 'Keep temporary files.') do |debug| - cmd_config["debug"] = debug - end - opts.on('--ignore-errors', 'Ignore review-compile errors.') do - cmd_config["ignore-errors"] = true - end - - opts.parse!(ARGV) - if ARGV.size != 1 - puts opts.help - exit 0 - end - yamlfile = ARGV[0] - config.merge!(YAML.load_file(yamlfile)) - # YAML configs will be overridden by command line options. - config.merge!(cmd_config) - - check_book(config) - @basedir = Dir.pwd - @path = build_path(config) - bookname = config["bookname"] - Dir.mkdir(@path) - - @chaps_fnames = Hash.new{|h, key| h[key] = ""} - @compile_errors = nil - - ReVIEW::Book.load(@basedir).parts.each do |part| - if part.name.present? - if part.file? - output_parts(part.name, config) - @chaps_fnames["CHAPS"] << %Q|\\input{#{part.name}.tex}\n| - else - @chaps_fnames["CHAPS"] << %Q|\\part{#{part.name}}\n| - end - end - - part.chapters.each do |chap| - filename = "#{File.basename(chap.path, ".*")}.tex" - output_chaps(filename, config) - @chaps_fnames["PREDEF"] << "\\input{#{filename}}\n" if chap.on_PREDEF? - @chaps_fnames["CHAPS"] << "\\input{#{filename}}\n" if chap.on_CHAPS? - @chaps_fnames["POSTDEF"] << "\\input{#{filename}}\n" if chap.on_POSTDEF? - end - end - - check_compile_status(config["ignore-errors"]) - - config["pre_str"] = @chaps_fnames["PREDEF"] - config["chap_str"] = @chaps_fnames["CHAPS"] - config["post_str"] = @chaps_fnames["POSTDEF"] - - config["usepackage"] = "" - if config["texstyle"] - config["usepackage"] = "\\usepackage{#{config['texstyle']}}" - end - - %w[aut csl trl dsr ill cov edt].each do |item| - config[item] = [config[item]] if !config[item].nil? && config[item].instance_of?(String) - end - - copy_images("./images", "#{@path}/images") - copyStyToDir(Dir.pwd + "/sty", @path) - copyStyToDir(Dir.pwd, @path, "tex") - - Dir.chdir(@path) { - template = get_template(config) - File.open("./book.tex", "wb"){|f| f.write(template)} - - ## do compile - enc = config["params"].to_s.split(/\s+/).find{|i| i =~ /\A--outencoding=/ } - kanji = 'utf8' - if enc - kanji = enc.split(/\=/).last.gsub(/-/, '').downcase - end - texcommand = config["texcommand"] || "platex" - 3.times do - system("#{texcommand} -kanji=#{kanji} book.tex") - end - if File.exist?("book.dvi") - system("dvipdfmx -d 5 book.dvi") - end - } - FileUtils.cp("#{@path}/book.pdf", "#{@basedir}/#{bookname}.pdf") - - unless config["debug"] - remove_entry_secure @path - end -end - -def output_chaps(filename, config) - $stderr.puts "compiling #{filename}" - cmd = "#{ReVIEW::MakerHelper.bindir}/review-compile --target=latex --level=#{config["secnolevel"]} --toclevel=#{config["toclevel"]} #{config["params"]} #{filename} > #{@path}/#{filename}" - if system cmd - # OK - else - @compile_errors = true - warn cmd - end -end - -def output_parts(filename, config) - $stderr.puts "compiling #{filename}.tex" - cmd = "review-compile --target=latex --level=#{config["secnolevel"]} --toclevel=#{config["toclevel"]} #{config["params"]} #{filename}.re | sed -e s/\\chapter{/\\part{/ > #{@path}/#{filename}.tex" - if system cmd - # OK - else - @compile_errors = true - warn cmd - end -end - - -def copy_images(from, to) - if File.exist?(from) - Dir.mkdir(to) - ReVIEW::MakerHelper.copy_images_to_dir(from, to) - Dir.chdir(to) do - images = Dir.glob("**/*").find_all{|f| - File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf)\z/ - } - system("extractbb", *images) - unless system("extractbb", "-m", *images) - system("ebb", *images) - end - end - end -end - -def make_custom_titlepage(coverfile) - coverfile_sty = coverfile.to_s.sub(/\.[^.]+$/, ".tex") - if File.exist?(coverfile_sty) - File.read(coverfile_sty) - else - nil - end -end - -def get_template(config) - dclass = config["texdocumentclass"] || [] - documentclass = dclass[0] || "jsbook" - documentclassoption = dclass[1] || "oneside" - - okuduke = "" - authors = "" - if !config["aut"].nil? && !config["aut"].empty? - okuduke += "著 者 & #{escape_latex(config["aut"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - authors = config["aut"].join(ReVIEW::I18n.t("names_splitter")) + ReVIEW::I18n.t("author_postfix") - end - if !config["csl"].nil? && !config["csl"].empty? - okuduke += "監 修 & #{escape_latex(config["csl"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - authors += " \\\\\n"+config["csl"].join(ReVIEW::I18n.t("names_splitter")) + ReVIEW::I18n.t("supervisor_postfix") - end - if !config["trl"].nil? && !config["trl"].empty? - okuduke += "翻 訳 & #{escape_latex(config["trl"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - authors += " \\\\\n"+config["trl"].join(ReVIEW::I18n.t("names_splitter")) + ReVIEW::I18n.t("translator_postfix") - end - if !config["dsr"].nil? && !config["dsr"].empty? - okuduke += "デザイン & #{escape_latex(config["dsr"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - end - if !config["ill"].nil? && !config["ill"].empty? - okuduke += "イラスト & #{escape_latex(config["ill"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - end - if !config["cov"].nil? && !config["cov"].empty? - okuduke += "表 紙 & #{escape_latex(config["cov"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - end - if !config["edt"].nil? && !config["edt"].empty? - okuduke += "編集者 & #{escape_latex(config["edt"].join(ReVIEW::I18n.t("names_splitter")))} \\\\\n" - end - okuduke += <<EOB -発行所 & #{config["prt"]} \\\\ -EOB - - custom_titlepage = make_custom_titlepage(config["coverfile"]) - - template = File.expand_path(File.dirname(__FILE__) + - '/../lib/review/review.tex.erb') - layout_file = File.join(@basedir, "layouts", "layout.tex.erb") - if File.exist?(layout_file) - template = layout_file - end - - erb = ERB.new(File.open(template).read) - values = config # must be 'values' for legacy files - erb.result(binding) -end - -def copyStyToDir(dirname, copybase, extname = "sty") - unless File.directory?(dirname) - $stderr.puts "No such directory - #{dirname}" - return - end - - Dir.open(dirname) {|dir| - dir.each {|fname| - next if fname =~ /^\./ - if fname =~ /\.(#{extname})$/i - Dir.mkdir(copybase) unless File.exist?(copybase) - FileUtils.cp "#{dirname}/#{fname}", copybase - end - } - } -end - -main +ReVIEW::PDFMaker.execute(*ARGV)