diff options
Diffstat (limited to 'support/latex-dependency-grapher/source/main/java/ch/bfh/lpdg/LatexHelper.java')
-rw-r--r-- | support/latex-dependency-grapher/source/main/java/ch/bfh/lpdg/LatexHelper.java | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/support/latex-dependency-grapher/source/main/java/ch/bfh/lpdg/LatexHelper.java b/support/latex-dependency-grapher/source/main/java/ch/bfh/lpdg/LatexHelper.java new file mode 100644 index 0000000000..a77a0e6183 --- /dev/null +++ b/support/latex-dependency-grapher/source/main/java/ch/bfh/lpdg/LatexHelper.java @@ -0,0 +1,148 @@ +package ch.bfh.lpdg; + +import ch.bfh.lpdg.datastructure.Dependency; +import ch.bfh.lpdg.datastructure.DependencyType; +import lombok.NoArgsConstructor; +import org.springframework.util.FileSystemUtils; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@NoArgsConstructor +public class LatexHelper { + + private final InteractionHandler interactionHandler = InteractionHandler.getInstance(); + private Path tempFile; + private Path sourceFile; + private Path tempFolder; + private Dependency dependencies; + + public LatexHelper(File file, Dependency dependencies) throws IOException { + this.dependencies = dependencies; + this.tempFile = createTempFile(file, ".temp"); + this.sourceFile = file.toPath(); + this.tempFolder = createTempFolder(Paths.get(file.getParent())); + interactionHandler.printDebugMessage("Temp-File has been created. " + tempFile); + } + + private static String getFileExtension(String fileName) { + int lastDotIndex = fileName.lastIndexOf("."); + return (lastDotIndex != -1) ? fileName.substring(lastDotIndex) : ""; + } + + public void findUnnecessaryDependencies(Boolean overwrite, Boolean minimize) throws IOException { + this.interactionHandler.printDebugMessage("Finding unnecessary Dependencies."); + List<Dependency> unnecessaryDependencies = new ArrayList<>(); + for (var dep : dependencies.getDependencyList()) { + if(dep.getType() != DependencyType.REQUIRE_PACKAGE && dep.getType() != DependencyType.USE_PACKAGE) + continue; + this.interactionHandler.printDebugMessage("Trying without " + dep.toString()); + this.replaceDependency(tempFile, dep.getSource(), "%" + dep.getSource()); + if (this.compileTempDocument(tempFolder.toAbsolutePath().toString(), tempFile.toAbsolutePath().toString())) { + unnecessaryDependencies.add(dep); + dep.IsUnused = true; + } + this.replaceDependency(tempFile, "%" + dep.getSource(), dep.getSource()); + } + this.deleteTempFiles(); + + if(unnecessaryDependencies.size() > 0) { + System.out.println("\nThe following Packages are not needed:"); + for (var dep : unnecessaryDependencies) + System.out.println("\t" + dep.getName()); + } + + if (minimize || overwrite) { + Path fileToMinimize = overwrite ? this.sourceFile : createTempFile(sourceFile.toFile(), ".minimized"); + this.writeMinimizedFile(fileToMinimize); + } + } + + public boolean compileTempDocument(final String outputDirectory, final String documentToCompile) { + try { + List<String> cmd = Arrays.asList( + "pdflatex", //We use pdflatex to compile the documents. + "-output-directory", outputDirectory, //Set the output directory to the created tempFolder directory of the input + "-interaction", "nonstopmode", + "-halt-on-error", + "-file-line-error", + documentToCompile); + this.interactionHandler.printDebugMessage("Running: " + cmd); + ProcessBuilder processBuilder = new ProcessBuilder(cmd); + + // Redirect the error stream to the output stream + processBuilder.redirectErrorStream(true); + + Process process = processBuilder.start(); + InputStream is = process.getInputStream(); + int readBytes; + byte[] buffer = new byte[1024]; + StringBuilder outputBuilder = new StringBuilder(); + + while ((readBytes = is.read(buffer)) != -1) { + String chunk = new String(buffer, 0, readBytes, StandardCharsets.UTF_8); + outputBuilder.append(chunk); + } + this.interactionHandler.printDebugMessage(outputBuilder.toString()); + + var res = process.waitFor(); + this.interactionHandler.printDebugMessage("ReturnCode: " + res); + return res == 0; + } catch (Exception e) { + System.err.println("Error while compiling the temporary file: " + e); + return false; + } + } + + private void writeMinimizedFile(Path minimizedFile) { + for (var dep : dependencies.getDependencyList()) { + if (!dep.IsUnused) + continue; + replaceDependency(minimizedFile, dep.getSource(), "%" + dep.getSource()); + } + } + + private void replaceDependency(Path file, String dependency, String replaceWith) { + this.interactionHandler.printDebugMessage("Replacing " + dependency + " with " + replaceWith); + try { + BufferedReader reader = Files.newBufferedReader(file); + StringBuilder content = new StringBuilder(); + + String row; + while ((row = reader.readLine()) != null) { + content.append(row).append(System.lineSeparator()); + } + + String newContent = content.toString().replace(dependency, replaceWith); + + BufferedWriter writer = Files.newBufferedWriter(file); + writer.write(newContent); + + reader.close(); + writer.close(); + } catch (IOException e) { + System.err.println("Error in the temporary file: " + e); + } + } + + private Path createTempFile(File file, String identifier) throws IOException { + var extension = getFileExtension(file.getName()); + return Files.copy(Paths.get(file.getAbsolutePath()), Paths.get(file.getPath().replace(extension, identifier + extension)), StandardCopyOption.REPLACE_EXISTING); + } + + private Path createTempFolder(Path parentDirectory) throws IOException { + return Files.createTempDirectory(parentDirectory, "LatexDependencyTemp"); + } + + private void deleteTempFiles() throws IOException { + FileSystemUtils.deleteRecursively(tempFolder.toFile()); + Files.delete(tempFile); + } +} |