diff --git a/services/web/frontend/js/ide/log-parser/latex-log-parser.js b/services/web/frontend/js/ide/log-parser/latex-log-parser.js index 4d55e621a2..eec6ad4126 100644 --- a/services/web/frontend/js/ide/log-parser/latex-log-parser.js +++ b/services/web/frontend/js/ide/log-parser/latex-log-parser.js @@ -7,6 +7,7 @@ const PACKAGE_WARNING_REGEX = /^(Package \b.+\b Warning:.*)$/ const LINES_REGEX = /lines? ([0-9]+)/ // This is used to parse the package name from the package warnings const PACKAGE_REGEX = /^Package (\b.+\b) Warning/ +const FILE_LINE_ERROR_REGEX = /^([./].*):(\d+): (.*)/ const STATE = { NORMAL: 0, @@ -83,7 +84,7 @@ export default class LatexParser { } currentLineIsFileLineError() { - return /^\/.*:\d+: .*/.test(this.currentLine) + return FILE_LINE_ERROR_REGEX.test(this.currentLine) } currentLineIsRunawayArgument() { @@ -103,7 +104,7 @@ export default class LatexParser { } parseFileLineError() { - const result = this.currentLine.match(/^(\/.*):(\d+): (.*)/) + const result = this.currentLine.match(FILE_LINE_ERROR_REGEX) this.currentError = { line: result[2], file: result[1], diff --git a/services/web/test/frontend/helpers/fixtures/logs/file-line-error-2.log b/services/web/test/frontend/helpers/fixtures/logs/file-line-error-2.log new file mode 100644 index 0000000000..4019379940 --- /dev/null +++ b/services/web/test/frontend/helpers/fixtures/logs/file-line-error-2.log @@ -0,0 +1,105 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.23 (TeX Live 2021) (preloaded format=pdflatex 2021.9.30) 9 NOV 2021 16:55 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +**main.tex +(./main.tex +LaTeX2e <2021-06-01> patch level 1 +L3 programming layer <2021-07-12> (/usr/local/texlive/2021/texmf-dist/tex/latex +/base/article.cls +Document Class: article 2021/02/12 v1.4n Standard LaTeX document class +(/usr/local/texlive/2021/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2021/02/12 v1.4n Standard LaTeX file (size option) +) +\c@part=\count182 +\c@section=\count183 +\c@subsection=\count184 +\c@subsubsection=\count185 +\c@paragraph=\count186 +\c@subparagraph=\count187 +\c@figure=\count188 +\c@table=\count189 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) (/usr/local/texlive/2021/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2021/02/14 v1.3d Input encoding file +\inpenc@prehook=\toks16 +\inpenc@posthook=\toks17 +) (/usr/local/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2021-07-12 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count190 +\l__pdf_internal_box=\box50 +) (./output.aux (./acks/name.aux)) +\openout1 = `output.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8. +LaTeX Font Info: ... okay on input line 8. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 10. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 10. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 10. +[1 + +{/usr/local/texlive/2021/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] +\openout2 = `acks/name.aux'. + +(./acks/name.tex +! Misplaced alignment tab character &. +l.1 inserting an ampersand & + +I can't figure out why you would want to use a tab mark +here. If you just want an ampersand, the remedy is +simple: Just type `I\&' now. But if some right brace +up above has ended a previous alignment prematurely, +you're probably due for more error messages, and you +might try typing `S' now just to see what is salvageable. + +) [2 + +] +! Misplaced alignment tab character &. +l.14 & + +I can't figure out why you would want to use a tab mark +here. If you just want an ampersand, the remedy is +simple: Just type `I\&' now. But if some right brace +up above has ended a previous alignment prematurely, +you're probably due for more error messages, and you +might try typing `S' now just to see what is salvageable. + +(./output.aux (./acks/name.aux)) ) +Here is how much of TeX's memory you used: + 450 strings out of 478542 + 7915 string characters out of 5850413 + 299724 words of memory out of 5000000 + 18449 multiletter control sequences out of 15000+600000 + 407070 words of font info for 39 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 34i,6n,41p,150b,191s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on output.pdf (2 pages, 42045 bytes). +PDF statistics: + 31 PDF objects out of 1000 (max. 8388607) + 18 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/services/web/test/frontend/ide/log-parser/logParserTests.js b/services/web/test/frontend/ide/log-parser/logParserTests.js index 9b69bb9d77..f16739e27c 100644 --- a/services/web/test/frontend/ide/log-parser/logParserTests.js +++ b/services/web/test/frontend/ide/log-parser/logParserTests.js @@ -77,6 +77,13 @@ describe('logParser', function (done) { flag: 'r', } ) + this.secondaryFileLineErrorLog = fs.readFileSync( + path.resolve(__dirname, fixturePath + 'file-line-error-2.log'), + { + encoding: 'utf8', + flag: 'r', + } + ) }) it('should parse errors', function () { @@ -401,10 +408,10 @@ describe('logParser', function (done) { }) it('should perform file line error parsing', function () { - const latexParser = new LatexLogParser(this.fileLineErrorLog) - const errors = latexParser.parse().errors + let latexParser = new LatexLogParser(this.fileLineErrorLog) + let errors = latexParser.parse().errors - const expectedErrors = [ + let expectedErrors = [ [ 1, 'Undefined control sequence.', @@ -418,6 +425,25 @@ describe('logParser', function (done) { [errors[i].line, errors[i].message, errors[i].file] + '' ) } + + // again with a more complex example + + latexParser = new LatexLogParser(this.secondaryFileLineErrorLog) + errors = latexParser.parse().errors + + expectedErrors = [ + [1, 'Misplaced alignment tab character &.', './acks/name.tex'], + [14, 'Misplaced alignment tab character &.', './main.tex'], + ] + + expect(errors.length).to.equal(expectedErrors.length) + for (let i = 0; i < errors.length; i++) { + expect(expectedErrors[i]).to.deep.equal([ + errors[i].line, + errors[i].message, + errors[i].file, + ]) + } }) it('should ignore duplicates', function () {