summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/support/arara/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/support/arara/src/main')
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java196
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java221
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java148
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java137
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java223
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java96
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java126
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java82
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java481
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java224
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java488
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java285
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java394
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java287
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java321
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java159
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java532
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java205
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java106
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LanguageController.java120
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LoggingController.java109
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SessionController.java124
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SystemCallController.java153
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/AraraException.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java)65
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Argument.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java)117
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Command.java122
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Conditional.java139
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Configuration.java246
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Database.java80
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Directive.java146
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Evaluator.java158
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Extractor.java88
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileType.java170
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileTypeResource.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java)55
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Interpreter.java458
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Language.java148
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Messages.java170
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Pair.java92
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Parser.java410
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Resource.java291
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Rule.java155
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/RuleCommand.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java)86
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Session.java122
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/StopWatch.java84
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Trigger.java135
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java166
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/CommonUtils.java929
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java239
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java140
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java)99
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java)37
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java438
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java502
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java124
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java117
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java257
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/MessageUtils.java313
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/Methods.java1356
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/RuleUtils.java244
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java (renamed from Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java)96
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java87
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java157
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml13
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties163
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties226
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties228
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/configuration/logback.xml52
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages.properties149
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_de.properties149
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en.properties149
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en_QN.properties150
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_it.properties149
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_nl.properties149
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_pt_BR.properties149
79 files changed, 10440 insertions, 6471 deletions
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java
deleted file mode 100644
index 48335eaf879..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * Arara: The main class. Basically, this class will get the file name from the
- * arguments list and call the proper methods from the other helper classes.
- */
-// package definition
-package com.github.arara;
-
-// needed imports
-import com.github.arara.model.AraraDirective;
-import com.github.arara.utils.*;
-import java.io.File;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * The main arara class. The code logic is encapsulated in the helper class, so
- * if something goes wrong, the generic exception catch here will simply print
- * it. I tried to make the code as easier as possible.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class Arara {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(Arara.class);
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * The main method. The idea is to provide to arara only the supported file
- * name and let it handle. The application will remove the file extension
- * (if any) and call the other helper classes.
- *
- * @param args The command line arguments. In fact, arara supports a lot of
- * flags, all listed in the CommandLineAnalyzer.
- */
- public static void main(String[] args) {
-
- // the application status, zero for a normal execution,
- // or nonzero for an abnormal execution
- int exitStatus;
-
- // trying to have a normal execution
- try {
-
- // print the application header
- AraraUtils.printHeader();
-
- // create a configuration instance and load
- // the proper settings, if any
- ConfigurationLoader configuration = new ConfigurationLoader();
- configuration.load();
-
- // create a new analyzer
- CommandLineAnalyzer commandLine = new CommandLineAnalyzer(args, configuration);
-
- // if the minimum parameters are not satisfied or it's a simple
- // help or version request
- if (!commandLine.parse()) {
-
- // simply return
- exitStatus = 0;
-
- // exit right now, good job
- System.exit(exitStatus);
- }
-
- // it's a normal workflow, let's define the main file
- File file;
-
- // create a new file reference
- file = new File(commandLine.getFile());
-
- // welcome message
- logger.info(localization.getMessage("Log_WelcomeMessage"));
-
- // process file
- logger.info(localization.getMessage("Log_ProcessingFile", file.getName()));
-
- // file exists, let's proceed with the directive extractor
- DirectiveExtractor dirExtractor = new DirectiveExtractor(file, configuration);
-
- // extract all directives from the file
- dirExtractor.extract();
-
- // get all directives found
- List<AraraDirective> directives = dirExtractor.getDirectives();
-
- // set the overall result flag
- boolean overallResult = true;
-
- // check if any directive was found
- if (!directives.isEmpty()) {
-
- // now let's parse the directives
- DirectiveParser dirParser = new DirectiveParser(directives);
-
- // set the file
- dirParser.setFile(file);
-
- // parse the directives
- TaskDeployer taskDeployer = new TaskDeployer(dirParser.parse(), configuration);
-
- // deploy the tasks through a command trigger
- CommandTrigger commandTrigger = new CommandTrigger(taskDeployer.deploy());
-
- // set verbose option, if enabled
- commandTrigger.setVerbose(commandLine.isVerbose());
-
- // set an execution timeout, if set
- commandTrigger.setExecutionTimeout(commandLine.getExecutionTimeout());
-
- // execute the tasks
- overallResult = commandTrigger.execute();
- }
- else {
-
- // no directives found, add message to the log
- logger.info(localization.getMessage("Log_NoDirectivesFound", file.getName()));
-
- // print message
- System.out.println(AraraUtils.wrap(localization.getMessage("Msg_NoDirectivesFound", file.getName())));
- }
-
- // final message
- logger.info(localization.getMessage("Log_Done"));
-
- // if everything was ok, that is, every command in the command list
- // returned with an exit status of zero
- if (overallResult) {
-
- // everything fine
- exitStatus = 0;
-
- } else {
-
- // something wrong happened, so let's consider the whole
- // execution as abnormal
- exitStatus = 1;
- }
-
- } catch (Exception exception) {
-
- // something bad happened, print the error message
- System.out.println(AraraUtils.wrap(exception.getMessage()));
-
- // catch error in the log
- logger.error(localization.getMessage("Log_ExceptionRaised"));
- logger.error(exception.getMessage());
-
- // error, set status to an abnormal execution
- exitStatus = 1;
-
- }
-
- // send the exit code to the terminal, and we are done
- System.exit(exitStatus);
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java
deleted file mode 100644
index f65c36e447b..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraConfiguration: This class holds the model for the arara configuration
- * file.
- */
-// package definition
-package com.github.arara.model;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.utils.AraraUtils;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import org.apache.commons.lang3.SystemUtils;
-import org.mvel2.templates.TemplateRuntime;
-
-/**
- * Holds the model for the arara configuration file.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraConfiguration {
-
- // the application language
- private String language;
- // the list of search paths
- private List<String> paths;
- // the list of filetypes
- private List<AraraFilePattern> filetypes;
- // the path runtime exception
- private RuntimeException pathRuntimeException;
- // the path IO exception
- private IOException pathIOException;
-
- /**
- * Getter for the search paths.
- *
- * @return The search paths.
- */
- public List<String> getPaths() {
- return paths;
- }
-
- /**
- * Getter for the language.
- *
- * @return The language.
- */
- public String getLanguage() {
- return language;
- }
-
- /**
- * Setter for the language.
- *
- * @param language The language.
- */
- public void setLanguage(String language) {
- this.language = language;
- }
-
- /**
- * Setter for the search paths.
- *
- * @param rules The search paths.
- */
- public void setPaths(List<String> rules) throws AraraException, Exception {
- this.paths = rules;
-
- // refresh paths
- refreshPaths();
- }
-
- /**
- * Getter for the filetypes.
- *
- * @return The filetypes.
- */
- public List<AraraFilePattern> getFiletypes() {
- return filetypes;
- }
-
- /**
- * Setter for the filetypes.
- *
- * @param filetypes The filetypes.
- */
- public void setFiletypes(List<AraraFilePattern> filetypes) {
- this.filetypes = filetypes;
- }
-
- /**
- * Constructor.
- */
- public AraraConfiguration() {
-
- // creates both lists
- paths = new ArrayList<String>();
- filetypes = new ArrayList<AraraFilePattern>();
- pathRuntimeException = null;
- }
-
- /**
- * Refreshes all paths, replacing possible variables in the template
- */
- private void refreshPaths() throws AraraException, Exception {
-
- // create a map
- HashMap map = new HashMap();
-
- // add the variables
- map.put("userhome", SystemUtils.USER_HOME);
-
- // for every path in the list
- for (int i = 0; i < paths.size(); i++) {
-
- try {
-
- // remove the keyword
- String fullPath = AraraUtils.removeKeyword(paths.get(i));
-
- // apply the template
- fullPath = (String) TemplateRuntime.eval(fullPath, map);
-
- try {
-
- // attempt to create a file reference and
- // get the canonical path, if the operation
- // succeeds, it's a valid path
- File validFile = new File(fullPath);
- validFile.getCanonicalPath();
-
- // sanitize the path in order to be displayed correctly
- fullPath = new File(new File(fullPath).toURI()).getPath();
-
- // set the path in the list
- paths.set(i, fullPath);
-
- } catch (IOException ioException) {
-
- // the path is terribly invalid, get the exception,
- // if null
- if (pathIOException == null) {
-
- // set the path IO exception
- pathIOException = ioException;
- }
- }
-
- } catch (RuntimeException runtimeException) {
-
- // an error has occurred, register the exception for
- // later access
-
- // if there isn't an exception yet
- if (pathRuntimeException == null) {
-
- // set the exception
- pathRuntimeException = runtimeException;
- }
-
- }
- }
- }
-
- /**
- * Getter for the path runtime exception.
- *
- * @return The path runtime exception.
- */
- public RuntimeException getPathRuntimeException() {
- return pathRuntimeException;
- }
-
- /**
- * Getter for the path IO exception.
- *
- * @return The path IO exception.
- */
- public IOException getPathIOException() {
- return pathIOException;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java
deleted file mode 100644
index 5dc8842456b..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraDirective: This class provides the model for representing the arara
- * directives found in the source file. It's a plain old Java object.
- */
-// package definition
-package com.github.arara.model;
-
-// needed imports
-import java.util.Map;
-
-/**
- * Provides the model for representing the arara directives found in the source
- * file.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class AraraDirective {
-
- // the directive name
- private String name;
- // the configuration
- private Map config;
- // the line number
- private int lineNumber = 0;
-
- /**
- * Constructor.
- *
- * @param name The directive name.
- * @param config The configuration.
- */
- public AraraDirective(String name, Map config) {
-
- // set the name
- this.name = name;
-
- // set the configuration
- this.config = config;
- }
-
- /**
- * Constructor.
- */
- public AraraDirective() {
- }
-
- /**
- * Getter for configuration.
- *
- * @return The configuration.
- */
- public Map getConfig() {
-
- // return it
- return config;
- }
-
- /**
- * Setter for configuration.
- *
- * @param config The configuration.
- */
- public void setConfig(Map config) {
-
- // set the configuration
- this.config = config;
- }
-
- /**
- * Getter for the directive name.
- *
- * @return The directive name.
- */
- public String getName() {
-
- // return it
- return name;
- }
-
- /**
- * Setter for the directive name.
- *
- * @param name The directive name.
- */
- public void setName(String name) {
-
- // set it
- this.name = name;
- }
-
- /**
- * Getter for the line number.
- *
- * @return The line number.
- */
- public int getLineNumber() {
-
- // return it
- return lineNumber;
- }
-
- /**
- * Setter for the line number.
- *
- * @param lineNumber The line number.
- */
- public void setLineNumber(int lineNumber) {
-
- // set it
- this.lineNumber = lineNumber;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java
deleted file mode 100644
index b04e9850236..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraLanguage: This class holds the data model for the arara language
- * specification.
- */
-// package definition.
-package com.github.arara.model;
-
-// needed import
-import java.util.Locale;
-
-/**
- * Holds the data model for the arara language specification.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraLanguage {
-
- // language name
- private String name;
- // language code
- private String code;
- // language locale
- private Locale locale;
-
- /**
- * Getter for the language name.
- *
- * @return The language name.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Setter for the language name.
- *
- * @param name The language name.
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * Getter for the language code.
- *
- * @return The language code.
- */
- public String getCode() {
- return code;
- }
-
- /**
- * Setter for the language code.
- *
- * @param code The language code.
- */
- public void setCode(String code) {
- this.code = code;
- }
-
- /**
- * Getter for the language locale.
- *
- * @return The language locale.
- */
- public Locale getLocale() {
- return locale;
- }
-
- /**
- * Setter for the language locale.
- *
- * @param locale The language locale.
- */
- public void setLocale(Locale locale) {
- this.locale = locale;
- }
-
- /**
- * Constructor.
- *
- * @param name The language name.
- * @param code The language code.
- * @param locale The language locale.
- */
- public AraraLanguage(String name, String code, Locale locale) {
- this.name = name;
- this.code = code;
- this.locale = locale;
- }
-
- /**
- * Returns a string representation of the object.
- *
- * @return The string representation of the object.
- */
- @Override
- public String toString() {
- return name.concat(" [").concat(code).concat("]");
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java
deleted file mode 100644
index 5ebe9382bf0..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * PlainAraraRuleConfig: This class provides the model for representing a plain
- * Arara rule configuration based on the YAML files. It's a plain old Java
- * object.
- */
-// package definition
-package com.github.arara.model;
-
-// needed imports
-import com.github.arara.utils.AraraUtils;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Provides the model for representing a plain Arara rule configuration based on
- * the YAML files. This class will be used to map YAML rules into Java objects.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class AraraRuleConfig {
-
- // the rule identifier
- private String identifier;
- // the rule name
- private String name;
- // the rule command
- private String command;
- // the rule commands
- private List<String> commands;
- // the arguments list
- private List<AraraRuleArgument> arguments;
-
- public List<String> getCommands() {
- return commands;
- }
-
- /**
- * Setter for the rule commands.
- *
- * @param commands A list containing the rule commands.
- */
- public void setCommands(List<String> commands) {
- this.commands = commands;
-
- // for every entry
- for (int i = 0; i < commands.size(); i++) {
-
- // remove keyword and reinsert into the list
- String currentCommand = AraraUtils.removeKeyword(commands.get(i));
- commands.set(i, currentCommand);
- }
- }
-
- /**
- * Getter for the rule identifier.
- *
- * @return The rule identifier.
- */
- public String getIdentifier() {
-
- // return it
- return identifier;
- }
-
- /**
- * Setter for the rule identifier.
- *
- * @param identifier The rule identifier.
- */
- public void setIdentifier(String identifier) {
-
- // set the identifier
- this.identifier = identifier;
- }
-
- /**
- * Getter for the rule name.
- *
- * @return The rule name.
- */
- public String getName() {
-
- // return it
- return name;
- }
-
- /**
- * Setter for the rule name.
- *
- * @param name The rule name.
- */
- public void setName(String name) {
-
- // set the rule name
- this.name = name;
- }
-
- /**
- * Getter for the rule command.
- *
- * @return The rule command.
- */
- public String getCommand() {
-
- // return it
- return command;
- }
-
- /**
- * Setter for the rule command.
- *
- * @param command The rule command.
- */
- public void setCommand(String command) {
-
- // set the command
- this.command = AraraUtils.removeKeyword(command);
- }
-
- /**
- * Getter for the arguments list.
- *
- * @return The arguments list.
- */
- public List<AraraRuleArgument> getArguments() {
-
- // return the list
- return arguments;
- }
-
- /**
- * Setter for the arguments list.
- *
- * @param arguments The arguments list.
- */
- public void setArguments(List<AraraRuleArgument> arguments) {
-
- // set the list
- this.arguments = arguments;
- }
-
- /**
- * Returns a list containing all argument identifiers.
- *
- * @return A list containing all argument identifiers.
- */
- public List<String> getIdentifiersList() {
-
- // create a new list
- List<String> result = new ArrayList<String>();
-
- // for every argument
- for (AraraRuleArgument argument : getArguments()) {
-
- // add identifier
- result.add(argument.getIdentifier());
- }
-
- // return list
- return result;
- }
-
- /**
- * Returns the forbidden identifier, if any.
- *
- * @return The forbidden identifier, if any.
- */
- public String checkForForbiddenIdentifiers() {
-
- // for every argument
- for (AraraRuleArgument argument : getArguments()) {
-
- // get the current argument value
- String value = argument.getIdentifier().toLowerCase();
-
- // check if it's a forbidden argument identifier
- if ((value.equals("file")) || (value.equals("files")) || (value.equals("item")) || (value.equals("items"))) {
-
- // return the value
- return value;
- }
- }
-
- // nothing wrong was found
- return null;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java
deleted file mode 100644
index 38a931f1119..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraConstants: This class contains all the constants used in the main
- * application.
- */
-// package definition
-package com.github.arara.utils;
-
-/**
- * Contains all the constants used in the main application.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraConstants {
-
- /**
- * The arara version.
- */
- public static final String VERSION = "3.0a";
- /**
- * The number of characters per line in messages.
- */
- public static final int WRAPLENGTH = 65;
- /**
- * The name of the default configuration file.
- */
- public static final String ARARACONFIG = "araraconfig.yaml";
- /**
- * The directive prefix for the pattern matching method.
- */
- public static final String DIRECTIVEPREFIX = "arara:\\s";
- /**
- * The rule pattern for string reference.
- */
- public static final String RULEPATTERN = "^(\\s)*<arara>\\s";
- /**
- * The name of the log file generated by arara.
- */
- public static final String LOGNAME = "arara";
- /**
- * The copyright year.
- */
- public static final String COPYRIGHTYEAR = "2012";
- /**
- * The variable exception matching pattern.
- */
- public static final String VAREXCEPTIONPATTERN = "^\\[Error: could not access: (.*);";
- /**
- * The method exception matching pattern.
- */
- public static final String METHODEXCEPTIONPATTERN = "^\\[Error: unable to access property \\((.*)\\): (.*)\\]";
- /**
- * The full directive matching pattern.
- */
- public static final String FULLDIRECTIVEPATTERN = "^\\s*(\\w+)\\s*:\\s*\\{.*\\}\\s*$";
- /**
- * The empty directive matching pattern.
- */
- public static final String EMPTYDIRECTIVEPATTERN = "^\\s*(\\w+)\\s*$";
-
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java
deleted file mode 100644
index 1b3f093699f..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraLocalization: This class contains a few helper methods in order to ease
- * the localization process during the execution. This class is a singleton
- * reference.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import java.text.MessageFormat;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-/**
- * Contains a few helper methods in order to ease the localization process
- * during the execution. This class is a singleton reference.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraLocalization {
-
- // the singleton reference
- private static AraraLocalization selfRef;
- // the resource bundle for the whole application
- private ResourceBundle resources;
-
- /**
- * Constructs the singleton instance.
- */
- private AraraLocalization() {
-
- // set the self-reference
- selfRef = this;
-
- // instead of relying in the default locale from the
- // operating system, always fallback to english
- Locale.setDefault(Locale.ENGLISH);
-
- // get the resource bundle
- resources = ResourceBundle.getBundle("com.github.arara.localization.Messages");
- }
-
- /**
- * Provides reference to the singleton object.
- *
- * @return The singleton instance.
- */
- public static final AraraLocalization getInstance() {
-
- // if there's no current object, call the private constructor
- if (selfRef == null) {
- selfRef = new AraraLocalization();
- }
-
- // return the actual object
- return selfRef;
- }
-
- /**
- * Returns a simple message from the resource bundle.
- *
- * @param message The message identifier.
- * @return A string from the resource bundle.
- */
- public String getMessage(String message) {
- return resources.getString(message);
- }
-
- /**
- * Returns a message containing parameters from the resource bundle.
- *
- * @param message The message identifier.
- * @param parameters A list of parameters to be replaced in the message.
- * @return A string from the resource bundle, with the correct parameters.
- */
- public String getMessage(String message, Object... parameters) {
- return MessageFormat.format(resources.getString(message), parameters);
- }
-
- /**
- * Refresh the resource bundle reference, if by any chance, the application
- * language is changed in runtime.
- */
- public void refresh() {
-
- // clear cache and reload the resource bundle
- // ResourceBundle.clearCache(); // not supported by Java 5
- resources = ResourceBundle.getBundle("com.github.arara.localization.Messages");
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java
deleted file mode 100644
index 3cbad2a970c..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraLogging: This class configures the logging features.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.core.joran.spi.JoranException;
-import org.slf4j.LoggerFactory;
-
-/**
- * Configures the logging features.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraLogging {
-
- public static void enableLogging(boolean enable) {
-
- // get the context
- LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-
- try {
-
- // create a new configurator
- JoranConfigurator configurator = new JoranConfigurator();
-
- // set context and reset it
- configurator.setContext(loggerContext);
- loggerContext.reset();
-
- // if logging should be enabled
- if (enable) {
-
- // add the correct properties and load the XML file
- loggerContext.putProperty("araraLogName", AraraConstants.LOGNAME);
- configurator.doConfigure(AraraLogging.class.getResourceAsStream("/com/github/arara/conf/logback.xml"));
- }
-
- } catch (JoranException joranException) {
- // do nothing
- }
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java
deleted file mode 100644
index 239dd4bf7cf..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java
+++ /dev/null
@@ -1,481 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraMethods: This class contains methods for the MVEL expression language to
- * be used in the rules.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed import
-import java.io.File;
-import org.apache.commons.lang3.SystemUtils;
-
-/**
- * Contains methods for the MVEL expression language to be used in the rules.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraMethods {
-
- /**
- * Holds the original filename.
- */
- private static String originalFile;
-
- /**
- * Setter for the original filename.
- *
- * @param originalFile The original filename.
- */
- public static void setOriginalFile(String originalFile) {
- AraraMethods.originalFile = originalFile;
- }
-
- /**
- * Getter for the original filename.
- *
- * @return A string containing the original filename.
- */
- public static String getOriginalFile() {
- return originalFile;
- }
-
- /**
- * Checks if string is empty.
- *
- * @param string The string.
- * @return A logical value according to the condition.
- */
- public static boolean isEmpty(String string) {
- return "".equals(string);
- }
-
- /**
- * Checks if string is not empty.
- *
- * @param string The string.
- * @return A logical value according to the condition.
- */
- public static boolean isNotEmpty(String string) {
- return !"".equals(string);
- }
-
- /**
- * Checks if string is empty.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @return A string according the condition.
- */
- public static String isEmpty(String string, String ifTrue) {
- return ("".equals(string) ? ifTrue : string);
- }
-
- /**
- * Checks if string is not empty.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @return A string according the condition.
- */
- public static String isNotEmpty(String string, String ifTrue) {
- return (!"".equals(string) ? ifTrue : string);
- }
-
- /**
- * Checks if string is empty.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @return A string according the condition.
- */
- public static String isEmpty(String string, String ifTrue, String ifFalse) {
- return ("".equals(string) ? ifTrue : ifFalse);
- }
-
- /**
- * Checks if string is not empty.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @return A string according the condition.
- */
- public static String isNotEmpty(String string, String ifTrue, String ifFalse) {
- return (!"".equals(string) ? ifTrue : ifFalse);
- }
-
- /**
- * Checks if string resolves to a logic value representing true.
- *
- * @param string The string.
- * @return A string according the condition.
- */
- public static boolean isTrue(String string) {
- string = string.toLowerCase();
- if ((string.equals("yes")) || (string.equals("on")) || (string.equals("true")) || (string.equals("y")) || (string.equals("1"))) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Checks if string resolves to a logic value representing false.
- *
- * @param string The string.
- * @return A string according the condition.
- */
- public static boolean isFalse(String string) {
- string = string.toLowerCase();
- if ((string.equals("no")) || (string.equals("off")) || (string.equals("false")) || (string.equals("n")) || (string.equals("0"))) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Checks if string resolves to a logic value representing true.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @return A string according the condition.
- */
- public static String isTrue(String string, String ifTrue) {
- return (isTrue(string) ? ifTrue : "");
- }
-
- /**
- * Checks if string resolves to a logic value representing false.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @return A string according the condition.
- */
- public static String isFalse(String string, String ifTrue) {
- return (isFalse(string) ? ifTrue : "");
- }
-
- /**
- * Checks if string resolves to a logic value representing true.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @return A string according the condition.
- */
- public static String isTrue(String string, String ifTrue, String ifFalse) {
- return (isTrue(string) ? ifTrue : ifFalse);
- }
-
- /**
- * Checks if string resolves to a logic value representing false.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @return A string according the condition.
- */
- public static String isFalse(String string, String ifTrue, String ifFalse) {
- return (isFalse(string) ? ifTrue : ifFalse);
- }
-
- /**
- * Checks if string resolves to a logic value representing true.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @param defaultValue Value if the string is neither true or false.
- * @return A string according the condition.
- */
- public static String isTrue(String string, String ifTrue, String ifFalse, String defaultValue) {
- if (isTrue(string)) {
- return ifTrue;
- }
- if (isFalse(string)) {
- return ifFalse;
- }
- return defaultValue;
- }
-
- /**
- * Checks if string resolves to a logic value representing false.
- *
- * @param string The string.
- * @param ifTrue Value if true.
- * @param ifFalse Value if false.
- * @param defaultValue Value if the string is neither true or false.
- * @return A string according the condition.
- */
- public static String isFalse(String string, String ifTrue, String ifFalse, String defaultValue) {
- if (isFalse(string)) {
- return ifTrue;
- }
- if (isTrue(string)) {
- return ifFalse;
- }
- return defaultValue;
- }
-
- /**
- * Trim spaces from the string.
- *
- * @param string The string.
- * @return The string with the trailing and leading spaces trimmed.
- */
- public static String trimSpaces(String string) {
- return string.trim();
- }
-
- /**
- * Returns the filename.
- *
- * @param f The string.
- * @return The filename.
- */
- public static String getFilename(String f) {
- try {
- return (new File(f)).getName();
- } catch (Exception exception) {
- return "";
- }
- }
-
- /**
- * Returns the base name.
- *
- * @param f The string.
- * @return The base name.
- */
- public static String getBasename(String f) {
- try {
- f = (new File(f)).getName();
- int i = f.lastIndexOf(".") != -1 ? f.lastIndexOf(".") : f.length();
- return f.substring(0, i);
- } catch (Exception exception) {
- return "";
- }
- }
-
- /**
- * Returns the filetype.
- *
- * @param f The string.
- * @return The filetype.
- */
- public static String getFiletype(String f) {
- try {
- f = (new File(f)).getName();
- if (f.lastIndexOf(".") != -1) {
- return f.substring(f.lastIndexOf(".") + 1, f.length());
- }
- return "";
- } catch (Exception exception) {
- return "";
- }
- }
-
- /**
- * Returns the directory name.
- *
- * @param f The string.
- * @return The directory name.
- */
- public static String getDirname(String f) {
- try {
- return (new File(f)).getParent();
- } catch (Exception exception) {
- return "";
- }
- }
-
- /**
- * Checks if the string is a valid existing file.
- *
- * @param f The string.
- * @return A logic value indicating if the string is a valid existing file.
- */
- public static boolean isFile(String f) {
- try {
- return (new File(f)).isFile();
- } catch (Exception exception) {
- return false;
- }
- }
-
- /**
- * Checks if the string is a valid existing directory.
- *
- * @param f The string.
- * @return A logic value indicating if the string is a valid existing
- * directory.
- */
- public static boolean isDir(String f) {
- try {
- return (new File(f)).isDirectory();
- } catch (Exception exception) {
- return false;
- }
- }
-
- /**
- * Checks if the operating system is Windows.
- *
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isWindows(String ifTrue, String ifFalse) {
- if (SystemUtils.IS_OS_WINDOWS) {
- return ifTrue;
- }
- else {
- return ifFalse;
- }
- }
-
- /**
- * Checks if the operating system is Linux.
- *
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isLinux(String ifTrue, String ifFalse) {
- if (SystemUtils.IS_OS_LINUX) {
- return ifTrue;
- }
- else {
- return ifFalse;
- }
- }
-
- /**
- * Checks if the operating system is Unix.
- *
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isUnix(String ifTrue, String ifFalse) {
- if (SystemUtils.IS_OS_UNIX) {
- return ifTrue;
- }
- else {
- return ifFalse;
- }
- }
-
- /**
- * Checks if the operating system is Mac.
- *
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isMac(String ifTrue, String ifFalse) {
- if (SystemUtils.IS_OS_MAC) {
- return ifTrue;
- }
- else {
- return ifFalse;
- }
- }
-
- /**
- * Checks if the logic condition is true.
- *
- * @param value Logic condition to be evaluated.
- * @param ifTrue The value if true.
- * @return A string according the condition.
- */
- public static String isTrue(boolean value, String ifTrue) {
- if (value) {
- return ifTrue;
- }
- return "";
- }
-
- /**
- * Checks if the logic condition is true.
- *
- * @param value Logic condition to be evaluated.
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isTrue(boolean value, String ifTrue, String ifFalse) {
- if (value) {
- return ifTrue;
- }
- return ifFalse;
- }
-
- /**
- * Checks if the logic condition is false.
- *
- * @param value Logic condition to be evaluated.
- * @param ifTrue The value if true.
- * @return A string according the condition.
- */
- public static String isFalse(boolean value, String ifTrue) {
- if (!value) {
- return ifTrue;
- }
- return "";
- }
-
- /**
- * Checks if the logic condition is false.
- *
- * @param value Logic condition to be evaluated.
- * @param ifTrue The value if true.
- * @param ifFalse The value if false.
- * @return A string according the condition.
- */
- public static String isFalse(boolean value, String ifTrue, String ifFalse) {
- if (!value) {
- return ifTrue;
- }
- return ifFalse;
- }
-
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java
deleted file mode 100644
index 42eaa6c44a2..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraUtils: This class contains some helper methods used for general purpose.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.commons.lang3.text.WordUtils;
-import org.yaml.snakeyaml.error.MarkedYAMLException;
-
-/**
- * Contains some helper methods used for general purpose.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class AraraUtils {
-
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Removes the reserved keyword in the strings to be analyzed by the MVEL
- * template engine. The keyword is set in AraraConstants.
- *
- * @param line The line to be analyzed.
- * @return The new line without the keyword.
- */
- public static String removeKeyword(String line) {
-
- // set a new pattern and matcher
- Pattern pattern = Pattern.compile(AraraConstants.RULEPATTERN);
- Matcher matcher = pattern.matcher(line);
-
- // if the keyword is found
- if (matcher.find()) {
-
- // remove the keyword
- line = (line.substring(matcher.end(), line.length())).trim();
- }
-
- // and return it
- return line;
- }
-
- /**
- * Prints the arara ASCII header.
- */
- public static void printHeader() {
-
- // print the ASCII art
- System.out.println(" __ _ _ __ __ _ _ __ __ _ ");
- System.out.println(" / _` | '__/ _` | '__/ _` |");
- System.out.println("| (_| | | | (_| | | | (_| |");
- System.out.println(" \\__,_|_| \\__,_|_| \\__,_|\n");
-
- }
-
- /**
- * Wraps the string to several lines, according to the wrap length set in
- * the AraraConstants class.
- *
- * @param message The message to be wrapped.
- * @return A new message.
- */
- public static String wrap(String message) {
-
- // create a new tokenizer in order to allow line breaks, so
- // every line is processed individually
- StringTokenizer tokens = new StringTokenizer(message, "\n", true);
- String result = "";
-
- // iterate through tokens
- while (tokens.hasMoreTokens()) {
-
- // wrap line according to the wrap length
- result = result.concat(WordUtils.wrap(tokens.nextToken(), AraraConstants.WRAPLENGTH));
- }
-
- // return the result
- return result;
- }
-
- /**
- * Gets the variable reference from a RuntimeException object.
- * @param runtimeException The RuntimeException object.
- *
- * @return The variable reference name.
- */
- public static String getVariableFromException(RuntimeException runtimeException) {
-
- // set pattern and matcher
- Pattern pattern = Pattern.compile(AraraConstants.VAREXCEPTIONPATTERN);
- Matcher matcher = pattern.matcher(runtimeException.getMessage());
-
- // if the variable is found
- if (matcher.find()) {
-
- // check if it's a valid reference
- if (matcher.groupCount() != 0) {
-
- // return the variable name
- return matcher.group(1);
- }
-
- } else {
-
- // maybe it's a method call, let's investigate
- pattern = Pattern.compile(AraraConstants.METHODEXCEPTIONPATTERN);
- matcher = pattern.matcher(runtimeException.getMessage());
-
- if (matcher.find()) {
-
- // check if it's a valid reference
- if (matcher.groupCount() > 1) {
-
- // return the method name
- return matcher.group(2);
- }
-
- }
-
- }
-
- // nothing is found, so return an unknown reference
- return "<unknown>";
- }
-
- /**
- * Extracts information from a MarkedYAMLException object.
- *
- * @param yamlException The exception object.
- * @return A string containing all the available information from the
- * exception object.
- */
- public static String extractInformationFromYAMLException(MarkedYAMLException yamlException) {
- StringBuilder stringBuilder = new StringBuilder();
- if (yamlException.getContext() != null) {
- stringBuilder.append(localization.getMessage("YamlError_Context", yamlException.getContext())).append("\n");
- }
- if (yamlException.getProblem() != null) {
- stringBuilder.append(localization.getMessage("YamlError_Problem", yamlException.getProblem())).append("\n");
- }
- if (yamlException.getProblemMark() != null) {
- stringBuilder.append(localization.getMessage("YamlError_ErrorLocation", yamlException.getProblemMark().getLine(), yamlException.getProblemMark().getColumn())).append("\n");
- }
- if (yamlException.getProblemMark().get_snippet() != null) {
- stringBuilder.append(yamlException.getProblemMark().get_snippet());
- }
- return stringBuilder.toString();
- }
-
- /**
- * Checks if the line contains a valid full directive.
- *
- * @param line The current line.
- * @return A logic value indicating if a valid directive was found.
- */
- public static boolean checkForFullDirective(String line) {
- Pattern pattern = Pattern.compile(AraraConstants.FULLDIRECTIVEPATTERN);
- Matcher m = pattern.matcher(line);
- if (m.find()) {
- return true;
- }
- else {
- return false;
- }
- }
-
- /**
- * Checks if the line contains a valid empty directive.
- *
- * @param line The current line.
- * @return A logic value indicating if a valid directive was found.
- */
- public static boolean checkForEmptyDirective(String line) {
- Pattern pattern = Pattern.compile(AraraConstants.EMPTYDIRECTIVEPATTERN);
- Matcher m = pattern.matcher(line);
- if (m.find()) {
- return true;
- }
- else {
- return false;
- }
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java
deleted file mode 100644
index 8cf0d2e9122..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * CommandLineAnalyzer: This class implements a command line parser to provide
- * better control of flags and files to process.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed import
-import java.io.File;
-import org.apache.commons.cli.*;
-
-/**
- * Implements a command line parser to provide better control of flags and files
- * to process.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class CommandLineAnalyzer {
-
- // the file to process
- private String theFile;
- // the command line arguments
- private String[] theArgs;
- // the command line options
- private Options commandLineOptions;
- // the verbose option
- private boolean showVerboseOutput;
- // the execution timeout,
- // in milliseconds
- private long executionTimeout;
- // the configuration
- private ConfigurationLoader configuration;
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Constructor.
- *
- * @param theArgs The command line arguments.
- * @param configuration The current configuration.
- */
- public CommandLineAnalyzer(String[] theArgs, ConfigurationLoader configuration) {
-
- // set the array
- this.theArgs = theArgs;
-
- // set the configuration
- this.configuration = configuration;
-
- // create new options
- commandLineOptions = new Options();
-
- // set the default value to the output
- showVerboseOutput = false;
-
- }
-
- /**
- * Parses the command line arguments and provides feedback to the main
- * class.
- *
- * @return A boolean value if there is a file to be processed by Arara.
- */
- public boolean parse() {
-
- // create the version option
- Option optVersion = new Option("V", "version", false, localization.getMessage("Help_Version"));
-
- // create the help option
- Option optHelp = new Option("h", "help", false, localization.getMessage("Help_Help"));
-
- // create the log option
- Option optLog = new Option("l", "log", false, localization.getMessage("Help_Log"));
-
- // create the verbose option
- Option optVerbose = new Option("v", "verbose", false, localization.getMessage("Help_Verbose"));
-
- // create the timeout option
- Option optTimeout = new Option("t", "timeout", true, localization.getMessage("Help_Timeout"));
-
- // create the language option
- Option optLanguage = new Option("L", "language", true, localization.getMessage("Help_Language"));
-
- // add version
- commandLineOptions.addOption(optVersion);
-
- // add help
- commandLineOptions.addOption(optHelp);
-
- // add log
- commandLineOptions.addOption(optLog);
-
- // add verbose
- commandLineOptions.addOption(optVerbose);
-
- // add timeout
- commandLineOptions.addOption(optTimeout);
-
- // add language
- commandLineOptions.addOption(optLanguage);
-
- // create a new basic parser
- CommandLineParser parser = new BasicParser();
-
- // lets try to parse everthing
- try {
-
- // parse the arguments
- CommandLine line = parser.parse(commandLineOptions, theArgs);
-
- // if -L or --language found
- if (line.hasOption("language")) {
-
- // create a new language controler
- LanguageController language = new LanguageController();
-
- // if the attempt to set the language according to the command
- // line has failed
- if (!language.setLanguage(line.getOptionValue("language"))) {
-
- // print the list of available languages
- language.printLanguageHelp();
-
- // print the usage
- printUsage();
-
- // and simply return
- return false;
- }
- else {
-
- // new language, refresh the options
- optVersion.setDescription(localization.getMessage("Help_Version"));
- optHelp.setDescription(localization.getMessage("Help_Help"));
- optLog.setDescription(localization.getMessage("Help_Log"));
- optVerbose.setDescription(localization.getMessage("Help_Verbose"));
- optTimeout.setDescription(localization.getMessage("Help_Timeout"));
- optLanguage.setDescription(localization.getMessage("Help_Language"));
- }
- }
-
- // if -h or --help found
- if (line.hasOption("help")) {
-
- // print version
- printVersion();
-
- // and usage
- printUsage();
-
- // return
- return false;
-
- } else {
-
- // if -v or --version found
- if (line.hasOption("version")) {
-
- // print version
- printVersion();
-
- printSpecialThanks();
-
- // and return
- return false;
-
- } else {
-
- // get the list of files
- String[] files = line.getArgs();
-
- // we only expect one file
- if (files.length != 1) {
-
- // print version
- printVersion();
-
- // usage
- printUsage();
-
- // and return
- return false;
-
- } else {
-
- // if -t or --timeout found
- if (line.hasOption("timeout")) {
-
- // try to convert the argument to a number
- try {
-
- // parse the long value
- executionTimeout = Long.parseLong(line.getOptionValue("timeout"));
-
- // if it's not a valid number
- if (executionTimeout <= 0) {
-
- // print version
- printVersion();
-
- // usage
- printUsage();
-
- // and return
- return false;
-
- }
- } catch (NumberFormatException numberFormatException) {
-
- // we have a bad conversion
-
- // print version
- printVersion();
-
- // usage
- printUsage();
-
- // and return
- return false;
- }
- } else {
-
- // fallback to the default value, that is,
- // timeout is disabled
- executionTimeout = 0;
- }
-
- // active logging
- AraraLogging.enableLogging(line.hasOption("log"));
-
- // set verbose flag
- showVerboseOutput = line.hasOption("verbose");
-
- // everything is fine, set
- // the file
- theFile = files[0];
-
- // check if file exists
- if (!checkFile(theFile, configuration.getValidExtensions())) {
-
- // file not found, return false
- return false;
-
- }
-
- // and return
- return true;
- }
- }
- }
-
- } catch (ParseException parseException) {
-
- // something happened, in the last case print version
- printVersion();
-
- // and usage
- printUsage();
-
- // and simply return
- return false;
-
- }
- }
-
- /**
- * Prints the usage message.
- */
- private void printUsage() {
-
- // new formatter
- HelpFormatter formatter = new HelpFormatter();
-
- // add the text and print
- formatter.printHelp("arara [file [--log] [--verbose] [--timeout N] [--language L] | --help | --version]", commandLineOptions);
- }
-
- /**
- * Prints the application version.
- */
- private void printVersion() {
-
- // print the version
- System.out.println("arara ".concat(AraraConstants.VERSION).concat(" - ").concat(localization.getMessage("Header_Slogan")));
- System.out.println("Copyright (c) ".concat(AraraConstants.COPYRIGHTYEAR).concat(", Paulo Roberto Massa Cereda"));
- System.out.println(localization.getMessage("Header_AllRightsReserved").concat("\n"));
- }
-
- /**
- * Getter for file obtained from the command line.
- *
- * @return The file.
- */
- public String getFile() {
-
- // return it
- return theFile;
- }
-
- /**
- * Checks if file is valid.
- *
- * @param filename The file name.
- * @param extensions A priority list of allowed extensions.
- * @return A boolean value to determine if the file is valid.
- */
- private boolean checkFile(String filename, String[] extensions) {
-
- // flag to indicate the file was found
- boolean foundFile = false;
-
- // iterate through all the extensions
- for (String currentExtension : extensions) {
-
- // check if the file has the current extension
- if (filename.toLowerCase().endsWith(currentExtension)) {
-
- // set flag
- foundFile = true;
-
- // set configuration
- configuration.setChosenFilePattern(currentExtension);
-
- // break iteration
- break;
- }
- }
-
- // create a new file status
- File fileStatus = null;
-
- // check if a reference was found
- if (foundFile) {
-
- // create new instance
- fileStatus = new File(filename);
-
- // check if exists
- if (fileStatus.exists()) {
-
- // add file
- theFile = filename;
-
- // found it!
- return true;
- } else {
-
- // print message about it
- System.out.println(localization.getMessage("Error_FileDoesNotExist", filename));
-
- // not found
- return false;
- }
-
- } else {
-
- // there's no extension, we will add them and see if something
- // is found
- for (String currentExtension : extensions) {
-
- // new file with extension
- fileStatus = new File(filename + currentExtension);
-
- // let's check it
- if (fileStatus.exists()) {
-
- // add file
- theFile = filename + currentExtension;
-
- // add reference
- configuration.setChosenFilePattern(currentExtension);
-
- // found it!
- return true;
-
- }
-
- }
-
- // print message about it
- System.out.println(AraraUtils.wrap(localization.getMessage("Error_FileDoesNotExistWithExtensionsList", filename, getExtensionsList(extensions))));
-
- // file not found
- return false;
-
- }
-
- }
-
- /**
- * Returns a string with the extensions list.
- *
- * @param extensions The extensions list.
- * @return A string with the extensions list.
- */
- private String getExtensionsList(String[] extensions) {
-
- // if it's an empty vector
- if (extensions.length == 0) {
-
- // return an empty string
- return "";
-
- } else {
-
- // get first element
- String result = "[".concat(extensions[0]);
-
- // iterate through the other values
- for (int i = 1; i < extensions.length; i++) {
-
- // add the current extension
- result = result.concat(", ").concat(extensions[i]);
- }
-
- // close the list
- result = result.concat("]");
-
- // return it
- return result;
- }
- }
-
- /**
- * Checks if the output must be verbose.
- *
- * @return A boolean value.
- */
- public boolean isVerbose() {
-
- // return it
- return showVerboseOutput;
- }
-
- /**
- * Getter for the execution timeout.
- *
- * @return The execution timeout.
- */
- public long getExecutionTimeout() {
-
- // return it
- return executionTimeout;
- }
-
- /**
- * Prints the special thanks message.
- */
- private void printSpecialThanks() {
- System.out.println(AraraUtils.wrap(localization.getMessage("Msg_SpecialThanks")));
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java
deleted file mode 100644
index 67b4ff98e9f..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * CommandTrigger: This class is responsible for running the arara commands.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraCommand;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.List;
-import org.apache.commons.exec.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Implements an environment for running the arara commands.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class CommandTrigger {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(CommandTrigger.class);
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
- // the commands list
- private List<AraraCommand> commands;
- // flag to determine verbose output
- private boolean showVerboseOutput;
- // value for the execution timeout
- private long executionTimeout;
-
- /**
- * Constructor.
- *
- * @param commands The commands list.
- */
- public CommandTrigger(List<AraraCommand> commands) {
-
- // set the list
- this.commands = commands;
- }
-
- /**
- * Setter for the execution timeout.
- *
- * @param executionTimeout The execution timeout.
- */
- public void setExecutionTimeout(long executionTimeout) {
-
- // set the value
- this.executionTimeout = executionTimeout;
- }
-
- /**
- * Setter for the verbose mode.
- *
- * @param verbose A flag to indicate the verbose mode.
- */
- public void setVerbose(boolean verbose) {
-
- // set the flag
- showVerboseOutput = verbose;
- }
-
- /**
- * Executes the arara commands provided in the list.
- *
- * @return A boolean value about the execution. To be honest, I don't think
- * it's necessary to return an actual value, but I kept it for possible
- * future use.
- * @throws AraraException Raised when the command is not found in the
- * underlying system.
- */
- public boolean execute() throws AraraException {
-
- // log action
- logger.info(localization.getMessage("Log_ReadyToRunCommands"));
-
- // for every command in the list
- for (AraraCommand currentAraraCommand : commands) {
-
- // print a message
- System.out.print(localization.getMessage("Msg_RunningCommand", currentAraraCommand.getName()).concat(" "));
-
- // if verbose
- if (showVerboseOutput) {
-
- // add two lines
- System.out.println("\n");
- }
-
- // log action
- logger.info(localization.getMessage("Log_CommandName", currentAraraCommand.getName()));
-
- // log command
- logger.trace(localization.getMessage("Log_Command", currentAraraCommand.getCommand()));
-
- // if the execution was ok
- //if (runCommand(currentAraraCommand)) {
- if (runCommand(currentAraraCommand)) {
-
- // print a message
- System.out.println(localization.getMessage("Msg_Success"));
-
- // log action
- logger.info(localization.getMessage("Log_CommandSuccess", currentAraraCommand.getName()));
-
- } else {
-
- // something bad happened, print message
- System.out.println(localization.getMessage("Msg_Failure"));
-
- // log action
- logger.warn(localization.getMessage("Log_CommandFailure", currentAraraCommand.getName()));
-
- // and return false
- return false;
-
- }
-
- // if verbose
- if (showVerboseOutput) {
-
- // add one line to the output
- System.out.println("");
- }
-
- }
-
- // log action
- logger.info(localization.getMessage("Log_AllCommandsSuccess"));
-
- // everything went ok, simply return true
- return true;
-
- }
-
- /**
- * Run the arara command.
- *
- * @param command The Arara command.
- * @return A boolean indicating if the execution was successful.
- * @throws AraraException Throws an exception in case the command was not
- * found.
- */
- private boolean runCommand(AraraCommand command) throws AraraException {
-
- // create a new byte array for the output logger
- ByteArrayOutputStream stringLogger = new ByteArrayOutputStream();
-
- // let's try
- try {
-
- // set a query
- String query = command.getCommand();
-
- // create a new command line from the query
- CommandLine commandLine = CommandLine.parse(query);
-
- // create a new tee
- TeeOutputStream tee;
-
- // create a new execution handler
- PumpStreamHandler streamHandler;
-
- // if verbose
- if (showVerboseOutput) {
-
- // the new tee should include the normal output
- // and the log
- tee = new TeeOutputStream(System.out, stringLogger);
-
- // verbose mode enables input mode as well
- streamHandler = new PumpStreamHandler(tee, tee, System.in);
-
- } else {
-
- // no verbose, so include only the log output
- tee = new TeeOutputStream(stringLogger);
-
- // define the handler only with the log output
- streamHandler = new PumpStreamHandler(tee);
- }
-
- // create a new executor
- DefaultExecutor executor = new DefaultExecutor();
-
- // set the handler
- executor.setStreamHandler(streamHandler);
-
- // check if there should be an execution timeout
- if (executionTimeout > 0) {
-
- // create a new watch dog
- ExecuteWatchdog watchDog = new ExecuteWatchdog(executionTimeout);
-
- // add it to the execution
- executor.setWatchdog(watchDog);
- }
-
- // set the shutdown hook
- ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
-
- // add it to the executor
- executor.setProcessDestroyer(processDestroyer);
-
- // execute the command and get the exit code
- int exitValue = executor.execute(commandLine);
-
- // if we are in verbose mode
- if (showVerboseOutput) {
-
- // print the output status
- System.out.print(localization.getMessage("Msg_Status").concat(" "));
-
- }
-
- // add the output to the logger
- logger.trace(localization.getMessage("Log_OutputLogging"));
- logger.trace(stringLogger.toString());
-
- // return the status as a boolean
- return (exitValue == 0 ? true : false);
-
- } catch (ExecuteException executeException) {
-
- // in case of an error, or the watchdog in action,
- // the logger addition is not reached, so we need
- // to replicate it here
- logger.trace(localization.getMessage("Log_OutputLogging"));
- logger.trace(stringLogger.toString());
-
- // something bad happened, return false
- return false;
-
- } catch (IOException ioException) {
-
- // log error
- logger.error(localization.getMessage("Log_CommandNotFound", command.getName(), command.getCommand()));
-
- // command not found, throw exception
- throw new AraraException(localization.getMessage("Error_CommandNotFound", command.getName(), command.getCommand()));
-
- }
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java
deleted file mode 100644
index db743c2e61f..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * ConfigurationLoader: This class provides an object handler for the arara
- * configuration file.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.Arara;
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraConfiguration;
-import com.github.arara.model.AraraFilePattern;
-import java.io.File;
-import java.io.FileReader;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang3.SystemUtils;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.error.MarkedYAMLException;
-import org.yaml.snakeyaml.nodes.Tag;
-import org.yaml.snakeyaml.representer.Representer;
-
-/**
- * Provides an object handler for the arara configuration file.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class ConfigurationLoader {
-
- // list of search paths
- private List<String> paths;
- // the application path, that is, where arara is located
- private String applicationPath;
- // list of file patterns
- private List<AraraFilePattern> filePatterns;
- // list of valid extensions
- private String[] validExtensions;
- // the chosen pattern
- private AraraFilePattern chosenFilePattern;
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Constructor.
- */
- public ConfigurationLoader() {
-
- // create a new list of paths
- paths = new ArrayList<String>();
-
- // try to obtain the application path
- try {
- applicationPath = Arara.class.getProtectionDomain().getCodeSource().getLocation().getPath();
- applicationPath = URLDecoder.decode(applicationPath, "UTF-8");
- applicationPath = new File(applicationPath).getParentFile().getPath();
- } catch (Exception exception) {
- applicationPath = "";
- }
- }
-
- /**
- * Loads the configuration settings, either the default setup or through the
- * configuration file.
- *
- * @throws Exception An exception is thrown if something unexpected happens
- * during the execution of this method.
- */
- public void load() throws Exception {
-
- // create the default patterns
-
- // for .tex files
- AraraFilePattern texPattern = new AraraFilePattern();
- texPattern.setExtension("tex");
- texPattern.setPattern("^(\\s)*%\\s+");
-
- // for .dtx files
- AraraFilePattern dtxPattern = new AraraFilePattern();
- dtxPattern.setExtension("dtx");
- dtxPattern.setPattern("^(\\s)*%\\s+");
-
- // for .ltx files
- AraraFilePattern ltxPattern = new AraraFilePattern();
- ltxPattern.setExtension("ltx");
- ltxPattern.setPattern("^(\\s)*%\\s+");
-
- // create a list of default patterns
- List<AraraFilePattern> defaultPatterns = new ArrayList<AraraFilePattern>();
-
- // add the default ones
- defaultPatterns.add(texPattern);
- defaultPatterns.add(dtxPattern);
- defaultPatterns.add(ltxPattern);
-
- // create a list of file patterns
- filePatterns = new ArrayList<AraraFilePattern>();
-
- // create a file reference
- File configurationFile = new File(SystemUtils.USER_HOME + File.separator + AraraConstants.ARARACONFIG);
-
- // if there is not a configuration file
- if (!configurationFile.exists()) {
-
- // there's only one path to look for rules
- paths.add(applicationPath + File.separator + "rules");
-
- // the only file patterns are the default ones
- filePatterns.addAll(defaultPatterns);
-
- // create an array of valid extensions
- validExtensions = new String[filePatterns.size()];
-
- // add them according to the file patterns
- for (int i = 0; i < filePatterns.size(); i++) {
- validExtensions[i] = ".".concat(filePatterns.get(i).getExtension());
- }
-
- // simply return, there's nothing more to do
- return;
- }
-
- // create the YAML representer
- Representer representer = new Representer();
- representer.addClassTag(AraraConfiguration.class, new Tag("!config"));
- representer.addClassTag(AraraFilePattern.class, new Tag("!pattern"));
-
- // create the YAML parser
- Yaml yaml = new Yaml(new Constructor(AraraConfiguration.class), representer);
-
- // create the file reader
- FileReader fileReader = new FileReader(configurationFile);
-
- // set the new configuration object
- AraraConfiguration configuration = null;
-
- try {
-
- // try to read the configuration object
- configuration = (AraraConfiguration) yaml.load(fileReader);
-
- } catch (MarkedYAMLException yamlException) {
-
- // there's an error with the YAML file, so an exception is thrown
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_InvalidYAMLConfigurationFile").concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException)));
- }
- catch (Exception e) {
- System.out.println(e.getMessage());
- }
-
- // close the file reader
- fileReader.close();
-
- // check if the configuration is invalid
- if (configuration == null) {
-
- // it's invalid, raise an exception
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_InvalidConfigurationFile"));
- }
-
- // check if there's an available language
- if (configuration.getLanguage() != null) {
-
- // create a new language control
- LanguageController languageController = new LanguageController();
-
- // if the language is not valid
- if (languageController.setLanguage(configuration.getLanguage()) == false) {
-
- // it's invalid, raise an exception
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_InvalidLanguageConfigurationFile", languageController.getLanguagesList()));
- }
- }
-
- // check if there are new paths
- if (configuration.getPaths() != null) {
-
- // a runtime exception happened when resolving some
- // path names
- if (configuration.getPathRuntimeException() != null) {
-
- // raise an exception
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_PathRuntimeErrorConfigurationFile", AraraUtils.getVariableFromException(configuration.getPathRuntimeException())));
- }
-
- // a IO exception happened when checking if it was
- // a valid path entry
- if (configuration.getPathIOException() != null) {
-
- // raise an exception
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_PathIOErrorConfigurationFile"));
- }
-
- // for every path set
- for (String currentPath : configuration.getPaths()) {
-
- // add it to the paths list
- paths.add(currentPath);
- }
- }
-
- // the last path to be added is the application path
- paths.add(applicationPath + File.separator + "rules");
-
- // check if there are new file patterns
- if (configuration.getFiletypes() != null) {
-
- // get all file patterns
- List<AraraFilePattern> filetypes = configuration.getFiletypes();
-
- // reorder the list of filetypes
- for (int i = 0; i < defaultPatterns.size(); i++) {
-
- // if the filetype is not in the default list
- if (!isAlreadyDefined(defaultPatterns.get(i), filetypes)) {
-
- // simply add it
- filePatterns.add(defaultPatterns.get(i));
- }
- }
-
- // merge the two lists
- filePatterns.addAll(filetypes);
-
- // create a new array of valid extensions
- validExtensions = new String[filePatterns.size()];
- int counter = 0;
-
- // sanity check, if there are valid extensions and patterns
- for (AraraFilePattern currentPattern : filePatterns) {
-
- // check if either of those fields is missing
- if ((currentPattern.getPattern() == null) || (currentPattern.getExtension() == null)) {
-
- // it's invalid, raise an exception
- AraraLogging.enableLogging(false);
- throw new AraraException(localization.getMessage("Error_InvalidFiletypesConfigurationFile"));
-
- }
-
- // add the dot to the extension
- validExtensions[counter] = ".".concat(currentPattern.getExtension());
- counter++;
- }
- } else {
-
- // no new filetypes, simply merge the lists
- filePatterns.addAll(defaultPatterns);
-
- // create a new array for extensions
- validExtensions = new String[filePatterns.size()];
-
- // iterate through all filetypes and add the extension to the array
- for (int i = 0; i < filePatterns.size(); i++) {
- validExtensions[i] = ".".concat(filePatterns.get(i).getExtension());
- }
- }
-
- }
-
- /**
- * Checks if the filetype is already defined in the list, and updates the
- * latter if needed.
- *
- * @param filePattern The filetype object.
- * @param list The list to be inspected.
- * @return A boolean indicating if the filetype is already defined in the
- * list.
- */
- private boolean isAlreadyDefined(AraraFilePattern filePattern, List<AraraFilePattern> list) {
-
- // iterate through all elements
- for (int i = 0; i < list.size(); i++) {
-
- // check if it already exists
- if (filePattern.getExtension().equalsIgnoreCase(list.get(i).getExtension())) {
-
- // update the element if needed
- if (list.get(i).getPattern() == null) {
- list.set(i, filePattern);
- }
-
- // already defined
- return true;
- }
- }
-
- // not found
- return false;
- }
-
- /**
- * Getter for the paths.
- *
- * @return The paths.
- */
- public List<String> getPaths() {
- return paths;
- }
-
- /**
- * Getter for the file patterns.
- *
- * @return The file patterns.
- */
- public List<AraraFilePattern> getFilePatterns() {
- return filePatterns;
- }
-
- /**
- * Getter for the valid extensions available.
- *
- * @return An array containing the valid extensions.
- */
- public String[] getValidExtensions() {
- return validExtensions;
- }
-
- /**
- * Setter for the chosen file pattern.
- *
- * @param extension A string containing a reference for the file extension.
- */
- public void setChosenFilePattern(String extension) {
-
- // for every file pattern
- for (AraraFilePattern currentPattern : filePatterns) {
-
- // if the extension matches
- if (".".concat(currentPattern.getExtension()).equals(extension)) {
-
- // we found our pattern
- chosenFilePattern = currentPattern;
-
- // return
- return;
- }
- }
-
- // nothing found
- chosenFilePattern = null;
- }
-
- /**
- * Getter for the chosen file pattern.
- *
- * @return The chosen file pattern.
- */
- public AraraFilePattern getChosenFilePattern() {
- return chosenFilePattern;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java
deleted file mode 100644
index 0614fcf4306..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * DirectiveExtractor: This class reads the file and extracts all the directives
- * it could find.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraDirective;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.error.MarkedYAMLException;
-import org.yaml.snakeyaml.representer.Representer;
-
-/**
- * Reads the file and extracts all the directives it could find.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class DirectiveExtractor {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(DirectiveExtractor.class);
- // the list of directives
- private List<AraraDirective> directives;
- // the file
- private File file;
- // the current line number
- private int currentLineNumber;
- // the configuration object
- private ConfigurationLoader configuration;
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Constructor.
- */
- public DirectiveExtractor() {
-
- // create new list
- directives = new ArrayList<AraraDirective>();
-
- // set file to null
- file = null;
- }
-
- /**
- * Constructor.
- *
- * @param file The file.
- */
- public DirectiveExtractor(File file, ConfigurationLoader configuration) {
-
- // create a new list
- directives = new ArrayList<AraraDirective>();
-
- this.configuration = configuration;
-
- // set file
- this.file = file;
- }
-
- /**
- * Setter for file.
- *
- * @param file The file.
- */
- public void setFile(File file) {
-
- // set the file
- this.file = file;
- }
-
- /**
- * Getter for Arara directives.
- *
- * @return A list containing all Arara directives.
- */
- public List<AraraDirective> getDirectives() {
-
- // return the list
- return directives;
- }
-
- /**
- * Extracts the directives from the file.
- *
- * @throws FileNotFoundException Raised when file not found.
- * @throws IOException Raised when an IO error happened.
- * @throws AraraException Raised when there's a problem with the directive.
- */
- public void extract() throws FileNotFoundException, IOException, AraraException {
-
- // create a new file reader
- FileReader fileReader = new FileReader(file);
-
- // create a new buffer
- BufferedReader bufferedReader = new BufferedReader(fileReader);
-
- // variable to hold the current line
- String currentLine;
-
- // the line count
- currentLineNumber = 0;
-
- // log directives
- logger.info("Reading directives from {}.", file.getName());
-
- // while not EOF
- while ((currentLine = bufferedReader.readLine()) != null) {
-
- // increment the current line number
- currentLineNumber++;
-
- // extract directive
- extractDirective(currentLine);
- }
-
- // close the buffer
- bufferedReader.close();
-
- // close the reader
- fileReader.close();
-
- }
-
- /**
- * Extracts the Arara directives from the current line.
- *
- * @param currentLine The current line.
- * @throws AraraException Raised when there is a problem with the directive.
- */
- private void extractDirective(String currentLine) throws AraraException {
-
- // get the pattern for the chosen filetype
- Pattern linePattern = Pattern.compile(configuration.getChosenFilePattern().getPattern());
-
- // create the matcher according to the pattern
- Matcher matcher = linePattern.matcher(currentLine);
-
- // if the pattern is found
- if (matcher.find()) {
-
- // get the substring
- currentLine = (currentLine.substring(matcher.end(), currentLine.length())).trim();
-
- // there is actually something after the keyword
- if (!"".equals(currentLine)) {
-
- // log directive
- logger.trace(localization.getMessage("Log_DirectiveFound", currentLineNumber, currentLine));
-
- // look for a full directive
- if (AraraUtils.checkForFullDirective(currentLine)) {
-
- // add it
- addAraraDirective(currentLine);
- }
- else {
-
- // look for an empty directive
- if (AraraUtils.checkForEmptyDirective(currentLine)) {
-
- // add it
- addEmptyAraraDirective(currentLine.trim());
- }
- else {
-
- // an invalid directive was found, throw error
- throw new AraraException(localization.getMessage("Error_InvalidDirective", currentLineNumber));
- }
- }
-
- }
- }
- }
-
- /**
- * Extracts an empty Arara directive.
- *
- * @param currentLine The current line.
- */
- private void addEmptyAraraDirective(String currentLine) {
-
- // create a new directive
- AraraDirective araraDirective = new AraraDirective();
-
- // set the name
- araraDirective.setName(currentLine);
-
- // set the config
- araraDirective.setConfig(new HashMap());
-
- // set the line number, in case of error
- araraDirective.setLineNumber(currentLineNumber);
-
- // add the directive to the list
- directives.add(araraDirective);
-
- }
-
- /**
- * Extracts am Arara directive.
- *
- * @param currentLine The current line.
- * @throws AraraException Raised when there is a problem with the directive.
- */
- private void addAraraDirective(String currentLine) throws AraraException {
-
- // lets try
- try {
-
- // create a new YAML parser
- Yaml yaml = new Yaml(new Constructor(), new Representer(), new DumperOptions(), new AraraResolver());
-
- // create a new map and load the current line
- Map config = (Map) yaml.load(currentLine);
-
- // create a new directive
- AraraDirective ad = new AraraDirective();
-
- // set the name
- ad.setName(currentLine);
-
- // set the config
- ad.setConfig(config);
-
- // set line number. in case of error
- ad.setLineNumber(currentLineNumber);
-
- // add the directive to the list
- directives.add(ad);
-
- } catch (MarkedYAMLException yamlException) {
-
- // malformed directive, throw exception
- throw new AraraException(localization.getMessage("Error_InvalidYAMLDirective", currentLineNumber).concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException)));
- }
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java
deleted file mode 100644
index b79a3741bd8..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * DirectiveParser: This class analyzes the list of directives and converts them
- * to a list of arara tasks.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraDirective;
-import com.github.arara.model.AraraTask;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Analyzes the list of directives and converts them to a list of arara tasks.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class DirectiveParser {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(DirectiveParser.class);
- // the list of directives
- private List<AraraDirective> directives;
- // the list of tasks
- private List<AraraTask> tasks;
- // the list of file names, to use as a temporary variable
- private List<String> fileNames;
- // the list of items
- private List<String> items;
- // the current file reference
- private File file;
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Constructor
- */
- public DirectiveParser() {
- }
-
- /**
- * Constructor.
- *
- * @param directives The Arara directives.
- */
- public DirectiveParser(List<AraraDirective> directives) {
-
- // set the directives
- this.directives = directives;
-
- // create a new list of tasks
- this.tasks = new ArrayList<AraraTask>();
-
- // create a new list of file names
- this.fileNames = new ArrayList<String>();
-
- // create a new list of items
- this.items = new ArrayList<String>();
- }
-
- /**
- * Setter for file.
- *
- * @param file The file.
- */
- public void setFile(File file) {
-
- // set the file
- this.file = file;
- }
-
- /**
- * Setter for the list of Arara directives.
- *
- * @param directives The list of Arara directives.
- */
- public void setDirectives(List<AraraDirective> directives) {
-
- // set the list
- this.directives = directives;
- }
-
- /**
- * Parses the list of Arara directives.
- *
- * @return A list of Arara tasks based on the directives.
- * @throws AraraMalformedDirective Raised when a malformed directive is
- * found.
- */
- public List<AraraTask> parse() throws AraraException {
-
- // log message
- logger.info("Parsing directives.");
-
- // for every directive
- for (AraraDirective currentDirective : directives) {
-
- // clear the list of files
- fileNames.clear();
-
- // clear the task name
- String taskName = "";
-
- // create a new map
- Map taskConfig = new HashMap();
-
- // if there's no configuration
- if (currentDirective.getConfig().isEmpty()) {
-
- // set the name
- taskName = currentDirective.getName();
-
- } else {
-
- // get the current config
- Map currentConfig = currentDirective.getConfig();
-
- // and get the directive name
- String directiveName = (String) currentConfig.keySet().iterator().next();
-
- // set the name to the task
- taskName = directiveName;
-
- // get the parameters
- Object currentConfigParameters = currentConfig.get(directiveName);
-
- // if it is a map
- if (currentConfigParameters instanceof Map) {
-
- // get the map
- Map currentParameters = (Map) currentConfigParameters;
-
- // if it is empty, error
- if (currentParameters.isEmpty()) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_DirectiveEmptyCurlyBrackets", directiveName, currentDirective.getLineNumber()));
-
- } else {
-
- // for every parameter
- for (Object currentParameterKey : currentParameters.keySet()) {
-
- // if the parameter is a string
- if (currentParameters.get(currentParameterKey) instanceof String) {
-
- // if it is a file reference, error
- if (((String) currentParameterKey).equals("files")) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_DirectiveInvalidArgumentList", directiveName, currentDirective.getLineNumber(), "files"));
- }
-
- if (((String) currentParameterKey).equals("items")) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_DirectiveInvalidArgumentList", directiveName, currentDirective.getLineNumber(), "items"));
- }
-
- // if it is a file reference, error
- if (((String) currentParameterKey).equals("file")) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_DirectiveReservedKeyword", directiveName, currentDirective.getLineNumber(), "file", "files"));
- }
-
- if (((String) currentParameterKey).equals("item")) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_DirectiveReservedKeyword", directiveName, currentDirective.getLineNumber(), "item", "items"));
- }
-
-
- // add the parameter to the configuration
- taskConfig.put(currentParameterKey, (String) currentParameters.get(currentParameterKey));
-
- } else {
-
- // if it is a list
- if (currentParameters.get(currentParameterKey) instanceof List) {
-
- // if it is a file reference
- if (((String) currentParameterKey).equals("files")) {
-
- // get the list
- for (Object currentListValue : ((List) currentParameters.get(currentParameterKey))) {
-
- // add the file names
- fileNames.add(currentListValue.toString());
- }
- } else {
-
- if (((String) currentParameterKey).equals("items")) {
-
- // get the list
- for (Object currentListValue : ((List) currentParameters.get(currentParameterKey))) {
-
- // add the file names
- items.add(currentListValue.toString());
- }
- } else {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_DirectiveListError", directiveName, currentDirective.getLineNumber()));
- }
- }
- } else {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_DirectiveGenericError", directiveName, currentDirective.getLineNumber()));
- }
- }
- }
- }
- } else {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_DirectiveGenericError", directiveName, currentDirective.getLineNumber()));
- }
- }
-
- // set original file name
- AraraMethods.setOriginalFile(file.getName());
-
- // if there is not a list of filenames
- if (fileNames.isEmpty()) {
-
- // add the only filename available
- fileNames.add(file.getName());
- }
-
- // if there are no items available
- if (items.isEmpty()) {
-
- // simply add an empty entry
- items.add("");
- }
-
- // for every filename
- for (String filename : fileNames) {
-
- // and for every item
- for (String item : items) {
-
- // create a new task
- AraraTask araraTask = new AraraTask();
-
- // set the name
- araraTask.setName(taskName);
-
- // create a new map based on the current configuration
- HashMap currentTaskConfig = new HashMap(taskConfig);
-
- // add the current file
- currentTaskConfig.put("file", filename);
- currentTaskConfig.put("item", item);
-
- // set the parameters
- araraTask.setParameters(currentTaskConfig);
-
- // and add the task to the list
- tasks.add(araraTask);
-
- // the current task is now null
- araraTask = null;
- }
- }
-
- // clear the list of files and items
- fileNames.clear();
- items.clear();
-
- }
-
- // return the list of tasks
- return tasks;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java
deleted file mode 100644
index ea3468c0443..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * LanguageController: This class holds the language model controller for arara.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.model.AraraLanguage;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Holds the language model controller for arara.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
- */
-public class LanguageController {
-
- // list of available languages
- private List<AraraLanguage> languages;
- // the localization singleton instance
- final static AraraLocalization localization = AraraLocalization.getInstance();
-
- /**
- * Constructor.
- */
- public LanguageController() {
-
- // create a new list of languages
- languages = new ArrayList<AraraLanguage>();
-
- // add the resources
- languages.add(new AraraLanguage("English", "en", new Locale("en")));
- languages.add(new AraraLanguage("Brazilian Portuguese", "ptbr", new Locale("pt", "BR")));
- languages.add(new AraraLanguage("Italian", "it", new Locale("it")));
- languages.add(new AraraLanguage("French", "fr", new Locale("fr")));
- languages.add(new AraraLanguage("Spanish", "es", new Locale("es")));
- languages.add(new AraraLanguage("German", "de", new Locale("de")));
- languages.add(new AraraLanguage("Turkish", "tr", new Locale("tr", "TR")));
- languages.add(new AraraLanguage("Russian", "ru", new Locale("ru")));
-
- }
-
- /**
- * Sets the current language according to the provided country code.
- *
- * @param code The country code.
- * @return A boolean value indicating if the new language was properly
- * applied.
- */
- public boolean setLanguage(String code) {
-
- // get the index of the language
- int i = getIndex(code);
-
- // if it's valid
- if (i != -1) {
-
- // set locale and refresh the resource bundle
- Locale.setDefault(languages.get(i).getLocale());
- localization.refresh();
-
- // everything went fine
- return true;
- }
-
- // the country code is invalid
- return false;
- }
-
- /**
- * Returns a string containing the list of available languages.
- *
- * @return A string containing the list of available languages.
- */
- public String getLanguagesList() {
-
- // get the first one in the list
- String result = languages.get(0).toString();
-
- // iterate through the rest
- for (int i = 1; i < languages.size(); i++) {
-
- // separate them by commas
- result = result.concat(", ").concat(languages.get(i).toString());
- }
-
- // return the string
- return result;
- }
-
- /**
- * Prints the language help.
- */
- public void printLanguageHelp() {
-
- // print message
- System.out.println(AraraUtils.wrap(localization.getMessage("Error_InvalidLanguage").concat("\n\n").concat(getLanguagesList()).concat("\n")));
- }
-
- /**
- * Gets the index for the country code.
- * @param code The country code.
- * @return An integer representing the index.
- */
- private int getIndex(String code) {
-
- // for every language
- for (int i = 0; i < languages.size(); i++) {
-
- // if the codes are equal
- if (languages.get(i).getCode().equalsIgnoreCase(code)) {
-
- // return the current counter
- return i;
- }
- }
-
- // nothing was found, return a negative value
- return -1;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java
deleted file mode 100644
index 2a5a9c462e5..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * TaskDeployer: This class is responsible for taking the tasks and turning them
- * into rara commands.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraCommand;
-import com.github.arara.model.AraraRuleArgument;
-import com.github.arara.model.AraraRuleConfig;
-import com.github.arara.model.AraraTask;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.*;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.SystemUtils;
-import org.mvel2.templates.TemplateRuntime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.error.MarkedYAMLException;
-import org.yaml.snakeyaml.nodes.Tag;
-import org.yaml.snakeyaml.representer.Representer;
-
-/**
- * Class responsible for taking the tasks and turning them into Arara commands.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class TaskDeployer {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(TaskDeployer.class);
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
- // the tasks list
- private List<AraraTask> tasks;
- //the output list with the proper commands
- private List<AraraCommand> commands;
- // the configuration
- private ConfigurationLoader configuration;
-
- /**
- * Constructor.
- *
- * @param tasks The Arara tasks.
- */
- public TaskDeployer(List<AraraTask> tasks, ConfigurationLoader configuration) {
-
- // set everything
- this.tasks = tasks;
-
- // set the configuration
- this.configuration = configuration;
-
- // create the list
- commands = new ArrayList<AraraCommand>();
-
- }
-
- /**
- * Deploys the tasks and returns the commands list.
- *
- * @return The Arara commands list.
- * @throws Exception Raised if something bad happened.
- */
- public List<AraraCommand> deploy() throws Exception {
-
- // log message
- logger.info("Deploying tasks into commands.");
-
- // for each task
- for (AraraTask currentTask : tasks) {
-
- // get the index where the rule is located
- int pathIndex = findRule(currentTask);
-
- // if it's not a negative index, that is, the rule was found
- if (pathIndex != -1) {
-
- // deploy plain rule
- deployRule(currentTask, pathIndex);
-
- } else {
-
- // not found, throw exception
- throw new AraraException(localization.getMessage("Error_RuleNotFound", currentTask.getName()));
- }
- }
-
- // return the commands
- return commands;
-
- }
-
- /**
- * Finds the rule in the rules directory.
- *
- * @param task The task to find.
- * @return The rule location.
- */
- private int findRule(AraraTask task) {
-
- // get the search path
- List<String> paths = configuration.getPaths();
-
- // for every entry in the search path
- for (int i = 0; i < paths.size(); i++) {
-
- // if the current task is found in the current path
- if (new File(paths.get(i).concat(File.separator).concat(task.getName()).concat(".yaml")).exists()) {
-
- // add an entry to the logger
- logger.trace(localization.getMessage("Log_RuleFound", task.getName(), paths.get(i)));
-
- // return the index of the current path
- return i;
- }
- }
-
- // nothing was found, return a negative value
- return -1;
-
- }
-
- /**
- * Deploys plain rule.
- *
- * @param task The task.
- * @throws Exception The rule has a bad definition.
- */
- private void deployRule(AraraTask task, int pathIndex) throws Exception {
-
- // create a representer
- Representer representer = new Representer();
-
- // add a class tag
- representer.addClassTag(AraraRuleConfig.class, new Tag("!config"));
- representer.addClassTag(AraraRuleArgument.class, new Tag("!argument"));
-
- // create a new YAML parser
- Yaml yaml = new Yaml(new Constructor(AraraRuleConfig.class), representer);
-
- FileReader fileReader = null;
-
- // new file reader
- fileReader = new FileReader(configuration.getPaths().get(pathIndex).concat(File.separator).concat(task.getName()).concat(".yaml"));
-
- // load rule
- AraraRuleConfig plainRule = null;
-
- try {
-
- // try to load the rule
- plainRule = (AraraRuleConfig) yaml.load(fileReader);
-
- } catch (MarkedYAMLException yamlException) {
-
- // YAML syntax error, throw exception
- throw new AraraException(localization.getMessage("Error_InvalidYAMLRule", task.getName(), configuration.getPaths().get(pathIndex)).concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException)));
- }
-
- try {
-
- // close reader
- fileReader.close();
-
- } catch (IOException ioException) {
- // do nothing here
- }
-
- // check if the rule is invalid
- if (plainRule == null) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_InvalidRule", task.getName(), configuration.getPaths().get(pathIndex)));
- }
-
- // verify if the identifier is empty
- if (plainRule.getIdentifier() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // check if the rule has a proper name
- if (plainRule.getName() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyNameRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // check if the rule has a proper list of arguments
- if (plainRule.getArguments() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyArgumentsListRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- }
- }
- }
-
- // if the rule name doesn't match with the file name
- if (!task.getName().equals(plainRule.getIdentifier())) {
-
- // throw exception
- throw new AraraException(localization.getMessage("Error_WrongIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.getIdentifier()));
- }
-
- // check if the rule has any forbidden identifier
- if (plainRule.checkForForbiddenIdentifiers() != null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_ForbiddenIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.checkForForbiddenIdentifiers()));
- }
-
- // get the list of all arguments available in the rule
- List<String> availableArgumentsInRule = plainRule.getIdentifiersList();
-
- // add the two reserved keywords
- availableArgumentsInRule.add("file");
- availableArgumentsInRule.add("item");
-
- // get the parameters for the task
- HashMap directiveMap = task.getParameters();
-
- // for every entry in the parameters map of the task, add it to the
- // list of available parameters in the directive
- List<String> availableArgumentsInDirective = new ArrayList<String>();
- for (Object theKey : directiveMap.keySet()) {
- availableArgumentsInDirective.add((String) theKey);
- }
-
- // find out which arguments are not defined in the directive and in
- // the rule
- List<String> argumentsNotDefinedInDirective = (List<String>) CollectionUtils.subtract(availableArgumentsInRule, availableArgumentsInDirective);
- List<String> argumentsNotDefinedInRule = (List<String>) CollectionUtils.subtract(availableArgumentsInDirective, availableArgumentsInRule);
-
- // if there are invalid arguments in the directive
- if (!argumentsNotDefinedInRule.isEmpty()) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_ArgumentsNotDefinedInRule", task.getName(), configuration.getPaths().get(pathIndex), argumentsNotDefinedInRule.toString()));
- }
-
- // for all arguments in the rule not mapped in the directive, set
- // their default value to an empty string
- for (String currentKey : argumentsNotDefinedInDirective) {
- directiveMap.put(currentKey, "");
- }
-
- // add entries in the arguments map
- HashMap argumentMap = new HashMap();
- argumentMap.put("file", directiveMap.get("file"));
- argumentMap.put("item", directiveMap.get("item"));
- directiveMap.remove("file");
- directiveMap.remove("item");
- argumentMap.put("parameters", directiveMap);
-
- // helper functions added
- argumentMap.put("SystemUtils", SystemUtils.class);
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class));
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class));
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class));
- argumentMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class));
- argumentMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class));
- argumentMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class));
- argumentMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class));
- argumentMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class));
- argumentMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class));
- argumentMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class));
- argumentMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class));
- argumentMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class));
- argumentMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class));
- argumentMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class));
-
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class));
-
- argumentMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile"));
-
- // create a rule map
- HashMap ruleMap = new HashMap();
-
- // for every argument in the rule
- for (AraraRuleArgument currentArgument : plainRule.getArguments()) {
-
- // if there's not a default value
- if (currentArgument.getDefault() == null) {
-
- // set the default to an empty string
- ruleMap.put(currentArgument.getIdentifier(), "");
-
- } else {
-
- // there's actually a default value
- try {
-
- // get the default value and apply the template
- String defaultValue = (String) TemplateRuntime.eval(currentArgument.getDefault(), argumentMap);
-
- // put the new default value into the rule map
- ruleMap.put(currentArgument.getIdentifier(), defaultValue);
-
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_DefaultValueRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
- }
- }
-
- // after setting the default values into the rule map, let's add
- // the directive parameters and both file and item references
- ruleMap.put("parameters", directiveMap);
- ruleMap.put("file", argumentMap.get("file"));
- ruleMap.put("item", argumentMap.get("item"));
-
- // helper classes
- ruleMap.put("SystemUtils", SystemUtils.class);
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class));
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class));
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class));
- ruleMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class));
- ruleMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class));
- ruleMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class));
- ruleMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class));
- ruleMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class));
- ruleMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class));
- ruleMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class));
- ruleMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class));
- ruleMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class));
- ruleMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class));
- ruleMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class));
-
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class));
-
- ruleMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile"));
-
- // remove references to file and item
- availableArgumentsInDirective.remove("file");
- availableArgumentsInDirective.remove("item");
-
- // for all arguments in the rule
- for (AraraRuleArgument currentArgument : plainRule.getArguments()) {
-
- // if the current argument is defined in the directive
- if (isArgumentDefinedInDirective(availableArgumentsInDirective, currentArgument)) {
-
- // if there is a valid flag
- if (currentArgument.getFlag() != null) {
-
- try {
-
- // get the flag and apply template
- String defaultFlag = (String) TemplateRuntime.eval(currentArgument.getFlag(), ruleMap);
-
- // put the new flag reference into the rule map
- ruleMap.put(currentArgument.getIdentifier(), defaultFlag);
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_FlagRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
- }
- }
- }
-
- // create a new list of commands to be executed by the current task
- List<String> commandsList = new ArrayList<String>();
-
- // if there is a command element in the rule
- if (plainRule.getCommand() != null) {
-
- // and if there isn't a list of commands
- if (plainRule.getCommands() == null) {
-
- // add the current command to the list of commands to
- // be executed
- commandsList.add(plainRule.getCommand());
-
- } else {
-
- // both are defined, throw an error
- throw new AraraException(localization.getMessage("Error_DuplicatedCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- }
- } else {
-
- // none of the fields is defined
- if (plainRule.getCommands() == null) {
-
- // neither of the elements is defined, throw an error
- throw new AraraException(localization.getMessage("Error_MissingCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // there's a list of commands, add them to the list
- commandsList.addAll(plainRule.getCommands());
- }
- }
-
- // for every command to be processed
- for (String commandTemplate : commandsList) {
-
- try {
- // get the current command and apply template
- commandTemplate = (String) TemplateRuntime.eval(commandTemplate, ruleMap);
-
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_CommandRuntimeErrorRule", task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
-
- // check if it's a valid command
- if (!"".equals(commandTemplate.trim())) {
-
- // create a new command
- AraraCommand araraCommand = new AraraCommand();
-
- // add the command
- araraCommand.setCommand(commandTemplate);
-
- // add the name
- araraCommand.setName(plainRule.getName());
-
- // add to the list
- commands.add(araraCommand);
-
- }
- }
- }
-
- /**
- * Checks if the current argument is included in the list of arguments from
- * the directive.
- *
- * @param arguments List of arguments from the directive.
- * @param argument The current argument to be analyzed.
- * @return A logic value indicating if the current argument is included in
- * the list of arguments from the directive.
- */
- private boolean isArgumentDefinedInDirective(List<String> arguments, AraraRuleArgument argument) {
-
- // for every argument in the list
- for (String current : arguments) {
-
- // if the identifiers match
- if (current.equalsIgnoreCase(argument.getIdentifier())) {
-
- // found it
- return true;
- }
- }
-
- // not found
- return false;
- }
-}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java
new file mode 100644
index 00000000000..c644978c93b
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java
@@ -0,0 +1,205 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.controller.LoggingController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Configuration;
+import com.github.cereda.arara.model.Directive;
+import com.github.cereda.arara.model.Extractor;
+import com.github.cereda.arara.model.Interpreter;
+import com.github.cereda.arara.model.Parser;
+import com.github.cereda.arara.model.StopWatch;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.DirectiveUtils;
+import com.github.cereda.arara.utils.DisplayUtils;
+import java.util.List;
+
+/**
+ * Main class. This class wraps all classes from the application model as well
+ * as utilitary classes in order to provide modularity.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Arara {
+
+ /**
+ * Main method. This is the application entry point.
+ * @param args A string array containing all command line arguments.
+ */
+ public static void main(String[] args) {
+
+ // the first component to be initialized is the
+ // language controller; note that init() actually
+ // has no body at all, but it's a dirty maneuver to
+ // trigger the static class startup
+ LanguageController.init();
+
+ // the second component to be initalized is the
+ // logging controller; note init() actually disables
+ // the logging, so early exceptions won't generate
+ // a lot of noise in the terminal
+ LoggingController.init();
+
+ // print the arara logo in the terminal; I just
+ // hope people use this tool in a good terminal with
+ // fixed-width fonts, otherwise the logo will be messed
+ DisplayUtils.printLogo();
+
+ try {
+
+ // first of all, let's try to load a potential
+ // configuration file located at the current
+ // user's home directory; if there's a bad
+ // configuration file, arara will panic and
+ // end the execution
+ Configuration.load();
+
+ // if we are here, either there was no configuration
+ // file at all or we managed to load the settings; now,
+ // it's time to properly parse the command line arguments;
+ // this is done by creating a brand new instance of arara's
+ // command line parser and providing the string array to it
+ Parser parser = new Parser(args);
+
+ // now let's see if we are good to go; parse() will return
+ // a boolean value indicating if the provided arguments
+ // allow the tool to continue (we might reach some special
+ // flags as well, like --help or --version, which simply
+ // do their jobs and return false, since there's no point
+ // of continuing processing with such flags)
+ if (parser.parse()) {
+
+ // let's print the current file information; it is a
+ // basic display, just the file name, the size properly
+ // formatted as a human readable format, and the last
+ // modification date; also, in this point, the logging
+ // feature starts to collect data (of course, if enabled
+ // either through the configuration file or manually
+ // in the command line)
+ DisplayUtils.printFileInformation();
+
+ // time to read the file and try to extract the directives;
+ // this class does a pretty good job on finding directives,
+ // including the multiline ones; it was a long awaited
+ // feature people were asking me to implement, so here
+ // it is!
+ Extractor extractor = new Extractor();
+
+ // extract() brings us a list of directives properly parsed
+ // and almost ready to be handled; note that no directives
+ // in the provided file will raise an exception; this is
+ // by design and I opted to not include a default fallback
+ // (although it wouldn't be so difficult to write one,
+ // I decided not to take the risk)
+ List<Directive> directives = extractor.extract();
+
+ // once we have our nice list of directives, it is time to
+ // actually validate them (for example, we have a couple of
+ // keywords that cannot be used as directive parameters);
+ // another interesting feature of the validate() method is
+ // to replicate a directive that has the 'files' keyword on
+ // it, since it's the whole point of having 'files' in the
+ // first place; if you check the log file, you will see
+ // that the list of extracted directives might differ from
+ // the final list of directives to be effectively processed
+ // by arara
+ directives = DirectiveUtils.validate(directives);
+
+ // arara features now a cool stopwatch, so we can see how
+ // much time has passed since everything started; start(),
+ // for obvious reasons, starts the stopwatch and keeps track
+ // of time for us; internally, this class makes use of
+ // nano time, so we might get an interesting precision here
+ // (although timing is not a serious business in here, it's
+ // just a cool addition)
+ StopWatch.start();
+
+ // this is surely the golden heart of arara; this class
+ // implements a powerful interpreter that will handle all
+ // rules and their corresponding tasks
+ Interpreter interpreter = new Interpreter();
+
+ // once we have this bad boy ready, let's provide the list
+ // of directives previously extracted and validated; it is
+ // like loading a cannon, I guess
+ interpreter.setDirectives(directives);
+
+ // time to shine, now the interpreter class will interpret
+ // one directive at a time, get the corresponding rule,
+ // set the parameters, evaluate it, get the tasks, run them,
+ // evaluate the result and print the status; note that
+ // arara, from this version on, will try to evaluate things
+ // progressively, so in case of an error, the previous tasks
+ // were already processed and potentially executed
+ interpreter.execute();
+ }
+
+ } catch (AraraException exception) {
+
+ // something bad just happened, so arara will print the proper
+ // exception and provide details on it, if available; the idea
+ // here is to propagate an exception throughout the whole
+ // application and catch it here instead of a local treatment
+ DisplayUtils.printException(exception);
+ }
+
+ // we are done here (with or without errors, that makes no difference
+ // at this point), so let's stop our stopwatch; now it's just an easy
+ // subtraction to be made (note that the values are internally
+ // represented as nanoseconds, but the result is printed as seconds)
+ StopWatch.stop();
+
+ // this is the last command from arara; once the execution time is
+ // available, print it; note that this notification is suppressed
+ // when the command line parsing returns false as result (it makes
+ // no sense to print the execution time for a help message, I guess)
+ DisplayUtils.printTime();
+
+ // gets the application exit status; the rule here is:
+ // 0 : everything went just fine (note that the dry-run mode always
+ // makes arara exit with 0, unless it is an error in the directive
+ // builder itself).
+ // 1 : one of the tasks failed, so the execution ended abruptly. This
+ // means the error relies on the command line call, not with arara.
+ // 2 : arara just handled an exception, meaning that something bad
+ // just happened and might require user intervention.
+ System.exit(CommonUtils.getExitStatus());
+
+ // I owe David Carlisle $10
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java
new file mode 100644
index 00000000000..f3868b488f5
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java
@@ -0,0 +1,106 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Implements the configuration controller. The idea here is to provide a map
+ * that holds all configuration settings used by model and utilitary classes
+ * throughout the execution. This controller is implemented as a singleton.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class ConfigurationController {
+
+ // the controller itself, since we have a singleton;
+ // this is the reference instance, instantiated once
+ private static final ConfigurationController instance =
+ new ConfigurationController();
+
+ // the configuration settings are stored in a map;
+ // pretty much everything can be stored in this map,
+ // as long as you know what to retrieve later on
+ private final Map<String, Object> map;
+
+ /**
+ * Private constructor. Called once for creating the proper singleton.
+ */
+ private ConfigurationController() {
+ map = new HashMap<String, Object>();
+ }
+
+ /**
+ * Gets the current configuration controller. Since this class is
+ * implemented as a singleton, you will get the same controller every
+ * single time, and that's good.
+ * @return The configuration controller, which hold the settings map.
+ */
+ public static ConfigurationController getInstance() {
+ return instance;
+ }
+
+ /**
+ * Returns the object indexed by the provided key. This method provides an
+ * easy access to the underlying map.
+ * @param key A string representing the key.
+ * @return An object indexed by the provided key.
+ */
+ public Object get(String key) {
+ return map.get(key);
+ }
+
+ /**
+ * Puts the object in the map and indexes it in the provided key. This
+ * method provides an easy access to the underlying map.
+ * @param key A string representing the key.
+ * @param value The object to be indexed by the provided key.
+ */
+ public void put(String key, Object value) {
+ map.put(key, value);
+ }
+
+ /**
+ * Checks if the map contains the provided key. This is actually a wrapper
+ * to the private map's method of the same name.
+ * @param key The key to be checked.
+ * @return A boolean value indicating if the map contains the provided key.
+ */
+ public boolean contains(String key) {
+ return map.containsKey(key);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LanguageController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LanguageController.java
new file mode 100644
index 00000000000..a0ccc2a9586
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LanguageController.java
@@ -0,0 +1,120 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.controller;
+
+import ch.qos.cal10n.IMessageConveyor;
+import ch.qos.cal10n.MessageConveyor;
+import java.util.Locale;
+
+/**
+ * Implements the language controller. This controller provides a singleton
+ * object that holds the application messages, easily available to all model
+ * and utilitary classes.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class LanguageController {
+
+ // the controller itself, since we have a singleton;
+ // this is the reference instance, instantiated once
+ private static final LanguageController instance =
+ new LanguageController();
+
+ // the message conveyor helps us to get localized messages
+ // according to the provided locale
+ private IMessageConveyor conveyor;
+
+ /**
+ * Private constructor. The fallback language is set to English for all
+ * messages in arara.
+ */
+ private LanguageController() {
+ conveyor = new MessageConveyor(new Locale("en"));
+ }
+
+ /**
+ * Initializes the class. This method actually does nothing, it just
+ * triggers the static attributions. Dirty, isn't it?
+ */
+ public static void init() {
+ // quack, quack, quack!
+ }
+
+ /**
+ * Gets the singleton reference. Since this class is implemented as a
+ * singleton, you will get the same controller every single time.
+ * @return The language controller which holds the conveyor.
+ */
+ public static LanguageController getInstance() {
+ return instance;
+ }
+
+ /**
+ * Sets the current locale. This method actually resets the language
+ * conveyor in order to use the new locale. It's quite simple.
+ * @param locale The new locale for localized messages through the language
+ * conveyor.
+ */
+ public void setLocale(Locale locale) {
+ conveyor = new MessageConveyor(locale);
+ }
+
+ /**
+ * Gets the localized message indexed by the provided enumeration key,
+ * applying an array of objects as parameters. This method is a wrapper to
+ * the conveyor's method of the same name.
+ * @param <E> Enumeration type that represents the conveyor messages.
+ * @param key Key set in the provided enumeration type.
+ * @param parameters Array of objects to be used as parameters.
+ * @return A string containing a localized message indexed by the provided
+ * enumeration key and applied the array of objects as parameters.
+ */
+ public <E extends Enum<?>> String getMessage(E key, Object... parameters) {
+ return conveyor.getMessage(key, parameters);
+ }
+
+ /**
+ * Gets the localized message indexed by the provided enumeration key. This
+ * method is a wrapper to the conveyor's method of the same name.
+ * @param <E> Enumeration type that represents the conveyor messages.
+ * @param key Key set in the provided enumeration type.
+ * @return A string containing a localized message indexed by the provided
+ * enumeration key.
+ */
+ public <E extends Enum<?>> String getMessage(E key) {
+ return conveyor.getMessage(key);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LoggingController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LoggingController.java
new file mode 100644
index 00000000000..193726fcc42
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/LoggingController.java
@@ -0,0 +1,109 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.controller;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
+import java.io.InputStream;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implements the logging controller. This class actually sets the logging
+ * configuration in order to allow appending results to a file.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class LoggingController {
+
+ /**
+ * Sets the logging configuration according to the provided boolean value.
+ * If the value is set to true, the log entries will be appended to a file,
+ * otherwise the logging feature will keep silent.
+ * @param enable A boolean value that indicates the logging behaviour
+ * throughout the application.
+ */
+ public static void enableLogging(boolean enable) {
+
+ // get the logger context from a factory, set a
+ // new context and reset it
+ LoggerContext loggerContext =
+ (LoggerContext) LoggerFactory.getILoggerFactory();
+
+ try {
+
+ // get a new configuration and set
+ // the context
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(loggerContext);
+ loggerContext.reset();
+
+ // if enabled, the log entries will be
+ // appended to a file, otherwise it will
+ // remain silent
+ if (enable) {
+
+ // set the file name and configure
+ // the logging controller to append
+ // entries to the file
+ String name = (String) ConfigurationController.
+ getInstance().get("execution.log.name");
+ loggerContext.putProperty("name", name);
+ configurator.doConfigure(getResource());
+ }
+ } catch (JoranException exception) {
+ // quack, quack, quack!
+ }
+ }
+
+ /**
+ * Get the configuration resource as an input stream. The configuration
+ * is actually a XML file.
+ * @return An input stream of the provided configuration XML resource.
+ */
+ private static InputStream getResource() {
+ String resource = "/com/github/cereda/arara/configuration/logback.xml";
+ return LoggingController.class.getResourceAsStream(resource);
+ }
+
+ /**
+ * Initializes the logging controller by disabling it. I don't want an odd
+ * behaviour out of the box.
+ */
+ public static void init() {
+ enableLogging(false);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SessionController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SessionController.java
new file mode 100644
index 00000000000..ac5a45d2b3e
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SessionController.java
@@ -0,0 +1,124 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Implements a session controller. This class wraps a map that holds the
+ * execution session, that is, a dirty maneuver to exchange pretty much any
+ * data between commands and even rules.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class SessionController {
+
+ // the controller itself, since we have a singleton;
+ // this is the reference instance, instantiated once
+ private static final SessionController instance =
+ new SessionController();
+
+ // the session map which holds the execution session;
+ // the idea here is to provide wrappers to the map
+ // methods, so it could be easily manipulated
+ private final Map<String, Object> map;
+
+ /**
+ * Private constructor. Called once when the singleton is created.
+ */
+ private SessionController() {
+ map = new HashMap<String, Object>();
+ }
+
+ /**
+ * Gets the singleton reference. Since this class is implemented as a
+ * singleton, you will get the same controller every single time.
+ * @return The session controller which holds the session map.
+ */
+ public static SessionController getInstance() {
+ return instance;
+ }
+
+ /**
+ * Gets the object indexed by the provided key. This method actually holds
+ * the map method of the very same name.
+ * @param key The provided map key.
+ * @return The object indexed by the provided map key.
+ */
+ public Object get(String key) {
+ return map.get(key);
+ }
+
+ /**
+ * Puts the object in the session map and indexes it under the provided
+ * key. This method actually holds the map method of the very same name.
+ * @param key The provided map key.
+ * @param value The object to be indexed under the provided key.
+ */
+ public void put(String key, Object value) {
+ map.put(key, value);
+ }
+
+ /**
+ * Checks if the session map contains the provided key. This method holds
+ * the map method of the very same name.
+ * @param key The key to be checked.
+ * @return A boolean value indicating if the session map contains the
+ * provided key.
+ */
+ public boolean contains(String key) {
+ return map.containsKey(key);
+ }
+
+ /**
+ * Remove an entry from the map according to the provided key. This method
+ * holds the map method of the same name.
+ * @param key The provided key to indicate which session map entry should
+ * be removed.
+ */
+ public void remove(String key) {
+ map.remove(key);
+ }
+
+ /**
+ * Clears the session map. This method, as usual, holds the map method of
+ * the same name.
+ */
+ public void clear() {
+ map.clear();
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SystemCallController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SystemCallController.java
new file mode 100644
index 00000000000..9a592853f69
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/SystemCallController.java
@@ -0,0 +1,153 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.zeroturnaround.exec.ProcessExecutor;
+
+/**
+ * Implements a system call controller. This class wraps a map that holds the
+ * result of system specific variables not directly available at runtime.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class SystemCallController {
+
+ /**
+ * Implements a private command interface.
+ */
+ private interface Command {
+
+ /**
+ * Executes the command body.
+ * @return An object.
+ */
+ public Object execute();
+ }
+
+ // the controller itself, since we have a singleton;
+ // this is the reference instance, instantiated once
+ private static final SystemCallController instance =
+ new SystemCallController();
+
+ // the system call map which holds the result of
+ // system specific variables not directly available
+ // at runtime; the idea here is to provide wrappers
+ // to the map getter, so it could be easily manipulated
+ private final Map<String, Object> map;
+
+ // the commands map will allow the system call map being
+ // populated only on demand, that is, if the key is not
+ // found, this map will provide the corresponding method
+ // and update the value
+ private final Map<String, Command> commands;
+
+ /**
+ * Private constructor. Called once when the singleton is created.
+ */
+ private SystemCallController() {
+
+ // create the new map instance to be
+ // populated on demand
+ map = new HashMap<String, Object>();
+
+ // create the new map of commands and
+ // add the corresponding system calls
+ commands = new HashMap<String, Command>();
+
+ // add the check for a Cygwin
+ // environment in here
+ commands.put("cygwin", new Command() {
+
+ /**
+ * Implements the body of the command. In this particular
+ * instance, it checks if we are inside a Cygwin environment.
+ * @return A boolean value indicating if we are inside a Cygwin
+ * environment.
+ */
+ public Object execute() {
+ try {
+
+ // execute a new system call to 'uname -s', read the output
+ // as an UTF-8 string, lowercase it and check if it starts
+ // with the 'cygwin' string; if so, we are inside Cygwin
+ return (
+ new ProcessExecutor().command("uname", "-s").
+ readOutput(true).execute().outputUTF8()
+ ).toLowerCase().startsWith("cygwin");
+
+ } catch (Exception exception) {
+
+ // gracefully fallback in case of any nasty and evil
+ // exception, e.g, if the command is unavailable
+ return false;
+ }
+ }
+ });
+ }
+
+ /**
+ * Gets the singleton reference. Since this class is implemented as a
+ * singleton, you will get the same controller every single time.
+ * @return The system call controller which holds the system call map.
+ */
+ public static SystemCallController getInstance() {
+ return instance;
+ }
+
+ /**
+ * Gets the object indexed by the provided key. This method actually holds
+ * the map method of the very same name.
+ * @param key The provided map key.
+ * @return The object indexed by the provided map key.
+ */
+ public Object get(String key) {
+
+ // if key is not found, meaning that
+ // the value wasn't required before
+ if (!map.containsKey(key)) {
+
+ // perform the system call and
+ // populate the corresponding value
+ map.put(key, commands.get(key).execute());
+ }
+
+ // simply return the corresponding
+ // value based on the provided key
+ return map.get(key);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/AraraException.java
index daa1b4ac48a..f2a340fd01f 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/AraraException.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,57 +30,59 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraException: This class aims at reducing every exception that happens in the
- * whole application to a single self-contained exception.
*/
-// package definition
-package com.github.arara.exception;
+package com.github.cereda.arara.model;
/**
- * Aims at reducing every exception that happens in the whole application to a
- * single self-contained exception.
- *
+ * Implements the specific exception model for arara.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
+ * @version 4.0
+ * @since 4.0
*/
public class AraraException extends Exception {
+ // the underlying exception,
+ // used to hold more details
+ // on what really happened
+ private Exception exception;
+
/**
- * Constructor.
+ * Constructor. Takes the exception message.
+ * @param message The exception message.
*/
- public AraraException() {
- super();
+ public AraraException(String message) {
+ super(message);
}
/**
- * Constructor with a message.
- *
- * @param message A message containing the cause of the exception thrown.
+ * Constructor. Takes the exception message and the underlying exception.
+ * @param message The exception message.
+ * @param exception The underlying exception object.
*/
- public AraraException(String message) {
+ public AraraException(String message, Exception exception) {
super(message);
+ this.exception = exception;
}
/**
- * Constructor with both message and the cause of the exception.
- *
- * @param message A message containing the cause of the exception thrown.
- * @param cause The throwable cause.
+ * Gets the underlying exception.
+ * @return The underlying message.
*/
- public AraraException(String message, Throwable cause) {
- super(message, cause);
+ public Exception getException() {
+ return exception;
}
/**
- * Constructor with the cause of the exception.
- *
- * @param cause The throwable cause.
+ * Checks if there is an underlying exception defined in the current object.
+ * @return A boolean value indicating if the current object has an
+ * underlying exception.
*/
- public AraraException(Throwable cause) {
- super(cause);
+ public boolean hasException() {
+ if (exception != null) {
+ return (exception.getMessage() != null);
+ } else {
+ return false;
+ }
}
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Argument.java
index 5f38418060a..0b15baf9d70 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Argument.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,94 +30,96 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * PlainAraraRuleArgument: This class provides the model for representing a
- * plain Arara rule argument based on the YAML files. It's a plain old Java
- * object.
*/
-// package definition
-package com.github.arara.model;
+package com.github.cereda.arara.model;
-// needed import
-import com.github.arara.utils.AraraUtils;
+import com.github.cereda.arara.utils.CommonUtils;
/**
- * Provides the model for representing a plain Arara rule argument based on the
- * YAML files. This class will be used to map YAML rules into Java objects.
- *
+ * The rule argument model.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
+ * @version 4.0
+ * @since 4.0
*/
-public class AraraRuleArgument {
+public class Argument {
- // the rule argument identifier
+ // the argument identifier
private String identifier;
- // the command flag
+
+ // a boolean indicating if the
+ // current argument is required
+ private boolean required;
+
+ // the flag to hold the argument
+ // value manipulation
private String flag;
- // the default value
- private String defaultValue;
+
+ // the argument fallback if it is
+ // not defined in the directive
+ private String fallback;
/**
- * Getter for the default value.
- *
- * @return The default value.
+ * Gets the identifier.
+ * @return The identifier.
*/
- public String getDefault() {
- return defaultValue;
+ public String getIdentifier() {
+ return CommonUtils.removeKeyword(identifier);
}
/**
- * Setter for the default value.
- *
- * @param defaultValue The default value.
+ * Sets the identifier.
+ * @param identifier The identifier.
*/
- public void setDefault(String defaultValue) {
- this.defaultValue = AraraUtils.removeKeyword(defaultValue);
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
}
/**
- * Getter for flag.
- *
- * @return The command flag.
+ * Checks if the argument is required.
+ * @return A boolean value indicating if the argument is required.
*/
- public String getFlag() {
-
- // return it
- return flag;
+ public boolean isRequired() {
+ return required;
}
/**
- * Setter for flag.
- *
- * @param flag The command flag.
+ * Sets the argument requirement.
+ * @param required A boolean value.
*/
- public void setFlag(String flag) {
-
- // set the flag
- this.flag = AraraUtils.removeKeyword(flag);
+ public void setRequired(boolean required) {
+ this.required = required;
}
/**
- * Getter for the argument identifier.
- *
- * @return The argument identifier.
+ * Gets the argument flag.
+ * @return The flag.
*/
- public String getIdentifier() {
+ public String getFlag() {
+ return CommonUtils.removeKeyword(flag);
+ }
- // return it
- return identifier;
+ /**
+ * Sets the argument flag.
+ * @param flag The argument flag.
+ */
+ public void setFlag(String flag) {
+ this.flag = flag;
}
/**
- * Setter for the argument identifier.
- *
- * @param identifier The argument identifier.
+ * Gets the argument fallback.
+ * @return The argument fallback.
*/
- public void setIdentifier(String identifier) {
+ public String getDefault() {
+ return CommonUtils.removeKeyword(fallback);
+ }
- // set the identifier
- this.identifier = identifier;
+ /**
+ * Sets the argument fallback.
+ * @param fallback The argument fallback.
+ */
+ public void setDefault(String fallback) {
+ this.fallback = fallback;
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Command.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Command.java
new file mode 100644
index 00000000000..30583898327
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Command.java
@@ -0,0 +1,122 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.utils.CommonUtils;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Implements a command model, containing a list of strings.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Command {
+
+ // a list of elements which are components
+ // of a command and represented as strings
+ private final List<String> elements;
+
+ // an optional file acting as a reference
+ // for the default working directory
+ private File workingDirectory;
+
+ /**
+ * Constructor.
+ * @param values An array of objects.
+ */
+ public Command(Object... values) {
+ elements = new ArrayList<String>();
+ List result = CommonUtils.flatten(Arrays.asList(values));
+ for (Object value : result) {
+ String element = String.valueOf(value);
+ if (!CommonUtils.checkEmptyString(element)) {
+ elements.add(element);
+ }
+ }
+ }
+
+ /**
+ * Constructor.
+ * @param elements A list of strings.
+ */
+ public Command(List<String> elements) {
+ this.elements = elements;
+ }
+
+ /**
+ * Gets the list of strings representing each element of a command.
+ * @return A list of strings.
+ */
+ public List<String> getElements() {
+ return elements;
+ }
+
+ /**
+ * Sets the working directory.
+ * @param workingDirectory A file representing the working directory.
+ */
+ public void setWorkingDirectory(File workingDirectory) {
+ this.workingDirectory = workingDirectory;
+ }
+
+ /**
+ * Gets the working directory, if any.
+ * @return A file representing the working directory.
+ */
+ public File getWorkingDirectory() {
+ return workingDirectory;
+ }
+
+ /**
+ * Checks if a working directory was defined.
+ * @return A logic value indicating if a working directory was defined.
+ */
+ public boolean hasWorkingDirectory() {
+ return workingDirectory != null;
+ }
+
+ /**
+ * Provides a textual representation of the current command.
+ * @return A string representing the current command.
+ */
+ @Override
+ public String toString() {
+ return CommonUtils.getCollectionElements(elements, "[ ", " ]", ", ");
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Conditional.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Conditional.java
new file mode 100644
index 00000000000..4c830f0a1b6
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Conditional.java
@@ -0,0 +1,139 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+/**
+ * The conditional class, it represents the type of conditional available
+ * for a directive and its corresponding expression to be evaluated.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Conditional {
+
+ // these are all types of conditionals arara
+ // is able to recognize; personally, I believe
+ // they are more than sufficient to cover the
+ // majority of test cases
+ public enum ConditionalType {
+
+ // evaluated beforehand, directive is interpreted
+ // if and only if the result is true
+ IF,
+
+ // there is no evaluation, directive is interpreted,
+ // no extra effort is needed
+ NONE,
+
+ // evaluated beforehand, directive is interpreted
+ // if and only if the result is false
+ UNLESS,
+
+ // directive is interpreted the first time, then the
+ // evaluation is done; while the result is false,
+ // the directive is interpreted again and again
+ UNTIL,
+
+ // evaluated beforehand, directive is interpreted if
+ // and oly if the result is true, and the process is
+ // repeated while the result still holds true
+ WHILE
+ }
+
+ // the conditional type, specified above; the
+ // default fallback, as seen in the constructor,
+ // is set to NONE, that is, no conditional at all
+ private ConditionalType type;
+
+ // the expression to be evaluated according to its
+ // type; the default fallback, as seen in the
+ // constructor, is set to an empty string
+ private String condition;
+
+ /**
+ * Constructor.
+ */
+ public Conditional() {
+ type = ConditionalType.NONE;
+ condition = "";
+ }
+
+ /**
+ * Gets the conditional type.
+ * @return The conditional type.
+ */
+ public ConditionalType getType() {
+ return type;
+ }
+
+ /**
+ * Sets the conditional type.
+ * @param type The conditional type.
+ */
+ public void setType(ConditionalType type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the condition, that is, the expression to be evaluated.
+ * @return A string representing the condition.
+ */
+ public String getCondition() {
+ return condition;
+ }
+
+ /**
+ * Sets the condition, that is, the expression to be evaluated.
+ * @param condition A string representing the condition.
+ */
+ public void setCondition(String condition) {
+ this.condition = condition;
+ }
+
+ /**
+ * Provides a textual representation of the conditional object.
+ * @return A string representation of this object.
+ */
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{ ").append(type);
+ if (type != ConditionalType.NONE) {
+ builder.append(", expression: ").append(condition.trim());
+ }
+ builder.append(" }");
+ return builder.toString();
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Configuration.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Configuration.java
new file mode 100644
index 00000000000..0c2c2949586
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Configuration.java
@@ -0,0 +1,246 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.ConfigurationUtils;
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Implements the configuration model, which holds the default settings and can
+ * load the configuration file.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Configuration {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Loads the application configuration.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static void load() throws AraraException {
+
+ // initialize both file type and language models,
+ // since we can track errors from there instead
+ // of relying on a check on this level
+ FileType.init();
+ Language.init();
+
+ // reset everything
+ reset();
+
+ // get the configuration file, if any
+ File file = ConfigurationUtils.getConfigFile();
+ if (file != null) {
+
+ // set the configuration file name for
+ // logging purposes
+ ConfigurationController.getInstance().
+ put("execution.configuration.name",
+ CommonUtils.getCanonicalPath(file)
+ );
+
+ // then validate it and update the
+ // configuration accordingly
+ Resource resource = ConfigurationUtils.validateConfiguration(file);
+ update(resource);
+ }
+
+ // just to be sure, update the
+ // current locale in order to
+ // display localized messages
+ Locale locale = ((Language) ConfigurationController.
+ getInstance().get("execution.language")).getLocale();
+ LanguageController.getInstance().setLocale(locale);
+ }
+
+ /**
+ * Resets the configuration to initial settings.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static void reset() throws AraraException {
+
+ // put everything in a map to be
+ // later assigned to the configuration
+ // controller, which holds the settings
+ Map<String, Object> mapping = new HashMap<String, Object>();
+
+ mapping.put("execution.loops", 10L);
+ mapping.put("directives.charset", Charset.forName("UTF-8"));
+ mapping.put("execution.errors.halt", true);
+ mapping.put("execution.timeout", false);
+ mapping.put("execution.timeout.value", 0L);
+ mapping.put("execution.timeout.unit", TimeUnit.MILLISECONDS);
+ mapping.put("application.version", "4.0");
+ mapping.put("application.revision", "1");
+ mapping.put("directives.linebreak.pattern", "^\\s*-->\\s(.*)$");
+
+ String directive = "^\\s*(\\w+)\\s*(:\\s*(\\{.*\\})\\s*)?";
+ String pattern = "(\\s+(if|while|until|unless)\\s+(\\S.*))?$";
+
+ mapping.put("directives.pattern", directive.concat(pattern));
+ mapping.put("application.pattern", "arara:\\s");
+ mapping.put("application.width", 65);
+ mapping.put("execution.database.name", "arara");
+ mapping.put("execution.log.name", "arara");
+ mapping.put("execution.verbose", false);
+
+ mapping.put("trigger.halt", false);
+ mapping.put("execution.language", new Language("en"));
+ mapping.put("execution.logging", false);
+ mapping.put("execution.dryrun", false);
+ mapping.put("execution.status", 0);
+ mapping.put("application.copyright.year", "2012-2018");
+ mapping.put("execution.filetypes", ConfigurationUtils.
+ getDefaultFileTypes());
+ mapping.put("execution.rule.paths",
+ Arrays.asList(
+ CommonUtils.buildPath(
+ ConfigurationUtils.getApplicationPath(),
+ "rules"
+ )
+ )
+ );
+
+ mapping.put("execution.preambles", new HashMap<String, String>());
+ mapping.put("execution.preamble.active", false);
+ mapping.put("execution.configuration.name", "[none]");
+ mapping.put("execution.header", false);
+ mapping.put("ui.lookandfeel", "none");
+
+ // get the configuration controller and
+ // set every map key to it
+ ConfigurationController controller =
+ ConfigurationController.getInstance();
+ for (String key : mapping.keySet()) {
+ controller.put(key, mapping.get(key));
+ }
+ }
+
+ /**
+ * Update the configuration based on the provided map.
+ * @param data Map containing the new configuration settings.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static void update(Resource resource) throws AraraException {
+
+ ConfigurationController controller =
+ ConfigurationController.getInstance();
+
+ if (resource.getPaths() != null) {
+ List<String> paths = resource.getPaths();
+ paths = ConfigurationUtils.normalizePaths(paths);
+ controller.put("execution.rule.paths", paths);
+ }
+
+ if (resource.getFiletypes() != null) {
+ List<FileTypeResource> resources = resource.getFiletypes();
+ List<FileType> filetypes = new ArrayList<FileType>();
+ for (FileTypeResource type : resources) {
+ if (type.getPattern() != null) {
+ filetypes.add(
+ new FileType(type.getExtension(), type.getPattern())
+ );
+ } else {
+ filetypes.add(new FileType(type.getExtension()));
+ }
+ }
+ filetypes = ConfigurationUtils.normalizeFileTypes(filetypes);
+ controller.put("execution.filetypes", filetypes);
+ }
+
+ controller.put("execution.verbose", resource.isVerbose());
+ controller.put("execution.logging", resource.isLogging());
+ controller.put("execution.header", resource.isHeader());
+
+ if (resource.getDbname() != null) {
+ controller.put("execution.database.name",
+ ConfigurationUtils.cleanFileName(resource.getDbname()));
+ }
+
+ if (resource.getLogname() != null) {
+ controller.put("execution.log.name",
+ ConfigurationUtils.cleanFileName(resource.getLogname()));
+ }
+
+ if (resource.getLanguage() != null) {
+ controller.put("execution.language",
+ new Language(resource.getLanguage()));
+ }
+
+ long loops = resource.getLoops();
+ if (loops > 0) {
+ controller.put("execution.loops", loops);
+ } else {
+ if (loops < 0) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CONFIGURATION_LOOPS_INVALID_RANGE
+ )
+ );
+ }
+ }
+
+ if (resource.getPreambles() != null) {
+ controller.put("execution.preambles",
+ resource.getPreambles());
+ }
+
+ if (resource.getLaf() != null) {
+ controller.put("ui.lookandfeel",
+ resource.getLaf());
+ }
+
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Database.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Database.java
new file mode 100644
index 00000000000..66d360fdc08
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Database.java
@@ -0,0 +1,80 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import java.util.HashMap;
+import org.simpleframework.xml.ElementMap;
+import org.simpleframework.xml.Root;
+
+/**
+ * The XML database model, which keeps track on file changes. I am using the
+ * Simple framework to marshall and unmarshall objects and XML files.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+@Root(name = "status")
+public class Database {
+
+ // the whole database is implemented as a map, where
+ // the key is the absolute canonical file and the value
+ // is its corresponding CRC32 hash; the XML map is done
+ // inline, so it does not clutter the output a lot
+ @ElementMap(entry = "hash", key = "file", attribute = true, inline = true)
+ private HashMap<String, String> map;
+
+ /**
+ * Constructor. It creates a new map.
+ */
+ public Database() {
+ map = new HashMap<String, String>();
+ }
+
+ /**
+ * Gets the map.
+ * @return The map.
+ */
+ public HashMap<String, String> getMap() {
+ return map;
+ }
+
+ /**
+ * Sets the map.
+ * @param map The map.
+ */
+ public void setMap(HashMap<String, String> map) {
+ this.map = map;
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Directive.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Directive.java
new file mode 100644
index 00000000000..e311477125c
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Directive.java
@@ -0,0 +1,146 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Implements the directive model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Directive {
+
+ // the directive identifier, it is resolved
+ // to the rule identifier later on
+ private String identifier;
+
+ // a map containing the parameters; they
+ // are validated later on in order to
+ // ensure they are valid
+ private Map<String, Object> parameters;
+
+ // a conditional containing the type and
+ // the expression to be evaluated later on
+ private Conditional conditional;
+
+ // a list contained all line numbers from
+ // the main file which built the current
+ // directive
+ private List<Integer> lineNumbers;
+
+ /**
+ * Gets the directive identifier.
+ * @return A string representing the directive identifier.
+ */
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ /**
+ * Sets the directive identifier.
+ * @param identifier A string representing the directive identifier.
+ */
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ /**
+ * Gets the directive parameters.
+ * @return A map containing the directive parameters.
+ */
+ public Map<String, Object> getParameters() {
+ return parameters;
+ }
+
+ /**
+ * Sets the directive parameters.
+ * @param parameters A map containing the directive parameters.
+ */
+ public void setParameters(Map<String, Object> parameters) {
+ this.parameters = parameters;
+ }
+
+ /**
+ * Gets the conditional object from the current directive.
+ * @return The conditional object from the current directive.
+ */
+ public Conditional getConditional() {
+ return conditional;
+ }
+
+ /**
+ * Sets the conditional object from the current directive.
+ * @param conditional The conditional object from the current directive.
+ */
+ public void setConditional(Conditional conditional) {
+ this.conditional = conditional;
+ }
+
+ /**
+ * Gets the list containing all line numbers from the current directive.
+ * @return A list containing all line numbers from the current directive.
+ */
+ public List<Integer> getLineNumbers() {
+ return lineNumbers;
+ }
+
+ /**
+ * Sets the list containing all line numbers from the current directive.
+ * @param lineNumbers A list containing all line numbers from the current
+ * directive.
+ */
+ public void setLineNumbers(List<Integer> lineNumbers) {
+ this.lineNumbers = lineNumbers;
+ }
+
+ /**
+ * Provides a textual representation of the current directive.
+ * @return A string containing a textual representation of the current
+ * directive.
+ */
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Directive: { ");
+ builder.append("identifier: ").append(identifier).append(", ");
+ builder.append("parameters: ").append(parameters).append(", ");
+ builder.append("conditional: ").append(conditional).append(", ");
+ builder.append("lines: ").append(lineNumbers).append(" }");
+ return builder.toString();
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Evaluator.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Evaluator.java
new file mode 100644
index 00000000000..41f8d099430
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Evaluator.java
@@ -0,0 +1,158 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.Methods;
+import java.util.HashMap;
+import java.util.Map;
+import org.mvel2.templates.TemplateRuntime;
+
+/**
+ * Implements the evaluator model, on which a conditional can be analyzed and
+ * processed.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Evaluator {
+
+ // this attribute holds the maximum number of
+ // loops arara will accept; it's like
+ // reaching infinity
+ private final long loops;
+
+ // the counter for the current execution, it
+ // helps us keep track of the number of times
+ // this evaluation has happened, and also to
+ // prevent potential infinite loops
+ private long counter;
+
+ // a flag that indicates the
+ // evaluation to halt regardless
+ // of the the result
+ private boolean halt;
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Constructor. It gets the application maximum number of loops and reset
+ * all counters.
+ */
+ public Evaluator() {
+ loops = (Long) ConfigurationController.getInstance().
+ get("execution.loops");
+ counter = 0;
+ halt = false;
+ }
+
+ /**
+ * Evaluate the provided conditional.
+ * @param conditional The conditional object.
+ * @return A boolean value indicating if the conditional holds.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public boolean evaluate(Conditional conditional) throws AraraException {
+
+ // when in dry-run mode, arara
+ // always ignore conditional evaluations
+ if (((Boolean) ConfigurationController.
+ getInstance().get("execution.dryrun")) == true) {
+ return false;
+ }
+
+ switch (conditional.getType()) {
+ case NONE:
+ return false;
+ case IF:
+ case UNLESS:
+ if (!halt) {
+ halt = true;
+ } else {
+ return false;
+ }
+ break;
+ }
+
+ // check counters and see if the execution
+ // has reached our concept of infinity,
+ // thus breaking the cycles
+ counter++;
+ if (((conditional.getType() == Conditional.ConditionalType.WHILE) &&
+ (counter > loops)) ||
+ ((conditional.getType() == Conditional.ConditionalType.UNTIL) &&
+ (counter >= loops))) {
+ return false;
+ } else {
+
+ Map<String, Object> context = new HashMap<String, Object>();
+ Methods.addConditionalMethods(context);
+
+ try {
+ Object result = TemplateRuntime.eval("@{ ".concat(
+ conditional.getCondition()).concat(" }"), context);
+ if (!CommonUtils.checkClass(Boolean.class, result)) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_EVALUATE_NOT_BOOLEAN_VALUE
+ )
+ );
+ } else {
+ boolean value = (Boolean) result;
+ switch (conditional.getType()) {
+ case UNLESS:
+ case UNTIL:
+ value = !value;
+ break;
+ }
+ return value;
+ }
+ } catch (RuntimeException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_EVALUATE_COMPILATION_FAILED
+ ),
+ exception
+ );
+ }
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Extractor.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Extractor.java
new file mode 100644
index 00000000000..84edef1eb05
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Extractor.java
@@ -0,0 +1,88 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.DirectiveUtils;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.List;
+import org.apache.commons.io.FileUtils;
+
+/**
+ * It extracts directives from the provided main file.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Extractor {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Extracts a list of directives from the provided main file, obtained from
+ * the configuration controller.
+ * @return A list of directives.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public List<Directive> extract() throws AraraException {
+
+ File file = (File) ConfigurationController.
+ getInstance().get("execution.reference");
+ Charset charset = (Charset) ConfigurationController.
+ getInstance().get("directives.charset");
+
+ try {
+ List<String> content = CommonUtils.getPreambleContent();
+ List<String> lines = FileUtils.readLines(file, charset.name());
+ content.addAll(lines);
+ return DirectiveUtils.extractDirectives(content);
+ } catch (IOException ioexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_EXTRACTOR_IO_ERROR
+ ),
+ ioexception
+ );
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileType.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileType.java
new file mode 100644
index 00000000000..b9f2a01e032
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileType.java
@@ -0,0 +1,170 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * Implements the file type model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class FileType {
+
+ // string representing the
+ // file extension
+ private String extension;
+
+ // string representing the
+ // file pattern to be used
+ // as directive lookup
+ private String pattern;
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // a map containing all file
+ // types that arara accepts
+ private static final Map<String, String> types =
+ new HashMap<String, String>();
+
+ /**
+ * Initializes the file type class by setting the default file types and
+ * their corresponding patterns.
+ */
+ public static void init() {
+ types.put("tex", "^\\s*%\\s+");
+ types.put("dtx", "^\\s*%\\s+");
+ types.put("ltx", "^\\s*%\\s+");
+ types.put("drv", "^\\s*%\\s+");
+ types.put("ins", "^\\s*%\\s+");
+ }
+
+ /**
+ * Constructor. It takes both file extension and pattern lookup.
+ * @param extension The file extension.
+ * @param pattern The file pattern.
+ */
+ public FileType(String extension, String pattern) {
+ this.extension = extension;
+ this.pattern = pattern;
+ }
+
+ /**
+ * Constructor. It takes the extension, but it might raise an exception if
+ * the extension is unknown. This constructor is used when you just want
+ * to reorganize the file lookup priority without the need of changing the
+ * default extensions.
+ * @param extension The file extension.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public FileType(String extension) throws AraraException {
+ if (types.containsKey(extension)) {
+ this.extension = extension;
+ this.pattern = types.get(extension);
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_FILETYPE_UNKNOWN_EXTENSION,
+ extension,
+ CommonUtils.getFileTypesList()
+ )
+ );
+ }
+ }
+
+ /**
+ * Implements the file type hash code. Note that only the file extension is
+ * considered.
+ * @return An integer representing the file type hash code.
+ */
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(extension).toHashCode();
+ }
+
+ /**
+ * Implements the file type equals method, checking if one file type is
+ * equal to another. Note that only the file extension is considered.
+ * @param object The object to be analyzed.
+ * @return A boolean value indicating if those two objects are equal.
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (object == null) {
+ return false;
+ }
+ if (getClass() != object.getClass()) {
+ return false;
+ }
+ final FileType reference = (FileType) object;
+ return new EqualsBuilder().append(extension, reference.extension).isEquals();
+ }
+
+ /**
+ * Gets the file type extension.
+ * @return String representing the file type extension.
+ */
+ public String getExtension() {
+ return extension;
+ }
+
+ /**
+ * Gets the file type pattern.
+ * @return String representing the file type pattern.
+ */
+ public String getPattern() {
+ return pattern;
+ }
+
+ /**
+ * Provides a textual representation of the current file type object.
+ * @return A string containing a textual representation of the current file
+ * type object.
+ */
+ @Override
+ public String toString() {
+ return ".".concat(extension);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileTypeResource.java
index 91e1e4759f9..29340358581 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/FileTypeResource.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,63 +30,55 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraFilePattern: This class maps the supported filetypes.
*/
-// package definition
-package com.github.arara.model;
+package com.github.cereda.arara.model;
-// needed imports
-import com.github.arara.utils.AraraConstants;
+import com.github.cereda.arara.utils.CommonUtils;
/**
- * Maps the supported filetypes.
- *
+ * Implements the file type resource model.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 3.0
+ * @version 4.0
+ * @since 4.0
*/
-public class AraraFilePattern {
+public class FileTypeResource {
- // file extension
+ // the file extension
private String extension;
- // file pattern
+
+ // the file pattern
private String pattern;
/**
- * Getter for the file extension.
- *
- * @return The file extension.
+ * Gets the extension.
+ * @return The extension.
*/
public String getExtension() {
- return extension;
+ return CommonUtils.removeKeyword(extension);
}
/**
- * Setter for the file extension.
- *
- * @param extension The file extension.
+ * Sets the extension.
+ * @param extension The extension.
*/
public void setExtension(String extension) {
this.extension = extension;
}
/**
- * Getter for the file pattern.
- *
- * @return The file pattern.
+ * Gets the pattern.
+ * @return The pattern.
*/
public String getPattern() {
- return pattern;
+ return CommonUtils.removeKeyword(pattern);
}
/**
- * Setter for the file pattern.
- *
- * @param pattern The file pattern.
+ * Sets the pattern.
+ * @param pattern The pattern.
*/
public void setPattern(String pattern) {
- this.pattern = pattern.concat(AraraConstants.DIRECTIVEPREFIX);
+ this.pattern = pattern;
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Interpreter.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Interpreter.java
new file mode 100644
index 00000000000..7c8f6e3928a
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Interpreter.java
@@ -0,0 +1,458 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.DisplayUtils;
+import com.github.cereda.arara.utils.InterpreterUtils;
+import com.github.cereda.arara.utils.Methods;
+import com.github.cereda.arara.utils.RuleUtils;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.mvel2.templates.TemplateRuntime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Interprets the list of directives.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Interpreter {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // the class logger obtained from
+ // the logger factory
+ private static final Logger logger =
+ LoggerFactory.getLogger(Interpreter.class);
+
+ // list of directives to be
+ // interpreted in here
+ private List<Directive> directives;
+
+ /**
+ * Sets the list of directives.
+ * @param directives The list of directives.
+ */
+ public void setDirectives(List<Directive> directives) {
+ this.directives = directives;
+ }
+
+ /**
+ * Executes each directive, throwing an exception if something bad has
+ * happened.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public void execute() throws AraraException {
+
+ for (Directive directive : directives) {
+
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_INTERPRET_RULE,
+ directive.getIdentifier()
+ )
+ );
+
+ ConfigurationController.getInstance().
+ put("execution.file",
+ directive.getParameters().get("reference")
+ );
+ File file = getRule(directive);
+
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_RULE_LOCATION,
+ file.getParent()
+ )
+ );
+
+ ConfigurationController.getInstance().
+ put("execution.info.rule.id", directive.getIdentifier());
+ ConfigurationController.getInstance().
+ put("execution.info.rule.path", file.getParent());
+ ConfigurationController.getInstance().
+ put("execution.directive.lines",
+ directive.getLineNumbers()
+ );
+ ConfigurationController.getInstance().
+ put("execution.directive.reference",
+ directive.getParameters().get("reference")
+ );
+
+ Rule rule = parseRule(file, directive);
+ Map<String, Object> parameters = parseArguments(rule, directive);
+ Methods.addRuleMethods(parameters);
+
+ String name = rule.getName();
+ List<String> authors = rule.getAuthors() == null ?
+ new ArrayList<String>() : rule.getAuthors();
+ ConfigurationController.getInstance().
+ put("execution.rule.arguments",
+ InterpreterUtils.getRuleArguments(rule)
+ );
+
+ Evaluator evaluator = new Evaluator();
+
+ boolean available = true;
+ if (InterpreterUtils.
+ runPriorEvaluation(directive.getConditional())) {
+ available = evaluator.evaluate(directive.getConditional());
+ }
+
+ if (available) {
+
+ do {
+
+ List<RuleCommand> commands = rule.getCommands();
+ for (RuleCommand command : commands) {
+ String closure = command.getCommand();
+ Object result = null;
+ try {
+ result = TemplateRuntime.eval(closure, parameters);
+ } catch (RuntimeException exception) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR
+ )
+ ),
+ exception
+ );
+ }
+
+ List<Object> execution = new ArrayList<Object>();
+ if (CommonUtils.checkClass(List.class, result)) {
+ execution = CommonUtils.flatten((List<?>) result);
+ } else {
+ execution.add(result);
+ }
+
+ for (Object current : execution) {
+
+ if (current == null) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_NULL_COMMAND
+ )
+ )
+ );
+ } else {
+
+ if (!CommonUtils.checkEmptyString(
+ String.valueOf(current))) {
+
+ DisplayUtils.printEntry(name,
+ command.getName() == null ?
+ messages.getMessage(
+ Messages.INFO_LABEL_UNNAMED_TASK
+ )
+ : command.getName()
+ );
+ boolean success = true;
+
+ if (CommonUtils.checkClass(
+ Trigger.class, current)) {
+ if (((Boolean) ConfigurationController.
+ getInstance().
+ get("execution.dryrun")) == false) {
+ if (((Boolean) ConfigurationController.
+ getInstance().
+ get("execution.verbose")) == true) {
+ DisplayUtils.wrapText(
+ messages.getMessage(
+ Messages.INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE
+ )
+ );
+ }
+ } else {
+ DisplayUtils.printAuthors(authors);
+ DisplayUtils.wrapText(
+ messages.getMessage(
+ Messages.INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE
+ )
+ );
+ DisplayUtils.printConditional(
+ directive.getConditional()
+ );
+ }
+ Trigger trigger = (Trigger) current;
+ trigger.process();
+ } else {
+ Object representation =
+ CommonUtils.checkClass(
+ Command.class,
+ current
+ ) ?
+ current
+ : String.valueOf(current);
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_SYSTEM_COMMAND,
+ representation
+ )
+ );
+
+ if (((Boolean) ConfigurationController.
+ getInstance().
+ get("execution.dryrun")) == false) {
+ int code = InterpreterUtils.
+ run(representation);
+ Object check = null;
+ try {
+ Map<String, Object> context =
+ new HashMap<String, Object>();
+ context.put("value", code);
+ check = TemplateRuntime.eval(
+ "@{ ".concat(
+ command.getExit() == null ?
+ "value == 0"
+ : command.getExit()).concat(" }"),
+ context);
+ } catch (RuntimeException exception) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().
+ concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_EXIT_RUNTIME_ERROR
+ )
+ ),
+ exception
+ );
+ }
+ if (CommonUtils.
+ checkClass(
+ Boolean.class,
+ check)) {
+ success = (Boolean) check;
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN
+ )
+ )
+ );
+ }
+ } else {
+ DisplayUtils.printAuthors(authors);
+ DisplayUtils.wrapText(
+ messages.getMessage(
+ Messages.INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND,
+ representation
+ )
+ );
+ DisplayUtils.printConditional(
+ directive.getConditional()
+ );
+ }
+ }
+
+ DisplayUtils.printEntryResult(success);
+
+ if (((Boolean) ConfigurationController.
+ getInstance().get("trigger.halt"))
+ || (((Boolean) ConfigurationController.
+ getInstance().
+ get("execution.errors.halt")
+ && !success))) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ } while (evaluator.evaluate(directive.getConditional()));
+ }
+ }
+ }
+
+ /**
+ * Gets the rule according to the provided directive.
+ * @param directive The provided directive.
+ * @return The absolute canonical path of the rule, given the provided
+ * directive.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private File getRule(Directive directive) throws AraraException {
+ File file = InterpreterUtils.buildRulePath(directive.getIdentifier());
+ if (file == null) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_RULE_NOT_FOUND,
+ directive.getIdentifier(),
+ CommonUtils.getCollectionElements(
+ CommonUtils.getAllRulePaths(),
+ "(",
+ ")",
+ "; "
+ )
+ )
+ );
+ } else {
+ return file;
+ }
+ }
+
+ /**
+ * Parses the rule against the provided directive.
+ * @param file The file representing the rule.
+ * @param directive The directive to be analyzed.
+ * @return A rule object.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private Rule parseRule(File file, Directive directive)
+ throws AraraException {
+ return RuleUtils.parseRule(file, directive.getIdentifier());
+ }
+
+ /**
+ * Parses the rule arguments against the provided directive.
+ * @param rule The rule object.
+ * @param directive The directive.
+ * @return A map containing all arguments resolved according to the
+ * directive parameters.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private Map<String, Object> parseArguments(Rule rule, Directive directive)
+ throws AraraException {
+
+ List<Argument> arguments = rule.getArguments();
+
+ Set<String> unknown = CommonUtils.
+ getUnknownKeys(directive.getParameters(), arguments);
+ unknown.remove("file");
+ unknown.remove("reference");
+ if (!unknown.isEmpty()) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_UNKNOWN_KEYS,
+ CommonUtils.getCollectionElements(
+ unknown,
+ "(",
+ ")",
+ ", "
+ )
+ )
+ )
+ );
+ }
+
+ Map<String, Object> mapping = new HashMap<String, Object>();
+ mapping.put("file", directive.getParameters().get("file"));
+ mapping.put("reference", directive.getParameters().get("reference"));
+
+ Map<String, Object> context = new HashMap<String, Object>();
+ context.put("parameters", directive.getParameters());
+ context.put("file", directive.getParameters().get("file"));
+ context.put("reference", directive.getParameters().get("reference"));
+ Methods.addRuleMethods(context);
+
+ for (Argument argument : arguments) {
+ if ((argument.isRequired()) &&
+ (!directive.getParameters().containsKey(
+ argument.getIdentifier()))) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED,
+ argument.getIdentifier()
+ )
+ )
+ );
+ }
+
+ if (argument.getDefault() != null) {
+ try {
+ Object result = TemplateRuntime.
+ eval(argument.getDefault(), context);
+ mapping.put(argument.getIdentifier(), result);
+ } catch (RuntimeException exception) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().
+ concat(messages.getMessage(
+ Messages.ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR
+ )
+ ),
+ exception
+ );
+ }
+ } else {
+ mapping.put(argument.getIdentifier(), "");
+ }
+
+ if ((argument.getFlag() != null) &&
+ (directive.getParameters().containsKey(
+ argument.getIdentifier()))) {
+
+ try {
+ Object result = TemplateRuntime.eval(
+ argument.getFlag(),
+ context
+ );
+ mapping.put(argument.getIdentifier(), result);
+ } catch (RuntimeException exception) {
+ throw new AraraException(CommonUtils.getRuleErrorHeader().
+ concat(
+ messages.getMessage(
+ Messages.ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION
+ )
+ ),
+ exception
+ );
+ }
+ }
+ }
+
+ return mapping;
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Language.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Language.java
new file mode 100644
index 00000000000..2b0fc8266e8
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Language.java
@@ -0,0 +1,148 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.utils.CommonUtils;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Implements the language model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Language {
+
+ // the language code, based on
+ // ISO 639-1 and language variants
+ private final String code;
+
+ // map containing all languages
+ // supported by nightingale
+ private static final Map<String, Pair<String, Locale>> languages =
+ new HashMap<String, Pair<String, Locale>>();
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Initialize the language model. All supported languages are added in here.
+ */
+ public static void init() {
+ languages.put("en", new Pair<String, Locale>(
+ "English",
+ new Locale("en")
+ ));
+ languages.put("de", new Pair<String, Locale>(
+ "German",
+ new Locale("de")
+ ));
+ languages.put("nl", new Pair<String, Locale>(
+ "Dutch",
+ new Locale("nl")
+ ));
+ languages.put("qn", new Pair<String, Locale>(
+ "Broad Norfolk",
+ new Locale("en", "QN")
+ ));
+ languages.put("ptbr", new Pair<String, Locale>(
+ "Brazilian Portuguese",
+ new Locale("pt", "BR")
+ ));
+ languages.put("it", new Pair<String, Locale>(
+ "Italian",
+ new Locale("it")
+ ));
+ }
+
+ /**
+ * Creates a new language object. It might raise an exception if the
+ * provided language does not exist in the map.
+ * @param code The language code, based on ISO 639-1 and language variants.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public Language(String code) throws AraraException {
+ if (languages.containsKey(code)) {
+ this.code = code;
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_LANGUAGE_INVALID_CODE,
+ getLanguagesList()
+ )
+ );
+ }
+ }
+
+ /**
+ * Gets the language name.
+ * @return A string representing the language name.
+ */
+ public String getName() {
+ return languages.get(code).getFirstElement();
+ }
+
+ /**
+ * Gets the language locale.
+ * @return The language locale.
+ */
+ public Locale getLocale() {
+ return languages.get(code).getSecondElement();
+ }
+
+ /**
+ * Gets a string representing the list of available languages.
+ * @return String representing the list of available languages.
+ */
+ public static String getLanguagesList() {
+ List<String> entries = new ArrayList<String>();
+ for (String key : languages.keySet()) {
+ entries.add(languages.get(key).
+ getFirstElement().
+ concat(": ").
+ concat(key)
+ );
+ }
+ return CommonUtils.getCollectionElements(entries, "(", ")", ", ");
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Messages.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Messages.java
new file mode 100644
index 00000000000..9916c3c145b
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Messages.java
@@ -0,0 +1,170 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import ch.qos.cal10n.BaseName;
+import ch.qos.cal10n.Locale;
+import ch.qos.cal10n.LocaleData;
+
+/**
+ * This enumeration contains all application messages.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+@BaseName("com.github.cereda.arara.localization.messages")
+@LocaleData({
+ @Locale(value = "de", charset = "UTF-8"),
+ @Locale(value = "en", charset = "UTF-8"),
+ @Locale(value = "en_QN", charset = "UTF-8"),
+ @Locale(value = "it", charset = "UTF-8"),
+ @Locale(value = "nl", charset = "UTF-8"),
+ @Locale(value = "pt_BR", charset = "UTF-8")
+})
+public enum Messages {
+
+ ERROR_BASENAME_NOT_A_FILE,
+ ERROR_CALCULATEHASH_IO_EXCEPTION,
+ ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN,
+ ERROR_CHECKOS_INVALID_OPERATING_SYSTEM,
+ ERROR_CHECKREGEX_IO_EXCEPTION,
+ ERROR_CONFIGURATION_GENERIC_ERROR,
+ ERROR_CONFIGURATION_INVALID_YAML,
+ ERROR_CONFIGURATION_LOOPS_INVALID_RANGE,
+ ERROR_DISCOVERFILE_FILE_NOT_FOUND,
+ ERROR_EVALUATE_COMPILATION_FAILED,
+ ERROR_EVALUATE_NOT_BOOLEAN_VALUE,
+ ERROR_EXTRACTOR_IO_ERROR,
+ ERROR_FILETYPE_NOT_A_FILE,
+ ERROR_FILETYPE_UNKNOWN_EXTENSION,
+ ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION,
+ ERROR_GETCANONICALFILE_IO_EXCEPTION,
+ ERROR_GETCANONICALPATH_IO_EXCEPTION,
+ ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION,
+ ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED,
+ ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR,
+ ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR,
+ ERROR_INTERPRETER_EXIT_RUNTIME_ERROR,
+ ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION,
+ ERROR_INTERPRETER_NULL_COMMAND,
+ ERROR_INTERPRETER_RULE_NOT_FOUND,
+ ERROR_INTERPRETER_UNKNOWN_KEYS,
+ ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN,
+ ERROR_LANGUAGE_INVALID_CODE,
+ ERROR_LOAD_COULD_NOT_LOAD_XML,
+ ERROR_PARSER_INVALID_PREAMBLE,
+ ERROR_PARSER_LOOPS_INVALID_RANGE,
+ ERROR_PARSER_LOOPS_NAN,
+ ERROR_PARSER_TIMEOUT_INVALID_RANGE,
+ ERROR_PARSER_TIMEOUT_NAN,
+ ERROR_PARSERULE_GENERIC_ERROR,
+ ERROR_PARSERULE_INVALID_YAML,
+ ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION,
+ ERROR_RULE_IDENTIFIER_AND_PATH,
+ ERROR_RUN_GENERIC_EXCEPTION,
+ ERROR_RUN_INTERRUPTED_EXCEPTION,
+ ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION,
+ ERROR_RUN_IO_EXCEPTION,
+ ERROR_RUN_TIMEOUT_EXCEPTION,
+ ERROR_RUN_TIMEOUT_INVALID_RANGE,
+ ERROR_SAVE_COULD_NOT_SAVE_XML,
+ ERROR_SESSION_OBTAIN_UNKNOWN_KEY,
+ ERROR_SESSION_REMOVE_UNKNOWN_KEY,
+ ERROR_TRIGGER_ACTION_NOT_FOUND,
+ ERROR_TRIGGER_CALL_EXCEPTION,
+ ERROR_VALIDATE_EMPTY_FILES_LIST,
+ ERROR_VALIDATE_FILE_IS_RESERVED,
+ ERROR_VALIDATE_FILES_IS_NOT_A_LIST,
+ ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT,
+ ERROR_VALIDATE_NO_DIRECTIVES_FOUND,
+ ERROR_VALIDATE_ORPHAN_LINEBREAK,
+ ERROR_VALIDATE_REFERENCE_IS_RESERVED,
+ ERROR_VALIDATE_YAML_EXCEPTION,
+ ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED,
+ ERROR_VALIDATEBODY_ARGUMENTS_LIST,
+ ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS,
+ ERROR_VALIDATEBODY_MISSING_KEYS,
+ ERROR_VALIDATEBODY_NULL_ARGUMENT_ID,
+ ERROR_VALIDATEBODY_NULL_COMMAND,
+ ERROR_VALIDATEBODY_NULL_COMMANDS_LIST,
+ ERROR_VALIDATEHEADER_NULL_ID,
+ ERROR_VALIDATEHEADER_NULL_NAME,
+ ERROR_VALIDATEHEADER_WRONG_IDENTIFIER,
+ ERROR_VELOCITY_FILE_NOT_FOUND,
+ ERROR_VELOCITY_PARSE_EXCEPTION,
+ ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION,
+ ERROR_VELOCITY_IO_EXCEPTION,
+ INFO_DISPLAY_EXCEPTION_MORE_DETAILS,
+ INFO_DISPLAY_EXECUTION_TIME,
+ INFO_DISPLAY_FILE_INFORMATION,
+ INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND,
+ INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE,
+ INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE,
+ INFO_LABEL_AUTHOR,
+ INFO_LABEL_AUTHORS,
+ INFO_LABEL_CONDITIONAL,
+ INFO_LABEL_NO_AUTHORS,
+ INFO_LABEL_ON_DETAILS,
+ INFO_LABEL_ON_ERROR,
+ INFO_LABEL_ON_FAILURE,
+ INFO_LABEL_ON_SUCCESS,
+ INFO_LABEL_UNNAMED_TASK,
+ INFO_PARSER_ALL_RIGHTS_RESERVED,
+ INFO_PARSER_DRYRUN_MODE_DESCRIPTION,
+ INFO_PARSER_HELP_DESCRIPTION,
+ INFO_PARSER_LANGUAGE_DESCRIPTION,
+ INFO_PARSER_LOG_DESCRIPTION,
+ INFO_PARSER_LOOPS_DESCRIPTION,
+ INFO_PARSER_NOTES,
+ INFO_PARSER_ONLY_HEADER,
+ INFO_PARSER_PREAMBLE_DESCRIPTION,
+ INFO_PARSER_SILENT_MODE_DESCRIPTION,
+ INFO_PARSER_TIMEOUT_DESCRIPTION,
+ INFO_PARSER_VERBOSE_MODE_DESCRIPTION,
+ INFO_PARSER_VERSION_DESCRIPTION,
+ LOG_INFO_BEGIN_BUFFER,
+ LOG_INFO_DIRECTIVES_BLOCK,
+ LOG_INFO_END_BUFFER,
+ LOG_INFO_INTERPRET_RULE,
+ LOG_INFO_INTERPRET_TASK,
+ LOG_INFO_POTENTIAL_DIRECTIVE_FOUND,
+ LOG_INFO_POTENTIAL_PATTERN_FOUND,
+ LOG_INFO_RULE_LOCATION,
+ LOG_INFO_SYSTEM_COMMAND,
+ LOG_INFO_TASK_RESULT,
+ LOG_INFO_VALIDATED_DIRECTIVES,
+ LOG_INFO_WELCOME_MESSAGE,
+ ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Pair.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Pair.java
new file mode 100644
index 00000000000..d8591b6ef75
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Pair.java
@@ -0,0 +1,92 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+/**
+ * Implements a pair of objects.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Pair<T, V> {
+
+ // first element of the pair
+ private final T firstElement;
+
+ // second element of the pair
+ private final V secondElement;
+
+ /**
+ * Constructor.
+ * @param firstElement The first element.
+ * @param secondElement The second element.
+ */
+ public Pair(T firstElement, V secondElement) {
+ this.firstElement = firstElement;
+ this.secondElement = secondElement;
+ }
+
+ /**
+ * Gets the first element.
+ * @return The first element.
+ */
+ public T getFirstElement() {
+ return firstElement;
+ }
+
+ /**
+ * Gets the second element.
+ * @return The second element.
+ */
+ public V getSecondElement() {
+ return secondElement;
+ }
+
+ /**
+ * A shorter version for getting the first element.
+ * @return The first element.
+ */
+ public T first() {
+ return getFirstElement();
+ }
+
+ /**
+ * A shorter version for getting the second element.
+ * @return The second element.
+ */
+ public V second() {
+ return getSecondElement();
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Parser.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Parser.java
new file mode 100644
index 00000000000..723e24e76e4
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Parser.java
@@ -0,0 +1,410 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.controller.LoggingController;
+import com.github.cereda.arara.utils.CommonUtils;
+import com.github.cereda.arara.utils.DisplayUtils;
+import java.util.Locale;
+import java.util.Map;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+
+/**
+ * Implements the command line parser.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Parser {
+
+ // command line arguments to be
+ // processed by this parser
+ private final String[] arguments;
+
+ // command line options, it will
+ // group each option available
+ // in arara
+ private Options options;
+
+ // each option available in
+ // arara
+ private Option version;
+ private Option help;
+ private Option log;
+ private Option verbose;
+ private Option silent;
+ private Option dryrun;
+ private Option timeout;
+ private Option language;
+ private Option loops;
+ private Option preamble;
+ private Option onlyheader;
+
+ public Parser() {
+ this.arguments = null;
+ }
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Constructor.
+ * @param arguments Array of strings representing the command line
+ * arguments.
+ */
+ public Parser(String[] arguments) {
+ this.arguments = arguments;
+ }
+
+ /**
+ * Parses the command line arguments.
+ * @return A boolean value indicating if the parsing should allow the
+ * application to look for directives in the provided main file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public boolean parse() throws AraraException {
+
+ // create new instances of the
+ // command line options, including
+ // the ones that require arguments
+ version = new Option("V", "version", false, "");
+ help = new Option("h", "help", false, "");
+ log = new Option("l", "log", false, "");
+ verbose = new Option("v", "verbose", false, "");
+ silent = new Option("s", "silent", false, "");
+ dryrun = new Option("n", "dry-run", false, "");
+ timeout = new Option("t", "timeout", true, "");
+ timeout.setArgName("number");
+ language = new Option("L", "language", true, "");
+ language.setArgName("code");
+ loops = new Option("m", "max-loops", true, "");
+ loops.setArgName("number");
+ preamble = new Option("p", "preamble", true, "");
+ preamble.setArgName("name");
+ onlyheader = new Option("H", "header", false, "");
+
+ // add all options to the options
+ // group, so they are recognized
+ // by the command line parser
+ options = new Options();
+ options.addOption(version);
+ options.addOption(help);
+ options.addOption(log);
+ options.addOption(verbose);
+ options.addOption(silent);
+ options.addOption(dryrun);
+ options.addOption(timeout);
+ options.addOption(language);
+ options.addOption(loops);
+ options.addOption(preamble);
+ options.addOption(onlyheader);
+
+ // update all descriptions based
+ // on the localized messages
+ updateDescriptions();
+
+ // a new default command line
+ // parser is created and the
+ // arguments are parsed
+ CommandLineParser parser = new DefaultParser();
+
+ try {
+
+ CommandLine line = parser.parse(options, arguments);
+
+ String reference;
+ if (line.hasOption("language")) {
+ ConfigurationController.getInstance().
+ put("execution.language",
+ new Language(line.getOptionValue("language"))
+ );
+ Locale locale = ((Language) ConfigurationController.
+ getInstance().get("execution.language")).getLocale();
+ messages.setLocale(locale);
+ updateDescriptions();
+ }
+
+ if (line.hasOption("help")) {
+ printVersion();
+ printUsage();
+ return false;
+ }
+
+ if (line.hasOption("version")) {
+ printVersion();
+ printNotes();
+ return false;
+ }
+
+ if (line.getArgs().length != 1) {
+ printVersion();
+ printUsage();
+ return false;
+ } else {
+ reference = line.getArgs()[0];
+ }
+
+ if (line.hasOption("timeout")) {
+ try {
+ long value = Long.parseLong(line.getOptionValue("timeout"));
+ if (value <= 0) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_PARSER_TIMEOUT_INVALID_RANGE
+ )
+ );
+ } else {
+ ConfigurationController.getInstance().
+ put("execution.timeout", true);
+ ConfigurationController.getInstance().
+ put("execution.timeout.value", value);
+ }
+ } catch (NumberFormatException nfexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_PARSER_TIMEOUT_NAN
+ )
+ );
+ }
+ }
+
+ if (line.hasOption("max-loops")) {
+ try {
+ long value = Long.parseLong(
+ line.getOptionValue("max-loops")
+ );
+ if (value <= 0) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_PARSER_LOOPS_INVALID_RANGE
+ )
+ );
+ } else {
+ ConfigurationController.getInstance().
+ put("execution.loops", value);
+ }
+ } catch (NumberFormatException nfexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_PARSER_LOOPS_NAN
+ )
+ );
+ }
+ }
+
+ if (line.hasOption("verbose")) {
+ ConfigurationController.getInstance().
+ put("execution.verbose", true);
+ }
+
+ if (line.hasOption("silent")) {
+ ConfigurationController.getInstance().
+ put("execution.verbose", false);
+ }
+
+ if (line.hasOption("dry-run")) {
+ ConfigurationController.getInstance().
+ put("execution.dryrun", true);
+ ConfigurationController.getInstance().
+ put("execution.errors.halt", false);
+ }
+
+ if (line.hasOption("log")) {
+ ConfigurationController.getInstance().
+ put("execution.logging", true);
+ }
+
+ if (line.hasOption("preamble")) {
+ @SuppressWarnings("unchecked")
+ Map<String, String> preambles = (Map<String, String>)
+ ConfigurationController.getInstance().
+ get("execution.preambles");
+ if (preambles.containsKey(line.getOptionValue("preamble"))) {
+ ConfigurationController.getInstance().
+ put("execution.preamble.active", true);
+ ConfigurationController.getInstance().
+ put("execution.preamble.content",
+ preambles.get(line.getOptionValue("preamble"))
+ );
+ }
+ else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_PARSER_INVALID_PREAMBLE,
+ line.getOptionValue("preamble")
+ )
+ );
+ }
+ }
+
+ if (line.hasOption("header")) {
+ ConfigurationController.getInstance().
+ put("execution.header", true);
+ }
+
+ CommonUtils.discoverFile(reference);
+ LoggingController.enableLogging((Boolean) ConfigurationController.
+ getInstance().get("execution.logging"));
+ ConfigurationController.getInstance().put("display.time", true);
+
+ return true;
+
+ } catch (ParseException pexception) {
+ printVersion();
+ printUsage();
+ return false;
+ }
+ }
+
+ /**
+ * Prints the application usage.
+ */
+ private void printUsage() {
+ HelpFormatter formatter = new HelpFormatter();
+ StringBuilder builder = new StringBuilder();
+ builder.append("arara [file [--dry-run] [--log] ");
+ builder.append("[--verbose | --silent] [--timeout N] ");
+ builder.append("[--max-loops N] [--language L] ");
+ builder.append("[ --preamble P ] [--header] | --help | --version]");
+ formatter.printHelp(builder.toString(), options);
+ }
+
+ /**
+ * Prints the application version.
+ */
+ private void printVersion() {
+ String year = (String) ConfigurationController.getInstance().
+ get("application.copyright.year");
+ String number = (String) ConfigurationController.getInstance().
+ get("application.version");
+ String revision = (String) ConfigurationController.getInstance().
+ get("application.revision");
+ StringBuilder builder = new StringBuilder();
+ builder.append("arara ");
+ builder.append(number);
+ builder.append(" (revision ");
+ builder.append(revision);
+ builder.append(")");
+ builder.append("\n");
+ builder.append("Copyright (c) ").append(year).append(", ");
+ builder.append("Paulo Roberto Massa Cereda");
+ builder.append("\n");
+ builder.append(messages.getMessage(
+ Messages.INFO_PARSER_ALL_RIGHTS_RESERVED)
+ );
+ builder.append("\n");
+ System.out.println(builder.toString());
+ }
+
+ /**
+ * Print the application notes.
+ */
+ private void printNotes() {
+ DisplayUtils.wrapText(messages.getMessage(Messages.INFO_PARSER_NOTES));
+ }
+
+ /**
+ * Updates all the descriptions in order to make them reflect the current
+ * language setting.
+ */
+ private void updateDescriptions() {
+ version.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_VERSION_DESCRIPTION
+ )
+ );
+ help.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_HELP_DESCRIPTION
+ )
+ );
+ log.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_LOG_DESCRIPTION
+ )
+ );
+ verbose.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_VERBOSE_MODE_DESCRIPTION
+ )
+ );
+ silent.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_SILENT_MODE_DESCRIPTION
+ )
+ );
+ dryrun.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_DRYRUN_MODE_DESCRIPTION
+ )
+ );
+ timeout.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_TIMEOUT_DESCRIPTION
+ )
+ );
+ language.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_LANGUAGE_DESCRIPTION
+ )
+ );
+ loops.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_LOOPS_DESCRIPTION
+ )
+ );
+ preamble.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_PREAMBLE_DESCRIPTION
+ )
+ );
+ onlyheader.setDescription(
+ messages.getMessage(
+ Messages.INFO_PARSER_ONLY_HEADER
+ )
+ );
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Resource.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Resource.java
new file mode 100644
index 00000000000..2994a4d6912
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Resource.java
@@ -0,0 +1,291 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.utils.CommonUtils;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang.SystemUtils;
+import org.mvel2.templates.TemplateRuntime;
+
+/**
+ * Implements the configuration resource model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Resource {
+
+ // rule paths
+ private List<String> paths;
+
+ // file types
+ private List<FileTypeResource> filetypes;
+
+ // the application language
+ private String language;
+
+ // maximum number of loops
+ private long loops;
+
+ // verbose flag
+ private boolean verbose;
+
+ // logging flag
+ private boolean logging;
+
+ // database name
+ private String dbname;
+
+ // log name
+ private String logname;
+
+ // header flag
+ private boolean header;
+
+ // map of preambles
+ private Map<String, String> preambles;
+
+ // look and feel
+ private String laf;
+
+ /**
+ * Gets the rule paths.
+ * @return The rule paths.
+ */
+ public List<String> getPaths() {
+ if (paths != null) {
+
+ final Map<String, Object> map = new HashMap<String, Object>();
+ Map<String, Object> user = new HashMap<String, Object>();
+ user.put("home", SystemUtils.USER_HOME);
+ user.put("dir", SystemUtils.USER_DIR);
+ user.put("name", SystemUtils.USER_NAME);
+ map.put("user", user);
+
+ Collection<String> result = CollectionUtils.collect(
+ paths, new Transformer<String, String>() {
+ public String transform(String input) {
+ String path = CommonUtils.removeKeyword(input);
+ try {
+ path = (String) TemplateRuntime.eval(path, map);
+ }
+ catch (RuntimeException nothandled) {
+ // do nothing, gracefully fallback to
+ // the default, unparsed path
+ }
+ return path;
+ }
+ });
+ paths = new ArrayList<String>(result);
+ }
+ return paths;
+ }
+
+ /**
+ * Sets the rule paths.
+ * @param paths The rule paths.
+ */
+ public void setPaths(List<String> paths) {
+ this.paths = paths;
+ }
+
+ /**
+ * Gets the list of file types.
+ * @return The list of file types.
+ */
+ public List<FileTypeResource> getFiletypes() {
+ return filetypes;
+ }
+
+ /**
+ * Sets the list of file types.
+ * @param filetypes The list of file types.
+ */
+ public void setFiletypes(List<FileTypeResource> filetypes) {
+ this.filetypes = filetypes;
+ }
+
+ /**
+ * Gets the language.
+ * @return The language.
+ */
+ public String getLanguage() {
+ return CommonUtils.removeKeyword(language);
+ }
+
+ /**
+ * Sets the language.
+ * @param language The language.
+ */
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ /**
+ * Get the maximum number of loops.
+ * @return The maximum number of loops.
+ */
+ public long getLoops() {
+ return loops;
+ }
+
+ /**
+ * Sets the maximum number of loops.
+ * @param loops The maximum number of loops.
+ */
+ public void setLoops(long loops) {
+ this.loops = loops;
+ }
+
+ /**
+ * Checks if verbose mode is active.
+ * @return A boolean value.
+ */
+ public boolean isVerbose() {
+ return verbose;
+ }
+
+ /**
+ * Sets the verbose mode.
+ * @param verbose A boolean value.
+ */
+ public void setVerbose(boolean verbose) {
+ this.verbose = verbose;
+ }
+
+ /**
+ * Checks if logging mode is active.
+ * @return A boolean value.
+ */
+ public boolean isLogging() {
+ return logging;
+ }
+
+ /**
+ * Sets the logging mode.
+ * @param logging A boolean value.
+ */
+ public void setLogging(boolean logging) {
+ this.logging = logging;
+ }
+
+ /**
+ * Gets the database name.
+ * @return The database name.
+ */
+ public String getDbname() {
+ return CommonUtils.removeKeyword(dbname);
+ }
+
+ /**
+ * Sets the database name.
+ * @param dbname The database name.
+ */
+ public void setDbname(String dbname) {
+ this.dbname = dbname;
+ }
+
+ /**
+ * Gets the log name.
+ * @return The log name.
+ */
+ public String getLogname() {
+ return CommonUtils.removeKeyword(logname);
+ }
+
+ /**
+ * Sets the log name.
+ * @param logname The log name.
+ */
+ public void setLogname(String logname) {
+ this.logname = logname;
+ }
+
+ /**
+ * Gets the map of preambles.
+ * @return Map of preambles.
+ */
+ public Map<String, String> getPreambles() {
+ return preambles;
+ }
+
+ /**
+ * Sets the map of preambles.
+ * @param preambles Map of preambles.
+ */
+ public void setPreambles(Map<String, String> preambles) {
+ this.preambles = preambles;
+ }
+
+ /**
+ * Gets the logical value of the header flag.
+ * @return Logical value of the header flag.
+ */
+ public boolean isHeader() {
+ return header;
+ }
+
+ /**
+ * Sets the logical value of the header flag.
+ * @param header The header flag.
+ */
+ public void setHeader(boolean header) {
+ this.header = header;
+ }
+
+ /**
+ * Gets the look and feel reference.
+ * @return The look and feel reference.
+ */
+ public String getLaf() {
+ return CommonUtils.removeKeyword(laf);
+ }
+
+ /**
+ * Sets the look and feel reference.
+ * @param laf The look and feel reference.
+ */
+ public void setLaf(String laf) {
+ this.laf = laf;
+ }
+
+
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Rule.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Rule.java
new file mode 100644
index 00000000000..af3ad199506
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Rule.java
@@ -0,0 +1,155 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.utils.CommonUtils;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+
+/**
+ * Implements the rule model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Rule {
+
+ // the rule identifier
+ private String identifier;
+
+ // the rule name
+ private String name;
+
+ // the list of authors
+ private List<String> authors;
+
+ // the list of commands
+ private List<RuleCommand> commands;
+
+ // the list of arguments
+ private List<Argument> arguments;
+
+ /**
+ * Gets the rule identifier.
+ * @return The rule identifier.
+ */
+ public String getIdentifier() {
+ return CommonUtils.removeKeyword(identifier);
+ }
+
+ /**
+ * Sets the rule identifier.
+ * @param identifier The rule identifier.
+ */
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ /**
+ * Gets the rule identifier.
+ * @return The rule identifier.
+ */
+ public String getName() {
+ return CommonUtils.removeKeyword(name);
+ }
+
+ /**
+ * Sets the rule name.
+ * @param name The rule name.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Gets the list of authors.
+ * @return A list of authors.
+ */
+ public List<String> getAuthors() {
+ if (authors != null) {
+ Collection<String> result = CollectionUtils.collect(
+ authors, new Transformer<String, String>() {
+ public String transform(String input) {
+ return CommonUtils.removeKeyword(input);
+ }
+ });
+ authors = new ArrayList<String>(result);
+ }
+ return authors;
+ }
+
+ /**
+ * Sets the list of authors.
+ * @param authors The list of authors.
+ */
+ public void setAuthors(List<String> authors) {
+ this.authors = authors;
+ }
+
+ /**
+ * Gets the list of commands.
+ * @return The list of commands.
+ */
+ public List<RuleCommand> getCommands() {
+ return commands;
+ }
+
+ /**
+ * Sets the list of commands.
+ * @param commands The list of commands.
+ */
+ public void setCommands(List<RuleCommand> commands) {
+ this.commands = commands;
+ }
+
+ /**
+ * Gets the list of arguments.
+ * @return The list of arguments.
+ */
+ public List<Argument> getArguments() {
+ return arguments;
+ }
+
+ /**
+ * Sets the list of arguments.
+ * @param arguments The list of arguments.
+ */
+ public void setArguments(List<Argument> arguments) {
+ this.arguments = arguments;
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/RuleCommand.java
index 80da972003d..b209d19bcb0 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/RuleCommand.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,69 +30,74 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraCommand: This class provides the model for commands to be executed by
- * the runtime. It's a plain old Java object.
*/
-// package definition
-package com.github.arara.model;
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.utils.CommonUtils;
/**
- * Provides the model for commands to be executed by the runtime.
- *
+ * Implements the rule command model.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
+ * @version 4.0
+ * @since 4.0
*/
-public class AraraCommand {
+public class RuleCommand {
- // the name to be displayed in the command line
+ // the command name
private String name;
- // the command itself
+
+ // the command instruction
private String command;
+
+ // the exit status expression
+ private String exit;
/**
- * Getter for command.
- *
- * @return The command to be executed by the runtime.
+ * Gets the command name.
+ * @return The command name.
*/
- public String getCommand() {
+ public String getName() {
+ return CommonUtils.removeKeyword(name);
+ }
- // return it
- return command;
+ /**
+ * Sets the command name.
+ * @param name The command name.
+ */
+ public void setName(String name) {
+ this.name = name;
}
/**
- * Setter for command.
- *
- * @param command The command, already expanded.
+ * Gets the command instruction.
+ * @return The command instruction.
*/
- public void setCommand(String command) {
+ public String getCommand() {
+ return CommonUtils.removeKeyword(command);
+ }
- // set the command
+ /**
+ * Sets the command instruction.
+ * @param command The command instruction.
+ */
+ public void setCommand(String command) {
this.command = command;
}
/**
- * Getter for the command name.
- *
- * @return The command name, provided by the rule.
+ * Gets the exit status expression.
+ * @return The exit status expression.
*/
- public String getName() {
-
- // return it
- return name;
+ public String getExit() {
+ return CommonUtils.removeKeyword(exit);
}
/**
- * Setter for the command name.
- *
- * @param name The command name.
+ * Sets the exit status expression.
+ * @param exit The exit status expression.
*/
- public void setName(String name) {
-
- // set the name
- this.name = name;
+ public void setExit(String exit) {
+ this.exit = exit;
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Session.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Session.java
new file mode 100644
index 00000000000..c756ae4550e
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Session.java
@@ -0,0 +1,122 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.controller.SessionController;
+
+/**
+ * Implements the session model.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Session {
+
+ // get the current instance from the
+ // session controller
+ private static final SessionController session =
+ SessionController.getInstance();
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Inserts the object into the session, indexed by the provided key.
+ * @param key The provided key.
+ * @param value The value to be inserted.
+ */
+ public void insert(String key, Object value) {
+ session.put(key, value);
+ }
+
+ /**
+ * Removes the entry indexed by the provided key from the session.
+ * @param key The provided key.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public void remove(String key) throws AraraException {
+ if (session.contains(key)) {
+ session.remove(key);
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_SESSION_REMOVE_UNKNOWN_KEY,
+ key
+ )
+ );
+ }
+ }
+
+ /**
+ * Checks if the provided key exists in the session.
+ * @param key The provided key.
+ * @return A boolean value indicating if the provided key exists in the
+ * session.
+ */
+ public boolean exists(String key) {
+ return session.contains(key);
+ }
+
+ /**
+ * Clears the session.
+ */
+ public void forget() {
+ session.clear();
+ }
+
+ /**
+ * Gets the object indexed by the provided key from the session.
+ * @param key The provided key.
+ * @return The object indexed by the provided key.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public Object obtain(String key) throws AraraException {
+ if (session.contains(key)) {
+ return session.get(key);
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_SESSION_OBTAIN_UNKNOWN_KEY,
+ key
+ )
+ );
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/StopWatch.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/StopWatch.java
new file mode 100644
index 00000000000..45e0969d0b7
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/StopWatch.java
@@ -0,0 +1,84 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+
+/**
+ * Implements a stopwatch.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class StopWatch {
+
+ // two variables indicating the
+ // times the stopwatch started
+ // and stopped
+ private static long beginning = 0;
+ private static long end = 0;
+
+ // a variable to indicate the
+ // stopwatch is enabled; so far,
+ // it hasn't started, then it is
+ // not enabled
+ private static boolean enabled = false;
+
+ /**
+ * Starts the stopwatch.
+ */
+ public static void start() {
+ beginning = System.nanoTime();
+ enabled = true;
+ }
+
+ /**
+ * Stops the stopwatch.
+ */
+ public static void stop() {
+ end = System.nanoTime();
+ }
+
+ /**
+ * Gets the string representation of the elapsed time.
+ * @return A string representation of the elapsed time.
+ */
+ public static String getTime() {
+ Language language = (Language) ConfigurationController.
+ getInstance().get("execution.language");
+ double result = enabled ? (double) (end - beginning) / 1000000000 : 0.0;
+ return String.format(language.getLocale(), "%1.2f", result);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Trigger.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Trigger.java
new file mode 100644
index 00000000000..11da04bfcb9
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/Trigger.java
@@ -0,0 +1,135 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.model;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+/**
+ * Implements the trigger model. The tool provides triggers, which are a way
+ * to alter its internal behaviour according to a list of parameters.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Trigger {
+
+ // the action name and its
+ // list of parameters
+ private final String action;
+ private final List<Object> parameters;
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Constructor.
+ * @param action The action name.
+ * @param parameters The list of parameters.
+ */
+ public Trigger(String action, List<Object> parameters) {
+ this.action = action;
+ this.parameters = parameters;
+ }
+
+ /**
+ * Gets the action name.
+ * @return The action name.
+ */
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * Gets the list of parameters.
+ * @return The list of parameters.
+ */
+ public List<Object> getParameters() {
+ return parameters;
+ }
+
+ /**
+ * Returns a textual representation of the current trigger.
+ * @return A string containing a textual representation of the current
+ * trigger.
+ */
+ @Override
+ public String toString() {
+ return "trigger";
+ }
+
+ /**
+ * Processes the current trigger.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public void process() throws AraraException {
+
+ Map<String, Callable<Object>> mapping =
+ new HashMap<String, Callable<Object>>();
+ mapping.put("halt", new Callable<Object>() {
+ public Object call() {
+ ConfigurationController.getInstance().put("trigger.halt", true);
+ return null;
+ }
+ });
+ if (mapping.containsKey(action)) {
+ try {
+ mapping.get(action).call();
+ } catch (Exception exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_TRIGGER_CALL_EXCEPTION,
+ action
+ ),
+ exception
+ );
+ }
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_TRIGGER_ACTION_NOT_FOUND,
+ action
+ )
+ );
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java
new file mode 100644
index 00000000000..c40536ce08f
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java
@@ -0,0 +1,166 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.model.Pair;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * Implements utilitary methods for classloading and object instantiation.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class ClassLoadingUtils {
+
+ /**
+ * Loads a class from the provided file, potentially a Java archive.
+ * @param file File containing the Java bytecode (namely, a JAR).
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class.
+ */
+ public static Pair<Integer, Class> loadClass(File file, String name) {
+
+ // status and class to be returned,
+ // it defaults to an object class
+ int status = 0;
+ Class value = Object.class;
+
+ // if file does not exist, nothing
+ // can be done, status is changed
+ if (!file.exists()) {
+ status = 1;
+ } else {
+
+ // classloading involves defining
+ // a classloader and fetching the
+ // desired class from it, based on
+ // the provided file archive
+ try {
+
+ // creates a new classloader with
+ // the provided file (potentially
+ // a JAR file)
+ URLClassLoader classloader = new URLClassLoader(
+ new URL[]{
+ file.toURI().toURL()
+ },
+ ClassLoadingUtils.class.getClassLoader()
+ );
+
+ // fetches the class from the
+ // instantiated classloader
+ value = Class.forName(name, true, classloader);
+
+ } catch (MalformedURLException nothandled1) {
+
+ // the file URL is incorrect,
+ // update status accordingly
+ status = 2;
+
+ } catch (ClassNotFoundException nothandled2) {
+
+ // the class was not found,
+ // update status accordingly
+ status = 3;
+
+ }
+ }
+
+ // return a new pair based on the
+ // current status and class holder
+ return new Pair<Integer, Class>(status, value);
+ }
+
+ /**
+ * Loads a class from the provided file, instantiating it.
+ * @param file File containing the Java bytecode (namely, a JAR).
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class object.
+ */
+ public static Pair<Integer, Object> loadObject(File file, String name) {
+
+ // load the corresponding class
+ // based on the qualified name
+ Pair<Integer, Class> pair = loadClass(file, name);
+
+ // status and object to be returned,
+ // it defaults to an object
+ int status = pair.getFirstElement();
+ Object value = new Object();
+
+ // checks if the class actually
+ // exists, otherwise simply
+ // ignore instantiation
+ if (status == 0) {
+
+ // object instantiation relies
+ // on the default constructor
+ // (without arguments), class
+ // must implement it
+
+ // OBS: constructors with arguments
+ // must be invoked through reflection
+ try {
+
+ // get the class reference from
+ // the pair and instantiate it
+ // by invoking the default
+ // constructor (without arguments)
+ value = pair.getSecondElement().newInstance();
+
+ } catch (IllegalAccessException nothandled1) {
+
+ // the object instantiation violated
+ // an access policy, status is updated
+ status = 4;
+
+ } catch (InstantiationException nothandled2) {
+
+ // an instantiation exception has
+ // occurred, status is updated
+ status = 5;
+
+ }
+ }
+
+ // return a new pair based on the
+ // current status and object holder
+ return new Pair<Integer, Object>(status, value);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/CommonUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/CommonUtils.java
new file mode 100644
index 00000000000..621634749ef
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/CommonUtils.java
@@ -0,0 +1,929 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.controller.SystemCallController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Argument;
+import com.github.cereda.arara.model.Database;
+import com.github.cereda.arara.model.FileType;
+import com.github.cereda.arara.model.Messages;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingFormatArgumentException;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.NameFileFilter;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.SystemUtils;
+
+/**
+ * Implements common utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class CommonUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Checks if the input string is equal to a valid boolean value.
+ * @param value The input string.
+ * @return A boolean value represented by the provided string.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean checkBoolean(String value) throws AraraException {
+ List<String> yes = Arrays.asList(
+ new String[]{"yes", "true", "1", "on"}
+ );
+ List<String> no = Arrays.asList(
+ new String[]{"no", "false", "0", "off"}
+ );
+ if (!union(yes, no).contains(value.toLowerCase())) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN,
+ value
+ )
+ );
+ } else {
+ return yes.contains(value.toLowerCase());
+ }
+ }
+
+ /**
+ * Provides a union set operation between two lists.
+ * @param <T> The list type.
+ * @param list1 The first list.
+ * @param list2 The second list.
+ * @return The union of those two lists.
+ */
+ private static <T> List<T> union(List<T> list1, List<T> list2) {
+ Set<T> elements = new HashSet<T>();
+ elements.addAll(list1);
+ elements.addAll(list2);
+ return new ArrayList<T>(elements);
+ }
+
+ /**
+ * Build a system-dependant path based on the path and the file.
+ * @param path A string representing the path to be prepended.
+ * @param file A string representing the file to be appended.
+ * @return The full path as a string.
+ */
+ public static String buildPath(String path, String file) {
+ return path.endsWith(File.separator) ?
+ path.concat(file) : path.concat(File.separator).concat(file);
+ }
+
+ /**
+ * Checks if the provided string is empty. It does not handle a null value.
+ * @param string A string.
+ * @return A boolean value indicating if the string is empty.
+ */
+ public static boolean checkEmptyString(String string) {
+ return "".equals(string);
+ }
+
+ /**
+ * Removes the keyword from the beginning of the provided string.
+ * @param line A string to be analyzed.
+ * @return The provided string without the keyword.
+ */
+ public static String removeKeyword(String line) {
+ if (line != null) {
+ Pattern pattern = Pattern.compile("^(\\s)*<arara>\\s");
+ Matcher matcher = pattern.matcher(line);
+ if (matcher.find()) {
+ line = (line.substring(matcher.end(), line.length()));
+ }
+ line = line.trim();
+ }
+ return line;
+ }
+
+ /**
+ * Discovers the file through string reference lookup and sets the
+ * configuration accordingly.
+ * @param reference The string reference.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static void discoverFile(String reference) throws AraraException {
+ File file = lookupFile(reference);
+ if (file == null) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_DISCOVERFILE_FILE_NOT_FOUND,
+ reference,
+ getFileTypesList()
+ )
+ );
+ }
+ }
+
+ /**
+ * Performs a file lookup based on a string reference.
+ * @param reference The file reference as a string.
+ * @return The file as result of the lookup operation.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static File lookupFile(String reference) throws AraraException {
+ @SuppressWarnings("unchecked")
+ List<FileType> types = (List<FileType>) ConfigurationController.
+ getInstance().get("execution.filetypes");
+ File file = new File(reference);
+ String name = file.getName();
+ String parent = getParentCanonicalPath(file);
+ String path = buildPath(parent, name);
+
+ // direct search, so we are considering
+ // the reference as a complete name
+ for (FileType type : types) {
+ if (path.endsWith(".".concat(type.getExtension()))) {
+ file = new File(path);
+ if (file.exists()) {
+ if (file.isFile()) {
+ ConfigurationController.
+ getInstance().
+ put("execution.file.pattern",
+ type.getPattern());
+ ConfigurationController.
+ getInstance().
+ put("execution.reference", file);
+ return file;
+ }
+ }
+ }
+ }
+
+ // indirect search; in this case, we are considering
+ // that the file reference has an implict extension,
+ // so we need to add it and look again
+ for (FileType type : types) {
+ path = buildPath(parent, name.concat(".").
+ concat(type.getExtension()));
+ file = new File(path);
+ if (file.exists()) {
+ if (file.isFile()) {
+ ConfigurationController.getInstance().
+ put("execution.file.pattern", type.getPattern());
+ ConfigurationController.getInstance().
+ put("execution.reference", file);
+ return file;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets the parent canonical path of a file.
+ * @param file The file.
+ * @return The parent canonical path of a file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getParentCanonicalPath(File file)
+ throws AraraException {
+ try {
+ String path = file.getCanonicalFile().getParent();
+ return path;
+ } catch (IOException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Gets the canonical file from a file.
+ * @param file The file.
+ * @return The canonical file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static File getCanonicalFile(String file) throws AraraException {
+ try {
+ return (new File(file)).getCanonicalFile();
+ } catch (IOException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_GETCANONICALFILE_IO_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Checks if the provided object is from a certain class.
+ * @param clazz The class.
+ * @param object The object.
+ * @return A boolean value indicating if the provided object is from a
+ * certain class.
+ */
+ public static boolean checkClass(Class clazz, Object object) {
+ return clazz.isInstance(object);
+ }
+
+ /**
+ * Helper method to flatten a potential list of lists into a list of
+ * objects.
+ * @param list First list.
+ * @param flat Second list.
+ */
+ private static void flatten(List<?> list, List<Object> flat) {
+ for (Object item : list) {
+ if (item instanceof List<?>) {
+ flatten((List<?>) item, flat);
+ } else {
+ flat.add(item);
+ }
+ }
+ }
+
+ /**
+ * Flattens a potential list of lists into a list of objects.
+ * @param list The list to be flattened.
+ * @return The flattened list.
+ */
+ public static List<Object> flatten(List<?> list) {
+ List<Object> result = new ArrayList<Object>();
+ flatten(list, result);
+ return result;
+ }
+
+ /**
+ * Gets the list of file types, in order.
+ * @return A string representation of the list of file types, in order.
+ */
+ public static String getFileTypesList() {
+ @SuppressWarnings("unchecked")
+ List<FileType> types = (List<FileType>) ConfigurationController.
+ getInstance().get("execution.filetypes");
+ return getCollectionElements(types, "[ ", " ]", " | ");
+ }
+
+ /**
+ * Gets a string representation of a collection.
+ * @param collection The collection.
+ * @param open The opening string.
+ * @param close The closing string.
+ * @param separator The element separator.
+ * @return A string representation of the provided collection.
+ */
+ public static String getCollectionElements(Collection collection,
+ String open, String close, String separator) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(open);
+ builder.append(StringUtils.join(collection, separator));
+ builder.append(close);
+ return builder.toString();
+ }
+
+ /**
+ * Gets a set of strings containing unknown keys from a map and a list. It
+ * is a set difference from the keys in the map and the entries in the list.
+ * @param parameters The map of parameters.
+ * @param arguments The list of arguments.
+ * @return A set of strings representing unknown keys from a map and a list.
+ */
+ public static Set<String> getUnknownKeys(Map<String, Object> parameters,
+ List<Argument> arguments) {
+ Collection<String> found = parameters.keySet();
+ Collection<String> expected = CollectionUtils.collect(
+ arguments, new Transformer<Argument, String>() {
+ public String transform(Argument argument) {
+ return argument.getIdentifier();
+ }
+ });
+ Collection<String> difference = CollectionUtils.
+ subtract(found, expected);
+ return new HashSet<String>(difference);
+ }
+
+ /**
+ * Gets the rule error header, containing the identifier and the path, if
+ * any.
+ * @return A string representation of the rule error header, containing the
+ * identifier and the path, if any.
+ */
+ public static String getRuleErrorHeader() {
+ if ((ConfigurationController.getInstance().
+ contains("execution.info.rule.id")) &&
+ (ConfigurationController.getInstance().
+ contains("execution.info.rule.path"))) {
+ String id = (String) ConfigurationController.getInstance().
+ get("execution.info.rule.id");
+ String path = (String) ConfigurationController.getInstance().
+ get("execution.info.rule.path");
+ return messages.getMessage(
+ Messages.ERROR_RULE_IDENTIFIER_AND_PATH,
+ id,
+ path
+ ).concat(" ");
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * Trims spaces from every string of a list of strings.
+ * @param input The list of strings.
+ * @return A new list of strings, with each element trimmed.
+ */
+ public static List<String> trimSpaces(List<String> input) {
+ Collection<String> result = CollectionUtils.collect(
+ input, new Transformer<String, String>() {
+ public String transform(String input) {
+ return input.trim();
+ }
+ });
+ return new ArrayList<String>(result);
+ }
+
+ /**
+ * Gets a human readable representation of a file size.
+ * @param file The file.
+ * @return A string representation of the file size.
+ */
+ public static String calculateFileSize(File file) {
+ return FileUtils.byteCountToDisplaySize(file.length());
+ }
+
+ /**
+ * Gets the date the provided file was last modified.
+ * @param file The file.
+ * @return A string representation of the date the provided file was last
+ * modified.
+ */
+ public static String getLastModifiedInformation(File file) {
+ SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
+ return format.format(file.lastModified());
+ }
+
+ /**
+ * Gets a list of all rule paths.
+ * @return A list of all rule paths.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<String> getAllRulePaths() throws AraraException {
+ @SuppressWarnings("unchecked")
+ List<String> paths = (List<String>) ConfigurationController.
+ getInstance().get("execution.rule.paths");
+ List<String> result = new ArrayList<String>();
+ for (String path : paths) {
+ File location = new File(InterpreterUtils.construct(path, "quack"));
+ result.add(getParentCanonicalPath(location));
+ }
+ return result;
+ }
+
+ /**
+ * Gets the reference of the current file in execution. Note that this
+ * method might return a value different than the main file provided in
+ * the command line.
+ * @return A reference of the current file in execution. Might be different
+ * than the main file provided in the command line.
+ */
+ private static File getCurrentReference() {
+ return (File) ConfigurationController.getInstance().
+ get("execution.file");
+ }
+
+ /**
+ * Calculates the CRC32 checksum of the provided file.
+ * @param file The file.
+ * @return A string containing the CRC32 checksum of the provided file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String calculateHash(File file) throws AraraException {
+ try {
+ long result = FileUtils.checksumCRC32(file);
+ return String.format("%08x", result);
+ } catch (IOException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CALCULATEHASH_IO_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Gets the file type of a file.
+ * @param file The file.
+ * @return The corresponding file type.
+ */
+ public static String getFiletype(File file) {
+ return getFiletype(file.getName());
+ }
+
+ /**
+ * Gets the file type of a string representing the file.
+ * @param name A string representing the file.
+ * @return The corresponding file type.
+ */
+ public static String getFiletype(String name) {
+ name = name.lastIndexOf(".") != -1 ?
+ name.substring(name.lastIndexOf(".") + 1, name.length()) : "";
+ return name;
+ }
+
+ /**
+ * Gets the base name of a file.
+ * @param file The file.
+ * @return The corresponding base name.
+ */
+ public static String getBasename(File file) {
+ return getBasename(file.getName());
+ }
+
+ /**
+ * Gets the base name of a string representing the file.
+ * @param name A string representing the file.
+ * @return The corresponding base name.
+ */
+ public static String getBasename(String name) {
+ int index = name.lastIndexOf(".") != -1 ?
+ name.lastIndexOf(".") : name.length();
+ return name.substring(0, index);
+ }
+
+ /**
+ * Encloses the provided object in double quotes.
+ * @param object The object.
+ * @return A string representation of the provided object enclosed in double
+ * quotes.
+ */
+ public static String addQuotes(Object object) {
+ return "\"".concat(String.valueOf(object)).concat("\"");
+ }
+
+ /**
+ * Generates a string based on a list of objects, separating each one of
+ * them by one space.
+ * @param objects A list of objects.
+ * @return A string based on the list of objects, separating each one of
+ * them by one space. Empty values are not considered.
+ */
+ public static String generateString(Object... objects) {
+ List<String> values = new ArrayList<String>();
+ for (Object object : objects) {
+ if (!CommonUtils.checkEmptyString(String.valueOf(object))) {
+ values.add(String.valueOf(object));
+ }
+ }
+ return StringUtils.join(values, " ");
+ }
+
+ /**
+ * Checks if a file exists.
+ * @param file The file.
+ * @return A boolean value indicating if the file exists.
+ */
+ public static boolean exists(File file) {
+ return file.exists();
+ }
+
+ /**
+ * Checks if a file exists based on its extension.
+ * @param extension The extension.
+ * @return A boolean value indicating if the file exists.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean exists(String extension) throws AraraException {
+ File file = new File(getPath(extension));
+ return file.exists();
+ }
+
+ /**
+ * Checks if a file has changed since the last verification.
+ * @param file The file.
+ * @return A boolean value indicating if the file has changed since the last
+ * verification.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean hasChanged(File file) throws AraraException {
+ Database database = DatabaseUtils.load();
+ HashMap<String, String> map = database.getMap();
+ String path = getCanonicalPath(file);
+ if (!file.exists()) {
+ if (map.containsKey(path)) {
+ map.remove(path);
+ database.setMap(map);
+ DatabaseUtils.save(database);
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ String hash = calculateHash(file);
+ if (map.containsKey(path)) {
+ String value = map.get(path);
+ if (hash.equals(value)) {
+ return false;
+ } else {
+ map.put(path, hash);
+ database.setMap(map);
+ DatabaseUtils.save(database);
+ return true;
+ }
+ } else {
+ map.put(path, hash);
+ database.setMap(map);
+ DatabaseUtils.save(database);
+ return true;
+ }
+ }
+ }
+
+ /**
+ * Checks if the file has changed since the last verification based on the
+ * provided extension.
+ * @param extension The provided extension.
+ * @return A boolean value indicating if the file has changed since the last
+ * verification.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean hasChanged(String extension) throws AraraException {
+ File file = new File(getPath(extension));
+ return hasChanged(file);
+ }
+
+ /**
+ * Gets the full file path based on the provided extension.
+ * @param extension The extension.
+ * @return A string containing the full file path.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static String getPath(String extension) throws AraraException {
+ String name = getBasename(getCurrentReference());
+ String path = getParentCanonicalPath(getCurrentReference());
+ name = name.concat(".").concat(extension);
+ return buildPath(path, name);
+ }
+
+ /**
+ * Gets the canonical path from the provided file.
+ * @param file The file.
+ * @return The canonical path from the provided file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getCanonicalPath(File file) throws AraraException {
+ try {
+ return file.getCanonicalPath();
+ } catch (IOException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_GETCANONICALPATH_IO_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Checks if the file based on the provided extension contains the provided
+ * regex.
+ * @param extension The file extension.
+ * @param regex The regex.
+ * @return A boolean value indicating if the file contains the provided
+ * regex.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean checkRegex(String extension, String regex)
+ throws AraraException {
+ File file = new File(getPath(extension));
+ return checkRegex(file, regex);
+ }
+
+ /**
+ * Checks if the file contains the provided regex.
+ * @param file The file.
+ * @param regex The regex.
+ * @return A boolean value indicating if the file contains the provided
+ * regex.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean checkRegex(File file, String regex)
+ throws AraraException {
+ Charset charset = (Charset) ConfigurationController.
+ getInstance().get("directives.charset");
+ try {
+ String text = FileUtils.readFileToString(file, charset.name());
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(text);
+ return matcher.find();
+ } catch (IOException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CHECKREGEX_IO_EXCEPTION,
+ file.getName()
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Replicates a string pattern based on a list of objects, generating a list
+ * as result.
+ * @param pattern The string pattern.
+ * @param values The list of objects to be merged with the pattern.
+ * @return A list containing the string pattern replicated to each object
+ * from the list.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<Object> replicateList(String pattern,
+ List<Object> values) throws AraraException {
+ List<Object> result = new ArrayList<Object>();
+ for (Object value : values) {
+ try {
+ result.add(String.format(pattern, value));
+ } catch (MissingFormatArgumentException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Checks if the provided operating system string holds according to the
+ * underlying operating system.
+ * @param value A string representing an operating system.
+ * @return A boolean value indicating if the provided string refers to the
+ * underlying operating system.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean checkOS(String value) throws AraraException {
+ Map<String, Boolean> values = new HashMap<String, Boolean>();
+ values.put("windows", SystemUtils.IS_OS_WINDOWS);
+ values.put("linux", SystemUtils.IS_OS_LINUX);
+ values.put("mac", SystemUtils.IS_OS_MAC_OSX);
+ values.put("unix", SystemUtils.IS_OS_UNIX);
+ values.put("aix", SystemUtils.IS_OS_AIX);
+ values.put("irix", SystemUtils.IS_OS_IRIX);
+ values.put("os2", SystemUtils.IS_OS_OS2);
+ values.put("solaris", SystemUtils.IS_OS_SOLARIS);
+ values.put("cygwin", (Boolean) SystemCallController.
+ getInstance().get("cygwin"));
+ if (!values.containsKey(value.toLowerCase())) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CHECKOS_INVALID_OPERATING_SYSTEM,
+ value
+ )
+ );
+ }
+ return values.get(value.toLowerCase());
+ }
+
+ /**
+ * Returns the exit status of the application.
+ * @return An integer representing the exit status of the application.
+ */
+ public static int getExitStatus() {
+ return (Integer) ConfigurationController.
+ getInstance().get("execution.status");
+ }
+
+ /**
+ * Gets the system property according to the provided key, or resort to the
+ * fallback value if an exception is thrown or if the key is invalid.
+ * @param key The system property key.
+ * @param fallback The fallback value.
+ * @return A string containing the system property value or the fallback.
+ */
+ public static String getSystemProperty(String key, String fallback) {
+ try {
+ String result = System.getProperty(key, fallback);
+ return result.equals("") ? fallback : result;
+ } catch (Exception exception) {
+ return fallback;
+ }
+ }
+
+ /**
+ * Gets the preamble content, converting a single string into a list of
+ * strings, based on new lines.
+ * @return A list of strings representing the preamble content.
+ */
+ public static List<String> getPreambleContent() {
+ if (((Boolean) ConfigurationController.
+ getInstance().get("execution.preamble.active")) == true) {
+ return new ArrayList<String>(
+ Arrays.asList(
+ ((String) ConfigurationController.getInstance().
+ get("execution.preamble.content")
+ ).split("\n"))
+ );
+ }
+ else {
+ return new ArrayList<String>();
+ }
+ }
+
+ /**
+ * Generates a list of filenames from the provided command based on a list
+ * of extensions for each underlying operating system.
+ * @param command A string representing the command.
+ * @return A list of filenames.
+ */
+ private static List<String> appendExtensions(String command) {
+
+ // the resulting list, to hold the
+ // filenames generated from the
+ // provided command
+ List<String> result = new ArrayList<String>();
+
+ // list of extensions, specific for
+ // each operating system (in fact, it
+ // is more Windows specific)
+ List<String> extensions;
+
+ // the application is running on
+ // Windows, so let's look for the
+ // following extensions in order
+ if (SystemUtils.IS_OS_WINDOWS) {
+
+ // this list is actually a sublist from
+ // the original Windows PATHEXT environment
+ // variable which holds the list of executable
+ // extensions that Windows supports
+ extensions = Arrays.asList(".com", ".exe", ".bat", ".cmd");
+ }
+ else {
+
+ // no Windows, so the default
+ // extension will be just an
+ // empty string
+ extensions = Arrays.asList("");
+ }
+
+ // for each and every extension in the
+ // list, let's build the corresponding
+ // filename and add to the result
+ for (String extension : extensions) {
+ result.add(command.concat(extension));
+ }
+
+ // return the resulting list
+ // holding the filenames
+ return result;
+ }
+
+ /**
+ * Checks if the provided command name is reachable from the system path.
+ * @param command A string representing the command.
+ * @return A logic value.
+ */
+ public static boolean isOnPath(String command) {
+ try {
+
+ // first and foremost, let's build the list
+ // of filenames based on the underlying
+ // operating system
+ List<String> filenames = appendExtensions(command);
+
+ // break the path into several parts
+ // based on the path separator symbol
+ StringTokenizer tokenizer = new StringTokenizer(
+ System.getenv("PATH"),
+ File.pathSeparator
+ );
+
+ // iterate through every part of the
+ // path looking for each filename
+ while (tokenizer.hasMoreTokens()) {
+
+ // if the search does not return an empty
+ // list, one of the filenames got a match,
+ // and the command is available somewhere
+ // in the system path
+ if (
+ !FileUtils.listFiles(
+ new File(tokenizer.nextToken()),
+ new NameFileFilter(filenames),
+ null
+ ).isEmpty()) {
+
+ // command is found somewhere,
+ // so it is on path
+ return true;
+ }
+ }
+
+ // nothing was found,
+ // command is not on path
+ return false;
+ }
+ catch (Exception exception) {
+
+ // an exception was raised, simply
+ // return and forget about it
+ return false;
+ }
+ }
+
+ /**
+ * Gets the full base name of a file.
+ * @param file The file.
+ * @return The corresponding full base name.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getFullBasename(File file) throws AraraException {
+
+ // if the provided file does not contain a
+ // file separator, fallback to the usual
+ // base name lookup
+ if (!file.toString().contains(File.separator)) {
+ return getBasename(file);
+ }
+ else {
+
+ // we need to get the parent file, get the
+ // canonical path and build the corresponding
+ // full base name path
+ File parent = file.getParentFile();
+ String path = getCanonicalPath(parent == null ? file : parent);
+ return buildPath(path, getBasename(file));
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java
new file mode 100644
index 00000000000..0b7d3b8a5b4
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java
@@ -0,0 +1,239 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.Arara;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.FileType;
+import com.github.cereda.arara.model.FileTypeResource;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.Resource;
+import java.io.File;
+import java.io.FileReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.lang.SystemUtils;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.MarkedYAMLException;
+import org.yaml.snakeyaml.nodes.Tag;
+import org.yaml.snakeyaml.representer.Representer;
+
+/**
+ * Implements configuration utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class ConfigurationUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Gets the list of default file types provided by nightingale, in order.
+ * @return The list of default file types, in order.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<FileType> getDefaultFileTypes() throws AraraException {
+ return Arrays.asList(
+ new FileType("tex"),
+ new FileType("dtx"),
+ new FileType("ltx"),
+ new FileType("drv"),
+ new FileType("ins")
+ );
+ }
+
+ /**
+ * Gets the configuration file located at the user home directory, if any.
+ * @return The file reference to the external configuration, if any.
+ */
+ public static File getConfigFile() {
+ List<String> names = Arrays.asList(
+ ".araraconfig.yaml",
+ "araraconfig.yaml",
+ ".arararc.yaml",
+ "arararc.yaml"
+ );
+
+ // look for configuration files in the user's working directory first
+ for (String name : names) {
+ String path = CommonUtils.buildPath(SystemUtils.USER_DIR, name);
+ File file = new File(path);
+ if (file.exists()) {
+ return file;
+ }
+ }
+
+ // if no configuration files are found in the user's working directory,
+ // try to look up in a global directory, that is, the user home
+ for (String name : names) {
+ String path = CommonUtils.buildPath(SystemUtils.USER_HOME, name);
+ File file = new File(path);
+ if (file.exists()) {
+ return file;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Validates the configuration file.
+ * @param file The configuration file.
+ * @return The configuration file as a resource.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Resource validateConfiguration(File file)
+ throws AraraException {
+
+ Representer representer = new Representer();
+ representer.addClassTag(Resource.class, new Tag("!config"));
+ Yaml yaml = new Yaml(new Constructor(Resource.class), representer);
+ try {
+ Resource resource = yaml.loadAs(new FileReader(file),
+ Resource.class);
+ if (resource.getFiletypes() != null) {
+ List<FileTypeResource> filetypes = resource.getFiletypes();
+ if (CollectionUtils.exists(filetypes,
+ new Predicate<FileTypeResource>() {
+ public boolean evaluate(FileTypeResource filetype) {
+ return (filetype.getExtension() == null);
+ }
+ })) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION
+ )
+ );
+ }
+ }
+ return resource;
+ } catch (MarkedYAMLException yamlException) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CONFIGURATION_INVALID_YAML
+ ),
+ yamlException
+ );
+ } catch (Exception exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_CONFIGURATION_GENERIC_ERROR
+ )
+ );
+ }
+ }
+
+ /**
+ * Normalize a list of rule paths, removing all duplicates.
+ * @param paths The list of rule paths.
+ * @return A list of normalized paths, without duplicates.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<String> normalizePaths(List<String> paths)
+ throws AraraException {
+ paths.add(CommonUtils.buildPath(getApplicationPath(), "rules"));
+ Set<String> set = new LinkedHashSet<String>(paths);
+ List<String> result = new ArrayList<String>(set);
+ return result;
+ }
+
+ /**
+ * Normalize a list of file types, removing all duplicates.
+ * @param types The list of file types.
+ * @return A list of normalized file types, without duplicates.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<FileType> normalizeFileTypes(List<FileType> types)
+ throws AraraException {
+ types.addAll(getDefaultFileTypes());
+ Set<FileType> set = new LinkedHashSet<FileType>(types);
+ List<FileType> result = new ArrayList<FileType>(set);
+ return result;
+ }
+
+ /**
+ * Gets the canonical absolute application path.
+ * @return The string representation of the canonical absolute application
+ * path.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getApplicationPath() throws AraraException {
+ try {
+ String path = Arara.class.getProtectionDomain().
+ getCodeSource().getLocation().getPath();
+ path = URLDecoder.decode(path, "UTF-8");
+ path = new File(path).getParentFile().getPath();
+ return path;
+ } catch (UnsupportedEncodingException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Cleans the file name to avoid invalid entries.
+ * @param name The file name.
+ * @return A cleaned file name.
+ */
+ public static String cleanFileName(String name) {
+ String result = (new File(name)).getName().trim();
+ if (CommonUtils.checkEmptyString(result)) {
+ return "arara";
+ } else {
+ return result.trim();
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java
new file mode 100644
index 00000000000..8861ff7e5ee
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java
@@ -0,0 +1,140 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Database;
+import com.github.cereda.arara.model.Messages;
+import java.io.File;
+import org.simpleframework.xml.Serializer;
+import org.simpleframework.xml.core.Persister;
+
+/**
+ * Implements database utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class DatabaseUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Loads the XML file representing the database.
+ * @return The database object.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Database load() throws AraraException {
+ if (!exists()) {
+ return new Database();
+ } else {
+ File file = new File(getPath());
+ try {
+ Serializer serializer = new Persister();
+ Database database = serializer.read(Database.class, file);
+ return database;
+ } catch (Exception exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_LOAD_COULD_NOT_LOAD_XML,
+ file.getName()
+ ),
+ exception
+ );
+ }
+ }
+ }
+
+ /**
+ * Saves the database on a XML file.
+ * @param database The database object.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static void save(Database database) throws AraraException {
+ File file = new File(getPath());
+ try {
+ Serializer serializer = new Persister();
+ serializer.write(database, file);
+ } catch (Exception exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_SAVE_COULD_NOT_SAVE_XML,
+ file.getName()
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Checks if the XML file representing the database exists.
+ * @return A boolean value indicating if the XML file exists.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static boolean exists() throws AraraException {
+ File file = new File(getPath());
+ return file.exists();
+ }
+
+ /**
+ * Gets the path to the XML file representing the database.
+ * @return A string representing the path to the XML file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static String getPath() throws AraraException {
+ String name = ((String) ConfigurationController.
+ getInstance().get("execution.database.name")).concat(".xml");
+ String path = CommonUtils.getParentCanonicalPath(getReference());
+ return CommonUtils.buildPath(path, name);
+ }
+
+ /**
+ * Gets the main file reference.
+ * @return The main file reference.
+ */
+ private static File getReference() {
+ return (File) ConfigurationController.
+ getInstance().get("execution.reference");
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java
index cd8c8d674b0..d2dd5889967 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,79 +30,77 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraTask: This class provides the model for representing the Arara tasks
- * based on the directives and rules. It's a plain old Java object.
*/
-// package definition
-package com.github.arara.model;
+package com.github.cereda.arara.utils;
-// needed import
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
/**
- * Provides the model for representing the Arara tasks based on the directives
- * and rules.
- *
+ * Implements a directive assembler in order to help build a directive from a
+ * list of strings.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
+ * @version 4.0
+ * @since 4.0
*/
-public class AraraTask {
+public class DirectiveAssembler {
- // the task name
- private String name;
- // a map to hold the tasks parameters
- private HashMap parameters;
+ // this variable holds a list of
+ // line numbers indicating which
+ // lines composed the resulting
+ // potential directive
+ private final List<Integer> lineNumbers;
+
+ // this variable holds the textual
+ // representation of the directive
+ private String text;
/**
- * Empty constructor.
+ * Constructor.
*/
- public AraraTask() {
+ public DirectiveAssembler() {
+ lineNumbers = new ArrayList<Integer>();
+ text = "";
}
- /**
- * Getter for name.
- *
- * @return The task name.
+ /**
+ * Checks if an append operation is allowed.
+ * @return A boolean value indicating if an append operation is allowed.
*/
- public String getName() {
-
- // return it
- return name;
+ public boolean isAppendAllowed() {
+ return !lineNumbers.isEmpty();
}
/**
- * Setter for name.
- *
- * @param name The task name.
+ * Adds a line number to the assembler.
+ * @param line An integer representing the line number.
*/
- public void setName(String name) {
-
- // set the name
- this.name = name;
+ public void addLineNumber(int line) {
+ lineNumbers.add(line);
}
/**
- * Getter for parameters.
- *
- * @return A map containing all the task parameters.
+ * Appends the provided line to the assembler text.
+ * @param line The provided line.
*/
- public HashMap getParameters() {
-
- // return it
- return parameters;
+ public void appendLine(String line) {
+ text = text.concat(" ").concat(line.trim());
}
/**
- * Setter for parameters.
- *
- * @param parameters The task parameters as a map.
+ * Gets the list of line numbers.
+ * @return The list of line numbers.
*/
- public void setParameters(HashMap parameters) {
+ public List<Integer> getLineNumbers() {
+ return lineNumbers;
+ }
- // set parameters
- this.parameters = parameters;
+ /**
+ * Gets the text.
+ * @return The assembler text, properly trimmed.
+ */
+ public String getText() {
+ return text.trim();
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java
index 6ac807f6564..6ea18e31ba5 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,44 +30,30 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * AraraResolver: This class extends a Resolver class to disable mapping of
- * numeric times, as arara works better with text.
*/
-// package definition
-package com.github.arara.utils;
+package com.github.cereda.arara.utils;
-// needed import
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.resolver.Resolver;
/**
- * Extends a Resolver class to disable mapping of numeric times, as Arara works
- * better with text.
- *
+ * This class implements a directive resolver.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
+ * @version 4.0
+ * @since 4.0
*/
-public class AraraResolver extends Resolver {
+public class DirectiveResolver extends Resolver {
/**
- * Adds the implicit resolvers to the Yaml mechanism.
+ * Adds implicit resolvers to the YAML model. For arara, I disabled
+ * boolean and numeric values to be automatically parsed. They still can
+ * be used through an explicit conversion in the rule context.
*/
@Override
protected void addImplicitResolvers() {
-
- // for merges
addImplicitResolver(Tag.MERGE, MERGE, "<");
-
- // for null values
addImplicitResolver(Tag.NULL, NULL, "~nN\0");
-
- // for empty values
addImplicitResolver(Tag.NULL, EMPTY, null);
-
- // for values
- addImplicitResolver(Tag.VALUE, VALUE, "=");
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java
new file mode 100644
index 00000000000..d4d2a88ac7e
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java
@@ -0,0 +1,438 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Conditional;
+import com.github.cereda.arara.model.Directive;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.Pair;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.MarkedYAMLException;
+import org.yaml.snakeyaml.representer.Representer;
+
+/**
+ * Implements directive utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class DirectiveUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // get the logger context from a factory
+ private static final Logger logger =
+ LoggerFactory.getLogger(DirectiveUtils.class);
+
+ /**
+ * Extracts a list of directives from a list of strings.
+ * @param lines List of strings.
+ * @return A list of directives.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<Directive> extractDirectives(List<String> lines)
+ throws AraraException {
+
+ boolean header = (Boolean) ConfigurationController.
+ getInstance().get("execution.header");
+ String regex = (String) ConfigurationController.
+ getInstance().get("execution.file.pattern");
+ Pattern linecheck = Pattern.compile(regex);
+ regex = regex.concat((String) ConfigurationController.
+ getInstance().get("application.pattern"));
+ Pattern pattern = Pattern.compile(regex);
+ List<Pair<Integer, String>> pairs =
+ new ArrayList<Pair<Integer, String>>();
+ Matcher matcher;
+ for (int i = 0; i < lines.size(); i++) {
+ matcher = pattern.matcher(lines.get(i));
+ if (matcher.find()) {
+ String line = lines.get(i).substring(
+ matcher.end(),
+ lines.get(i).length()
+ );
+ Pair<Integer, String> pair =
+ new Pair<Integer, String>(i + 1, line);
+ pairs.add(pair);
+
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_POTENTIAL_PATTERN_FOUND,
+ (i + 1),
+ line.trim()
+ )
+ );
+ }
+ else {
+ if (header) {
+ if (!checkLinePattern(linecheck, lines.get(i))) {
+ break;
+ }
+ }
+ }
+ }
+
+ if (pairs.isEmpty()) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_NO_DIRECTIVES_FOUND
+ )
+ );
+ }
+
+ List<DirectiveAssembler> assemblers
+ = new ArrayList<DirectiveAssembler>();
+ DirectiveAssembler assembler = new DirectiveAssembler();
+ regex = (String) ConfigurationController.getInstance().
+ get("directives.linebreak.pattern");
+ pattern = Pattern.compile(regex);
+ for (Pair<Integer, String> pair : pairs) {
+ matcher = pattern.matcher(pair.getSecondElement());
+ if (matcher.find()) {
+ if (!assembler.isAppendAllowed()) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_ORPHAN_LINEBREAK,
+ pair.getFirstElement()
+ )
+ );
+ } else {
+ assembler.addLineNumber(pair.getFirstElement());
+ assembler.appendLine(matcher.group(1));
+ }
+ } else {
+ if (assembler.isAppendAllowed()) {
+ assemblers.add(assembler);
+ }
+ assembler = new DirectiveAssembler();
+ assembler.addLineNumber(pair.getFirstElement());
+ assembler.appendLine(pair.getSecondElement());
+ }
+ }
+ if (assembler.isAppendAllowed()) {
+ assemblers.add(assembler);
+ }
+
+ List<Directive> directives = new ArrayList<Directive>();
+ for (DirectiveAssembler current : assemblers) {
+ directives.add(generateDirective(current));
+ }
+ return directives;
+
+ }
+
+ /**
+ * Generates a directive from a directive assembler.
+ * @param assembler The directive assembler.
+ * @return The corresponding directive.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Directive generateDirective(DirectiveAssembler assembler)
+ throws AraraException {
+ String regex = (String) ConfigurationController.getInstance().
+ get("directives.pattern");
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(assembler.getText());
+ if (matcher.find()) {
+ Directive directive = new Directive();
+ directive.setIdentifier(matcher.group(1));
+ directive.setParameters(
+ getParameters(matcher.group(3), assembler.getLineNumbers())
+ );
+ Conditional conditional = new Conditional();
+ conditional.setType(getType(matcher.group(5)));
+ conditional.setCondition(getCondition(matcher.group(6)));
+ directive.setConditional(conditional);
+ directive.setLineNumbers(assembler.getLineNumbers());
+
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_POTENTIAL_DIRECTIVE_FOUND,
+ directive
+ )
+ );
+
+ return directive;
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT,
+ CommonUtils.getCollectionElements(
+ assembler.getLineNumbers(),
+ "(",
+ ")",
+ ", "
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Gets the conditional type based on the input string.
+ * @param text The input string.
+ * @return The conditional type.
+ */
+ private static Conditional.ConditionalType getType(String text) {
+ if (text == null) {
+ return Conditional.ConditionalType.NONE;
+ } else {
+ if (text.equals("if")) {
+ return Conditional.ConditionalType.IF;
+ } else {
+ if (text.equals("while")) {
+ return Conditional.ConditionalType.WHILE;
+ } else {
+ if (text.equals("until")) {
+ return Conditional.ConditionalType.UNTIL;
+ } else {
+ return Conditional.ConditionalType.UNLESS;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the condition from the input string.
+ * @param text The input string.
+ * @return A string representing the condition.
+ */
+ private static String getCondition(String text) {
+ return text == null ? "" : text;
+ }
+
+ /**
+ * Gets the parameters from the input string.
+ * @param text The input string.
+ * @param numbers The list of line numbers.
+ * @return A map containing the directive parameters.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static Map<String, Object> getParameters(String text,
+ List<Integer> numbers) throws AraraException {
+
+ if (text == null) {
+ return new HashMap<String, Object>();
+ }
+
+ Yaml yaml = new Yaml(
+ new Constructor(),
+ new Representer(),
+ new DumperOptions(),
+ new DirectiveResolver()
+ );
+ try {
+ @SuppressWarnings("unchecked")
+ HashMap<String, Object> map = yaml.loadAs(text, HashMap.class);
+ return map;
+ } catch (MarkedYAMLException exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_YAML_EXCEPTION,
+ CommonUtils.getCollectionElements(
+ numbers,
+ "(",
+ ")",
+ ", "
+ )
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Validates the list of directives, returning a new list.
+ * @param directives The list of directives.
+ * @return A new list of directives.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<Directive> validate(List<Directive> directives)
+ throws AraraException {
+
+ ArrayList<Directive> result = new ArrayList<Directive>();
+ for (Directive directive : directives) {
+ Map<String, Object> parameters = directive.getParameters();
+
+ if (parameters.containsKey("file")) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_FILE_IS_RESERVED,
+ CommonUtils.getCollectionElements(
+ directive.getLineNumbers(),
+ "(",
+ ")",
+ ", "
+ )
+ )
+ );
+ }
+
+ if (parameters.containsKey("reference")) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_REFERENCE_IS_RESERVED,
+ CommonUtils.getCollectionElements(
+ directive.getLineNumbers(),
+ "(",
+ ")",
+ ", "
+ )
+ )
+ );
+ }
+
+ if (parameters.containsKey("files")) {
+
+ Object holder = parameters.get("files");
+ if (holder instanceof List) {
+ @SuppressWarnings("unchecked")
+ List<Object> files = (List<Object>) holder;
+ parameters.remove("files");
+ if (files.isEmpty()) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_EMPTY_FILES_LIST,
+ CommonUtils.getCollectionElements(
+ directive.getLineNumbers(),
+ "(",
+ ")",
+ ", "
+ )
+ )
+ );
+ }
+ for (Object file : files) {
+ Map<String, Object> map = new HashMap<String, Object>();
+ for (String key : parameters.keySet()) {
+ map.put(key, parameters.get(key));
+ }
+ File representation = CommonUtils.
+ getCanonicalFile(String.valueOf(file));
+
+ map.put("reference", representation);
+ map.put("file", representation.getName());
+
+ Directive addition = new Directive();
+ Conditional conditional = new Conditional();
+ conditional.setCondition(directive.getConditional().
+ getCondition()
+ );
+ conditional.setType(directive.getConditional().
+ getType()
+ );
+ addition.setIdentifier(directive.getIdentifier());
+ addition.setConditional(conditional);
+ addition.setParameters(map);
+ addition.setLineNumbers(directive.getLineNumbers());
+ result.add(addition);
+ }
+ } else {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VALIDATE_FILES_IS_NOT_A_LIST,
+ CommonUtils.getCollectionElements(
+ directive.getLineNumbers(),
+ "(",
+ ")",
+ ", "
+ )
+ )
+ );
+ }
+ } else {
+ File representation = (File) ConfigurationController.
+ getInstance().get("execution.reference");
+ parameters.put("file", representation.getName());
+ parameters.put("reference", representation);
+ directive.setParameters(parameters);
+ result.add(directive);
+ }
+ }
+
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_VALIDATED_DIRECTIVES
+ )
+ );
+ logger.info(DisplayUtils.displayOutputSeparator(
+ messages.getMessage(
+ Messages.LOG_INFO_DIRECTIVES_BLOCK
+ )
+ ));
+ for (Directive directive : result) {
+ logger.info(directive.toString());
+ }
+
+ logger.info(DisplayUtils.displaySeparator());
+
+ return result;
+ }
+
+ /**
+ * Checks if the provided line contains the corresponding pattern, based on
+ * the file type, or an empty line.
+ * @param pattern Pattern to be matched, based on the file type.
+ * @param line Provided line.
+ * @return Logical value indicating if the provided line contains the
+ * corresponding pattern, based on the file type, or an empty line.
+ */
+ private static boolean checkLinePattern(Pattern pattern, String line) {
+ return CommonUtils.checkEmptyString(line.trim()) ||
+ pattern.matcher(line).find();
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java
new file mode 100644
index 00000000000..879119e60e2
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java
@@ -0,0 +1,502 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Conditional;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.StopWatch;
+import java.io.File;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.WordUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implements display utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class DisplayUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // get the logger context from a factory
+ private static final Logger logger =
+ LoggerFactory.getLogger(DisplayUtils.class);
+
+ /**
+ * Displays the short version of the current entry in the terminal.
+ * @param name Rule name.
+ * @param task Task name.
+ */
+ private static void buildShortEntry(String name, String task) {
+ int width = getWidth();
+ int result = getLongestMatch();
+ if (result >= width) {
+ result = 10;
+ }
+ int space = width - result - 1;
+ StringBuilder entry = new StringBuilder();
+ entry.append("(").append(name).append(") ");
+ entry.append(task).append(" ");
+ String line = StringUtils.abbreviate(entry.toString(), space - 4);
+ entry = new StringBuilder();
+ entry.append(StringUtils.rightPad(line, space, ".")).append(" ");
+ System.out.print(entry);
+ }
+
+ /**
+ * Displays the short version of the current entry result in the terminal.
+ * @param value The boolean value to be displayed.
+ */
+ private static void buildShortResult(boolean value) {
+ int result = getLongestMatch();
+ System.out.println(StringUtils.leftPad(getResult(value), result));
+ }
+
+ /**
+ * Displays the current entry result in the terminal.
+ * @param value The boolean value to be displayed.
+ */
+ public static void printEntryResult(boolean value) {
+ ConfigurationController.getInstance().put("display.line", false);
+ ConfigurationController.getInstance().put("display.result", true);
+ ConfigurationController.getInstance()
+ .put("execution.status", value ? 0 : 1);
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_TASK_RESULT
+ ).concat(" ").concat(getResult(value))
+ );
+ if (!isDryRunMode()) {
+ if (!isVerboseMode()) {
+ buildShortResult(value);
+ } else {
+ buildLongResult(value);
+ }
+ }
+ }
+
+ /**
+ * Displays a long version of the current entry result in the terminal.
+ * @param value The boolean value to be displayed
+ */
+ private static void buildLongResult(boolean value) {
+ int width = getWidth();
+ System.out.println("\n".concat(StringUtils.leftPad(
+ " ".concat(getResult(value)), width, "-"
+ )));
+ }
+
+ /**
+ * Displays the current entry in the terminal.
+ * @param name The rule name.
+ * @param task The task name.
+ */
+ public static void printEntry(String name, String task) {
+ logger.info(
+ messages.getMessage(
+ Messages.LOG_INFO_INTERPRET_TASK,
+ task,
+ name
+ )
+ );
+ ConfigurationController.getInstance().put("display.line", true);
+ ConfigurationController.getInstance().put("display.result", false);
+ if (!isDryRunMode()) {
+ if (!isVerboseMode()) {
+ buildShortEntry(name, task);
+ } else {
+ buildLongEntry(name, task);
+ }
+ } else {
+ buildDryRunEntry(name, task);
+ }
+ }
+
+ /**
+ * Gets the length of the longest result match.
+ * @return An integer value representing the longest result match.
+ */
+ private static int getLongestMatch() {
+ String[] values = new String[]{
+ messages.getMessage(Messages.INFO_LABEL_ON_SUCCESS),
+ messages.getMessage(Messages.INFO_LABEL_ON_FAILURE),
+ messages.getMessage(Messages.INFO_LABEL_ON_ERROR)
+ };
+ int max = values[0].length();
+ for (String value : values) {
+ if (max < value.length()) {
+ max = value.length();
+ }
+ }
+ return max;
+ }
+
+ /**
+ * Displays a long version of the current entry in the terminal.
+ * @param name Rule name.
+ * @param task Task name.
+ */
+ private static void buildLongEntry(String name, String task) {
+ if (ConfigurationController.getInstance().contains("display.rolling")) {
+ addNewLine();
+ } else {
+ ConfigurationController.getInstance().put("display.rolling", true);
+ }
+ StringBuilder line = new StringBuilder();
+ line.append("(").append(name).append(") ");
+ line.append(task);
+ System.out.println(displaySeparator());
+ System.out.println(StringUtils.abbreviate(line.toString(), getWidth()));
+ System.out.println(displaySeparator());
+ }
+
+ /**
+ * Displays a dry-run version of the current entry in the terminal.
+ * @param name The rule name.
+ * @param task The task name.
+ */
+ private static void buildDryRunEntry(String name, String task) {
+ if (ConfigurationController.getInstance().contains("display.rolling")) {
+ addNewLine();
+ } else {
+ ConfigurationController.getInstance().put("display.rolling", true);
+ }
+ StringBuilder line = new StringBuilder();
+ line.append("[DR] (").append(name).append(") ");
+ line.append(task);
+ System.out.println(StringUtils.abbreviate(line.toString(), getWidth()));
+ System.out.println(displaySeparator());
+ }
+
+ /**
+ * Displays the exception in the terminal.
+ * @param exception The exception object.
+ */
+ public static void printException(AraraException exception) {
+ ConfigurationController.getInstance().put("display.exception", true);
+ ConfigurationController.getInstance().put("execution.status", 2);
+ boolean display = false;
+ if (ConfigurationController.getInstance().contains("display.line")) {
+ display = (Boolean) ConfigurationController.
+ getInstance().get("display.line");
+ }
+ if (ConfigurationController.getInstance().contains("display.result")) {
+ if (((Boolean) ConfigurationController.
+ getInstance().get("display.result")) == true) {
+ addNewLine();
+ }
+ }
+ if (display) {
+ if (!isDryRunMode()) {
+ if (!isVerboseMode()) {
+ buildShortError();
+ } else {
+ buildLongError();
+ }
+ addNewLine();
+ }
+ }
+ String text = exception.hasException() ?
+ exception.getMessage().concat(" ").concat(
+ messages.getMessage(
+ Messages.INFO_DISPLAY_EXCEPTION_MORE_DETAILS
+ )
+ )
+ : exception.getMessage();
+ logger.error(text);
+ wrapText(text);
+ if (exception.hasException()) {
+ addNewLine();
+ displayDetailsLine();
+ String details = exception.getException().getMessage();
+ logger.error(details);
+ wrapText(details);
+ }
+ }
+
+ /**
+ * Gets the string representation of the provided boolean value.
+ * @param value The boolean value.
+ * @return The string representation.
+ */
+ private static String getResult(boolean value) {
+ return (value == true ?
+ messages.getMessage(
+ Messages.INFO_LABEL_ON_SUCCESS
+ )
+ : messages.getMessage(Messages.INFO_LABEL_ON_FAILURE));
+ }
+
+ /**
+ * Displays the short version of an error in the terminal.
+ */
+ private static void buildShortError() {
+ int result = getLongestMatch();
+ System.out.println(StringUtils.leftPad(
+ messages.getMessage(
+ Messages.INFO_LABEL_ON_ERROR
+ ),
+ result
+ ));
+ }
+
+ /**
+ * Displays the long version of an error in the terminal.
+ */
+ private static void buildLongError() {
+ String line = StringUtils.leftPad(
+ " ".concat(messages.getMessage(Messages.INFO_LABEL_ON_ERROR)),
+ getWidth(), "-");
+ System.out.println(line);
+ }
+
+ /**
+ * Gets the default terminal width defined in the settings.
+ * @return An integer representing the terminal width.
+ */
+ private static int getWidth() {
+ return (Integer) ConfigurationController.
+ getInstance().get("application.width");
+ }
+
+ /**
+ * Displays the provided text wrapped nicely according to the default
+ * terminal width.
+ * @param text The text to be displayed.
+ */
+ public static void wrapText(String text) {
+ System.out.println(WordUtils.wrap(text, getWidth()));
+ }
+
+ /**
+ * Checks if the execution is in dry-run mode.
+ * @return A boolean value indicating if the execution is in dry-run mode.
+ */
+ private static boolean isDryRunMode() {
+ return (Boolean) ConfigurationController.
+ getInstance().get("execution.dryrun");
+ }
+
+ /**
+ * Checks if the execution is in verbose mode.
+ * @return A boolean value indicating if the execution is in verbose mode.
+ */
+ private static boolean isVerboseMode() {
+ return (Boolean) ConfigurationController.
+ getInstance().get("execution.verbose");
+ }
+
+ /**
+ * Displays the rule authors in the terminal.
+ * @param authors The list of authors.
+ */
+ public static void printAuthors(List<String> authors) {
+ StringBuilder line = new StringBuilder();
+ line.append(authors.size() == 1 ?
+ messages.getMessage(Messages.INFO_LABEL_AUTHOR)
+ : messages.getMessage(Messages.INFO_LABEL_AUTHORS));
+ String text = authors.isEmpty() ?
+ messages.getMessage(Messages.INFO_LABEL_NO_AUTHORS)
+ : CommonUtils.getCollectionElements(
+ CommonUtils.trimSpaces(authors), "", "", ", ");
+ line.append(" ").append(text);
+ wrapText(line.toString());
+ }
+
+ /**
+ * Displays the current conditional in the terminal.
+ * @param conditional The conditional object.
+ */
+ public static void printConditional(Conditional conditional) {
+ if (conditional.getType() != Conditional.ConditionalType.NONE) {
+ StringBuilder line = new StringBuilder();
+ line.append(messages.getMessage(Messages.INFO_LABEL_CONDITIONAL));
+ line.append(" (");
+ line.append(String.valueOf(conditional.getType()));
+ line.append(") ").append(conditional.getCondition());
+ wrapText(line.toString());
+ }
+ }
+
+ /**
+ * Displays the file information in the terminal.
+ */
+ public static void printFileInformation() {
+ File file = (File) ConfigurationController.
+ getInstance().get("execution.reference");
+ String version = (String) ConfigurationController.
+ getInstance().get("application.version");
+ String revision = (String) ConfigurationController.
+ getInstance().get("application.revision");
+ String line = messages.getMessage(
+ Messages.INFO_DISPLAY_FILE_INFORMATION,
+ file.getName(),
+ CommonUtils.calculateFileSize(file),
+ CommonUtils.getLastModifiedInformation(file)
+ );
+ logger.info(messages.getMessage(
+ Messages.LOG_INFO_WELCOME_MESSAGE,
+ version,
+ revision
+ ));
+ logger.info(displaySeparator());
+ logger.info(String.format("::: arara @ %s",
+ getApplicationPath()
+ ));
+ logger.info(String.format("::: Java %s, %s",
+ CommonUtils.getSystemProperty("java.version",
+ "[unknown version]"),
+ CommonUtils.getSystemProperty("java.vendor",
+ "[unknown vendor]")
+ ));
+ logger.info(String.format("::: %s",
+ CommonUtils.getSystemProperty("java.home",
+ "[unknown location]")
+ ));
+ logger.info(String.format("::: %s, %s, %s",
+ CommonUtils.getSystemProperty("os.name",
+ "[unknown OS name]"),
+ CommonUtils.getSystemProperty("os.arch",
+ "[unknown OS arch]"),
+ CommonUtils.getSystemProperty("os.version",
+ "[unknown OS version]")
+ ));
+ logger.info(String.format("::: user.home @ %s",
+ CommonUtils.getSystemProperty("user.home",
+ "[unknown user's home directory]")
+ ));
+ logger.info(String.format("::: user.dir @ %s",
+ CommonUtils.getSystemProperty("user.dir",
+ "[unknown user's working directory]")
+ ));
+ logger.info(String.format("::: CF @ %s",
+ (String) ConfigurationController.
+ getInstance().get("execution.configuration.name")
+ ));
+ logger.info(displaySeparator());
+ logger.info(line);
+ wrapText(line);
+ addNewLine();
+ }
+
+ /**
+ * Displays the elapsed time in the terminal.
+ */
+ public static void printTime() {
+ if (ConfigurationController.getInstance().contains("display.time")) {
+ if ((ConfigurationController.getInstance().contains("display.line"))
+ || (ConfigurationController.getInstance().
+ contains("display.exception"))) {
+ addNewLine();
+ }
+ String text = messages.getMessage(
+ Messages.INFO_DISPLAY_EXECUTION_TIME, StopWatch.getTime());
+ logger.info(text);
+ wrapText(text);
+ }
+ }
+
+ /**
+ * Displays the application logo in the terminal.
+ */
+ public static void printLogo() {
+ StringBuilder builder = new StringBuilder();
+ builder.append(" __ _ _ __ __ _ _ __ __ _ ").append("\n");
+ builder.append(" / _` | '__/ _` | '__/ _` |").append("\n");
+ builder.append("| (_| | | | (_| | | | (_| |").append("\n");
+ builder.append(" \\__,_|_| \\__,_|_| \\__,_|");
+ System.out.println(builder.toString());
+ addNewLine();
+ }
+
+ /**
+ * Adds a new line in the terminal.
+ */
+ private static void addNewLine() {
+ System.out.println();
+ }
+
+ /**
+ * Displays a line containing details.
+ */
+ private static void displayDetailsLine() {
+ String line = messages.getMessage(
+ Messages.INFO_LABEL_ON_DETAILS).concat(" ");
+ line = StringUtils.rightPad(
+ StringUtils.abbreviate(line, getWidth()), getWidth(), "-");
+ System.out.println(line);
+ }
+
+ /**
+ * Gets the output separator with the provided text.
+ * @param message The provided text.
+ * @return A string containing the output separator with the provided text.
+ */
+ public static String displayOutputSeparator(String message) {
+ return StringUtils.center(" ".concat(message).concat(" "),
+ getWidth(), "-");
+ }
+
+ /**
+ * Gets the line separator.
+ * @return A string containing the line separator.
+ */
+ public static String displaySeparator() {
+ return StringUtils.repeat("-", getWidth());
+ }
+
+ /**
+ * Gets the application path.
+ * @return A string containing the application path.
+ */
+ private static String getApplicationPath() {
+ try {
+ return ConfigurationUtils.getApplicationPath();
+ }
+ catch (AraraException ae) {
+ return "[unknown application path]";
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java
new file mode 100644
index 00000000000..9f56c92f5d9
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java
@@ -0,0 +1,124 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.io.FileUtils;
+
+/**
+ * Implements file handling utilitary methods.
+ *
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class FileHandlingUtils {
+
+ /**
+ * Writes the string to a file, using UTF-8 as default encoding.
+ * @param file The file.
+ * @param text The string to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(File file, String text, boolean append) {
+ try {
+
+ // try to write the provided
+ // string to the file, with
+ // UTF-8 as encoding
+ FileUtils.writeStringToFile(file, text, "UTF-8", append);
+ return true;
+
+ } catch (IOException nothandled) {
+
+ // if something bad happens,
+ // gracefully fallback to
+ // reporting the failure
+ return false;
+ }
+ }
+
+ /**
+ * Writes the string list to a file, using UTF-8 as default encoding.
+ * @param file The file.
+ * @param lines The string list to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(File file, List<String> lines,
+ boolean append) {
+ try {
+
+ // try to write the provided
+ // string lists to the file,
+ // with UTF-8 as encoding
+ FileUtils.writeLines(file, "UTF-8", lines, append);
+ return true;
+
+ } catch (IOException nothandled) {
+
+ // if something bad happens,
+ // gracefully fallback to
+ // reporting the failure
+ return false;
+ }
+ }
+
+ /**
+ * Reads the provided file into a list of strings.
+ * @param file The file.
+ * @return A list of strings.
+ */
+ public static List<String> readFromFile(File file) {
+ try {
+
+ // returns the contents of
+ // the provided file as
+ // a list of strings
+ return FileUtils.readLines(file, "UTF-8");
+
+ } catch (IOException nothandled) {
+
+ // if something bad happens,
+ // gracefully fallback to
+ // an empty file list
+ return new ArrayList<String>();
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java
new file mode 100644
index 00000000000..473674cbc50
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java
@@ -0,0 +1,117 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.FalseFileFilter;
+import org.apache.commons.io.filefilter.TrueFileFilter;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+
+/**
+ * Implements file searching utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class FileSearchingUtils {
+
+ /**
+ * List all files from the provided directory according to the list of
+ * extensions. The leading dot must be omitted, unless it is part of the
+ * extension.
+ * @param directory The provided directory.
+ * @param extensions The list of extensions.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByExtensions(File directory,
+ List<String> extensions, boolean recursive) {
+ try {
+
+ // convert the provided extension
+ // list to an extension array
+ String[] array = new String[extensions.size()];
+ array = extensions.toArray(array);
+
+ // return the result of the
+ // provided search
+ return new ArrayList<File>(
+ FileUtils.listFiles(directory, array, recursive)
+ );
+ } catch (Exception nothandled) {
+
+ // if something bad happens,
+ // gracefully fallback to
+ // an empty file list
+ return new ArrayList<File>();
+ }
+ }
+
+ /**
+ * List all files from the provided directory matching the list of file
+ * name patterns. Such list can contain wildcards.
+ * @param directory The provided directory.
+ * @param patterns The list of file name patterns.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByPatterns(File directory,
+ List<String> patterns, boolean recursive) {
+ try {
+
+ // return the result of the provided
+ // search, with the wildcard filter
+ // and a potential recursive search
+ return new ArrayList<File>(
+ FileUtils.listFiles(
+ directory,
+ new WildcardFileFilter(patterns),
+ recursive
+ ? TrueFileFilter.INSTANCE
+ : FalseFileFilter.INSTANCE
+ )
+ );
+ } catch (Exception nothandled) {
+
+ // if something bad happens,
+ // gracefully fallback to
+ // an empty file list
+ return new ArrayList<File>();
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java
new file mode 100644
index 00000000000..978cb07374f
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java
@@ -0,0 +1,257 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Argument;
+import com.github.cereda.arara.model.Command;
+import com.github.cereda.arara.model.Conditional;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.Rule;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zeroturnaround.exec.InvalidExitValueException;
+import org.zeroturnaround.exec.ProcessExecutor;
+import org.zeroturnaround.exec.listener.ShutdownHookProcessDestroyer;
+
+/**
+ * Implements interpreter utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class InterpreterUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // get the logger context from a factory
+ private static final Logger logger =
+ LoggerFactory.getLogger(InterpreterUtils.class);
+
+ /**
+ * Gets a list of all rule arguments.
+ * @param rule The provided rule.
+ * @return A list of strings containing all rule arguments.
+ */
+ public static List<String> getRuleArguments(Rule rule) {
+ Collection<String> result = CollectionUtils.collect(
+ rule.getArguments(), new Transformer<Argument, String>() {
+ public String transform(Argument input) {
+ return input.getIdentifier();
+ }
+ });
+ return new ArrayList<String>(result);
+ }
+
+ /**
+ * Checks if the current conditional has a prior evaluation.
+ * @param conditional The current conditional object.
+ * @return A boolean value indicating if the current conditional has a prior
+ * evaluation.
+ */
+ public static boolean runPriorEvaluation(Conditional conditional) {
+ if (((Boolean) ConfigurationController.getInstance().
+ get("execution.dryrun")) == true) {
+ return false;
+ }
+ switch (conditional.getType()) {
+ case IF:
+ case WHILE:
+ case UNLESS:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Runs the command in the underlying operating system.
+ * @param command An object representing the command.
+ * @return An integer value representing the exit code.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static int run(Object command) throws AraraException {
+ boolean verbose = (Boolean) ConfigurationController.
+ getInstance().get("execution.verbose");
+ boolean timeout = (Boolean) ConfigurationController.
+ getInstance().get("execution.timeout");
+ long value = (Long) ConfigurationController.
+ getInstance().get("execution.timeout.value");
+ TimeUnit unit = (TimeUnit) ConfigurationController.
+ getInstance().get("execution.timeout.unit");
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ ProcessExecutor executor = new ProcessExecutor();
+ if (CommonUtils.checkClass(Command.class, command)) {
+ executor = executor.command(((Command) command).getElements());
+ if (((Command) command).hasWorkingDirectory()) {
+ executor = executor.directory(
+ ((Command) command).getWorkingDirectory()
+ );
+ }
+ } else {
+ executor = executor.commandSplit((String) command);
+ }
+ if (timeout) {
+ if (value == 0) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_TIMEOUT_INVALID_RANGE
+ )
+ );
+ }
+ executor = executor.timeout(value, unit);
+ }
+ TeeOutputStream tee;
+ if (verbose) {
+ tee = new TeeOutputStream(System.out, buffer);
+ executor = executor.redirectInput(System.in);
+ } else {
+ tee = new TeeOutputStream(buffer);
+ }
+ executor = executor.redirectOutput(tee).redirectError(tee);
+ ShutdownHookProcessDestroyer hook = new ShutdownHookProcessDestroyer();
+ executor = executor.addDestroyer(hook);
+ try {
+ int exit = executor.execute().getExitValue();
+ logger.info(DisplayUtils.displayOutputSeparator(
+ messages.getMessage(
+ Messages.LOG_INFO_BEGIN_BUFFER
+ )
+ ));
+ logger.info(buffer.toString());
+ logger.info(DisplayUtils.displayOutputSeparator(
+ messages.getMessage(
+ Messages.LOG_INFO_END_BUFFER
+ )
+ ));
+ return exit;
+ } catch (IOException ioexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_IO_EXCEPTION
+ ),
+ ioexception
+ );
+ } catch (InterruptedException iexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_INTERRUPTED_EXCEPTION
+ ),
+ iexception
+ );
+ } catch (InvalidExitValueException ievexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION
+ ),
+ ievexception
+ );
+ } catch (TimeoutException texception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_TIMEOUT_EXCEPTION
+ ),
+ texception
+ );
+ } catch (Exception exception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_RUN_GENERIC_EXCEPTION
+ ),
+ exception
+ );
+ }
+ }
+
+ /**
+ * Builds the rule path based on the rule name and returns the corresponding
+ * file location.
+ * @param name The rule name.
+ * @return The rule file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static File buildRulePath(String name) throws AraraException {
+ @SuppressWarnings("unchecked")
+ List<String> paths = (List<String>) ConfigurationController.
+ getInstance().get("execution.rule.paths");
+ for (String path : paths) {
+ File location = new File(construct(path, name));
+ if (location.exists()) {
+ return location;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Constructs the path given the current path and the rule name.
+ * @param path The current path.
+ * @param name The rule name.
+ * @return The constructed path.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String construct(String path, String name)
+ throws AraraException {
+ name = name.concat(".yaml");
+ File location = new File(path);
+ if (location.isAbsolute()) {
+ return CommonUtils.buildPath(path, name);
+ } else {
+ File reference = (File) ConfigurationController.
+ getInstance().get("execution.reference");
+ String parent = CommonUtils.buildPath(
+ CommonUtils.getParentCanonicalPath(reference), path);
+ return CommonUtils.buildPath(parent, name);
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/MessageUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/MessageUtils.java
new file mode 100644
index 00000000000..52a5d095a8e
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/MessageUtils.java
@@ -0,0 +1,313 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import javax.swing.JOptionPane;
+import javax.swing.UIManager;
+
+/**
+ * Implements utilitary methods for displaying messages.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class MessageUtils {
+
+ // holds the default width for the
+ // message body, in pixels
+ private static final int WIDTH = 250;
+
+ // let's start the UI manager and set
+ // the default look and feel to be as
+ // close as possible to the system
+ static {
+
+ // get the current look and feel
+ String laf = (String) ConfigurationController.
+ getInstance().get("ui.lookandfeel");
+
+ // check if one is actually set
+ if (!laf.equals("none")) {
+
+ // use a special keyword to indicate
+ // the use of a system look and feel
+ if (laf.equals("system")) {
+ laf = UIManager.getSystemLookAndFeelClassName();
+ }
+
+ // let's try it, in case it fails,
+ // rely to the default look and feel
+ try {
+
+ // get the system look and feel name
+ // and try to set it as default
+ UIManager.setLookAndFeel(laf);
+ }
+ catch (Exception exception) {
+ // quack, quack, quack
+ }
+
+ }
+ }
+
+ /**
+ * Normalizes the icon type to one of the five available icons.
+ * @param value An integer value.
+ * @return The normalized integer value.
+ */
+ private static int normalizeIconType(int value) {
+
+ // do the normalization according to the available
+ // icons in the underlying message implementation
+ switch (value) {
+ case 1:
+ value = JOptionPane.ERROR_MESSAGE;
+ break;
+ case 2:
+ value = JOptionPane.INFORMATION_MESSAGE;
+ break;
+ case 3:
+ value = JOptionPane.WARNING_MESSAGE;
+ break;
+ case 4:
+ value = JOptionPane.QUESTION_MESSAGE;
+ break;
+ default:
+ value = JOptionPane.PLAIN_MESSAGE;
+ break;
+ }
+ return value;
+ }
+
+ /**
+ * Normalizes the message width, so only valid nonzero values are accepted.
+ * @param value An integer value corresponding to the message width.
+ * @return The normalized width.
+ */
+ private static int normalizeMessageWidth(int value) {
+ return (value > 0 ? value : WIDTH);
+ }
+
+ /**
+ * Shows the message.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ */
+ public static void showMessage(int width, int type,
+ String title, String text) {
+
+ // effectively shows the message based
+ // on the provided parameters
+ JOptionPane.showMessageDialog(
+ null,
+ String.format(
+ "<html><body style=\"width:%dpx\">%s</body></html>",
+ normalizeMessageWidth(width),
+ text
+ ),
+ title,
+ normalizeIconType(type)
+ );
+ }
+
+ /**
+ * Shows the message. It relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ */
+ public static void showMessage(int type, String title, String text) {
+ showMessage(WIDTH, type, title, text);
+ }
+
+ /**
+ * Shows a message with options presented as an array of buttons.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param buttons An array of objects to be presented as buttons.
+ * @return The index of the selected button, starting from 1.
+ */
+ public static int showOptions(int width, int type, String title,
+ String text, Object... buttons) {
+
+ // returns the index of the selected button,
+ // zero if nothing is selected
+ return JOptionPane.showOptionDialog(
+ null,
+ String.format(
+ "<html><body style=\"width:%dpx\">%s</body></html>",
+ normalizeMessageWidth(width),
+ text
+ ),
+ title,
+ JOptionPane.DEFAULT_OPTION,
+ normalizeIconType(type),
+ null,
+ buttons,
+ buttons[0]
+ ) + 1;
+ }
+
+ /**
+ * Shows a message with options presented as an array of buttons. It relies
+ * on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param buttons An array of objects to be presented as buttons.
+ * @return The index of the selected button, starting from 1.
+ */
+ public static int showOptions(int type, String title,
+ String text, Object... buttons) {
+ return showOptions(WIDTH, type, title, text, buttons);
+ }
+
+ /**
+ * Shows a message with a text input.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @return The string representing the input text.
+ */
+ public static String showInput(int width, int type,
+ String title, String text) {
+
+ // get the string from the
+ // input text, if any
+ String input = JOptionPane.showInputDialog(
+ null,
+ String.format(
+ "<html><body style=\"width:%dpx\">%s</body></html>",
+ normalizeMessageWidth(width),
+ text
+ ),
+ title,
+ normalizeIconType(type)
+ );
+
+ // if the input is not null, that is,
+ // the user actually typed something
+ if (input != null) {
+
+ // return the trimmed string
+ return input.trim();
+ }
+
+ // nothing was typed, so let's
+ // return an empty string
+ return "";
+ }
+
+ /**
+ * Shows a message with a text input. It relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @return The string representing the input text.
+ */
+ public static String showInput(int type, String title, String text) {
+ return showInput(WIDTH, type, title, text);
+ }
+
+ /**
+ * Shows a message with options presented as a dropdown list of elements.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param elements An array of objects representing the elements.
+ * @return The index of the selected element, starting from 1.
+ */
+ public static int showDropdown(int width, int type, String title,
+ String text, Object... elements) {
+
+ // show the dropdown list and get
+ // the selected object, if any
+ Object index = JOptionPane.showInputDialog(
+ null,
+ String.format(
+ "<html><body style=\"width:%dpx\">%s</body></html>",
+ normalizeMessageWidth(width),
+ text
+ ),
+ title,
+ normalizeIconType(type),
+ null,
+ elements,
+ elements[0]
+ );
+
+ // if it's not a null object, let's
+ // find the corresponding index
+ if (index != null) {
+
+ // iterate through the array of elements
+ for (int i = 0; i < elements.length; i++) {
+
+ // if the element is found, simply
+ // return the index plus 1, as zero
+ // corresponds to no selection at all
+ if (elements[i].equals(index)) {
+ return i + 1;
+ }
+
+ }
+ }
+
+ // nothing was selected,
+ // simply return zero
+ return 0;
+ }
+
+ /**
+ * Shows a message with options presented as a dropdown list of elements. It
+ * relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param elements An array of objects representing the elements.
+ * @return The index of the selected element, starting from 1.
+ */
+ public static int showDropdown(int type, String title,
+ String text, Object... elements) {
+ return showDropdown(WIDTH, type, title, text, elements);
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/Methods.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/Methods.java
new file mode 100644
index 00000000000..15c66049342
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/Methods.java
@@ -0,0 +1,1356 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.ConfigurationController;
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Command;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.Pair;
+import com.github.cereda.arara.model.Session;
+import com.github.cereda.arara.model.Trigger;
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Implements some auxiliary methods for runtime evaluation.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class Methods {
+
+ // the language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ // the session controller
+ private static final Session session = new Session();
+
+ /**
+ * Adds the rule methods to the provided map.
+ * @param map The map.
+ */
+ public static void addRuleMethods(Map<String, Object> map) {
+ addConditionalMethods(map);
+ try {
+ map.put("getOriginalFile", Methods.class.getMethod("getOriginalFile"));
+ map.put("getOriginalReference", Methods.class.getMethod("getOriginalReference"));
+ map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class));
+ map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class));
+ map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class, Object.class));
+ map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class, Object.class));
+ map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class, Object.class, Object.class));
+ map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class, Object.class, Object.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", String.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", String.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class, Object.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class, Object.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class, Object.class, Object.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class, Object.class, Object.class));
+ map.put("trimSpaces", Methods.class.getMethod("trimSpaces", String.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", boolean.class, Object.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", boolean.class, Object.class));
+ map.put("isTrue", Methods.class.getMethod("isTrue", boolean.class, Object.class, Object.class));
+ map.put("isFalse", Methods.class.getMethod("isFalse", boolean.class, Object.class, Object.class));
+ map.put("getBasename", Methods.class.getMethod("getBasename", File.class));
+ map.put("getBasename", Methods.class.getMethod("getBasename", String.class));
+ map.put("getFullBasename", Methods.class.getMethod("getFullBasename", File.class));
+ map.put("getFullBasename", Methods.class.getMethod("getFullBasename", String.class));
+ map.put("getFiletype", Methods.class.getMethod("getFiletype", File.class));
+ map.put("getFiletype", Methods.class.getMethod("getFiletype", String.class));
+ map.put("throwError", Methods.class.getMethod("throwError", String.class));
+ map.put("getSession", Methods.class.getMethod("getSession"));
+ map.put("isWindows", Methods.class.getMethod("isWindows"));
+ map.put("isLinux", Methods.class.getMethod("isLinux"));
+ map.put("isMac", Methods.class.getMethod("isMac"));
+ map.put("isUnix", Methods.class.getMethod("isUnix"));
+ map.put("isAIX", Methods.class.getMethod("isAIX"));
+ map.put("isIrix", Methods.class.getMethod("isIrix"));
+ map.put("isOS2", Methods.class.getMethod("isOS2"));
+ map.put("isSolaris", Methods.class.getMethod("isSolaris"));
+ map.put("isCygwin", Methods.class.getMethod("isCygwin"));
+ map.put("isWindows", Methods.class.getMethod("isWindows", Object.class, Object.class));
+ map.put("isLinux", Methods.class.getMethod("isLinux", Object.class, Object.class));
+ map.put("isMac", Methods.class.getMethod("isMac", Object.class, Object.class));
+ map.put("isUnix", Methods.class.getMethod("isUnix", Object.class, Object.class));
+ map.put("isAIX", Methods.class.getMethod("isAIX", Object.class, Object.class));
+ map.put("isIrix", Methods.class.getMethod("isIrix", Object.class, Object.class));
+ map.put("isOS2", Methods.class.getMethod("isOS2", Object.class, Object.class));
+ map.put("isSolaris", Methods.class.getMethod("isSolaris", Object.class, Object.class));
+ map.put("isCygwin", Methods.class.getMethod("isCygwin", Object.class, Object.class));
+ map.put("replicatePattern", Methods.class.getMethod("replicatePattern", String.class, List.class));
+ map.put("buildString", Methods.class.getMethod("buildString", Object[].class));
+ map.put("addQuotes", Methods.class.getMethod("addQuotes", Object.class));
+ map.put("getCommand", Methods.class.getMethod("getCommand", List.class));
+ map.put("getCommand", Methods.class.getMethod("getCommand", Object[].class));
+ map.put("getTrigger", Methods.class.getMethod("getTrigger", String.class));
+ map.put("getTrigger", Methods.class.getMethod("getTrigger", String.class, Object[].class));
+ map.put("checkClass", Methods.class.getMethod("checkClass", Class.class, Object.class));
+ map.put("isString", Methods.class.getMethod("isString", Object.class));
+ map.put("isList", Methods.class.getMethod("isList", Object.class));
+ map.put("isMap", Methods.class.getMethod("isMap", Object.class));
+ map.put("isBoolean", Methods.class.getMethod("isBoolean", Object.class));
+ map.put("isVerboseMode", Methods.class.getMethod("isVerboseMode"));
+ map.put("showMessage", Methods.class.getMethod("showMessage", int.class, String.class, String.class));
+ map.put("showMessage", Methods.class.getMethod("showMessage", int.class, int.class, String.class, String.class));
+ map.put("isOnPath", Methods.class.getMethod("isOnPath", String.class));
+ map.put("unsafelyExecuteSystemCommand", Methods.class.getMethod("unsafelyExecuteSystemCommand", Command.class));
+ map.put("mergeVelocityTemplate", Methods.class.getMethod("mergeVelocityTemplate", File.class, File.class, Map.class));
+ map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", String.class, List.class));
+ map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", String.class, Object[].class));
+ map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", File.class, List.class));
+ map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", File.class, Object[].class));
+ map.put("listFilesByExtensions", Methods.class.getMethod("listFilesByExtensions", File.class, List.class, boolean.class));
+ map.put("listFilesByExtensions", Methods.class.getMethod("listFilesByExtensions", String.class, List.class, boolean.class));
+ map.put("listFilesByPatterns", Methods.class.getMethod("listFilesByPatterns", File.class, List.class, boolean.class));
+ map.put("listFilesByPatterns", Methods.class.getMethod("listFilesByPatterns", String.class, List.class, boolean.class));
+ map.put("writeToFile", Methods.class.getMethod("writeToFile", File.class, String.class, boolean.class));
+ map.put("writeToFile", Methods.class.getMethod("writeToFile", File.class, List.class, boolean.class));
+ map.put("writeToFile", Methods.class.getMethod("writeToFile", String.class, String.class, boolean.class));
+ map.put("writeToFile", Methods.class.getMethod("writeToFile", String.class, List.class, boolean.class));
+ map.put("readFromFile", Methods.class.getMethod("readFromFile", File.class));
+ map.put("readFromFile", Methods.class.getMethod("readFromFile", String.class));
+ } catch (Exception exception) {
+ // quack, quack, quack
+ }
+ }
+
+ /**
+ * Adds conditional methods to the provided map.
+ * @param map The map.
+ */
+ public static void addConditionalMethods(Map<String, Object> map) {
+ try {
+ map.put("exists", Methods.class.getMethod("exists", String.class));
+ map.put("exists", Methods.class.getMethod("exists", File.class));
+ map.put("missing", Methods.class.getMethod("missing", String.class));
+ map.put("missing", Methods.class.getMethod("missing", File.class));
+ map.put("changed", Methods.class.getMethod("changed", String.class));
+ map.put("changed", Methods.class.getMethod("changed", File.class));
+ map.put("unchanged", Methods.class.getMethod("unchanged", String.class));
+ map.put("unchanged", Methods.class.getMethod("unchanged", File.class));
+ map.put("found", Methods.class.getMethod("found", String.class, String.class));
+ map.put("found", Methods.class.getMethod("found", File.class, String.class));
+ map.put("toFile", Methods.class.getMethod("toFile", String.class));
+ map.put("showDropdown", Methods.class.getMethod("showDropdown", int.class, String.class, String.class, Object[].class));
+ map.put("showDropdown", Methods.class.getMethod("showDropdown", int.class, int.class, String.class, String.class, Object[].class));
+ map.put("showInput", Methods.class.getMethod("showInput", int.class, String.class, String.class));
+ map.put("showInput", Methods.class.getMethod("showInput", int.class, int.class, String.class, String.class));
+ map.put("showOptions", Methods.class.getMethod("showOptions", int.class, String.class, String.class, Object[].class));
+ map.put("showOptions", Methods.class.getMethod("showOptions", int.class, int.class, String.class, String.class, Object[].class));
+ map.put("currentFile", Methods.class.getMethod("currentFile"));
+ map.put("loadClass", Methods.class.getMethod("loadClass", File.class, String.class));
+ map.put("loadClass", Methods.class.getMethod("loadClass", String.class, String.class));
+ map.put("loadObject", Methods.class.getMethod("loadObject", File.class, String.class));
+ map.put("loadObject", Methods.class.getMethod("loadObject", String.class, String.class));
+ } catch (Exception exception) {
+ // quack, quack, quack
+ }
+ }
+
+ /**
+ * Gets the original file.
+ * @return The original file.
+ */
+ public static String getOriginalFile() {
+ File file = (File) ConfigurationController.getInstance().get("execution.reference");
+ return file.getName();
+ }
+
+ /**
+ * Gets the original reference.
+ * @return The original reference.
+ */
+ public static File getOriginalReference() {
+ return (File) ConfigurationController.getInstance().get("execution.reference");
+ }
+
+ /**
+ * Checks if the string is empty.
+ * @param string The string.
+ * @return A boolean value.
+ */
+ public static boolean isEmpty(String string) {
+ return CommonUtils.checkEmptyString(string);
+ }
+
+ /**
+ * Checks if the string is not empty.
+ * @param string The string.
+ * @return A boolean value.
+ */
+ public static boolean isNotEmpty(String string) {
+ return !isEmpty(string);
+ }
+
+ /**
+ * Checks if the string is empty.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @return An object or empty string.
+ */
+ public static Object isEmpty(String string, Object yes) {
+ return isEmpty(string) ? yes : "";
+ }
+
+ /**
+ * Checks if the string is not empty.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @return An object or empty string.
+ */
+ public static Object isNotEmpty(String string, Object yes) {
+ return isNotEmpty(string) ? yes : "";
+ }
+
+ /**
+ * Checks if the string is empty.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ */
+ public static Object isEmpty(String string, Object yes, Object no) {
+ return isEmpty(string) ? yes : no;
+ }
+
+ /**
+ * Checks if the string is not empty.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ */
+ public static Object isNotEmpty(String string, Object yes, Object no) {
+ return isNotEmpty(string) ? yes : no;
+ }
+
+ /**
+ * Checks if the string holds a true value.
+ * @param string The string.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isTrue(String string) throws AraraException {
+ return isEmpty(string) ? false : CommonUtils.checkBoolean(string);
+ }
+
+ /**
+ * Checks if the string holds a false value.
+ * @param string The string.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isFalse(String string) throws AraraException {
+ return isEmpty(string) ? false : !CommonUtils.checkBoolean(string);
+ }
+
+ /**
+ * Checks if the string holds a true value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @return An object or an empty string.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isTrue(String string, Object yes)
+ throws AraraException {
+ return isTrue(string) ? yes : "";
+ }
+
+ /**
+ * Checks if the string holds a false value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @return An object or an empty string.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isFalse(String string, Object yes)
+ throws AraraException {
+ return (isFalse(string) ? yes : "");
+ }
+
+ /**
+ * Checks if the string holds a true value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isTrue(String string, Object yes, Object no)
+ throws AraraException {
+ return (isTrue(string) ? yes : no);
+ }
+
+ /**
+ * Checks if the string holds a false value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isFalse(String string, Object yes, Object no)
+ throws AraraException {
+ return (isFalse(string) ? yes : no);
+ }
+
+ /**
+ * Checks if the string holds a true value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @param fallback Object to return if string is empty.
+ * @return One of the three options.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isTrue(String string, Object yes, Object no,
+ Object fallback) throws AraraException {
+ return isEmpty(string) ? fallback : (isTrue(string) ? yes : no);
+ }
+
+ /**
+ * Checks if the string holds a false value.
+ * @param string The string.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @param fallback Object to return if string is empty.
+ * @return One of the three options.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isFalse(String string, Object yes, Object no,
+ Object fallback) throws AraraException {
+ return isEmpty(string) ? fallback : (isFalse(string) ? yes : no);
+ }
+
+ /**
+ * Trim spaces from the string.
+ * @param string The string.
+ * @return A trimmed string.
+ */
+ public static String trimSpaces(String string) {
+ return string.trim();
+ }
+
+ /**
+ * Checks if the expression resolves to true.
+ * @param value The expression.
+ * @param yes Object to return if true.
+ * @return An object or an empty string.
+ */
+ public static Object isTrue(boolean value, Object yes) {
+ return value ? yes : "";
+ }
+
+ /**
+ * Checks if the expression resolves to false.
+ * @param value The expression.
+ * @param yes Object to return if true.
+ * @return An object or an empty string.
+ */
+ public static Object isFalse(boolean value, Object yes) {
+ return !value ? yes : "";
+ }
+
+ /**
+ * Checks if the expression resolves to true.
+ * @param value The expression.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ */
+ public static Object isTrue(boolean value, Object yes, Object no) {
+ return value ? yes : no;
+ }
+
+ /**
+ * Checks if the expression resolves to false.
+ * @param value The expression.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ */
+ public static Object isFalse(boolean value, Object yes, Object no) {
+ return !value ? yes : no;
+ }
+
+ /**
+ * Gets the basename.
+ * @param file The file.
+ * @return The basename of the provided file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getBasename(File file) throws AraraException {
+ if (file.isFile()) {
+ return CommonUtils.getBasename(file);
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_BASENAME_NOT_A_FILE,
+ file.getName()
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Gets the basename.
+ * @param filename The string.
+ * @return The basename.
+ */
+ public static String getBasename(String filename) {
+ return CommonUtils.getBasename(filename);
+ }
+
+ /**
+ * Gets the file type.
+ * @param file The provided file.
+ * @return The file type.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getFiletype(File file) throws AraraException {
+ if (file.isFile()) {
+ return CommonUtils.getFiletype(file);
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_FILETYPE_NOT_A_FILE,
+ file.getName()
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Gets the file type.
+ * @param filename The provided string.
+ * @return The file type.
+ */
+ public static String getFiletype(String filename) {
+ return CommonUtils.getFiletype(filename);
+ }
+
+ /**
+ * Replicates the pattern to each element of a list.
+ * @param pattern The pattern.
+ * @param values The list.
+ * @return A list of strings containing the pattern applied to the list.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static List<Object> replicatePattern(String pattern,
+ List<Object> values) throws AraraException {
+ return CommonUtils.replicateList(pattern, values);
+ }
+
+ /**
+ * Throws an exception.
+ * @param text The text to be thrown as the exception message.
+ * @throws AraraException The exception to be thrown by this method.
+ */
+ public static void throwError(String text) throws AraraException {
+ throw new AraraException(text);
+ }
+
+ /**
+ * Gets the session.
+ * @return The session.
+ */
+ public static Session getSession() {
+ return session;
+ }
+
+ /**
+ * Checks if Windows is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isWindows() throws AraraException {
+ return CommonUtils.checkOS("windows");
+ }
+
+ /**
+ * Checks if we are inside a Cygwin environment.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isCygwin() throws AraraException {
+ return CommonUtils.checkOS("cygwin");
+ }
+
+ /**
+ * Checks if Linux is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isLinux() throws AraraException {
+ return CommonUtils.checkOS("linux");
+ }
+
+ /**
+ * Checks if Mac is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isMac() throws AraraException {
+ return CommonUtils.checkOS("mac");
+ }
+
+ /**
+ * Checks if Unix is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isUnix() throws AraraException {
+ return CommonUtils.checkOS("unix");
+ }
+
+ /**
+ * Checks if AIX is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isAIX() throws AraraException {
+ return CommonUtils.checkOS("aix");
+ }
+
+ /**
+ * Checks if Irix is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isIrix() throws AraraException {
+ return CommonUtils.checkOS("irix");
+ }
+
+ /**
+ * Checks if OS2 is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isOS2() throws AraraException {
+ return CommonUtils.checkOS("os2");
+ }
+
+ /**
+ * Checks if Solaris is the underlying operating system.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean isSolaris() throws AraraException {
+ return CommonUtils.checkOS("solaris");
+ }
+
+ /**
+ * Checks if Windows is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isWindows(Object yes, Object no)
+ throws AraraException {
+ return CommonUtils.checkOS("windows") ? yes : no;
+ }
+
+ /**
+ * Checks if we are inside a Cygwin environment.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isCygwin(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("cygwin") ? yes : no;
+ }
+
+ /**
+ * Checks if Linux is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isLinux(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("linux") ? yes : no;
+ }
+
+ /**
+ * Checks if Mac is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isMac(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("mac") ? yes : no;
+ }
+
+ /**
+ * Checks if Unix is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isUnix(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("unix") ? yes : no;
+ }
+
+ /**
+ * Checks if AIX is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isAIX(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("aix") ? yes : no;
+ }
+
+ /**
+ * Checks if Irix is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isIrix(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("irix") ? yes : no;
+ }
+
+ /**
+ * Checks if OS2 is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isOS2(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("os2") ? yes : no;
+ }
+
+ /**
+ * Checks if Solaris is the underlying operating system.
+ * @param yes Object to return if true.
+ * @param no Object to return if false.
+ * @return One of the two objects.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Object isSolaris(Object yes, Object no) throws AraraException {
+ return CommonUtils.checkOS("solaris") ? yes : no;
+ }
+
+ /**
+ * Checks if the file exists according to its extension.
+ * @param extension The extension.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean exists(String extension) throws AraraException {
+ return CommonUtils.exists(extension);
+ }
+
+ /**
+ * Checks if the file is missing according to its extension.
+ * @param extension The extension.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean missing(String extension) throws AraraException {
+ return !exists(extension);
+ }
+
+ /**
+ * Checks if the file has changed, according to its extension.
+ * @param extension The extension.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean changed(String extension) throws AraraException {
+ return CommonUtils.hasChanged(extension);
+ }
+
+ /**
+ * Checks if the file is unchanged according to its extension.
+ * @param extension The extension.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean unchanged(String extension) throws AraraException {
+ return !changed(extension);
+ }
+
+ /**
+ * Checks if the file exists.
+ * @param filename The file.
+ * @return A boolean value.
+ */
+ public static boolean exists(File filename) {
+ return CommonUtils.exists(filename);
+ }
+
+ /**
+ * Checks if the file is missing.
+ * @param filename The file.
+ * @return A boolean value.
+ */
+ public static boolean missing(File filename) {
+ return !exists(filename);
+ }
+
+ /**
+ * Checks if the file has changed.
+ * @param filename The file.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean changed(File filename) throws AraraException {
+ return CommonUtils.hasChanged(filename);
+ }
+
+ /**
+ * Checks if the file is unchanged.
+ * @param filename The file.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean unchanged(File filename) throws AraraException {
+ return !changed(filename);
+ }
+
+ /**
+ * Build a string based on an array of objects.
+ * @param objects Array of objects.
+ * @return A string built from the array.
+ */
+ public static String buildString(Object... objects) {
+ return CommonUtils.generateString(objects);
+ }
+
+ /**
+ * Encloses the provided object into double quotes.
+ * @param object The object.
+ * @return The object enclosed in double quotes.
+ */
+ public static String addQuotes(Object object) {
+ return CommonUtils.addQuotes(object);
+ }
+
+ /**
+ * Checks if the file contains the regex, based on its extension.
+ * @param extension The extension.
+ * @param regex The regex.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean found(String extension, String regex)
+ throws AraraException {
+ return CommonUtils.checkRegex(extension, regex);
+ }
+
+ /**
+ * Checks if the file contains the provided regex.
+ * @param file The file.
+ * @param regex The regex.
+ * @return A boolean value.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static boolean found(File file, String regex)
+ throws AraraException {
+ return CommonUtils.checkRegex(file, regex);
+ }
+
+ /**
+ * Gets the command based on a list of strings.
+ * @param elements The list of strings.
+ * @return A command.
+ */
+ public static Command getCommand(List<String> elements) {
+ return new Command(elements);
+ }
+
+ /**
+ * Gets the command based on an array of objects.
+ * @param elements Array of objects.
+ * @return A command.
+ */
+ public static Command getCommand(Object... elements) {
+ return new Command(elements);
+ }
+
+ /**
+ * Gets the command based on an array of objects and with the provided
+ * working directory as string.
+ * @param path String path representing the working directory.
+ * @param elements Array of elements.
+ * @return A command.
+ */
+ public static Command getCommandWithWorkingDirectory(String path,
+ Object... elements) {
+ Command command = new Command(elements);
+ command.setWorkingDirectory(new File(path));
+ return command;
+ }
+
+ /**
+ * Gets the command based on an array of objects and with the provided
+ * working directory as file.
+ * @param file File representing the working directory.
+ * @param elements Array of elements.
+ * @return A command.
+ */
+ public static Command getCommandWithWorkingDirectory(File file,
+ Object... elements) {
+ Command command = new Command(elements);
+ command.setWorkingDirectory(file);
+ return command;
+ }
+
+ /**
+ * Gets the command based on a list of strings and with the provided
+ * working directory as string.
+ * @param path String path representing the working directory.
+ * @param elements List of strings.
+ * @return A command.
+ */
+ public static Command getCommandWithWorkingDirectory(String path,
+ List<String> elements) {
+ Command command = new Command(elements);
+ command.setWorkingDirectory(new File(path));
+ return command;
+ }
+
+ /**
+ * Gets the command based on a list of strings and with the provided
+ * working directory as file.
+ * @param file File representing the working directory.
+ * @param elements List of strings.
+ * @return A command.
+ */
+ public static Command getCommandWithWorkingDirectory(File file,
+ List<String> elements) {
+ Command command = new Command(elements);
+ command.setWorkingDirectory(file);
+ return command;
+ }
+
+ /**
+ * Gets the trigger.
+ * @param action The action name.
+ * @return The trigger.
+ */
+ public static Trigger getTrigger(String action) {
+ return new Trigger(action, null);
+ }
+
+ /**
+ * Gets the trigger.
+ * @param action The action name.
+ * @param parameters The trigger parameters.
+ * @return A trigger.
+ */
+ public static Trigger getTrigger(String action, Object... parameters) {
+ return new Trigger(action, Arrays.asList(parameters));
+ }
+
+ /**
+ * Checks if the object is an intance of the provided class.
+ * @param clazz The class.
+ * @param object The object.
+ * @return A boolean value.
+ */
+ public static boolean checkClass(Class clazz, Object object) {
+ return CommonUtils.checkClass(clazz, object);
+ }
+
+ /**
+ * Checks if the object is a string.
+ * @param object The object.
+ * @return A boolean value.
+ */
+ public static boolean isString(Object object) {
+ return checkClass(String.class, object);
+ }
+
+ /**
+ * Checks if the object is a list.
+ * @param object The object.
+ * @return A boolean value.
+ */
+ public static boolean isList(Object object) {
+ return checkClass(List.class, object);
+ }
+
+ /**
+ * Checks if the object is a map.
+ * @param object The object.
+ * @return A boolean value.
+ */
+ public static boolean isMap(Object object) {
+ return checkClass(Map.class, object);
+ }
+
+ /**
+ * Checks if the object is a boolean.
+ * @param object The object.
+ * @return A boolean value.
+ */
+ public static boolean isBoolean(Object object) {
+ return checkClass(Boolean.class, object);
+ }
+
+ /**
+ * Checks if the execution is in verbose mode.
+ * @return A boolean value indicating if the execution is in verbose mode.
+ */
+ public static boolean isVerboseMode() {
+ return (Boolean) ConfigurationController.
+ getInstance().get("execution.verbose");
+ }
+
+ /**
+ * Returns a file object based on the provided name.
+ * @param name The file name.
+ * @return A file object.
+ */
+ public static File toFile(String name) {
+ return new File(name);
+ }
+
+ /**
+ * Shows the message.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ */
+ public static void showMessage(int width, int type,
+ String title, String text) {
+ MessageUtils.showMessage(width, type, title, text);
+ }
+
+ /**
+ * Shows the message. It relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ */
+ public static void showMessage(int type, String title, String text) {
+ MessageUtils.showMessage(type, title, text);
+ }
+
+ /**
+ * Shows a message with options presented as an array of buttons.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param buttons An array of objects to be presented as buttons.
+ * @return The index of the selected button, starting from 1.
+ */
+ public static int showOptions(int width, int type, String title,
+ String text, Object... buttons) {
+ return MessageUtils.showOptions(width, type, title, text, buttons);
+ }
+
+ /**
+ * Shows a message with options presented as an array of buttons. It relies
+ * on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param buttons An array of objects to be presented as buttons.
+ * @return The index of the selected button, starting from 1.
+ */
+ public static int showOptions(int type, String title,
+ String text, Object... buttons) {
+ return MessageUtils.showOptions(type, title, text, buttons);
+ }
+
+ /**
+ * Shows a message with a text input.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @return The string representing the input text.
+ */
+ public static String showInput(int width, int type,
+ String title, String text) {
+ return MessageUtils.showInput(width, type, title, text);
+ }
+
+ /**
+ * Shows a message with a text input. It relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @return The string representing the input text.
+ */
+ public static String showInput(int type, String title, String text) {
+ return MessageUtils.showInput(type, title, text);
+ }
+
+ /**
+ * Shows a message with options presented as a dropdown list of elements.
+ * @param width Integer value, in pixels.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param elements An array of objects representing the elements.
+ * @return The index of the selected element, starting from 1.
+ */
+ public static int showDropdown(int width, int type, String title,
+ String text, Object... elements) {
+ return MessageUtils.showDropdown(width, type, title, text, elements);
+ }
+
+ /**
+ * Shows a message with options presented as a dropdown list of elements. It
+ * relies on the default width.
+ * @param type Type of message.
+ * @param title Title of the message.
+ * @param text Text of the message.
+ * @param elements An array of objects representing the elements.
+ * @return The index of the selected element, starting from 1.
+ */
+ public static int showDropdown(int type, String title,
+ String text, Object... elements) {
+ return MessageUtils.showDropdown(type, title, text, elements);
+ }
+
+ /**
+ * Checks if the provided command name is reachable from the system path.
+ * @param command A string representing the command.
+ * @return A logic value.
+ */
+ public static boolean isOnPath(String command) {
+ return CommonUtils.isOnPath(command);
+ }
+
+ /**
+ * Gets the full basename.
+ * @param file The file.
+ * @return The full basename of the provided file.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getFullBasename(File file) throws AraraException {
+ if (file.isFile()) {
+ return CommonUtils.getFullBasename(file);
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_BASENAME_NOT_A_FILE,
+ file.getName()
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Gets the full basename.
+ * @param name The string.
+ * @return The full basename.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static String getFullBasename(String name) throws AraraException {
+ return getFullBasename(new File(name));
+ }
+
+ /**
+ * Unsafely executes a system command from the underlying operating system
+ * and returns a pair containing the exit status and the command output as a
+ * string.
+ * @param command The system command to be executed.
+ * @return A pair containing the exit status and the system command output
+ * as a string.
+ */
+ public static Pair<Integer, String>
+ unsafelyExecuteSystemCommand(Command command) {
+ return UnsafeUtils.executeSystemCommand(command);
+ }
+
+ /**
+ * Merges the provided template with a context map and writes the result in
+ * an output file. This method relies on Apache Velocity.
+ * @param input The input file.
+ * @param output The output file.
+ * @param map The context map.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static void mergeVelocityTemplate(File input, File output,
+ Map<String, Object> map) throws AraraException {
+ VelocityUtils.mergeVelocityTemplate(input, output, map);
+ }
+
+ /**
+ * Gets the file reference for the current directive. It is important to
+ * observe that version 4.0 of arara replicates the directive when 'files'
+ * is detected amongst the parameters, so each instance will have a
+ * different reference.
+ * @return A file reference for the current directive.
+ */
+ public static File currentFile() {
+ return (File) ConfigurationController.getInstance().
+ get("execution.directive.reference");
+ }
+
+ /**
+ * Loads a class from the provided file, potentially a Java archive.
+ * @param file File containing the Java bytecode (namely, a JAR).
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class.
+ */
+ public static Pair<Integer, Class> loadClass(File file, String name) {
+ return ClassLoadingUtils.loadClass(file, name);
+ }
+
+ /**
+ * Loads a class from the provided string reference, representing a file.
+ * @param ref String reference representing a file.
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class.
+ */
+ public static Pair<Integer, Class> loadClass(String ref, String name) {
+ return ClassLoadingUtils.loadClass(new File(ref), name);
+ }
+
+ /**
+ * Loads a class from the provided file, instantiating it.
+ * @param file File containing the Java bytecode (namely, a JAR).
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class object.
+ */
+ public static Pair<Integer, Object> loadObject(File file, String name) {
+ return ClassLoadingUtils.loadObject(file, name);
+ }
+
+ /**
+ * Loads a class from the provided string reference, instantiating it.
+ * @param ref String reference representing a file.
+ * @param name The canonical name of the class.
+ * @return A pair representing the status and the class object.
+ */
+ public static Pair<Integer, Object> loadObject(String ref, String name) {
+ return ClassLoadingUtils.loadObject(new File(ref), name);
+ }
+
+ /**
+ * List all files from the provided directory according to the list of
+ * extensions. The leading dot must be omitted, unless it is part of the
+ * extension.
+ * @param directory The provided directory.
+ * @param extensions The list of extensions.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByExtensions(File directory,
+ List<String> extensions, boolean recursive) {
+ return FileSearchingUtils.listFilesByExtensions(
+ directory,
+ extensions,
+ recursive
+ );
+ }
+
+ /**
+ * List all files from the provided string path according to the list of
+ * extensions. The leading dot must be omitted, unless it is part of the
+ * extension.
+ * @param path The provided path as plain string.
+ * @param extensions The list of extensions.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByExtensions(String path,
+ List<String> extensions, boolean recursive) {
+ return FileSearchingUtils.listFilesByExtensions(
+ new File(path),
+ extensions,
+ recursive
+ );
+ }
+
+ /**
+ * List all files from the provided directory matching the list of file
+ * name patterns. Such list can contain wildcards.
+ * @param directory The provided directory.
+ * @param patterns The list of file name patterns.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByPatterns(File directory,
+ List<String> patterns, boolean recursive) {
+ return FileSearchingUtils.listFilesByPatterns(
+ directory,
+ patterns,
+ recursive
+ );
+ }
+
+ /**
+ * List all files from the provided path matching the list of file
+ * name patterns. Such list can contain wildcards.
+ * @param path The provided path as plain string.
+ * @param patterns The list of file name patterns.
+ * @param recursive A flag indicating whether the search is recursive.
+ * @return A list of files.
+ */
+ public static List<File> listFilesByPatterns(String path,
+ List<String> patterns, boolean recursive) {
+ return FileSearchingUtils.listFilesByPatterns(
+ new File(path),
+ patterns,
+ recursive
+ );
+ }
+
+ /**
+ * Writes the string to a file, using UTF-8 as default encoding.
+ * @param file The file.
+ * @param text The string to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(File file, String text, boolean append) {
+ return FileHandlingUtils.writeToFile(file, text, append);
+ }
+
+ /**
+ * Writes the string to a file, using UTF-8 as default encoding.
+ * @param path The path.
+ * @param text The string to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(String path, String text,
+ boolean append) {
+ return FileHandlingUtils.writeToFile(new File(path), text, append);
+ }
+
+ /**
+ * Writes the string list to a file, using UTF-8 as default encoding.
+ * @param file The file.
+ * @param lines The string list to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(File file, List<String> lines,
+ boolean append) {
+ return FileHandlingUtils.writeToFile(file, lines, append);
+ }
+
+ /**
+ * Writes the string list to a file, using UTF-8 as default encoding.
+ * @param path The path.
+ * @param lines The string list to be written.
+ * @param append A flag whether to append the content.
+ * @return A logical value indicating whether it was successful.
+ */
+ public static boolean writeToFile(String path, List<String> lines,
+ boolean append) {
+ return FileHandlingUtils.writeToFile(new File(path), lines, append);
+ }
+
+ /**
+ * Reads the provided file into a list of strings.
+ * @param file The file.
+ * @return A list of strings.
+ */
+ public static List<String> readFromFile(File file) {
+ return FileHandlingUtils.readFromFile(file);
+ }
+
+ /**
+ * Reads the provided file into a list of strings.
+ * @param path The path.
+ * @return A list of strings.
+ */
+ public static List<String> readFromFile(String path) {
+ return FileHandlingUtils.readFromFile(new File(path));
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/RuleUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/RuleUtils.java
new file mode 100644
index 00000000000..d855344762d
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/RuleUtils.java
@@ -0,0 +1,244 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Argument;
+import com.github.cereda.arara.model.Messages;
+import com.github.cereda.arara.model.RuleCommand;
+import com.github.cereda.arara.model.Rule;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.MarkedYAMLException;
+import org.yaml.snakeyaml.nodes.Tag;
+import org.yaml.snakeyaml.representer.Representer;
+
+/**
+ * Implements rule utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class RuleUtils {
+
+ // the application messages obtained from the
+ // language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Parses the provided file, checks the identifier and returns a rule
+ * representation.
+ * @param file The rule file.
+ * @param identifier The directive identifier.
+ * @return The rule object.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ public static Rule parseRule(File file, String identifier)
+ throws AraraException {
+ Representer representer = new Representer();
+ representer.addClassTag(Rule.class, new Tag("!config"));
+ Yaml yaml = new Yaml(new Constructor(Rule.class), representer);
+ Rule rule = null;
+ try {
+ rule = yaml.loadAs(new FileReader(file), Rule.class);
+ } catch (MarkedYAMLException yamlException) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_PARSERULE_INVALID_YAML
+ )
+ ),
+ yamlException
+ );
+ } catch (Exception exception) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_PARSERULE_GENERIC_ERROR
+ )
+ )
+ );
+ }
+ validateHeader(rule, identifier);
+ validateBody(rule);
+ return rule;
+ }
+
+ /**
+ * Validates the rule header according to the directive identifier.
+ * @param rule The rule object.
+ * @param identifier The directive identifier.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static void validateHeader(Rule rule, String identifier)
+ throws AraraException {
+ if (rule.getIdentifier() != null) {
+ if (!rule.getIdentifier().equals(identifier)) {
+ throw new AraraException(CommonUtils.getRuleErrorHeader().
+ concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEHEADER_WRONG_IDENTIFIER,
+ rule.getIdentifier(),
+ identifier
+ )
+ )
+ );
+ }
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEHEADER_NULL_ID
+ )
+ )
+ );
+ }
+ if (rule.getName() == null) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEHEADER_NULL_NAME
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Validates the rule body.
+ * @param rule The rule object.
+ * @throws AraraException Something wrong happened, to be caught in the
+ * higher levels.
+ */
+ private static void validateBody(Rule rule) throws AraraException {
+ if (rule.getCommands() == null) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_NULL_COMMANDS_LIST
+ )
+ )
+ );
+ } else {
+ if (CollectionUtils.exists(rule.getCommands(),
+ new Predicate<RuleCommand>() {
+ public boolean evaluate(RuleCommand command) {
+ return (command.getCommand() == null);
+ }
+ })) {
+ throw new AraraException(CommonUtils.getRuleErrorHeader().
+ concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_NULL_COMMAND
+ )
+ )
+ );
+ }
+ }
+ if (rule.getArguments() == null) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_ARGUMENTS_LIST
+ )
+ )
+ );
+ } else {
+ String[] keywords = new String[]{"file", "files", "reference"};
+
+ List<String> arguments = new ArrayList<String>();
+ for (Argument argument : rule.getArguments()) {
+ if (argument.getIdentifier() != null) {
+ if ((argument.getFlag() != null) ||
+ (argument.getDefault() != null)) {
+ arguments.add(argument.getIdentifier());
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_MISSING_KEYS
+ )
+ )
+ );
+ }
+ } else {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_NULL_ARGUMENT_ID
+ )
+ )
+ );
+ }
+ }
+
+ for (String keyword : keywords) {
+ if (arguments.contains(keyword)) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED,
+ keyword
+ )
+ )
+ );
+ }
+ }
+
+ int expected = arguments.size();
+ int found = (new HashSet<String>(arguments)).size();
+ if (expected != found) {
+ throw new AraraException(
+ CommonUtils.getRuleErrorHeader().concat(
+ messages.getMessage(
+ Messages.ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS
+ )
+ )
+ );
+ }
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java
index 36b5df82f59..65d3d58ffba 100644
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java
@@ -1,7 +1,6 @@
/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,125 +30,80 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * TeeOutputStream: This class implements an output stream that handles other
- * streams, so the flow is propagated to all of them in an easy way.
*/
-// package definition
-package com.github.arara.utils;
+package com.github.cereda.arara.utils;
-// needed importa
import java.io.IOException;
import java.io.OutputStream;
+import org.apache.commons.io.IOUtils;
/**
- * Implements an output stream that handles other streams, so the flow is
- * propagated to all of them in an easy way.
- *
+ * Implements a stream splitter.
* @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 2.0
+ * @version 4.0
+ * @since 4.0
*/
public class TeeOutputStream extends OutputStream {
- // the list of the output streams
+ // an array of streams in which
+ // an object of this class will
+ // split data
private final OutputStream[] streams;
/**
* Constructor.
- *
- * @param outputStreams An array containing the output streams.
+ * @param outputStreams An array of output streams.
*/
public TeeOutputStream(OutputStream... outputStreams) {
-
- // set the array
streams = outputStreams;
}
/**
- * Writes the byte to all the output streams.
- *
- * @param b The byte to write.
- * @throws IOException Exception if an error ocurred.
+ * Writes the provided integer to each stream.
+ * @param b The provided integer
+ * @throws IOException An IO exception.
*/
@Override
public void write(int b) throws IOException {
-
- // for every stream
for (OutputStream ostream : streams) {
-
- // write the byte
ostream.write(b);
}
}
/**
- * Writes an array of bytes to all the output streams.
- *
- * @param b The bytes to write.
+ * Writes the provided byte array to each stream, with the provided offset
+ * and length.
+ * @param b The byte array.
* @param offset The offset.
- * @param length Number of bytes.
- * @throws IOException Exception if an error ocurred.
+ * @param length The length.
+ * @throws IOException An IO exception.
*/
@Override
public void write(byte[] b, int offset, int length) throws IOException {
-
- // for every stream
for (OutputStream ostream : streams) {
-
- // write the array
ostream.write(b, offset, length);
}
}
/**
- * Flushes the stream.
- *
- * @throws IOException Exception if an error ocurred.
+ * Flushes every stream.
+ * @throws IOException An IO exception.
*/
@Override
public void flush() throws IOException {
-
- // for every stream
for (OutputStream ostream : streams) {
-
- // flush the stream
ostream.flush();
}
}
/**
- * Closes the stream.
- *
- * @throws IOException Exception if an error ocurred.
+ * Closes every stream silently.
*/
@Override
- public void close() throws IOException {
-
- // for every stream
+ public void close() {
for (OutputStream ostream : streams) {
-
- // try to close the stream
- forceClose(ostream);
- }
- }
-
- /**
- * Forces the stream to close without raising exceptions.
- *
- * @param ostream The stream.
- */
- private void forceClose(OutputStream ostream) {
-
- // try to close
- try {
-
- // close it
- ostream.close();
-
- } catch (IOException exception) {
- // do nothing
+ IOUtils.closeQuietly(ostream);
}
}
+
}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java
new file mode 100644
index 00000000000..b989e074c8f
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java
@@ -0,0 +1,87 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.model.Command;
+import com.github.cereda.arara.model.Pair;
+import org.zeroturnaround.exec.ProcessExecutor;
+import org.zeroturnaround.exec.ProcessResult;
+
+/**
+ * Implements unsafe utilitary methods.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class UnsafeUtils {
+
+ /**
+ * Executes a system command from the underlying operating system and
+ * returns a pair containing the exit status and the command output as a
+ * string.
+ * @param command The system command to be executed.
+ * @return A pair containing the exit status and the system command output
+ * as a string.
+ */
+ public static Pair<Integer, String> executeSystemCommand(Command command) {
+
+ try {
+
+ // create a process result with the provided
+ // command, capturing the output
+ ProcessResult result = new ProcessExecutor(
+ command.getElements()
+ ).readOutput(true).execute();
+
+ // return the pair containing the exit status
+ // and the output string as UTF-8
+ return new Pair<Integer, String>(
+ result.getExitValue(),
+ result.outputUTF8()
+ );
+
+ } catch (Exception exception) {
+
+ // quack, quack, do nothing, just
+ // return a default error code
+
+ // if something goes wrong, the default
+ // error branch returns an exit status of
+ // -99 and an empty string
+ return new Pair<Integer, String>(-99, "");
+
+ }
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java
new file mode 100644
index 00000000000..2040b671b70
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java
@@ -0,0 +1,157 @@
+/**
+ * Arara, the cool TeX automation tool
+ * Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the project's author nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.github.cereda.arara.utils;
+
+import com.github.cereda.arara.controller.LanguageController;
+import com.github.cereda.arara.model.AraraException;
+import com.github.cereda.arara.model.Messages;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.Map;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.exception.MethodInvocationException;
+import org.apache.velocity.exception.ParseErrorException;
+import org.apache.velocity.exception.ResourceNotFoundException;
+import org.apache.velocity.runtime.RuntimeConstants;
+
+/**
+ * Implements the template merging from Apache Velocity.
+ * @author Paulo Roberto Massa Cereda
+ * @version 4.0
+ * @since 4.0
+ */
+public class VelocityUtils {
+
+ // the language controller
+ private static final LanguageController messages =
+ LanguageController.getInstance();
+
+ /**
+ * Merges the provided template with the context map and writes the result
+ * in an output file. The operation relies on the Apache Velocity project.
+ * @param input The input file.
+ * @param output The output file.
+ * @param map The context map.
+ * @throws AraraException Something terribly wrong happened, to be caught
+ * in the higher levels.
+ */
+ public static void mergeVelocityTemplate(File input, File output,
+ Map<String, Object> map) throws AraraException {
+
+ // let us try
+ try {
+
+ // create the template engine instance
+ VelocityEngine engine = new VelocityEngine();
+
+ // use the resource path trick: set the default
+ // location to the input file's parent directory,
+ // so our file is easily located
+ engine.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,
+ input.getCanonicalFile().getParent());
+
+ // set the logging feature of Apache Velocity to
+ // register the occurrences in a null provider
+ // (we do not want unnecessary verbose output)
+ engine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
+ "org.apache.velocity.runtime.log.NullLogSystem");
+
+ // init the engine with the
+ // provided settings
+ engine.init();
+
+ // create a context for Apache Velocity,
+ // based on the provided map
+ VelocityContext context = new VelocityContext(map);
+
+ // get the template from the engine and
+ // read it as an UTF-8 file
+ Template template = engine.getTemplate(input.getName(), "UTF-8");
+
+ // create an output stream from
+ // the file output reference
+ FileOutputStream stream = new FileOutputStream(output);
+
+ // create a writer based on the
+ // previously created stream
+ Writer writer = new OutputStreamWriter(stream, "UTF-8");
+
+ // merge the context map with the
+ // template file and write the result
+ // to the output stream writer
+ template.merge(context, writer);
+
+ // close both writer
+ // and output stream
+ writer.close();
+ stream.close();
+
+ } catch(ResourceNotFoundException rnfexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VELOCITY_FILE_NOT_FOUND
+ ),
+ rnfexception
+ );
+ } catch(ParseErrorException peexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VELOCITY_PARSE_EXCEPTION
+ ),
+ peexception
+ );
+ } catch(MethodInvocationException miexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION
+ ),
+ miexception
+ );
+ } catch (IOException ioexception) {
+ throw new AraraException(
+ messages.getMessage(
+ Messages.ERROR_VELOCITY_FILE_NOT_FOUND
+ ),
+ ioexception
+ );
+ }
+
+ }
+
+}
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml
deleted file mode 100644
index 22f73680d00..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<configuration>
- <appender name="FILE" class="ch.qos.logback.core.FileAppender">
- <file>${araraLogName}.log</file>
- <append>false</append>
- <encoder>
- <charset>UTF-8</charset>
- <pattern>%date{dd MMM yyyy HH:mm:ss.SSS} %-5level %logger{0} - %msg%n</pattern>
- </encoder>
- </appender>
- <root level="ALL">
- <appender-ref ref="FILE" />
- </root>
-</configuration> \ No newline at end of file
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties
deleted file mode 100644
index dbcde45e7f8..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties
+++ /dev/null
@@ -1,163 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages: This file holds the default messages for arara.
-#
-# author: Paulo Roberto Massa Cereda
-# e-mail: cereda@users.sf.net
-
-Log_WelcomeMessage = Welcome to arara!
-
-Log_ProcessingFile = Processing file ''{0}'', please wait.
-
-Log_Done = Done.
-
-Log_ExceptionRaised = Arara raised an exception with the following message:
-
-Log_ReadyToRunCommands = Ready to run commands.
-
-Log_CommandName = Running ''{0}''.
-
-Log_Command = Command: {0}
-
-Log_CommandSuccess = ''{0}'' was successfully executed.
-
-Log_CommandFailure = ''{0}'' returned an error status.
-
-Log_AllCommandsSuccess = All commands were successfully executed.
-
-Log_OutputLogging = Output logging:
-
-Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-
-Log_DirectiveFound = Directive found in line {0} with {1}.
-
-Log_RuleFound = Task ''{0}'' found in ''{1}''.
-
-Log_NoDirectivesFound = No directives found in ''{0}''.
-
-Help_Version = print the application version
-
-Help_Help = print the help message
-
-Help_Log = generate a log output
-
-Help_Verbose = print the command output
-
-Help_Timeout = set the execution timeout (in milliseconds)
-
-Help_Language = set the application language
-
-Header_Slogan = The cool TeX automation tool
-
-Header_AllRightsReserved = All rights reserved.
-
-Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-
-Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-
-Msg_RunningCommand = Running {0}...
-
-Msg_Success = SUCCESS
-
-Msg_Failure = FAILURE
-
-Msg_Status = Status:
-
-YamlError_Context = Context: {0}
-
-YamlError_Problem = Problem: {0}
-
-YamlError_ErrorLocation = Error found in line {0}, column {1}.
-
-Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-
-Error_FileDoesNotExist = File ''{0}'' does not exist.
-
-Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-
-Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-
-Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-
-Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-
-Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-
-Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-
-Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-
-Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-
-Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-
-Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-
-Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-
-Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-
-Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-
-Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-
-Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-
-Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-
-Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-
-Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-
-Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-
-Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-
-Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-
-Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-
-Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-
-Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-
-Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-
-Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-
-Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-
-Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-
-Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties
deleted file mode 100644
index e0183983cf8..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages_de: Diese Datei beinhalted alle Meldungen f\u00fcr arara in Deutsch.
-#
-# translator: Marco Daniel
-# e-mail: marco.daniel@mada-nada.de
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = Willkommen zu arara!
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Bearbeitung der Datei ''{0}'', bitte warten.
-
-# Log_Done = Done.
-Log_Done = Fertig.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Eine Ausnahme mit folgender Nachricht ist durch arara ausgel\u00f6st worden:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Bereit zum Start der Anweisungen.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = Verarbeitung von: ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = Anweisung: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' wurde erfolgreich ausgef\u00fchrt.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' gibt einen Fehlerwert zur\u00fcck.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = Alle Anweisungen wurden erfolgreich ausgef\u00fchrt.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Ausgabe des Protokolls:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' wurde nicht im Suchpfad gefunden. Ausf\u00fchrungsversuch: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Anweisung in Zeile {0} mit {1} gefunden.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = Aufgabe ''{0}'' gefunden in ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = Keine Anweisungen in ''{0}'' gefunden.
-
-# Help_Version = print the application version
-Help_Version = Ausgabe der Version.
-
-# Help_Help = print the help message
-Help_Help = Ausgabe der Hilfe.
-
-# Help_Log = generate a log output
-Help_Log = Erstelle eine Protokolldatei (.log-Datei).
-
-# Help_Verbose = print the command output
-Help_Verbose = Zeige das Protokoll der Anweisungen im Terminal an.
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = Deklariere die Zeitbeschr\u00e4nkung je Anweisung (in Millisekunden).
-
-# Help_Language = set the application language
-Help_Language = Lege die Sprache der Anwendung fest.
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = Das coole TeX Automatisierungstool
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = Alle Rechte vorbehalten!
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = Ich habe keine Anweisungen in ''{0}'' gefunden und daher nichts getan. Ist es das, was du wirklich wolltest.
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Ein besonderes Danke geht an Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz und viele andere, die dieses bescheidene Tool erm\u00f6glichten.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = Verarbeite {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = ERFOLGREICH
-
-# Msg_Failure = FAILURE
-Msg_Failure = FEHLERHAFT
-
-# Msg_Status = Status:
-Msg_Status = Status:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Kontext: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Problem: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = Fehler in Zeile {0}, Spalte {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = Es tut mir Leid, aber die Datei ''{0} {1}'' existiert nicht. Beachte bitte, dass wenn du nur den Dateinamen (ohne Endung) oder eine unbekannte Dateiendung angegeben hast, arara stets versucht nach unterst\u00fctzten Dateiendungen in der Reihenfolge {1} zu suchen. Du kannst die Reihenfolge bzw. das Suchmuster \u00e4ndern oder sogar neue Dateiendung hinzuf\u00fcgen. Bitte konsolidiere die Dokumentation, um mehr \u00fcber dieses und andere Features zu erfahren.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = Datei ''{0}'' existiert nicht.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = Es tut mir Leid, aber die Anweisung der Aufgabe ''{0}'' konnte nicht gefunden werden. Bist du dir sicher, dass die Anweisung ''{1}'' korrekt oder \u00fcber die Systempfade zug\u00e4nglich ist?
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = Es tut mir Leid, aber deine arara Konfigurationsdatei ist unzul\u00e4ssig. Dies kann aus einem unzul\u00e4ssigen oder fehlenden YAML Eintrag resultieren.
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = Uh-oh, die Konfigurationsdatei scheint unzul\u00e4ssig zu sein. Bist du dir sicher, dass es sich um eine korrekt erstellte YAML-Datei handelt? Leider kann arara nicht fortsetzen, bis eine passende Konfigurationsdatei bereitgestellt wird.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = Housten, wir haben ein Problem. Leider ist die in der Konfigurationsdatei spezifizierte Sprache nicht zul\u00e4ssig. Momentan kann arara die folgenden Sprachen unterst\u00fctzen: {0}. Stelle sicher, dass eine g\u00fcltige Sprache gew\u00e4hlt wird oder entferne den Eintrag aus deiner Konfigurationsdatei (der Sprachschl\u00fcssel ist optional), ansonsten kann arara nicht ausgef\u00fchrt werden.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = Es tut mir Leid, aber es scheint, dass du eine benutzerdefinierte Konfigurationsdatei nutzt, bei der weder die Dateiendung noch das Muster definiert wurde. Beides wird zum Fortfahren ben\u00f6tigt. Bitte behebe diesen Fehler in deiner Konfigurationsdatei und versuche es erneut.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = Es tut mir Leid, aber einer der Eintr\u00e4ge des Suchpfades in deiner Konfigurationsdatei hat eine nicht verf\u00fcgbare Variable im Zusammenhang mit dem Pfad: {0}
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = Es tut mir Leid, aber einer der Eintr\u00e4ge des Suchpfades in deiner Konfigurationsdatei hat eine ung\u00fcltige Verzeichnisstruktur. Kannst du einen Blick drauf werfen?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Es scheint, als g\u00e4be es eine deformierte Anweisung in der Zeile {0}. Die Anweisung kann einen Fehler in der YAML-Syntax aufweisen bzw. einen ung\u00fcltiger Eintrag haben.
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = Die Anweisung {0} in Zeile {1} hat ein leeres geschweiftes Klammerpaar. Beachte bitte, dass arara f\u00fcr eine klare Syntax optimiert ist, wenn kein Parameter \u00fcbergeben wird, sollte auch keine Klammer angegeben werden. Um den Fehler zu beseitigen, reicht es aus, die geschweiften Klammern zu entfernen oder ein Argument f\u00fcr die Anweisung zu \u00fcbergeben.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = Die Anweisung {0} in Zeile {1} hat einen unzul\u00e4ssigen Argumenttypen. Das Argument {2} ist ein reserviertes Schl\u00fcsselwort von arara und verlangt stets eine Liste.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = Die Anweisung {0} in Zeile {1} hat einen unzul\u00e4ssigen Argumentnamen. Der Name {2} ist ein reserviertes Schl\u00fcsselwort von arara und repr\u00e4sentiert jedes Element in der Liste {3}. Bitte w\u00e4hle einen anderen Namen als Argument.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = Die Anweisung ''{0}'' in Zeile ''{1}'' hat einen unzul\u00e4ssigen Argumenttypen. Nur die Argumente ''files'' und ''items'' k\u00f6nnen eine liste haben. Beides sind reservierte Schl\u00fcsselw\u00f6rter von arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = Anscheinend gibt es eine ung\u00fcltige Direktive in der Zeile {0}. Bitte pr\u00fcfe es.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = Die Anweisung ''{0}'' in Zeile ''{1}'' scheint deformiert zu sein. Es kann ein Fehler in der YAML-Syntax oder eine falsche Zuordnung sein.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = Es tut mir Leid, aber die gew\u00e4hlte Sprache ist nicht verf\u00fcgbar. Im Moment werden folgende Sprachen unterst\u00fctzt:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = Uh-oh, Ich konnte die Regel ''{0}'' im Suchpfad nicht finden. Kannst du bitte pr\u00fcfen, ob der Regelname korrekt ist und die Regel durch den Suchpfad gefunden wird.
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = Es scheint, dass die Aufgabe ''{0}'' einen Fehler in der YAML-Syntax hat oder einen ung\u00fcltiges Feld nutzt. Kannst du einen Blick auf die Datei ''{0}.yaml'' im Pfad ''{1}'' werfen. I versuchte mein Bestes, um die Fehlermeldung auszuwerfen, daher hier ist sie:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = Uh-oh, Die Aufgabe ''{0}'' scheint ung\u00fcltig zu sein. Bist du dir sicher, dass die Datei ''{0}.yaml'' im Pfad ''{1}'' eine g\u00fcltige YAML file ist?
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = Ein Problem in der Aufgabe ''{0}'' wurde festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt einen g\u00fcltigen Bezeichner (identifier). Siehst du den Fehler?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = Ein Problem in der Aufgabe ''{0}'' wurde festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt einen g\u00fcltigen Dateinamen. Kannst du es beheben?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat einen ung\u00fcltigen Argumenteinbezeichner. ''{2}'' ist ein reserviertes Schl\u00fcsselwort und kann daher nicht genutzt werden. Kannst du einen anderen nutzen?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = Ein Problem wurde in der Aufgabe ''{0}'' festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt eine validierte Liste an Argumenten. Kannst du es beheben? Beachte, dass die Liste der Argumente auch leer sein kann. Es ist aber unbedingt notwendig, dass das Argument explizit angeben wird: ''arguments: []''.
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat einen falschen ''identifier'' - es wurde ''{0}'' anstelle von ''{2}'' erwartet. Kannst du es beheben?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = Oh nein, es gibt Argumente in der Anweisung ''{0}'', welche nicht in der Regel ''{0}.yaml'' im Pfad ''{1}'' definiert wurden. Du kannst sie aus der Anweisung ''{0}'' entfernen oder als Liste von Argumenten in der Regel ''{0}.yaml'' erg\u00e4nzen. Hier sind sie: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = Es tut mir Leid, aber der Defaultwert f\u00fcr das Argument ''{0}'' der Aufgabe ''{1}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat eine ung\u00fcltige Variable/Methode im Regelkontext: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = Es tut mir Leid, aber der Flag f\u00fcr das Argument ''{0}'' der Aufgabe ''{1}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat eine ung\u00fcltige Variable/Methode im Regelkontext: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = Uh-oh, in der Aufgabe ''{0}'' werden beide Felder ''command'' und ''commands'' verwendet (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}''). Du kannst nur eine der Anweisungen ausw\u00e4hlen. Sollte deine Aufgabe von einem einzelnen Kommando abh\u00e4ngen, kannst du ''command'' optimieren. Sollte deine Regel mehrere Anweisungen ben\u00f6tigen, k\u00f6nnte das Feld ''commands'' geeignet sein.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat weder 'command'' noch 'commands'' Elemente. Du musst nur eine der Anweisungen ausw\u00e4hlen. Sollte deine Aufgabe von einem einzelnen Kommando abh\u00e4ngen, kannst du ''command'' optimieren. Sollte deine Regel mehrere Anweisungen ben\u00f6tigen, k\u00f6nnte das Feld ''commands'' geeignet sein.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = Es tut mir Leid, aber das Kommando, welches in der Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') genutzt wird, hat eine ung\u00fcltige Variable/Methode im Regelsinn: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties
deleted file mode 100644
index f48535fe9ce..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages: This file holds the default Spanish messages for arara.
-#
-# author: Gonzalo Medina
-# e-mail: gmedinaar@unal.edu.co
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = \u00a1Bienvenido a arara!
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Procesando el archivo ''{0}'', por favor espere.
-
-# Log_Done = Done.
-Log_Done = Listo.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Arara gener\u00f3 una excepci\u00f3n con el siguiente mensaje:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Listo para ejecutar comandos.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = Ejecutando ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = Comando: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' se ejecut\u00f3 de manera exitosa.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' emiti\u00f3 un estado de error.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = Todos los comandos han sido ejecutados de manera exitosa.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Recuento de la salida:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' no se encontr\u00f3 en la ruta. Tentativa de ejecuci\u00f3n: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Directiva encontrada en la l\u00ednea {0} con {1}.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = Tarea ''{0}'' encontrada en ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = No se encontraron directivas en ''{0}''.
-
-# Help_Version = print the application version
-Help_Version = imprime la versi\u00f3n de la aplicaci\u00f3n
-
-# Help_Help = print the help message
-Help_Help = imprime el mensaje de ayuda
-
-# Help_Log = generate a log output
-Help_Log = genera el registro de la salida
-
-# Help_Verbose = print the command output
-Help_Verbose = imprime la salida del comando
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = configura el 'timeout' de la ejecuci\u00f3n (en milisegundos)
-
-# Help_Language = set the application language
-Help_Language = configura el idioma de la aplicaci\u00f3n
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = The cool TeX automation tool
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = Todos los derechos reservados.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = No encontr\u00e9 directivas en ''{0}'', por lo que no ejecut\u00e9 ninguna acci\u00f3n. \u00bfEra esto lo que realmente deseaba?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Un agradecimiento especial a Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, y a muchos otros por hacer posible esta herramienta.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = Ejecutando {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = \u00c9XITO
-
-# Msg_Failure = FAILURE
-Msg_Failure = FALLO
-
-# Msg_Status = Status:
-Msg_Status = Estado:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Contexto: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Problema: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = Error encontrado en la l\u00ednea {0}, columna {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = Lo siento, pero el archivo ''{0} {1}'' no existe. Note que cuando \u00fanicamente se utiliza el nombre base (es decir, el nombre del archivo sin la extensi\u00f3n) o cuando se usa una extansi\u00f3n desconocida, arara intentar\u00e1 buscar los archivos terminados en las extensiones predefinidas {1} en ese orden. El orden y los patrones de b\u00fasqueda se pueden modificar, incluso se puede agregar soporte para nuevas extensiones, utilizando el archivo de configuraci\u00f3n. Por favor consulte el manual de arara para mayor informaci\u00f3n.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = El archivo ''{0}'' no existe.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = \nLo siento, pero el comando para la tarea ''{0}'' no se encontr\u00f3. Aseg\u00farese de que el comando ''{1}'' sea correcto y accesible desde la ruta (''path'') del sistema.
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = Lo siento, pero aparentemente su archivo de configuraci\u00f3n de arara no es v\u00e1lido; es decir, algunas entradas YAML hacen falta o son no v\u00e1lidas. Desafortunadamente, arara no puede seguir adelante hasta que se corrija el error. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente:
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = \u00a10h, oh! El archivo de configuraci\u00f3n parece no ser v\u00e1lido. Aseg\u00farese de que sea un archivo YAML correcto. Desafortunadamente, arara no puede continuar a menos que el archivo de configuraci\u00f3n sea correcto.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = !Houston, tenemos un problema! Lamentablemente, el idioma configurado en el archivo de configuraci\u00f3n no es v\u00e1lido. Actualemente arara soporta los siguientes idiomas: {0}. Aseg\u00farese de escoger un idioma v\u00e1lido o suprima la entrada del archivo de configuraci\u00f3n (el campo es opcional), de lo contrario, arara no podr\u00e1 continuar.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = Lo siento, pero parece que el archivo de configuraci\u00f3n contiene tipos de archivo para los cuales no se ha definido una extensi\u00f3n o un patr\u00f3n. Los dos son necesarios para continuar. Por favor, corrija este error en el archivo de configuraci\u00f3n e intente nuevamente.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = Lo siento, pero una de las entradas de la ruta de b\u00fasqueda en el archivo de configuraci\u00f3n contiene una variable no disponible en este contexto: ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = Lo siento, pero una de las entradas de la ruta de b\u00fasqueda en el archivo de configuraci\u00f3n tiene una estructura jer\u00e1rquica mal formada. \u00bfPodr\u00eda por favor revisar las entradas?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Parece que hay una directiva mal formada en la l\u00ednea {0}; es decir, una directiva con un error de sintaxis YAML o con un campo inv\u00e1lido. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente:
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = La directiva ''{0}'' en la l\u00ednea {1} no tiene contenido entre un par de llaves. Note que arara utiliza una sintaxis m\u00e1s simple cuando una directiva no tiene par\u00e1metros. Para corregir este error, es suficiente remover las llaves o insertar un argumento en la directiva.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = La directiva ''{0}'' en la l\u00ednea {1} tiene un tipo de argumento no v\u00e1lido. El argumento ''{2}'' es una palabra clave reservada de arara que siempre requiere de una lista.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = La directiva ''{0}'' en la l\u00ednea {1} tiene un nombre de argumento no v\u00e1lido. El nombre ''{2}'' es una palabra clave reservada de arara que representa todos los elementos de la lista ''{3}''. Por favor, escoja otro nombre para el argumento.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = La directiva ''{0}'' en la l\u00ednea {1} tiene un tipo de argumento no v\u00e1lido. \u00danicamente los argumentos ''files'' e ''items'' pueden contener una lista; los dos son palabras claves reservadas de arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = Aparentemente, hay una directiva no v\u00e1lida en la l\u00ednea {0}. Por favor rev\u00edsela y haga las correcciones necesarias.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = La directiva ''{0}'' en la l\u00ednea {1} est\u00e1 mal formada. Podr\u00eda tratarse de un error de sintaxis YAML o de una asignaci\u00f3n incorrecta.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = Lo siento, pero el c\u00f3digo de idioma escogido es inv\u00e1lido. Actualmente, arara soporta los siguientes idiomas:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = \u00a1Oh, oh! No se pudo hallar la regla ''{0}'' en la ruta de b\u00fasqueda. Revise que el nombre de la regla sea el corrceto y que la regla sea accesible usando la ruta de b\u00fasqueda.
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = Aparentemente la tarea ''{0}'' contiene un error de sintaxis YAML o un campo incorrecto. Por favor revise el archivo ''{0}.yaml'' localizado en ''{1}''. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = !Oh, oh! Parece que la tarea ''{0}'' es inv\u00e1lida. Aseg\u00farese de que el archivo ''{0}.yaml'' localizado en ''{1}'' sea un archivo YAML correcto.
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita un identificador v\u00e1lido. \u00bfPodr\u00eda, por favor, corregirlo?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita un nombre v\u00e1lido. \u00bfPodr\u00eda, por favor, corregirlo?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = !Oh, oh! La tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') contiene un identificador de argumentos inv\u00e1lido. ''{2}'' es una palabra reservada y no puede ser utilizada. Por favor, utilice otro nombre.
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita una lista valida de argumentos. Por favor, corr\u00edjala. Note que la lista de argumentos puede ser vac\u00eda, pero esto debe declararse expl\u00edcitamente (utilizando ''arguments: []'').
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = \u00a1Oh, oh! La tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') tiene un identificadoe err\u00f3neo - Se esperaba ''{0}'' y no ''{2}''. Por favor, corr\u00edjalo.
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = \u00a1Oh, no! En la directiva ''{0}'' se usan argumentos que no est\u00e1n definidos en la regla ''{0}.yaml'' localizada en ''{1}''. Puede o bien removerlos de la directiva ''{0}'' o bien agregarlos a la lista de argumentos en la regla ''{0}.yaml''. Estos son: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = Lo siento, pero el valor por defecto asignado al argumento ''{0}'' de la tarea ''{1}'' (que hace referencia al archivo ''{1}.yaml'' localizado en ''{2}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = Lo siento, pero la se\u00f1al (''flag'') asignada al argumento ''{0}'' de la tarea ''{1}'' (que hace referencia al archivo ''{1}.yaml'' localizado en ''{2}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = \u00a1Oh, oh! Los dos campos ''command'' y ''commands'' fueron simult\u00e1neamente asignados en la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}''). Es necesario escoger \u00fanicamente uno de los dos. Si la tarea tan solo requiere un \u00fanico comando, puede usar ''command''; si la regla requiere un conjunto de comandos, quiz\u00e1 sea preferible utilizar el campo ''commands''.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = \u00a1Oh, oh! En la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') hace falta o bien ''command'' o bien ''commands''. Es necesario utilizar uno de ellos. Si la tarea tan solo requiere un \u00fanico comando, puede usar ''command''; si la regla requiere de un conjunto de comandos, quiz\u00e1 sea preferible utilizar el campo ''commands''.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = Lo siento, pero el comando asignado a la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties
deleted file mode 100644
index 8796caa1817..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages_fr: This file holds the French language messages for arara.
-#
-# translator: Mika\u00ebl Maunier
-# e-mail: mmaunier2001@yahoo.fr
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = Arara vous souhaite la bienvenue !
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Traitement du fichier ''{0}'', veuillez patienter.
-
-# Log_Done = Done.
-Log_Done = Termin\u00e9.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Arara a g\u00e9n\u00e9r\u00e9 une erreur avec le message suivant :
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Pr\u00eat \u00e0 executer des commandes.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = Execution de ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = Commande : {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' ex\u00e9cut\u00e9 avec succ\u00e8s.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' a renvoy\u00e9 une erreur.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = Toutes les commandes ont \u00e9t\u00e9 correctement ex\u00e9cut\u00e9es.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Journal de sortie:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' non trouv\u00e9(e) dans le PATH. Tentative d''execution : {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Instruction trouv\u00e9e \u00e0 la ligne {0} avec {1}.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = T\u00e2che ''{0}'' trouv\u00e9e dans ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = Aucune instructions trouv\u00e9es dans ''{0}''.
-
-# Help_Version = print the application version
-Help_Version = affiche la version de l'application
-
-# Help_Help = print the help message
-Help_Help = affiche le message d'aide
-
-# Help_Log = generate a log output
-Help_Log = g\u00e9n\u00e8re un journal de sortie
-
-# Help_Verbose = print the command output
-Help_Verbose = affiche la sortie de la commande.
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = d\u00e9finit le temps d'execution (en millisecondes)
-
-# Help_Language = set the application language
-Help_Language = d\u00e9finit la langue de l'application
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = L'outil de traitement TeX vraiment cool
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = Tous droits r\u00e9serv\u00e9s.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = Je n''ai trouv\u00e9 aucunes instructions dans ''{0}'', aussi n''ai-je rien fait. Est-ce r\u00e9ellment ce que vous vouliez ?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Un remerciement sp\u00e9cial pour Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, et de nombreux autres qui ont rendu possible la cr\u00e9ation de cet humble outil.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = Execution de {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = SUCC\u00c8S
-
-# Msg_Failure = FAILURE
-Msg_Failure = \u00c9CHEC
-
-# Msg_Status = Status:
-Msg_Status = Status :
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Contexte : {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Probl\u00e8me: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = Erreur trouv\u00e9e \u00e0 la ligne {0}, colonne {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = Je suis d\u00e9sol\u00e9 mais le fichier ''{0} {1}'' n''existe pas. Notez qu''en ne fournissant que le nom de base (i.e, le nom sans l''extension) ou bien une extension inconnue, arara essaiera de chercher des fichiers se terminant par les extensions pr\u00e9d\u00e9finies {1} dans cet ordre. Vous pouvez modifier l''ordre, le motif pour la recherche ou m\u00eame ajouter de nouvelles extensions par le biais du fichier de configuration. Merci de vous r\u00e9f\u00e9rer au manuel d'arara pour en apprendre plus sur cette caract\u00e9ristique.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = Le fichier ''{0}'' n''existe pas.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = \nJe suis navr\u00e9, mais la commande en provenance de la t\u00e2che ''{0}'' n''a pas \u00e9t\u00e9 trouv\u00e9e. \u00cates-vous sur(e) que la commande ''{1}'' est correcte et accessible depuis le PATH ?
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = Je suis d\u00e9sol\u00e9, apparemment votre fichier de configuration d'arara est invalide ; il contient des entr\u00e9es YAML invalides ou certaines sont manquantes. Malheureusement, arara ne peut pas continuer tant que l'erreur n'est pas r\u00e9par\u00e9e. J'ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d'erreur, le voici :
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = Oh-oh, le fichier de configuration est invalide. \u00cates-vous sur(e) qu'il s'agit d'un fichier YAML correct ? Malheureusement, arara ne pourra pas continuer tant qu'un fichier de configuration correct ne sera pas disponible.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = Houston, nous avons un probl\u00e8me. C''est triste \u00e0 dire mais le langage d\u00e9finit dans le fichier de configuration est incorrect. Pour l''instant, arara supporte les langages suivants : {0}. Soyez sur(e) de choisir un langage correct ou de retirer l''entr\u00e9e du fichier de configuration (le champ est optionnel), sinon arara ne pourra pas continuer.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = Je suis navr\u00e9 mais il semble que votre fichier de configuration contient des extensions de fichiers personnalis\u00e9es dont ni l'extension ni le motif ne sont d\u00e9finis. Les deux sont requis pour pouvoir continuer. Veuillez r\u00e9gler ce probl\u00e8me dans votre fichier de configuration puis essayer \u00e0 nouveau.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = Je suis d\u00e9sol\u00e9 mais une des entr\u00e9es du chemin de recherche dans votre fichier de configuration contient une variable non disponible dans le contexte du PATH : ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = D\u00e9sol\u00e9. Une des entr\u00e9es du chemin de recherche dans votre fichier de configuration contient une structure de r\u00e9pertoire incorrecte. Pourriez vous y jetez un coup d'oeil ?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Il semble qu''il y ait une intruction mal \u00e9crite \u00e0 la ligne {0}. Il est possible que ce soit une instruction qui contiennent une erreur de syntaxe YAML ou un champ invalide. J''ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d''erreur, le voici :
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = L''instruction ''{0}'' \u00e0 la ligne {1} a des accolades vides. Notez qu''arara opte pour une syntaxe plus \u00e9pur\u00e9e quand une instruction n''a pas de param\u00e8tres. Pour r\u00e9gler le probl\u00e8me, il suffit soit d''enlever les accolades soit de fournir les arguments pour la commande.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = L''instruction ''{0}'' \u00e0 la ligne {1} a un type d''argument incorrect. L''argument ''{2}'' est un mot-cl\u00e9 pour arara et requiert obligatoirement une liste.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = L''instruction ''{0}'' \u00e0 la ligne {1} a un nom d''argument incorrect. Le nom ''{2}'' est un mot-cl\u00e9 pour arara qui repr\u00e9sente tous les \u00e9l\u00e9ments dans la liste ''{3}''. Veuillez choisir un autre nom pour cet argument.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = L''instruction ''{0}'' \u00e0 la ligne {1} a type d''argument incorrect. Seul les arguments ''files'' et ''items'' peuvent avoir une liste. Les deux sont des mots-cl\u00e9s r\u00e9serv\u00e9s pour arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = Apparemment, il y a une commande invalide \u00e0 la ligne {0}. S''il vous pla\u00eet, veuillez y jeter un oeil et r\u00e9gler le probl\u00e8me.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = L''instruction ''{0}'' \u00e0 la ligne {1} semble malform\u00e9e. Cela pourrait \u00eatre une erreur de syntaxe YAML ou un mauvais mapping.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = Je suis d\u00e9sol\u00e9 mais la langue choisie est incorrecte. Pour l'instant, seuls les langages suivants sont support\u00e9s :
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = Oh-oh, Je n''ai pas trouv\u00e9 la r\u00e8gle ''{0}'' dans le chemin de recherche. Pourriez-vous v\u00e9rifier si le nom de la r\u00e8gle est correct et si celle-ci est accessible dans le chemin de recherche ?
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = Il semble que la t\u00e2che ''{0}'' contienne une erreur de syntaxe YAML ou un champ invalide. Pourriez-vous v\u00e9rifier le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}''. J''ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d'erreur, le voici :
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = Oh-oh, la t\u00e2che ''{0}'' semble invalide. \u00cates vous sur(e) que le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' est un fichier YAML valide ?
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert un identifiant valide. Pouvez-vous r\u00e9gler \u00e7a ?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert un nom valide. Pouvez-vous r\u00e9gler \u00e7a ?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = Oh-oh, la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') a un identifiant d''argument invalide. ''{2}'' est un mot-cl\u00e9 r\u00e9serv\u00e9, aussi il ne peut pas \u00eatre utilis\u00e9. Pouvez-vous utiliser un autre nom ?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert une liste d''arguments valide. Pourriez-vous r\u00e9gler cela ? Notez que la liste d''arguments peut aussi \u00eatre vide, mais il sera toujours n\u00e9cessaire de la d\u00e9finir explicitement (avec ''arguments: []'').
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = Oh-oh, la t\u00e2che ''{0}'' (faisant r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') a un mauvais identifiant - ''{0}'' \u00e9tait attendu, au lieu de ''{2}''. Pourriez-vous r\u00e9gler cela ?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = Oh, non ! Il y a des arguments utilis\u00e9s dans l''instruction ''{0}'' qui ne sont pas d\u00e9finis dans la r\u00e8gle ''{0}.yaml'' situ\u00e9 dans ''{1}''. Vous pouvez soit les enlever de la commande ''{0}'' ou les ajouter \u00e0 la liste des arguments de la r\u00e8gle ''{0}.yaml''. Les voil\u00e0 : {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = D\u00e9sol\u00e9, mais la valeur par d\u00e9faut d\u00e9finie pour l''agument ''{0}'' de la r\u00e8gle ''{1}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{2}'') a une variable/m\u00e9thode incorrecte dans le contexte de la r\u00e8gle : ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = Je suis d\u00e9sol\u00e9 mais le drapeau d\u00e9finit par l''argument ''{0}'' de la t\u00e2che ''{1}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{2}'') a une variable/m\u00e9thode incorrecte dans le contexte de la r\u00e8gle : ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = Oh-oh, les 2 champs ''command'' et ''commands'' sont simultan\u00e9ment d\u00e9finis dans la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}''). Vous ne devez en choisir qu''un des deux. Si votre t\u00e2che n''a besoin que d''une seule commande, vous pouvez choisir ''command''; s''il s''agit d''une succession de commandes, peut-\u00eatre que le champ ''commands'' serait plus avis\u00e9.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = Oh-oh, la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') ne contient ni l''\u00e9l\u00e9ment ''command'' ni l''\u00e9l\u00e9ment ''commands''. Vous devez en choisir un des deux. Si votre t\u00e2che n''a besoin que d''une seule commande, vous pouvez choisir ''command''; s''il s''agit d''une succession de commandes, peut-\u00eatre que le champ ''commands'' serait plus avis\u00e9.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = Je suis d\u00e9sol\u00e9, mais la commande d\u00e9finie pour la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') contient une variable/m\u00e9thode non disponible dans le contexte de la r\u00e8gle : ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties
deleted file mode 100644
index e851d9eef11..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages: This file holds the default Italian language messages for arara.
-#
-# translator: Enrico Gregorio
-# e-mail: Enrico.Gregorio@univr.it
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = arara ti d\u00e0 il benvenuto!
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Sto elaborando il file ''{0}'', attendi.
-
-# Log_Done = Done.
-Log_Done = Done.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Arara ha sollevato un'eccezione con il seguente messaggio:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Pronto a eseguire comandi.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = Sto eseguendo ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = Comando: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' \u00e8 stato eseguito con successo.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' ha emesso uno stato di errore.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = Tutti i comandi sono stati eseguiti con successo.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Resoconto dell'output:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' non \u00e8 stato trovato nel ''path''. Tentativo di esecuzione: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Direttiva trovata alla riga {0} con {1}.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = Compito ''{0}'' trovato in ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = Non ho trovato direttive in ''{0}''.
-
-# Help_Version = print the application version
-Help_Version = stampa la versione dell'applicazione
-
-# Help_Help = print the help message
-Help_Help = stampa il messaggio di aiuto
-
-# Help_Log = generate a log output
-Help_Log = genera un resoconto dell'output
-
-# Help_Verbose = print the command output
-Help_Verbose = stampa l'output del comando
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = imposta il 'timeout' dell'esecuzione (in millisecondi)
-
-# Help_Language = set the application language
-Help_Language = imposta la lingua dell'applicazione
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = The cool TeX automation tool
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = Tutti i diritti riservati.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = Non ho trovato direttive in ''{0}'', cos\u00ec non ho fatto niente. \u00c8 proprio quello che volevi?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Un ringraziamento speciale va a Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz e molti altri che hanno reso possibile la realizzazione di questo umile strumento.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = Sto eseguendo {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = SUCCESSO
-
-# Msg_Failure = FAILURE
-Msg_Failure = FALLIMENTO
-
-# Msg_Status = Status:
-Msg_Status = Stato:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Contesto: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Problema: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = Ho trovato un errore alla riga {0}, colonna {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = Splacente, ma il file ''{0} {1}'' non esiste. Osserva che quando inserisci solo il nome proprio (cio\u00e8 il nome del file senza estensione) o il nome con un''estensione sconosciuta, arara cercher\u00e0 un file che termini con le estensioni predefinite {1} in quest''ordine. \u00c8 possibile modificare l''ordine, lo schema di ricerca e anche abilitare nuove estensioni agendo sul file di configurazione. Consulta il manuale di arara per saperne di pi\u00f9.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = Il file ''{0}'' non esiste.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = \nMi dispiace, ma il comando chiesto dal compito ''{0}'' non \u00e8 stato trovato. Assicurati che il comando ''{1}'' sia corretto e accessibile dal ''path'' di sistema.
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = Mi dispiace, ma sembra che il file di configurazione di arara non sia valido, cio\u00e8 che abbia istruzioni YAML mancanti o scorrette. Sfortunatamente arara non pu\u00f2 andare oltre finch\u00e9 l'errore non viene corretto. Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo:
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = Oh, oh! Il file di configurazione non sembra valido. Assicurati che sia un file YAML corretto. Sfortunatamente arara non pu\u00f2 andare oltre finch\u00e9 non trova un file di configurazione corretto.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = Houston, abbiamo un problema. Spiacente, la lingua impostata nel file di configurazione non \u00e8 valida. Attualmente arara comprende le seguenti lingue: {0}. Assicurati di scegliere una lingua della lista o togli quella sbagliata dal file di configurazione (la lingua \u00e8 facoltativa), altrimenti arara non pu\u00f2 andare oltre.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = Spiacente, ma sembra che il file di configurazione abbia tipi di file personalizzati senza che siano stati definiti un'estensione o uno schema: entrambi sono richiesti per poter continuare. Per favore, correggi l'errore nel file di configurazione e riprova.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = Spiacente, ma uno degli elementi nel percorso di ricerca indicato nel file di configurazione usa una variabile non disponibile in questo contesto: ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = Spiacente, ma uno degli elementi nel percorso di ricerca indicato nel file di configurazione ha una struttura gerarchica malformata. Puoi darci un'occhiata?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Sembra che ci sia una direttiva malformata alla riga {0}, cio\u00e8 una direttiva con un errore di sintassi YAML oppure un campo non valido. Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo:
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = La direttiva ''{0}'' alla riga {1} non ha nulla tra le graffe. Osserva che arara preferisce una sintassi pi\u00f9 snella quando una direttiva non ha parametri. Per correggere, \u00e8 sufficiente togliere le graffe o inserire un argomento per la direttiva.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = La direttiva ''{0}'' alla riga {1} ha un argomento di tipo non valido. L''argomento ''{2}'' \u00e8 una parola chiave riservata di arara che richiede sempre una lista.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = La direttiva ''{0}'' alla riga {1} ha un nome di argomento non valido. Il nome ''{2}'' \u00e8 una parola chiave riservata di arara che rappresenta tutti gli elementi della lista ''{3}''. Per favore, scegli un nome diverso per quell''argomento.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = La direttiva ''{0}'' alla riga {1} ha un tipo di argomento non valido. Solo gli argomenti ''files'' e ''items'' possono contenere una lista. Entrambi sono parole chiave riservate di arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = Sembra che ci sia una direttiva non valida alla riga {0}. Dacci un''occhiata e correggi.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = La direttiva ''{0}'' alla riga {1} sembra malformata. Potrebbe essere un errore di sintassi YAML o un''assegnazione sbagliata.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = Spiacente, ma questo codice di lingua non \u00e8 valido. Attualmente arara comprende le seguenti lingue:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = Oh, oh! Non sono riuscito a trovare la regola ''{0}'' nel percorso di ricerca. Puoi controllare che il nome della regola sia giusto e che la regola sia accessibile nel percorso di ricerca?
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = Sembra che il compito ''{0}'' abbia un errore di sintassi YAML o un campo non valido. Puoi dare un''occhiata al file ''{0}.yaml'' che si trova in ''{1}''? Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = Oh, oh! Il compito ''{0}'' sembra non valido. Assicurati che il file ''{0}.yaml'' che si trova in ''{1}'' sia un file YAML corretto.
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = C''\u00e8 un problema nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richiede un identificatore valido. Puoi correggerlo?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = C''\u00e8 un problema nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richede un nome valido. Puoi correggerlo?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') ha un identificatore di argomento non valido. ''{2}'' \u00e8 una parola chiave riservata e non pu\u00f2 essere usato. Puoi scegliere un altro nome?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = C''\u00e8 un problame nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richiede una lista di argomenti valida. Puoi correggerlo? Nota che la lista di argomenti pu\u00f2 anche essere vuota, ma \u00e8 comunque necessario definirla esplicitamente (con ''arguments: []'').
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') ha un identificatore sbagliato; mi aspettavo ''{0}'' e non ''{2}''. Puoi correggerlo?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = Oh, no! Alcuni argomenti usati nella direttiva ''{0}'' non sono definiti nella regola ''{0}.yaml'' che si trova in ''{1}''. Puoi rimuoverli dalla direttiva ''{0}'' oppure aggiungerli alla lista di argomenti nella regola ''{0}.yaml''. Eccoli: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = Spiacente, ma il valore di default impostato per l''argomento ''{0}'' del compito ''{1}'' (riferito al file ''{1}.yaml'' che si trova in ''{2}'') usa un metodo o una variabile che non \u00e8 disponibile nel contesto della regola: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = Spiacente, ma il segnale (flag) impostato per l''argomento ''{0}'' del compito ''{1}'' (riferito al file ''{1}.yaml'' che si trova in ''{2}'') vuole un metodo o una variabile che non \u00e8 disponibile nel contesto della regola: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = Oh, oh! Entrambi i campi ''command'' e ''commands'' sono impostati per il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}''). Si pu\u00f2 adoperarne solo uno. Se il compito richiede a un solo comando, scegli ''command''; se la regola richiede pi\u00f9 comandi, forse il campo ''commands'' \u00e8 pi\u00f9 adatto.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') non ha n\u00e9 il campo ''command'' n\u00e9 ''commands''. Occorre usare uno (solo) di essi. Se il compito richiede un solo comando, scegli ''command''; se la regola richiede pi\u00f9 comandi, forse il campo ''commands'' \u00e8 pi\u00f9 adatto.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = Spiacente, ma il comando impostato per il compito ''{0}'' task (riferito al file ''{0}.yaml'' che si trova in ''{1}'') usa un metodo o una variabile non disponibile nel contesto della regola: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties
deleted file mode 100644
index f41c27490cb..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages: This file holds the default Brazilian Portuguese messages for arara.
-#
-# author: Paulo Roberto Massa Cereda
-# e-mail: cereda@users.sf.net
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = Bem-vindo ao arara!
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Processando o arquivo ''{0}''; por favor, aguarde.
-
-# Log_Done = Done.
-Log_Done = Conclu\u00eddo.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Arara gerou uma exce\u00e7\u00e3o com a seguinte mensagem:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Pronto para executar comandos.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = Executando ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = Comando: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' foi executado com sucesso.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' retornou um status de erro.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = Todos os comandos foram executados com sucesso.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Registro de sa\u00edda:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' n\u00e3o foi encontrado no caminho do sistema. Tentativa de execu\u00e7\u00e3o: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Diretiva encontrada na linha {0} com {1}.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = Tarefa ''{0}'' encontrada em ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = Nenhuma diretiva foi encontrada em ''{0}''.
-
-# Help_Version = print the application version
-Help_Version = imprime a vers\u00e3o da aplica\u00e7\u00e3o
-
-# Help_Help = print the help message
-Help_Help = imprime a mensagem de ajuda
-
-# Help_Log = generate a log output
-Help_Log = gera uma sa\u00edda para registro
-
-# Help_Verbose = print the command output
-Help_Verbose = imprime a sa\u00edda do comando
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = define o timeout de execu\u00e7\u00e3o (em milissegundos)
-
-# Help_Language = set the application language
-Help_Language = define o idioma da aplica\u00e7\u00e3o
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = A ferramenta legal de automa\u00e7\u00e3o TeX
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = Todos os direitos reservados.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = Eu n\u00e3o encontrei nenhuma diretiva em ''{0}'', e ent\u00e3o n\u00e3o fiz absolutamente nada. \u00c9 isso que voc\u00ea realmente queria?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Um agradecimento especial aos amigos Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, e muitos outros por tornar poss\u00edvel esta humilde ferramenta.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = Executando {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = SUCESSO
-
-# Msg_Failure = FAILURE
-Msg_Failure = FRACASSO
-
-# Msg_Status = Status:
-Msg_Status = Status:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Contexto: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Problema: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = Erro encontrado na linha {0}, coluna {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = Sinto muito, mas o arquivo ''{0} {1}'' n\u00e3o existe. Observe que se voc\u00ea fornecer apenas o nome base (isto \u00e9, o nome do arquivo sem a extens\u00e3o) ou com uma extens\u00e3o desconhecida, arara tentar\u00e1 encontrar arquivos terminados com as extens\u00f5es predefinidas {1} nesta ordem. Voc\u00ea pode alterar a ordem, o padr\u00e3o de busca ou mesmo adicionar suporte para novas extens\u00f5es atrav\u00e9s do arquivo de configura\u00e7\u00e3o. Por favor, verifique o manual para aprender mais sobre essa funcionalidade.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = O arquivo ''{0}'' n\u00e3o existe.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = \nSinto muito, mas o comando da tarefa ''{0}'' n\u00e3o foi encontrado. Voc\u00ea tem certeza de que ''{1}'' est\u00e1 correto, ou mesmo acess\u00edvel a partir do caminho do sistema?
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = Sinto muito, mas aparentemente o seu arquivo de configura\u00e7\u00e3o arara \u00e9 inv\u00e1lido, isto \u00e9, cont\u00e9m entradas YAML inv\u00e1lidas ou inexistentes. Infelizmente, arara n\u00e3o pode prosseguir at\u00e9 que o erro seja reparado. Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1:
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = Uh-oh, o arquivo de configura\u00e7\u00e3o parece ser inv\u00e1lido. Voc\u00ea tem certeza de que ele \u00e9 um arquivo YAML adequado? Infelizmente, arara n\u00e3o pode prosseguir at\u00e9 que um arquivo de configura\u00e7\u00e3o v\u00e1lido seja fornecido.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = Houston, temos um problema. Infelizmente, o idioma definido no arquivo de configura\u00e7\u00e3o n\u00e3o \u00e9 v\u00e1lido. No momento, arara oferece suporte para os seguintes idiomas: {0}. Certifique-se de ter escolhido um idioma v\u00e1lido, ou remova a entrada do arquivo de configura\u00e7\u00e3o (o campo \u00e9 opcional). Caso contr\u00e1rio arara n\u00e3o poder\u00e1 prosseguir.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = Sinto muito, mas parece que o seu arquivo de configura\u00e7\u00e3o tem tipos de arquivos personalizados sem a extens\u00e3o ou o padr\u00e3o de busca definidos. Ambos s\u00e3o requeridos para que arara prossiga. Por favor, conserte o erro no seu arquivo de configura\u00e7\u00e3o e tente novamente.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = Sinto muito, mas uma das entradas do caminho de busca no seu arquivo de configura\u00e7\u00e3o tem uma vari\u00e1vel n\u00e3o resolvida no contexto do caminho: ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
- Error_PathIOErrorConfigurationFile = Sinto muito, mas uma das entradas do caminho de busca no seu arquivo de configura\u00e7\u00e3o tem uma estrutura de diret\u00f3rio malformada. Voc\u00ea poderia dar uma olhadinha?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Parece que existe uma diretiva malformada encontrada na linha {0}, isto \u00e9, uma diretiva que pode ter um erro na sintaxe YAML ou um campo inv\u00e1lido. Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1:
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = A diretiva ''{0}'' na linha {1} tem chaves vazias. Observe que arara opta por uma sintaxe mais limpa quando uma diretiva n\u00e3o tem par\u00e2metros. Para repar\u00e1-la, \u00e9 suficiente remover as chaves ou fornecer os argumentos para a diretiva.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = A diretiva ''{0}'' na linha {1} tem um tipo de argumento inv\u00e1lido. O argumento ''{2}'' \u00e9 uma palavra reservada arara e sempre requer uma lista.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = A diretiva ''{0}'' na linha {1} tem um nome de argumento inv\u00e1lido. O nome ''{2}'' \u00e9 uma palavra reservada arara representando cada elemento na lista ''{3}''. Por favor, escolha um outro nome para esse argumento.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = A diretiva ''{0}'' na linha {1} tem um tipo de argumento inv\u00e1lido. Apenas os argumentos ''files'' e ''items'' podem conter uma lista. Ambos s\u00e3o palavras reservadas arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = Aparentemente, existe uma diretiva inv\u00e1lida na linha {0}. Por favor, d\u00ea uma olhadinha e conserte a diretiva.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = A diretiva ''{0}'' na linha {1} parece ser malformada. Pode ser um erro na sintaxe YAML ou um mapeamento incorreto.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = Sinto muito, mas o c\u00f3digo de idioma que voc\u00ea escolheu \u00e9 inv\u00e1lido. No momento, os seguintes idiomas s\u00e3o suportados:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = Uh-oh, eu n\u00e3o consegui encontrar a regra ''{0}'' no caminho de busca. Voc\u00ea poderia conferir se o nome da regra est\u00e1 correto e se a regra \u00e9 acess\u00edvel a partir do caminho de busca?
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = Parece que a tarefa ''{0}'' tem um erro na sintaxe YAML ou um campo inv\u00e1lido. Voc\u00ea poderia dar uma olhadinha no arquivo ''{0}.yaml'' localizado em ''{1}''? Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = Uh-oh, a tarefa ''{0}'' parece ser inv\u00e1lida. Voc\u00ea tem certeza de que o arquivo ''{0}.yaml'' localizado em ''{1}'' \u00e9 um arquivo YAML apropriado?
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer um identificador v\u00e1lido. Voc\u00ea pode consert\u00e1-lo?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer um nome v\u00e1lido. Voc\u00ea pode consert\u00e1-lo?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem um identificador de argumento inv\u00e1lido. ''{2}'' \u00e9 uma palavra reservada, portanto n\u00e3o pode ser utilizada. Voc\u00ea poderia utilizar outro nome?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer uma lista v\u00e1lida de argumentos. Voc\u00ea pode consert\u00e1-lo? Observe que a lista de argumentos tamb\u00e9m pode ser vazia, mas mesmo assim \u00e9 necess\u00e1rio defin\u00ed-la explicitamente (com ''arguments: []'').
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem o identificador incorreto - era esperado ''{0}'', ao inv\u00e9s de ''{2}''. Voc\u00ea pode consert\u00e1-lo?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = Uh-oh, existem argumentos utilizados na diretiva ''{0}'' que n\u00e3o est\u00e3o definidos na regra ''{0}.yaml'' localizada em ''{1}''. Voc\u00ea pode remover esses argumentos inexistentes da diretiva ''{0}'' ou adicion\u00e1-los \u00e0 lista de argumentos na regra ''{0}.yaml''. Aqui est\u00e3o eles: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = Sinto muito, mas o valor padr\u00e3o definido para o argumento ''{0}'' da tarefa ''{1}'' (referenciando o arquivo ''{1}.yaml'' localizado em ''{2}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = Sinto muito, mas a flag definida para o argumento ''{0}'' da tarefa ''{1}'' (referenciando o arquivo ''{1}.yaml'' localizado em ''{2}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = Uh-oh, os campos ''command'' e ''commands'' est\u00e3o definidos ao mesmo tempo na tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}''). Voc\u00ea precisa escolher apenas um deles. Se a sua regra precisa de apenas um comando, voc\u00ea pode optar por ''command''; se a sua regra requer um conjunto de comandos, talvez o campo ''commands'' seja mais adequado.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') n\u00e3o possui o elemento ''command'' ou ''commands''. Voc\u00ea precisa escolher um deles. Se a sua regra precisa de apenas um comando, voc\u00ea pode optar por ''command''; se a sua regra requer um conjunto de comandos, talvez o campo ''commands'' seja mais adequado.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = Sinto muito, mas o conjunto de comandos da tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties
deleted file mode 100644
index 0e2278ae4dd..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties
+++ /dev/null
@@ -1,226 +0,0 @@
-# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages: This file holds the default Russian language messages for arara.
-#
-# author: Sergey Ulyanov
-# e-mail: ulyanov.sergey@gmail.com
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 arara!
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 ''{0}'', \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435.
-
-# Log_Done = Done.
-Log_Done = \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = Arara \u0432\u044b\u0434\u0430\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = \u0413\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 ''{0}''.
-
-# Log_Command = Command: {0}
-Log_Command = \u041a\u043e\u043c\u0430\u043d\u0434\u0430: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' \u0431\u044b\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = \u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = \u0416\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0430:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u043f\u0443\u0442\u0438. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u0441 {1}.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = \u0417\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 ''{1}''.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = \u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0432 ''{0}''.
-
-# Help_Version = print the application version
-Help_Version = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f
-
-# Help_Help = print the help message
-Help_Help = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435
-
-# Help_Log = generate a log output
-Help_Log = \u0432\u0435\u0441\u0442\u0438 \u0436\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0430
-
-# Help_Verbose = print the command output
-Help_Verbose = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0432 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)
-
-# Help_Language = set the application language
-Help_Language = \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = \u041a\u0440\u0443\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 TeX
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = \u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0432 ''{0}'', \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = \u041e\u0441\u043e\u0431\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz \u0438 \u043c\u043d\u043e\u0433\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u043c\u0443 \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 {0}...
-
-# Msg_Success = SUCCESS
-Msg_Success = \u0423\u0421\u041f\u0415\u0428\u041d\u041e
-
-# Msg_Failure = FAILURE
-Msg_Failure = \u041d\u0415\u0423\u0414\u0410\u0427\u0410
-
-# Msg_Status = Status:
-Msg_Status = \u0421\u0442\u0430\u0442\u0443\u0441:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043f\u043e\u0437\u0438\u0446\u0438\u0438 {1}.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0444\u0430\u0439\u043b ''{0} {1}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u043c\u044f (\u0442.\u0435., \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f) \u0438\u043b\u0438 \u0438\u043c\u044f \u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c, arara \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 {1} \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0449\u0438\u0440\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443 arara, \u0447\u0442\u043e \u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431 \u044d\u0442\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = \u0424\u0430\u0439\u043b ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = = \n\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438 ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 ''{1}'' \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430 \u0438\u043b\u0438 \u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438?
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0430\u0448 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 arara, \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0435\u0432\u0435\u0440\u0435\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 YAML. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, arara \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430\u200b\u200b. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e:
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = \u041e\u0439-\u043e\u0439, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435\u0432\u0435\u0440\u0435\u043d. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b YAML? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, arara \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = \u0425\u044c\u044e\u0441\u0442\u043e\u043d, \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f\u0437\u044b\u043a, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f arara \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432: {0}. \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0430 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u043f\u043e\u043b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c), \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 arara \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0438\u0434\u0438\u043c\u043e, \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0437\u0446\u0430. \u0418 \u0442\u043e \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0443\u0442\u0438: ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u044d\u0442\u043e?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = \u041f\u043e\u0445\u043e\u0436\u0435, \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 YAML \u0438\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e:
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e arara \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0431\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c arara \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418\u043c\u044f ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c arara, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 ''{3}''. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b ''files'' \u0438 ''items'' \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438. \u041e\u0431\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u043e\u043c\u0438 arara.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = \u0412\u0438\u0434\u0438\u043c\u043e, \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0435\u0435.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1}, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 YAML \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = \u041e\u0439-\u043e\u0439, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 ''{0}'' \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u0435\u0440\u043d\u043e \u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043e \u0438\u043c\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043b\u0438 \u043e\u043d\u043e \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430?
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = \u041f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 YAML \u0438\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}''. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = \u041e\u0439-\u043e\u0439, \u043f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'', \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c YAML \u0444\u0430\u0439\u043b\u043e\u043c?
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c? \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u044f\u0432\u043d\u043e (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ''arguments: []'').
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 - ''{0}'' \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u0430 \u043d\u0435 ''{2}''. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = \u041e \u043d\u0435\u0442, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 ''{0}'', \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}''. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b ''{0}'', \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 ''{0}.yaml''. \u0412\u043e\u0442 \u043e\u043d\u0438: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' \u0437\u0430\u0434\u0430\u0447\u0438 ''{1}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{1}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{2}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0444\u043b\u0430\u0433, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' \u0437\u0430\u0434\u0430\u0447\u0438 ''{1}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{1}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{2}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = \u041e\u0439-\u043e\u0439, \u043e\u0431\u0430 \u043f\u043e\u043b\u044f ''command'' \u0438 ''commands'' \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}''). \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c ''command'', \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u043b\u0435 ''commands'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ''command'' \u0438\u043b\u0438 ''commands'' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c ''command'', \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u043b\u0435 ''commands'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties
deleted file mode 100644
index f7fbb2423ab..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties
+++ /dev/null
@@ -1,228 +0,0 @@
-\ufeff# Arara -- the cool TeX automation tool
-# Copyright (c) 2012, Paulo Roberto Massa Cereda
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# 3. Neither the name of the project's author nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# Messages_tr: This file holds the Turkish language messages for arara.
-#
-# initially translated by: Brent Longborough (Obviously not a fluent Turkish speaker!)
-# e-mail: brent@longborough.org
-# enjoyed and revised by: \u0130lhan Polat (Brent is just humble, he is wonderful)
-# e-mail: i.polat@tudelft.nl
-
-# Log_WelcomeMessage = Welcome to arara!
-Log_WelcomeMessage = arara'ya ho\u015fgeldin
-
-# Log_ProcessingFile = Processing file ''{0}'', please wait.
-Log_ProcessingFile = Dosya ''{0}'' i\u015fleniyor, biraz bekletecegim.
-
-# Log_Done = Done.
-Log_Done = Haz\u0131r.
-
-# Log_ExceptionRaised = Arara raised an exception with the following message:
-Log_ExceptionRaised = arara bir istisna farketti ve \u015f\u00f6yle dedi:
-
-# Log_ReadyToRunCommands = Ready to run commands.
-Log_ReadyToRunCommands = Komutlar icin beklemede.
-
-# Log_CommandName = Running ''{0}''.
-Log_CommandName = ''{0}'' komutu yerine getiriliyor.
-
-# Log_Command = Command: {0}
-Log_Command = Komut: {0}
-
-# Log_CommandSuccess = ''{0}'' was successfully executed.
-Log_CommandSuccess = ''{0}'' ba\u015far\u0131yla yerine getirildi.
-
-# Log_CommandFailure = ''{0}'' returned an error status.
-Log_CommandFailure = ''{0}'' hata durumu bildirdi.
-
-# Log_AllCommandsSuccess = All commands were successfully executed.
-Log_AllCommandsSuccess = T\u00fcm komutlar ba\u015far\u0131yla yerine getirildi.
-
-# Log_OutputLogging = Output logging:
-Log_OutputLogging = Kay\u0131t \u00c7\u0131kt\u0131s\u0131:
-
-# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1}
-Log_CommandNotFound = ''{0}'' komutuna giden uygun bir yol bulunamad\u0131. Deneme: {1}
-
-# Log_DirectiveFound = Directive found in line {0} with {1}.
-Log_DirectiveFound = Sat\u0131r {1} \u00fczerinde {0} y\u00f6nergesi bulundu.
-
-# Log_RuleFound = Task ''{0}'' found in ''{1}''.
-Log_RuleFound = ''{1}'' de/da ''{0}'' g\u00f6revi bulundu.
-
-# Log_NoDirectivesFound = No directives found in ''{0}''.
-Log_NoDirectivesFound = ''{0}'' dosyas\u0131nda hi\u00e7bir y\u00f6nerge bulunamad\u0131.
-
-# Help_Version = print the application version
-Help_Version = uygulama s\u00fcr\u00fcm\u00fcn\u00fc yazd\u0131r\u0131r
-
-# Help_Help = print the help message
-Help_Help = yard\u0131m iletisini yazd\u0131r\u0131r
-
-# Help_Log = generate a log output
-Help_Log = kay\u0131t \u00e7\u0131kt\u0131s\u0131 \u00fcretir
-
-# Help_Verbose = print the command output
-Help_Verbose = komut \u00e7\u0131kt\u0131s\u0131 yazd\u0131r\u0131r
-
-# Help_Timeout = set the execution timeout (in milliseconds)
-Help_Timeout = y\u00fcr\u00fctme zaman a\u015f\u0131m\u0131n\u0131 (milisaniye cinsinden) ayarlar
-
-# Help_Language = set the application language
-Help_Language = uygulama dilini ayarlar
-
-# Header_Slogan = The cool TeX automation tool
-Header_Slogan = \u015eahane TeX otomasyon arac\u0131
-
-# Header_AllRightsReserved = All rights reserved.
-Header_AllRightsReserved = T\u00fcm haklar\u0131 sakl\u0131d\u0131r.
-
-# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted?
-Msg_NoDirectivesFound = Ben ''{0}'' dosyas\u0131nda hi\u00e7bir y\u00f6nerge bulamad\u0131m, nedenle bir \u015fey yapmad\u0131m. Ger\u00e7ekten istedi\u011fin bu mu?
-
-# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible.
-Msg_SpecialThanks = Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, ve di\u011ferlerine bu m\u00fctevazi arac\u0131 m\u00fcmk\u00fcn k\u0131ld\u0131klar\u0131 i\u00e7in \u00e7ok te\u015fekk\u00fcrler.
-
-# Msg_RunningCommand = Running {0}...
-Msg_RunningCommand = {0} yerine getiriliyor...
-
-# Msg_Success = SUCCESS
-Msg_Success = BA\u015eARILI
-
-# Msg_Failure = FAILURE
-Msg_Failure = BA\u015eARISIZ
-
-# Msg_Status = Status:
-Msg_Status = Durum:
-
-# YamlError_Context = Context: {0}
-YamlError_Context = Ba\u011flam: {0}
-
-# YamlError_Problem = Problem: {0}
-YamlError_Problem = Sorun: {0}
-
-# YamlError_ErrorLocation = Error found in line {0}, column {1}.
-YamlError_ErrorLocation = {0}. sat\u0131r, {1}. s\u00fctunda hata bulundu.
-
-# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature.
-Error_FileDoesNotExistWithExtensionsList = \u00dczg\u00fcn\u00fcm ama ''{0} {1}'' diye bir dosya yok. Ancak, uzant\u0131s\u0131 olmayan (veya bilinmeyen bir uzant\u0131s\u0131 olan) dosya ad\u0131n\u0131 girdi\u011finde, arara s\u0131ras\u0131yla {1} uzant\u0131lar\u0131n\u0131 bulmay\u0131 dener. Elbette bu s\u0131ray\u0131 ge\u00e7ersiz k\u0131lmak, de\u011fi\u015ftirmek hatta yeni uzant\u0131lar ekleyebilmek m\u00fcmk\u00fcn. Bu \u00f6zellik hakk\u0131nda daha fazla bilgi edinmek i\u00e7in arara k\u0131lavuzuna bak\u0131n.
-
-# Error_FileDoesNotExist = File ''{0}'' does not exist.
-Error_FileDoesNotExist = ''{0}'' diye bir dosya yok.
-
-# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path?
-Error_CommandNotFound = \n\u00dczg\u00fcn\u00fcm ama ''{0}'' g\u00f6revindeki komutu bulunamad\u0131. ''{1}'' komutunun do\u011fru veya sistem yolu ile eri\u015filebilir oldu\u011fundan emin misin?
-
-# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLConfigurationFile = \u00dczg\u00fcn\u00fcm, ama g\u00f6r\u00fcn\u00fc\u015fe g\u00f6re arara yap\u0131land\u0131rma dosyas\u0131 ge\u00e7ersiz, daha do\u011frusu ge\u00e7ersiz veya eksik YAML giri\u015fleri bar\u0131nd\u0131r\u0131yor. Maalesef, arara bu hata giderilene kadar devam edemeyecek. Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m:
-
-# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided.
-Error_InvalidConfigurationFile = T\u00fch, yap\u0131land\u0131rma dosyas\u0131 ge\u00e7ersiz g\u00f6r\u00fcn\u00fcyor. Uygun bir YAML dosyas\u0131 oldu\u011fundan emin misin? Uygun bir yap\u0131land\u0131rma dosyas\u0131 girilene kadar maalesef arara devam edemeyecek.
-
-# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed.
-Error_InvalidLanguageConfigurationFile = Houston, bir sorun var. Ne yaz\u0131k ki, yap\u0131land\u0131rma dosyas\u0131nda ayarlanan dil ge\u00e7erli de\u011fil. \u015eu anda, arara \u015fu dilleri destekliyor: {0}. Anlayabildi\u011fim bir dil se\u00e7in ya da yap\u0131land\u0131rma dosyas\u0131ndan bu (iste\u011fe ba\u011fl\u0131) giri\u015fi kald\u0131r\u0131n, aksi takdirde arara devam edemeyecek.
-
-# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again.
-Error_InvalidFiletypesConfigurationFile = \u00dczg\u00fcn\u00fcm ama g\u00f6r\u00fcn\u00fc\u015fe g\u00f6re yap\u0131land\u0131rma dosyas\u0131nda ne desen tan\u0131m\u0131 olan ne de uzant\u0131s\u0131 bilinen \u00f6zelle\u015ftirilmi\u015f dosya tipleri var. Her iki bilgininde sa\u011flanm\u0131\u015f olmas\u0131 devam edebilmek i\u00e7in gerekli. Yap\u0131land\u0131rma dosyas\u0131ndaki bu hatay\u0131 d\u00fczeltin, ve tekrar deneyin.
-
-# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}''
-Error_PathRuntimeErrorConfigurationFile = \u00dczg\u00fcn\u00fcm ama yap\u0131land\u0131rma dosyas\u0131nda arama yolu girdilerinden birinde kullan\u0131lamayacak bir de\u011fi\u015fken var: ''{0}''
-
-# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it?
-Error_PathIOErrorConfigurationFile = \u00dczg\u00fcn\u00fcm ama yap\u0131land\u0131rma dosyas\u0131nda arama yoluna girdilerinden birini hatal\u0131 bi\u00e7imlendirilmi\u015f bir dizin yap\u0131s\u0131 vard\u0131r. Benim i\u00e7in bir bakabilir misin?
-
-# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLDirective = Sat\u0131r {0} \u00fczerinde bozuk, yani, YAML s\u00f6zdizimi hatas\u0131 veya ge\u00e7ersiz bir alan\u0131 olabilecek bir y\u00f6nerge var gibi duruyor. Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m:
-
-# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive.
-Error_DirectiveEmptyCurlyBrackets = Sat\u0131r {1} \u00fczerindeki ''{0}'' y\u00f6nergesinde bo\u015f k\u00fcme parantezleri buldum. arara y\u00f6nergenin arg\u00fcmanlar\u0131 yoksa sade bir s\u00f6zdizimi yap\u0131s\u0131n\u0131 tercih eder. Bunu d\u00fczeltmek i\u00e7in, bo\u015f k\u00fcme parantezlerini kald\u0131rmak veya y\u00f6nerge i\u00e7in arg\u00fcmanlar sunmak yeterli.
-
-# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list.
-Error_DirectiveInvalidArgumentList = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. ''{2}'' arg\u00fcman\u0131 arara''ya \u00f6zeldir her zaman bir liste gerektirir.
-
-# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument.
-Error_DirectiveReservedKeyword = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. ''{2}'' kelimesi arara''ya ait ''{3}'' listesinde her elementi temsil eden \u00f6zel bir kelimedir. L\u00fctfen, ba\u015fka bir kelime se\u00e7in.
-
-# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords.
-Error_DirectiveListError = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. Sadece ''file'' ve ''items'' arg\u00fcmanlar\u0131 bir liste olabilir. Her ikisi de arara''ya ait \u00f6zel kelimelerdir.
-
-# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it.
-Error_InvalidDirective = G\u00f6r\u00fcn\u00fc\u015fe g\u00f6re, {0}. sat\u0131rda ge\u00e7ersiz bir y\u00f6nerge var. Bir g\u00f6z at\u0131p d\u00fczeltin l\u00fctfen.
-
-# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping.
-Error_DirectiveGenericError = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi bozuk gibi. YAML s\u00f6zdizimi hatas\u0131 ya da yanl\u0131\u015f bir e\u015fleme olabilir.
-
-# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported:
-Error_InvalidLanguage = \u00dczg\u00fcn\u00fcm, ama se\u00e7ti\u011fin dil kodu ge\u00e7ersiz. \u015eimdilik a\u015fa\u011f\u0131daki dilleri konu\u015fabiliyorum:
-
-# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path?
-Error_RuleNotFound = T\u00fch, arama yolunda ''{0}'' kural\u0131n\u0131 bulamad\u0131m. Kural arama yolu \u00fczerinden eri\u015filebilir ise kural ad\u0131n\u0131n do\u011fru oldu\u011funa bakar m\u0131s\u0131n?
-
-# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is:
-Error_InvalidYAMLRule = ''{0}'' g\u00f6revi bir YAML s\u00f6zdizimi hatas\u0131 veya ge\u00e7ersiz bir alan i\u00e7eriyor gibi g\u00f6r\u00fcn\u00fcyor. ''{1}'' rdeki ''{0}.yaml'' dosyas\u0131na bir bakar m\u0131s\u0131n? Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m:
-
-# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file?
-Error_InvalidRule = T\u00fch, ''{0}'' g\u00f6revi ge\u00e7ersiz g\u00f6r\u00fcn\u00fcyor. ''{1}'' de bulunan ''{0}.yaml'' uygun bir YAML dosyas\u0131 oldu\u011fundan emin misin?
-
-# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it?
-Error_EmptyIdentifierRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' deki ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir tan\u0131mlay\u0131c\u0131 gerek. D\u00fczeltebilir misin?
-
-# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it?
-Error_EmptyNameRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' yer ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir isim gerek. D\u00fczeltebilir misin?
-
-# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name?
-Error_ForbiddenIdentifierRule = T\u00fch, ''{0}'' g\u00f6revi (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) ge\u00e7ersiz bir arg\u00fcman tan\u0131mlay\u0131c\u0131s\u0131 i\u00e7eriyor. ''{2}'' \u00f6zel bir kelime, bu nedenle kullan\u0131lamaz. Ba\u015fka bir isim kullanabilir misin?
-
-# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []'').
-Error_EmptyArgumentsListRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' deki ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir arg\u00fcman listesi gerek. Bunu d\u00fczeltebilir misin? Bu arada, arg\u00fcmanlar listesi bo\u015f dahi olabilir, ama yine de ''arguments: []'' ile belirtmek gerekiyor.
-
-# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it?
-Error_WrongIdentifierRule = T\u00fch, ''{0}'' g\u00f6revi (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) yanl\u0131\u015f bir tan\u0131mlay\u0131c\u0131s\u0131 i\u00e7eriyor - ''{0}}'' yerine ''{2}'' bekliyordum. Bunu d\u00fczeltebilir misin?
-
-# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2}
-Error_ArgumentsNotDefinedInRule = ''{0}'' y\u00f6nergesinde, ''{1}'' deki ''{0}.yaml'' kural\u0131 taraf\u0131ndan tan\u0131mlanmam\u0131\u015f arg\u00fcmanlar\u0131 kullan\u0131yor. Bunlar\u0131 ya ''{0}'' y\u00f6nergesinden kald\u0131rabilirsin ya da ''{0}.yaml'' kural\u0131 arg\u00fcman listesine ekleyebilirsin. Bahsetti\u011fim arg\u00fcmanlar \u015funlar: {2}
-
-# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_DefaultValueRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{1}'' g\u00f6revinin ''{0}'' arg\u00fcman\u0131n\u0131n varsay\u0131lan de\u011feri (''{2}'' deki ''{1}.yaml'' dosyas\u0131na atfen) kullan\u0131lamayan bir de\u011fi\u015fken/y\u00f6ntem i\u00e7eriyor: ''{3}''
-
-# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}''
-Error_FlagRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{1}'' g\u00f6revinin ''{0}'' arg\u00fcman imlecinde (''{2}'' deki ''{1}.yaml'' dosyas\u0131na atfen) bu kural i\u00e7in kullan\u0131lamayan bir de\u011fi\u015fken/y\u00f6ntem var: ''{3}''
-
-# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_DuplicatedCommandElementsRule = T\u00fch, her iki ''command'' ve ''commands'' alan\u0131 da ''{0}'' g\u00f6revinde (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) kullan\u0131lmaya ayarlanm\u0131\u015f. Sadece birinin se\u00e7ilmi\u015f olmas\u0131 gerekiyor. E\u011fer i\u015flenecek g\u00f6rev sadece bir komut i\u00e7eriyorsa, ''command'' kullanabilirsin; birden fazla komut kullan\u0131m\u0131 i\u00e7in ''commands'' daha uygun olacakt\u0131r.
-
-# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable.
-Error_MissingCommandElementsRule = her iki ''command'' ve ''commands'' alan\u0131 da ''{0}'' g\u00f6revinde (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) kullan\u0131lmaya ayarlanm\u0131\u015f. \u0130kisinden birinin kullan\u0131l\u0131yor olmas\u0131 gerekiyor. E\u011fer i\u015flenecek g\u00f6rev sadece bir komut i\u00e7eriyorsa, ''command'' kullanabilirsin; birden fazla komut kullan\u0131m\u0131 i\u00e7in ''commands'' daha uygun olacakt\u0131r.
-
-# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}''
-Error_CommandRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{0}'' g\u00f6revi i\u00e7in belirlenmi\u015f komut (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) bu kural i\u00e7in kullan\u0131lamayacak bir de\u011fi\u015fken/y\u00f6ntem i\u00e7eriyor: ''{2}''
-
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/configuration/logback.xml b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/configuration/logback.xml
new file mode 100644
index 00000000000..93e5e14cea4
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/configuration/logback.xml
@@ -0,0 +1,52 @@
+<!--
+ - Arara, the cool TeX automation tool
+ - Copyright (c) 2012, Paulo Roberto Massa Cereda
+ - All rights reserved.
+ -
+ - Redistribution and use in source and binary forms, with or without
+ - modification, are permitted provided that the following conditions
+ - are met:
+ -
+ - 1. Redistributions of source code must retain the above copyright
+ - notice, this list of conditions and the following disclaimer.
+ -
+ - 2. Redistributions in binary form must reproduce the above copyright
+ - notice, this list of conditions and the following disclaimer in the
+ - documentation and/or other materials provided with the distribution.
+ -
+ - 3. Neither the name of the project's author nor the names of its
+ - contributors may be used to endorse or promote products derived from
+ - this software without specific prior written permission.
+ -
+ - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ - COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ - WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ - POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<configuration>
+
+ <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+ <file>${name}.log</file>
+ <append>false</append>
+ <encoder>
+ <charset>UTF-8</charset>
+ <pattern>%date{dd MMM yyyy HH:mm:ss.SSS} %-5level - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <logger name="org.zeroturnaround.exec" level="OFF" />
+
+ <root level="ALL">
+ <appender-ref ref="FILE" />
+ </root>
+
+</configuration> \ No newline at end of file
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages.properties
new file mode 100644
index 00000000000..cdea39f1be1
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: English
+# Translators: Paulo Roberto Massa Cereda
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=The ''basename'' method requires a file, not a directory. It looks like ''{0}'' does not appear to be a file at all. If you need to perform tasks on a directory, you could use a couple of methods from the Java API.
+ERROR_CALCULATEHASH_IO_EXCEPTION=For whatever reason, I could not calculate the hash. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the hashing operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=It looks like ''{0}'' is not a valid boolean value. This should be an easy fix. Make sure to use a valid string that represents boolean values (yes and no, true and false, 1 and 0, and on and off).
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=I could not check your operating system. The provided value ''{0}'' does not look like a valid operating system entry in my list (I might also be wrong, of course). Please correct the value and try again.
+ERROR_CHECKREGEX_IO_EXCEPTION=I could not read the contents of the file ''{0}'', I got an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the reading operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=One of your entries in the 'filetypes' list in the configuration file has no 'extension'. Sadly, I cannot apply a new filetype if the extension is not set. This should be an easy fix: add a new extension and try again.
+ERROR_CONFIGURATION_GENERIC_ERROR=I could not parse the configuration file, something bad happened. This part is quite tricky, since it involves aspects of the underlying data serialization format. I will do my best to help you in any way I can.
+ERROR_CONFIGURATION_INVALID_YAML=I could not parse the configuration file, something bad happened. Apparently, the provided YAML file is invalid. I will do my best to help you in any way I can.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=The value defined in the 'loops' key in the configuration file in order to denote the maximum number of loops has an invalid range. Please make sure to use a positive long value.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=I could not find the provided file ''{0}'' {1}. Please make sure the file exists and it has a valid extension.
+ERROR_EVALUATE_COMPILATION_FAILED=For whatever reason, I could not compile the expression in the provided conditional. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=The conditional evaluation was expecting a boolean value as result. This should be an easy fix. Just make sure the conditional evaluation resolves to a boolean value in the end.
+ERROR_EXTRACTOR_IO_ERROR=There was an IO error while I was trying to extract the directives. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the extraction operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_FILETYPE_NOT_A_FILE=The ''filetype'' method requires a file, not a directory. It looks like ''{0}'' does not appear to be a file at all. If you need to perform tasks on a directory, you could use a couple of methods from the Java API.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=I cannot recognize ''{0}'' as a default extension. If you want to define a new file type, make sure to provide the extension and pattern. These are the default extensions: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=There was an encoding problem while trying to obtain the application path. There is nothing much I can do about it.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=I could not get the canonical file due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the lookup operation. Or maybe I do not have the proper permissions.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=I could not get the canonical path due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the lookup operation. Or maybe I do not have the proper permissions.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=I could not get the parent canonical path due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the hashing operation. Or maybe I do not have the proper permissions.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=It seems that ''{0}'' is marked as required in the rule, but I could not find it in the directive parameters. Please make sure to add it as parameter for your directive and try again.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=I could not evaluate one of the provided commands. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=I could not evaluate the default value expression of one of the arguments. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=I could not evaluate the exit status expression of one of the provided commands. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=I could not evaluate the flag expression of one of the arguments. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_NULL_COMMAND=I am sorry, but apparently one of the provided commands resolved to a null value. Please make sure the command is valid and try again.
+ERROR_INTERPRETER_RULE_NOT_FOUND=I could not find a rule named ''{0}'' in the provided rule paths. Perhaps a misspelled word? I was looking for a file named ''{0}.yaml'' in the following paths in order of priority: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=I found these unknown keys in the directive: {0}. This should be an easy fix, just remove them from your map.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=The 'exit' expression must always return a boolean value (even if there is no computation in the closure body). This should be an easy fix: make sure to correct the type return statement and try again.
+ERROR_LANGUAGE_INVALID_CODE=The provided language code is invalid. Currently, I know how to speak the following languages: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=I could not load the XML database named ''{0}''. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the reading operation. Or maybe I do not have the proper permissions to read the file. By the way, make sure the XML file is well-formed.
+ERROR_PARSER_INVALID_PREAMBLE=I am sorry, but the preamble ''{0}'' could not be found. Please make sure this key exists in the configuration file.
+ERROR_PARSER_LOOPS_INVALID_RANGE=The value defined in the command line for the maximum number of loops has an invalid range. Please make sure to use a positive long value.
+ERROR_PARSER_LOOPS_NAN=The maximum number of loops option expects a number as argument. This should be an easy fix. Just make sure to provide a positive long value.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=The value defined in the command line for the execution timeout has an invalid range. Please make sure to use a positive long value.
+ERROR_PARSER_TIMEOUT_NAN=The execution timeout option expects a number as argument. This should be an easy fix. Just make sure to provide a positive long value.
+ERROR_PARSERULE_GENERIC_ERROR=I could not parse the rule, something bad happened. This part is quite tricky, since it involves aspects of the underlying data serialization format. I will do my best to help you in any way I can.
+ERROR_PARSERULE_INVALID_YAML=I could not parse the rule, something bad happened. Apparently, the provided YAML file is invalid. I will do my best to help you in any way I can.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=I could not replicate the list due to a missing format argument. My guess is that there are less (or more) parameters than expected. Make sure to correct the number of parameters and try again.
+ERROR_RULE_IDENTIFIER_AND_PATH=I have spotted an error in rule ''{0}'' located at ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=I could not run the provided system command, something bad happened. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_RUN_INTERRUPTED_EXCEPTION=The provided system command execution was suddenly interrupted. Maybe there was an external interruption that forced the command to end abruptly.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=The provided system command execution has returned an invalid exit value.
+ERROR_RUN_IO_EXCEPTION=The system command execution has failed due to an IO error. Are you sure the provided system command exists in your path? It might be a good idea to check the path and see if the command is available.
+ERROR_RUN_TIMEOUT_EXCEPTION=The system command execution reached the provided timeout value and was aborted. If the time was way too short, make sure to provide a longer value.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=The timeout value is probably missing (although timeout is enabled). This should be an easy fix. Please make sure to provide a positive long value.
+ERROR_SAVE_COULD_NOT_SAVE_XML=I could not save the XML database named ''{0}''. I have no idea why it failed, though. Perhaps I do not have the proper permissions to write the XML file to disk.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=The ''obtain'' method has found an unknown key ''{0}'' in the session scope. I could not get something I do not have in the first place. Please enter a valid key and try again.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=The ''remove'' method has found an unknown key ''{0}'' in the session scope. I could not remove something I do not have in the first place. Please enter a valid key and try again.
+ERROR_TRIGGER_ACTION_NOT_FOUND=The trigger action ''{0}'' was not found. Make sure to take a look at the list of all available triggers and try again.
+ERROR_TRIGGER_CALL_EXCEPTION=The trigger action ''{0}'' could not be called. Something really bad happened.
+ERROR_VALIDATE_EMPTY_FILES_LIST=I read a directive {0} and found out that the provided ''files'' list is empty. This is an easy fix: make sure the list has at least one element and try again.
+ERROR_VALIDATE_FILE_IS_RESERVED=I read a directive {0} and found out that the key ''file'' was used. This key is reserved, so you cannot use it. But do not worry, this should be an easy fix. Just replace it by another name.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=I read a directive {0} and found out that ''files'' requires a list. Please make sure to correct the type to a proper list and try again.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=I spotted an invalid directive {0} in the provided file. Make sure to fix the directive and try again.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=It looks like no directives were found in the provided file. Make sure to include at least one directive and try again.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Apparently there is an orphan directive line break in line {0}. I cannot proceed. Please correct the directive and try again.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=I read a directive {0} and found out that the key ''reference'' was used. This key is reserved, so you cannot use it. But do not worry, this should be an easy fix. Just replace it by another name.
+ERROR_VALIDATE_YAML_EXCEPTION=There was a problem with the provided YAML map in a directive {0}. This part is quite tricky, since it involves aspects of the underlying data serialization format.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=The argument identifier ''{0}'' is reserved, so you cannot use it. This should be an easy fix. Just replace it by another name.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=I could not find the list of arguments. I need such list, even if it is empty. Make sure to fix this issue and try again.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Apparently you have duplicate argument identifiers in your rule. Make sure to fix this issue and try again.
+ERROR_VALIDATEBODY_MISSING_KEYS=When defining a rule argument scope, at least 'flag' or 'default' must be used. Please, make sure to use at least one of them.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=I found out that one of the arguments has no identifier. Please, make sure to add a valid identifier to the argument and try again.
+ERROR_VALIDATEBODY_NULL_COMMAND=I found a null command in the provided rule. This should be an easy fix. Make sure to add a valid command to the rule.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=I need a list of commands. Make sure to fix this issue and try again.
+ERROR_VALIDATEHEADER_NULL_ID=The provided rule has no identifier. This is a crucial information, please make sure to fix this issue and try again. Make sure the identifier has the same name of the rule file (without the extension, of course).
+ERROR_VALIDATEHEADER_NULL_NAME=The provided rule has no name. This should be an easy fix. Make sure to add a valid name and try again.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=The rule has a wrong identifier. I was expecting ''{0}'', but found ''{1}''. This should be an easy fix: just replace the wrong identifier by the correct one.
+ERROR_VELOCITY_FILE_NOT_FOUND=The template engine was not able to find the provided input file. Make sure the location is correct and try again.
+ERROR_VELOCITY_PARSE_EXCEPTION=There was a parse error in the provided input file. Make sure the file complies with the Velocity Template Language (VTL) specification and try again.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=There was a method invocation error in the provided input file. Make sure the file complies with the Velocity Template Language (VTL) specification and try again.
+ERROR_VELOCITY_IO_EXCEPTION=The template engine was not able to write the output file. Make sure the path has the proper permissions and try again.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=There are more details available on this exception:
+INFO_DISPLAY_EXECUTION_TIME=Total: {0} seconds
+INFO_DISPLAY_FILE_INFORMATION=Processing ''{0}'' (size: {1}, last modified: {2}), please wait.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=About to run: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Although executing in dry-run mode, this entry is always processed since it is a trigger. Note that the effects of a trigger might influence the current execution.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=This entry is a trigger originated from the rule scope. Note that the effects of a trigger might influence the current execution.
+INFO_LABEL_AUTHOR=Author:
+INFO_LABEL_AUTHORS=Authors:
+INFO_LABEL_CONDITIONAL=Conditional:
+INFO_LABEL_NO_AUTHORS=No authors provided
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=ERROR
+INFO_LABEL_ON_FAILURE=FAILURE
+INFO_LABEL_ON_SUCCESS=SUCCESS
+INFO_LABEL_UNNAMED_TASK=Unnamed task
+INFO_PARSER_ALL_RIGHTS_RESERVED=All rights reserved
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=go through all the motions of running a command, but with no actual calls
+INFO_PARSER_HELP_DESCRIPTION=print the help message
+INFO_PARSER_LANGUAGE_DESCRIPTION=set the application language
+INFO_PARSER_LOG_DESCRIPTION=generate a log output
+INFO_PARSER_LOOPS_DESCRIPTION=set the maximum number of loops
+INFO_PARSER_NOTES=This tool makes use of the following libraries and their respective licenses: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: dual licensing with EPL 1.0 and LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. At last but not least, arara itself is released under the New BSD license.
+INFO_PARSER_ONLY_HEADER=extract directives only in the file header
+INFO_PARSER_PREAMBLE_DESCRIPTION=set the file preamble based on the configuration file
+INFO_PARSER_SILENT_MODE_DESCRIPTION=hide the command output
+INFO_PARSER_TIMEOUT_DESCRIPTION=set the execution timeout (in milliseconds)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=print the command output
+INFO_PARSER_VERSION_DESCRIPTION=print the application version
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_DIRECTIVES_BLOCK=DIRECTIVES
+LOG_INFO_END_BUFFER=END OUTPUT BUFFER
+LOG_INFO_INTERPRET_RULE=I am ready to interpret rule ''{0}''.
+LOG_INFO_INTERPRET_TASK=I am ready to interpret task ''{0}'' from rule ''{1}''.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=I found a potential directive: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=I found a potential pattern in line {0}: {1}
+LOG_INFO_RULE_LOCATION=Rule location: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=System command: {0}
+LOG_INFO_TASK_RESULT=Task result:
+LOG_INFO_VALIDATED_DIRECTIVES=All directives were validated. We are good to go.
+LOG_INFO_WELCOME_MESSAGE=Welcome to arara {0} (revision {1})!
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_de.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_de.properties
new file mode 100644
index 00000000000..352259daf6c
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_de.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: German
+# Translators: Marco Daniel
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=Die Methode des ''Dateinamens'' (''basename'') benötigt eine Datei und kein Verzeichnis. Es scheint, als sei ''{0}'' keine Datei. Falls du Aufgaben auf ein Verzeichnis bzw. Ordner anwenden willst, kannst du eine Vielzahl von JAVA API-Methoden verwenden.
+ERROR_CALCULATEHASH_IO_EXCEPTION=Aus was für einem Grund auch immer kann ich die Prüfziffer (checksum) nicht berechnen. Ich habe keine Idee, warum es fehlschlägt. Vielleicht wurde die Datei bevor oder während der Prüfziffer-Operation bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=Es scheint, als sei ''{0}'' kein logischer Ausdruck (boolean value). Das sollte leicht zu beheben sein. Stelle sicher, dass der Eingabestring ein zugelassener logischer Ausdruck ist (''yes'' oder ''no'', ''true'' oder ''false'', ''1'' oder ''0'' sowie ''on'' oder ''off'').
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=Ich konnte dein Betriebssystem nicht überprüfen. Der ermittelte Wert ''{0}'' sieht nicht wie ein gültiges Betriebssystem in meiner Liste aus. (Ich kann natürlich auch falsch liegen.) Bitte korrigiere den Wert und versuche es erneut.
+ERROR_CHECKREGEX_IO_EXCEPTION=Ich konnte den Inhalt der Datei ''{0}'' nicht lesen. Ich erhielt einen IO-Fehler. Ich habe keine Idee für die Fehlerursache, obwohl?. Vielleicht wurde die Datei bevor oder während des Leseprozesses bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=In der Konfigurationsdatei hat einer deiner Einträge in der Liste für Dateitypen 'filetypes' keine Dateiendung 'extension'. Leider kann ich keinen neuen Dateitypen anwenden, wenn die Dateiendung nicht gesetzt ist. Dies sollte leicht zu beheben sein: Ergänze die neue Dateiendung und versuche es erneut.
+ERROR_CONFIGURATION_GENERIC_ERROR=Ich konnte die Konfigurationsdatei nicht analysieren, etwas schlechtes passierte. Dieser Teil ist ziemlich knifflig, denn er bezieht das zugrundeliegende Datenserialisierungsformat mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_CONFIGURATION_INVALID_YAML=Ich konnte die Konfigurationsdatei nicht analysieren. etwas schlechtes passierte. Anscheinend ist die bereitgestellte YAML-Datei ungültig. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=In der Konfigurationsdatei hat der eingegebenen Wert 'loops' zur Festlegung der maximalen Anzahl an Schleifendurchgängen einen ungültigen Bereich. Bitte stelle sicher, dass eine positive Zahl eingetragen wird.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=Ich konnte die vorausgesetzte Datei ''{0}'' {1} nicht finden. Bitte stelle sicher, dass die Datei existiert und eine gültige Dateiendung hat.
+ERROR_EVALUATE_COMPILATION_FAILED=Aus was für einen Grund auch immer kann ich den Ausdruck in der bereitgestellten Bedingung nicht kompilieren. Dieser Teil ist ziemlich knifflig, denn er bezieht die zugrundeliegende Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=Die Auswertung der Bedingung (conditional) hat einen boolschen Ausdruck als Ergebnis erwartet. Das sollte leicht zu beheben sein. Stelle einfach sicher, dass die Bedingung einen booleschen Ausdruck ('yes' oder 'no', 'true' oder 'false', '1' oder '0' sowie 'on' oder 'off') als Ergebnis erhält.
+ERROR_EXTRACTOR_IO_ERROR=Es gab einen IO-Fehler während ich versuchte, die Direktive zu extrahieren. Ich habe keine Idee, warum es fehlschlug. Vielleicht wurde die Datei bevor oder während der Prüfziffer-Operation bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_FILETYPE_NOT_A_FILE=Die Methode der Dateitypen ''filetype'' fordert als Eingabe eine Datei und kein Verzeichnis. Es scheint, als sei ''{0}'' keine Datei. Falls du Aufgaben auf ein Verzeichnis bzw. Ordner anwenden willst, kannst du eine Vielzahl von JAVA API-Methoden verwenden.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=Ich kann ''{0}'' als keine vorgegebene Dateiendung erkennen. Falls du einen neuen Dateitypen definieren möchtest, stelle sich, dass die Dateiendung sowie die entsprechende Struktur bereitgestellt wird. Das sind die vordefinierten Dateiendungen: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=Es gab ein Kodierungsproblem während ich versuchte den Anwendungspfad zu erhalten. Es gibt leider nicht viel, was ich tun kann.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=Ich konnte die vorschriftsmäßige Datei auf Grund eines IO-Fehlers nicht bekommen. Ich habe keine Idee für die Fehlerursache, obwohl?. Vielleicht wurde die Datei bevor oder während des Suchvorganges bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=Ich konnte den vorschriftsmäßigen Pfad auf Grund eines IO-Fehlers nicht bekommen. Ich habe keine Idee für die Fehlerursache, obwohl?. Vielleicht wurde die Datei bevor oder während des Suchvorganges bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=Ich konnte den vorschriftsmäßigen Elternpfad auf Grund eines IO-Fehlers nicht bekommen. Ich habe keine Idee für die Fehlerursache, obwohl?. Vielleicht wurde die Datei bevor oder während der Prüfziffer-Operation bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=Es scheint, als sei ''{0}'' eine geforderte Eingabe in der Regel, aber ich kann sie in den Eingabeparametern nicht finden. Bitte stelle sicher, dass der Parameter in deiner Direktive ergänzt wird und versuche es erneut.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=Ich konnte eines der genutzten Kommandos nicht auswerten. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=Ich konnte den Standardwert eines Argumentes nicht auswerten. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=Ich kann den Status der Fertigmeldung (exit status) von einer der genutzten Anweisungen nicht auswerten. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=Ich kann den Statusindikator (flag expression) eines Argumentes nicht auswerten. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_INTERPRETER_NULL_COMMAND=Es tut mir leid, aber eine der genutzten Anweisungen gibt einen Nullwert zurück. Bitte stelle sicher, dass die Anweisung gültig ist und versuche es erneut.
+ERROR_INTERPRETER_RULE_NOT_FOUND=Ich konnte keine Regel mit dem Namen ''{0}'' in den hinterlegten Regelverzeichnissen finden. Vielleicht ein falsch geschriebenes Wort? Ich habe nach dem Dateinamen ''{0}.yaml'' in den nachstehenden Verzeichnissen mit entsprechender Priorität gesucht: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=Ich habe folgende unbekannte Keys in der Direktive gefunden: {0}. Das sollte leicht zu beheben sein, entferne sie einfach.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=Der Ausdruck 'exit' muss immer einen logischen Wert (boolean value) zurückgeben (sogar wenn es keine Berechnung in der Prozedur gibt). Das sollte leicht zu beheben sein: Stelle einen korrekten Rückgabewert sicher und versuche es erneut.
+ERROR_LANGUAGE_INVALID_CODE=Der bereitgestellte Sprachauswahlcode ist ungültig. Derzeit kann ich folgende Sprachen sprechen: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=Ich konnte die XML-Datenbank mit dem Namen ''{0}'' nicht laden. Ich habe keine Idee für die Fehlerursache, obwohl? Vielleicht wurde die Datei bevor oder während der Leseoperation bewegt oder gelöscht. Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei zu lesen.
+ERROR_PARSER_INVALID_PREAMBLE=Leider konnte die Präambel ''{0}'' nicht gefunden werden. Bitte stelle sicher, dass dieser Schlüssel in der Konfigurationsdatei existiert.
+ERROR_PARSER_LOOPS_INVALID_RANGE=Bei der Anweisungseingabe hat der Wert für die maximale Anzahl an Schleifendurchgängen einen ungültigen Wert. Bitte stelle sicher, dass eine positive Zahl eingetragen wird.
+ERROR_PARSER_LOOPS_NAN=Die maximale Anzahl an Schleifendurchgängen erwartet eine Zahl als Argument. Das sollte leicht zu beheben sein. Bitte stelle sicher, dass eine positive Zahl eingetragen wird.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=Bei der Anweisungseingabe hat der Wert für die Ausführungszeit einen ungültigen Wert. Bitte stelle sicher, dass eine positive Zahl (long) eingetragen wird.
+ERROR_PARSER_TIMEOUT_NAN=Die Option für die Zeitbeschränkung 'timeout' erwartet eine Zahl als Argument. Das sollte leicht zu beheben sein. Bitte stelle sicher, dass eine positive Zahl eingetragen wird.
+ERROR_PARSERULE_GENERIC_ERROR=Ich konnte die Regel nicht auswerten, etwas schlechtes passierte. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Serialisierung mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_PARSERULE_INVALID_YAML=Ich konnte die Regel nicht auswerten, etwas schlechtes passierte. Anscheinend ist die bereitgestellte YAML-Datei ungültig. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=Ich konnte die Liste auf Grund eines fehlendes Formatargumentes nicht replizieren. Meine Vermutung ist, dass es weniger (oder mehr) Parameter als erwartet gibt. Stelle sicher, dass die korrekte Anzahl an Parametern übergeben wird und versuche es erneut.
+ERROR_RULE_IDENTIFIER_AND_PATH=Ich habe einen Fehler in der Regel ''{0}'' an der Stellte ''{1}'' entdeckt.
+ERROR_RUN_GENERIC_EXCEPTION=Ich konnte das geforderte Systemkommando nicht ausführen, etwas schlechtes passierte. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Sprache mit ein. Ich werde mein Bestes tun, um dir in jeglicher Art und Weise zu helfen.
+ERROR_RUN_INTERRUPTED_EXCEPTION=Das aufgerufene Systemkommando ist plötzlich unterbrochen worden. Vielleicht gab es eine externe Unterbrechung, die das Kommando abrupt zur Beendigung zwang.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=Das aufgerufene Systemkommando hat einen ungültigen Abschluss gemeldet.
+ERROR_RUN_IO_EXCEPTION=Der Aufruf des Systemkommandos misslang auf Grund eines IO-Fehlers. Bist du dir sicher, dass das Systemkommando in deinem Pfad existiert? Es sollte eine gute Idee sein, die Systempfade sowie die Verfügbarkeit des Kommandos zu prüfen.
+ERROR_RUN_TIMEOUT_EXCEPTION=Die Ausführung des Systemkommandos hat die Zeitbegrenzung erreicht und wurde abgebrochen. Falls die Zeit etwas zu kurz war, kannst du diese erhöhen.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=Der Wert für die Zeitbegrenzung ('timeout') fehlt vermutlich (obwohl die Zeitbegrenzung aktiviert ist). Das sollte leicht zu beheben sein. Bitte stelle sicher, dass eine positive Zahl eingetragen wird.
+ERROR_SAVE_COULD_NOT_SAVE_XML=Ich konnte die XML-Datenbank mit dem Namen ''{0}'' nicht speichern. Ich habe keine Idee für die Fehlerursache, obwohl? Möglicherweise habe ich nicht die geeigneten Rechte, um die Datei XML-Datei auf der Festplatte zu speichern.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=Die ''obtain'' Methode hat den unbekannten Eintrag (key) ''{0}'' in der Session gefunden. Ich konnte nichts erhalten, was ich nicht bereits habe. Bitte gebe einen gültigen Key ein und versuche es erneut.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=Die ''remove'' Methode hat den unbekannten Eintrag (key) ''{0}'' in der Session gefunden. Ich konnte nichts erhalten, was ich nicht bereits habe. Bitte gebe einen gültigen Key ein und versuche es erneut.
+ERROR_TRIGGER_ACTION_NOT_FOUND=Die Aktion des Triggers ''{0}'' wurde nicht gefunden. Stelle bitte sicher, dass du einen Blick auf die Liste der verfügbaren Trigger wirfst und versuche es erneut.
+ERROR_TRIGGER_CALL_EXCEPTION=Die Aktion des Triggers ''{0}'' konnte nicht aufgerufen werden. Etwas wirklich schlechtes ist passiert.
+ERROR_VALIDATE_EMPTY_FILES_LIST=Ich habe die Direktive {0} gelesen und fand heraus, dass die bereitgestellte Dateienliste leer ist. Das sollte leicht zu beheben sein. Bitte stelle sicher, dass die Liste mindestens ein Element hat und versuche es erneut.
+ERROR_VALIDATE_FILE_IS_RESERVED=Ich habe die Direktive {0} gelesen und fand heraus, dass der Key ''file'' genutzt wurde. Dieser Key ist reserviert, deshalb kannst du ihn nicht nutzen. Aber keine Sorge, dass sollte leicht zu beheben sein. Du musst nur einen anderen Namen verwenden.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=Ich habe die Direktive {0} gelesen und fand heraus, dass der Eintrag ''files'' keine Liste übergeben bekommen hat. Bitte stelle sicher, dass du eine passende Liste verwendest und versuche es erneut.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=Ich entdecke eine ungültige Direktive namens {0} in der bereitgestellten Datei. Stellte sicher, dass die Direktive gültig ist und versuche es erneut.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=Es sieht so aus, als wurden keine Direktiven in der bereitgestellten Datei gefunden. Bitte stelle sicher, dass wenigstens eine Direktive enthalten ist und versuche es erneut.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Anscheinend gibt es einen verwaisten Zeilenumbruch in der Direktive in der Zeile {0}. Ich kann nicht fortfahren. Bitte korrigiere die Direktive und versuche es erneut.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=Ich las die Direktive {0} und fand heraus, dass der Key ''reference'' genutzt wurde. Dieser Key ist reserviert, deshalb kannst du ihn nicht nutzen. Aber keine Sorge, das sollte einfach zu beheben sein. Du musst nur einen anderen Namen verwenden.
+ERROR_VALIDATE_YAML_EXCEPTION=Es gab ein Problem mit dem bereitgestellten YAML-Ausdruck in der Direktive {0}. Dieser Teil ist ziemlich knifflig, denn er bezieht Aspekte der zugrundeliegenden Serialisierung mit ein.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=Die Argumentenbezeichnung ''{0}'' ist reserviert, somit kannst du sie nicht nutzen. Dies sollte einfach zu beheben sein. Du musst nur einen anderen Namen verwenden.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=Ich konnte die Liste der Argumente nicht finden. Ich benötige eine solche Liste, sogar wenn diese leer ist. Bitte behebe diesen Fehler und versuche es erneut.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Anscheinend hast du Duplikate von Bezeichnern in deiner Regel. Bitte behebe diesen Fehler und versuche es erneut.
+ERROR_VALIDATEBODY_MISSING_KEYS=Wenn du ein Argument einer Regel definierst, musst du mindestens 'flag' oder 'default' nutzen. Stelle bitte sicher, dass du mindestens eines nutzt.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=Ich habe herausgefunden, dass eines der Argumente keinen Bezeichner hat. Bitte ergänze einen gültigen Bezeichner im Argument und versuche es erneut.
+ERROR_VALIDATEBODY_NULL_COMMAND=Ich habe eine Nullanweisung in der vorgegebenen Regel gefunden. Bitte stelle sicher, dass ein gültiges Kommando zur Regel hinzugefügt wird.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=Ich benötige eine Liste von Kommandos. Bitte behebe diesen Zustand und versuche es erneut.
+ERROR_VALIDATEHEADER_NULL_ID=Die geforderte Regel hat keinen Bezeichner. Das ist eine wesentliche Information, bitte stelle sicher, dass du dies behebst und versuche es erneut. Beachte hierbei, dass der Bezeichner identisch zum Dateinamen (ohne Dateiendung natürlich) sein muss.
+ERROR_VALIDATEHEADER_NULL_NAME=Die gewünschte Regel hat keinen Namen. Das sollte leicht zu beheben sein. Ergänze einen gültigen Namen und versuche es erneut.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=Die Regel hat einen falschen Bezeichner. Ich erwartete ''{0}'' fand aber ''{1}''. Das solle leicht zu beheben sein: Ersetze einfach den falschen durch einen korrekten Bezeichner.
+ERROR_VELOCITY_FILE_NOT_FOUND=Die Template-Engine konnte die angegebene Eingabe-Datei nicht finden. Bitte stelle sicher, dass der Pfad korrekt ist, und versuche es noch einmal.
+ERROR_VELOCITY_PARSE_EXCEPTION=Es gab einen Lesefehler beim Verarbeiten der angegebenen Eingabe-Datei. Stelle sicher, dass sie die Spezifikationen der Velocity Template Language (VTL) erfüllt und versuche es noch einmal.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=Es gibt einen fehlerhaften Metheodenaufruf in der angegebenen Eingabe-Datei. Stelle sicher, dass sie die Spezifikationen der Velocity Template Language (VTL) erfüllt und versuche es noch einmal.
+ERROR_VELOCITY_IO_EXCEPTION=Die Template-Engine konnte die Ausgabe-Datei nicht schreiben. Stelle sicher, dass sie die nötigen Berechtigungen hat, und versuche es noch einmal.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=Es sind mehr Details für diese Ausnahme verfügbar.
+INFO_DISPLAY_EXECUTION_TIME=Gesamt: {0} Sekunden
+INFO_DISPLAY_FILE_INFORMATION=Verarbeitung ''{0}'' (Größe: {1}, letzte Modifikation: {2}), bitte warten.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Los geht''s: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Obwohl du im 'dry-run-mode' ausführst, wird der Eintrag immer verarbeitet, da es einen Trigger ist. Beachte, dass der Effekt eines Triggers die aktuelle Ausführung beeinflussen kann.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=Dieser Eintrag ist ein Trigger, welcher aus dem Regelumfeld entstand. Beachte, dass der Effekt eines Triggers die aktuelle Ausführung beeinflussen kann.
+INFO_LABEL_AUTHOR=Autor:
+INFO_LABEL_AUTHORS=Autoren:
+INFO_LABEL_CONDITIONAL=Bedingung:
+INFO_LABEL_NO_AUTHORS=Kein Autor berücksichtigt
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=FEHLER
+INFO_LABEL_ON_FAILURE=MISSERFOLG
+INFO_LABEL_ON_SUCCESS=ERFOLGREICH
+INFO_LABEL_UNNAMED_TASK=Namenlose Aufgabe
+INFO_PARSER_ALL_RIGHTS_RESERVED=Alle Rechte vorbehalten.
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=Tue so, als ob du durch alle Anweisungen gehst, aber mit keinem aktuellen Aufruf.
+INFO_PARSER_HELP_DESCRIPTION=Gebe die Hilfe aus
+INFO_PARSER_LANGUAGE_DESCRIPTION=Setze die Anwendungssprache
+INFO_PARSER_LOG_DESCRIPTION=Erstelle einen log-Output
+INFO_PARSER_LOOPS_DESCRIPTION=Setze die maximale Anzahl an Schleifendurchgängen
+INFO_PARSER_NOTES=Dieses Tool nutzt die folgenden Bibliotheken und deren jeweilge Lizenz: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: dual licensing with EPL 1.0 and LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. Zu guter Letzt, arara selbst ist veröffentlicht nach der New BSD license.
+INFO_PARSER_ONLY_HEADER=Extrahiere Direktiven nur im Datei-Kopf
+INFO_PARSER_PREAMBLE_DESCRIPTION=Setze die Datei-Präambel basierend auf der Konfigurationsdatei
+INFO_PARSER_SILENT_MODE_DESCRIPTION=Unterdrückt die Befehlsausgabe
+INFO_PARSER_TIMEOUT_DESCRIPTION=Setze die Zeitabschaltung für die Ausführung (in Millisekunden).
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=Gibt zusätzliche Statusinformationen aus
+INFO_PARSER_VERSION_DESCRIPTION=Gebe die Anwendungsversion aus
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_DIRECTIVES_BLOCK=DIREKTIVEN
+LOG_INFO_END_BUFFER=END OUTPUT BUFFER
+LOG_INFO_INTERPRET_RULE=Ich bin bereit, die Regel ''{0}'' zu interpretieren.
+LOG_INFO_INTERPRET_TASK=Ich bin bereit, die Aufgabe ''{0}'' von der Regel ''{1}'' zu interpretieren.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=Ich habe eine potentielle Direktive gefunden: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=Ich habe ein potentielles Muster in der Linie {0} gefunden: {1}
+LOG_INFO_RULE_LOCATION=Verzeichnis der Regel: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=Systemkommando: {0}
+LOG_INFO_TASK_RESULT=Resultat der Aufgabe:
+LOG_INFO_VALIDATED_DIRECTIVES=Alle Direktiven sind gültig. Wir sind guter Dinge.
+LOG_INFO_WELCOME_MESSAGE=Willkommen bei arara {0} (Revision {1})!
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en.properties
new file mode 100644
index 00000000000..cdea39f1be1
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: English
+# Translators: Paulo Roberto Massa Cereda
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=The ''basename'' method requires a file, not a directory. It looks like ''{0}'' does not appear to be a file at all. If you need to perform tasks on a directory, you could use a couple of methods from the Java API.
+ERROR_CALCULATEHASH_IO_EXCEPTION=For whatever reason, I could not calculate the hash. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the hashing operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=It looks like ''{0}'' is not a valid boolean value. This should be an easy fix. Make sure to use a valid string that represents boolean values (yes and no, true and false, 1 and 0, and on and off).
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=I could not check your operating system. The provided value ''{0}'' does not look like a valid operating system entry in my list (I might also be wrong, of course). Please correct the value and try again.
+ERROR_CHECKREGEX_IO_EXCEPTION=I could not read the contents of the file ''{0}'', I got an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the reading operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=One of your entries in the 'filetypes' list in the configuration file has no 'extension'. Sadly, I cannot apply a new filetype if the extension is not set. This should be an easy fix: add a new extension and try again.
+ERROR_CONFIGURATION_GENERIC_ERROR=I could not parse the configuration file, something bad happened. This part is quite tricky, since it involves aspects of the underlying data serialization format. I will do my best to help you in any way I can.
+ERROR_CONFIGURATION_INVALID_YAML=I could not parse the configuration file, something bad happened. Apparently, the provided YAML file is invalid. I will do my best to help you in any way I can.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=The value defined in the 'loops' key in the configuration file in order to denote the maximum number of loops has an invalid range. Please make sure to use a positive long value.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=I could not find the provided file ''{0}'' {1}. Please make sure the file exists and it has a valid extension.
+ERROR_EVALUATE_COMPILATION_FAILED=For whatever reason, I could not compile the expression in the provided conditional. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=The conditional evaluation was expecting a boolean value as result. This should be an easy fix. Just make sure the conditional evaluation resolves to a boolean value in the end.
+ERROR_EXTRACTOR_IO_ERROR=There was an IO error while I was trying to extract the directives. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the extraction operation. Or maybe I do not have the proper permissions to read the file.
+ERROR_FILETYPE_NOT_A_FILE=The ''filetype'' method requires a file, not a directory. It looks like ''{0}'' does not appear to be a file at all. If you need to perform tasks on a directory, you could use a couple of methods from the Java API.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=I cannot recognize ''{0}'' as a default extension. If you want to define a new file type, make sure to provide the extension and pattern. These are the default extensions: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=There was an encoding problem while trying to obtain the application path. There is nothing much I can do about it.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=I could not get the canonical file due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the lookup operation. Or maybe I do not have the proper permissions.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=I could not get the canonical path due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the lookup operation. Or maybe I do not have the proper permissions.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=I could not get the parent canonical path due to an IO error. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the hashing operation. Or maybe I do not have the proper permissions.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=It seems that ''{0}'' is marked as required in the rule, but I could not find it in the directive parameters. Please make sure to add it as parameter for your directive and try again.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=I could not evaluate one of the provided commands. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=I could not evaluate the default value expression of one of the arguments. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=I could not evaluate the exit status expression of one of the provided commands. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=I could not evaluate the flag expression of one of the arguments. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_INTERPRETER_NULL_COMMAND=I am sorry, but apparently one of the provided commands resolved to a null value. Please make sure the command is valid and try again.
+ERROR_INTERPRETER_RULE_NOT_FOUND=I could not find a rule named ''{0}'' in the provided rule paths. Perhaps a misspelled word? I was looking for a file named ''{0}.yaml'' in the following paths in order of priority: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=I found these unknown keys in the directive: {0}. This should be an easy fix, just remove them from your map.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=The 'exit' expression must always return a boolean value (even if there is no computation in the closure body). This should be an easy fix: make sure to correct the type return statement and try again.
+ERROR_LANGUAGE_INVALID_CODE=The provided language code is invalid. Currently, I know how to speak the following languages: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=I could not load the XML database named ''{0}''. I have no idea why it failed, though. Perhaps the file was moved or deleted before or during the reading operation. Or maybe I do not have the proper permissions to read the file. By the way, make sure the XML file is well-formed.
+ERROR_PARSER_INVALID_PREAMBLE=I am sorry, but the preamble ''{0}'' could not be found. Please make sure this key exists in the configuration file.
+ERROR_PARSER_LOOPS_INVALID_RANGE=The value defined in the command line for the maximum number of loops has an invalid range. Please make sure to use a positive long value.
+ERROR_PARSER_LOOPS_NAN=The maximum number of loops option expects a number as argument. This should be an easy fix. Just make sure to provide a positive long value.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=The value defined in the command line for the execution timeout has an invalid range. Please make sure to use a positive long value.
+ERROR_PARSER_TIMEOUT_NAN=The execution timeout option expects a number as argument. This should be an easy fix. Just make sure to provide a positive long value.
+ERROR_PARSERULE_GENERIC_ERROR=I could not parse the rule, something bad happened. This part is quite tricky, since it involves aspects of the underlying data serialization format. I will do my best to help you in any way I can.
+ERROR_PARSERULE_INVALID_YAML=I could not parse the rule, something bad happened. Apparently, the provided YAML file is invalid. I will do my best to help you in any way I can.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=I could not replicate the list due to a missing format argument. My guess is that there are less (or more) parameters than expected. Make sure to correct the number of parameters and try again.
+ERROR_RULE_IDENTIFIER_AND_PATH=I have spotted an error in rule ''{0}'' located at ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=I could not run the provided system command, something bad happened. This part is quite tricky, since it involves aspects of the underlying expression language. I will do my best to help you in any way I can.
+ERROR_RUN_INTERRUPTED_EXCEPTION=The provided system command execution was suddenly interrupted. Maybe there was an external interruption that forced the command to end abruptly.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=The provided system command execution has returned an invalid exit value.
+ERROR_RUN_IO_EXCEPTION=The system command execution has failed due to an IO error. Are you sure the provided system command exists in your path? It might be a good idea to check the path and see if the command is available.
+ERROR_RUN_TIMEOUT_EXCEPTION=The system command execution reached the provided timeout value and was aborted. If the time was way too short, make sure to provide a longer value.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=The timeout value is probably missing (although timeout is enabled). This should be an easy fix. Please make sure to provide a positive long value.
+ERROR_SAVE_COULD_NOT_SAVE_XML=I could not save the XML database named ''{0}''. I have no idea why it failed, though. Perhaps I do not have the proper permissions to write the XML file to disk.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=The ''obtain'' method has found an unknown key ''{0}'' in the session scope. I could not get something I do not have in the first place. Please enter a valid key and try again.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=The ''remove'' method has found an unknown key ''{0}'' in the session scope. I could not remove something I do not have in the first place. Please enter a valid key and try again.
+ERROR_TRIGGER_ACTION_NOT_FOUND=The trigger action ''{0}'' was not found. Make sure to take a look at the list of all available triggers and try again.
+ERROR_TRIGGER_CALL_EXCEPTION=The trigger action ''{0}'' could not be called. Something really bad happened.
+ERROR_VALIDATE_EMPTY_FILES_LIST=I read a directive {0} and found out that the provided ''files'' list is empty. This is an easy fix: make sure the list has at least one element and try again.
+ERROR_VALIDATE_FILE_IS_RESERVED=I read a directive {0} and found out that the key ''file'' was used. This key is reserved, so you cannot use it. But do not worry, this should be an easy fix. Just replace it by another name.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=I read a directive {0} and found out that ''files'' requires a list. Please make sure to correct the type to a proper list and try again.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=I spotted an invalid directive {0} in the provided file. Make sure to fix the directive and try again.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=It looks like no directives were found in the provided file. Make sure to include at least one directive and try again.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Apparently there is an orphan directive line break in line {0}. I cannot proceed. Please correct the directive and try again.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=I read a directive {0} and found out that the key ''reference'' was used. This key is reserved, so you cannot use it. But do not worry, this should be an easy fix. Just replace it by another name.
+ERROR_VALIDATE_YAML_EXCEPTION=There was a problem with the provided YAML map in a directive {0}. This part is quite tricky, since it involves aspects of the underlying data serialization format.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=The argument identifier ''{0}'' is reserved, so you cannot use it. This should be an easy fix. Just replace it by another name.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=I could not find the list of arguments. I need such list, even if it is empty. Make sure to fix this issue and try again.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Apparently you have duplicate argument identifiers in your rule. Make sure to fix this issue and try again.
+ERROR_VALIDATEBODY_MISSING_KEYS=When defining a rule argument scope, at least 'flag' or 'default' must be used. Please, make sure to use at least one of them.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=I found out that one of the arguments has no identifier. Please, make sure to add a valid identifier to the argument and try again.
+ERROR_VALIDATEBODY_NULL_COMMAND=I found a null command in the provided rule. This should be an easy fix. Make sure to add a valid command to the rule.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=I need a list of commands. Make sure to fix this issue and try again.
+ERROR_VALIDATEHEADER_NULL_ID=The provided rule has no identifier. This is a crucial information, please make sure to fix this issue and try again. Make sure the identifier has the same name of the rule file (without the extension, of course).
+ERROR_VALIDATEHEADER_NULL_NAME=The provided rule has no name. This should be an easy fix. Make sure to add a valid name and try again.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=The rule has a wrong identifier. I was expecting ''{0}'', but found ''{1}''. This should be an easy fix: just replace the wrong identifier by the correct one.
+ERROR_VELOCITY_FILE_NOT_FOUND=The template engine was not able to find the provided input file. Make sure the location is correct and try again.
+ERROR_VELOCITY_PARSE_EXCEPTION=There was a parse error in the provided input file. Make sure the file complies with the Velocity Template Language (VTL) specification and try again.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=There was a method invocation error in the provided input file. Make sure the file complies with the Velocity Template Language (VTL) specification and try again.
+ERROR_VELOCITY_IO_EXCEPTION=The template engine was not able to write the output file. Make sure the path has the proper permissions and try again.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=There are more details available on this exception:
+INFO_DISPLAY_EXECUTION_TIME=Total: {0} seconds
+INFO_DISPLAY_FILE_INFORMATION=Processing ''{0}'' (size: {1}, last modified: {2}), please wait.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=About to run: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Although executing in dry-run mode, this entry is always processed since it is a trigger. Note that the effects of a trigger might influence the current execution.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=This entry is a trigger originated from the rule scope. Note that the effects of a trigger might influence the current execution.
+INFO_LABEL_AUTHOR=Author:
+INFO_LABEL_AUTHORS=Authors:
+INFO_LABEL_CONDITIONAL=Conditional:
+INFO_LABEL_NO_AUTHORS=No authors provided
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=ERROR
+INFO_LABEL_ON_FAILURE=FAILURE
+INFO_LABEL_ON_SUCCESS=SUCCESS
+INFO_LABEL_UNNAMED_TASK=Unnamed task
+INFO_PARSER_ALL_RIGHTS_RESERVED=All rights reserved
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=go through all the motions of running a command, but with no actual calls
+INFO_PARSER_HELP_DESCRIPTION=print the help message
+INFO_PARSER_LANGUAGE_DESCRIPTION=set the application language
+INFO_PARSER_LOG_DESCRIPTION=generate a log output
+INFO_PARSER_LOOPS_DESCRIPTION=set the maximum number of loops
+INFO_PARSER_NOTES=This tool makes use of the following libraries and their respective licenses: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: dual licensing with EPL 1.0 and LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. At last but not least, arara itself is released under the New BSD license.
+INFO_PARSER_ONLY_HEADER=extract directives only in the file header
+INFO_PARSER_PREAMBLE_DESCRIPTION=set the file preamble based on the configuration file
+INFO_PARSER_SILENT_MODE_DESCRIPTION=hide the command output
+INFO_PARSER_TIMEOUT_DESCRIPTION=set the execution timeout (in milliseconds)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=print the command output
+INFO_PARSER_VERSION_DESCRIPTION=print the application version
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_DIRECTIVES_BLOCK=DIRECTIVES
+LOG_INFO_END_BUFFER=END OUTPUT BUFFER
+LOG_INFO_INTERPRET_RULE=I am ready to interpret rule ''{0}''.
+LOG_INFO_INTERPRET_TASK=I am ready to interpret task ''{0}'' from rule ''{1}''.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=I found a potential directive: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=I found a potential pattern in line {0}: {1}
+LOG_INFO_RULE_LOCATION=Rule location: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=System command: {0}
+LOG_INFO_TASK_RESULT=Task result:
+LOG_INFO_VALIDATED_DIRECTIVES=All directives were validated. We are good to go.
+LOG_INFO_WELCOME_MESSAGE=Welcome to arara {0} (revision {1})!
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en_QN.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en_QN.properties
new file mode 100644
index 00000000000..db583d46694
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_en_QN.properties
@@ -0,0 +1,150 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: Broad Norfolk
+# Translators: Nicola Talbot
+# ---------------------------------------------------------------------
+# With thanks to Keith Skipper for suggestions!
+
+ERROR_BASENAME_NOT_A_FILE=Yew''re gotta hev a file for the ''basename'', not a directory. That ''{0}'' yew give me ent a file. Do yew need ter do jarbs on a directory, yew myte try the Java API.
+ERROR_CALCULATEHASH_IO_EXCEPTION=Thass a rum ole dew, bor, I can't work out th' hash. I ent got no idea why thass gorn wrong. Praps the file was hulled abowt afore or time the hashing operation was doing else maybe I're gotta he'some proper permissions to snout abowt in the file.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=That look like ''{0}'' ent a proper boolean value but dunt yew git yerself inta a rite ole puckaterry. Do yew jist make sure to use proper boolean values (yes and no, true and false, 1 and 0, and on and off).
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=Thass a rum un. I hent got no idear whass yar operating system. Wuh, that ole value ''{0}'' I got dunt look like thass a proper operating system (howsomever I might be sorft in the head and got that wrong). Do yew fix that value and try agin.
+ERROR_CHECKREGEX_IO_EXCEPTION=Cor blast me, but I feel a bit ona tewl. I can''t read any ona file ''{0}'', thass giving me an IO error. I''re got no idear but praps the file was hulled abowt afore or time the reading operation was doing else maybe I''re gotta he''some proper permissions to snout abowt the file.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=One onyar entries in that ole list a 'filetypes' in the configuration file ent got no 'extension'. Thass a rum un cos I can't do a new filetype if the extension ent been set. That shoont be a problem: do yew jist add a new extension and try agin, bor.
+ERROR_CONFIGURATION_GENERIC_ERROR=Thass hully gone wrong, ole partner. I coont unnerstand the configuration file. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, my bewty.
+ERROR_CONFIGURATION_INVALID_YAML=Thass a rum ole dew, I're got in a rite ole puckaterry trying to read the configuration file. That YAML do need some tricolating to git it rite but I'll lend yew a hand, tergether.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=Atwin me, yew an' the geartepust that 'loops' key value ent rite. Yew're gotta giv' a number thass bigger than nuffin.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=Dunt yew git yarself inta a rite ole puckaterry, but I can''t find yar file ''{0}'' {1}. Yew''re gotta find the file and do yew see that has a proper extension on the end onnit, tergether.
+ERROR_EVALUATE_COMPILATION_FAILED=Wuh, I ent got no idear wass gorn on but I coont git the hang o'that conditional. Yew're gotta he'sum idear wot this is orl abowt else yew mite be in a rite ole puckaterry but I'll help yew git it done if I can, ole partner.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=That ent a yis or no answer for that conditional evaluation but dunt yew git in a puckaterry. Do yew jist git that conditional to giv a boolean value, my bewty.
+ERROR_EXTRACTOR_IO_ERROR=Wuh, I was trying to get a hold onnem directives when suffin went hully wrong, howsomever I hent got no idear why thass gone wrong. Praps the file was hulled abowt afore or time the hashing operation was doing else maybe I're gotta he'sum proper permissions to read the file.
+ERROR_FILETYPE_NOT_A_FILE=Yew gotta hev a file for the ''filetype'', not a directory. That ''{0}'' yew giv me dunt look like a file to me. Do yew need to do jarbs on a directory, yew myte try the Java API
+ERROR_FILETYPE_UNKNOWN_EXTENSION=Cor blast me, ole partner, but I ent never heard of ''{0}'' as a default extension. Yew''re gotta giv me yer know about the match and that ole extension on the end onnit do you want a new file type. I ony know abowt the default extensions: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=Dunt yew git yarself inta a rite ole puckaterry, my bewty, cos there's nuffin I can dew abowt it but I're gotta mobbing abowt th'encoding time I was trying to get the application path.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=Cor blast me, my bewty, I ent got no idear wass gorn on but I coont get the canonical file. Praps the file was hulled abowt afore or time the lookup operation was doing else maybe I're gotta he'sum proper permissions.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=Cor blast me, my bewty, I ent got no idear wass gorn on but I coont get the canonical path. Praps the file was hulled abowt afore or time the lookup operation was doing else maybe I're gotta he'sum proper permissions.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=Cor blast me, my bewty, I ent got no idear wass gorn on but I coont get the parent canonical path. Praps the file was hulled abowt afore or time the hashing operation was doing else maybe I're gotta he'sum proper permissions.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=That seem like the rule say yew gotta have ''{0}'', but I coont find it in the directive parameters. Dew yew add it as a parameter for yar directive and try agin.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=That ent gorn right wi' one onnem commands you giv' me. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, my bewty.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=That ent gorn right wi' ter default value of one onnem arguments you giv' me. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, tergether.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=That ent gorn right wi' th' exit status of onnem commands you giv' me. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, my bewty.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=That ent gorn right wi' th' flag for onnem arguments you giv' me. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, my bewty.
+ERROR_INTERPRETER_NULL_COMMAND=Thass a rum ole dew but one onnem commands have hulled me a null value. Do you check that and try agin, ole partner.
+ERROR_INTERPRETER_RULE_NOT_FOUND=Thass a rum ole dew but there ent no ''{0}'' in any onnem rule paths. Praps you ent spelled that right. I coont find ''{0}.yaml'' in any onner paths: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=Atwin me, yew an'' the geartepost I ent got no idear abowt these keys in the directive: {0}. Howsomever, dunt you git yarself inta a rite ole puckaterry. Do you jist hull them outta yar map.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=Wuh, ole partner, that 'exit' expression ent givin' me a yis or no answer. Thass allus got to dew that even if there ent nuffin else to dew. Howsomever, dunt you git yarself inta a rite ole puckaterry, dew you jist tricolate the return statement and try agin.
+ERROR_LANGUAGE_INVALID_CODE=Cor blast me, my bewty, but you hully copped me there wi'' that language code. I can ony mardle in these languages: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=Cor blast me, ole partner, but that XML database ''{0}'' ent half puttin'' on its parts but I ent got no idear wass gone wrong. Praps the file was hulled abowt afore or time the reading operation was doing else maybe I''re gotta he''sum proper permissions to snout abowt the file. Atwin yew, me an'' the geartepost, do yew make sure the XML is in good kelter.
+ERROR_PARSER_INVALID_PREAMBLE=Thass a rum ole dew, ole partner, but I can''t find the preamble ''{0}''. Do yew make sure that key exist in the configuration file.
+ERROR_PARSER_LOOPS_INVALID_RANGE=Wuh, I dunt want to hully mob you, my bewty, but that value you giv' me in the command line ent rite for the sight o' loops I mite hev to dew. Dew you giv' me a proper number what I can count to.
+ERROR_PARSER_LOOPS_NAN=Wuh, I dunt want to hully mob you, ole partner, but that value you giv' me in the command line for the sight o' loops I mite hev to dew ent a number. Dew you giv' me a proper number what I can count to.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=Cor blast me, my bewty, but that timeout value you giv' me in the command line ent rite. Dew you giv' me a proper number what I can count to.
+ERROR_PARSER_TIMEOUT_NAN=Cor blast me, ole partner, but that timeout value you giv' me in the command line ent a number. Dew you giv' me a proper number what I can count to.
+ERROR_PARSERULE_GENERIC_ERROR=Thass a rum ole dew, that rule is hully puttin' on its parts. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, tergether.
+ERROR_PARSERULE_INVALID_YAML=Thass a rum ole dew, that rule ent half putting on its parts. That YAML file is hully on the huh but dunt yew git yarself in a rite ole puckaterry. I'll help you if I can, my bewty.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=Blast, bor, but I coont replicate that duzzy ole list cors you ent giv' me a format argument. I rackon there's a slight more or less parameters than yew giv' me. Dew yew go an' check it and try agin.
+ERROR_RULE_IDENTIFIER_AND_PATH=Wuh, that ent right, ole partner. That rule ''{0}'' have gone on the slosh at ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=Thass a rum ole dew, my bewty, but I coont dew the system command but I ent got no idear wass gone wrong. Wuh, yew're gotta he'sum idear wot this is orl abowt ter git th' hang o'this bit else yew myte be in a rite ole puckaterry but I'll help yew git it done if I can, tergether.
+ERROR_RUN_INTERRUPTED_EXCEPTION=Thass a rum ole dew, ole partner, suffin's hully thacked that system command aside the lug and thass croaked.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=That system command is hully puttin' on its parts. That ent a proper exit value.
+ERROR_RUN_IO_EXCEPTION=I rackon that system command have blundered over the troschel. Are yew sure that exist in yar path? Dew yew check the path, ole partner, to see where thass hidin'. Maybe thass gorn in the backus for some bread an' pullet.
+ERROR_RUN_TIMEOUT_EXCEPTION=That slummockun gret system command have run on for too long so I gev it a clout round the lug. If thass hully short for yew, dew yew giv' me a longer timeout value.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=Hold yew hard, that timeout value ent here. I rackon thass gorn for some fourses. Dew yew giv' me a number wot I can count to.
+ERROR_SAVE_COULD_NOT_SAVE_XML=Thass a rum ole dew, ole partner. I coont save that ole XML database that oughta be called ''{0}''. Howsomever I hent got no idea why thass gone wrong. Praps I''re gotta he''sum proper permissions to write the XML file to disk.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=Cor blast me, my bewty, but I hent got no idear wass that ''{0}'' key is dewun in that ''obtain'' method. I can''t giv'' you suffin I ent got. Dew yew ax for suffin I can git yew.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=Cor blast me, ole partner, but I hent got no idear wass that ''{0}'' key is dewin in that ''remove'' method. I can''t remove suffin that ent there. Dew yew ax for suffin else.
+ERROR_TRIGGER_ACTION_NOT_FOUND=Cor blast me, bor, but there ent no trigger action called ''{0}'' that I ever heard of. Dew yew hev'' a look at that list of trigger actions and try agin.
+ERROR_TRIGGER_CALL_EXCEPTION=Thass a rum ole dew, my bewty, but that trigger action ''{0}'' is hully puttin'' on its parts and I ent got no idear what to dew.
+ERROR_VALIDATE_EMPTY_FILES_LIST=Cor blast me, my bewty. I read a directive {0} but there ent nuffin in the provided ''files'' list. Do yew just make sure there''s at least one element in the list and try agin.
+ERROR_VALIDATE_FILE_IS_RESERVED=Thass a rum ole dew, ole partner. I read a directive {0} but blast me if that key ''file'' ent used. That key is reserved, so yew can''t use it. But dunt yew git yarself in a rite ole puckaterry. Do yew give it another name.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=That ent rite, ole partner. I read a directive {0} and found out that ''files'' require a list. Do yew fix the type to a proper list and try agin.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=That directive {0} in the provided file ent rite. But dunt git yarself into a puckaterry. Do yew just fix the directive and try agin.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=That look like no directives were found in the provided file. Do yew include at least one directive and try agin.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Thass a rum ole dew, ole partner. There''s an orphan directive line break in line {0}. I can''t do nuffin abowt that. Dew yew giv'' that directive a bit o'' tricolatin'' and try agin.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=That ain''t right, my bewty. You can''t use the key ''reference'' in {0}. Thass a reserved key, but there ain''t no use you gittin'' in a rite ole puckaterry abowt it. Dew yew giv'' it another name.
+ERROR_VALIDATE_YAML_EXCEPTION=Thass a rum ole dew, my bewty. Suffin''s gone wrong in the YAML map in a directive {0}. Wuh, yew''re gotta he''sum idear wot this is orl abowt ter git th'' hang o''this bit else yew myte be in a rite ole puckaterry.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=That ent rite, ole partner. Yew can''t use ''{0}''. Thass reserved, but dunt yew git yarself into a rite ole puckaterry, dew yew jist giv'' it another name.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=Thass a rum ole dew, my bewty, but there ent no list of arguments. I need that even if that ent got nuffin in it. Dew you fix it and try agin.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Thass a rum ole dew, ole partner. You've got duplicate argument identifiers in yar rule. Dew you fix that and try agin.
+ERROR_VALIDATEBODY_MISSING_KEYS=That ent rite, ole partner. You gotta use at least 'flag' or 'default' when you define a rule argument scope. Do yew make sure to use at least one onnem.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=That ent rite, my bewty. You gotta hev an identifier but one onnem arguments ent for one. Dew yew add a valid identifier to the argument and try agin.
+ERROR_VALIDATEBODY_NULL_COMMAND=Thass a rum dew, ole partner. Thass a null command in that ole rule. Do you add a proper command there.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=Wuh, thass hully wrong. Do yew giv' me a list o' commands, my bewty, and try agin.
+ERROR_VALIDATEHEADER_NULL_ID=Wuh, ole partner, I'm gornta hev to mob that rule o' yars. That ent got no identifier. Thass hully important and there ent no use putting on yar parts abowt it. That slummockin' gret rule oughta hev' an identifier what have the same name as that ole rule file (without the extension, dew yew dunt know that).
+ERROR_VALIDATEHEADER_NULL_NAME=Cor blast me, bor, but that rule ent got no name, but dunt yew git yarself in a puckaterry, dew you jist giv' it a proper name and try agin.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=My heart alive, my bewty, but that rule ent got the right identifier. That oughta be ''{0}'', not ''{1}'', but dunt yew git yarself in a puckaterry. Dew you jist fix that.
+ERROR_VELOCITY_FILE_NOT_FOUND=Cor blast me, bor, but the template engine can't find the provided input file. Dew yew mearke sure the location is correct and try agin.
+ERROR_VELOCITY_PARSE_EXCEPTION=Wuh, that ent roight, ole partner. There wus a parse error in the provided input file. Dew yew mearke hully sure the file comply wuth the Velocity Template Language (VTL) specification and try agin.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=Thass a rum ole dew. There wus a method invocation error in the provided input file. Dew yew mearke sure the file comply with the Velocity Template Language (VTL) specification and try agin.
+ERROR_VELOCITY_IO_EXCEPTION=That ent gorn right, my bewty. The template engine wunt able to write the output file. Dew yew mearke sure the path has the proper permissions and try agin.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=Hear's orl my know on that aggraweartin' exception:
+INFO_DISPLAY_EXECUTION_TIME=Wuh that took {0} seconds but if thass a slight longer than you expected, dunt yew go mobbing me abowt it cors that ent my fault. My grandf''ar dint have none of these pearks. He had to use a pen and a bit o'' pearper, but thass bin nice mardling wi'' yew. Dew yew keep a troshin''!
+INFO_DISPLAY_FILE_INFORMATION=Hold yew hard, ole partner, I''m gornta hev a look at ''{0}'' (thass {1} big, that is, and that was last chearnged on {2} in case yew dunt remember).
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=This is what I''m abowt to dew: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Wuh, ole partner, I know this is a dry-run, but this entry has gorta be done cos thass a trigger. Thass hully important yew should know that might doss things on the huh.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=Wuh, ole partner, this entry is one onem triggers what come from the rule scope. Thass hully important yew should know that might put this jarb hully on the huh.
+INFO_LABEL_AUTHOR=Thass the one wot wrote this masterous jarb:
+INFO_LABEL_AUTHORS=Here's the ones wot wrote this masterous jarb:
+INFO_LABEL_CONDITIONAL=Conditional (thass a yis or no thing):
+INFO_LABEL_NO_AUTHORS=Wuh thass a rum ole dew. There ent no names here. Yew're gotta guess who wrote this masterous jarb
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=SUFFIN'S GORN WRONG
+INFO_LABEL_ON_FAILURE=THAT ENT GORN RIGHT, OLE PARTNER
+INFO_LABEL_ON_SUCCESS=THASS A MASTERLY JOB, MY BEWTY
+INFO_LABEL_UNNAMED_TASK=That task ent got no name
+INFO_PARSER_ALL_RIGHTS_RESERVED=Orl them rights are reserved, ole partner
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=that'll look like I'm dewun suffin, but I ent
+INFO_PARSER_HELP_DESCRIPTION=wuh, cor blast me, my bewty, but that'll tell me to dew jist what I'm dewun rite now
+INFO_PARSER_LANGUAGE_DESCRIPTION=that'll tell me what language to mardle in
+INFO_PARSER_LOG_DESCRIPTION=that'll make a log file wi' orl my know dew suffin go wrong
+INFO_PARSER_LOOPS_DESCRIPTION=wuh, yew dunt want me to run on forever, dew you, so use this to say when you want me to stop
+INFO_PARSER_NOTES=This masterous fine perk use orl these other perks and here's their licences an'orl: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: dual licensing with EPL 1.0 and LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. At last but not least, arara itself is released under the New BSD license.
+INFO_PARSER_ONLY_HEADER=wuh, my bewty, that'll only peek at directives what are in the file header
+INFO_PARSER_PREAMBLE_DESCRIPTION=dew yew git hold o' that preamble from the configuration file
+INFO_PARSER_SILENT_MODE_DESCRIPTION=that'll make them system commands clam up and not run on about what's dewin
+INFO_PARSER_TIMEOUT_DESCRIPTION=wuh, yew dunt want them system commands to run on forever dew suffin' go wrong, dew you, so use this to set the execution timeout (thass in milliseconds)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=thass dew you want ter system commands to hav' a mardle wi'yew an'orl
+INFO_PARSER_VERSION_DESCRIPTION=dew yew use this dew you want my know abowt this version
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_DIRECTIVES_BLOCK=DIRECTIVES
+LOG_INFO_END_BUFFER=END OUTPUT BUFFER
+LOG_INFO_INTERPRET_RULE=I''m orl ready, ole parter, to dew the rule ''{0}''.
+LOG_INFO_INTERPRET_TASK=I''m orl ready, my bewty, to dew ''{0}'' from that ole rule ''{1}''.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=I''re found what might be a directive: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=I''re found what might be a pattern in line {0}: {1}
+LOG_INFO_RULE_LOCATION=That ole rule come from: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=System command: {0}
+LOG_INFO_TASK_RESULT=Here's what that jarb say:
+LOG_INFO_VALIDATED_DIRECTIVES=Thass a masterous jarb, orl the directives are in good kelter. We can git troshin'.
+LOG_INFO_WELCOME_MESSAGE=Hello, my bewty. Welcome to arara {0} (revision {1})! (Thass one onnem hully big birds they git in Brazil.)
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_it.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_it.properties
new file mode 100644
index 00000000000..70afb93ec6a
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_it.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: Italian
+# Translators: Enrico Gregorio
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=Il metodo ''basename'' richiede un file, non una directory. ''{0}'' non sembra proprio essere un file. Se devi eseguire un compito su una directory, puoi adoperare uno dei metodi delle API Java.
+ERROR_CALCULATEHASH_IO_EXCEPTION=Per qualche motivo, non ho potuto calcolare un hash. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato durante l'operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=Sembra che ''{0}'' non sia un valore booleano valido. Penso che sia facile correggerlo. Assicurati di adoperare una stringa valida che rappresenti un valore booleano (yes e no, true e false, 1 e 0, oppure on e off).
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=Non sono riuscito a distinguere il tuo sistema operativo. Il valore dichiarato ''{0}'' non compare nella mia lista di sistemi operativi (potrei sbagliarmi, però). Per favore, correggi il valore e riprova.
+ERROR_CHECKREGEX_IO_EXCEPTION=Non sono riuscito a leggere il contenuto del file ''{0}'' e ho ricevuto in errore di I/O. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato durante l''operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=Uno degli oggetti nella lista di 'filetypes' nel file di configurazione è senza 'estensione'. Mi dispiace, non posso gestire un nuovo 'filetype' se l'estensione non è specificata. Dovrebbe essere facile correggerlo: aggiungi l'estensione e riprova.
+ERROR_CONFIGURATION_GENERIC_ERROR=Non sono riuscito a leggere il file di configurazione, è successo qualcosa che non va. Questa parte è un po' complicata, perché riguarda aspetti del formato interno di serializzazione dei dati. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_CONFIGURATION_INVALID_YAML=Non sono riuscito a leggere il file di configurazione, è successo qualcosa che non va. Sembra che il file YAML fornito non sia valido. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=Il valore definito nella chiave 'loops' del file di configurazione per stabilire il massimo numero di cicli ha un intervallo non valido. Assicurati che sia un valore 'lungo' e positivo.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=Non sono riuscito a trovare il file ''{0}'' {1}. Assicurati che il file esista e abbia un''estensione valida.
+ERROR_EVALUATE_COMPILATION_FAILED=Per qualche ragione, non sono riuscito a compilare l'espressione del condizionale fornito. Questa parte è un po' complicata, perché riguarda aspetti del linguaggio interno per le espressioni. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=La valutazione del condizionale si aspettava un valore booleano come risultato. Dovrebbe essere facile correggerlo. Assicurati che la valutazione del condizionale fornisca alla fine un valore booleano.
+ERROR_EXTRACTOR_IO_ERROR=C'è stato un errore di I/O mentre provavo a estrarre le direttive. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato prima o durante l'operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_FILETYPE_NOT_A_FILE=Il metodo ''filetype'' richiede un file, non una directory. ''{0}'' non sembra proprio essere un file. Se devi eseguire un compito su una directory, puoi adoperare uno dei metodi delle API Java.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=Non riconosco ''{0}'' come un''estensione standard. Se vuoi definire un nuovo tipo di file, assicurati di fornire l''estensione e lo schema. Queste sono le estensioni standard: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=C'è stato un problema di codifica mentre tentavo di ottenere il percorso dell'applicazione. Non c'è molto che possa fare al riguardo.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=Non sono riuscito ad accedere al file canonico per via di un errore di I/O. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato prima o durante l'operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=Non sono riuscito a ottenere il percorso canonico per via di un errore di I/O. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato prima o durante l'operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=Non sono riuscito a ottenere il percorso canonico progenitore per via di un errore di I/O. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato prima o durante l'operazione di hashing. O forse non ho i permessi necessari per leggere il file.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=Sembra che ''{0}'' sia contrassegnato come obbligatorio nella regola, ma non l''ho trovato nei parametri della direttiva. Assicurati di aggiungerlo come parametro nella direttiva e riprova.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=Non ho potuto valutare uno dei comandi forniti. Questa parte è un po' complicata perché coinvolge aspetti del linguaggio per le espressioni sottostante. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=Non ho potuto valutare il valore di default dell'espressione in uno degli argomenti. Questa parte è un po' complicata perché coinvolge aspetti del linguaggio per le espressioni sottostante. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=Non sono riuscito a valutare lo stato di uscita di uno dei comandi forniti. Questa parte è un po' complicata perché coinvolge aspetti del linguaggio per le espressioni sottostante. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=Non ho potuto valutare la flag di uno degli argomenti. Questa parte è un po' complicata perché coinvolge aspetti del linguaggio per le espressioni sottostante. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_INTERPRETER_NULL_COMMAND=Sono spiacente, ma a quanto pare il risultato di uno dei comandi forniti è un valore nullo. Assicurati che il comando sia valido e riprova.
+ERROR_INTERPRETER_RULE_NOT_FOUND=Non sono riuscito a trovare una regola chiamata ''{0}'' nei percorsi per le regole impostati. Forse una parola scritta sbagliata? Stavo cercando un file con il nome ''{0}.yaml'' nei seguenti percorsi in ordine di priorità: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=Ho trovato queste chiavi sconosciute nella direttiva: {0}. Dovrebbbe essere facile correggere, toglile dalla mappa.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=L'espressione di 'uscita' deve essere sempre un valore booleano (anche se non c'è alcun calcolo nella parte di chiusura). Dovrebbe essere facile correggere: assicurati che l'asserzione del 'type return' sia giusta e riprova.
+ERROR_LANGUAGE_INVALID_CODE=La lingua richiesta non è valida. Al momento, so parlare le seguenti lingue: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=Non ho potuto caricare il database XML di nome ''{0}''. Purtroppo non ho idea del perché sia andata male. Forse il file è stato spostato o cancellato prima o durante l''operazione di lettura. O forse non ho i permessi necessari per leggere il file. Già che ci siamo, assicurati che il file XML sia ben formato.
+ERROR_PARSER_INVALID_PREAMBLE=Mi dispiace, ma non è stato possibile trovare il preambolo ''{0}''. Assicurati che questa chiave esista nel file di configurazione.
+ERROR_PARSER_LOOPS_INVALID_RANGE=Il valore definito nella linea di comando per il massimo numero di cicli ha un intervallo non valido. Assicurati di adoperare un valore 'lungo' e positivo.
+ERROR_PARSER_LOOPS_NAN=Il numero massimo di cicli deve essere specificato come un intero. È facile correggerlo: assicurati di adoperare un valore 'lungo' e positivo.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=Il valore definito nella linea di comando per il timeout in esecuzione non è nell'intervallo valido. Assicurati di adoperare un valore 'lungo' e positivo.
+ERROR_PARSER_TIMEOUT_NAN=Il valore dell'opzione per il timeout in esecuzione deve essere un numero. Assicurati di adoperare un valore 'lungo' e positivo.
+ERROR_PARSERULE_GENERIC_ERROR=Non ho potuto analizzare la regola, qualcosa è andato storto. Questa parte è un po' complicata, perché riguarda aspetti del formato interno di serializzazione dei dati. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_PARSERULE_INVALID_YAML=Non ho potuto analizzare la regola, qualcosa è andato storto. Sembra che il file YAML fornito non sia valido. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=Non sono riuscito a replicare la lista perché manca un argomento per il formato. Penso che si tratti di un numero sbagliato di parametri. Assicurati che il numero di parametri sia corretto e riprova.
+ERROR_RULE_IDENTIFIER_AND_PATH=Ho trovato un errore nella regola ''{0}'' alla posizione ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=Non ho potuto lanciare il comando di sistema richiesto, qualcosa è andato storto. Questa parte è un po' complicata, perché riguarda aspetti del linguaggio interno per le espressioni. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_RUN_INTERRUPTED_EXCEPTION=L'esecuzione del comando di sistema richiesto si è interrotta inaspettatamente. Forse un'interruzione esterna ha forzato il comando a terminare.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=Il comando di sistema richiesto ha restituito un valore di uscita non valido.
+ERROR_RUN_IO_EXCEPTION=L'esecuzione del comando di sistema è fallita per via di un errore di I/O. Sei sicuro che il programma esista nei tuoi percorsi? Meglio controllare se il programma è davvero disponibile.
+ERROR_RUN_TIMEOUT_EXCEPTION=L'esecuzione del comando di sistema ha raggiunto il valore di timeout impostato ed è stata interrotta. Se il tempo è troppo breve, assicurati di impostarne uno più lungo.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=Il valore di timeout probabilmente manca (sebbene il timeout sia abilitato). È facile correggerlo: assicurati di adoperare un valore 'lungo' e positivo.
+ERROR_SAVE_COULD_NOT_SAVE_XML=Non ho potuto salvare il database XML con il nome ''{0}''. Purtroppo non ho idea del perché sia successo. Forse non ho i permessi appropriati per scrivere il file XML sul disco.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=Il metodo ''obtain'' ha trovato una chiave sconosciuta ''{0}'' nell''ambito della sessione. Non posso ottenere qualcosa che non ho da nessuna parte. Specifica una chiave valida e riprova.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=Il metodo ''remove'' ha trovato una chiave sconosciuta ''{0}'' nell''ambito della sessione. Non posso ottenere qualcosa che non ho da nessuna parte. Specifica una chiave valida e riprova.
+ERROR_TRIGGER_ACTION_NOT_FOUND=Non ho trovato l''azione ''trigger'' ''{0}''. Da'' un''occhiata alla lista dei ''trigger'' disponibili e riprova.
+ERROR_TRIGGER_CALL_EXCEPTION=Non ho potuto eseguire l''azione ''trigger'' ''{0}''. Qualcosa è andata proprio storta.
+ERROR_VALIDATE_EMPTY_FILES_LIST=Ho letto la direttiva {0}, ma la lista ''files'' fornita è vuota. Puoi correggerlo facilmente assicurandoti che la lista abbia almeno un elemento, poi riprova.
+ERROR_VALIDATE_FILE_IS_RESERVED=Ho letto la direttiva {0} dove è stata usata la chiave ''file''. Questa chiave è riservata e non puoi usarla. Non preoccuparti, lo metti facilmente a posto dando un altro nome.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=Ho letto la direttiva {0} e ho scoperto che ''files'' richiede una lista. Assicurati di correggere il tipo a una lista appropriata e riprova.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=Ho visto nel file fornito la direttiva {0} che non è valida. Assicurati di correggere la direttiva e riprova.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=Sembra che nel file fornito non ci siano direttive. Assicurati che ce ne sia almeno una e riprova.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Sembra che ci sia un fine riga che lascia orfana una direttiva alla riga {0}. Non posso andare avanti. Correggi la direttiva e riprova.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=Ho letto la direttiva {0} dove è stata usata la chiave ''reference''. Questa chiave è riservata e non puoi usarla. Non preoccuparti, lo metti facilmente a posto dando un altro nome.
+ERROR_VALIDATE_YAML_EXCEPTION=C''è stato un problema con la mappa YAML fornita con la direttiva {0}. Questa parte è un po'' complicata, perché riguarda aspetti del formato interno di serializzazione dei dati. Farò del mio meglio per darti una mano, per quanto posso.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=L''identificatore dell''argomento ''{0}'' è riservato, quindi non puoi adoperarlo. È facile correggerlo: chiamalo in modo diverso.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=Non ho potuto trovare la lista degli argomenti. La lista mi serve anche se è vuota. Correggi e riprova.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Sembra che tu abbia identificatori di argomenti duplicati nella tua regola. Correggi e riprova.
+ERROR_VALIDATEBODY_MISSING_KEYS=Quando si definisce un ambito per l'argomento in una regola bisogna adoperare almeno 'flag' o 'default'. Assicurati che ci sia uno di questi.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=Ho trovato che uno degli argomenti non ha identificatore. Assicurati di assegnare un identificatore all'argomento e riprova.
+ERROR_VALIDATEBODY_NULL_COMMAND=Ho trovato un comando 'nullo' nella regola fornita. Dovrebbe essere facile correggere: aggiungi un comando valido alla regola.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=Mi serve una lista di comandi. Specificala e riprova.
+ERROR_VALIDATEHEADER_NULL_ID=La regola fornita non ha un identificatore. Quest'informazione è cruciale, assicurati di sistemarla e riprova. L'identificatore deve avere lo stesso nome della regola (senza estensione, ovviamente).
+ERROR_VALIDATEHEADER_NULL_NAME=La regola fornita non ha nome. È facile correggere: specifica un nome valido e riprova.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=La regola ha un identificatore sbagliato. Mi sarei aspettato ''{0}'', ma ho trovato ''{1}''. È facile correggere: correggi l''identificatore sbagliato con quello giusto.
+ERROR_VELOCITY_FILE_NOT_FOUND=Il motore per i 'template' non è riuscito a trovare il file di input richiesto. Assicurati che la posizione del file sia giusta e riprova.
+ERROR_VELOCITY_PARSE_EXCEPTION=C'è stato un errore durante l'analisi del file di input indicato. Assicurati che il file segua le specifiche del Velocity Template Language (VTL) e riprova.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=Il file di input indicato ha un errore nella chiamata del metodo. Assicurati che il file segua le specifiche del Velocity Template Language (VTL) e riprova.
+ERROR_VELOCITY_IO_EXCEPTION=Il motore per i 'template' non è riuscito a scrivere il file di output. Assicurati che il percorso abbia i permessi appropriati e riprova.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=Ci sono altri dettagli riguardo a questa eccezione:
+INFO_DISPLAY_EXECUTION_TIME=Totale: {0} secondi
+INFO_DISPLAY_FILE_INFORMATION=Elaborazione ''{0}'' (totale: {1}, modificato il: {2}), attendere.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Sto per lanciare: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Sebbene stia eseguendo in modo 'dry-run', questo elemento è sempre elaborato perché è un 'trigger'. Nota che gli effetti di un 'trigger' possono influenzare l'esecuzione.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=Questo elemento è un 'trigger' generato nell'ambito della regola. Nota che gli effetti di un 'trigger' possono influenzare l'esecuzione.
+INFO_LABEL_AUTHOR=Autore:
+INFO_LABEL_AUTHORS=Autori:
+INFO_LABEL_CONDITIONAL=Condizionale:
+INFO_LABEL_NO_AUTHORS=Nessun autore specificato
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=ERROR
+INFO_LABEL_ON_FAILURE=FAILURE
+INFO_LABEL_ON_SUCCESS=SUCCESS
+INFO_LABEL_UNNAMED_TASK=Compito senza nome
+INFO_PARSER_ALL_RIGHTS_RESERVED=Tutti i diritti riservati
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=procedi lungo tutte le fasi dell'esecuzione di un comando, ma senza chiamarne alcuno in modo effettivo
+INFO_PARSER_HELP_DESCRIPTION=mostra il messaggio di aiuto
+INFO_PARSER_LANGUAGE_DESCRIPTION=imposta la lingua del programma
+INFO_PARSER_LOG_DESCRIPTION=genera un file di log
+INFO_PARSER_LOOPS_DESCRIPTION=imposta il massimo numero di cicli
+INFO_PARSER_NOTES=Questo programma usa le seguenti librerie e le rispettive licenze: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: licenza duale con EPL 1.0 and LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, e ZT-Exec: Apache 2.0. Per ultimo e non ultimo, arara stesso è rilasciato in accordo con la licenza New BSD.
+INFO_PARSER_ONLY_HEADER=estrai le direttive solo nel 'file header'
+INFO_PARSER_PREAMBLE_DESCRIPTION=imposta il preambolo del file sulla base del file di configurazione
+INFO_PARSER_SILENT_MODE_DESCRIPTION=nascondi l'output del comando
+INFO_PARSER_TIMEOUT_DESCRIPTION=imposta il timeout di esecuzione (in millisecondi)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=mostra l'outout del comando
+INFO_PARSER_VERSION_DESCRIPTION=mostra la versione dell'applicazione
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_DIRECTIVES_BLOCK=DIRECTIVES
+LOG_INFO_END_BUFFER=END OUTPUT BUFFER
+LOG_INFO_INTERPRET_RULE=Sono pronto a interpretare la regola ''{0}''.
+LOG_INFO_INTERPRET_TASK=Sono pronto a interpretare il compito ''{0}'' della regola ''{1}''.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=Ho trovato una potenziale direttiva: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=Ho trovato un potenziale schema alla riga {0}: {1}
+LOG_INFO_RULE_LOCATION=Posizione della regola: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=Comando di sistema: {0}
+LOG_INFO_TASK_RESULT=Risultato del compito:
+LOG_INFO_VALIDATED_DIRECTIVES=Tutte le direttive erano valide. Pronti a partire.
+LOG_INFO_WELCOME_MESSAGE=Benvenuto in arara {0} (revisione {1})!
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_nl.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_nl.properties
new file mode 100644
index 00000000000..9403078b981
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_nl.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: Dutch
+# Translators: Marijn Schraagen
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=De ''basename''-methode vereist een bestand, geen directory. Het lijkt erop dat ''{0}'' geen bestand is. Als je taken wil uitvoeren met een directory kan je een aantal methodes uit de Java API gebruiken.
+ERROR_CALCULATEHASH_IO_EXCEPTION=Om een of andere reden kan ik de hash niet berekenen. Ik weet niet waarom het precies fout ging. Misschien is het bestand verplaatst of verwijderd voor of tijdens de hashing, of misschien heb ik niet de juiste rechten om het bestand te lezen.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=Het lijkt erop dat ''{0}'' geen boolean-waarde is. Dit zou makkelijk op te lossen moeten zijn. Gebruik een geldige representatie voor een boolean (yes en no, true en false, 1 en 0, on en off).
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=Ik kon het besturingssysteem niet achterhalen. De opgegeven waarde ''{0}'' staat niet in mijn lijst van geldige besturingssystemen (ik kan het natuurlijk mishebben). Controleer de waarde alsjeblieft en probeer het opnieuw.
+ERROR_CHECKREGEX_IO_EXCEPTION=Ik kon de inhoud van het bestand ''{0}'' niet lezen vanwege een IO-fout. Ik weet niet waarom het precies fout ging. Misschien is het bestand verplaatst of verwijderd voor of tijdens de leesoperatie, of misschien heb ik niet de juiste rechten om het bestand te lezen.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=Een van de elementen in de 'filetypes'-lijst in het configuratiebestand heeft geen 'extension'. Helaas kan ik een nieuw bestandstype niet gebruiken als de extensie niet bekend is. Dit zou makkelijk op te lossen moeten zijn: voeg een extensie toe en probeer het opnieuw.
+ERROR_CONFIGURATION_GENERIC_ERROR=Ik kon het configuratiebestand niet verwerken, er is iets verkeerd gegaan. Dit probleem is ingewikkeld, omdat het te maken heeft met aspecten van de onderliggende serialisatiesyntax. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_CONFIGURATION_INVALID_YAML=Ik kon het configuratiebestand niet verwerken, er is iets verkeerd gegaan. Het lijkt erop dat het YAML-bestand een fout bevat. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=De waarde gedefinieerd in de 'loops'-optie in het configuratiebestand om het maximumaantal herhalingen te specificeren heeft een ongeldig bereik. Geef alsjeblieft een positieve long integer-waarde op.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=Ik kon het opgegeven bestand ''{0}'' {1} niet vinden. Zorg ervoor dat het bestand bestaat en dat het een geldige extensie heeft.
+ERROR_EVALUATE_COMPILATION_FAILED=Om een of andere reden kon ik de expressie in de opgegeven voorwaarde niet compileren. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=De evaluatie van de voorwaarde verwachtte een boolean als resultaat. Dit zou makkelijk op te lossen moeten zijn. Zorg ervoor dat de evaluatie uiteindelijk een boolean oplevert.
+ERROR_EXTRACTOR_IO_ERROR=Er was een IO-probleem bij het verwerken van de directives. Ik weet niet waarom het precies fout ging. Misschien is het bestand verplaatst of verwijderd voor of tijdens het hashen, of misschien heb ik niet de juiste rechten om het bestand te lezen.
+ERROR_FILETYPE_NOT_A_FILE=De ''filetype''-methode vereist een bestand, geen directory. Het lijkt erop dat ''{0}'' geen bestand is. Als je taken wil uitvoeren met een directory kan je een aantal methodes uit de Java API gebruiken.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=De extensie ''{0}'' is niet herkend als een standaardextensie. Als je een nieuw bestandstype wil definiëren zorg dan dat de extensie en het patroon zijn opgegeven. De volgende extensies zijn standaard: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=Er was een coderingsprobleem bij het verkrijgen van het applicatiepad. Daar kan ik niet zo veel aan doen.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=Ik kon het canonical-pad niet lezen vanwege een IO-fout. Ik weet niet waarom het precies fout ging. Misschien is het bestand verplaatst of verwijderd, of misschien heb ik niet de juiste rechten om het bestand te lezen.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=Ik kon het canonical-bestand niet lezen vanwege een IO-fout. Ik weet niet waarom het precies fout ging. Misschien is het bestand verplaatst of verwijderd, of misschien heb ik niet de juiste rechten om het bestand te lezen.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=Ik kon het canonical ouderpad niet lezen vanwege een IO-fout. Ik weet niet waarom het precies fout ging. Misschien is het pad veranderd, of misschien heb ik niet de juiste leesrechten.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=Het argument ''{0}'' is gemarkeerd als verplicht in de regel, maar ik kon het niet vinden in de parameters van de directive. Zorg ervoor dat het als parameter voor de directive wordt toegevoegd en probeer het opnieuw.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=Ik kon een van de opgegeven opdrachten niet evalueren. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=Ik kon de standaardwaarde van een van de argumenten niet evalueren. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=Ik kon de exitwaardemelding van een van de opgegeven opdrachten niet evalueren. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=Ik kon de optie-expressie van een van de argumenten niet evalueren. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_INTERPRETER_NULL_COMMAND=Het spijt me, maar een van de opgegeven opdrachten heeft een null-waarde teruggegeven. Zorg ervoor dat de opdracht valide is en probeer het opnieuw.
+ERROR_INTERPRETER_RULE_NOT_FOUND=Ik kon de regel met de naam ''{0}'' niet vinden in de opgegeven regelpaden. Misschien een spelfout? Ik heb geprobeerd het bestand ''{0}.yaml'' te vinden in de volgende paden in volgorde van prioriteit: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=Ik heb de volgende onbekende verwijzingen gevonden in de directive: {0}. Dit zou makkelijk op te lossen moeten zijn: verwijder deze uit de verwijzingstabel.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=De 'exit'-expressie moet altijd een boolean waarde teruggeven (zelfs als er geen berekening heeft plaatsgevonden). Dit zou makkelijk op te lossen moeten zijn: pas het type van de return-regel aan en probeer het opnieuw.
+ERROR_LANGUAGE_INVALID_CODE=De opgegeven taalcode is ongeldig. Op het moment accepteer ik de volgende talen: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=Ik kon de XML-database met de naam ''{0}'' niet laden. Ik weet niet waarom het precies fout ging. Misschien was het bestand verplaatst of verwijderd tijdens de leesoperatie. Of misschien heb ik niet de juiste rechten om het bestand te lezen. Overigens: zorg ervoor dat het XML-bestand welgevormd is.
+ERROR_PARSER_INVALID_PREAMBLE=Het spijt me, maar de preamble ''{0}'' is niet gevonden. Zorg ervoor dat deze verwijzing bestaat in het configuratiebestand.
+ERROR_PARSER_LOOPS_INVALID_RANGE=De waarde gedefinieerd in de opdrachtregel voor het maximumaantal herhalingen heeft een ongeldig bereik. Geef alsjeblieft een positieve long integer-waarde op.
+ERROR_PARSER_LOOPS_NAN=De optie voor het maximumaantal herhalingen verwacht een getal als argument. Dit zou makkelijk op te lossen moeten zijn. Zorg ervoor dat je een positieve long integer-waarde opgeeft.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=De maximum uitvoeringsduur zoals opgegeven op de opdrachtregel heeft een ongeldige waarde. Zorg ervoor dat je een positieve long integer-waarde opgeeft.
+ERROR_PARSER_TIMEOUT_NAN=De optie voor maximum uitvoeringsduur verwacht een getal als argument. Dit zou makkelijk op te lossen moeten zijn. Zorg ervoor dat je een positieve long integer-waarde opgeeft.
+ERROR_PARSERULE_GENERIC_ERROR=Ik kon de regel niet verwerken, er is iets verkeerd gegaan. Dit probleem is ingewikkeld, omdat het te maken heeft met aspecten van de onderliggende dataserialisatiesyntax. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_PARSERULE_INVALID_YAML=Ik kon de regel niet verwerken, er is iets verkeerd gegaan. Het lijkt erop dat het YAML-bestand ongeldig is. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=Ik kon de lijst niet genereren vanwege een ontbrekend format-argument. Ik denk dat er minder (of meer) parameters zijn dan verwacht. Geef het juiste aantal argumenten op en probeer het opnieuw.
+ERROR_RULE_IDENTIFIER_AND_PATH=Ik heb een fout gevonden in regel ''{0}'' op positie ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=Ik kon het opgegeven systeemcommando niet uitvoeren, er is iets misgegaan. Dit is een ingewikkeld probleem, omdat het te maken heeft met aspecten van de onderliggende expressietaal. Ik zal mijn best doen om je zoveel mogelijk hiermee te helpen.
+ERROR_RUN_INTERRUPTED_EXCEPTION=Het uitvoeren van het opgegeven systeemcommando is onverwacht onderbroken. Misschien was er een externe onderbreking die ervoor gezorgd heeft dat het commando gestopt is.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=Het opgegeven systeemcommando heeft een ongeldige exit-waarde teruggegeven.
+ERROR_RUN_IO_EXCEPTION=Het uitvoeren van het systeemcommando is mislukt vanwege een IO-fout. Weet je zeker dat het commando bestaat in het pad? Het is misschien een goed idee om het pad te controleren en te kijken of het commando beschikbaar is.
+ERROR_RUN_TIMEOUT_EXCEPTION=Het uitvoeren van het systeemcommando is onderbroken omdat de maximale uitvoeringsduur overschreden is. Als de tijd te kort was, pas dan de maximale uitvoeringsduur aan.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=De maximale uitvoeringsduur ontbreekt (hoewel deze optie wel actief is). Dit zou makkelijk op te lossen moeten zijn. Zorg ervoor dat je een positieve long integer-waarde opgeeft.
+ERROR_SAVE_COULD_NOT_SAVE_XML=Ik kon de XML-database met de naam ''{0}'' niet opslaan. Ik weet niet precies waarom het fout ging. Misschien heb ik niet de juiste schrijfrechten om het XML-bestand op te slaan.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=De ''obtain''-methode heeft een onbekende verwijzing gevonden in de sessie: ''{0}''. Als ik iets niet heb kan ik het ook niet gebruiken. Geef een bestaande verwijzing op en probeer het opnieuw.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=De ''remove''-methode heeft een onbekende verwijzing gevonden in de sessie: ''{0}''. Als ik iets niet heb kan ik het ook niet verwijderen. Geef een bestaande verwijzing op en probeer het opnieuw.
+ERROR_TRIGGER_ACTION_NOT_FOUND=De trigger-actie ''{0}'' is niet gevonden. Controleer de lijst met beschikbare triggers en probeer het opnieuw.
+ERROR_TRIGGER_CALL_EXCEPTION=De trigger-actie ''{0}'' kon niet worden aangeroepen. Er is iets misgegaan.
+ERROR_VALIDATE_EMPTY_FILES_LIST=Ik heb een directive {0} gelezen en kwam erachter dat de opgegeven ''files''-lijst leeg is. Dit zou makkelijk op te lossen moeten zijn: zorg ervoor dat de lijst tenminste een element heeft en probeer het opnieuw.
+ERROR_VALIDATE_FILE_IS_RESERVED=Ik heb een directive {0} gelezen en kwam erachter dat de verwijzing ''file'' gebruikt is. Deze verwijzing is gereserveerd, dus je kan het niet gebruiken. Maar maak je geen zorgen, dit zou makkelijk op te lossen moeten zijn: gebruik een andere naam.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=Ik heb een directive {0} gelezen en kwam erachter dat ''files'' een lijst nodig heeft. Zorg dat je het type aanpast naar een lijst en probeer het opnieuw.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=Ik heb een ongeldige directive {0} gevonden in het opgegeven bestand. Pas de directive aan en probeer het opnieuw.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=Er zijn geen directives gevonden in het opgegeven bestand. Zorg ervoor dat er tenminste een directive in het bestand staat en probeer het opnieuw.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Er is een ongeldig directive-regeleinde in regel {0}. Ik kan niet verder. Pas de directive aan en probeer het opnieuw.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=Ik heb een directive {0} gelezen en kwam erachter dat de verwijzing ''reference'' gebruikt is. Deze verwijzing is gereserveerd, en kan dus niet gebruikt worden. Maar maak je geen zorgen, dit zou makkelijk op te lossen moeten zijn: gebruik een andere naam.
+ERROR_VALIDATE_YAML_EXCEPTION=Er is een probleem met de opgegeven YAML-omzetting in directive {0}. Dit probleem is ingewikkeld, omdat het te maken heeft met aspecten van de onderliggende serialisatiesyntax.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=De argumentverwijzing ''{0}'' is gereserveerd, en kan dus niet gebruikt worden. Dit zou makkelijk op te lossen moeten zijn: gebruik een andere naam.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=Ik kon de lijst met argumenten niet vinden. Ik heb de lijst nodig, zelfs als deze leeg is. Pas dit aan en probeer het opnieuw.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Blijkbaar zijn er dubbele argumentnamen in de regel. Pas dit aan en probeer het opnieuw.
+ERROR_VALIDATEBODY_MISSING_KEYS=Bij het definiëren van het argumentbereik van een regel moet tenminste 'flag' of 'default' worden gebruikt. Zorg ervoor dat je in ieder geval een van deze gebruikt.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=Ik kwam erachter dat een van de argumenten geen verwijsnaam heeft. Zorg ervoor dat een geldige naam aan het argument wordt toegewezen en probeer het opnieuw.
+ERROR_VALIDATEBODY_NULL_COMMAND=Ik heb een null-opdracht in de opgegeven regel gevonden. Dit zou makkelijk op te lossen moeten zijn: geef een geldige opdracht op voor deze regel.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=Ik heb een lijst opdrachten nodig. Pas dit aan en probeer het opnieuw.
+ERROR_VALIDATEHEADER_NULL_ID=De opgegeven regel heeft geen verwijsnaam. Dit is cruciale informatie, pas dit aan en probeer het opnieuw. Zorg ervoor dat de naam hetzelfde is als de bestandsnaam (zonder extensie).
+ERROR_VALIDATEHEADER_NULL_NAME=De opgegeven regel heeft geen naam. Dit zou makkelijk op te lossen moeten zijn: geef een geldige naam op en probeer het opnieuw.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=De regel heeft een verkeerde verwijsnaam. Ik verwachtte ''{0}'', maar vond ''{1}''. Dit zou makkelijk op te lossen moeten zijn: vervang de verkeerde verwijsnaam met de correcte naam.
+ERROR_VELOCITY_FILE_NOT_FOUND=De template-verwerking kon het opgegeven invoerbestand niet vinden. Zorg dat de locatie correct is en probeer het opnieuw.
+ERROR_VELOCITY_PARSE_EXCEPTION=Er was een parseerfout in het opgegeven invoerbestand. Zorg dat het bestand voldoet aan de specificatie van de Velocity Template Language (VLT) en probeer het opnieuw.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=Er was een fout in een methode-aanroep in het opgegeven invoerbestand. Zorg dat het bestand voldoet aan de specificatie van de Velocity Template Language (VLT) en probeer het opnieuw.
+ERROR_VELOCITY_IO_EXCEPTION=De template-verwerking kon niet naar het uitvoerbestand schrijven. Zorg ervoor dat het pad de juiste permissies heeft en probeer het opnieuw.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=Er zijn meer details beschikbaar voor deze exception:
+INFO_DISPLAY_EXECUTION_TIME=Totaal: {0} seconden
+INFO_DISPLAY_FILE_INFORMATION=Verwerken van ''{0}'' (grootte: {1}, laatst gewijzigd: {2}), een ogenblik geduld.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Begin met uitvoeren: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Ondanks het uitvoeren in dry-runmodus wordt dit onderdeel altijd uitgevoerd omdat het een trigger is. Merk op dat de effecten van een trigger de huidige uitvoering kunnen beïnvloeden.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=Dit onderdeel is een trigger die binnen het bereik van de regel valt. Merk op dat de effecten van een trigger de huidige uitvoering kunnen beïnvloeden.
+INFO_LABEL_AUTHOR=Auteur:
+INFO_LABEL_AUTHORS=Auteurs:
+INFO_LABEL_CONDITIONAL=Voorwaarde:
+INFO_LABEL_NO_AUTHORS=Geen auteurs opgegeven
+INFO_LABEL_ON_DETAILS=DETAILS
+INFO_LABEL_ON_ERROR=FOUT
+INFO_LABEL_ON_FAILURE=MISLUKT
+INFO_LABEL_ON_SUCCESS=SUCCESVOL
+INFO_LABEL_UNNAMED_TASK=Naamloze taak
+INFO_PARSER_ALL_RIGHTS_RESERVED=Alle rechten voorbehouden
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=Controleer alle onderdelen van een opdracht, maar voer niets uit
+INFO_PARSER_HELP_DESCRIPTION=toon het hulpbericht
+INFO_PARSER_LANGUAGE_DESCRIPTION=stel de applicatietaal in
+INFO_PARSER_LOG_DESCRIPTION=genereer een loguitvoer
+INFO_PARSER_LOOPS_DESCRIPTION=stel het maximumaantal herhalingen in
+INFO_PARSER_NOTES=Deze applicatie gebruikt de volgende libraries en hun respectievelijke licenties: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: dubbele licentie met EPL 1.0 en LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. Als laatste is arara zelf uitgebracht onder de New BSD licentie.
+INFO_PARSER_ONLY_HEADER=lees directives alleen in de bestandsheader
+INFO_PARSER_PREAMBLE_DESCRIPTION=stel de preamble in op basis van het configuratiebestand
+INFO_PARSER_SILENT_MODE_DESCRIPTION=dempt de opdrachtuitvoer
+INFO_PARSER_TIMEOUT_DESCRIPTION=stel de maximale uitvoeringsduur in (in milliseconden)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=toon de opdrachtuitvoer
+INFO_PARSER_VERSION_DESCRIPTION=toon de applicatieversie
+LOG_INFO_BEGIN_BUFFER=OPEN UITVOER
+LOG_INFO_DIRECTIVES_BLOCK=DIRECTIVES
+LOG_INFO_END_BUFFER=SLUIT UITVOER
+LOG_INFO_INTERPRET_RULE=Ik ben klaar om regel ''{0}'' te verwerken.
+LOG_INFO_INTERPRET_TASK=Ik ben klaar om taak ''{0}'' uit regel ''{1}'' te verwerken.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=Ik heb een mogelijke directive gevonden: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=Ik heb een mogelijk patroon gevonden in regel {0}: {1}
+LOG_INFO_RULE_LOCATION=Regellocatie: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=Systeemopdracht: {0}
+LOG_INFO_TASK_RESULT=Taakresultaat:
+LOG_INFO_VALIDATED_DIRECTIVES=Alle directives zijn gevalideerd, we kunnen beginnen.
+LOG_INFO_WELCOME_MESSAGE=Welkom bij arara {0} (revisie {1})!
diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_pt_BR.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_pt_BR.properties
new file mode 100644
index 00000000000..272a2f3ce9b
--- /dev/null
+++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/messages_pt_BR.properties
@@ -0,0 +1,149 @@
+# Arara, the cool TeX automation tool
+# Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the project's author nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ---------------------------------------------------------------------
+# Language: Brazilian Portuguese
+# Translators: Paulo Roberto Massa Cereda
+# ---------------------------------------------------------------------
+
+ERROR_BASENAME_NOT_A_FILE=O método ''basename'' requer um arquivo, não um diretório. Observe que ''{0}'' não parece ser um arquivo. Se você precisa realizar alguma tarefa em um diretório, experimente os métodos disponíveis na API Java.
+ERROR_CALCULATEHASH_IO_EXCEPTION=Por alguma razão, eu não pude calcular o hash. Não tenho ideia porque não deu certo. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de hash. Ou talvez eu não tenha as permissões corretas para leitura do arquivo.
+ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN=Observe que ''{0}'' não é um valor lógico. Isso é fácil de resolver. Certifique-se de usar uma palavra válida que represente valores lógicos (''yes'' e ''no'', ''true'' e ''false'', ''1'' e ''0'', e ''on'' e ''off'').
+ERROR_CHECKOS_INVALID_OPERATING_SYSTEM=Não consegui descobrir qual é o seu sistema operacional. O valor ''{0}'' não parece ser uma entrada válida de sistema operacional na minha lista (Eu posso também estar errado, é claro). Por favor, corrija o valor e tente novamente.
+ERROR_CHECKREGEX_IO_EXCEPTION=Não consegui ler o conteúdo do arquivo ''{0}'', houve um erro de entrada e saída. Não tenho ideia porque não deu certo. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de leitura. Ou talvez eu não tenha as permissões corretas para leitura do arquivo.
+ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION=Uma de suas entradas na lista de 'filetypes' no arquivo de configuração não tem a chave 'extension'. Infelizmente, eu não posso definir um novo tipo de arquivo se a extensão correspondente não é informada. Isso é fácil de resolver: adicione uma nova extensão e tente novamente.
+ERROR_CONFIGURATION_GENERIC_ERROR=Não consegui analisar o arquivo de configuração, alguma coisa de errado aconteceu. Esta parte é complicada, pois envolve aspectos do formato de serialização de dados subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_CONFIGURATION_INVALID_YAML=Não consegui analisar o arquivo de configuração, alguma coisa de errado aconteceu. Aparentemente, o arquivo YAML especificado é inválido. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_CONFIGURATION_LOOPS_INVALID_RANGE=O valor definido na chave 'loops' no arquivo de configuração, que define o número máximo de iterações, possui um intervalo inválido. Por favor, certifique-se de especificar um valor inteiro positivo.
+ERROR_DISCOVERFILE_FILE_NOT_FOUND=Não consegui encontrar o arquivo especificado ''{0}'' {1}. Por favor, certifique-se de que o arquivo existe e que possui uma extensão válida.
+ERROR_EVALUATE_COMPILATION_FAILED=Por alguma razão, eu não consegui compilar a expressão condicional especificada. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_EVALUATE_NOT_BOOLEAN_VALUE=A avaliação da expressão condicional deveria retornar um valor lógico como resultado. Isso é fácil de resolver. Apenas certifique-se de que a avaliação da expressão condicional retorne um valor lógico no final.
+ERROR_EXTRACTOR_IO_ERROR=Ocorreu um erro de entrada e saída enquanto eu tentava extrair as diretivas. Não tenho ideia porque não deu certo. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de extração. Ou talvez eu não tenha as permissões corretas para leitura do arquivo.
+ERROR_FILETYPE_NOT_A_FILE=O método ''filetype'' requer um arquivo, não um diretório. Observe que ''{0}'' não parece ser um arquivo. Se você precisa realizar alguma tarefa em um diretório, experimente os métodos disponíveis na API Java.
+ERROR_FILETYPE_UNKNOWN_EXTENSION=Não consegui reconhecer ''{0}'' como uma extensão padrão. Se você quiser definir um novo tipo de arquivo, certifique-se de especificar a extensão e o padrão. Estas são as extensões definidas por padrão: {1}
+ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION=Houve um problema de codificação enquanto eu tentava obter o caminho da aplicação. Não há muito o que eu possa fazer sobre isso.
+ERROR_GETCANONICALFILE_IO_EXCEPTION=Não consegui obter o arquivo canônico por causa de um erro de entrada e saída. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de busca. Ou talvez eu não tenha as permissões corretas.
+ERROR_GETCANONICALPATH_IO_EXCEPTION=Não consegui obter o caminho canônico por causa de um erro de entrada e saída. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de busca. Ou talvez eu não tenha as permissões corretas.
+ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION=Não consegui obter o caminho canônico ascendente por causa de um erro de entrada e saída. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de busca. Ou talvez eu não tenha as permissões corretas.
+ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED=Parece que o argumento ''{0}'' está marcado como obrigatório na regra, mas eu não consegui encontrá-lo nos parâmetros da diretiva correspondente. Por favor, certifique-se de adicioná-lo como parâmetro em sua diretiva e tente novamente.
+ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR=Não consegui avaliar um dos comandos disponibilizados. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR=Não consegui avaliar a expressão associada ao valor padrão de um dos argumentos. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_INTERPRETER_EXIT_RUNTIME_ERROR=Não consegui avaliar a expressão associada ao código de saída de um dos comandos disponibilizados. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION=Não consegui avaliar a expressão associada à presença de um dos argumentos. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_INTERPRETER_NULL_COMMAND=Sinto muito, mas, aparentemente, um dos comandos disponibilizados retornou um valor nulo. Por favor, certifique-se de que o comando é válido e tente novamente.
+ERROR_INTERPRETER_RULE_NOT_FOUND=Não consegui encontrar uma regra chamada ''{0}'' nos caminhos de regras especificados. Talvez uma palavra digitada incorretamente? Eu estava procurando por um arquivo chamado ''{0}.yaml'' nos seguintes caminhos, em ordem de prioridade: {1}
+ERROR_INTERPRETER_UNKNOWN_KEYS=Encontrei as seguintes chaves desconhecidas na diretiva: {0}. Isso é fácil de resolver, apenas remova essas chaves do seu mapa.
+ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN=A expressão 'exit' referente ao código de saída deve sempre retornar um valor lógico (mesmo se não há computação propriamente dita). Isso é fácil de resolver: apenas certifique-se de corrigir o tipo de retorno e tente novamente.
+ERROR_LANGUAGE_INVALID_CODE=O código de idioma especificado é inválido. No momento, eu sei falar os seguintes idiomas: {0}
+ERROR_LOAD_COULD_NOT_LOAD_XML=Não consegui carregar o banco de dados XML chamado ''{0}''. Não tenho ideia porque não deu certo. Talvez o arquivo tenha sido movido ou removido antes ou durante a operação de leitura. Ou talvez eu não tenha as permissões corretas para leitura do arquivo. A propósito, certifique-se de que o arquivo XML esteja correto.
+ERROR_PARSER_INVALID_PREAMBLE=Sinto muito, mas o preâmbulo ''{0}'' não foi encontrado. Por favor, certifique-se de que esta chave existe no arquivo de configuração.
+ERROR_PARSER_LOOPS_INVALID_RANGE=O valor definido na linha de comando para o número máximo de iterações possui um intervalo inválido. Por favor, certifique-se de especificar um valor inteiro positivo.
+ERROR_PARSER_LOOPS_NAN=A opção referente ao número máximo de iterações requer, é claro, um número como argumento. Isso é fácil de resolver. Apenas certifique-se de especificar um valor inteiro positivo.
+ERROR_PARSER_TIMEOUT_INVALID_RANGE=O valor definido na linha de comando para o timeout de execução possui um intervalo inválido. Por favor, certifique-se de especificar um valor inteiro positivo.
+ERROR_PARSER_TIMEOUT_NAN=A opção referente ao timeout de execução requer um número como argumento. Isso é fácil de resolver. Apenas certifique-se de especificar um valor inteiro positivo.
+ERROR_PARSERULE_GENERIC_ERROR=Não consegui analisar a regra, alguma coisa de errado aconteceu. Esta parte é complicada, pois envolve aspectos do formato de serialização de dados subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_PARSERULE_INVALID_YAML=Não consegui analisar a regra, alguma coisa de errado aconteceu. Aparentemente, o arquivo YAML especificado é inválido. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION=Não consegui replicar a lista por causa de um formato de argumento faltante. Meu palpite é que existem menos (ou mais) parâmetros do que o esperado. Certifique-se de corrigir o número de parâmetros e tente novamente.
+ERROR_RULE_IDENTIFIER_AND_PATH=Encontrei um erro na regra ''{0}'' localizada em ''{1}''.
+ERROR_RUN_GENERIC_EXCEPTION=Não consegui executar o comando de sistema disponibilizado, alguma coisa de errado aconteceu. Esta parte é complicada, pois envolve aspectos da linguagem de expressão subjacente. Eu farei o possível para te ajudar da melhor forma que puder.
+ERROR_RUN_INTERRUPTED_EXCEPTION=A execução do comando de sistema disponibilizado foi inesperadamente interrompida. Talvez tenha ocorrido uma interrupção externa que forçou o comando a encerrar abruptamente.
+ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION=A execução do comando de sistema retornou um código de saída inválido.
+ERROR_RUN_IO_EXCEPTION=A execução do comando de sistema falhou por causa de um erro de entrada e saída. Você tem certeza de que o comando de sistema especificado existe no seu caminho? Pode ser uma boa ideia verificar o caminho do sistema e confirmar se o comando realmente está disponível.
+ERROR_RUN_TIMEOUT_EXCEPTION=A execução do comando de sistema atingiu o timeout especificado e foi abortada. Se o tempo foi muito curto, certifique-se de especificar um valor maior.
+ERROR_RUN_TIMEOUT_INVALID_RANGE=O valor de timeout provavelmente está faltando (apesar de estar habilitado). Isso é fácil de resolver. Por favor, certifique-se de especificar um valor positivo inteiro.
+ERROR_SAVE_COULD_NOT_SAVE_XML=Não consegui salvar o banco de dados XML chamado ''{0}''. Não tenho ideia porque não deu certo. Talvez eu não tenha as permissões corretas para escrever o arquivo XML no disco.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=O método ''obtain'' encontrou a chave desconhecida ''{0}'' no escopo de sessão. Não posso obter um valor que não existe na sessão. Por favor, especifique uma chave válida e tente novamente.
+ERROR_SESSION_REMOVE_UNKNOWN_KEY=O método ''remove'' encontrou a chave desconhecida ''{0}'' no escopo de sessão. Não posso remover um valor que não existe na sessão. Por favor, especifique uma chave válida e tente novamente.
+ERROR_TRIGGER_ACTION_NOT_FOUND=A ação de gatilho ''{0}'' não foi encontrada. Certifique-se de consultar a lista de gatilhos disponíveis e tente novamente.
+ERROR_TRIGGER_CALL_EXCEPTION=A ação de gatilho ''{0}'' não pôde ser executada. Alguma coisa de errado aconteceu.
+ERROR_VALIDATE_EMPTY_FILES_LIST=Li uma diretiva {0} e descobri que a lista ''files'' especificada está vazia. Isso é fácil de resolver: certifique-se de que a lista possua, pelo menos, um elemento e tente novamente.
+ERROR_VALIDATE_FILE_IS_RESERVED=Li uma diretiva {0} e descobri que a chave ''file'' foi utilizada. Esta chave é reservada, portanto você não pode utilizá-la! Mas não se preocupe, isso é fácil de resolver. Apenas substitua esse nome por outro.
+ERROR_VALIDATE_FILES_IS_NOT_A_LIST=Li uma diretiva {0} e descobri que ''files'' requer uma lista. Por favor, certifique-se de corrigir o tipo para uma lista adequada e tente novamente.
+ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT=Encontrei uma diretiva inválida {0} no arquivo especificado. Certifique-se de corrigir a diretiva e tente novamente.
+ERROR_VALIDATE_NO_DIRECTIVES_FOUND=Parece que o arquivo especificado não possui diretivas! Certifique-se de incluir, pelo menos, uma diretiva e tente novamente.
+ERROR_VALIDATE_ORPHAN_LINEBREAK=Aparentemente, existe uma quebra de linha de uma diretiva órfã na linha {0}. Não posso continuar. Por favor, corrija a diretiva e tente novamente.
+ERROR_VALIDATE_REFERENCE_IS_RESERVED=Li uma diretiva {0} e descobri que a chave ''reference'' foi utilizada. Esta chave é reservada, portanto você não pode utilizá-la! Mas não se preocupe, isso é fácil de resolver. Apenas substitua esse nome por outro.
+ERROR_VALIDATE_YAML_EXCEPTION=Ocorreu um problema com o mapa YAML especificado em uma diretiva {0}. Esta parte é complicada, pois envolve aspectos do formato de serialização de dados subjacente.
+ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED=O identificador de argumento ''{0}'' está reservado, portanto você não pode utilizá-lo. Isso é fácil de resolver. Apenas substitua esse nome por outro.
+ERROR_VALIDATEBODY_ARGUMENTS_LIST=Não consegui encontrar a lista de argumentos. Preciso dessa lista, mesmo que ela esteja vazia. Certifique-se de corrigir esse erro e tente novamente.
+ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS=Aparentemente, você possui identificadores de argumentos duplicados em sua regra. Certifique-se de corrigir esse erro e tente novamente.
+ERROR_VALIDATEBODY_MISSING_KEYS=Ao definir um escopo de argumento de regra, ao menos a chave 'flag' ou 'default' deve ser utilizada. Por favor, certifique-se de utilizar, pelo menos, uma delas.
+ERROR_VALIDATEBODY_NULL_ARGUMENT_ID=Descobri que um dos argumentos não possui identificador associado. Por favor, certifique-se de adicionar um identificador válido ao argumento e tente novamente.
+ERROR_VALIDATEBODY_NULL_COMMAND=Encontrei um comando nulo na regra especificada. Isso é fácil de resolver. Certifique-se de adicionar um comando válido na regra.
+ERROR_VALIDATEBODY_NULL_COMMANDS_LIST=Preciso de uma lista de comandos. Certifique-se de corrigir esse erro e tente novamente.
+ERROR_VALIDATEHEADER_NULL_ID=A regra especificada não possui identificador. É uma informação crucial, portanto, certifique-se de corrigir esse erro e tente novamente. Lembre-se de que o identificador deve possuir o mesmo nome do arquivo da regra (sem a extensão, é claro).
+ERROR_VALIDATEHEADER_NULL_NAME=A regra especificada não possui nome. Isso é fácil de resolver. Certifique-se de adicionar um nome válido e tente novamente.
+ERROR_VALIDATEHEADER_WRONG_IDENTIFIER=A regra possui um identificador incorreto. Eu estava esperando ''{0}'', mas encontrei ''{1}''. Isso é fácil de resolver: apenas substitua o identificador incorreto pelo valor correto.
+ERROR_VELOCITY_FILE_NOT_FOUND=O motor de modelo não conseguiu encontrar o arquivo de entrada especificado. Certifique-se de que a localização está correta e tente novamente.
+ERROR_VELOCITY_PARSE_EXCEPTION=Ocorreu um erro de análise no arquivo de entrada especificado. Certifique-se de que o arquivo esteja aderente ao formato Velocity Template Language (VTL) e tente novamente.
+ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION=Ocorreu um erro de invocação de método no arquivo de entrada especificado. Certifique-se de que o arquivo esteja aderente ao formato Velocity Template Language (VTL) e tente novamente.
+ERROR_VELOCITY_IO_EXCEPTION=O motor de modelo não conseguiu escrever no arquivo de saída. Certifique-se de que o caminho possui as permissões corretas e tente novamente.
+INFO_DISPLAY_EXCEPTION_MORE_DETAILS=Detalhes adicionais estão disponíveis para esta exceção:
+INFO_DISPLAY_EXECUTION_TIME=Total: {0} segundos
+INFO_DISPLAY_FILE_INFORMATION=Processando ''{0}'' (tamanho: {1}, última modificação: {2}), por favor, aguarde.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=A executar: {0}
+INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE=Apesar da execução em modo dry-run, esta entrada é sempre processada por tratar-se de um gatilho. Observe que os efeitos de um gatilho podem influenciar a execução corrente.
+INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE=Esta entrada é um gatilho originado a partir do escopo da regra. Observe que os efeitos de um gatilho podem influenciar a execução corrente.
+INFO_LABEL_AUTHOR=Autor:
+INFO_LABEL_AUTHORS=Autores:
+INFO_LABEL_CONDITIONAL=Expressão condicional:
+INFO_LABEL_NO_AUTHORS=Nenhum autor informado
+INFO_LABEL_ON_DETAILS=DETALHES
+INFO_LABEL_ON_ERROR=ERRO
+INFO_LABEL_ON_FAILURE=FRACASSO
+INFO_LABEL_ON_SUCCESS=SUCESSO
+INFO_LABEL_UNNAMED_TASK=Tarefa sem nome
+INFO_PARSER_ALL_RIGHTS_RESERVED=Todos os direitos reservados
+INFO_PARSER_DRYRUN_MODE_DESCRIPTION=passa por todas as preparações para executar um comando, mas sem chamadas reais
+INFO_PARSER_HELP_DESCRIPTION=imprime a mensagem de ajuda
+INFO_PARSER_LANGUAGE_DESCRIPTION=define o idioma da aplicação
+INFO_PARSER_LOG_DESCRIPTION=gera uma saída para registro
+INFO_PARSER_LOOPS_DESCRIPTION=define o número máximo de iterações
+INFO_PARSER_NOTES=Esta ferramenta utiliza as seguintes bibliotecas e suas respectivas licenças: CAL10N: MIT, Commons CLI: Apache 2.0, Commons Collections: Apache 2.0, Commons IO: Apache 2.0, Commons Lang: Apache 2.0, MVEL: Apache 2.0, Logback: licença dupla com EPL 1.0 e LGPL 2.1, Simple framework: Apache 2.0, SLF4J: MIT, SnakeYAML: Apache 2.0, Velocity: Apache 2.0, and ZT-Exec: Apache 2.0. Por fim, mas não menos importante, arara é distribuída sob a licença New BSD.
+INFO_PARSER_ONLY_HEADER=extrai diretivas apenas no cabeçalho do arquivo
+INFO_PARSER_PREAMBLE_DESCRIPTION=define o preâmbulo de arquivo de acordo com o arquivo de configuração
+INFO_PARSER_SILENT_MODE_DESCRIPTION=oculta a saída do comando
+INFO_PARSER_TIMEOUT_DESCRIPTION=define o timeout de execução (em milissegundos)
+INFO_PARSER_VERBOSE_MODE_DESCRIPTION=imprime a saída do comando
+INFO_PARSER_VERSION_DESCRIPTION=imprime a versão da aplicação
+LOG_INFO_BEGIN_BUFFER=INÍCIO DO BUFFER DE SAÍDA
+LOG_INFO_DIRECTIVES_BLOCK=DIRETIVAS
+LOG_INFO_END_BUFFER=FINAL DO BUFFER DE SAÍDA
+LOG_INFO_INTERPRET_RULE=Estou pronto para interpretar a regra ''{0}''.
+LOG_INFO_INTERPRET_TASK=Estou pronto para interpretar a tarefa ''{0}'' da regra ''{1}''.
+LOG_INFO_POTENTIAL_DIRECTIVE_FOUND=Encontrei uma diretiva em potencial: {0}
+LOG_INFO_POTENTIAL_PATTERN_FOUND=Encontrei um padrão em potencial na linha {0}: {1}
+LOG_INFO_RULE_LOCATION=Localização da regra: ''{0}''
+LOG_INFO_SYSTEM_COMMAND=Comando de sistema: {0}
+LOG_INFO_TASK_RESULT=Resultado da tarefa:
+LOG_INFO_VALIDATED_DIRECTIVES=Todas as diretivas foram validadas. Estamos prontos para continuar.
+LOG_INFO_WELCOME_MESSAGE=Olá, eu sou o arara {0} (revisão {1})!