/* This file is part of * ====================================================== * * LyX, The Document Processor * Copyright 1995 Matthias Ettrich * Copyright 1995-1999 The LyX Team. * * ====================================================== */ #include #include #include #ifdef __GNUG__ #pragma implementation #endif #include "support/filetools.h" #include "LaTeX.h" #include "Literate.h" #include "lyxlex.h" #include "support/FileInfo.h" #include "debug.h" #include "support/lyxlib.h" #include "support/syscall.h" #include "support/syscontr.h" #include "pathstack.h" #include "bufferlist.h" #include "minibuffer.h" #include "gettext.h" extern BufferList bufferlist; Literate::Literate(string const & latex, string const & f, string const & p, string const & l, string const & literate, string const & literate_f, string const & build, string const & build_f) : LaTeX (latex, f, p), litfile(l), literate_cmd(literate), literate_filter(literate_f), build_cmd(build), build_filter(build_f) { } int Literate::weave(TeXErrors &terr, MiniBuffer *minib) { int scanres = Literate::NO_ERRORS; string tmp1, tmp2; int ret1, ret2; Systemcalls one, two; // The class LaTeX does not know the temp path. bufferlist.updateIncludedTeXfiles(GetCWD()); lyxerr[Debug::LATEX] << "Weaving document" << endl; minib->Set(string(_("Weaving document"))); minib->Store(); // Run the literate program to convert \literate_extension file to .tex file // tmp1 = literate_cmd + " < " + litfile + " > " + file + " 2> " + litfile + ".out"; tmp2 = literate_filter + " < " + litfile + ".out" + " > " + litfile + ".log"; ret1 = one.Startscript(Systemcalls::System, tmp1); ret2 = two.Startscript(Systemcalls::System, tmp2); lyxerr.debug() << "LITERATE {" << tmp1 << "} {" << tmp2 << "}" << endl; scanres = scanLiterateLogFile(terr); if (scanres & Literate::ERRORS) return scanres; // return on literate error return run(terr, minib); } int Literate::build(TeXErrors &terr, MiniBuffer *minib) // We know that this function will only be run if the lyx buffer // has been changed. { int scanres = Literate::NO_ERRORS; num_errors = 0; // just to make sure. // DepTable head; // empty head // unused // bool rerun = false; // rerun requested // unused string tmp1, tmp2; int ret1, ret2; Systemcalls one, two; // The class LaTeX does not know the temp path. bufferlist.updateIncludedTeXfiles(GetCWD()); lyxerr[Debug::LATEX] << "Building program" << endl; minib->Set(string(_("Building program"))); minib->Store(); // Run the build program // tmp1 = build_cmd + ' ' + litfile + " > " + litfile + ".out 2>&1"; tmp2 = build_filter + " < " + litfile + ".out" + " > " + litfile + ".log"; ret1 = one.Startscript(Systemcalls::System, tmp1); ret2 = two.Startscript(Systemcalls::System, tmp2); scanres = scanBuildLogFile(terr); lyxerr[Debug::LATEX] << "Done." << endl; return scanres; } int Literate::scanLiterateLogFile(TeXErrors &terr) { string token; int retval = NO_ERRORS; LyXLex lex(0, 0); string tmp = litfile + ".log"; if (!lex.setFile(tmp)) { // unable to open file // return at once retval |= NO_LOGFILE; return retval; } while (lex.IsOK()) { if (lex.EatLine()) token = lex.GetString(); else // blank line in the file being read continue; lyxerr[Debug::LATEX] << token << endl; if (prefixIs(token, "Build Warning:")) { // Here shall we handle different // types of warnings retval |= LATEX_WARNING; lyxerr[Debug::LATEX] << "Build Warning." << endl; } else if (prefixIs(token, "! Build Error:")) { // Here shall we handle different // types of errors retval |= LATEX_ERROR; lyxerr[Debug::LATEX] << "Build Error." << endl; // this is not correct yet terr.scanError(lex); num_errors++; } } return retval; } int Literate::scanBuildLogFile(TeXErrors &terr) { string token; int retval = NO_ERRORS; LyXLex lex(0, 0); string tmp = litfile + ".log"; if (!lex.setFile(tmp)) { // unable to open file // return at once retval |= NO_LOGFILE; return retval; } while (lex.IsOK()) { if (lex.EatLine()) token = lex.GetString(); else // blank line in the file being read continue; lyxerr[Debug::LATEX] << token << endl; if (prefixIs(token, "Build Warning:")) { // Here shall we handle different // types of warnings retval |= LATEX_WARNING; lyxerr[Debug::LATEX] << "Build Warning." << endl; } else if (prefixIs(token, "! Build Error:")) { // Here shall we handle different // types of errors retval |= LATEX_ERROR; lyxerr[Debug::LATEX] << "Build Error." << endl; // this is not correct yet terr.scanError(lex); num_errors++; } } return retval; }