--[[ Copyright 2018 ARATA Mizuki This file is part of ClutTeX. ClutTeX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ClutTeX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ClutTeX. If not, see . ]] local io = io local string = string local parse_aux_file = require "texrunner.auxfile".parse_aux_file local pathutil = require "texrunner.pathutil" local fsutil = require "texrunner.fsutil" local shellutil = require "texrunner.shellutil" local message = require "texrunner.message" local function create_missing_directories(args) if string.find(args.execlog, "I can't write on file", 1, true) then -- There is a possibility that there are some subfiles under subdirectories. -- Directories for sub-auxfiles are not created automatically, so we need to provide them. local report = parse_aux_file(args.auxfile, args.options.output_directory) if report.made_new_directory then if CLUTTEX_VERBOSITY >= 1 then message.info("Created missing directories.") end return true end end return false end local function run_epstopdf(args) local run = false if args.options.shell_escape ~= false then -- (possibly restricted) \write18 enabled for outfile, infile in string.gmatch(args.execlog, "%(epstopdf%)%s*Command: ") do local infile_abs = pathutil.abspath(infile, args.original_wd) if fsutil.isfile(infile_abs) then -- input file exists local outfile_abs = pathutil.abspath(outfile, args.options.output_directory) if CLUTTEX_VERBOSITY >= 1 then message.info("Running epstopdf on ", infile, ".") end local outdir = pathutil.dirname(outfile_abs) if not fsutil.isdir(outdir) then assert(fsutil.mkdir_rec(outdir)) end local command = string.format("epstopdf --outfile=%s %s", shellutil.escape(outfile_abs), shellutil.escape(infile_abs)) message.exec(command) local success = os.execute(command) if type(success) == "number" then -- Lua 5.1 or LuaTeX success = success == 0 end run = run or success end end end return run end local function check_minted(args) return string.find(args.execlog, "Package minted Error: Missing Pygments output; \\inputminted was") ~= nil end local function try_recovery(args) local recovered = false recovered = create_missing_directories(args) recovered = run_epstopdf(args) or recovered recovered = check_minted(args) or recovered return recovered end return { create_missing_directories = create_missing_directories, run_epstopdf = run_epstopdf, try_recovery = try_recovery, }