3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Asger Alstrup
8 * Full author contact details are available in file CREDITS.
16 #include "LaTeX.h" // TeXErrors
18 #include "support/convert.h"
19 #include "support/docstream.h"
20 #include "support/filetools.h"
21 #include "support/lstrings.h"
22 #include "support/Systemcall.h"
24 #include <boost/format.hpp>
32 using support::changeExtension
;
33 using support::FileName
;
34 using support::makeAbsPath
;
35 using support::onlyFilename
;
37 using support::Systemcall
;
40 Chktex::Chktex(string
const & chktex
, string
const & f
, string
const & p
)
41 : cmd(chktex
), file(f
), path(p
)
46 int Chktex::run(TeXErrors
&terr
)
49 string log
= onlyFilename(changeExtension(file
, ".log"));
50 string tmp
= cmd
+ " -q -v0 -b0 -x " + file
+ " -o " + log
;
52 int result
= one
.startscript(Systemcall::Wait
, tmp
);
54 result
= scanLogFile(terr
);
62 int Chktex::scanLogFile(TeXErrors
& terr
)
66 // FIXME: Find out whether onlyFilename() is really needed,
67 // or whether makeAbsPath(onlyFilename()) is a noop here
68 FileName
const tmp(makeAbsPath(onlyFilename(changeExtension(file
, ".log"))));
71 boost::basic_format
<char_type
> msg(_("ChkTeX warning id # %1$d"));
73 docstring
const msg(_("ChkTeX warning id # "));
77 // We have no idea what the encoding of the error file is
78 idocfstream
ifs(tmp
.toFilesystemEncoding().c_str());
79 while (getline(ifs
, token
)) {
85 token
= split(token
, srcfile
, ':');
86 token
= split(token
, line
, ':');
87 token
= split(token
, pos
, ':');
88 token
= split(token
, warno
, ':');
89 token
= split(token
, warning
, ':');
91 int const lineno
= convert
<int>(line
);
95 terr
.insertError(lineno
, msg
.str(), warning
);
98 terr
.insertError(lineno
, msg
+ warno
, warning
);