X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=1596ba1e8298e3c9611eb366710e27c37c481711;hb=3efc6385d7f6dbad8175411e74407c95e49b3881;hp=3e8729adf13313888d9f0defdf7c85339f84e66d;hpb=14146a43fe704c530f11a0e9986a4a353962a72e;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 3e8729adf1..1596ba1e82 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -32,6 +32,7 @@ #include "support/regex.h" #include +#include using namespace std; @@ -64,9 +65,10 @@ docstring runMessage(unsigned int count) */ void TeXErrors::insertError(int line, docstring const & error_desc, - docstring const & error_text) + docstring const & error_text, + string const & child_name) { - Error newerr(line, error_desc, error_text); + Error newerr(line, error_desc, error_text, child_name); errors.push_back(newerr); } @@ -621,9 +623,13 @@ int LaTeX::scanLogFile(TeXErrors & terr) ifstream ifs(fn.toFilesystemEncoding().c_str()); bool fle_style = false; static regex file_line_error(".+\\.\\D+:[0-9]+: (.+)"); + static regex child_file(".*([0-9]+[A-Za-z]*_.+\\.tex).*"); // Flag for 'File ended while scanning' message. // We need to wait for subsequent processing. string wait_for_error; + string child_name; + int pnest = 0; + stack > child; string token; while (getline(ifs, token)) { @@ -640,6 +646,29 @@ int LaTeX::scanLogFile(TeXErrors & terr) if (token.empty()) continue; + // Track child documents + for (size_t i = 0; i < token.length(); ++i) { + if (token[i] == '(') { + ++pnest; + size_t j = token.find('(', i + 1); + size_t len = j == string::npos + ? token.substr(i + 1).length() + : j - i - 1; + if (regex_match(token.substr(i + 1, len), + sub, child_file)) { + string const name = sub.str(1); + child.push(make_pair(name, pnest)); + i += len; + } + } else if (token[i] == ')') { + if (!child.empty() + && child.top().second == pnest) + child.pop(); + --pnest; + } + } + child_name = child.empty() ? empty_string() : child.top().first; + if (contains(token, "file:line:error style messages enabled")) fle_style = true; @@ -716,11 +745,24 @@ int LaTeX::scanLogFile(TeXErrors & terr) if (contains(token, "LaTeX Error:")) retval |= LATEX_ERROR; - // bug 6445. At this point its not clear we finish with error. if (prefixIs(token, "! File ended while scanning")){ - wait_for_error = desc; - continue; + if (prefixIs(token, "! File ended while scanning use of \\Hy@setref@link.")){ + // bug 7344. We must rerun LaTeX if hyperref has been toggled. + retval |= ERROR_RERUN; + LYXERR(Debug::LATEX, "Force rerun."); + } else { + // bug 6445. At this point its not clear we finish with error. + wait_for_error = desc; + continue; + } } + + if (prefixIs(token, "! Paragraph ended before \\Hy@setref@link was complete.")){ + // bug 7344. We must rerun LaTeX if hyperref has been toggled. + retval |= ERROR_RERUN; + LYXERR(Debug::LATEX, "Force rerun."); + } + if (!wait_for_error.empty() && prefixIs(token, "! Emergency stop.")){ retval |= LATEX_ERROR; string errstr; @@ -729,6 +771,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) do { if (!getline(ifs, tmp)) break; + tmp = rtrim(tmp, "\r"); errstr += "\n" + tmp; if (++count > 5) break; @@ -736,7 +779,8 @@ int LaTeX::scanLogFile(TeXErrors & terr) terr.insertError(0, from_local8bit("Emergency stop"), - from_local8bit(errstr)); + from_local8bit(errstr), + child_name); } // get the next line @@ -745,6 +789,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) do { if (!getline(ifs, tmp)) break; + tmp = rtrim(tmp, "\r"); if (++count > 10) break; } while (!prefixIs(tmp, "l.")); @@ -763,6 +808,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string errstr(tmp, tmp.find(' ')); errstr += '\n'; getline(ifs, tmp); + tmp = rtrim(tmp, "\r"); while (!contains(errstr, "l.") && !tmp.empty() && !prefixIs(tmp, "! ") @@ -770,6 +816,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) errstr += tmp; errstr += "\n"; getline(ifs, tmp); + tmp = rtrim(tmp, "\r"); } LYXERR(Debug::LATEX, "line: " << line << '\n' << "Desc: " << desc << '\n' << "Text: " << errstr); @@ -790,7 +837,8 @@ int LaTeX::scanLogFile(TeXErrors & terr) // assume here it can be wrong. terr.insertError(line, from_local8bit(desc), - from_local8bit(errstr)); + from_local8bit(errstr), + child_name); ++num_errors; } } @@ -816,7 +864,8 @@ int LaTeX::scanLogFile(TeXErrors & terr) retval |= ERRORS; terr.insertError(0, from_local8bit("pdfTeX Error"), - from_local8bit(token)); + from_local8bit(token), + child_name); } } }