lyx_mirror/src/Literate.C

194 lines
6.0 KiB
C++
Raw Normal View History

/* This file is part of
* ======================================================
*
* LyX, The Document Processor
* Copyright 1995 Matthias Ettrich
* Copyright 1995-1999 The LyX Team.
*
* ======================================================
*/
#include <config.h>
#include <cstdio>
#include <cstdlib>
#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;
}