From d271d0b99cab8f577bc9073803481979a9bb05a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20M=C3=A9ndez?= Date: Sat, 24 Aug 2019 13:53:29 +0200 Subject: [PATCH] Minor improvements to TexParser Co-Authored-By: Oliver Kopp --- .../LatexCitationsTabViewModel.java | 1 + .../logic/texparser/DefaultTexParser.java | 19 +++++--- .../model/texparser/TexParserResult.java | 2 + .../logic/texparser/DefaultTexParserTest.java | 47 +++++++++++++++++-- .../org/jabref/logic/texparser/iso-8859-1.tex | 2 +- .../jabref/logic/texparser/iso-8859-15.tex | 2 +- .../org/jabref/logic/texparser/utf-8.tex | 2 +- 7 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jabref/gui/entryeditor/LatexCitationsTabViewModel.java b/src/main/java/org/jabref/gui/entryeditor/LatexCitationsTabViewModel.java index b844475b1db..9ef038f50b5 100644 --- a/src/main/java/org/jabref/gui/entryeditor/LatexCitationsTabViewModel.java +++ b/src/main/java/org/jabref/gui/entryeditor/LatexCitationsTabViewModel.java @@ -77,6 +77,7 @@ public void init(BibEntry entry) { currentEntry = entry; Optional citeKey = entry.getCiteKeyOptional(); + if (citeKey.isPresent()) { startSearch(citeKey.get()); } else { diff --git a/src/main/java/org/jabref/logic/texparser/DefaultTexParser.java b/src/main/java/org/jabref/logic/texparser/DefaultTexParser.java index 04d73210410..0d6414892ef 100644 --- a/src/main/java/org/jabref/logic/texparser/DefaultTexParser.java +++ b/src/main/java/org/jabref/logic/texparser/DefaultTexParser.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.LineNumberReader; +import java.io.Reader; import java.io.UncheckedIOException; import java.nio.channels.ClosedChannelException; import java.nio.file.Files; @@ -27,8 +28,8 @@ public class DefaultTexParser implements TexParser { private static final String TEX_EXT = ".tex"; /** - * It is allowed to add new cite commands for pattern matching. - * Some valid examples: "citep", "[cC]ite", and "[cC]ite(author|title|year|t|p)?". + * It is allowed to add new cite commands for pattern matching. Some valid examples: "citep", "[cC]ite", and + * "[cC]ite(author|title|year|t|p)?". */ private static final String[] CITE_COMMANDS = { "[cC]ite(alt|alp|author|authorfull|date|num|p|t|text|title|url|year|yearpar)?", @@ -76,7 +77,9 @@ public TexParserResult parse(List texFiles) { continue; } - try (LineNumberReader lineNumberReader = new LineNumberReader(new CharsetDetector().setText(Files.readAllBytes(file)).detect().getReader())) { + try ( + Reader reader = new CharsetDetector().setText(Files.readAllBytes(file)).detect().getReader(); + LineNumberReader lineNumberReader = new LineNumberReader(reader)) { for (String line = lineNumberReader.readLine(); line != null; line = lineNumberReader.readLine()) { // Skip comments and blank lines. if (line.trim().isEmpty() || line.trim().charAt(0) == '%') { @@ -86,15 +89,19 @@ public TexParserResult parse(List texFiles) { matchNestedFile(file, texFiles, referencedFiles, line); } } catch (ClosedChannelException e) { - LOGGER.error("Parsing has been interrupted"); - return null; + // User changed the underlying LaTeX file + // We ignore this error and just continue with parsing + LOGGER.info("Parsing has been interrupted"); } catch (IOException | UncheckedIOException e) { - LOGGER.error("Error while parsing file {}", file, e); + // Some weired error during reading + // We ignore this error and just continue with parsing + LOGGER.info("Error while parsing file {}", file, e); } } // Parse all files referenced by TEX files, recursively. if (!referencedFiles.isEmpty()) { + // modifies class variable texParserResult parse(referencedFiles); } diff --git a/src/main/java/org/jabref/model/texparser/TexParserResult.java b/src/main/java/org/jabref/model/texparser/TexParserResult.java index cfbeea25b51..9b563d7e485 100644 --- a/src/main/java/org/jabref/model/texparser/TexParserResult.java +++ b/src/main/java/org/jabref/model/texparser/TexParserResult.java @@ -17,6 +17,8 @@ public class TexParserResult { private final List fileList; private final List nestedFiles; + + // BibTeXKey --> set of citations private final Multimap citations; public TexParserResult() { diff --git a/src/test/java/org/jabref/logic/texparser/DefaultTexParserTest.java b/src/test/java/org/jabref/logic/texparser/DefaultTexParserTest.java index 00e99b191ea..a0638550877 100644 --- a/src/test/java/org/jabref/logic/texparser/DefaultTexParserTest.java +++ b/src/test/java/org/jabref/logic/texparser/DefaultTexParserTest.java @@ -70,7 +70,46 @@ public void testTwoCitationsSameLine() { } @Test - public void testFileEncoding() throws URISyntaxException { + public void testFileEncodingUtf8() throws URISyntaxException { + Path texFile = Paths.get(DefaultTexParserTest.class.getResource("utf-8.tex").toURI()); + + TexParserResult parserResult = new DefaultTexParser().parse(texFile); + TexParserResult expectedParserResult = new TexParserResult(); + + expectedParserResult.getFileList().add(texFile); + expectedParserResult.addKey("anykey", texFile, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); + + assertEquals(expectedParserResult, parserResult); + } + + @Test + public void testFileEncodingIso88591() throws URISyntaxException { + Path texFile = Paths.get(DefaultTexParserTest.class.getResource("iso-8859-1.tex").toURI()); + + TexParserResult parserResult = new DefaultTexParser().parse(texFile); + TexParserResult expectedParserResult = new TexParserResult(); + + expectedParserResult.getFileList().add(texFile); + expectedParserResult.addKey("anykey", texFile, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); + + assertEquals(expectedParserResult, parserResult); + } + + @Test + public void testFileEncodingIso885915() throws URISyntaxException { + Path texFile = Paths.get(DefaultTexParserTest.class.getResource("iso-8859-15.tex").toURI()); + + TexParserResult parserResult = new DefaultTexParser().parse(texFile); + TexParserResult expectedParserResult = new TexParserResult(); + + expectedParserResult.getFileList().add(texFile); + expectedParserResult.addKey("anykey", texFile, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); + + assertEquals(expectedParserResult, parserResult); + } + + @Test + public void testFileEncodingForThreeFiles() throws URISyntaxException { Path texFile = Paths.get(DefaultTexParserTest.class.getResource("utf-8.tex").toURI()); Path texFile2 = Paths.get(DefaultTexParserTest.class.getResource("iso-8859-1.tex").toURI()); Path texFile3 = Paths.get(DefaultTexParserTest.class.getResource("iso-8859-15.tex").toURI()); @@ -79,9 +118,9 @@ public void testFileEncoding() throws URISyntaxException { TexParserResult expectedParserResult = new TexParserResult(); expectedParserResult.getFileList().addAll(Arrays.asList(texFile, texFile2, texFile3)); - expectedParserResult.addKey("anschließend", texFile, 1, 11, 30, "Danach wir \\cite{anschließend} mittels."); - expectedParserResult.addKey("Lässt", texFile2, 1, 4, 16, "Man \\cite{Lässt} auf verweisen."); - expectedParserResult.addKey("Läste", texFile3, 1, 13, 25, "Man einfache \\cite{Läste}."); + expectedParserResult.addKey("anykey", texFile, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); + expectedParserResult.addKey("anykey", texFile2, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); + expectedParserResult.addKey("anykey", texFile3, 1, 32, 45, "Danach wir anschließend mittels \\cite{anykey}."); assertEquals(expectedParserResult, parserResult); } diff --git a/src/test/resources/org/jabref/logic/texparser/iso-8859-1.tex b/src/test/resources/org/jabref/logic/texparser/iso-8859-1.tex index 96705b39a73..7c4509be56c 100644 --- a/src/test/resources/org/jabref/logic/texparser/iso-8859-1.tex +++ b/src/test/resources/org/jabref/logic/texparser/iso-8859-1.tex @@ -1 +1 @@ -Man \cite{Lässt} auf verweisen. +Danach wir anschließend mittels \cite{anykey}. diff --git a/src/test/resources/org/jabref/logic/texparser/iso-8859-15.tex b/src/test/resources/org/jabref/logic/texparser/iso-8859-15.tex index c25dc50ced8..7c4509be56c 100644 --- a/src/test/resources/org/jabref/logic/texparser/iso-8859-15.tex +++ b/src/test/resources/org/jabref/logic/texparser/iso-8859-15.tex @@ -1 +1 @@ -Man einfache \cite{Läste}. +Danach wir anschließend mittels \cite{anykey}. diff --git a/src/test/resources/org/jabref/logic/texparser/utf-8.tex b/src/test/resources/org/jabref/logic/texparser/utf-8.tex index 0e3f607f98a..7c75324d8cd 100644 --- a/src/test/resources/org/jabref/logic/texparser/utf-8.tex +++ b/src/test/resources/org/jabref/logic/texparser/utf-8.tex @@ -1 +1 @@ -Danach wir \cite{anschließend} mittels. +Danach wir anschließend mittels \cite{anykey}.