texlive[54089] trunk: arara (4mar20)

commits+karl at tug.org commits+karl at tug.org
Thu Mar 5 01:49:51 CET 2020


Revision: 54089
          http://tug.org/svn/texlive?view=revision&revision=54089
Author:   karl
Date:     2020-03-05 01:49:50 +0100 (Thu, 05 Mar 2020)
Log Message:
-----------
arara (4mar20)

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/arara/arara.sh
    trunk/Master/texmf-dist/doc/support/arara/README.md
    trunk/Master/texmf-dist/doc/support/arara/arara-manual.pdf
    trunk/Master/texmf-dist/doc/support/arara/arara-manual.tex
    trunk/Master/texmf-dist/doc/support/arara/arara.sty
    trunk/Master/texmf-dist/doc/support/arara/chapters/building.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/cli.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/concepts.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/configuration.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/deploying.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/introduction.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/license.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/logging.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/methods.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/mvel.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/rules.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/yaml.tex
    trunk/Master/texmf-dist/doc/support/arara/rules/manual.yaml
    trunk/Master/texmf-dist/scripts/arara/arara.jar
    trunk/Master/texmf-dist/scripts/arara/arara.sh
    trunk/Master/texmf-dist/scripts/arara/rules/animate.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/bib2gls.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/biber.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/bibtex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/bibtex8.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/bibtexu.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/clean.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/csplain.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/datatooltk.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/dvipdfm.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/dvipdfmx.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/dvips.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/dvipspdf.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/dvisvgm.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/etex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/halt.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/indent.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/latex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/latexmk.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/lualatex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/luatex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/make.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/makeglossarieslite.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/makeindex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/nomencl.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/pdfcsplain.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/pdftex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/pdftk.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/sketch.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/songidx.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/tex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/texindy.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/tikzmake.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/xdvipdfmx.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/xelatex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/xetex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/xindy.yaml

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf
    trunk/Master/texmf-dist/scripts/arara/rules/asymptote.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/knitr.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/luahbtex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/metapost.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/pbibtex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/platex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/ptex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/upbibtex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/uplatex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/uptex.yaml
    trunk/Master/texmf-dist/scripts/arara/rules/xindex.yaml
    trunk/Master/texmf-dist/source/support/arara/build.gradle.kts
    trunk/Master/texmf-dist/source/support/arara/src/main/java/org/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/Methods.java
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/Arara.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/CLI.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/AraraSpec.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/Configuration.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/ConfigurationUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/LocalConfiguration.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/Database.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/DatabaseUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Language.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/LanguageController.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Messages.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/AraraException.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Evaluator.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Extractor.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/FileType.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Interpreter.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Session.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Argument.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Command.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Conditional.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Directive.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveAssembler.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Rule.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleCommand.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/ClassLoadingUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/CommonUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/DisplayUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/Extensions.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/InterpreterUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/LoggingUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/MessageUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/SystemCallUtils.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/TeeOutputStream.kt
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/logback.xml
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/release-notes
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_de.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en_QN.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_it.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_nl.properties
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_pt_BR.properties
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtilsTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtilsTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageCoverageTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageReport.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/model/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/model/SessionTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/CommonUtilsTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExecutionTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExtensionTest.kt
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arara.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/changes.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/conditionals.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echofour.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echothree.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echotwo.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/directive-with-options.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.my
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.xy
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echotwo.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echotwo.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt-error.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/invalid-config.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/known-extension.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessionrule.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessions.tex
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/arararc.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/echoone.yaml
    trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/simple-directive.tex

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/support/arara/chapters/foreword.tex
    trunk/Master/texmf-dist/doc/support/arara/chapters/prologue.tex
    trunk/Master/texmf-dist/scripts/arara/rules/velocity.yaml
    trunk/Master/texmf-dist/source/support/arara/pom.java5.xml
    trunk/Master/texmf-dist/source/support/arara/pom.xml
    trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java
    trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/controller/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/model/
    trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/utils/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/configuration/
    trunk/Master/texmf-dist/source/support/arara/src/main/resources/com/github/cereda/arara/localization/
    trunk/Master/texmf-dist/source/support/arara/src/test/java/com/github/cereda/arara/tests/

Modified: trunk/Build/source/texk/texlive/linked_scripts/arara/arara.sh
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/arara/arara.sh	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Build/source/texk/texlive/linked_scripts/arara/arara.sh	2020-03-05 00:49:50 UTC (rev 54089)
@@ -3,7 +3,7 @@
 # Note from Paulo: this script provides better Cygwin support than our original
 # approach, so the team decided to use it as a proper wrapper for arara as well.
 
-scriptname=`basename "$0"`
+scriptname=`basename "$0" .sh`
 jar="$scriptname.jar"
 jarpath=`kpsewhich --progname="$scriptname" --format=texmfscripts "$jar"`
 
@@ -14,4 +14,4 @@
   jarpath=`cygpath -w "$jarpath"`
 fi
 
-exec java -jar "$jarpath" "$@"
+exec java -jar "$jarpath" "$@"
\ No newline at end of file

Modified: trunk/Master/texmf-dist/doc/support/arara/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/README.md	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/README.md	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,18 +2,27 @@
 
 # arara
 
-![Version: 4.0](https://img.shields.io/badge/current_version-4.0-blue.svg?style=flat-square)
-![Revision: 2](https://img.shields.io/badge/revision-2-blue.svg?style=flat-square)
-![Language: Java](https://img.shields.io/badge/language-Java-blue.svg?style=flat-square)
-![Minimum JRE: 5.0](https://img.shields.io/badge/minimum_JRE-5.0-blue.svg?style=flat-square)
-[![License: New BSD](https://img.shields.io/badge/license-New_BSD-blue.svg?style=flat-square)](https://opensource.org/licenses/bsd-license)
-![CTAN packaging: 4.0.7](https://img.shields.io/badge/CTAN_packaging-4.0.7-blue.svg?style=flat-square)
+![Language: Kotlin](https://img.shields.io/badge/Language-Kotlin-blue.svg?style=flat-square)
+![Minimum JRE: 8.0](https://img.shields.io/badge/Minimum_JRE-8-blue.svg?style=flat-square)
 
-`arara` is a TeX automation tool based on rules and directives. It gives you a way to enhance your TeX experience. The tool is an effort to provide a concise way to automate the daily TeX workflow for users and also package writers. Users might write their own rules when the provided ones do not suffice.
+`arara` is a TeX automation tool based on rules and directives. It gives you a
+way to enhance your TeX experience. The tool is an effort to provide a concise
+way to automate the daily TeX workflow for users and also package writers. Users
+might write their own rules when the provided ones do not suffice.
 
+Current stable version: 5.0.0
+
+> Please note that `arara` recently moved. We are proud to announce that
+> `arara` is now part of the [Island of TeX](https://gitlab.com/islandoftex).
+> The new address is https://gitlab.com/islandoftex/arara. The old GitHub
+> repository will be used as mirror but development happens on GitLab. Please
+> open relevant issues and merge requests there.
+
 ## Basic use
 
-To use `arara`, you need to tell it what to do. Unlike most other tools, you give `arara` these _directives_ in the document itself – usually near the top.  So to run `pdflatex` once on your document, you should say something like:
+To use `arara`, you need to tell it what to do. Unlike most other tools, you
+give `arara` these _directives_ in the document itself – usually near the top.
+So to run `pdflatex` once on your document, you should say something like:
 
 ```tex
 % arara: pdflatex
@@ -23,52 +32,70 @@
 \end{document}
 ```
 
-Now when you run `arara myfile`, that directive (`% arara: ...`) will be seen and carried out as described by the `pdflatex` rule.  You can read more about rules and directives in the user manual available in our [releases](https://github.com/cereda/arara/releases) section. In addition to documenting all of the rules that come standard with `arara`, the manual gives a detailed explanation of how `arara` works, as well as how to create and use your own rules.
+Now when you run `arara myfile`, that directive (`% arara: ...`) will be seen
+and carried out as described by the `pdflatex` rule.  You can read more about
+rules and directives in the user manual available in our
+[releases](https://gitlab.com/islandoftex/arara/-/releases) section. In addition
+to documenting all of the rules that come standard with `arara`, the manual
+gives a detailed explanation of how `arara` works, as well as how to create and
+use your own rules.
 
-## Versions
+## Getting the latest and greatest arara
 
-![Current version: 4.0](https://img.shields.io/badge/current_version-4.0-blue.svg?style=flat-square)
-![Development version: 5.0](https://img.shields.io/badge/development_version-5.0-red.svg?style=flat-square)
-
-The stable major version of `arara` is the 4.0 series (note that revision numbers may vary). Please refer to the development branch for more information on the upcoming 5.0 series release. The master branch always refers to the stable version (including potential revisions). The CTAN packaging for the current version is 4.0.7 (for internal use).
-
-For historical purposes, the source code for older versions of `arara` is available in the [releases](https://github.com/cereda/arara/releases) section of our repository. However, be mindful that these versions are unsupported.
-
-## Build status
-
-[![Version: 4.0](https://img.shields.io/badge/version-4.0-blue.svg?style=flat-square)](https://travis-ci.org/cereda/arara/)
-![Travis CI for 4.0](https://img.shields.io/travis/cereda/arara.svg?style=flat-square)
-[![Version: 5.0](https://img.shields.io/badge/version-5.0-red.svg?style=flat-square)](https://travis-ci.org/cereda/arara/branches)
-![Travis CI for 5.0](https://img.shields.io/travis/cereda/arara/development.svg?style=flat-square)
-
-`arara` uses [Travis CI](https://travis-ci.org) as a hosted continuous integration service. For each and every commit, we can see in real time the build status of our application checked against a range of Java VM vendors. It is worth noting that the current series is designed and built to be Java 5.0 compliant, so if you have an old JVM, it is almost sure that you will be able to run `arara` in it without any problems.
-
+`arara` is continuously built by the GitLab CI. For each and every commit, it is
+ ensured that a green tick means `arara` passes the test suite and is ready to
+ be tested. However, that is *not* meant you can use the executable artifacts of
+ the builds *for productive use*.
+ 
+ Development of `arara` takes place in the development branch. Feel free to be
+ one of our testers and enjoy the latest features and bug fixes by building from
+ there. 
+ 
 ## Support
 
-[![Gitter chatroom](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/cereda/arara)
-[![GitHub issues](https://img.shields.io/badge/github-issues-blue.svg?style=flat-square)](https://github.com/cereda/arara/issues)
+We use a [Gitter](https://gitter.im/cereda/arara) chatroom for discussing things
+related to `arara`. You are more than welcome to come join the fun and say *hi!*
+to us. We also have the [issues](https://gitlab.com/islandoftex/arara/issues)
+section in our repository as a valid channel to report problems, bugs and
+suggest improvements. 
 
-We use a [Gitter](https://gitter.im/cereda/arara) chatroom for discussing things related to `arara`. You are more than welcome to come join the fun and say *hi!* to us. We also have the [issues](https://github.com/cereda/arara/issues) section in our repository as a valid channel to report problems, bugs and suggest improvements. 
-
 ## Localization
 
-Would you like to make `arara` speak your own language? Splendid! We would love to have you in the team! Just send us an e-mail, join our dedicated chatroom or open an issue about it. The localization process is quite straightforward, we can help you! Any language is welcome!
+Would you like to make `arara` speak your own language? Splendid! We would love
+to have you in the team! Just send us an e-mail, join our dedicated chatroom or
+open an issue about it. The localization process is quite straightforward, we
+can help you! Any language is welcome!
 
-A big thanks to our translators Marco Daniel, Clemens Niederberger, Ulrike Fischer, Gert Fischer, Enrico Gregorio and Marijn Schraagen for the awesome localization work!
+A big thanks to our translators Marco Daniel, Clemens Niederberger, Ulrike
+Fischer, Gert Fischer, Enrico Gregorio and Marijn Schraagen for the awesome
+localization work!
 
 ## Downloads
 
-[![Download from GitHub](https://img.shields.io/badge/github-4.0-blue.svg?style=flat-square)](https://github.com/cereda/arara/releases)
-[![Download from Bintray](https://img.shields.io/badge/bintray-4.0-blue.svg?style=flat-square)](https://bintray.com/cereda/arara)
+[![Download from GitLab](https://img.shields.io/badge/dynamic/json.svg?color=blue&label=Latest%20release&query=%24.0.name&url=https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%2Fprojects%2F14349047%2Frepository%2Ftags&style=flat-square)](https://gitlab.com/islandoftex/arara/-/releases)
 
-From the 4.0 series on, the team decided to not release cross-platform installers any more. Our tool is available out of the shelf on all major TeX distributions, including TeX Live and MiKTeX, which makes manual installation unnecessary given the significant coverage of such distributions. Chances are you already have `arara` in your system!
+Our tool is available out of the shelf on all major TeX distributions,
+including TeX Live and MiKTeX, which makes manual installation unnecessary
+given the significant coverage of such distributions. Chances are
+you already have `arara` in your system!
 
-You can obtain the official package available in the [releases](https://github.com/cereda/arara/releases) section of our project repository, as well as the [Bintray](https://bintray.com/cereda/arara) software distribution service. Please refer to the documentation on how to manually deploy our tool.
+You can obtain the official package available in the
+[releases](https://gitlab.com/islandoftex/arara/-/releases) section of our
+project repository. Please refer to the documentation on how to
+manually deploy our tool.
 
 ## License
 
-This application is licensed under the [New BSD License](http://www.opensource.org/licenses/bsd-license.php). Please note that the New BSD License has been verified as a GPL-compatible free software license by the [Free Software Foundation](http://www.fsf.org/), and has been vetted as an open source license by the [Open Source Initiative](http://www.opensource.org/).
+This application is licensed under the 
+[New BSD License](https://opensource.org/licenses/BSD-3-Clause). Please
+note that the New BSD License has been verified as a GPL-compatible free
+software license by the [Free Software Foundation](http://www.fsf.org/), and
+has been vetted as an open source license by the
+[Open Source Initiative](http://www.opensource.org/).
 
 ## The team
 
-`arara`, the cool TeX automation tool, is brought to you by Paulo Cereda, Marco Daniel, Brent Longborough and Nicola Talbot. If you want to support TeX development by a donation, the best way to do this is donating to the [TeX Users Group](https://www.tug.org/donate.html).
+`arara`, the cool TeX automation tool, is brought to you by Paulo Cereda, Marco
+Daniel, Brent Longborough, Nicola Talbot and Ben Frank. If you want to support
+TeX development by a donation, the best way to do this is donating to the
+[TeX Users Group](https://www.tug.org/donate.html).

Modified: trunk/Master/texmf-dist/doc/support/arara/arara-manual.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/support/arara/arara-manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/arara-manual.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/arara-manual.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,7 +1,7 @@
 % arara: manual
 
 % Arara, the cool TeX automation tool
-% Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+% Copyright (c) 2012 -- 2020, Island of TeX
 % All rights reserved.
 %
 % Redistribution and  use in source  and binary forms, with  or without
@@ -41,63 +41,8 @@
 \usepackage[utf8]{inputenc}
 \usepackage[margin=2.5cm]{geometry}
 \usepackage{arara}
-\usepackage[record,postpunc=dot]{glossaries-extra}
 
-\newcommand{\araraversion}{4.0}
-
-\glssetcategoryattribute{abbreviation}{glossdesc}{firstuc}
-\glssetcategoryattribute{general}{glossname}{firstuc}
-\glssetcategoryattribute{general}{glossdesc}{firstuc}
-
-\setabbreviationstyle{short-nolong-desc}
-\renewcommand{\glsxtrshortdescname}{%
- \protect\glsabbrvfont{\the\glsshorttok} (\the\glslongtok)%
-}
-
- \newabbreviation
- [description={an interface that allows users to interact
-through graphical components, such as buttons and menus}]
- {GUI}{GUI}{Graphical User Interface}
-
- \newabbreviation
- [description={an organisation that develops and promotes Internet standards}]
- {IETF}{IETF}{Internet Engineering Task Force}
-
- \newabbreviation
- [description={a virtual machine that enables Java programs to be run}]
- {JVM}{JVM}{Java Virtual Machine}
-
- \newabbreviation
- [description={a hybrid, dynamic, statically typed, embeddable
- expression language and runtime for the Java platform},
- location={(See Chapter~\ref{chap:mvel}.)}]
- {MVEL}{MVEL}{MVFLEX Expression Language}
-
-\newglossaryentry{orb-tag}{name={orb tag},
- description={a dynamic element of an \gls{MVEL} template which is
- evaluated at runtime},
- location={(See Section~\ref{sec:mvelbasictemplating}.)}}
-
-\newabbreviation
- [description={a simple computer programming environment that takes
-  a single expression (input), evaluates it and results the result}]
- {REPL}{REPL}{Read--Eval--Print Loop}
-
-\newabbreviation
- [description={a database language}]
- {SQL}{SQL}{Structured Query Language}
-
-\newabbreviation
- [description={a markup language that defines a set of rules for
-encoding documents in a format that is both human-readable and
-machine-readable}]
- {XML}{XML}{Extensible Markup Language}
-
-\newabbreviation
- [description={human-friendly data, commonly used for configuration
-files but also used for data storage or transmission},
- location={(See Chapter~\ref{chap:yaml}.)}]
- {YAML}{YAML}{YAML Ain't Markup Language}
+\newcommand{\araraversion}{5.0}
  
 \begin{document}
 
@@ -124,14 +69,11 @@
 
 \vspace{6em}
 
-{\large\em Paulo Cereda, Marco Daniel,\\
-Brent Longborough, and Nicola Talbot\par}
+{\large\em The Island of \TeX\par}
 
 \vspace{3em}
 
-\href{mailto:cereda.paulo at gmail.com}{\fpemail{0.4}}%
-\quad\href{https://github.com/cereda/arara}{\fpgithub{0.4}}%
-\quad\href{http://twitter.com/paulocereda}{\fptwitter{0.4}}
+\href{https://gitlab.com/islandoftex/arara}{\includegraphics[scale=.3]{figures/gl}}
 
 \vfill
 
@@ -157,22 +99,10 @@
 \em No birds were harmed in the making of this manual.
 \end{flushright}
 
-\include{chapters/foreword}
-\include{chapters/prologue}
 \include{chapters/license}
-\printunsrtglossary
 
 \cleardoublepage
 
-\vspace*{25em}
-
-\thispagestyle{empty}
-\begin{flushright}
-\em To Marco's son Niclas.
-\end{flushright}
-
-\cleardoublepage
-
 \tableofcontents*
 
 \cleardoublepage

Modified: trunk/Master/texmf-dist/doc/support/arara/arara.sty
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/arara.sty	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/arara.sty	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,5 +1,5 @@
 % Arara, the cool TeX automation tool
-% Copyright (c) 2012 -- 2018, Paulo Roberto Massa Cereda
+% Copyright (c) 2012 -- 2020, Island of TeX
 % All rights reserved.
 %
 % Redistribution and  use in source  and binary forms, with  or without
@@ -30,7 +30,7 @@
 % WAY  OUT  OF  THE USE  OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE
 % POSSIBILITY OF SUCH DAMAGE.
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{arara}[2018/04/11 Arara User Manual Configuration]
+\ProvidesPackage{arara}[2020/03/01 Arara User Manual Configuration]
 
 \RequirePackage{tikz}
 \RequirePackage{xcolor}
@@ -57,6 +57,7 @@
 \RequirePackage[regular]{sourcecodepro}
 
 \RequirePackage{adforn}
+\RequirePackage{fontawesome}
 
 \RequirePackage{forest}
 \useforestlibrary{edges}
@@ -862,8 +863,7 @@
 \vspace{.5em}
 \end{minipage}}
 
-\newcommand{\rulebox}[2]{\rbox{#1}%
-\hfill{\normalfont\em#2}}
+\newcommand{\rulebox}[1]{\rbox{#1}}
 \newcommand{\rpbox}[2]{\abox{#1}\hfill%
 {\normalfont\itshape default:} \rbox[cyan]{#2}}
 \newcommand{\rpsbox}[1]{\abox{#1}~%
@@ -871,177 +871,3 @@
 
 \newcommand{\povalue}[1]{\rbox[cyan]{#1}}
 \newcommand{\rqbox}{\rbox[araracolour]{R}}
-
-\newcommand{\fpemail}[1]{%
-\begin{tikzpicture}[
-  y=0.80pt,
-  x=0.80pt,
-  yscale=-1.000000,
-  xscale=1.000000,
-  inner sep=0pt,
-  outer sep=0pt,
-  scale=#1]
-\begin{scope}[shift={(-45.96191,-71.72619)}]
-  \path[cm={{0.26458,0.0,0.0,0.26458,(45.96191,71.72619)}},fill=araracolour,line
-    width=0.800pt] (138.0000,0.0000) .. controls (61.8000,0.0000) and
-    (0.0000,61.8000) .. (0.0000,138.0000) -- (0.0000,374.0000) .. controls
-    (0.0000,450.2000) and (61.8000,512.0000) .. (138.0000,512.0000) --
-    (374.0000,512.0000) .. controls (450.2000,512.0000) and (512.0000,450.2000) ..
-    (512.0000,374.0000) -- (512.0000,138.0000) .. controls (512.0000,61.8000) and
-    (450.2000,0.0000) .. (374.0000,0.0000) -- (138.0000,0.0000) --
-    cycle(105.3535,154.1797) -- (406.6426,154.1797) .. controls
-    (407.1626,154.1797) and (407.6487,154.4501) .. (407.9355,154.8457) --
-    (269.4844,269.0977) -- (263.6836,273.8984) .. controls (263.5691,273.9744) and
-    (263.4561,274.0383) .. (263.3477,274.1094) -- (262.8496,274.4277) .. controls
-    (261.0136,275.6408) and (258.7436,276.3086) .. (256.4473,276.3086) --
-    (256.3828,276.3086) .. controls (253.6418,276.3086) and (251.0365,275.4472) ..
-    (249.2109,273.9355) -- (104.3555,154.5410) .. controls (104.6316,154.3135) and
-    (104.9799,154.1797) .. (105.3535,154.1797) -- cycle(103.7441,170.3691) --
-    (207.5117,255.9004) -- (103.7441,339.7246) -- (103.7441,170.3691) --
-    cycle(408.2559,170.9316) -- (408.2559,339.7695) -- (304.5957,256.4688) --
-    (408.2559,170.9316) -- cycle(217.4394,264.0840) -- (241.2070,283.6836) ..
-    controls (245.3284,287.0581) and (250.7281,288.9160) .. (256.4258,288.9160) ..
-    controls (262.1020,288.9160) and (267.5064,287.0487) .. (271.6387,283.6582) --
-    (294.6582,264.6582) -- (408.2559,355.9316) -- (408.2559,356.2012) .. controls
-    (408.2559,357.0788) and (407.5127,357.8203) .. (406.6465,357.8203) --
-    (105.3750,357.8203) .. controls (104.4923,357.8203) and (103.7441,357.0793) ..
-    (103.7441,356.2070) -- (103.7441,355.9141) -- (217.4394,264.0840) -- cycle;
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-  \begin{scope}[cm={{0.13993,0.0,0.0,0.13993,(71.62036,95.57808)}},fill=white]
-  \end{scope}
-\end{scope}
-\end{tikzpicture}}
-
-\newcommand{\fptwitter}[1]{%
-\begin{tikzpicture}[
-  y=0.80pt,
-  x=0.80pt,
-  yscale=-1.000000,
-  xscale=1.000000,
-  inner sep=0pt,
-  outer sep=0pt,
-  scale=#1]
-\begin{scope}[shift={(-45.96191,-71.72619)}]
-  \path[fill=araracolour,line width=0.212pt] (144.9161,71.7262) -- (82.4744,71.7262) ..
-    controls (62.3132,71.7262) and (45.9619,88.0774) .. (45.9619,108.2387) --
-    (45.9619,170.6804) .. controls (45.9619,190.8416) and (62.3132,207.1929) ..
-    (82.4744,207.1929) -- (144.9161,207.1929) .. controls (165.0773,207.1929) and
-    (181.4286,190.8416) .. (181.4286,170.6804) -- (181.4286,108.2387) .. controls
-    (181.4286,88.0774) and (165.0773,71.7262) .. (144.9161,71.7262) --
-    cycle(146.6623,124.7222) -- (146.7152,126.7066) .. controls
-    (146.7152,147.0795) and (131.2106,170.5745) .. (102.8473,170.5745) .. controls
-    (94.1425,170.5745) and (86.0463,168.0081) .. (79.2200,163.6424) .. controls
-    (80.4371,163.7747) and (81.6542,163.8541) .. (82.8977,163.8541) .. controls
-    (90.1208,163.8541) and (96.7883,161.3935) .. (102.0536,157.2660) .. controls
-    (95.3067,157.1337) and (89.6181,152.6622) .. (87.6602,146.5504) .. controls
-    (88.6127,146.7356) and (89.5652,146.8414) .. (90.5706,146.8414) .. controls
-    (91.9994,146.8414) and (93.3091,146.6562) .. (94.6055,146.3122) .. controls
-    (87.5676,144.9099) and (82.2098,138.6658) .. (82.2098,131.2045) --
-    (82.2098,131.0193) .. controls (84.3265,132.1835) and (86.7209,132.8714) ..
-    (89.2345,132.9508) .. controls (85.1070,130.1991) and (82.4016,125.4631) ..
-    (82.4016,120.1185) .. controls (82.4016,117.2874) and (83.1787,114.6416) ..
-    (84.5016,112.3662) .. controls (92.0952,121.7060) and (103.4773,127.8443) ..
-    (116.2831,128.4793) .. controls (116.0185,127.3416) and (115.8886,126.1774) ..
-    (115.8886,124.9604) .. controls (115.8886,116.4408) and (122.7956,109.5351) ..
-    (131.3151,109.5351) .. controls (135.7337,109.5351) and (139.7559,111.4137) ..
-    (142.5605,114.4035) .. controls (146.0794,113.7156) and (149.3605,112.4456) ..
-    (152.3503,110.6729) .. controls (151.1861,114.2712) and (148.7522,117.2874) ..
-    (145.5772,119.1924) .. controls (148.6993,118.8220) and (151.6627,117.9754) ..
-    (154.4408,116.7583) .. controls (152.3773,119.8539) and (149.7579,122.5791) ..
-    (146.6623,124.7222) -- cycle;
-\end{scope}
-\end{tikzpicture}}
-
-\newcommand{\fpgithub}[1]{%
-\begin{tikzpicture}[
-  y=0.80pt,
-  x=0.80pt,
-  yscale=-1.000000,
-  xscale=1.000000,
-  inner sep=0pt,
-  outer sep=0pt,
-  scale=#1]
-\begin{scope}[shift={(69.24524,-3.99286)}]
-  \path[fill=araracolour,line width=0.212pt] (29.7089,3.9929) -- (-32.7327,3.9929) ..
-    controls (-52.8940,3.9929) and (-69.2452,20.3441) .. (-69.2452,40.5054) --
-    (-69.2452,102.9470) .. controls (-69.2452,123.1083) and (-52.8940,139.4595) ..
-    (-32.7327,139.4595) -- (29.7089,139.4595) .. controls (49.8702,139.4595) and
-    (66.2214,123.1083) .. (66.2214,102.9470) -- (66.2214,40.5054) .. controls
-    (66.2214,20.3441) and (49.8702,3.9929) .. (29.7089,3.9929) --
-    cycle(32.5929,74.8218) .. controls (32.3283,81.0660) and (31.0583,86.9397) ..
-    (27.0102,91.9404) .. controls (24.2056,95.3799) and (20.5808,97.5760) ..
-    (16.4004,98.9518) .. controls (12.2200,100.3012) and (7.9073,100.6981) ..
-    (3.5416,100.6716) .. controls (-0.8240,100.6451) and (-5.1632,100.7774) ..
-    (-9.5288,100.6187) .. controls (-14.3707,100.4600) and (-19.0802,99.5604) ..
-    (-23.4194,97.2850) .. controls (-28.6846,94.5068) and (-32.2036,90.2206) ..
-    (-34.0027,84.5320) .. controls (-35.1934,80.8279) and (-35.7225,77.0443) ..
-    (-35.6432,73.1550) .. controls (-35.5638,68.6041) and (-34.2938,64.4502) ..
-    (-31.4892,60.8518) .. controls (-30.6690,59.7670) and (-30.2457,58.8410) ..
-    (-30.3515,57.3064) .. controls (-30.5367,54.8723) and (-30.1663,52.3587) ..
-    (-29.7694,49.9245) .. controls (-29.4254,47.8873) and (-28.7640,45.9029) ..
-    (-28.1819,43.8920) .. controls (-28.1290,43.6804) and (-28.0232,43.4687) ..
-    (-27.8909,43.2835) .. controls (-27.7057,42.9660) and (-26.8854,42.8602) ..
-    (-26.0917,43.0718) .. controls (-20.8265,44.4741) and (-16.1434,46.9612) ..
-    (-11.6454,49.8716) .. controls (-11.1957,50.1627) and (-10.4813,50.2685) ..
-    (-9.9257,50.1627) .. controls (-5.9834,49.4748) and (-2.0411,49.3689) ..
-    (1.9277,49.5541) .. controls (3.5416,49.6335) and (5.1027,50.0304) ..
-    (6.7166,50.1362) .. controls (7.4046,50.1891) and (8.1983,50.0568) ..
-    (8.7539,49.7129) .. controls (12.8814,47.1200) and (17.1941,44.8975) ..
-    (21.8243,43.3629) .. controls (22.2477,43.2041) and (22.7239,43.0983) ..
-    (23.2266,42.9925) .. controls (24.0204,42.8337) and (24.8671,43.3100) ..
-    (25.1581,44.0773) .. controls (25.5285,45.0827) and (25.9254,46.1145) ..
-    (26.1106,47.1993) .. controls (26.6662,50.3214) and (27.3541,53.4964) ..
-    (27.3012,56.6185) .. controls (27.2748,58.7087) and (27.9098,60.0581) ..
-    (29.0210,61.6720) .. controls (31.8256,65.5879) and (32.8046,70.0593) ..
-    (32.5929,74.8218) -- cycle;
-  \path[fill=araracolour,line width=0.212pt] (17.7233,72.0172) .. controls
-    (15.7918,71.1441) and (13.5164,70.7472) .. (11.3733,70.6149) .. controls
-    (9.0185,70.4826) and (6.6108,71.0383) .. (4.2296,71.0118) .. controls
-    (-0.9827,70.9589) and (-6.1950,70.6943) .. (-11.4073,70.6414) .. controls
-    (-13.4975,70.6149) and (-15.5613,70.8795) .. (-17.6250,71.0118) .. controls
-    (-19.5036,71.1176) and (-21.0911,71.8849) .. (-22.5198,73.1020) .. controls
-    (-28.1025,77.8381) and (-27.2559,86.5164) .. (-23.8692,91.0672) .. controls
-    (-21.7525,93.9247) and (-18.7098,95.2476) .. (-15.3761,96.0414) .. controls
-    (-10.8517,97.1262) and (-6.2744,97.4172) .. (-1.6177,97.2056) .. controls
-    (3.0918,97.4172) and (7.7750,97.1526) .. (12.3787,96.0414) .. controls
-    (14.7335,95.4858) and (17.0089,94.7185) .. (18.8875,93.1045) .. controls
-    (22.9885,89.5591) and (24.0468,84.9289) .. (23.2531,79.7960) .. controls
-    (22.7239,76.3829) and (20.9777,73.4460) .. (17.7233,72.0172) --
-    cycle(-13.3388,89.8237) .. controls (-16.0859,89.8237) and (-18.3129,86.8503)
-    .. (-18.3129,83.1826) .. controls (-18.3129,79.5150) and (-16.0859,76.5416) ..
-    (-13.3388,76.5416) .. controls (-10.5916,76.5416) and (-8.3646,79.5150) ..
-    (-8.3646,83.1826) .. controls (-8.3646,86.8503) and (-10.5916,89.8237) ..
-    (-13.3388,89.8237) -- cycle(10.3943,89.8237) .. controls (7.6472,89.8237) and
-    (5.4202,86.8503) .. (5.4202,83.1826) .. controls (5.4202,79.5150) and
-    (7.6472,76.5416) .. (10.3943,76.5416) .. controls (13.1415,76.5416) and
-    (15.3685,79.5150) .. (15.3685,83.1826) .. controls (15.3685,86.8503) and
-    (13.1415,89.8237) .. (10.3943,89.8237) -- cycle;
-\end{scope}
-\end{tikzpicture}}

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/building.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/building.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/building.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,7 +2,7 @@
 \chapter{Building from source}
 \label{chap:buildingfromsource}
 
-\arara\ is a Java application licensed under the \href{http://www.opensource.org/licenses/bsd-license.php}{New BSD License}, a verified GPL-compatible free software license, and the source code is available in the project repository at \href{https://github.com/cereda/arara}{GitHub}. This chapter provides detailed instructions on how to build our tool from source.
+\arara\ is a Kotlin and Java application licensed under the \href{http://www.opensource.org/licenses/bsd-license.php}{New BSD License}, a verified GPL-compatible free software license, and the source code is available in the project repository at \href{https://gitlab.com/islandoftex/arara}{GitLab}. This chapter provides detailed instructions on how to build our tool from source.
 
 \section{Requirements}
 \label{sec:requirements}
@@ -10,7 +10,7 @@
 In order to build our tool from source, we need to ensure that our development environment has the minimum requirements for a proper compilation. Make sure the following items are available:
 
 \begin{itemize}[label={\cbyes{-2}}]
-\item On account of our project being hosted at \href{https://github.com}{GitHub}, an online source code repository, we highly recommend the installation of \rbox{git}, a version control system for tracking changes in computer files and coordinating work on those files among multiple people. Alternatively, you can directly obtain the source code by requesting a \href{https://github.com/cereda/arara/archive/master.zip}{source code download} in the repository. In order to check if \rbox{git} is available in your operating system, run the following command in the terminal (version numbers might vary):
+\item On account of our project being hosted at \href{https://gitlab.com/}{GitLab}, an online source code repository, we highly recommend the installation of \rbox{git}, a version control system for tracking changes in computer files and coordinating work on those files among multiple people. Alternatively, you can directly obtain the source code by requesting a \href{https://gitlab.com/islandoftex/arara/-/archive/master/arara-master.zip}{source code download} in the repository. In order to check if \rbox{git} is available in your operating system, run the following command in the terminal (version numbers might vary):
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ git --version
@@ -19,7 +19,7 @@
 
 Please refer to the \rbox{git} \href{https://git-scm.com/}{project website} in order to obtain specific installation instructions for your operating system. In general, most recent Unix systems have \rbox{git} installed out of the shelf.
 
-\item Our tool is written in the Java programming language, so we need a proper Java Development Kit,  a collection of programming tools for the Java platform. Our source code is known to be compliant with several vendors, including Oracle, OpenJDK, and Azul Systems. In order to check if your operating system has the proper tools, run the following command in the terminal (version numbers might vary):
+\item Our tool is written in the Java programming language, so we need a proper Java Development Kit, a collection of programming tools for the Java platform. Our source code is known to be compliant with several vendors, including Oracle, OpenJDK, and Azul Systems. In order to check if your operating system has the proper tools, run the following command in the terminal (version numbers might vary):
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ javac -version
@@ -28,23 +28,27 @@
 
 The previous command, as the name suggests, refers to the \rbox{javac} tool, which is the Java compiler itself. The most common Java Development Kit out there is from \href{http://www.oracle.com/technetwork/java/javase/downloads/index.html}{Oracle}. However, several Linux distributions (as well as some developers, yours truly included) favour the OpenJDK vendor, so your mileage may vary. Please refer to the corresponding website of the vendor of your choice in order to obtain specific installation instructions for your operating system.
 
-\item As a means to provide a straightforward and simplified compilation workflow, \arara\ relies on Apache Maven, a software project management and comprehension tool. Based on the concept of a project object model, Maven can manage builds, reporting and documentation from a central piece of information. In order to check if \rbox{mvn}, the Maven binary, is available in your operating system, run the following command in the terminal (version numbers might vary):
+\item As a means to provide a straightforward and simplified compilation workflow, \arara\ relies on Gradle, a software project management and comprehension tool. Gradle is a build tool just like arara with a much more comprehensive build framework to provide support for the JVM ecosystem. In order to check if \rbox{gradle}, the Gradle binary, is available in your operating system, run the following command in the terminal (version numbers might vary):
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ mvn --version
-Apache Maven 3.5.2 (Red Hat 3.5.2-5)
-Maven home: /usr/share/maven
-Java version: 1.8.0_171, vendor: Oracle Corporation
-Java home: /usr/lib/jvm/java-1.8.0-openjdk-
-    1.8.0.171-4.b10.fc28.x86_64/jre
-Default locale: pt_BR, platform encoding: UTF-8
-OS name: "linux", version: "4.16.16-300.fc28.x86_64",
-    arch: "amd64", family: "unix"
+$ gradle --version
+------------------------------------------------------------
+Gradle 6.0.1
+------------------------------------------------------------
+
+Build time:   2019-11-21 11:47:01 UTC
+Revision:     <unknown>
+
+Kotlin:       1.3.50
+Groovy:       2.5.8
+Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
+JVM:          1.8.0_232 (Oracle Corporation 25.232-b09)
+OS:           Linux 5.5.0-1-MANJARO amd64
 \end{codebox}
 
-Please refer to the Maven \href{https://maven.apache.org/}{project website} in order to obtain specific installation instructions for your operating system. In general, most recent Linux distributions have the Maven binary, as well the proper associated dependencies, available in their corresponding repositories.
+Please refer to the Gradle \href{https://gradle.org}{project website} in order to obtain specific installation instructions for your operating system. In general, most recent Linux distributions have the Gradle binary, as well the proper associated dependencies, available in their corresponding repositories.
 
-\item For a proper repository cloning, as well as the first Maven build, an active Internet connection is required. In particular, Maven dynamically downloads Java libraries and plug-ins from one or more online repositories and stores them in a local cache. Be mindful that subsequent builds can occur offline, provided that the local Maven cache exists.
+\item For a proper repository cloning, as well as the first Gradle build, an active Internet connection is required. In particular, Gradle dynamically downloads Java libraries and plug-ins from one or more online repositories and stores them in a local cache. Be mindful that subsequent builds can occur offline, provided that the local Gradle cache exists.
 \end{itemize}
 
 \arara\ can be easily built from source, provided that the aforementioned requirements are available. The next section presents the compilation details, from repository cloning to a proper Java archive generation.
@@ -51,7 +55,7 @@
 
 \begin{messagebox}{One tool to rule them all}{araracolour}{\icok}{white}
 \setlength{\parskip}{1em}
-For the brave, there is the \href{https://sdkman.io/}{Software Development Kit Manager}, an interesting tool for managing parallel versions of multiple software development kits on most Unix based systems. In particular, this tool provides off the shelf support for several Java Development Kit vendors and versions, as well as most recent versions Apache Maven.
+For the brave, there is the \href{https://sdkman.io/}{Software Development Kit Manager}, an interesting tool for managing parallel versions of multiple software development kits on most Unix based systems. In particular, this tool provides off the shelf support for several Java Development Kit vendors and versions, as well as most recent versions of Gradle.
 
 Personally, I prefer the packaged versions provided by my favourite Linux distribution (Fedora), but this tool is a very interesting alternative to set up a development environment with little to no effort.
 \end{messagebox}
@@ -69,50 +73,45 @@
 Run the following command in the terminal to clone the \arara\ project:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ git clone https://github.com/cereda/arara
+$ git clone https://gitlab.com/islandoftex/arara.git
 \end{codebox}
 
-Wait a couple of seconds (or minutes, depending on your Internet connection) while the previous command clones the project repository hosted at GitHub. Be mindful that this operation pulls down every version of every file for the history of the project. Fortunately, the version control system has the notion of a \emph{shallow clone}, which is a more succinctly meaningful way of describing a local repository with history truncated to a particular depth during the clone operation. If you want to get only the latest revision of everything in our repository, run the following command in the terminal:
+Wait a couple of seconds (or minutes, depending on your Internet connection) while the previous command clones the project repository hosted at GitLab. Be mindful that this operation pulls down every version of every file for the history of the project. Fortunately, the version control system has the notion of a \emph{shallow clone}, which is a more succinctly meaningful way of describing a local repository with history truncated to a particular depth during the clone operation. If you want to get only the latest revision of everything in our repository, run the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ git clone https://github.com/cereda/arara --depth 1
+$ git clone https://gitlab.com/islandoftex/arara.git --depth 1
 \end{codebox}
 
-This operation is way faster than the previous one, for obvious reasons. Unix terminals typically start at \abox[araracolour]{USER\_HOME} as working directory, so, if you did not \rbox{cd} to another directory (as in the earlier example), the newly cloned \abox[araracolour]{arara/} directory is almost certain to be accessible from that level. Now, we need to navigate to a directory named \abox[araracolour]{application/} inside our project structure, where the source code and the corresponding build file are located. Run the following command in the terminal:
+This operation is way faster than the previous one, for obvious reasons. Unix terminals typically start at \abox[araracolour]{USER\_HOME} as working directory, so, if you did not \rbox{cd} to another directory (as in the earlier example), the newly cloned \abox[araracolour]{arara/} directory is almost certain to be accessible from that level. Now, we need to navigate to the directory named \abox[araracolour]{arara/}. Run the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ cd arara/application
+$ cd arara
 \end{codebox}
 
-The previous command should take us inside the \abox[araracolour]{application/} directory of our project, where the source code and the corresponding build file are located. Let us make sure we are in the correct location by running the following command in the terminal:
+The previous command should take us inside the \abox[araracolour]{arara/} directory of our project, where the source code and the corresponding build file are located. Let us make sure we are in the correct location by running the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ ls
-pom.xml  src
+$ ls build.gradle.kts
+build.gradle.kts
 \end{codebox}
 
-Great, we are in the correct location! From the previous output, let us inspect the directory contents. The \abox[araracolour]{src/} directory, as the name suggests, contains the source code organized in an established package structure, whereas \rbox{pom.xml} is the corresponding build file written in the Project Object Model format, a special XML file that contains information about the project and configuration details used by Apache Maven to build the project. In order to build our tool, run the following command in the terminal:
+Great, we are in the correct location! From the previous output, let us inspect the directory contents. The \abox[araracolour]{application/} directory, as the name suggests, contains the source code of the main application organized in an established package structure, whereas \rbox{build.gradle.kts} is the corresponding Gradle build file written to efficiently compile the project. In order to build our tool, run the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ mvn compile assembly:single
+$ gradle build
 \end{codebox}
 
-Apache Maven is based around the central concept of a build life cycle. The \rbox{compile} phase, as the name suggests, compiles the source code of the project using the underlying Java compiler. From the previous command, bound to this particular build phase, note that there is an \rbox{assembly:single} plug-in goal which aggregates the project output along with its dependencies and other files into a single distributable archive. An \emph{assembly} is a group of files, directories and dependencies that are assembled into an archive format and distributed. In our case, the resulting file will be a typical Java archive file, with the \rbox{jar} extension. The first Maven build will take a couple of seconds (or minutes, depending on your Internet connection), as the tool will download all dependencies and required plug-ins for proper compilation and packaging. Subsequent builds will be significantly faster. Finally, after some time, Maven will output the following message as result (please note that the entire compilation and packaging only took 10 seconds on my development machine due to an existing local cache):
+Gradle is based around the central concept of a build life cycle. The \rbox{compile} phase, as the name suggests, compiles the source code of the project using the underlying Java compiler. After compiling, the code can be packaged, tested and run. The \rbox{build} target actually compiles, tests and packages our tool. Afterwards, you will have a \abox[araracolour]{application/build/libs/} directory with multiple JAR files, one containing \rbox{with-deps}. That file is ready to run as it bundles all dependencies. Subsequent builds will be significantly faster than the first build because they do not fetch dependencies and rely on a build cache. Finally, after some time, Gradle will output the following message as result (please note that the entire compilation and packaging only took 4 seconds on my development machine due to an existing local cache):
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-[INFO] ---------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ---------------------------------------------------------
-[INFO] Total time: 10.371 s
-[INFO] Finished at: 2018-06-22T18:38:02-03:00
-[INFO] Final Memory: 39M/184M
-[INFO] ---------------------------------------------------------
+BUILD SUCCESSFUL in 4s
+15 actionable tasks: 15 up-to-date
 \end{codebox}
 
-On account of a successful build in our previous interaction, there is now a newly created \abox[araracolour]{target/} directory containing compiled classes, a established package structure and, at last but not least, our assembly. Now, let us move the resulting Java archive file from that particular directory to \abox[araracolour]{application/} which is our current directory. It is important to note that the aforementioned assembly plug-in adds the \rbox{jar-with-dependencies} reference to the file name in order to differentiate a proper assembly from a typical Java archive file. Run the following command in the terminal (please note that the Java archive file was also renamed during the move operation):
+Now, let us move the resulting Java archive file from that particular directory to our current directory. Run the following command in the terminal (please note that the Java archive file was also renamed during the move operation):
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ mv target/arara-4.0-jar-with-dependencies.jar arara.jar
+$ mv application/build/libs/arara-with-deps-*.jar arara.jar
 \end{codebox}
 
 Now, our current directory contains the final \rbox{arara.jar} Java archive file properly built from source. This file can be safely distributed and deployed, as seen later on, in Chapter~\ref{chap:deployingthetool}, on page~\pageref{chap:deployingthetool}. You can also test the resulting file by running the following command in the terminal:
@@ -119,37 +118,37 @@
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ java -jar arara.jar
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-arara 4.0 (revision 1)
-Copyright (c) 2012-2018, Paulo Roberto Massa Cereda
-All rights reserved
+Usage: arara [OPTIONS] [file]...
 
-usage: arara [file [--dry-run] [--log] [--verbose | --silent]
-             [--timeout N] [--max-loops N] [--language L]
-             [ --preamble P ] [--header] | --help | --version]
- -h,--help                 print the help message
- -H,--header               extract directives only in the file header
- -l,--log                  generate a log output
- -L,--language <code>      set the application language
- -m,--max-loops <number>   set the maximum number of loops
- -n,--dry-run              go through all the motions of running a
-                           command, but with no actual calls
- -p,--preamble <name>      set the file preamble based on the
-                           configuration file
- -s,--silent               hide the command output
- -t,--timeout <number>     set the execution timeout (in milliseconds)
- -V,--version              print the application version
- -v,--verbose              print the command output
+Options:
+  -l, --log                        Generate a log output
+  -v, --verbose / -s, --silent     Print the command output
+  -n, --dry-run                    Go through all the motions of running a
+                                   command, but with no actual calls
+  -H, --header                     Extract directives only in the file header
+  -t, --timeout INT                Set the execution timeout (in milliseconds)
+  -L, --language TEXT              Set the application language
+  -m, --max-loops INT              Set the maximum number of loops (> 0)
+  -p, --preamble TEXT              Set the file preamble based on the
+                                   configuration file
+  -d, --working-directory DIRECTORY
+                                   Set the working directory for all tools
+  -V, --version                    Show the version and exit
+  -h, --help                       Show this message and exit
+
+Arguments:
+  file  The file(s) to evaluate and process
 \end{codebox}
 
-The following optional Maven phase is used to handle the project cleaning, including the complete removal of the \abox[araracolour]{target/} directory. As a result, the project is then restored to the initial state without any generated Java bytecode. Run the following command in the terminal:
+The following optional Gradle phase is used to handle the project cleaning, including the complete removal of the \abox[araracolour]{build/} directory. As a result, the project is then restored to the initial state without any generated Java bytecode. Run the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ mvn clean
+$ gradle clean
 \end{codebox}
 
 This section covered the compilation details for building \arara\ from source. The aforementioned steps are straightforward and can be automated in order to generate snapshots and daily builds. If you run into any issue, please let us know. Happy compilation!

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/cli.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/cli.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/cli.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -7,16 +7,16 @@
 \section{User interface design}
 \label{sec:userinterfacedesign}
 
-The goal of a user interface design is to make the interaction as simple and efficient as possible. Good user interface design facilitates finishing the task at hand without drawing unnecessary attention to itself. For \arara\ 4.0, we redesigned the interface in order to look more pleasant to the eye, after all, we work with \TeX\ and friends:
+The goal of a user interface design is to make the interaction as simple and efficient as possible. Good user interface design facilitates finishing the task at hand without drawing unnecessary attention to itself. We redesigned the interface in order to look more pleasant to the eye, after all, we work with \TeX\ and friends:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc5.tex' (size: 307 bytes, last modified: 05/29/2018
-08:57:30), please wait.
+Processing 'doc5.tex' (size: 285 B, last modified: 03/01/2020
+19:25:40), please wait.
 
 (PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
 (BibTeX) The BibTeX reference management software ....... SUCCESS
@@ -23,14 +23,14 @@
 (PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
 (PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
 
-Total: 1.45 seconds
+Total: 1.14 seconds
 \end{codebox}
 
 First of all, we have the nice application logo, displayed using ASCII art. The entire layout is based on monospaced font spacing, usually used in terminal prompts. Hopefully you follow the conventional use of a monospaced font in your terminal, otherwise the visual effect will not be so pleasant. First and foremost, \arara\ displays details about the file being processed, including size and modification status:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-Processing 'doc5.tex' (size: 307 bytes, last modified: 05/29/2018
-08:57:30), please wait.
+Processing 'doc5.tex' (size: 285 B, last modified: 03/01/2020
+19:25:40), please wait.
 \end{codebox}
 
 The list of tasks was also redesigned to be fully justified, and each entry displays both task and subtask names (the former being displayed enclosed in parentheses), besides of course the usual execution result:
@@ -51,7 +51,7 @@
 Also, observe that our tool displays the execution time before terminating, in seconds. The execution time has a very simple precision, as it is meant to be easily readable, and should not be considered for command profiling.
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-Total: 1.45 seconds
+Total: 1.14 seconds
 \end{codebox}
 
 The tool has two execution modes: \emph{silent}, which is the default, and \emph{verbose}, which prints as much information about tasks as possible. When in silent mode, \arara\ will simply display the task and subtask names, as well as the execution result. Nothing more is added to the output. For instance:
@@ -66,7 +66,7 @@
 -----------------------------------------------------------------
 (BibTeX) The BibTeX reference management software
 -----------------------------------------------------------------
-This is BibTeX, Version 0.99d (TeX Live 2017)
+This is BibTeX, Version 0.99d (TeX Live 2019)
 The top-level auxiliary file: doc5.aux
 The style file: plain.bst
 Database file #1: mybib.bib
@@ -85,35 +85,57 @@
 $ arara doc6.tex
 \end{codebox}
 
+From version 5.0 on, \arara\ may receive more than one file as parameter. It will compile them sequentially (starting with the leftmost). The process fails on the first failure of these executions. For the files to be flawlessly compiled by \TeX, they should be in the same working directory. If you process your files with other tools, this requirement could be lifted.
+
+\begin{codebox}{Terminal}{teal}{\icnote}{white}
+$ arara doc20.tex doc21.tex
+  __ _ _ __ __ _ _ __ __ _
+ / _` | '__/ _` | '__/ _` |
+| (_| | | | (_| | | | (_| |
+ \__,_|_|  \__,_|_|  \__,_|
+
+Processing 'doc20.tex' (size: 28 B, last modified: 02/28/2020
+07:15:02), please wait.
+
+(PDFTeX) PDFTeX engine .................................. SUCCESS
+
+Processing 'doc21.tex' (size: 28 B, last modified: 02/28/2020
+07:15:10), please wait.
+
+(PDFTeX) PDFTeX engine .................................. SUCCESS
+
+Total: 1.20 seconds
+\end{codebox}
+
 The tool has a set of command line options (also known as flags or switches) that modify the underlying execution behaviour or enhance the execution workflow. If you do not provide any parameters, \arara\ will display the tool usage and the available options:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ arara
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-arara 4.0 (revision 1)
-Copyright (c) 2012-2017, Paulo Roberto Massa Cereda
-All rights reserved
+Usage: arara [OPTIONS] [file]...
 
-usage: arara [file [--dry-run] [--log] [--verbose | --silent]
-             [--timeout N] [--max-loops N] [--language L]
-             [ --preamble P ] [--header] | --help | --version]
- -h,--help                 print the help message
- -H,--header               extract directives only in the file header
- -l,--log                  generate a log output
- -L,--language <code>      set the application language
- -m,--max-loops <number>   set the maximum number of loops
- -n,--dry-run              go through all the motions of running a
-                           command, but with no actual calls
- -p,--preamble <name>      set the file preamble based on the
-                           configuration file
- -s,--silent               hide the command output
- -t,--timeout <number>     set the execution timeout (in milliseconds)
- -V,--version              print the application version
- -v,--verbose              print the command output
+Options:
+  -l, --log                        Generate a log output
+  -v, --verbose / -s, --silent     Print the command output
+  -n, --dry-run                    Go through all the motions of running a
+                                   command, but with no actual calls
+  -H, --header                     Extract directives only in the file header
+  -t, --timeout INT                Set the execution timeout (in milliseconds)
+  -L, --language TEXT              Set the application language
+  -m, --max-loops INT              Set the maximum number of loops (> 0)
+  -p, --preamble TEXT              Set the file preamble based on the
+                                   configuration file
+  -d, --working-directory DIRECTORY
+                                   Set the working directory for all tools
+  -V, --version                    Show the version and exit
+  -h, --help                       Show this message and exit
+
+Arguments:
+  file  The file(s) to evaluate and process
 \end{codebox}
 
 The available options for our tool are detailed as follows. Each option contains short and long variations, which are denoted by \opbox{o} and \opbox{{-}option} in the command line, respectively. Additionally, when a parameter is required by the current option, it will be denoted by \prbox{parameter} in the description.
@@ -139,20 +161,20 @@
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ arara -L nl doc5.tex
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Verwerken van 'doc5.tex' (grootte: 307 bytes, laatst gewijzigd:
-05/29/2018 11:50:32), een ogenblik geduld.
+Verwerken van 'doc5.tex' (grootte: 285 B, laatst gewijzigd:
+03/01/2020 19:25:40), een ogenblik geduld.
 
-(PDFLaTeX) PDFLaTeX engine ............................ SUCCESVOL
-(BibTeX) The BibTeX reference management software ..... SUCCESVOL
-(PDFLaTeX) PDFLaTeX engine ............................ SUCCESVOL
-(PDFLaTeX) PDFLaTeX engine ............................ SUCCESVOL
+(PDFLaTeX) PDFLaTeX engine .............................. SUCCESVOL
+(BibTeX) The BibTeX reference management software ....... SUCCESVOL
+(PDFLaTeX) PDFLaTeX engine .............................. SUCCESVOL
+(PDFLaTeX) PDFLaTeX engine .............................. SUCCESVOL
 
-Totaal: 1,59 seconden
+Totaal: 1,07 seconden
 \end{codebox}
 
 \begin{messagebox}{Navis volitans mihi anguillis plena est}{araracolour}{\icok}{white}
@@ -174,7 +196,7 @@
 
 \vspace{1.4em}
 
-Would you like to make \arara\ speak your own language? Splendid! We would love to have you in the team! Just send us an electronic mail, join our \href{https://gitter.im/cereda/arara}{dedicated chatroom} or \href{https://github.com/cereda/arara/issues}{open an issue} about it. The localization process is quite straightforward, we can help you. Any language is welcome!
+Would you like to make \arara\ speak your own language? Splendid! We would love to have you in the team! Just send us an electronic mail, join our \href{https://gitter.im/cereda/arara}{dedicated chatroom} or \href{https://gitlab.com/islandoftex/arara/issues}{open an issue} about it. The localization process is quite straightforward, we can help you. Any language is welcome!
 \end{messagebox}
 
 This option can also be specified in the configuration file (see Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). However, one can always override this setting by running the tool with an explicit \opbox{L} option.
@@ -194,7 +216,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc8.tex' (size: 45 bytes, last modified: 05/29/2018
+Processing 'doc8.tex' (size: 45 B, last modified: 05/29/2018
 12:32:14), please wait.
 
 (PDFTeX) PDFTeX engine .................................. SUCCESS
@@ -209,35 +231,35 @@
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ arara -n doc5.tex 
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc5.tex' (size: 307 bytes, last modified: 05/29/2018
-11:50:32), please wait.
+Processing 'doc5.tex' (size: 285 B, last modified: 03/01/2020
+19:25:40), please wait.
 
 [DR] (PDFLaTeX) PDFLaTeX engine
 -----------------------------------------------------------------
-Authors: Marco Daniel, Paulo Cereda
-About to run: [ pdflatex, doc5.tex ]
+Author: Island of TeX
+About to run: [ pdflatex, /home/paulo/Downloads/doc5.tex ] @ 
 
 [DR] (BibTeX) The BibTeX reference management software
 -----------------------------------------------------------------
-Authors: Marco Daniel, Paulo Cereda
-About to run: [ bibtex, doc5 ]
+Author: Island of TeX
+About to run: [ bibtex, doc5 ] @ 
 
 [DR] (PDFLaTeX) PDFLaTeX engine
 -----------------------------------------------------------------
-Authors: Marco Daniel, Paulo Cereda
-About to run: [ pdflatex, doc5.tex ]
+Author: Island of TeX
+About to run: [ pdflatex, /home/paulo/Downloads/doc5.tex ] @ 
 
 [DR] (PDFLaTeX) PDFLaTeX engine
 -----------------------------------------------------------------
-Authors: Marco Daniel, Paulo Cereda
-About to run: [ pdflatex, doc5.tex ]
+Author: Island of TeX
+About to run: [ pdflatex, /home/paulo/Downloads/doc5.tex ] @ 
 
-Total: 0.27 seconds
+Total: 0.23 seconds
 \end{codebox}
 
 Note that the rule authors are displayed (so they can be blamed in case anything goes wrong), as well as the system command to be executed. It is an interesting approach to see everything that will happen to your document and in which order.
@@ -268,7 +290,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc9.tex' (size: 18 bytes, last modified: 05/29/2018
+Processing 'doc9.tex' (size: 18 B, last modified: 05/29/2018
 14:39:21), please wait.
 
 (PDFTeX) PDFTeX engine .................................. SUCCESS
@@ -295,7 +317,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc10.tex' (size: 63 bytes, last modified: 05/29/2018
+Processing 'doc10.tex' (size: 63 B, last modified: 05/29/2018
 15:24:06), please wait.
 
 (PDFTeX) PDFTeX engine .................................   ERROR
@@ -314,6 +336,8 @@
 
 If left unattended, this particular execution would never finish (and probably crash the engine at a certain point), as expected by the recursive calls without a proper fixed point. The \opbox{{-}timeout} option was set at 3000 milliseconds and the task was aborted when the time limit was reached. Note that the tool raised an error about it.
 
+\item[\describeop{d}{working-directory}] This option allows you to change the working directory. That is, the commands will run from a different directory than the directory you launched \arara\ in. This is especially useful when calling a \TeX\ engine as they resolve files against the working direcotry. For that reason, \arara\ will also resolve each file you pass to it that has no absolute path against the working directory. The working directory is fixed for the whole call; passing multiple files to \arara\ will resolve all of them against and execute all actions within that one working directory.
+
 \item[\describeop{V}{version}] This option, as the name indicates, prints the current version. It also prints the current revision and a list of libraries with their corresponding licenses. Finally, it simply exits the application. Note that this option has the second highest priority over the others.
 
 \item[\describeop{v}{verbose}] This option enables the verbose mode of \arara, as seen in Section~\ref{sec:userinterfacedesign}, on page~\pageref{sec:userinterfacedesign}. It also enables all streams to be flushed directly to the terminal, including potential user input interactions (the exact opposite of silent mode). This option can also be activated by default in the configuration file (see Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}).
@@ -360,7 +384,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc11.tex' (size: 34 bytes, last modified: 05/29/2018
+Processing 'doc11.tex' (size: 34 B, last modified: 05/29/2018
 19:40:35), please wait.
 
 (PDFTeX) PDFTeX engine .................................. SUCCESS
@@ -377,7 +401,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc11.tex' (size: 34 bytes, last modified: 05/29/2018
+Processing 'doc11.tex' (size: 34 B, last modified: 05/29/2018
 19:40:35), please wait.
 
 (PDFTeX) PDFTeX engine .................................. SUCCESS
@@ -384,6 +408,24 @@
 
 Total: 0.69 seconds
 \end{codebox}
+
+\item Many shells complete file names that have multiple extensions in the same directory, so that they end with a period. We try to
+resolve against them as well!
+
+\begin{codebox}{Terminal}{teal}{\icnote}{white}
+$ arara doc11.
+  __ _ _ __ __ _ _ __ __ _ 
+ / _` | '__/ _` | '__/ _` |
+| (_| | | | (_| | | | (_| |
+ \__,_|_|  \__,_|_|  \__,_|
+
+Processing 'doc11.tex' (size: 34 B, last modified: 05/29/2018
+19:40:35), please wait.
+
+(PDFTeX) PDFTeX engine .................................. SUCCESS
+
+Total: 0.69 seconds
+\end{codebox}
 \end{itemize}
 
 It is highly recommended to use complete file names with our tool, in order to ensure the correct file is being processed. If your command line interpreter features tab completion, you can use it to automatically fill partially typed file names from your working directory.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/concepts.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/concepts.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/concepts.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -15,7 +15,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'doc1.tex' (size: 83 bytes, last modified: 05/03/2018
+Processing 'doc1.tex' (size: 83 B, last modified: 05/03/2018
 12:10:33), please wait.
 
 I could not find a rule named 'foo' in the provided rule paths.
@@ -28,8 +28,12 @@
 
 Once a rule is defined, \arara\ automatically provides an access layer to that rule through directives in the source code, a concept to be formally introduced later on, in Section~\ref{sec:directives}. Observe that a directive reflects a particular instance of a rule of the same name (i.e, a \rbox{foo} directive in a certain source code is an instance of the \rbox{foo} rule).
 
-In short, a rule is a plain text file written in the \gls{YAML} format, described in Chapter~\ref{chap:yaml}, on page~\pageref{chap:yaml}. I opted for this format because back then it was cleaner and more intuitive to use than other markup languages such as \gls{XML}, besides of course being a data serialization standard for programming languages.
+\begin{messagebox}{A note about rules}{attentioncolour}{\icattention}{black}
+For version 5.0, we kept the current YAML rule scheme. However, the names of the rules being public are marked as deprecated, as they might change in future versions.
+\end{messagebox}
 
+In short, a rule is a plain text file written in the YAML format, described in Chapter~\ref{chap:yaml}, on page~\pageref{chap:yaml}. I opted for this format because back then it was cleaner and more intuitive to use than other markup languages such as XML, besides of course being a data serialization standard for programming languages.
+
 \begin{messagebox}{Animal jokes}{araracolour}{\icok}{white}
 As a bonus, the acronym \emph{YAML} rhymes with the word \emph{camel}, so \arara\ is heavily environmentally friendly. Speaking of camels, there is the programming reference as well, since this amusing animal is usually associated with Perl and friends.
 \end{messagebox}
@@ -36,12 +40,12 @@
 
 The default rules, i.e, the rules shipped with \arara, are placed inside a special subdirectory named \abox[araracolour]{rules/} inside another special directory named \abox[araracolour]{ARARA\_HOME} (the place where our tool is installed). We will learn later on, in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}, that we can add an arbitrary number of paths for storing our own rules, in order of priority, so do not worry too much about the location of the default rules, although it is important to understand and acknowledge their existence.
 
-The following list describes the basic structure of an \arara\ rule by presenting the proper elements (or keys, if we consider the proper \gls{YAML} nomenclature). Observe that elements marked as \rbox[araracolour]{M} are mandatory (i.e, the rule \emph{has} to have them in order to work). Similarly, elements marked as \rbox[araracolour]{O} are optional, so you can safely ignore them when writing a rule for our tool. A key preceded by \rbox{context$\rightarrow$} indicates a context and should be properly defined inside it.
+The following list describes the basic structure of an \arara\ rule by presenting the proper elements (or keys, if we consider the proper YAML nomenclature). Observe that elements marked as \rbox[araracolour]{M} are mandatory (i.e, the rule \emph{has} to have them in order to work). Similarly, elements marked as \rbox[araracolour]{O} are optional, so you can safely ignore them when writing a rule for our tool. A key preceded by \rbox{context$\rightarrow$} indicates a context and should be properly defined inside it.
 
 \begin{description}
 \item[\describe{M}{!config}] This keyword is mandatory and must be the first line of any \arara\ rule. It denotes the object mapping metadata to be internally used by the tool. Actually, the tool is not too demanding on using it (in fact, you could suppress it entirely and \arara\ will not complain), but it is considered good practice to start all rules with a \abox{!config} keyword regardless.
 
-\item[\describe{M}{identifier}] This key acts as a unique identifier for the rule (as expected). It is highly recommended to use lowercase letters without spaces, accents or punctuation symbols, as good practice (again). As a convention, if you have an identifier named \rbox{pdflatex}, the rule filename must be \rbox{pdflatex.yaml} (like our own instance). Please note that, although \rbox{yml} is known to be a valid \gls{YAML} extension as well, \arara\ only considers files ending with the \rbox{yaml} extension. This is a deliberate decision.
+\item[\describe{M}{identifier}] This key acts as a unique identifier for the rule (as expected). It is highly recommended to use lowercase letters without spaces, accents or punctuation symbols, as good practice (again). As a convention, if you have an identifier named \rbox{pdflatex}, the rule filename must be \rbox{pdflatex.yaml} (like our own instance). Please note that, although \rbox{yml} is known to be a valid YAML extension as well, \arara\ only considers files ending with the \rbox{yaml} extension. This is a deliberate decision.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 identifier: pdflatex
@@ -61,31 +65,19 @@
 - Paulo Cereda
 \end{codebox}
 
-\item[\describe{M}{commands}] This key is introduced in version 4.0 of \arara\ and denotes a potential list of commands. From the user perspective, each command is called a \emph{subtask} within a task (rule and directive) context. A task may represent only a single command (a single subtask), as well as a sequence of commands (subtasks). For instance, the \rbox{frontespizio} rule requires at least two commands. So, as a means of normalizing the representation, a task composed of a single command (single subtask) is defined as the only element of the list, as opposed to previous versions of \arara, which had a specific key to hold just one command.
+\item[\describe{M}{commands}] This key denotes a potential list of commands. From the user perspective, each command is called a \emph{subtask} within a task (rule and directive) context. A task may represent only a single command (a single subtask), as well as a sequence of commands (subtasks). For instance, the \rbox{frontespizio} rule requires at least two commands. So, as a means of normalizing the representation, a task composed of a single command (single subtask) is defined as the only element of the list, as opposed to previous versions of \arara, which had a specific key to hold just one command.
 
-\begin{messagebox}{Incompatibility with older versions}{attentioncolour}{\icerror}{black}
-Dear reader, note that rules from version 4.0 are incompatible with older versions of \arara. If you are migrating from old versions to version 4.0, we need to replace \abox{command} by \abox{commands} and specify a contextual element, as seen in the following descriptions. Please refer to Section~\ref{sec:migrationguide}, on page~\pageref{sec:migrationguide}, for a comprehensible migration guide.
-\end{messagebox}
-
 In order to properly set a subtask, the keys used in this specification are defined inside the \rbox{commands$\rightarrow$} context and presented as follows.
 
 \begin{description}
 \item[\describecontext{O}{commands}{name}] This key holds the name of the subtask as a plain string. When running \arara, this value will be displayed in the output. Subtask names are displayed after the main task name. By the way, did you notice that this key is entirely optional? That means that a subtask can simply be unnamed, if you decide so. However, such practice is not recommended, as it's always good to have a visual description of what \arara\ is running at the moment, so name your subtasks properly.
 
-\item[\describecontext{M}{commands}{command}] This key holds the action to be performed, typically a system command. In previous versions, \arara\ would rely solely on a string. For this version on, as a means to enhance the user experience (and also fix serious blockers when handling spaces in file names, as seen in \href{https://github.com/cereda/arara/issues}{previous issues} reported in the repository), the tool offers four types of returned values:
+\item[\describecontext{M}{commands}{command}] This key holds the action to be performed, typically a system command. The tool offers two types of returned values:
 
 \begin{itemize}[label={--}]
-\item A plain string: this is the default (and only) behaviour in older versions of \arara. The plain string is processed as it is by the underlying execution engine. However, automatic argument parsing is problematic, so this approach, although supported, is not recommended any more.
+\item A \rbox{Command} object: \arara\ features an approach for handling system commands based on a high level structure with explicit argument parsing named \rbox{Command} (for our curious users, it is a plain Java object). In order to use this approach, we need to rely on orb tags and use a helper method named \mtbox{getCommand} to obtain the desired result. We will detail this method later on, in Section~\ref{sec:commands}, on page~\pageref{sec:commands}. We highly recommend the adoption of this approach for rule writing instead of using plain strings.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
-command: 'ls'
-\end{codebox}
-
-It is important to observe that you can use either a plain string directly or use an \gls{orb-tag} with an explicit \rbox{return} command (as seen in Section~\ref{sec:mvelbasicusage}, on page~\pageref{sec:mvelbasicusage}). Personally, I favour the explicit indication for a quick understanding.
-
-\item A \rbox{Command} object: \arara\ 4.0 features a new approach for handling system commands based on a high level structure with explicit argument parsing named \rbox{Command} (for our curious users, it is a plain Java object). In order to use this approach, we need to rely on \glspl{orb-tag} and use a helper method named \mtbox{getCommand} to obtain the desired result. We will detail this method later on, in Section~\ref{sec:commandsandtriggers}, on page~\pageref{sec:commandsandtriggers}. We highly recommend the adoption of this approach for rule writing instead of using plain strings.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
 command: "@{ return getCommand('ls') }"
 \end{codebox}
 
@@ -94,33 +86,27 @@
 \begin{codebox}{Example}{teal}{\icnote}{white}
 command: "@{ return 1 == 1 }"
 \end{codebox}
-
-\item A \rbox{Trigger} object: this is surely the least common type of returned value and it is mentioned here just for documentation purposes. In simple terms, a \rbox{Trigger} object constitutes a special command that changes the internal workings of \arara\ at runtime. We have not worked much on this concept, so there is only one trigger available, seen in action in the official \rbox{halt} rule. In order to use this approach, we need to rely on \glspl{orb-tag} and use a helper method named \mtbox{getTrigger} to obtain the desired result.
 \end{itemize}
 
-It is also worth mentioning that \arara\ also supports lists of commands represented as plain strings, \rbox{Command} or \rbox{Trigger} objects, boolean values or a mix of them. This is useful if your rule has to decide whether more actions are required in order to accomplish a task. In this case, our tool will take care of the list and execute each element in the specified order.
+It is also worth mentioning that \arara\ also supports lists of commands represented as \rbox{Command} objects, boolean values or a mix of them. This is useful if your rule has to decide whether more actions are required in order to accomplish a task. In this case, our tool will take care of the list and execute each element in the specified order.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
-command: "@{ return [ 'ls', 'ls', 'ls' ] }"
+command: "@{ return [ getCommand('ls'), getCommand('ls') ] }"
 \end{codebox}
 
 As an example, please refer to the official \rbox{clean} rule for a real scenario where a list of commands is successfully employed: for each provided extension, the rule creates a new cleaning command and adds it to a list of removals to be processed later.
 
-\begin{messagebox}{Plain string is deprecated}{attentioncolour}{\icattention}{black}
-It took me a lot of effort to find out that handling plain strings and employing guesswork to parse arguments are the root of several issues reported by users. Therefore, this approach is being marked as \emph{deprecated} and will be removed in future versions.
-\end{messagebox}
+There are at least two variables available in the \abox{command} context and are described as follows (note that MVEL variables and orb tags are discussed in Chapter~\ref{chap:mvel}). A variable will be denoted by \varbox{variable} in this list. For each rule argument (defined later on), there will be a corresponding variable in the \abox{command} context, directly accessed through its unique identifier.
 
-There are at least two variables available in the \abox{command} context and are described as follows (note that \gls{MVEL} variables and \glspl{orb-tag} are discussed in Chapter~\ref{chap:mvel}). A variable will be denoted by \varbox{variable} in this list. For each rule argument (defined later on), there will be a corresponding variable in the \abox{command} context, directly accessed through its unique identifier.
-
 \begin{description}
 \item[\varbox{file}] This variable holds the file name, without any path reference, as a plain string. It is usually composed from the base name and the extension. This variable is available since the first release of \arara.
 
-\item[\varbox{reference}] This variable is introduced in version 4.0 of \arara\ and holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
+\item[\varbox{reference}] This variable holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
 \end{description}
 
 \begin{messagebox}{Quote handling}{araracolour}{\icinfo}{white}
 \setlength{\parskip}{1em}
-The \gls{YAML} format disallows key values starting with \rbox{@} without proper quoting. This is the reason we had to use double quotes for the value and internally using single quotes for the command string. Also, we could use the other way around, or even using only one type and then escaping them when needed. This is excessively verbose but needed due to the format requirement. Thankfully, \arara\ offers two solutions for removing the quoting verbosity when writing commands.
+The YAML format disallows key values starting with \rbox{@} without proper quoting. This is the reason we had to use double quotes for the value and internally using single quotes for the command string. Also, we could use the other way around, or even using only one type and then escaping them when needed. This is excessively verbose but needed due to the format requirement. Thankfully, \arara\ offers two solutions for removing the quoting verbosity when writing commands.
 
 The first solution is used in previous versions and it still works like a charm in modern days. We need to precede our command with a special keyword \rbox{<arara>} which will be removed afterwards. This solution works on virtually every key in the rule context, so it is a bonus. The new code will look like this:
 
@@ -128,7 +114,7 @@
 command: <arara> @{ return getCommand('ls') }
 \end{codebox}
 
-The second approach is more of a \gls{YAML} feature rather than a tool exclusive, although we have to do a couple of checks under the hood in order to ensure the correct execution. The idea here is to use the scalar content in folded style, as seen in Section~\ref{sec:yamlscalars}, on page~\pageref{sec:yamlscalars}. The new code will look like this:
+The second approach is more of a YAML feature rather than a tool exclusive, although we have to do a couple of checks under the hood in order to ensure the correct execution. The idea here is to use the scalar content in folded style, as seen in Section~\ref{sec:yamlscalars}, on page~\pageref{sec:yamlscalars}. The new code will look like this:
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 command: >
@@ -137,10 +123,10 @@
   }
 \end{codebox}
 
-Mind the indentation, as \gls{YAML} requires it to properly identify blocks. I personally recommend this approach for longer code, as it provides a better visual representation. You will see the second solution all around the default rules, but feel free to use the one you feel more comfortable with.
+Mind the indentation, as YAML requires it to properly identify blocks. Please keep in mind that the \rbox{<arara>} keyword is marked as deprecated in version 5.0 and will be removed in future versions of \arara, so it is highly recommended to favour this approach.
 \end{messagebox}
 
-\item[\describecontext{O}{commands}{exit}] This key holds a special purpose in \arara\ 4.0, as it represents a custom exit status evaluation for the corresponding command. In general, a successful execution has zero as an exit status, but sometimes we end up with tools or situations where we need to override this check for whatever reason. For this purpose, simply write a \gls{MVEL} expression \emph{without \glspl{orb-tag}} as plain string and use the special variable \varbox{value} if you need the actual exit status returned by the command, available at runtime. For example, if the command returns a non-zero value indicating a successful execution, we can write this key as:
+\item[\describecontext{O}{commands}{exit}] This key holds a special purpose, as it represents a custom exit status evaluation for the corresponding command. In general, a successful execution has zero as an exit status, but sometimes we end up with tools or situations where we need to override this check for whatever reason. For this purpose, simply write a MVEL expression \emph{without orb tags} as plain string and use the special variable \varbox{value} if you need the actual exit status returned by the command, available at runtime. For example, if the command returns a non-zero value indicating a successful execution, we can write this key as:
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 exit: value > 0
@@ -199,10 +185,10 @@
 
 \item[\varbox{file}] This variable holds the file name, without any path reference, as a plain string. It is usually composed from the base name and the extension. This variable is available since the first release of \arara.
 
-\item[\varbox{reference}] This variable is introduced in version 4.0 of \arara\ and holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
+\item[\varbox{reference}] This variable holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
 \end{description}
 
-In the previous example, observe that the \gls{MVEL} expression defined in the \abox{flag} key checks if the user provided an affirmative value regarding shell escape, through comparing \varbox{parameters.shell} with a set of predefined affirmative values. In any case, the corresponding command flag is defined as result of such evaluation.
+In the previous example, observe that the MVEL expression defined in the \abox{flag} key checks if the user provided an affirmative value regarding shell escape, through comparing \varbox{parameters.shell} with a set of predefined affirmative values. In any case, the corresponding command flag is defined as result of such evaluation.
 
 \item[\describecontext{O}{arguments}{default}] As default behaviour, if a parameter is not set in the directive context, the reference will be mapped to an empty string. This key exists for the exact purpose of overriding such behaviour.
 
@@ -217,7 +203,7 @@
 
 \item[\varbox{file}] This variable holds the file name, without any path reference, as a plain string. It is usually composed from the base name and the extension. This variable is available since the first release of \arara.
 
-\item[\varbox{reference}] This variable is introduced in version 4.0 of \arara\ and holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
+\item[\varbox{reference}] This variable holds the canonical, absolute path representation of the \varbox{file} variable as a \rbox{File} object. This is useful if it's necessary to know the hierarchical structure of a project. Since the reference is a Java object, we can use all methods available in the \rbox{File} class.
 \end{description}
 
 \item[\describecontext{O}{arguments}{required}] There might be certain scenarios in which a rule could make use of required arguments (for instance, a copy operation in which source and target must be provided). The \abox{required} key acts as a boolean switch to indicate whether the corresponding argument should be mandatory. In this case, set the key value to \rbox{true} and the argument becomes required. Later on at runtime, \arara\ will throw an error if a required parameter is missing in the directive.
@@ -249,7 +235,7 @@
 \end{codebox}
 \end{description}
 
-This is the rule structure in the \gls{YAML} format used by \arara. Keep in mind that all subtasks in a rule are checked against their corresponding exit status. If an abnormal execution is detected, the tool will instantly halt and the rule will fail. Even \arara\ itself will return an exit code different than zero when this situation happens (detailed in Chapter~\ref{chap:commandline}, on page~\pageref{chap:commandline}).
+This is the rule structure in the YAML format used by \arara. Keep in mind that all subtasks in a rule are checked against their corresponding exit status. If an abnormal execution is detected, the tool will instantly halt and the rule will fail. Even \arara\ itself will return an exit code different than zero when this situation happens (detailed in Chapter~\ref{chap:commandline}, on page~\pageref{chap:commandline}).
 
 \section{Directives}
 \label{sec:directives}
@@ -256,14 +242,6 @@
 
 A \emph{directive} is a special comment inserted in the source file in which you indicate how \arara\ should behave. You can insert as many directives as you want and in any position of the file. The tool will read the whole file and extract the directives.
 
-\begin{messagebox}{New features in version 4.0}{araracolour}{\icinfo}{white}
-\setlength{\parskip}{1em}
-\textbf{Partial directive extraction} -- From version 4.0 of \arara\ on, it is now possible to extract directives only available in the file preamble, i.e, all lines from the beginning that are comments until reaching the first line that is not a comment (excluding blank lines). To this end, a new command line flag is introduced in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}.
-
-\textbf{Predefined preambles} -- Common preambles can be predefined and used with files that require the same automation steps, then \arara\ can be invoked based on such specifications. This feature is covered in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}.
-\end{messagebox}
-
-
 There are two types of directives in \arara\ which determine the way the corresponding rules will be instantiated. They are listed as follows. Note that directives are always preceded by the \rbox{arara:} pattern.
 
 \begin{description}
@@ -273,7 +251,7 @@
 % arara: pdflatex
 \end{codebox}
 
-\item[parametrized directive] This type of directive also has the rule name (which refers to the \abox{identifier} key from the rule of the same name), and also contains a map of parameters in order to provide additional information to the corresponding rule. This map is defined in the \gls{YAML} format, based on the inline style.
+\item[parametrized directive] This type of directive also has the rule name (which refers to the \abox{identifier} key from the rule of the same name), and also contains a map of parameters in order to provide additional information to the corresponding rule. This map is defined in the YAML format, based on the inline style.
 
 \begin{codebox}{Parametrized directive}{teal}{\icnote}{white}
 % arara: pdflatex: { shell: yes }
@@ -296,7 +274,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'hello.tex' (size: 103 bytes, last modified:
+Processing 'hello.tex' (size: 103 B, last modified:
 05/03/2018 15:40:16), please wait.
 
 I have spotted an error in rule 'pdflatex' located at
@@ -309,12 +287,8 @@
 
 As the message suggests, we need to remove the unknown parameter key from our directive or rewrite the rule in order to include it as an argument. The first option is, of course, easier.
 
-\begin{messagebox}{New feature in version 4.0}{araracolour}{\icinfo}{white}
-\textbf{Helpful messages} -- It is a staple of \arara\ to have friendly and helpful messages. From version 4.0 on, we decided to make messages even friendlier and include suggestions for correcting errors or improving usage. So, whenever possible, make sure to read all messages our tool provides, they will help you!
-\end{messagebox}
+Sometimes, directives can span several columns of a line, particularly the ones with several parameters. We can split a directive into multiple lines by using the \rbox{arara: {-}{-}>} mark (also known as \emph{arrow notation} during development) to each line which should compose the directive. We call it a \emph{multiline directive}. Let us see an example:
 
-Sometimes, directives can span several columns of a line, particularly the ones with several parameters. From \arara\ 4.0 on, we can split a directive into multiple lines by using the \rbox{arara: {-}{-}>} mark (also known as \emph{arrow notation} during development) to each line which should compose the directive. We call it a \emph{multiline directive}. Let us see an example:
-
 \begin{codebox}{Multiline directive}{teal}{\icnote}{white}
 % arara: pdflatex: {
 % arara: --> shell: yes,
@@ -328,28 +302,28 @@
 Although it is possible to spread lines of a multiline directive all over the code, it is considered good practice to keep them together for easier reading and editing. In any case, you can always see which lines compose a directive by inspecting the log file.
 \end{messagebox}
 
-\arara\ 4.0 provides logical expressions, written in the \gls{MVEL} language, and special operators processed at runtime in order to determine whether and how a directive should be processed. This feature is named \emph{directive conditional}, or simply \emph{conditional} as an abbreviation. The following list describes all conditional operators available in the directive context.
+\arara\ provides logical expressions, written in the MVEL language, and special operators processed at runtime in order to determine whether and how a directive should be processed. This feature is named \emph{directive conditional}, or simply \emph{conditional} as an abbreviation. The following list describes all conditional operators available in the directive context.
 
 \begin{description}
-\item[\describeconditional{a priori}{if}] The associated \gls{MVEL} expression is evaluated beforehand, and the directive is interpreted if, and only if, the result of such evaluation is true. This directive, when the conditional holds true, is executed at most once.
+\item[\describeconditional{a priori}{if}] The associated MVEL expression is evaluated beforehand, and the directive is interpreted if, and only if, the result of such evaluation is true. This directive, when the conditional holds true, is executed at most once.
 
 \begin{codebox}{Conditional}{teal}{\icnote}{white}
 % arara: pdflatex if missing('pdf') || changed('tex')
 \end{codebox}
 
-\item[\describeconditional{a posteriori}{until}] The directive is interpreted the first time, then the associated \gls{MVEL} expression evaluation is done. While the result holds false, the directive is interpreted again and again. There are no guarantees of proper halting.
+\item[\describeconditional{a posteriori}{until}] The directive is interpreted the first time, then the associated MVEL expression evaluation is done. While the result holds false, the directive is interpreted again and again. There are no guarantees of proper halting.
 
 \begin{codebox}{Conditional}{teal}{\icnote}{white}
 % arara: pdflatex until !found('log', 'undefined references')
 \end{codebox}
 
-\item[\describeconditional{a priori}{unless}] Technically an inverted \cdbox{if} conditional, the associated \gls{MVEL} expression is evaluated beforehand, and the directive is interpreted if, and only if, the result is false. This directive, when the conditional holds false, is executed at most once.
+\item[\describeconditional{a priori}{unless}] Technically an inverted \cdbox{if} conditional, the associated MVEL expression is evaluated beforehand, and the directive is interpreted if, and only if, the result is false. This directive, when the conditional holds false, is executed at most once.
 
 \begin{codebox}{Conditional}{teal}{\icnote}{white}
 % arara: pdflatex unless unchanged('tex') && exists('pdf')
 \end{codebox}
 
-\item[\describeconditional{a priori}{while}] The associated \gls{MVEL} expression is evaluated beforehand, the directive is interpreted if, and only if, the result is true, and the process is repeated while the result still holds true. There are no guarantees of proper halting.
+\item[\describeconditional{a priori}{while}] The associated MVEL expression is evaluated beforehand, the directive is interpreted if, and only if, the result is true, and the process is repeated while the result still holds true. There are no guarantees of proper halting.
 
 \begin{codebox}{Conditional}{teal}{\icnote}{white}
 % arara: pdflatex while missing('pdf') ||
@@ -407,7 +381,7 @@
 
 Even when a directive is interpreted with a file other than the one being processed by \arara\ (through the magic of the \abox{files} parameter), it is possible to use helper methods in the rule context to get access to the original file and reference. Such methods are detailed later on, in Section~\ref{sec:files}, on page~\pageref{sec:files}.
 
-\section{Migration guide}
+\section{Important changes in version 5.0}
 \label{sec:migrationguide}
 
 \begin{messagebox}{A note to users}{araracolour}{\icattention}{white}
@@ -414,192 +388,91 @@
 If this is your first time using \arara\ or you do not have custom rules in the old format, you can safely ignore this section. All rules shipped with our tool are already written in the new format.
 \end{messagebox}
 
-As previously discussed in Section~\ref{sec:rule}, on page~\pageref{sec:rule}, version 4.0 of \arara\ introduces a new rule format. As a result, user-defined rules in the old format are incompatible with the new version of our tool and thus have to be updated. In short, we need to replace \abox{command} by \abox{commands} and specify a contextual element. As an example, consider the following hypothetical rule \rbox{ls} written in the old format:
+\begin{messagebox}{Removal of triggers}{araracolour}{\icattention}{white}
+\arara\ previously had the concept of triggers which allowed to easily trigger events like halting \arara. As of version 5.0, support for triggers has been dropped due to the lack of use cases.
 
-\begin{codebox}{A rule in the old format}{teal}{\icnote}{white}
-!config
-identifier: ls
-name: LS
-command: ls @{details}
-arguments:
-- identifier: details
-  flag: '@{ isTrue(parameters.details, "-l", "") }'
-\end{codebox}
+As the only pre-defined trigger has been \rbox{halt} we did not deprecate the ability to halt the application. However, the new mechanism uses the concept of session values (see \autoref{sec:others}).
+\end{messagebox}
 
-This rule does nothing too important, it simply runs the system command \rbox{ls} which lists the contents of the current directory. However, when we try to run \arara\ on a file which contains a directive referencing this rule, we get the following error in the terminal:
+\begin{messagebox}{Removal of Velocity support}{araracolour}{\icinfo}{white}
+\arara\ featured support for the Velocity Template Language. In version 5.0, this support has been removed. We decided in favour of this breaking change to achieve more independence from third-party modules and to avoid being stuck at version~1.7 for compatibility reasons.
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-  __ _ _ __ __ _ _ __ __ _ 
- / _` | '__/ _` | '__/ _` |
-| (_| | | | (_| | | | (_| |
- \__,_|_|  \__,_|_|  \__,_|
+Due to this change, \arara\ does not ship support for any templating language at the moment. If you are interested in getting a templating language on board, you are welcome to support our efforts to make the inclusion of JVM code on the user-side more pleasant.
+\end{messagebox}
 
-Processing 'doc4.tex' (size: 31 bytes, last modified: 05/27/2018
-21:05:57), please wait.
+\begin{messagebox}{Removal of string-based commands}{araracolour}{\icinfo}{white}
+Up to version 5.0 you could simply use
 
-I have spotted an error in rule 'ls' located at '/home/paulo'. 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. There are more details available on this
-exception:
-
-DETAILS ---------------------------------------------------------
-Cannot create property=command for
-JavaBean=com.github.cereda.arara.model.Rule at 29774679
- in
-'reader', line 1, column 1:
-    !config
-    ^
-Unable to find
-property 'command' on class: com.github.cereda.arara.model.Rule
-
-in 'reader', line 4, column 10:
-    command: ls @{details}
-      
-      ^
-
-
-Total: 0.03 seconds
+\begin{codebox}{Return statement}{teal}{\icnote}{white}
+return "command";
 \end{codebox}
 
-The above terminal output shows the usual error \arara\ raises when a rule in the old format is used, and thus the corresponding \gls{YAML} file is considered invalid. In order to fix the rule, we need to move the \abox{command} key inside a \rbox{commands$\rightarrow$} context as a list element, as seen as follows.
+\noindent in your rules. This resulted in \arara\ implicitly constructing a command object. As this does not make clear that this command is actually run, we now enforce the usage of
 
-\begin{codebox}{A rule converted into the new format}{teal}{\icnote}{white}
-!config
-identifier: ls
-name: LS
-commands:
-- command: ls @{details}
-arguments:
-- identifier: details
-  flag: '@{ isTrue(parameters.details, "-l", "") }'
-\end{codebox}
+\vspace{1em}
 
-Note that this fix is sufficient to make the rule valid in the new format. Also, it is interesting to observe that the subtask will be unnamed during the execution, as there is no corresponding \abox{name} key  in the list element.
+\mdbox{R}{getCommand(List<String> commands)}{Command}
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-(LS) Unnamed task ....................................... SUCCESS
-\end{codebox}
+\vspace{1em}
 
-Now, let us consider an example containing a list of commands, also based on the old format. The \rbox{ls} rule was updated to include two runs of the system command of the same name in the current directory:
+\noindent in the \rbox{return} statement. Hence, the new way of doing the same is (with either single or double quote pairs):
 
-\begin{codebox}{A rule in the old format}{teal}{\icnote}{white}
-!config
-identifier: ls
-name: LS
-commands:
-- ls @{details}
-- ls @{details}
-arguments:
-- identifier: details
-  flag: '@{ isTrue(parameters.details, "-l", "") }'
+\begin{codebox}{Return statement}{teal}{\icnote}{white}
+return getCommand("command");
 \end{codebox}
+\end{messagebox}
 
-Observe that the old format directly represents commands as a list of plain strings. When trying to run \arara\ on a file which contains a directive referencing the updated \rbox{ls} rule, we get the following error in the terminal:
+\begin{messagebox}{Methods: removal and change of name}{araracolour}{\icinfo}{white}
+The following previously available methods (and repective overloaded variants) have been removed:
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-  __ _ _ __ __ _ _ __ __ _ 
- / _` | '__/ _` | '__/ _` |
-| (_| | | | (_| | | | (_| |
- \__,_|_|  \__,_|_|  \__,_|
+\begin{itemize}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{addQuotes(String string)}{String}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{isAIX()}{boolean}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{isIrix()}{boolean}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{isOS2()}{boolean}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{isSolaris()}{boolean}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{getFullBasename(File file)}{String}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{\parbox{0.62\textwidth}{mergeVelocityTemplate(File input,\\\hspace*{1em} File output, Map<String, Object> map)}}{void}
+\end{itemize}
 
-Processing 'doc4.tex' (size: 31 bytes, last modified: 05/27/2018
-21:05:57), please wait.
+The following methods have been renamed:
+\begin{itemize}
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{(Session.)insert(String key, Object value)}{void}
 
-I have spotted an error in rule 'ls' located at '/home/paulo'. 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. There are more details available on this
-exception:
+\vspace{.5em}
 
-DETAILS ---------------------------------------------------------
-Cannot create property=commands for
-JavaBean=com.github.cereda.arara.model.Rule at 91161c7
- in 'reader',
-line 1, column 1:
-    !config
-    ^
-No single argument
-constructor found for class
-com.github.cereda.arara.model.RuleCommand
- in 'reader', line 5,
-column 1:
-    - ls @{details}
-    ^
+\hspace{2cm}\textcolor{teal}{\faArrowDown}
 
+\item[\textcolor{okcolour}{\faCheck}]\mdbox{R}{(Session.)put(String key, Object value)}{void}
 
-Total: 0.02 seconds
-\end{codebox}
+\vspace{1em}
 
-The above terminal output shows a slightly different message, but the error is practically the same to the one \arara\ raised before when a rule in the old format was used. The difference relies on the missing rule property being set at the moment, but the idea remains the same. In order to fix the rule, we need to precede every list element in the \rbox{commands$\rightarrow$} context with the \abox{command} key, as seen as follows.
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{(Session.)exists(String key)}{boolean}
 
-\begin{codebox}{A rule converted into the new format}{teal}{\icnote}{white}
-!config
-identifier: ls
-name: LS
-commands:
-- command: ls @{details}
-- command: ls @{details}
-arguments:
-- identifier: details
-  flag: '@{ isTrue(parameters.details, "-l", "") }'
-\end{codebox}
+\vspace{.5em}
 
-This fix is sufficient to make the rule valid in the new format. Also, as mentioned before, it is interesting to observe that the subtasks will be unnamed during the execution, as there are no corresponding \abox{name} keys in the list elements.
+\hspace{2cm}\textcolor{teal}{\faArrowDown}
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-(LS) Unnamed task ....................................... SUCCESS
-(LS) Unnamed task ....................................... SUCCESS
-\end{codebox}
+\item[\textcolor{okcolour}{\faCheck}] \mdbox{R}{(Session.)contains(String key)}{boolean}
 
-There is a helper tool available in the \href{https://github.com/cereda/arara/releases/tag/4.0}{release section} of our project repository that attempts to automatically convert rules in the old format to the new one. If you want to try it, download the \rbox{rc.jar} file from the repository and put it in the same directory where the old rules are located. You can also provide a full path instead. It is important to note that, although the tool might indicate a successful conversion, there are no guarantees that the resulting rule is fully compliant with the new format, due to potential changes in the internal workings of \arara, so your mileage may vary. In general, it should work. The rule converter is written in Java and requires a virtual machine to run. The tool has a straightforward workflow and takes just one parameter referring to the rule to be converted. The entire process should happen without intervention. When invoked without the file name, this is the expected output:
+\vspace{1em}
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ java -jar rc.jar
-         _                                _
- ___ _ _| |___    ___ ___ ___ _ _ ___ ___| |_ ___ ___
-|  _| | | | -_|  |  _| . |   | | | -_|  _|  _| -_|  _|
-|_| |___|_|___|  |___|___|_|_|\_/|___|_| |_| |___|_|
+\item[\textcolor{warningcolour}{\faClose}] \mdbox{R}{(Session.)obtain(String key)}{Object}
 
-version 1.0 (rules < 4.0)
+\vspace{.5em}
 
-OH NO! -----------------------------------------------------
-This tool expects the YAML rule from previous versions of
-arara. Please, provide a proper YAML file containing the old
-rule as a parameter and try again. I will do my best to
-convert the rule to the new version 4.0 format.
-\end{codebox}
+\hspace{2cm}\textcolor{teal}{\faArrowDown}
 
-Let us invoke the tool with the first version of our hypothetical \rbox{ls} rule, still in the old format. The tool removes all comments from the original file, if any, and constructs a new file with a \rbox{\_v4} suffix attached to the name. The original file is preserved. Just keep in mind that the new rule must be renamed afterwards, as the base name and the corresponding \abox{identifier} key must match. The output is presented as follows.
+\item[\textcolor{okcolour}{\faCheck}]\mdbox{R}{(Session.)get(String key)}{Object}
+\end{itemize}
+\end{messagebox}
 
-\begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ java -jar rc.jar ls.yaml
-         _                                _
- ___ _ _| |___    ___ ___ ___ _ _ ___ ___| |_ ___ ___
-|  _| | | | -_|  |  _| . |   | | | -_|  _|  _| -_|  _|
-|_| |___|_|___|  |___|___|_|_|\_/|___|_| |_| |___|_|
+\begin{messagebox}{Support for multiple files}{araracolour}{\icinfo}{white}
+From version 5.0 on, \arara\ is able to compile multiple files at once by providing multiple files as arguments. Please note that they should reside in the same working directory. Every other kind of compilation of multiple files is restricted by the mechanisms of the running programs. See \autoref{chap:commandline} for details.
+\end{messagebox}
 
-version 1.0 (rules < 4.0)
-
-The provided YAML rule looks OK. I will try my best to
-convert it to the new version 4.0 format adopted by arara.
-The new rule name will be written in the same directory of
-the original one and will have a '_v4' suffix to it. Keep in
-mind that the base name must match the identifier!
-
-YAY! -------------------------------------------------------
-Good news, everybody! The provided YAML rule was updated
-successfully to the new version 4.0 format of arara! Of
-course, there are no guarantees this new rule will work out
-of the box, so fingers crossed! Take a closer look at the
-manual and update your rule to use the new enhancements of
-arara. Have a great time!
-\end{codebox}
-
-The resulting rule is identical to the one manually converted in this section. Just note that, when creating the file, the resulting \gls{YAML} file might write the keys in alphabetical order. That means that, although both files semantically represent the same rule, the positions of the keys differ. However, that poses no issue at all, as long as the keys are correctly defined. Also, it is important to note that, due to a conversion policy of the underlying \gls{YAML} library, folded scalars in the old format are transcribed as literal scalars in the new format. We could force a folded style as default, but the resulting rule would be unnecessarily verbose, so we opted for the simpler, cleaner solution. As a direct consequence, we strongly recommend a subsequent verification and potential fix of existing literal scalars into folded ones, if any. Please refer to Section~\ref{sec:yamlscalars}, on page~\pageref{sec:yamlscalars}, for more details on scalars.
-
-\begin{messagebox}{Replace plain strings in commands}{araracolour}{\icattention}{white}
-As plain strings are known to be problematic when defining commands, they are marked as deprecated in version 4.0 of \arara\ and will likely be removed in future releases. Since you are migrating from an old format to a new one, please consider replacing plain strings in command by proper \rbox{Command} objects. The helper methods available in the rule context, including the indispensable \mtbox{getCommand} method, for obvious reasons, are detailed in Section~\ref{sec:commandsandtriggers}, on page~\pageref{sec:commandsandtriggers}. It is highly advisable to update your rules on this regard, if applicable.
+\begin{messagebox}{Support for changing the working directory}{araracolour}{\icinfo}{white}
+A common problem when compiling \TeX\ files are specialties of \TeX\ engines looking for files. Usually, you should call an engine from the directory where the target file is located. \arara\ had the same restriction in that case. Now you can instruct \arara\ to operate from another directory lifting that constraint. See \autoref{chap:commandline} for details.
 \end{messagebox}
 
-This section pretty much covered the basics for correctly migrating rules in the old format to the new one. Of course, it is highly advisable to make use of the new features available in \arara\ 4.0 for achieving better results. If you need any help, please do not hesitating in contacting us. See Section~\ref{sec:support}, on page~\pageref{sec:support}, for more details on how to get help.
+This section pretty much covered the basics of the changes to this version. Of course, it is highly advisable to make use of the new features available in \arara\ 5.0 for achieving better results. If you need any help, please do not hesitate to contact us. See Section~\ref{sec:support}, on page~\pageref{sec:support}, for more details on how to get help.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/configuration.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/configuration.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/configuration.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -26,7 +26,7 @@
 
 \vspace{1.4em}
 
-From version 4.0 on, \arara\ provides two approaches regarding the location of a configuration file. They dictate how the execution should behave and happen from a user perspective, and are described as follows.
+\arara\ provides two approaches regarding the location of a configuration file. They dictate how the execution should behave and happen from a user perspective, and are described as follows.
 
 \begin{description}
 \item[global configuration file] For this approach, the configuration file should be located at \abox[araracolour]{USER\_HOME} which is the home directory of the current user. All subsequent executions of \arara\ will read this configuration file and apply the specified settings accordingly. However, it is important to note that this approach has the lowest lookup priority, which means that a local configuration, presented as follows, will always supersede a global counterpart.
@@ -43,7 +43,7 @@
 \section{Basic structure}
 \label{sec:basicstructure}
 
-The following list describes the basic structure of an \arara\ configuration file by presenting the proper elements (or keys, if we consider the proper \gls{YAML} nomenclature). Observe that elements marked as \rbox[araracolour]{M} are mandatory (i.e, the configuration file \emph{has} to have them in order to work). Similarly, elements marked as \rbox[araracolour]{O} are optional, so you can safely ignore them when writing a configuration file for our tool.
+The following list describes the basic structure of an \arara\ configuration file by presenting the proper elements (or keys, if we consider the proper YAML nomenclature). Observe that elements marked as \rbox[araracolour]{M} are mandatory (i.e, the configuration file \emph{has} to have them in order to work). Similarly, elements marked as \rbox[araracolour]{O} are optional, so you can safely ignore them when writing a configuration file for our tool.
 
 \begin{description}
 \item[\describe{M}{!config}] This keyword is mandatory and must be the first line of a configuration file. It denotes the object mapping metadata to be internally used by the tool. Actually, the tool is not too demanding on using it (in fact, you could suppress it entirely and \arara\ will not complain), but it is considered good practice to start a configuration file with a \abox{!config} keyword regardless.
@@ -56,7 +56,7 @@
 - '/opt/paulo/rules'
 \end{codebox}
 
-There are three variables available in the \abox{paths} context and are described as follows (note that \gls{MVEL} variables and \glspl{orb-tag} are discussed in Chapter~\ref{sec:mvelbasicusage}). A variable will be denoted by \varbox{variable} in this list.
+There are three variables available in the \abox{paths} context and are described as follows (note that MVEL variables and orb tags are discussed in Chapter~\ref{sec:mvelbasicusage}). A variable will be denoted by \varbox{variable} in this list.
 
 \begin{description}
 \item[\varbox{user.home}] This variable, as the name implies, holds the value of the absolute, canonical path of \abox[araracolour]{USER\_HOME} which is the home directory of the current user, as plain string. Note that the specifics of the home directory (such as name and location) are defined by the operating system involved.
@@ -66,25 +66,25 @@
 - '@{user.home}/rules'
 \end{codebox}
 
-\item[\varbox{user.dir}] This variable, as the name implies, holds the value of the absolute, canonical path of \abox[araracolour]{USER\_DIR} which is the working directory associated with the current execution, as plain string. Note that the working directory approach requires a user execution strategy to ensure the correct path value.
+\item[\varbox{user.name}] This variable, as the name implies, holds the value of the current user account name, as plain string. On certain operating systems, this value is used to build the home directory structure.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 paths:
-- '@{user.dir}/rules'
+- '/home/@{user.name}/rules'
 \end{codebox}
 
-\item[\varbox{user.name}] This variable, as the name implies, holds the value of the current user account name, as plain string. On certain operating systems, this value is used to build the home directory structure.
-\end{description}
+\item[\varbox{application.workingDirectory}] This variable, as the name implies, holds the value of the absolute, canonical path of the working directory associated with the current execution, as plain string.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 paths:
-- '/home/@{user.name}/rules'
+- '@{application.workingDirectory}/rules'
 \end{codebox}
+\end{description}
 
-Observe that the \varbox{user} variable actually holds a map containing three keys (resulting in a map within a map). However, for didactic purposes, it is easier to use the property navigation feature of \gls{MVEL}, detailed in Section~\ref{sec:propertynavigation}, on page~\pageref{sec:propertynavigation}, and consider the map references as three independent variables. You can use property navigation styles interchangeably. Note that you can also precede the path with the special keyword \rbox{<arara>} and save some quotes (see Section~\ref{sec:rule}, on page~\pageref{sec:rule}). In this specific scenario, the special keyword will be automatically removed afterwards.
+Observe that the \varbox{user} variable actually holds a map containing two keys (resulting in a map within a map). However, for didactic purposes, it is easier to use the property navigation feature of MVEL, detailed in Section~\ref{sec:propertynavigation}, on page~\pageref{sec:propertynavigation}, and consider the map references as three independent variables. You can use property navigation styles interchangeably. Note that you can also precede the path with the special keyword \rbox{<arara>} and save some quotes (see Section~\ref{sec:rule}, on page~\pageref{sec:rule}, but keep in mind that this special keyword is marked as deprecated and will be removed in future versions). In this specific scenario, the special keyword will be automatically removed afterwards.
 
 \begin{messagebox}{Avoid folded and literal styles for scalars in a path}{attentioncolour}{\icattention}{black}
-Do not use folded or literal styles for scalars in a path! The \gls{orb-tag} resolution for a path in plain string should be kept as simple as possible, so \emph{always} use the inline style.
+Do not use folded or literal styles for scalars in a path! The orb tag resolution for a path in plain string should be kept as simple as possible, so \emph{always} use the inline style.
 \end{messagebox}
 
 \item[\describecf{O}{string}{language}{en}] This key sets the language of all subsequent executions of \arara\ according to the provided language code value, as plain string. The default language is set to English. Also, it is very important to observe that the \opbox{{-}language} command line option can override this setting.
@@ -117,19 +117,19 @@
 header: false
 \end{codebox}
 
-\item[\describecf{O}{string}{logname}{arara}] This key modifies the default log file name, according to the associated plain string value, plus the \rbox{log} extension. The value cannot be empty or contain invalid characters. There is no \gls{orb-tag} evaluation in this specific context, only a plain string value. The log file will be written by our tool if, and only if, the \opbox{{-}log} command line option is used.
+\item[\describecf{O}{string}{logname}{arara}] This key modifies the default log file name, according to the associated plain string value, plus the \rbox{log} extension. The value cannot be empty or contain invalid characters. There is no orb tag evaluation in this specific context, only a plain string value. The log file will be written by our tool if, and only if, the \opbox{{-}log} command line option is used.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 logname: mylog
 \end{codebox}
 
-\item[\describecf{O}{string}{dbname}{arara}] This key modifies the default \gls{XML} database file name, according to the associated plain string value, plus the \rbox{xml} extension. The value cannot be empty or contain invalid characters. There is no \gls{orb-tag} evaluation in this specific context, only a plain string value. This database is used by file hashing operations, detailed in Section~\ref{sec:files}, on page~\pageref{sec:files}.
+\item[\describecf{O}{string}{dbname}{arara}] This key modifies the default YAML database file name, according to the associated plain string value, plus the \rbox{yaml} extension. The value cannot be empty or contain invalid characters. There is no orb tag evaluation in this specific context, only a plain string value. This database is used by file hashing operations, detailed in Section~\ref{sec:files}, on page~\pageref{sec:files}.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 dbname: mydb
 \end{codebox}
 
-\item[\describecf{O}{string}{laf}{none}] This key modifies the default look and feel class reference, i.e,  the appearance of \gls{GUI} widgets provided by our tool, according to the associated plain string value. The value cannot be empty or contain invalid characters. There is no \gls{orb-tag} evaluation in this specific context, only a plain string value. This look and feel setting is used by UI methods, detailed in Section~\ref{sec:dialogboxes}, on page~\pageref{sec:dialogboxes}. Note that this value is used by the underlying Java runtime environment, so a full qualified class name is expected.
+\item[\describecf{O}{string}{laf}{none}] This key modifies the default look and feel class reference, i.e,  the appearance of GUI widgets provided by our tool, according to the associated plain string value. The value cannot be empty or contain invalid characters. There is no orb tag evaluation in this specific context, only a plain string value. This look and feel setting is used by UI methods, detailed in Section~\ref{sec:dialogboxes}, on page~\pageref{sec:dialogboxes}. Note that this value is used by the underlying Java runtime environment, so a full qualified class name is expected.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 laf: 'javax.swing.plaf.nimbus.NimbusLookAndFeel'
@@ -244,7 +244,7 @@
 
 \begin{messagebox}{Do not escape backslashes}{attentioncolour}{\icattention}{black}
 \setlength{\parskip}{1em}
-When writing a file type pattern, there is no need for escaping backslashes as one does for strings in a typical programming language (including \gls{MVEL} expressions). In this specific scenario, key values are represented as plain, literal strings.
+When writing a file type pattern, there is no need for escaping backslashes as one does for strings in a typical programming language (including MVEL expressions). In this specific scenario, key values are represented as plain, literal strings.
 
 However, please note that character escaping might be required by the underlying regular expression in some scenarios (i.e, a literal dot in the pattern). It is highly recommended to consult a proper regular expression documentation for a comprehensive overview.
 \end{messagebox}

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/deploying.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/deploying.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/deploying.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -4,14 +4,10 @@
 
 As previously mentioned, \arara\ runs on top of a Java virtual machine, available on all major operating systems -- in some cases, you might need to install the proper virtual machine. This chapter provides detailed instructions on how to properly deploy the tool in your computer from either the official package available in our project repository or a personal build generated from source (as seen in Section~\ref{sec:compilingthetool}, on page~\pageref{sec:compilingthetool}).
 
-\begin{messagebox}{No more installers}{araracolour}{\icok}{white}
-Be mindful that, from version 4.0 on, the team decided to not release cross-platform installers any more. Our tool is available off the shelf on all major \TeX\ distributions, including \TeX\ Live and MiK\TeX, which makes manual installation unnecessary given the significant coverage of such distributions. Chances are you already have \arara\ in your system!
-\end{messagebox}
-
 \section{Directory structure}
 \label{sec:directorystructure}
 
-From the early development stages, our tool employs a very straightforward directory structure. In short, we provide the \abox[araracolour]{ARARA\_HOME} alias to the directory path in which the \rbox[araracolour]{arara.jar} Java archive file is located. This particular file is the heart and soul of our tool and dictates the default rule search path, which is a special directory named \abox[araracolour]{rules/} available from the same level. This directory contains all rules specified in the \gls{YAML} format, as seen in Section~\ref{sec:rule}, on page~\pageref{sec:rule}. The structure overview is presented as follows.
+From the early development stages, our tool employs a very straightforward directory structure. In short, we provide the \abox[araracolour]{ARARA\_HOME} alias to the directory path in which the \rbox[araracolour]{arara.jar} Java archive file is located. This particular file is the heart and soul of our tool and dictates the default rule search path, which is a special directory named \abox[araracolour]{rules/} available from the same level. This directory contains all rules specified in the YAML format, as seen in Section~\ref{sec:rule}, on page~\pageref{sec:rule}. The structure overview is presented as follows.
 
 \vspace{1em} 
 
@@ -36,15 +32,15 @@
 
 \vspace{1.4em}
 
-Provided that this specific directory structure is honoured, the tool is ready for use off the shelf. In fact, the official \arara\ package available in the \href{https://github.com/cereda/arara/releases}{release section} of our project repository, as well as the \href{https://bintray.com/cereda/arara}{Bintray} software distribution service, exactly mirrors this structure. Once the package is properly downloaded, we simply need to extract it into a proper \abox[araracolour]{ARARA\_HOME} location.
+Provided that this specific directory structure is honoured, the tool is ready for use off the shelf. In fact, the official \arara\ package available in the \href{https://gitlab.com/islandoftex/arara/-/releases}{release section} of our project repository. Once the package is properly downloaded, we simply need to extract it into a proper \abox[araracolour]{ARARA\_HOME} location.
 
 \section{Defining a location}
 \label{sec:definingalocation}
 
-First and foremost, we need to obtain \rbox{arara-4.0.zip} from either our project repository at GitHub or at the Bintray service mirror. As the name indicates, this is a compressed file format, so we need to extract it into a proper location. Run the following command in the terminal:
+First and foremost, we need to obtain \rbox{arara-5.0.zip} from either our project repository at GitLab. As the name indicates, this is a compressed file format, so we need to extract it into a proper location. Run the following command in the terminal:
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
-$ unzip arara-4.0.zip
+$ unzip arara-5.0.zip
 \end{codebox}
 
 As a result of the previous command, we obtained a directory named \abox[araracolour]{arara} with the exact structure presented in Section~\ref{sec:directorystructure} in our working directory. Now we need to decide where \arara\ should reside in our system. For example, I usually deploy my tools inside the \abox[araracolour]{/opt/paulo} path, so I need to run the following command in the terminal (please note that my personal directory already has the proper permissions, so I do not need superuser privileges):
@@ -96,31 +92,31 @@
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ java -jar /opt/paulo/arara/arara.jar
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-arara 4.0 (revision 1)
-Copyright (c) 2012-2018, Paulo Roberto Massa Cereda
-All rights reserved
+Usage: arara [OPTIONS] [file]...
 
-usage: arara [file [--dry-run] [--log] [--verbose | --silent]
-             [--timeout N] [--max-loops N] [--language L]
-             [ --preamble P ] [--header] | --help | --version]
- -h,--help                 print the help message
- -H,--header               extract directives only in the file header
- -l,--log                  generate a log output
- -L,--language <code>      set the application language
- -m,--max-loops <number>   set the maximum number of loops
- -n,--dry-run              go through all the motions of running a
-                           command, but with no actual calls
- -p,--preamble <name>      set the file preamble based on the
-                           configuration file
- -s,--silent               hide the command output
- -t,--timeout <number>     set the execution timeout (in milliseconds)
- -V,--version              print the application version
- -v,--verbose              print the command output
+Options:
+  -l, --log                        Generate a log output
+  -v, --verbose / -s, --silent     Print the command output
+  -n, --dry-run                    Go through all the motions of running a
+                                   command, but with no actual calls
+  -H, --header                     Extract directives only in the file header
+  -t, --timeout INT                Set the execution timeout (in milliseconds)
+  -L, --language TEXT              Set the application language
+  -m, --max-loops INT              Set the maximum number of loops (> 0)
+  -p, --preamble TEXT              Set the file preamble based on the
+                                   configuration file
+  -d, --working-directory DIRECTORY
+                                   Set the working directory for all tools
+  -V, --version                    Show the version and exit
+  -h, --help                       Show this message and exit
+
+Arguments:
+  file  The file(s) to evaluate and process
 \end{codebox}
 
 Please observe that, provided that the underlying operating system has an appropriate Java virtual machine installed, \arara\ can be used as a portable, standalone application. Portable applications can be stored on any data storage device, including external devices such as USB drives and floppy disks.
@@ -186,31 +182,31 @@
 
 \begin{codebox}{Terminal}{teal}{\icnote}{white}
 $ arara
-  __ _ _ __ __ _ _ __ __ _ 
+  __ _ _ __ __ _ _ __ __ _
  / _` | '__/ _` | '__/ _` |
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-arara 4.0 (revision 1)
-Copyright (c) 2012-2018, Paulo Roberto Massa Cereda
-All rights reserved
+Usage: arara [OPTIONS] [file]...
 
-usage: arara [file [--dry-run] [--log] [--verbose | --silent]
-             [--timeout N] [--max-loops N] [--language L]
-             [ --preamble P ] [--header] | --help | --version]
- -h,--help                 print the help message
- -H,--header               extract directives only in the file header
- -l,--log                  generate a log output
- -L,--language <code>      set the application language
- -m,--max-loops <number>   set the maximum number of loops
- -n,--dry-run              go through all the motions of running a
-                           command, but with no actual calls
- -p,--preamble <name>      set the file preamble based on the
-                           configuration file
- -s,--silent               hide the command output
- -t,--timeout <number>     set the execution timeout (in milliseconds)
- -V,--version              print the application version
- -v,--verbose              print the command output
+Options:
+  -l, --log                        Generate a log output
+  -v, --verbose / -s, --silent     Print the command output
+  -n, --dry-run                    Go through all the motions of running a
+                                   command, but with no actual calls
+  -H, --header                     Extract directives only in the file header
+  -t, --timeout INT                Set the execution timeout (in milliseconds)
+  -L, --language TEXT              Set the application language
+  -m, --max-loops INT              Set the maximum number of loops (> 0)
+  -p, --preamble TEXT              Set the file preamble based on the
+                                   configuration file
+  -d, --working-directory DIRECTORY
+                                   Set the working directory for all tools
+  -V, --version                    Show the version and exit
+  -h, --help                       Show this message and exit
+
+Arguments:
+  file  The file(s) to evaluate and process
 \end{codebox}
 
 It is important to observe that the wrapper initiative presented in this section might cause a potential name clash with existing \TeX\ Live or MiK\TeX\ binaries and symbolic links. In this particular scenario, make sure to inspect the command location as a means to ensure a correct execution. To this end, run the following command in the terminal:

Deleted: trunk/Master/texmf-dist/doc/support/arara/chapters/foreword.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/foreword.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/foreword.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,22 +0,0 @@
-% !TeX root = ../arara-manual.tex
-\chapter*{Foreword}
-\label{chap:foreword}
-
-\epigraph{That deserves no less than a ``Holy guacamole!''.}{\textsc{Gonzalo Medina}}
-
-{\setlength{\parskip}{1em}
-Creating a PDF from \LaTeX\ code can be quite tiresome. Suppose I am using \TeX works and I have a document that has a bibliography, glossary and index, then I need to select the \rbox{pdflatex} tool and click on the typeset button, then select the \rbox{bibtex} tool and click on the typeset button, then select the \rbox{makeindex} tool and click on the typeset button, then select the \rbox{makeglossaries} tool (which I may need to add first) and click on the typeset button, then select the \rbox{pdflatex} tool and click on the typeset button, and once more to ensure all the cross-references are up to date. Then I edit the document and have to go through that whole process all over again!
-
-Automation makes life so much simpler. Instead of all those tools that I need to keep selecting, I just need one tool, in this case \arara, which will do all the necessary work for me behind the scenes.
-
-Some automation tools try to be clever, but there are invariably exceptions that trip them up. \arara\ does not try to be clever; it just does what it is told to do. The instructions are provided as special comments in the source code that \TeX\ ignores, but they are human-readable and can also provide a hint to non-\arara\ co-authors as to what tools are required in order to complete the document build.
-
-The new improved \arara\ version 4.0 now comes with some exciting features, such as the ability to use conditionals, and it definitely ranks as my favourite automation tool for document creation. Paulo has done a great job, and I would like to take this opportunity to thank
-him for his patience in dealing with my many feature requests!}
-
-\vfill
-
-\begin{flushright}
-Nicola Louise Cecilia Talbot\\
-\emph{on behalf of the \arara\ team}
-\end{flushright}

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/introduction.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/introduction.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/introduction.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -33,7 +33,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'hello.tex' (size: 86 bytes, last modified: 05/03/2018
+Processing 'hello.tex' (size: 86 B, last modified: 05/03/2018
 07:28:30), please wait.
 
 It looks like no directives were found in the provided file. Make
@@ -68,7 +68,7 @@
 | (_| | | | (_| | | | (_| |
  \__,_|_|  \__,_|_|  \__,_|
 
-Processing 'hello.tex' (size: 86 bytes, last modified: 05/03/2018
+Processing 'hello.tex' (size: 86 B, last modified: 05/03/2018
 07:28:30), please wait.
 
 (PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
@@ -84,8 +84,7 @@
 When adding a directive in our source code, we are explicitly telling the tool what we want it to do, but I am afraid that is not sufficient at all. So far, \arara\ knows \emph{what} to do, but now it needs to know \emph{how} the task should be done. If we want \arara\ to run \rbox{pdflatex} on \rbox{hello.tex}, we need to have instructions telling our tool how to run that specific application. This particular sequence of instructions is referred as a \emph{rule} in our context. 
 
 \begin{messagebox}{Note on rules}{attentioncolour}{\icattention}{black}
-Although the core team provides a lot of rules shipped with \arara\ out of the box, with the possibility of extending the set by adding more rules, some users might find this decision rather annoying, since other tools have most of their rules hard-coded, making the automation process even more transparent. However, since \arara\ does not rely on a specific automation or compilation scheme, it becomes more extensible. The use of directives in the source code make the automation steps more fluent, which allows the specification of complex workflows very easy.
-% "very easy" -> "much easier" perhaps?
+Although the core team provides a lot of rules shipped with \arara\ out of the box, with the possibility of extending the set by adding more rules, some users might find this decision rather annoying, since other tools have most of their rules hard-coded, making the automation process even more transparent. However, since \arara\ does not rely on a specific automation or compilation scheme, it becomes more extensible. The use of directives in the source code make the automation steps more fluent, which allows the specification of complex workflows much easier.
 \end{messagebox}
 
 Despite the inherited verbosity of automation steps not being suitable for small documents, \arara\ really shines when you have a document which needs full control of the automation process (for instance, a thesis or a manual). Complex workflows are easily tackled by our tool.
@@ -120,21 +119,11 @@
 
 Our example has one directive, referencing \rbox{pdflatex}. It is important to observe that the \rbox{pdflatex} identifier \emph{does not represent the command to be executed}, but \emph{the name of the rule associated with that directive}.
 
-\begin{messagebox}{New feature in version 4.0}{araracolour}{\icinfo}{white}
-\textbf{Multiline directives} -- Later on, in Section~\ref{sec:directives}, on page~\pageref{sec:directives}, we will discover that a directive can also span several lines in order to provide a better code organization. For now, let us assume a typical directive occupies only one line.
-\end{messagebox}
+Once \arara\ finds a directive, it will look for the associated \emph{rule}. In our example, it will look for a rule named \rbox{pdflatex} which will evidently run the \rbox{pdflatex} command line application. Rules are YAML files named according to their identifiers followed by the \rbox{yaml} extension and follow a strict structure. This concept is covered in Section~\ref{sec:rule}, on page~\pageref{sec:rule}.
 
-Once \arara\ finds a directive, it will look for the associated \emph{rule}. In our example, it will look for a rule named \rbox{pdflatex} which will evidently run the \rbox{pdflatex} command line application. Rules are \gls{YAML} files named according to their identifiers followed by the \rbox{yaml} extension and follow a strict structure. This concept is covered in Section~\ref{sec:rule}, on page~\pageref{sec:rule}.
-
-\begin{messagebox}{New feature in version 4.0}{araracolour}{\icattention}{white}
-\textbf{\gls{REPL} workflow} -- \arara\ now employs a \gls{REPL} workflow for rules and directives. In previous versions, directives were extracted, their corresponding rules were analyzed, commands were built and added to a queue before any proper execution or evaluation. I decided to change this workflow, so now \arara\ evaluates each rule on demand, i.e, there is no \emph{a priori} checking. A rule will \emph{always} reflect the current state, including potential side effects from previous executed rules.
-\end{messagebox}
-
 Now, we have a queue of pairs $(\textit{directive}, \textit{rule})$ to process. For each pair, \arara\ will map the directive to its corresponding rule, evaluate it and run the proper command. The execution chain requires that command $i$ was successfully executed to then proceed to command $i+1$, and so forth. This is also by design: \arara\ will halt the execution if any of the commands in the queue had raised an error. How does one know if a command was successfully executed? \arara\ checks the corresponding \emph{exit status} available after a command execution. In general, a successful execution yields 0 as its exit status.
 
-\begin{messagebox}{New feature in version 4.0}{araracolour}{\icinfo}{white}
-\textbf{Custom exit status checking} -- In previous versions, there was no way of customizing the exit status checking of a command. A command was successful if, and only if, its resulting exit status was 0 and no other value. From now on, we can define any value, or even forget about it and make it always return a valid status regardless of execution (for instance, in a rule that always is successful -- see, for instance, the \rbox{clean}  rule).
-\end{messagebox}
+In order to decide whether a command execution is successful, \arara\ relies on exit status checking. Typically, a command is successful if, and only if, its resulting exit status is 0 and no other value. However, we can define any value, or even forget about it and make it always return a valid status regardless of execution (for instance, in a rule that always is successful -- see, for instance, the \rbox{clean}  rule).
 
 That is pretty much how \arara\ works: directives in the source code are mapped to rules. These pairs are added to a queue. The queue is then executed and the status is reported. More details about the expansion process are presented in Chapter~\ref{chap:importantconcepts}, on page~\pageref{chap:importantconcepts}. In short, we teach \arara\ to do a task by providing a rule, and tell it to execute it through directives in the source code.
 
@@ -141,7 +130,7 @@
 \section{Operating system remarks}
 \label{sec:operatingsystemremarks}
 
-The application is written using the Java language, so \arara\ runs on top of a Java virtual machine, available on all the major operating systems~--~in some cases, you might need to install the proper virtual machine. We tried very hard to keep both code and libraries compatible with older virtual machines or from other vendors. Currently, \arara\ is known to run on Oracle's Java 5 to 10, and OpenJDK 5 to 10. We also have reports of users successfully using the tool with virtual machines provided by Azul Systems, so your mileage might vary greatly.
+The application is written using the Kotlin language (and some pieces of Java), so \arara\ runs on top of a Java virtual machine, available on all the major operating systems~--~in some cases, you might need to install the proper virtual machine. We tried very hard to keep both code and libraries compatible with older virtual machines or from other vendors. Currently, \arara\ is known to run on Oracle's Java 8 to 13, OpenJDK 8 to 13 and ZuluFX 8 and 11.
 
 \begin{messagebox}{Outdated Java virtual machines}{attentioncolour}{\icerror}{black}
 Dear reader, beware of outdated software, mainly Java virtual machines! Although \arara\ offers support for older virtual machines, try your best to keep your software updated as frequently as possible. The legacy support exists only for historical reasons, and also due to the sheer fact that we know some people that still runs \arara\ on very old hardware. If you are not in this particular scenario, get the latest virtual machine.
@@ -152,6 +141,6 @@
 \section{Support}
 \label{sec:support}
 
-If you run into any issue with \arara, please let us know. We all have very active profiles in the \href{https://tex.stackexchange.com/}{\TeX\ community at StackExchange}, so just use the \rbox[araracolour]{arara} tag in your question and we will help you the best we can (also, take a look at their \href{https://tex.meta.stackexchange.com/q/1436}{starter guide}).  We also have a \href{https://gitter.im/cereda/arara}{Gitter chat room}, in which we occasionally hang out. Also, if you think the report is worthy of an issue, open one in our \href{https://github.com/cereda/arara/issues}{GitHub repository}. And last, but not least, feel free to poke us by good old electronic mail (please try the other approaches first).
+If you run into any issue with \arara, please let us know. We all have very active profiles in the \href{https://tex.stackexchange.com/}{\TeX\ community at StackExchange}, so just use the \rbox[araracolour]{arara} tag in your question and we will help you the best we can (also, take a look at their \href{https://tex.meta.stackexchange.com/q/1436}{starter guide}).  We also have a \href{https://gitter.im/cereda/arara}{Gitter chat room}, in which we occasionally hang out. Also, if you think the report is worthy of an issue, open one in our \href{https://gitlab.com/islandoftex/arara/issues}{GitLab repository}.
 
 We really hope you like our humble contribution to the \TeX\ community. Let \arara\ enhance your \TeX\ experience, it will help you when you will need it the most. Enjoy the manual.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/license.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/license.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/license.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -12,7 +12,7 @@
 \footnotesize
 \includegraphics[scale=0.25]{logos/logo1.pdf}
 
-Copyright \textcopyright\ 2012--2018, Paulo Roberto Massa Cereda\\
+Copyright \textcopyright\ 2012--2020, Island of \TeX\\
 All rights reserved.
 
 \vspace{1em}

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/logging.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/logging.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/logging.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -16,12 +16,14 @@
 \section{System information}
 \label{sec:systeminformation}
 
-The very first entry to appear in the log file is the current version of \arara\ followed by a revision number. The revision number acts as a counter for the last review on the major version. The counter starts at 1 to denote the first release in the version 4.0 series. The revision number is also important to indicate possible new features introduced later on, in the application.
+The very first entry to appear in the log file is the current version of \arara. 
 
 \begin{codebox}{Log file}{teal}{\icnote}{white}
-Welcome to arara 4.0 (revision 1)!
+Welcome to arara 5.0.0!
 \end{codebox}
 
+% TODO: review what will be output in the future
+
 The following entries in the log file are the absolute path of the current deployment of \arara\ (line 1), details about the current Java virtual machine (namely, vendor and absolute path, in lines 2 and 3, respectively), the underlying operating system information (namely, system name, architecture and eventually the kernel version, in line 4), home and working directories (lines 5 and 6, respectively), and the absolute path of the applied configuration file, if any (line 7). This block is very important to help with tracking possible issues related to the underlying operating system and the tool configuration itself.
 
 \begin{codebox}{Log file}{teal}{\icnote}{white}
@@ -30,13 +32,12 @@
 ::: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-4.b10.fc28.x86_64/jre
 ::: Linux, amd64, 4.16.12-300.fc28.x86_64
 ::: user.home @ /home/paulo
-::: user.dir @ /home/paulo/Documents
 ::: CF @ [none]
 \end{codebox}
 
 \begin{messagebox}{A privacy note}{araracolour}{\icok}{white}
 \setlength{\parskip}{1em}
-I understand that the previous entries containing information about the underlying operating system might pose as a privacy threat to some users. However, it is worth noting that \arara\ does not share any sensitive information about your system, as entries are listed in the log file for debugging purposes only, locally in your computer.
+We understand that the previous entries containing information about the underlying operating system might pose as a privacy threat to some users. However, it is worth noting that \arara\ does not share any sensitive information about your system, as entries are listed in the log file for debugging purposes only, locally in your computer.
 
 From experience, these entries greatly help our users to track down errors in the execution, as well as learning more about the underlying operating system. However, be mindful of sharing your log file! Since the log file contains structured blocks, it is highly advisable to selectively choose the ones relevant to the current discussion.
 \end{messagebox}
@@ -49,7 +50,7 @@
 The following block in the log file refers to file information and directive extraction. First, as with the terminal output counterpart, the tool will display details about the file being processed, including size and modification status:
 
 \begin{codebox}{Log file}{teal}{\icnote}{white}
-Processing 'doc12.tex' (size: 74 bytes, last modified:
+Processing 'doc12.tex' (size: 74 B, last modified:
 06/02/2018 05:36:40), please wait.
 \end{codebox}
 
@@ -98,7 +99,7 @@
 \section{Rule interpretation}
 \label{sec:ruleinterpretation}
 
-Once all directives are normalized, \arara\ proceeds to interpret the potential conditionals, if any, and the corresponding rules. Note that, when available, the conditional type dictates whether the rule should be interpreted first or not. For each rule, the tool informs the identifier and the absolute path of the corresponding \gls{YAML} file. In this specific scenario, the rule is part of the default rule pack released with our tool:
+Once all directives are normalized, \arara\ proceeds to interpret the potential conditionals, if any, and the corresponding rules. Note that, when available, the conditional type dictates whether the rule should be interpreted first or not. For each rule, the tool informs the identifier and the absolute path of the corresponding YAML file. In this specific scenario, the rule is part of the default rule pack released with our tool:
 
 \begin{codebox}{Log file}{teal}{\icnote}{white}
 I am ready to interpret rule 'pdftex'.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/methods.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/methods.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/methods.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,10 +2,10 @@
 \chapter{Methods}
 \label{chap:methods}
 
-\arara\ features several helper methods available in directive conditional and rule contexts which provide interesting features for enhancing the user experience, as well as improving the automation itself. This chapter provides a list of such methods. It is important to observe that virtually all classes from the Java runtime environment can be used within \gls{MVEL} expressions, so your mileage might vary.
+\arara\ features several helper methods available in directive conditional and rule contexts which provide interesting features for enhancing the user experience, as well as improving the automation itself. This chapter provides a list of such methods. It is important to observe that virtually all classes from the Java runtime environment can be used within MVEL expressions, so your mileage might vary.
 
 \begin{messagebox}{A note on writing code}{araracolour}{\icok}{white}
-As seen in Chapter~\ref{chap:mvel}, on page~\pageref{chap:mvel}, Java and \gls{MVEL} code be used interchangeably within expressions and \glspl{orb-tag}, including instantiation of classes into objects and invocation of methods. However, be mindful of explicitly importing Java packages and classes through the classic \rbox{import} statement, as \gls{MVEL} does not automatically handle imports, or an exception will surely be raised. Alternatively, you can provide the full qualified name to classes as well.
+As seen in Chapter~\ref{chap:mvel}, on page~\pageref{chap:mvel}, Java and MVEL code be used interchangeably within expressions and orb tags, including instantiation of classes into objects and invocation of methods. However, be mindful of explicitly importing Java packages and classes through the classic \rbox{import} statement, as MVEL does not automatically handle imports, or an exception will surely be raised. Alternatively, you can provide the full qualified name to classes as well.
 \end{messagebox}
 
 Methods are listed with their complete signatures, including potential  parameters and corresponding types. Also, the return type of a method is denoted by \rrbox{type} and refers to a typical Java data type (either class or primitive). Do not worry too much, as there are illustrative examples. A method available in the directive conditional context will be marked by \ctbox{C} next to the corresponding signature. Similarly, an entry marked by \ctbox{R} denotes that the corresponding method is available in the rule context.
@@ -34,7 +34,7 @@
 }
 \end{codebox}
 
-\item[\mddbox{C}{R}{currentFile()}{File}] This method returns the file reference, as a \rbox{File} object, for the current directive. It is important to observe that, from version 4.0 on, \arara\ replicates the directive when the special \abox{files} parameter is detected amongst the parameters, so each instance will have a different reference.
+\item[\mddbox{C}{R}{currentFile()}{File}] This method returns the file reference, as a \rbox{File} object, for the current directive. It is important to observe that \arara\ replicates the directive when the special \abox{files} parameter is detected amongst the parameters, so each instance will have a different reference.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 % arara: pdflatex if currentFile().getName() == 'thesis.tex'
@@ -46,30 +46,18 @@
 f = toFile('thesis.tex');
 \end{codebox}
 
-\item[\mdbox{R}{getBasename(File file)}{String}] This method returns the base name (i.e, the name without the associated extension) of the provided \rbox{File} reference, as a string. Observe that this method ignores a potential path reference when extracting the base name. For a complete base name extraction with full path support, please refer to the \mtbox{getFullBasename} methods. Also, this method will throw an exception if the provided reference is not a proper file.
+\item[\mdbox{R}{getBasename(File file)}{String}] This method returns the base name (i.e, the name without the associated extension) of the provided \rbox{File} reference, as a string. Observe that this method ignores a potential path reference when extracting the base name. Also, this method will throw an exception if the provided reference is not a proper file.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 basename = getBasename(toFile('thesis.tex'));
 \end{codebox}
 
-\item[\mdbox{R}{getBasename(String reference)}{String}] This method returns the base name (i.e, the name without the associated extension) of the provided \rbox{String} reference, as a string. Observe that this method ignores a potential path reference when extracting the base name. For a complete base name extraction with full path support, please refer to the \mtbox{getFullBasename} methods.
+\item[\mdbox{R}{getBasename(String reference)}{String}] This method returns the base name (i.e, the name without the associated extension) of the provided \rbox{String} reference, as a string. Observe that this method ignores a potential path reference when extracting the base name.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 basename = getBasename('thesis.tex');
 \end{codebox}
 
-\item[\mdbox{R}{getFullBasename(File file)}{String}] This method returns the full base name (i.e, the name without the associated extension, as well as the potential path reference) of the provided \rbox{File} reference, as a string. This method will throw an exception if the provided reference is not a proper file.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-basename = getFullBasename(toFile('/home/paulo/thesis.tex'));
-\end{codebox}
-
-\item[\mdbox{R}{getFullBasename(String reference)}{String}] This method returns the full base name (i.e, the name without the associated extension, as well as the potential path reference) of the provided \rbox{String} reference, as a string. As the path discovery requires an underlying file conversion, this method will throw an exception if the provided reference is not a proper file.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-basename = getFullBasename('/home/paulo/thesis.tex');
-\end{codebox}
-
 \item[\mdbox{R}{getFiletype(File file)}{String}] This method returns the file type (i.e, the associated extension specified as a suffix to the name, typically delimited with a full stop) of the provided \rbox{File} reference, as a string. This method will throw an exception if the provided reference is not a proper file. An empty string is returned if, and only if, the provided file name has no associated extension.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
@@ -106,7 +94,7 @@
 % arara: pdftex if missing('pdf')
 \end{codebox}
 
-\item[\mddbox{C}{R}{changed(File file)}{boolean}] This method returns a boolean value according to whether the provided \rbox{File} reference has changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a \gls{XML} database file named \rbox{arara.xml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
+\item[\mddbox{C}{R}{changed(File file)}{boolean}] This method returns a boolean value according to whether the provided \rbox{File} reference has changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a YAML database file named \rbox{arara.yaml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
 
 \vspace{1em}
 
@@ -135,7 +123,7 @@
 \end{codebox}
 
 \begin{messagebox}{Short-circuit evaluation}{araracolour}{\icok}{white}
-According to the \href{https://en.wikipedia.org/wiki/Short-circuit_evaluation}{Wikipedia entry}, a \emph{short-circuit evaluation} is the semantics of some boolean operators in some programming languages in which the second argument is executed or evaluated only if the first argument does not suffice to determine the value of the expression. In Java (and consequently \gls{MVEL}), both short-circuit and standard boolean operators are available.
+According to the \href{https://en.wikipedia.org/wiki/Short-circuit_evaluation}{Wikipedia entry}, a \emph{short-circuit evaluation} is the semantics of some boolean operators in some programming languages in which the second argument is executed or evaluated only if the first argument does not suffice to determine the value of the expression. In Java (and consequently MVEL), both short-circuit and standard boolean operators are available.
 \end{messagebox}
 
 \begin{messagebox}{CRC as a hashing algorithm}{attentioncolour}{\icattention}{black}
@@ -142,7 +130,7 @@
 \arara\ internally relies on a CRC32 implementation for file hashing. This particular choice, although not designed for hashing, offers an interesting trade-off between speed and quality. Besides, since it is not computationally expensive as strong algorithms such as MD5 and SHA1, CRC32 can be used for hashing typical \TeX\ documents and plain text files with little to no collisions.
 \end{messagebox}
 
-\item[\mddbox{C}{R}{changed(String extension)}{boolean}] This method returns a boolean value according to whether the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the provided \rbox{String} extension has changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a \gls{XML} database file named \rbox{arara.xml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
+\item[\mddbox{C}{R}{changed(String extension)}{boolean}] This method returns a boolean value according to whether the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the provided \rbox{String} extension has changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a YAML database file named \rbox{arara.yaml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
 
 \vspace{1em}
 
@@ -170,7 +158,7 @@
 % arara: pdflatex if changed('tex')
 \end{codebox}
 
-\item[\mddbox{C}{R}{unchanged(File file)}{boolean}] This method returns a boolean value according to whether the provided \rbox{File} reference has not changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a \gls{XML} database file named \rbox{arara.xml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
+\item[\mddbox{C}{R}{unchanged(File file)}{boolean}] This method returns a boolean value according to whether the provided \rbox{File} reference has not changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a YAML database file named \rbox{arara.yaml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
 
 \vspace{1em}
 
@@ -198,7 +186,7 @@
 % arara: pdflatex if !unchanged(toFile('thesis.tex'))
 \end{codebox}
 
-\item[\mddbox{C}{R}{unchanged(String extension)}{boolean}] This method returns a boolean value according to whether the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the provided \rbox{String} extension has not changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a \gls{XML} database file named \rbox{arara.xml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
+\item[\mddbox{C}{R}{unchanged(String extension)}{boolean}] This method returns a boolean value according to whether the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the provided \rbox{String} extension has not changed since last verification, based on a traditional cyclic redundancy check. The file reference, as well as the associated hash, is stored in a YAML database file named \rbox{arara.yaml} located in the same directory as the current file (the database name can be overridden in the configuration file, as discussed in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}). The method semantics (including the return values) is presented as follows.
 
 \vspace{1em}
 
@@ -333,7 +321,7 @@
 
 \vspace{1.4em}
 
-All elements from the provided set of natural boolean values can be used interchangeably in directive parameters. It is important to observe that, from version 4.0 on, \arara\ throws an exception if a value absent from the set is provided to the methods described in this section.
+All elements from the provided set of natural boolean values can be used interchangeably in directive parameters. It is important to observe that \arara\ throws an exception if a value absent from the set is provided to the methods described in this section.
 
 \begin{description}
 \item[\mdbox{R}{isTrue(String string)}{boolean}] This method returns a boolean value according to whether the provided \rbox{String} value is contained in the sub-set of natural true boolean values. It is worth mentioning that the verification is case insensitive, i.e, upper case and lower case symbols are treated as equivalent. If the provided value is an empty string, the method returns false.
@@ -465,12 +453,6 @@
 result = trimSpaces('   hello world   ');
 \end{codebox}
 
-\item[\mdbox{R}{addQuotes(String string)}{String}] This method returns the provided parameter enclosed in double quotes, as a plain string. It is important to observe that there is no automatic quote handling.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-result = addQuotes('to be or not to be');
-\end{codebox}
-
 \item[\mdbox{R}{replicatePattern(String pattern, List<Object> values)}{List<Object>}] This method replicates the provided pattern to each element of the second parameter and returns the resulting list. The pattern must contain exactly one placeholder. For instance, \rbox{\%s} denotes a string representation of the provided argument. Please refer to the \rbox{Formatter} class reference in the \href{https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html}{Java documentation} for more information on placeholders. This method raises an exception if an invalid pattern is applied.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
@@ -523,30 +505,6 @@
 if (isUnix()) { System.out.println('Running Unix.'); }
 \end{codebox}
 
-\item[\mdbox{R}{isAIX()}{boolean}] This method returns a boolean value according to whether the underlying operating system vendor is IBM AIX.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-if (isAIX()) { System.out.println('Running AIX.'); }
-\end{codebox}
-
-\item[\mdbox{R}{isIrix()}{boolean}] This method returns a boolean value according to whether the underlying operating system vendor is Silicon Graphics Irix.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-if (isIrix()) { System.out.println('Running Irix.'); }
-\end{codebox}
-
-\item[\mdbox{R}{isOS2()}{boolean}] This method returns a boolean value according to whether the underlying operating system vendor is IBM OS/2 Warp.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-if (isOS2()) { System.out.println('Running OS/2 Warp.'); }
-\end{codebox}
-
-\item[\mdbox{R}{isSolaris()}{boolean}] This method returns a boolean value according to whether the underlying operating system vendor is Oracle Solaris.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-if (isSolaris()) { System.out.println('Running Solaris.'); }
-\end{codebox}
-
 \item[\mdbox{R}{isCygwin()}{boolean}] This method returns a boolean value according to whether the underlying operating system vendor is Microsoft Windows and \arara\ is being executed inside a Cygwin environment.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
@@ -577,30 +535,6 @@
 command = isUnix('tree', 'dir');
 \end{codebox}
 
-\item[\mdbox{R}{isAIX(Object yes, Object no)}{Object}] This method checks if the underlying operating system vendor is IBM AIX. If the result holds true, the first parameter is returned. Otherwise, the second parameter is returned.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-command = isAIX('pwd', 'ls');
-\end{codebox}
-
-\item[\mdbox{R}{isIrix(Object yes, Object no)}{Object}] This method checks if the underlying operating system vendor is Silicon Graphics Irix. If the result holds true, the first parameter is returned. Otherwise, the second parameter is returned.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-command = isIrix('ls', 'pwd');
-\end{codebox}
-
-\item[\mdbox{R}{isOS2(Object yes, Object no)}{Object}] This method checks if the underlying operating system vendor is IBM OS/2 Warp. If the result holds true, the first parameter is returned. Otherwise, the second parameter is returned.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-command = isOS2('ls', 'cd');
-\end{codebox}
-
-\item[\mdbox{R}{isSolaris(Object yes, Object no)}{Object}] This method checks if the underlying operating system vendor is Oracle Solaris. If the result holds true, the first parameter is returned. Otherwise, the second parameter is returned.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-command = isSolaris('ls', 'cat');
-\end{codebox}
-
 \item[\mdbox{R}{isCygwin(Object yes, Object no)}{Object}] This method checks if the underlying operating system vendor is Microsoft Windows and if \arara\ is being executed inside a Cygwin environment. If the result holds true, the first parameter is returned. Otherwise, the second parameter is returned.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
@@ -652,15 +586,15 @@
 \section{Classes and objects}
 \label{sec:classesandobjects}
 
-From version 4.0 on, \arara\ can be extended at runtime with code from \gls{JVM} languages, such as Groovy, Scala, Clojure and Kotlin. The tool can load classes from \rbox{class} and \rbox{jar} files and even instantiate them. This section introduces methods related to class loading and object instantiation.
+\arara\ can be extended at runtime with code from JVM languages, such as Groovy, Scala, Clojure and Kotlin. The tool can load classes from \rbox{class} and \rbox{jar} files and even instantiate them. This section introduces methods related to class loading and object instantiation.
 
 \begin{messagebox}{Ordered pairs}{araracolour}{\icok}{white}
 According to the \href{https://en.wikipedia.org/wiki/Ordered_pair}{Wikipedia entry}, in mathematics, an \emph{ordered pair} $(a, b)$ is a pair of objects. The order in which the objects appear in the pair is significant: the ordered pair $(a, b)$ is different from the ordered pair $(b, a)$ unless $a = b$. In the ordered pair $(a, b)$, the object $a$ is called the \emph{first} entry, and the object $b$ the \emph{second} entry of the pair. \arara\ relies on this concept with the helper \rbox{Pair<A, B>} class, in which \rbox{A} and \rbox{B} denote the component classes, i.e, the types associated to the pair elements. In order to access the pair entries, the class provides two methods:
 
 \begin{description}
-\item[\mtbox{first()}\hfill\rrbox{A}] This method, as the name implies, returns the first entry of the ordered pair, as an \rbox{A} object. It is important to observe that, from the \gls{MVEL} context, as the method constitutes a property accessor (namely, a getter), the parentheses can be safely omitted.
+\item[\mtbox{first()}\hfill\rrbox{A}] This method, as the name implies, returns the first entry of the ordered pair, as an \rbox{A} object. It is important to observe that, from the MVEL context, as the method constitutes a property accessor (namely, a getter), the parentheses can be safely omitted.
 
-\item[\mtbox{second()}\hfill\rrbox{B}] This method, as the name implies, returns the second entry of the ordered pair, as a \rbox{B} object. It is important to observe that, from the \gls{MVEL} context, as the method constitutes a property accessor (namely, a getter), the parentheses can be safely omitted.
+\item[\mtbox{second()}\hfill\rrbox{B}] This method, as the name implies, returns the second entry of the ordered pair, as a \rbox{B} object. It is important to observe that, from the MVEL context, as the method constitutes a property accessor (namely, a getter), the parentheses can be safely omitted.
 \end{description}
 
 Keep in mind that the entries in the \rbox{Pair} class, once defined, cannot be modified to other values. The initial values are set during instantiation and, therefore, only entry getters are available to the user during the object life cycle. 
@@ -827,7 +761,7 @@
 \end{codebox}
 
 \begin{messagebox}{Swing toolkit}{araracolour}{\icok}{white}
-According to the \href{https://en.wikipedia.org/wiki/Swing_(Java)}{Wikipedia entry}, the Swing toolkit was developed to provide a more sophisticated set of \gls{GUI} components than the earlier  AWT widget system. Swing provides a look and feel that emulates the look and feel of several platforms, and also supports a pluggable look and feel that allows applications to have a look and feel unrelated to the underlying platform. It has more powerful and flexible components than AWT. In addition to familiar components such as buttons, check boxes and labels, Swing provides several advanced components, such as scroll panes, trees, tables, and lists.
+According to the \href{https://en.wikipedia.org/wiki/Swing_(Java)}{Wikipedia entry}, the Swing toolkit was developed to provide a more sophisticated set of GUI components than the earlier  AWT widget system. Swing provides a look and feel that emulates the look and feel of several platforms, and also supports a pluggable look and feel that allows applications to have a look and feel unrelated to the underlying platform. It has more powerful and flexible components than AWT. In addition to familiar components such as buttons, check boxes and labels, Swing provides several advanced components, such as scroll panes, trees, tables, and lists.
 \end{messagebox}
 
 \item[\mddbox{C}{R}{showInput(int width, int icon, String title, String text)}{String}]\uimethod{inputbox1}
@@ -851,10 +785,10 @@
 
 The UI methods presented in this section can be used for writing \TeX\ tutorials and assisted compilation workflows based on user interactions, including visual input and feedback through dialog boxes.
 
-\section{Commands and triggers}
-\label{sec:commandsandtriggers}
+\section{Commands}
+\label{sec:commands}
 
-From version 4.0 on, \arara\ features the \rbox{Command} object, a new approach for handling system commands based on a high level structure with explicit argument parsing. Similarly, there is also the mystical \rbox{Trigger} object that constitutes a very special command that changes the inner workings of our tool at runtime. This section introduces methods for generating such objects.
+\arara\ features the \rbox{Command} object, a new approach for handling system commands based on a high level structure with explicit argument parsing.
 
 \begin{messagebox}{The anatomy of a command}{araracolour}{\icok}{white}
 \setlength{\parskip}{1em}
@@ -894,28 +828,6 @@
 
 List flattening and string mapping confer expressiveness and flexibility to the \rbox{Command} object construction, as users can virtually use any data type to describe the underlying rule logic and yet obtain a consistent representation.
 
-\begin{messagebox}{The anatomy of a trigger}{araracolour}{\icok}{white}
-\setlength{\parskip}{1em}
-A \rbox{Trigger} object constitutes a special command that changes the internal workings of \arara\ at runtime. It is a highly experimental feature. A trigger is basically a function call defined in terms of a \rbox{String} reference representing the actual function name followed by an optional list of \rbox{Object} arguments. For instance, consider this hypothetical trigger that multiplies an arbitrary number of integer terms:
-
-{\centering
-\setlength\tabcolsep{0.2em}
-\begin{tabular}{cccc}
-{\footnotesize\em name} &
-\multicolumn{3}{c}{\footnotesize\em list of arguments} \\
-\rbox[cyan]{multiply} &
-\rbox[araracolour]{\hphantom{w}12\hphantom{w}} &
-\rbox[araracolour]{\hphantom{w}34\hphantom{w}} &
-\rbox[araracolour]{\hphantom{w}65\hphantom{w}}
-\end{tabular}\par}
-
-\vspace{0.4em}
-
-This description is, in some aspects, very much like a typical \rbox{Command} construction. However, a trigger is less forgiving on data types and does not apply transformations on the provided list of arguments. Therefore, the argument types \emph{must match} the trigger signature.
-
-So far, the tool provides only one trigger, seen in action in one of the official rules, under the name \rbox{halt} and with no parameters. This particular trigger halts the current interpretation workflow, such that subsequent directives are ignored. We have not worked much on triggers yet, and the concept is mentioned here for documentation purposes only.
-\end{messagebox}
-
 \begin{description}
 \item[\mdbox{R}{getCommand(List<String> elements)}{Command}] This method, as the name implies, returns a \rbox{Command} object according to the provided list of \rbox{String} elements. If the list is empty, the tool will ignore the execution.
 
@@ -929,18 +841,6 @@
 return getCommand('pdflatex', '--shell-escape', 'thesis.tex');
 \end{codebox}
 
-\item[\mdbox{R}{getTrigger(String name)}{Trigger}] This method, as the name implies, returns a \rbox{Trigger} object according to the provided \rbox{String} reference as function name. It is important to observe that this particular trigger instance does not have parameters.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-return getTrigger('halt');
-\end{codebox}
-
-\item[\mdbox{R}{getTrigger(String name, Object... parameters)}{Trigger}] This method, as the name implies, returns a proper \rbox{Trigger} object according to the provided \rbox{String} reference as function name and the \rbox{Object} array as associated parameters. Note that the object array is denoted by a comma-separated sequence of elements in the actual method call, resulting in a variable number of parameters.
-
-\begin{codebox}{Example}{teal}{\icnote}{white}
-return getTrigger('multiply', 12, 34, 65);
-\end{codebox}
-
 \item[\mdbox{R}{\parbox{0.62\textwidth}{getCommandWithWorkingDirectory(File directory,\\\hspace*{1em} List<String> elements)}}{Command}] This method, as the name implies, sets the working directory based on the provided \rbox{File} reference and returns a proper \rbox{Command} object according to the provided list of \rbox{String} elements. If the list is empty, the tool will ignore the execution.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
@@ -978,16 +878,16 @@
 This section introduces assorted methods provided by \arara\ as a means to improve the automation itself with expressive rules and enhance the user experience. Such methods are properly described as follows.
 
 \begin{messagebox}{Session}{araracolour}{\icok}{white}
-Rules are designed under the \emph{encapsulation} notion, such that the direct access to internal workings of such structures is restricted. However, as a means to support framework awareness, \arara\ provides a mechanism for data sharing across rule contexts, implemented as a \rbox{Session} object. In practical terms, this particular object is a global, persistent map composed of \rbox{String} keys and \rbox{Object} values available throughout the entire execution. The public methods are described as follows:
+Rules are designed under the \emph{encapsulation} notion, such that the direct access to internal workings of such structures is restricted. However, as a means to support framework awareness, \arara\ provides a mechanism for data sharing across rule contexts, implemented as a \rbox{Session} object. In practical terms, this particular object is a global, persistent map composed of \rbox{String} keys and \rbox{Object} values available throughout the entire execution. The public methods of a session are described as follows:
 
 \begin{description}
-\item[\mtbox{insert(String key, Object value)}\hfill\rrbox{void}] This method, as the name implies, inserts an object into the session, indexed by the provided key. Observe that, if the session previously contained a mapping for the provided key, the old value is replaced by the specified value.
+\item[\mtbox{put(String key, Object value)}\hfill\rrbox{void}] This method, as the name implies, inserts an object into the session, indexed by the provided key. Observe that, if the session previously contained a mapping for the provided key, the old value is replaced by the specified value.
 
 \item[\mtbox{remove(String key)}\hfill\rrbox{void}] This method, as the name implies, removes  the mapping for the provided key from the session. Be mindful that an attempt to remove a mapping for a nonexistent key will raise an exception.
 
-\item[\mtbox{exists(String key)}\hfill\rrbox{boolean}] This method, as the name implies, returns a boolean value according to whether the session contains a mapping for the provided key. It is highly advisable to use this method before attempting to remove a mapping from the session.
+\item[\mtbox{contains(String key)}\hfill\rrbox{boolean}] This method, as the name implies, returns a boolean value according to whether the session contains a mapping for the provided key. It is highly advisable to use this method before attempting to remove a mapping from the session.
 
-\item[\mtbox{obtain(String key)}\hfill\rrbox{Object}] This method, as the name implies, returns the object value to which the specified key is mapped. Be mindful that an attempt to return a value for a nonexistent key will raise an exception.
+\item[\mtbox{get(String key)}\hfill\rrbox{Object}] This method, as the name implies, returns the object value to which the specified key is mapped. Be mindful that an attempt to return a value for a nonexistent key will raise an exception.
 
 \item[\mtbox{forget()}\hfill\rrbox{void}] This method, as the name implies, removes all of the existing mappings from the session. The session object will be effectively empty after this call returns.
 \end{description}
@@ -999,7 +899,7 @@
 \item[\mdbox{R}{getSession()}{Session}] This method, as the name implies, returns the \rbox{Session} object for data sharing across rule contexts. Keep in mind that a session cannot contain duplicate keys. Each key can map to at most one value.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
-name = getSession().obtain('name');
+name = getSession().get('name');
 \end{codebox}
 
 \item[\mdbox{R}{throwError(String message)}{void}] This method deliberately throws an error to be intercepted later on during execution. Consider using such method for an explicit notification about unexpected or unsought scenarios, e.g, wrong parameter types or values. The raised error has an associated message which is displayed in the terminal and added to the log file.
@@ -1033,6 +933,10 @@
 result = unsafelyExecuteSystemCommand(getCommand('ls'));
 \end{codebox}
 
+\begin{messagebox}{Important change in version 5.0}{araracolour}{\icattention}{white}
+\textbf{Working directory support} -- \arara\ now executes commands obtained from \rbox{getCommandWithWorkingDirectory} correctly. Previously, the working directory got silently ignored. This makes \arara\ even more powerful but we decided to change this for the sake of consistency.
+\end{messagebox}
+
 \begin{messagebox}{Hic sunt leones}{attentioncolour}{\icattention}{black}
 Please \emph{do not abuse} this method! Keep in mind that this particular feature is included for very specific scenarios in which the command streams are needed ahead of time for proper decision making.
 \end{messagebox}
@@ -1042,25 +946,20 @@
 \begin{codebox}{Example}{teal}{\icnote}{white}
 valid = isSubdirectory(toFile('chapters/'));
 \end{codebox}
+\end{description}
 
-\item[\mdbox{R}{\parbox{0.62\textwidth}{mergeVelocityTemplate(File input, File output,\\\hspace*{1em} Map<String, Object> map)}}{void}] This method, as the name implies, merges the provided \rbox{File} template reference written in the Velocity Template Language 1.7 specification with the \rbox{Map} data object in order to produce a corresponding \rbox{File} output. It is important to observe that this method will raise an exception if the provided input file does not exist or if there is an error with the underlying template language.
+\begin{messagebox}{Flags and reserved storage in a session}{araracolour}{\icok}{white}
+Within a session there are two ``reserved'' namespaces: \verb|arara| and \verb|environment|. The latter is quite intuitive: \arara\ will store the current state of the systems environment variables in its session. You may alter these values in the session storage but they will not be written back to the system configuration. To access an environment variable, you can use its usual name prefixed by \verb|environment:|.
 
-\begin{ncodebox}{Source file}{teal}{\icnote}{white}{input.txt}
-Hello, my name is ${name} and
-I am from ${country}!
-\end{ncodebox}
-
 \begin{codebox}{Example}{teal}{\icnote}{white}
-mergeVelocityTemplate(toFile('input.txt'), toFile('output.txt'),
-     [ 'name' : 'Paulo', 'country' : 'Brazil' ])
+path = getSession().get('environment:PATH');
 \end{codebox}
 
-\begin{messagebox}{Velocity Template Language 1.7}{attentioncolour}{\icattention}{black}
-\setlength{\parskip}{1em}
-As of 2017, the Apache Foundation has released the new 2.0 version for the Velocity Template Language. However, this particular version introduces behavioural and syntactic changes that may cause problems with older versions.
+The \verb|arara| namespace is a bit different. It provides flags that control \arara s behaviour. Flags are used in rules and may be manipulated by the user. Be aware, that every change in this namespace will result in \arara\ acting like you know what you did. Use this power with care. Currently, there is only one relevant flag: \verb|arara:FILENAME:halt|. This will stop the currently run command execution on the file with the specified file name. The value of this map entry is the exit status you want \arara\ to have. 
 
-In order to maintain compatibility with older Java virtual machines, \arara\ works with the \href{http://velocity.apache.org/engine/1.7/vtl-reference.html}{VTL 1.7 specification}, so it is highly recommended to strictly adhere to this reference when writing templates for the corresponding method or the official \rbox{velocity} rule.
+\begin{codebox}{Example}{teal}{\icnote}{white}
+path = getSession().put('arara:myfile.tex:halt', 42);
+\end{codebox}
 \end{messagebox}
-\end{description}
 
 The methods presented in this section provide interesting features for persistent data sharing, error handling, early command execution, and templating. It is important to note that more classes, objects and methods can be incorporated into \arara\ through class loading and object instantiation, extending the features and enhancing the overall user experience.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/mvel.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/mvel.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/mvel.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,7 +2,7 @@
 \chapter{MVEL}
 \label{chap:mvel}
 
-According to the \href{https://en.wikipedia.org/wiki/MVEL}{Wikipedia entry}, the MVFLEX Expression Language (hereafter referred as \gls{MVEL}) is a hybrid, dynamic, statically typed, embeddable expression language and runtime for the Java platform. Originally started as a utility language for an application framework, the project is now developed completely independently. \arara\ relies on this scripting language in two circumstances:
+According to the \href{https://en.wikipedia.org/wiki/MVEL}{Wikipedia entry}, the MVFLEX Expression Language (hereafter referred as MVEL) is a hybrid, dynamic, statically typed, embeddable expression language and runtime for the Java platform. Originally started as a utility language for an application framework, the project is now developed completely independently. \arara\ relies on this scripting language in two circumstances:
 
 \begin{enumerate}
 \item\emph{Rules}, as nominal attributes gathered from directives are used to build complex command invocations and additional computations. A rule follows a very strict model, detailed in Section~\ref{sec:rule}, on page~\pageref{sec:rule}.
@@ -10,7 +10,7 @@
 \item\emph{Conditionals}, as logical expressions must be evaluated in order to decide whether and how a directive should be interpreted. Conditionals are detailed in Section~\ref{sec:directives}, on page~\pageref{sec:directives}.
 \end{enumerate}
 
-This chapter only covers the relevant parts of the \gls{MVEL} language for a consistent use with \arara. For advanced topics, I highly recommend the official language guide for \gls{MVEL} 2.0, available online.
+This chapter only covers the relevant parts of the MVEL language for a consistent use with \arara. For advanced topics, I highly recommend the official language guide for MVEL 2.0, available online.
 
 \section{Basic usage}
 \label{sec:mvelbasicusage}
@@ -27,7 +27,7 @@
 user.name == 'John Doe'
 \end{codebox}
 
-This expression yields a boolean result, either \rbox{true} or \rbox{false} based on a comparison operation. Like a typical programming language, \gls{MVEL} supports the full gamut of operator precedence rules, including the ability to use bracketing to control execution order:
+This expression yields a boolean result, either \rbox{true} or \rbox{false} based on a comparison operation. Like a typical programming language, MVEL supports the full gamut of operator precedence rules, including the ability to use bracketing to control execution order:
 
 \begin{codebox}{Execution order control through bracketing}{teal}{\icnote}{white}
 (user.name == 'John Doe') && ((x * 2) - 1) > 20
@@ -39,7 +39,7 @@
 statement1; statement2; statement3
 \end{codebox}
 
-It is important to observe that \gls{MVEL} expressions use a \emph{last value out} principle. This means, that although \gls{MVEL} supports the \rbox{return} keyword, it can be safely omitted. For example:
+It is important to observe that MVEL expressions use a \emph{last value out} principle. This means, that although MVEL supports the \rbox{return} keyword, it can be safely omitted. For example:
 
 \begin{codebox}{Automatic return}{teal}{\icnote}{white}
 foo = 10;
@@ -57,18 +57,18 @@
 
 Personally, I like to explicitly add a \rbox{return} statement, as it provides a visual indication of the expression exit point. All rules released with \arara\ favour this writing style. However, feel free to choose any writing style you want, as long as the resulting code is consistent.
 
-The type coercion system of \gls{MVEL} is applied in cases where two incomparable types are presented by attempting to coerce the right value to that of the type of the left value, and then vice-versa. For example:
+The type coercion system of MVEL is applied in cases where two incomparable types are presented by attempting to coerce the right value to that of the type of the left value, and then vice-versa. For example:
 
 \begin{codebox}{Type coercion}{teal}{\icnote}{white}
 "123" == 123;
 \end{codebox}
 
-Surprisingly, the evaluation of such expression holds \rbox{true} in \gls{MVEL} because the underlying type coercion system will coerce the untyped number \rbox{123} to a string \rbox{123} in order to perform the comparison.
+Surprisingly, the evaluation of such expression holds \rbox{true} in MVEL because the underlying type coercion system will coerce the untyped number \rbox{123} to a string \rbox{123} in order to perform the comparison.
 
 \section{Inline lists, maps and arrays}
 \label{sec:mvelinlinelistsmapsandarrays}
 
-According to the documentation, \gls{MVEL} allows you to express lists, maps and arrays using simple elegant syntax. Lists are expressed in the following format:
+According to the documentation, MVEL allows you to express lists, maps and arrays using simple elegant syntax. Lists are expressed in the following format:
 
 \begin{codebox}{Creating a list}{teal}{\icnote}{white}
 [ "Jim", "Bob", "Smith" ]
@@ -97,7 +97,7 @@
 \section{Property navigation}
 \label{sec:propertynavigation}
 
-\gls{MVEL} provides a single, unified syntax for accessing properties, static fields, maps and other structures. Lists are accessed the same as arrays. For example, these two constructs are equivalent (\gls{MVEL} and Java access styles for lists and arrays, respectively):
+MVEL provides a single, unified syntax for accessing properties, static fields, maps and other structures. Lists are accessed the same as arrays. For example, these two constructs are equivalent (MVEL and Java access styles for lists and arrays, respectively):
 
 \begin{codebox}{MVEL access style for lists and arrays}{teal}{\icnote}{white}
 user[5]
@@ -107,7 +107,7 @@
 user.get(5)
 \end{codebox}
 
-Observe that \gls{MVEL} accepts plain Java methods as well. Maps are accessed in the same way as arrays except any object can be passed as the index value. For example, these two constructs are equivalent (\gls{MVEL} and Java access styles for maps, respectively):
+Observe that MVEL accepts plain Java methods as well. Maps are accessed in the same way as arrays except any object can be passed as the index value. For example, these two constructs are equivalent (MVEL and Java access styles for maps, respectively):
 
 \begin{codebox}{MVEL access style for maps}{teal}{\icnote}{white}
 user["foobar"]
@@ -123,7 +123,7 @@
 \section{Flow control}
 \label{sec:mvelflowcontrol}
 
-The expression language goes beyond simple evaluations. In fact, \gls{MVEL} supports an assortment of control flow operators (namely, conditionals and repetitions) which allows advanced scripting operations. Consider this conditional statement:
+The expression language goes beyond simple evaluations. In fact, MVEL supports an assortment of control flow operators (namely, conditionals and repetitions) which allows advanced scripting operations. Consider this conditional statement:
 
 \begin{codebox}{Conditional statement}{teal}{\icnote}{white}
 if (var > 0) {
@@ -137,7 +137,7 @@
 }
 \end{codebox}
 
-As seen in the previous code, the syntax is very similar to the ones found in typical programming languages. \gls{MVEL} also provides a shorter version, known as a ternary statement:
+As seen in the previous code, the syntax is very similar to the ones found in typical programming languages. MVEL also provides a shorter version, known as a ternary statement:
 
 \begin{codebox}{Ternary statement}{teal}{\icnote}{white}
 answer == true ? "yes" : "no";
@@ -151,7 +151,7 @@
 }
 \end{codebox}
 
-As expected, \gls{MVEL} also implements the standard C \rbox{for} loop. Observe that newer versions of \gls{MVEL} allow an abbreviation of \rbox{foreach} to the usual \rbox{for} statement, as syntactic sugar. In order to explicitly indicate a collection iteration, we usually use \rbox{foreach} in the default rules for \arara, but both statements behave exactly the same from a semantic point of view. 
+As expected, MVEL also implements the standard C \rbox{for} loop. Observe that newer versions of MVEL allow an abbreviation of \rbox{foreach} to the usual \rbox{for} statement, as syntactic sugar. In order to explicitly indicate a collection iteration, we usually use \rbox{foreach} in the default rules for \arara, but both statements behave exactly the same from a semantic point of view. 
 
 \begin{codebox}{Iteration statement}{teal}{\icnote}{white}
 for (int i = 0; i < 100; i++) { 
@@ -173,7 +173,7 @@
 } until (x == null);
 \end{codebox}
 
-Finally, \gls{MVEL} also implements the standard \rbox{while}, with the significant addition of an \rbox{until} counterpart (for inverted logic):
+Finally, MVEL also implements the standard \rbox{while}, with the significant addition of an \rbox{until} counterpart (for inverted logic):
 
 \begin{codebox}{Iteration statement}{teal}{\icnote}{white}
 while (isTrue()) {
@@ -192,7 +192,7 @@
 \section{Projections and folds}
 \label{sec:mvelprojectionsandfolds}
 
-Projections are a way of representing collections. According to the official documentation, using a very simple syntax, one can inspect very complex object models inside collections in \gls{MVEL} using the \rbox{in} operator. For example:
+Projections are a way of representing collections. According to the official documentation, using a very simple syntax, one can inspect very complex object models inside collections in MVEL using the \rbox{in} operator. For example:
 
 \begin{codebox}{Projection and fold}{teal}{\icnote}{white}
 names = (user.name in users);
@@ -203,7 +203,7 @@
 \section{Assignments}
 \label{sec:mvelassignments}
 
-According to the official documentation, the scripting language allows variable assignment in expressions, either for extraction from the runtime, or for use inside the expression. As \gls{MVEL} is a dynamically typed language, there is no need to specify a type in order to declare a new variable. However, feel free to explicitly declare the type when desired.
+According to the official documentation, the scripting language allows variable assignment in expressions, either for extraction from the runtime, or for use inside the expression. As MVEL is a dynamically typed language, there is no need to specify a type in order to declare a new variable. However, feel free to explicitly declare the type when desired.
 
 \begin{codebox}{Assignment}{teal}{\icnote}{white}
 str = "My string";
@@ -227,7 +227,7 @@
 \section{Basic templating}
 \label{sec:mvelbasictemplating}
 
-\gls{MVEL} templates are comprised of \emph{orb} tags inside a plain text document. \Glspl{orb-tag} denote dynamic elements of the template which the engine will evaluate at runtime. \arara\ heavily relies on this concept for runtime evaluation of conditionals and rules. For rules, we use \glspl{orb-tag} to return either a string from a textual template or a proper command object. The former constituted the basis of command generation in previous versions of our tool; from version 4.0 on, we highly recommend the latter, detailed in Section~\ref{sec:rule}, on page~\ref{sec:rule}. Conditionals are in fact \glspl{orb-tag} in disguise, such that the expression (or a sequence of expressions) is properly evaluated at runtime. Consider the following example:
+MVEL templates are comprised of \emph{orb} tags inside a plain text document. Orb tags denote dynamic elements of the template which the engine will evaluate at runtime. \arara\ heavily relies on this concept for runtime evaluation of conditionals and rules. For rules, we use orb tags to return either a string from a textual template or a proper command object. The former constituted the basis of command generation in previous versions of our tool; we highly recommend the latter, detailed in Section~\ref{sec:rule}, on page~\ref{sec:rule}. Conditionals are in fact orb tags in disguise, such that the expression (or a sequence of expressions) is properly evaluated at runtime. Consider the following example:
 
 \begin{codebox}{Template}{teal}{\icnote}{white}
 My favourite team is @{ person.name == 'Enrico'
@@ -234,9 +234,9 @@
 ? 'Juventus' : 'Palmeiras' }!
 \end{codebox}
 
-The above code features a basic form of \gls{orb-tag} named \emph{expression orb}. It contains an expression (or a sequence of expressions) which will be evaluated to a certain value, as seen earlier on, when discussing the \emph{last value out} principle. In the example, the value to be returned will be a string containing a football team name (the result is of course based on the comparison outcome).
+The above code features a basic form of orb tag named \emph{expression orb}. It contains an expression (or a sequence of expressions) which will be evaluated to a certain value, as seen earlier on, when discussing the \emph{last value out} principle. In the example, the value to be returned will be a string containing a football team name (the result is of course based on the comparison outcome).
 
 \section{Further reading}
 \label{sec:mvelfurtherreading}
 
-This chapter does not cover all features of the \gls{MVEL} expression language, so further reading is advisable. I highly recommend the \href{http://mvel.documentnode.com/}{MVEL language guide} currently covering version 2.0 of the language.
+This chapter does not cover all features of the MVEL expression language, so further reading is advisable. I highly recommend the \href{http://mvel.documentnode.com/}{MVEL language guide} currently covering version 2.0 of the language.

Deleted: trunk/Master/texmf-dist/doc/support/arara/chapters/prologue.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/prologue.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/prologue.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,27 +0,0 @@
-% !TeX root = ../arara-manual.tex
-\chapter*{Prologue}
-\label{chap:prologue}
-
-\epigraph{Moral of the story: never read the
-documentation, bad things happen.}{\textsc{David Carlisle}}
-
-{\setlength{\parskip}{1em}
-Writing software is easy. Writing \emph{good} software is extremely difficult. When the counter stopped at version 3.0, Brent, Marco and I decided it was time for \arara\ to graduate and finally be released in \TeX\ Live. My life had changed.
-
-It was a success. A lot of people liked the idea of explicitly telling our tool how to compile their \TeX\ documents instead of relying on guesswork. It was indeed a cool concept! But then, the inevitable happened: a lot of bugs had emerged from the dark depths of my humble code.
-
-In all seriousness, \emph{I was about to give up}. My code was not awful, but there were a couple of critical and blocking bugs. Something very drastic had to be done in order to put \arara\ back on track. Then, walking on faith, I decided to rewrite the tool entirely from scratch. In order to achieve this goal, I created a \href{https://github.com/cereda/nightingale}{sandbox} and started working on the new code.
-
-It was my redemption. Nicola helped me with the new version, writing code, fixing bugs and suggesting new features. Soon, we all achieved a very pleasant result. It was like \arara\ was about to hatch again. Version 4.0 was definitely at our hands. Now, it is up to you.
-
-Surprisingly, this humble user manual is not the best resource for learning about our tool. If you really want to see \arara\ in action, I strongly recommend \href{https://www.dickimaw-books.com/latex/admin}{\LaTeX\ for administrative work}, an amazing book freely available for download. The author is, of course, Nicola herself! She explains how \LaTeX\ can be used for administrative work, such as writing correspondence, performing repetitive tasks or typesetting problem sheets on exam papers. And \arara\ is there!
-
-Enjoy the new version. Happy \TeX ing with \arara!
-\par}
-
-\vfill
-
-\begin{flushright}
-Paulo Roberto Massa Cereda\\
-\emph{on behalf of the \arara\ team}
-\end{flushright}

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/rules.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/rules.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/rules.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -9,7 +9,7 @@
 \end{messagebox}
 
 \begin{description}
-\item[\rulebox{animate}{Chris Hughes, Paulo Cereda}]
+\item[\rulebox{animate}]
 This rule creates an animated \rbox{gif} file from the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{pdf} suffix, using the \rbox{convert} command line utility from the ImageMagick suite.
 
 \begin{description}
@@ -35,14 +35,64 @@
 % arara: animate: { delay: 15, density: 150 }
 \end{codebox}
 
-\item[\rulebox{bib2gls}{Nicola Talbot, Paulo Cereda}] This rule executes the \rbox{bib2gls} command line application which extracts glossary information stored in a \rbox{bib} file and converts it into glossary entry definitions in resource files. This rule passes the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
+\item[\rulebox{asymptote}]
+This rule executes the \rbox{asy} command line, referring to Asymptote, a powerful descriptive vector graphics language for technical drawings, inspired by Metapost but with an improved syntax. Please note that you will have to make the \rbox{.asy} extension known to \arara\ in order to compile Asymptote files. Furthermore, it is advised to use this in your regular \TeX\ document specifying the \abox{files} parameter to include all graphics you want to compile for inclusion in your document.
 
 \begin{description}
+\item[\abox{color}] This option, as the name suggests, provides the underlying color model to be used in the current execution. Possible values are:
+
+\begin{description}
+\item[\povalue{\hphantom{x}bw\hphantom{x}}] This option value, as the name suggests, converts all colors to a black and white model.
+
+\item[\povalue{cmyk}] This option value converts the RGB (red, green an blue) color model to the CMYK (cyan, magenta, yellow and black) counterpart. 
+
+\item[\povalue{rgb}] This option value converts the CMYK (cyan, magenta, yellow and black)  color model to the RGB (red, green an blue) counterpart.
+
+\item[\povalue{gray}] This option value, as the name suggests, converts all colors to a grayscale model.
+\end{description}
+
+\item[\rpbox{engine}{latex}] This option, as the name indicates, sets the underlying \TeX\ engine to be used for the current compilation. Make sure to take a look at the Asymptote manual for further details on this option. Possible values are:
+
+\begin{description}
+\item[\povalue{latex}] This value, as the name suggests, sets the underlying \TeX\ engine to \rbox{latex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{pdflatex}] This value, as the name indicates, sets the underlying \TeX\ engine to \rbox{pdflatex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{xelatex}] This value, as the name suggests, sets the underlying \TeX\ engine to \rbox{xelatex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{lualatex}] This value, as the name indicates, sets the underlying \TeX\ engine to \rbox{lualatex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{tex}] This value, as the name suggests, sets the underlying \TeX\ engine to \rbox{tex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{pdftex}] This value, as the name indicates, sets the underlying \TeX\ engine to \rbox{pdftex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{luatex}] This value, as the name suggests, sets the underlying \TeX\ engine to \rbox{luatex} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{context}] This value, as the name indicates, sets the underlying \TeX\ engine to \rbox{context} for the current compilation. Note that the engine might play a major role in the generated code.
+
+\item[\povalue{none}] This value, as the name suggests, sets the underlying \TeX\ engine to \rbox{none} for the current compilation. In this case, there will be no associated engine.
+\end{description} 
+
+\item[\abox{format}] This option, as the name suggests, converts each output file to a specified format. Make sure to take a look at the Asymptote manual for further details.
+
+\item[\abox{output}] This option, as the name suggests, sets an alternative output directory or file name. Make sure to take a look at the Asymptote manual for further details.
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: asymptote: { files: [ mydrawing.asy ] }
+\end{codebox}
+\end{description}
+
+\item[\rulebox{bib2gls}]
+This rule executes the \rbox{bib2gls} command line application which extracts glossary information stored in a \rbox{bib} file and converts it into glossary entry definitions in resource files. This rule passes the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
+
+\begin{description}
 \item[\abox{dir}] This option sets the directory used for writing auxiliary files. Note that this option does not change the current working directory.
 
 \item[\abox{trans}] This option sets the extension of the transcript file created by \rbox{bib2gls}. The value should be just the file extension without the leading dot. The default is \rbox{glg}.
 
-\item[\abox{locale}] This option specifies the preferred language resource file. Please keep in mind that the provided value must be a valid \gls{IETF} language tag. If omitted, the default is obtained by \rbox{bib2gls} from the \gls{JVM}.
+\item[\abox{locale}] This option specifies the preferred language resource file. Please keep in mind that the provided value must be a valid IETF language tag. If omitted, the default is obtained by \rbox{bib2gls} from the JVM.
 
 \item[\rpsbox{group}] This option sets whether \rbox{bib2gls} will try to determine the letter group for each entry and add it to a new field called \rbox{group} when sorting. Be mindful that some \rbox{sort} options ignore this setting. The default value is off.
 
@@ -80,9 +130,12 @@
 % arara: --> if found('aux', 'glsxtr at resource')
 \end{codebox}
 
-\item[\rulebox{biber}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{biber}, the backend bibliography processor for \rbox{biblatex}, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
+\item[\rulebox{biber}]
+This rule runs \rbox{biber}, the backend bibliography processor for \rbox{biblatex}, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
 
 \begin{description}
+\item[\rpsbox{tool}]  This option sets whether the bibliography processor should be executed in \emph{tool mode}, intended for transformations and modifications of datasources. Since this mode is oriented towards a datasource rather than a document, make sure to use it alongside the \abox{options} option. 
+
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
 \end{description}
 
@@ -90,7 +143,8 @@
 % arara: biber: { options: [ '--wraplines' ] }
 \end{codebox}
 
-\item[\rulebox{bibtex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{bibtex} program, a reference management software, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
+\item[\rulebox{bibtex}]
+This rule runs the \rbox{bibtex} program, a reference management software, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -101,7 +155,8 @@
 % arara: --> if exists(toFile('references.bib'))
 \end{codebox}
 
-\item[\rulebox{bibtex8}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{bibtex8}, an enhanced, portable C version of \rbox{bibtex}, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string. It is important to note that this tool can read a character set file containing encoding details.
+\item[\rulebox{bibtex8}]
+This rule runs \rbox{bibtex8}, an enhanced, portable C version of \rbox{bibtex}, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string. It is important to note that this tool can read a character set file containing encoding details.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -111,7 +166,8 @@
 % arara: bibtex8: { options: [ '--trace', '--huge' ] }
 \end{codebox}
 
-\item[\rulebox{bibtexu}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{bibtexu} program, an enhanced version of \rbox{bibtex} with Unicode support and language features, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
+\item[\rulebox{bibtexu}]
+This rule runs the \rbox{bibtexu} program, an enhanced version of \rbox{bibtex} with Unicode support and language features, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -121,7 +177,8 @@
 % arara: bibtexu: { options: [ '--language', 'fr' ] }
 \end{codebox}
 
-\item[\rulebox{clean}{Marco Daniel, Paulo Cereda}] This rule removes the provided file reference through the underlying system command, which can be \rbox{rm} in a Unix environment or \rbox{del} in Microsoft Windows. As a security lock, this rule will always throw an error if \mtbox{currentFile} is equal to \mtbox{getOriginalFile}, so the main file reference cannot be removed. It is highly recommended to use the special \abox{files} parameter to indicate removal candidates. Alternatively, a list of file extensions can be provided as well. Be mindful that the security lock also applies to file removals based on extensions.
+\item[\rulebox{clean}]
+This rule removes the provided file reference through the underlying system command, which can be \rbox{rm} in a Unix environment or \rbox{del} in Microsoft Windows. As a security lock, this rule will always throw an error if \mtbox{currentFile} is equal to \mtbox{getOriginalFile}, so the main file reference cannot be removed. It is highly recommended to use the special \abox{files} parameter to indicate removal candidates. Alternatively, a list of file extensions can be provided as well. Be mindful that the security lock also applies to file removals based on extensions.
 
 \begin{description}
 \item[\abox{extensions}] This option, as the name indicates, takes a list of extensions and constructs a new list of removals commands according to the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with each extension from the original list as suffixes. Keep in mind that, if the special \abox{files} parameter is used with this option, the resulting list will contain the cartesian product of file base names and extensions. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -135,7 +192,8 @@
 % arara: clean: { extensions: [ aux, log ] }
 \end{codebox}
 
-\item[\rulebox{csplain}{Paulo Cereda}] This rule runs the \rbox{csplain} \TeX\ engine, a conservative extension of Knuth's plain \TeX\ with direct processing characters and hyphenation patterns for Czech and Slovak, on the provided \mtbox{currentFile} reference.
+\item[\rulebox{csplain}]
+This rule runs the \rbox{csplain} \TeX\ engine, a conservative extension of Knuth's plain \TeX\ with direct processing characters and hyphenation patterns for Czech and Slovak, on the provided \mtbox{currentFile} reference.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. When such option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -163,7 +221,8 @@
 % arara: csplain: { interaction: batchmode, shell: yes }
 \end{codebox}
 
-\item[\rulebox{datatooltk}{Nicola Talbot, Paulo Cereda}] This rule runs \rbox{datatooltk}, an application that creates \rbox{datatool} databases in raw format from several structured data formats, in batch mode. This rule requires \abox{output} and one of the import options.
+\item[\rulebox{datatooltk}]
+This rule runs \rbox{datatooltk}, an application that creates \rbox{datatool} databases in raw format from several structured data formats, in batch mode. This rule requires \abox{output} and one of the import options.
 
 \begin{description}
 \item[\abox{output}~\rqbox] This option provides the database name to be saved as output. To guard against accidentally overwriting a document file, \rbox{datatooltk} now forbids the \rbox{tex} extension for output files. This option is required.
@@ -176,11 +235,11 @@
 
 \item[\abox{name}] This option, as the name indicates, sets the label reference of the newly created database according to the provided value.
 
-\item[\abox{sql}] This option imports data from an \gls{SQL} database where the provided value refers to a proper \rbox{select} \gls{SQL} statement.
+\item[\abox{sql}] This option imports data from an SQL database where the provided value refers to a proper \rbox{select} SQL statement.
 
-\item[\abox{sqldb}] This option, as the name indicates, sets the name of the \gls{SQL} database according to the provided value.
+\item[\abox{sqldb}] This option, as the name indicates, sets the name of the SQL database according to the provided value.
 
-\item[\abox{sqluser}] This option, as the name indicates, sets the name of the \gls{SQL} user according to the provided value.
+\item[\abox{sqluser}] This option, as the name indicates, sets the name of the SQL user according to the provided value.
 
 \item[\rpbox{noconsole}{gui}] This action dictates the password request action if such information was not provided earlier. If there is no console available, the action is determined by the following values:
 
@@ -189,7 +248,7 @@
 
 \item[\povalue{stdin}] This action requests the password via the standard input stream, which is less secure than using a console.
 
-\item[\povalue{gui}] This action displays a dialog box in which the user can enter the password for the \gls{SQL} database.
+\item[\povalue{gui}] This action displays a dialog box in which the user can enter the password for the SQL database.
 \end{description}
 
 \item[\abox{probsoln}] This option, as the name indicates, imports data in the \rbox{probsoln} format from the file name provided as the value.
@@ -213,7 +272,7 @@
 
 \item[\rpsbox{owneronly}] This option sets whether read and write permissions when saving \rbox{dbtex} files should be defined for the owner only. This option has no effect on some operating systems.
 
-\item[\rpsbox{maptex}] This option sets whether \TeX\ special characters will be properly mapped when importing data from \rbox{csv} files or \gls{SQL} databases.
+\item[\rpsbox{maptex}] This option sets whether \TeX\ special characters will be properly mapped when importing data from \rbox{csv} files or SQL databases.
 
 \item[\abox{xls}] This option, as the name indicates, imports data from a Microsoft Excel \rbox{xls} file reference provided as a plain string value.
 
@@ -240,7 +299,8 @@
 % arara: --> csv: booklist.csv }
 \end{codebox}
 
-\item[\rulebox{dvipdfm}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{dvipdfm}, a command line utility for file format translation, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
+\item[\rulebox{dvipdfm}]
+This rule runs \rbox{dvipdfm}, a command line utility for file format translation, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
 
 \begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{pdf} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
@@ -252,7 +312,8 @@
 % arara: dvipdfm: { output: thesis }
 \end{codebox}
 
-\item[\rulebox{dvipdfmx}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{dvipdfmx}, an extended version of \rbox{dvipdfm} created to support multibyte character encodings and large character sets for East Asian languages, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
+\item[\rulebox{dvipdfmx}]
+This rule runs \rbox{dvipdfmx}, an extended version of \rbox{dvipdfm} created to support multibyte character encodings and large character sets for East Asian languages, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
 
 \begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{pdf} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
@@ -264,7 +325,8 @@
 % arara: dvipdfmx: { options: [ '-K', '40' ] }
 \end{codebox}
 
-\item[\rulebox{dvips}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{dvips} on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a PostScript \rbox{ps} file.
+\item[\rulebox{dvips}]
+This rule runs \rbox{dvips} on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a PostScript \rbox{ps} file.
 
 \begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{ps} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
@@ -276,7 +338,8 @@
 % arara: dvips: { output: thesis }
 \end{codebox}
 
-\item[\rulebox{dvipspdf}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{dvips} in order to obtain a corresponding \rbox{ps} file from the initial \rbox{dvi} reference, and then runs \rbox{ps2pdf} on the previously generated \rbox{ps} file in order to obtain a \rbox{pdf} file. Note that all base names are acquired from the \mtbox{currentFile} reference (i.e, the name without the associated extension) and used to construct the resulting files.
+\item[\rulebox{dvipspdf}]
+This rule runs \rbox{dvips} in order to obtain a corresponding \rbox{ps} file from the initial \rbox{dvi} reference, and then runs \rbox{ps2pdf} on the previously generated \rbox{ps} file in order to obtain a \rbox{pdf} file. Note that all base names are acquired from the \mtbox{currentFile} reference (i.e, the name without the associated extension) and used to construct the resulting files.
 
 \begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{pdf} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
@@ -290,7 +353,8 @@
 % arara: dvipspdf: { output: article }
 \end{codebox}
 
-\item[\rulebox{dvisvgm}{samcarter}] This rule runs \rbox{dvisvgm} in order to obtain a corresponding \rbox{svg} file, a vector graphics format based on XML, from the initial \rbox{dvi} reference. It is important to observe that the base name is acquired from the \mtbox{currentFile} reference (i.e, the name without the associated extension) and used to construct the resulting file.
+\item[\rulebox{dvisvgm}]
+This rule runs \rbox{dvisvgm} in order to obtain a corresponding \rbox{svg} file, a vector graphics format based on XML, from the initial \rbox{dvi} reference. It is important to observe that the base name is acquired from the \mtbox{currentFile} reference (i.e, the name without the associated extension) and used to construct the resulting file.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -300,7 +364,8 @@
 % arara: dvisvgm
 \end{codebox}
 
-\item[\rulebox{etex}{Marco Daniel, Paulo Cereda, Nicola Talbot}] This rule runs the \rbox{etex} extended (plain) \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
+\item[\rulebox{etex}]
+This rule runs the \rbox{etex} extended (plain) \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -324,7 +389,8 @@
 % arara: etex: { shell: yes }
 \end{codebox}
 
-\item[\rulebox{frontespizio}{Francesco Endrici, Enrico Gregorio, Paulo Cereda}] This rule automates the steps required by the \rbox{frontespizio} package in order to help Italian users generate the frontispiece to their thesis. First and foremost, the frontispiece is generated. If \rbox{latex} is used as the underlying engine, there is an additional intermediate conversion step to a proper \rbox{eps} file. Finally, the final document is compiled.
+\item[\rulebox{frontespizio}]
+This rule automates the steps required by the \rbox{frontespizio} package in order to help Italian users generate the frontispiece to their thesis. First and foremost, the frontispiece is generated. If \rbox{latex} is used as the underlying engine, there is an additional intermediate conversion step to a proper \rbox{eps} file. Finally, the final document is compiled.
 
 \begin{description}
 \item[\rpbox{engine}{pdflatex}] This option, as the name indicates, sets the underlying \TeX\ engine to be used for both compilations (the frontispiece and the document itself). Possible values are:
@@ -361,13 +427,15 @@
 % arara: --> shell: yes, interaction: nonstopmode }
 \end{codebox}
 
-\item[\rulebox{halt}{Heiko Oberdiek, Paulo Cereda}] This rule, as the name suggests, calls the \rbox{halt} trigger, which stops the current interpretation workflow, such that subsequent directives are ignored. This rule contains no associated options. Please refer to Section~\ref{sec:commandsandtriggers}, on page~\pageref{sec:commandsandtriggers}, for more information on triggers.
+\item[\rulebox{halt}]
+This rule, as the name suggests, sets a \rbox{halt} flag, which stops the current interpretation workflow, such that subsequent directives are ignored. This rule contains no associated options. Please refer to Section~\ref{sec:others}, on page~\pageref{sec:others}, for more information on flags.
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
 % arara: halt
 \end{codebox}
 
-\item[\rulebox{indent}{Chris Hughes, Paulo Cereda}] This rule runs \rbox{latexindent}, a Perl script that indents \TeX\ files according to an indentation scheme, on the provided \mtbox{currentFile} reference. Environments, including those with alignment delimiters, and commands, including those that can split braces and brackets across lines, are usually handled correctly by the script.
+\item[\rulebox{indent}]
+This rule runs \rbox{latexindent}, a Perl script that indents \TeX\ files according to an indentation scheme, on the provided \mtbox{currentFile} reference. Environments, including those with alignment delimiters, and commands, including those that can split braces and brackets across lines, are usually handled correctly by the script.
 
 \begin{description}
 \item[\rpsbox{silent}] This option, as the name indicates, sets whether the script will operate in silent mode, in which no output is given to the terminal.
@@ -419,9 +487,37 @@
 % arara: indent: { overwrite: yes }
 \end{codebox}
 
-\item[\rulebox{latex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{latex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
+\item[\rulebox{knitr}]
+This rule calls the \rbox{knitr} package, a transparent engine for dynamic report generation with R. It takes an \rbox{.Rnw} file as input, extracts the R code in it according to a list of patterns, evaluates the code and writes the output in another file. It can also tangle R source code from the input document.
 
 \begin{description}
+\item[\rpbox{output}{NULL}] This option sets the output file. when absent, \rbox{knitr} will try to guess a default, which will be under the current working directory.
+
+\item[\rpsbox{tangle}] This option sets whether to tangle the R code from the input file. Note that, when used, this option requires \abox{output} to be specified as well, otherwise an error is thrown.
+
+\item[\rpsbox{quiet}] This option, as the name indicates, sets whether the tool should suppress both progress bar and messages.
+
+\item[\rpbox{envir}{parent.frame()}] This option sets the environment in which code chunks are to be evaluated. Please refer to the documentation for further details.
+
+\item[\rpbox{encoding}{getOption("encoding")}] This option, as the name indicates, sets the encoding of the input file. Please refer to the documentation for further details.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: knitr: { quiet: yes }
+\end{codebox}
+
+\item[\rulebox{latex}]
+This rule runs the \rbox{latex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
+
+\begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
+\end{description}
+
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
 
 \begin{description}
@@ -447,7 +543,8 @@
 % arara: latex: { interaction: scrollmode, draft: yes }
 \end{codebox}
 
-\item[\rulebox{latexmk}{Marco Daniel, Brent Longborough, Paulo Cereda}] This rule runs \rbox{latexmk}, a fantastic command line tool for fully automated \TeX\ document generation, on the provided \mtbox{currentFile} reference.
+\item[\rulebox{latexmk}]
+This rule runs \rbox{latexmk}, a fantastic command line tool for fully automated \TeX\ document generation, on the provided \mtbox{currentFile} reference.
 
 \begin{description}
 \item[\abox{clean}] This option, as the name indicates, removes all temporary files generated after a sequence of intermediate calls for document generation. Two possible values are available:
@@ -479,7 +576,8 @@
 % arara: latexmk: { engine: pdflatex }
 \end{codebox}
 
-\item[\rulebox{lualatex}{Marco Daniel, Paulo Cereda}] This rule runs the new \rbox{lualatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{luahbtex}]
+This rule runs the \rbox{luahbtex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -504,11 +602,50 @@
 \end{description}
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: luahbtex: { interaction: batchmode,
+% arara: --> shell: yes, draft: yes }
+\end{codebox}
+
+\item[\rulebox{lualatex}]
+This rule runs the new \rbox{lualatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+
+\begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
+\end{description}
+
+\item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
+
+\begin{description}
+\item[\povalue{batchmode}] In this mode, nothing is printed on the terminal, and errors are scrolled as if the \rbox{return} key is hit at every error. Missing files that \TeX\ tries to input or request from keyboard input cause the job to abort.
+
+\item[\povalue{nonstopmode}] In this mode, the diagnostic message will appear on the terminal, but there is no possibility of user interaction just like in batch mode, previously described.
+
+\item[\povalue{scrollmode}] In this mode, as the name indicates, \TeX\ will stop only for missing files to input or if proper keyboard input is necessary. \TeX\ fixes errors itself.
+
+\item[\povalue{errorstopmode}] In this mode, \TeX\ will stop at each error, asking for proper user intervention. This is the most user interactive mode available.
+\end{description}
+
+\item[\rpsbox{shell}] This option sets whether the possibility of running underlying system commands from within \TeX\ is activated.
+
+\item[\rpsbox{synctex}] This option sets whether \rbox{synctex}, an input and output synchronization feature that allows navigation from source to typeset material and vice versa, available in most \TeX\ engines, is activated.
+
+\item[\rpsbox{draft}] This option sets whether the draft mode, i.e, a mode that produces no output, so the engine can check the syntax, is activated.
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
 % arara: lualatex: { interaction: errorstopmode,
 % arara: --> synctex: yes }
 \end{codebox}
 
-\item[\rulebox{luatex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{luatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{luatex}]
+This rule runs the \rbox{luatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -537,7 +674,8 @@
 % arara: --> shell: yes, draft: yes }
 \end{codebox}
 
-\item[\rulebox{make}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{make}, a build automation tool that automatically builds executable programs and libraries from source code, according to a special file which specifies how to derive the target program.
+\item[\rulebox{make}]
+This rule runs \rbox{make}, a build automation tool that automatically builds executable programs and libraries from source code, according to a special file which specifies how to derive the target program.
 
 \begin{description}
 \item[\abox{targets}] This option takes a list of targets. Note that \rbox{make} updates a target if it depends on files that have been modified since the target was last modified, or if the target does not exist.
@@ -549,7 +687,8 @@
 % arara: make: { targets: [ compile, package ] }
 \end{codebox}
 
-\item[\rulebox{makeglossaries}{Marco Daniel, Nicola Talbot, Paulo Cereda}] This rule runs \rbox{makeglossaries}, an efficient Perl script designed for use with \TeX\ documents that work with the \rbox{glossaries} package. All the information required to be passed to the relevant indexing application should also be contained in the auxiliary file. The script takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
+\item[\rulebox{makeglossaries}]
+This rule runs \rbox{makeglossaries}, an efficient Perl script designed for use with \TeX\ documents that work with the \rbox{glossaries} package. All the information required to be passed to the relevant indexing application should also be contained in the auxiliary file. The script takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual script call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -559,7 +698,8 @@
 % arara: makeglossaries if found('aux', '@istfilename')
 \end{codebox}
 
-\item[\rulebox{makeglossarieslite}{Marco Daniel, Nicola Talbot, Paulo Cereda}] This rule runs \rbox{makeglossaries-lite}, a lightweight Lua script designed for use with \TeX\ documents that work with the \rbox{glossaries} package. All the information required to be passed to the relevant indexing application should also be contained in the auxiliary file. The script takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
+\item[\rulebox{makeglossarieslite}]
+This rule runs \rbox{makeglossaries-lite}, a lightweight Lua script designed for use with \TeX\ documents that work with the \rbox{glossaries} package. All the information required to be passed to the relevant indexing application should also be contained in the auxiliary file. The script takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as the mandatory argument.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual script call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -569,7 +709,8 @@
 % arara: makeglossarieslite if found('aux', '@istfilename')
 \end{codebox}
 
-\item[\rulebox{makeindex}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{makeindex}, a general purpose hierarchical index generator, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
+\item[\rulebox{makeindex}]
+This rule runs \rbox{makeindex}, a general purpose hierarchical index generator, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
 
 \begin{description}
 \item[\abox{style}] This option, as the name indicates, sets the underlying index style file. Make sure to provide a valid \rbox{ist} file when using this option.
@@ -597,9 +738,43 @@
 % arara: makeindex: { style: book.ist }
 \end{codebox}
 
-\item[\rulebox{nomencl}{Marco Daniel, Nicola Talbot, Paulo Cereda}] This rule runs \rbox{makeindex} in order to automatically generate a nomenclature list from \TeX\ documents that work with the \rbox{nomencl} package. The program itself is a general purpose hierarchical index generator and takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{nlo} suffix and a special style file in order to generate the nomenclature list as a special \rbox{nls} file.
+\item[\rulebox{metapost}]
+This rule runs \rbox{metapost}, a tool to compile the Metapost graphics programming language. Please note that you will have to make the \rbox{.mp} extension known to \arara\ in order to compile Metapost files. Furthermore, it is advised to use this in your regular \TeX\ document specifying the \abox{files} parameter to include all graphics you want to compile for inclusion in your document.
 
 \begin{description}
+\item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
+
+\begin{description}
+\item[\povalue{batchmode}] In this mode, nothing is printed on the terminal, and errors are scrolled as if the \rbox{return} key is hit at every error. Missing files that \TeX\ tries to input or request from keyboard input cause the job to abort.
+
+\item[\povalue{nonstopmode}] In this mode, the diagnostic message will appear on the terminal, but there is no possibility of user interaction just like in batch mode, previously described.
+
+\item[\povalue{scrollmode}] In this mode, as the name indicates, \TeX\ will stop only for missing files to input or if proper keyboard input is necessary. \TeX\ fixes errors itself.
+
+\item[\povalue{errorstopmode}] In this mode, \TeX\ will stop at each error, asking for proper user intervention. This is the most user interactive mode available.
+\end{description}
+
+\item[\abox{numbersystem}] This option sets the number system Metapost will use for calculations.
+
+\begin{description}
+\item[\povalue{scaled}] In this mode, 32-bit fixed-point arithmetics is used.
+
+\item[\povalue{double}] In this mode, IEEE floating-point arithmetics with 64 bits is used.
+\item[\povalue{binary}] This mode is similary to \povalue{double} but without a fixed-length mantissa.
+\item[\povalue{decimal}] In this mode, arbitrary precision arithmetics is used and numbers are internally represented in base 10.
+\end{description}
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: metapost: { files: [ graphics.mp ] }
+\end{codebox}
+
+\item[\rulebox{nomencl}]
+This rule runs \rbox{makeindex} in order to automatically generate a nomenclature list from \TeX\ documents that work with the \rbox{nomencl} package. The program itself is a general purpose hierarchical index generator and takes the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{nlo} suffix and a special style file in order to generate the nomenclature list as a special \rbox{nls} file.
+
+\begin{description}
 \item[\rpbox{style}{nomencl.ist}] This option, as the name indicates, sets the underlying index style file. The default value is set to the one automatically provided by the \rbox{nomencl} package, so it is highly recommended to not override it.
 
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -609,9 +784,22 @@
 % arara: nomencl
 \end{codebox}
 
-\item[\rulebox{pdfcsplain}{Paulo Cereda}] This rule runs the \rbox{pdfcsplain} \TeX\ engine, a conservative extension of Knuth's plain \TeX\ with direct processing characters and hyphenation patterns for Czech and Slovak, on the provided \mtbox{currentFile} reference.
+\item[\rulebox{pbibtex}]
+This rule runs the \rbox{pbibtex} program, a reference management software, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
 
 \begin{description}
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: pbibtex
+% arara: --> if exists(toFile('references.bib'))
+\end{codebox}
+
+\item[\rulebox{pdfcsplain}]
+This rule runs the \rbox{pdfcsplain} \TeX\ engine, a conservative extension of Knuth's plain \TeX\ with direct processing characters and hyphenation patterns for Czech and Slovak, on the provided \mtbox{currentFile} reference.
+
+\begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
 
 \begin{description}
@@ -637,9 +825,18 @@
 % arara: pdfcsplain: { shell: yes, synctex: yes }
 \end{codebox}
 
-\item[\rulebox{pdflatex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{pdflatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{pdflatex}]
+This rule runs the \rbox{pdflatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
+\end{description}
+
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
 
 \begin{description}
@@ -666,7 +863,8 @@
 % arara: --> if missing('pdf') || changed('tex')
 \end{codebox}
 
-\item[\rulebox{pdftex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{pdftex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{pdftex}]
+This rule runs the \rbox{pdftex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -694,17 +892,54 @@
 % arara: pdftex: { draft: yes }
 \end{codebox}
 
-\item[\rulebox{pdftk}{Nicola Talbot, Paulo Cereda}] This rule runs \rbox{pdftk}, a command line tool for manipulating Portable Document Format documents, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{pdf} suffix.
+\item[\rulebox{platex}]
+This rule runs the \rbox{platex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
 
 \begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
+\end{description}
+
+\item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
+
+\begin{description}
+\item[\povalue{batchmode}] In this mode, nothing is printed on the terminal, and errors are scrolled as if the \rbox{return} key is hit at every error. Missing files that \TeX\ tries to input or request from keyboard input cause the job to abort.
+
+\item[\povalue{nonstopmode}] In this mode, the diagnostic message will appear on the terminal, but there is no possibility of user interaction just like in batch mode, previously described.
+
+\item[\povalue{scrollmode}] In this mode, as the name indicates, \TeX\ will stop only for missing files to input or if proper keyboard input is necessary. \TeX\ fixes errors itself.
+
+\item[\povalue{errorstopmode}] In this mode, \TeX\ will stop at each error, asking for proper user intervention. This is the most user interactive mode available.
+\end{description}
+
+\item[\rpsbox{shell}] This option sets whether the possibility of running underlying system commands from within \TeX\ is activated.
+
+\item[\rpsbox{synctex}] This option sets whether \rbox{synctex}, an input and output synchronization feature that allows navigation from source to typeset material and vice versa, available in most \TeX\ engines, is activated.
+
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
 \end{description}
 
 \begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: platex: { interaction: scrollmode, shell: yes }
+\end{codebox}
+
+\item[\rulebox{pdftk}]
+This rule runs \rbox{pdftk}, a command line tool for manipulating Portable Document Format documents, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{pdf} suffix.
+
+\begin{description}
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
 % arara: pdftk: { options: [ burst ] }
 \end{codebox}
 
-\item[\rulebox{ps2pdf}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{ps2pdf}, a tool that converts PostScript to Portable Document File, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{ps} suffix.
+\item[\rulebox{ps2pdf}]
+This rule runs \rbox{ps2pdf}, a tool that converts PostScript to Portable Document File, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{ps} suffix.
 
 \begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{pdf} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
@@ -716,7 +951,8 @@
 % arara: ps2pdf: { output: article }
 \end{codebox}
 
-\item[\rulebox{sketch}{Sergey Ulyanov, Paulo Cereda}] This rule runs \rbox{sketch}, a system for producing line drawings of solid objects and scenes, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{sk} suffix. Note that one needs to add support for this particular file type, as seen in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}.
+\item[\rulebox{sketch}]
+This rule runs \rbox{sketch}, a system for producing line drawings of solid objects and scenes, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{sk} suffix. Note that one needs to add support for this particular file type, as seen in Section~\ref{sec:basicstructure}, on page~\pageref{sec:basicstructure}.
 
 \begin{description}
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -726,7 +962,8 @@
 % arara: sketch
 \end{codebox}
 
-\item[\rulebox{songidx}{Francesco Endrici, Paulo Cereda}] This rule runs \rbox{songidx}, a song index generation script for the \rbox{songs} package, on the file reference provided as parameter, generating a proper index as a special \rbox{sbx} file. It is very important to observe that, at the time of writing, this script is not available off the shelf in \TeX\ Live or MiK\TeX\ distributions, so a manual deployment is required. The script execution is performed by the underlying \rbox{texlua} interpreter.
+\item[\rulebox{songidx}]
+This rule runs \rbox{songidx}, a song index generation script for the \rbox{songs} package, on the file reference provided as parameter, generating a proper index as a special \rbox{sbx} file. It is very important to observe that, at the time of writing, this script is not available off the shelf in \TeX\ Live or MiK\TeX\ distributions, so a manual deployment is required. The script execution is performed by the underlying \rbox{texlua} interpreter.
 
 \begin{description}
 \item[\abox{input}~\rqbox] This required option, as the name indicates, sets the input name for the song index file specified within the \TeX\ document. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used.
@@ -740,7 +977,8 @@
 % arara: songidx: { input: songs }
 \end{codebox}
 
-\item[\rulebox{tex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{tex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
+\item[\rulebox{tex}]
+This rule runs the \rbox{tex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -764,7 +1002,8 @@
 % arara: tex: { shell: yes }
 \end{codebox}
 
-\item[\rulebox{texindy}{Nicola Talbot, Paulo Cereda}] This rule runs \rbox{texindy}, a variant of the \rbox{xindy} indexing system focused on \LaTeX\ documents, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
+\item[\rulebox{texindy}]
+This rule runs \rbox{texindy}, a variant of the \rbox{xindy} indexing system focused on \LaTeX\ documents, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
 
 \begin{description}
 \item[\rpsbox{quiet}] This option, as the name indicates, sets whether the tool will output progress messages. It is important to observe that \rbox{texindy} always outputs error messages, regardless of this option.
@@ -798,7 +1037,8 @@
 % arara: texindy: { markup: latex }
 \end{codebox}
 
-\item[\rulebox{tikzmake}{Robbie Smith, Paulo Cereda}] This rule runs \rbox{make} on a very specific build file generated by the \rbox{tikzmake} package, as a means to simplify the externalization of Ti{\itshape k}Z pictures. This build file corresponds to the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{makefile} suffix.
+\item[\rulebox{tikzmake}]
+This rule runs \rbox{make} on a very specific build file generated by the \rbox{tikzmake} package, as a means to simplify the externalization of Ti{\itshape k}Z pictures. This build file corresponds to the base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{makefile} suffix.
 
 \begin{description}
 \item[\rpsbox{force}] This option, as the name indicates, sets whether all targets specified in the corresponding build file should be unconditionally made.
@@ -812,24 +1052,84 @@
 % arara: tikzmake: { force: yes, jobs: 2 }
 \end{codebox}
 
-\item[\rulebox{velocity}{Paulo Cereda}] This rule, as the name suggests, calls the \mtbox{mergeVelocityTemplate} method, merging an input template file written according to the Velocity Template Language 1.7 specification with the provided \rbox{Map} data object in order to produce a corresponding \rbox{File} output. Be mindful that this particular rule returns \rbox{true} if, and only if, the aforementioned method is successfully executed. Otherwise, an exception is raised.
+\item[\rulebox{upbibtex}]
+This rule runs the \rbox{upbibtex} program, a reference management software, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string.
 
 \begin{description}
-\item[\abox{input}] This option, as the name indicates, sets the input template file, written according to the Velocity Template Language 1.7 specification, as a proper \rbox{File} reference. Please note that the \mtbox{currentFile} reference is used as default input when this option is not set.
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
 
-\item[\abox{output}~\rqbox] This required option, as the name indicates, sets the output \rbox{File} reference. Be mindful that, if the reference exists, it will be overwritten without any warning.
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: pbibtex
+% arara: --> if exists(toFile('references.bib'))
+\end{codebox}
 
-\item[\abox{context}~\rqbox] This required option, as the name indicates, sets the \rbox{Map} data object to be used as context to the method call, according to the provided value. An error is thrown if any data structure other than a proper map is specified.
+\item[\rulebox{uplatex}]
+This rule runs the \rbox{uplatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
+
+\begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
 \end{description}
 
+\item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
+
+\begin{description}
+\item[\povalue{batchmode}] In this mode, nothing is printed on the terminal, and errors are scrolled as if the \rbox{return} key is hit at every error. Missing files that \TeX\ tries to input or request from keyboard input cause the job to abort.
+
+\item[\povalue{nonstopmode}] In this mode, the diagnostic message will appear on the terminal, but there is no possibility of user interaction just like in batch mode, previously described.
+
+\item[\povalue{scrollmode}] In this mode, as the name indicates, \TeX\ will stop only for missing files to input or if proper keyboard input is necessary. \TeX\ fixes errors itself.
+
+\item[\povalue{errorstopmode}] In this mode, \TeX\ will stop at each error, asking for proper user intervention. This is the most user interactive mode available.
+\end{description}
+
+\item[\rpsbox{shell}] This option sets whether the possibility of running underlying system commands from within \TeX\ is activated.
+
+\item[\rpsbox{synctex}] This option sets whether \rbox{synctex}, an input and output synchronization feature that allows navigation from source to typeset material and vice versa, available in most \TeX\ engines, is activated.
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
 \begin{codebox}{Example}{teal}{\icnote}{white}
-% arara: velocity: { input: input.txt, output: output.txt,
-% arara: --> context: { name: Paulo, country: Brazil } }
+% arara: uplatex: { interaction: scrollmode, shell: yes }
 \end{codebox}
 
-\item[\rulebox{xdvipdfmx}{Marco Daniel, Paulo Cereda}] This rule runs \rbox{xdvipdfmx}, the back end for the \rbox{xetex} \TeX\ engine (and not intended to be invoked directly), on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
+\item[\rulebox{uptex}]
+This rule runs the \rbox{uptex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in a device independent format.
 
 \begin{description}
+\item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
+
+\begin{description}
+\item[\povalue{batchmode}] In this mode, nothing is printed on the terminal, and errors are scrolled as if the \rbox{return} key is hit at every error. Missing files that \TeX\ tries to input or request from keyboard input cause the job to abort.
+
+\item[\povalue{nonstopmode}] In this mode, the diagnostic message will appear on the terminal, but there is no possibility of user interaction just like in batch mode, previously described.
+
+\item[\povalue{scrollmode}] In this mode, as the name indicates, \TeX\ will stop only for missing files to input or if proper keyboard input is necessary. \TeX\ fixes errors itself.
+
+\item[\povalue{errorstopmode}] In this mode, \TeX\ will stop at each error, asking for proper user intervention. This is the most user interactive mode available.
+\end{description}
+
+\item[\rpsbox{shell}] This option sets whether the possibility of running underlying system commands from within \TeX\ is activated.
+
+\item[\rpsbox{synctex}] This option sets whether \rbox{synctex}, an input and output synchronization feature that allows navigation from source to typeset material and vice versa, available in most \TeX\ engines, is activated.
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: uptex
+\end{codebox}
+
+\item[\rulebox{xdvipdfmx}]
+This rule runs \rbox{xdvipdfmx}, the back end for the \rbox{xetex} \TeX\ engine (and not intended to be invoked directly), on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{dvi} suffix, generating a Portable Document Format \rbox{pdf} file.
+
+\begin{description}
 \item[\abox{output}] This option, as the name indicates, sets the output name for the generated \rbox{pdf} file. There is no need to provide an extension, as the value is always normalized with \mtbox{getBasename} such that only the name without the associated extension is used. The base name of the current file reference is used as the default value.
 
 \item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
@@ -839,9 +1139,18 @@
 % arara: xdvipdfmx: { output: thesis }
 \end{codebox}
 
-\item[\rulebox{xelatex}{Marco Daniel, Paulo Cereda}] This rule runs the new \rbox{xelatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{xelatex}]
+This rule runs the new \rbox{xelatex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
+\item[\rpbox{branch}{stable}] This option allows branching formats for the current engine, mainly focused on package development. Users of current \TeX\ distributions might benefit from format branching in order to easily test documents and code against the upcoming releases. Possible values are:
+
+\begin{description}
+\item[\povalue{stable}] This value, as the name implies, enables the stable engine format branch. Note that this is the default format.
+
+\item[\povalue{developer}] For experienced users, this value enables the experimental, developer engine format branch.
+\end{description}
+
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
 
 \begin{description}
@@ -865,7 +1174,8 @@
 % arara: xelatex: { shell: yes, synctex: yes }
 \end{codebox}
 
-\item[\rulebox{xetex}{Marco Daniel, Paulo Cereda}] This rule runs the \rbox{xetex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
+\item[\rulebox{xetex}]
+This rule runs the \rbox{xetex} \TeX\ engine on the provided \mtbox{currentFile} reference, generating a corresponding file in the Portable Document File format, as expected.
 
 \begin{description}
 \item[\abox{interaction}] This option alters the underlying engine behaviour. If this option is omitted, \TeX\ will prompt the user for interaction in the event of an error. Possible values are, in order of increasing user interaction (courtesy of our master Enrico Gregorio):
@@ -891,9 +1201,27 @@
 % arara: xetex: { interaction: scrollmode, synctex: yes }
 \end{codebox}
 
-\item[\rulebox{xindy}{Nicola Talbot, Paulo Cereda}] This rule runs \rbox{xindy}, a flexible and powerful indexing system, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
+\item[\rulebox{xindex}]
+This rule runs \rbox{xindex}, a flexible and powerful indexing system, on a provided \rbox{idx} input. This tool is completely with the \rbox{makeindex} program.
 
 \begin{description}
+\item[\abox{input}~\rqbox] This option, as the name indicates, corresponds to the \rbox{idx} reference to be processed by the indexing system. Note that this option is required.
+
+\item[\rpbox{config}{cfg}] This option specifies a configuration extension. Make sure to take a look at the documentation for further details.
+
+\item[\rpbox{language}{en}] This option, as the name suggests, specifies the language. Make sure to take a look at the documentation for further details.
+
+\item[\abox{options}] This option, as the name indicates, takes a list of raw command line options and appends it to the actual system call. An error is thrown if any data structure other than a proper list is provided as the value.
+\end{description}
+
+\begin{codebox}{Example}{teal}{\icnote}{white}
+% arara: xindex: { input: mydoc.idx }
+\end{codebox}
+
+\item[\rulebox{xindy}]
+This rule runs \rbox{xindy}, a flexible and powerful indexing system, on the corresponding base name of the \mtbox{currentFile} reference (i.e, the name without the associated extension) as a string concatenated with the \rbox{idx} suffix, generating an index as a special \rbox{ind} file.
+
+\begin{description}
 \item[\rpsbox{quiet}] This option, as the name indicates, sets whether the tool will output progress messages. It is important to observe that \rbox{xindy} always outputs error messages, regardless of this option.
 
 \item[\abox{codepage}] This option, as the name indicates, specifies the encoding to be used for letter group headings. Additionally, it specifies the encoding used internally for sorting, but that does not matter for the final result.

Modified: trunk/Master/texmf-dist/doc/support/arara/chapters/yaml.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/chapters/yaml.tex	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/chapters/yaml.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,22 +2,22 @@
 \chapter{YAML}
 \label{chap:yaml}
 
-According to the \href{http://yaml.org/spec/1.2/spec.html}{specification}, \gls{YAML} (a recursive acronym for \emph{YAML Ain't Markup Language}) is a human-friendly, cross language, Unicode-based data serialization language designed around the common native data type of programming languages. \arara\ uses this format in three circumstances:
+According to the \href{http://yaml.org/spec/1.2/spec.html}{specification}, YAML (a recursive acronym for \emph{YAML Ain't Markup Language}) is a human-friendly, cross language, Unicode-based data serialization language designed around the common native data type of programming languages. \arara\ uses this format in three circumstances:
 
 \begin{enumerate}
 \item\emph{Parametrized directives}, as the set of attribute/value pairs (namely, argument name and corresponding value) is represented by a map. This particular type of directive is formally introduced in Section~\ref{sec:directives}, on page~\pageref{sec:directives}.
 
-\item\emph{Rules}, as their entire structure is represented by a set of specific keys and their corresponding values (a proper \gls{YAML} document). A rule follows a very strict model, detailed in Section~\ref{sec:rule}, on page~\pageref{sec:rule}.
+\item\emph{Rules}, as their entire structure is represented by a set of specific keys and their corresponding values (a proper YAML document). A rule follows a very strict model, detailed in Section~\ref{sec:rule}, on page~\pageref{sec:rule}.
 
-\item\emph{Configuration files}, as the general settings are represented by a set of specific keys and their corresponding values (a proper \gls{YAML} document). Configuration files are covered in Chapter~\ref{chap:configurationfile}, on page~\pageref{chap:configurationfile}.
+\item\emph{Configuration files}, as the general settings are represented by a set of specific keys and their corresponding values (a proper YAML document). Configuration files are covered in Chapter~\ref{chap:configurationfile}, on page~\pageref{chap:configurationfile}.
 \end{enumerate}
 
-This chapter only covers the relevant parts of the \gls{YAML} format for a consistent use with \arara. For advanced topics, I highly recommend the complete format specification, available online.
+This chapter only covers the relevant parts of the YAML format for a consistent use with \arara. For advanced topics, I highly recommend the complete format specification, available online.
 
 \section{Collections}
 \label{sec:yamlcollections}
 
-According to the specification, \gls{YAML}['s] block collections use indentation for scope and begin each entry on its own line. Block sequences indicate each entry with a dash and space. Mappings use a colon and space to mark each \emph{key: value} pair. Comments begin with an octothorpe \rbox{\#}. \arara\ relies solely on mappings and a few scalars to sequences at some point. Let us see an example of a sequence:
+According to the specification, YAML's block collections use indentation for scope and begin each entry on its own line. Block sequences indicate each entry with a dash and space. Mappings use a colon and space to mark each \emph{key: value} pair. Comments begin with an octothorpe \rbox{\#}. \arara\ relies solely on mappings and a few scalars to sequences at some point. Let us see an example of a sequence:
 
 \begin{codebox}{A sequence of scalars in YAML}{teal}{\icnote}{white}
 team:
@@ -25,15 +25,16 @@
 - Marco Daniel
 - Brent Longborough
 - Nicola Talbot
+- Ben Frank
 \end{codebox}
 
-It is quite straightforward: \abox{team} holds a sequence of four scalars. \gls{YAML} also has flow styles, using explicit indicators rather than indentation to denote scope. The flow sequence is written as a comma-separated list within square brackets:
+It is quite straightforward: \abox{team} holds a sequence of four scalars. YAML also has flow styles, using explicit indicators rather than indentation to denote scope. The flow sequence is written as a comma-separated list within square brackets:
 
 \begin{codebox}{A sequence of scalars in YAML}{teal}{\icnote}{white}
 primes: [ 2, 3, 5, 7, 11 ]
 \end{codebox}
 
-Attribute maps are easily represented by nesting entries, respecting indentation. For instance, consider a map \abox{developer} containing two keys, \abox{name} and \abox{country}. The \gls{YAML} representation is presented as follows:
+Attribute maps are easily represented by nesting entries, respecting indentation. For instance, consider a map \abox{developer} containing two keys, \abox{name} and \abox{country}. The YAML representation is presented as follows:
 
 \begin{codebox}{An attribute map in YAML}{teal}{\icnote}{white}
 developer:
@@ -81,17 +82,17 @@
 
 \begin{messagebox}{Block indentation indicator}{attentioncolour}{\icattention}{black}
 \setlength{\parskip}{1em}
-According to the \gls{YAML} specification, the indentation level of a block scalar is typically detected from its first non-empty line. It is an error for any of the leading empty lines to contain more spaces than the first non-empty line, hence the ASCII logo could not be represented, as it starts with a space.
+According to the YAML specification, the indentation level of a block scalar is typically detected from its first non-empty line. It is an error for any of the leading empty lines to contain more spaces than the first non-empty line, hence the ASCII logo could not be represented, as it starts with a space.
 
-When detection would fail, \gls{YAML} requires that the indentation level for the content be given using an explicit indentation indicator. This level is specified as the integer number of the additional indentation spaces used for the content, relative to its parent node. It would be the case if we want to represent our logo without the preceding text.
+When detection would fail, YAML requires that the indentation level for the content be given using an explicit indentation indicator. This level is specified as the integer number of the additional indentation spaces used for the content, relative to its parent node. It would be the case if we want to represent our logo without the preceding text.
 \end{messagebox}
 
-\gls{YAML}['s] flow scalars include the plain style and two quoted styles. The double-quoted style provides escape sequences. The single-quoted style is useful when escaping is not needed. All flow scalars can span multiple lines. Note that line breaks are always folded. Since \arara\ uses \gls{MVEL} as its underlying scripting language (Chapter~\ref{chap:mvel}, on page~\pageref{chap:mvel}), it might be advisable to quote scalars when starting with forbidden symbols in \gls{YAML}.
+YAML's flow scalars include the plain style and two quoted styles. The double-quoted style provides escape sequences. The single-quoted style is useful when escaping is not needed. All flow scalars can span multiple lines. Note that line breaks are always folded. Since \arara\ uses MVEL as its underlying scripting language (Chapter~\ref{chap:mvel}, on page~\pageref{chap:mvel}), it might be advisable to quote scalars when starting with forbidden symbols in YAML.
 
 \section{Tags}
 \label{sec:yamltags}
 
-According to the specification, in \gls{YAML}, untagged nodes are given a type depending on the application. The examples covered in this primer use the \rbox{seq}, \rbox{map} and \rbox{str} types from the fail safe schema. Explicit typing is denoted with a tag using the exclamation point symbol. Global tags are usually uniform resource identifiers and may be specified in a tag shorthand notation using a handle. Application-specific local tags may also be used. For \arara, there is a special schema used for both rules and configuration files, so in those cases, make sure to add \abox{!config} as global tag:
+According to the specification, in YAML, untagged nodes are given a type depending on the application. The examples covered in this primer use the \rbox{seq}, \rbox{map} and \rbox{str} types from the fail safe schema. Explicit typing is denoted with a tag using the exclamation point symbol. Global tags are usually uniform resource identifiers and may be specified in a tag shorthand notation using a handle. Application-specific local tags may also be used. For \arara, there is a special schema used for both rules and configuration files, so in those cases, make sure to add \abox{!config} as global tag:
 
 \begin{codebox}{Global tag for rules and configuration files}{teal}{\icnote}{white}
 !config
@@ -102,4 +103,4 @@
 \section{Further reading}
 \label{sec:yamlfurtherreading}
 
-This chapter does not cover all features of the \gls{YAML} format, so further reading is advisable. I highly recommend the \href{http://yaml.org/spec/1.2/spec.html}{official YAML specification}, currently covering the third version of the format.
+This chapter does not cover all features of the YAML format, so further reading is advisable. I highly recommend the \href{http://yaml.org/spec/1.2/spec.html}{official YAML specification}, currently covering the third version of the format.

Added: trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf	2020-03-05 00:49:50 UTC (rev 54089)

Property changes on: trunk/Master/texmf-dist/doc/support/arara/figures/gl.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/support/arara/rules/manual.yaml
===================================================================
--- trunk/Master/texmf-dist/doc/support/arara/rules/manual.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/doc/support/arara/rules/manual.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -2,17 +2,17 @@
 identifier: manual
 name: The arara manual
 authors:
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The PDFLaTeX engine
   command: >
     @{
-        return getCommand('pdflatex', file);
+        return getCommand('pdflatex', reference);
     }
 - name: The PDFLaTeX engine
   command: >
     @{
-        return getCommand('pdflatex', file);
+        return getCommand('pdflatex', reference);
     }
 - name: File cleanup
   command: >
@@ -30,7 +30,7 @@
         extensions = [ 'listing', 'log', 'toc',
                        'out', 'synctex.gz' ];
         foreach (extension : extensions) {
-            removals.add(getCommand(prefix, getBasename(file)
+            removals.add(getCommand(prefix, getBasename(reference)
                      .concat('.').concat(extension)));
         }
         foreach (match : matches) {

Modified: trunk/Master/texmf-dist/scripts/arara/arara.jar
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/arara/arara.sh
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/arara.sh	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/arara.sh	2020-03-05 00:49:50 UTC (rev 54089)
@@ -3,7 +3,7 @@
 # Note from Paulo: this script provides better Cygwin support than our original
 # approach, so the team decided to use it as a proper wrapper for arara as well.
 
-scriptname=`basename "$0"`
+scriptname=`basename "$0" .sh`
 jar="$scriptname.jar"
 jarpath=`kpsewhich --progname="$scriptname" --format=texmfscripts "$jar"`
 
@@ -14,4 +14,4 @@
   jarpath=`cygpath -w "$jarpath"`
 fi
 
-exec java -jar "$jarpath" "$@"
+exec java -jar "$jarpath" "$@"
\ No newline at end of file

Modified: trunk/Master/texmf-dist/scripts/arara/rules/animate.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/animate.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/animate.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,14 +8,14 @@
 name: Animate
 authors:
 - Chris Hughes
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Convert program
   command: >
     @{
         prefix = [];
-        input = getBasename(file).concat('.pdf');
-        output = getBasename(file).concat('.gif');
+        input = getBasename(reference).concat('.pdf');
+        output = getBasename(reference).concat('.gif');
         if (isUnix()) {
             prefix = [ program ];
         }

Added: trunk/Master/texmf-dist/scripts/arara/rules/asymptote.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/asymptote.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/asymptote.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,62 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: asymptote
+name: Asymptote
+authors:
+- Island of TeX
+commands:
+- name: Asymptote
+  command: >
+    @{
+        return getCommand('asy', color, engine, twice,
+               format, output, options, file);
+    }
+arguments:
+- identifier: color
+  flag: >
+    @{
+        if ([ 'bw', 'cmyk', 'rgb', 'gray' ].contains(parameters.color)) {
+            return '-' + parameters.color;
+        } else {
+            throwError('The provided color enforcement is not valid.');
+        }
+    }
+- identifier: engine
+  flag: >
+    @{
+        if ([ 'latex', 'pdflatex' , 'xelatex', 'lualatex', 'tex', 'pdftex',
+              'luatex', 'context', 'none' ].contains(parameters.engine)) {
+            return [ '-tex', parameters.engine ];
+        } else {
+            throwError('The provided TeX engine is invalid.');
+        }
+    }
+  default: latex
+- identifier: twice
+  flag: >
+    @{
+        return isTrue(parameters.twice, '-twice');
+    }
+- identifier: format
+  flag: >
+    @{
+        return [ '-f', parameters.format ];
+    }
+- identifier: output
+  flag: >
+    @{
+        return [ '-o', parameters.output ];
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        } else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/bib2gls.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/bib2gls.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/bib2gls.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,8 +7,7 @@
 identifier: bib2gls
 name: Bib2Gls
 authors:
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Bib2Gls software
   command: >
@@ -23,7 +22,7 @@
                prefix = [ 'cmd', '/c', 'del' ];
            }
 
-           base = getBasename(file);
+           base = getBasename(reference);
            removals = [];
 
            lines = readFromFile(base.concat('.').concat('aux'));
@@ -63,7 +62,7 @@
           return getCommand('bib2gls', dir, trans, group, interpret,
                  breakspace, trimfields, recordcount, recordcountunit, 
                  cite, verbose, merge, locale, uniscript, packages, 
-                 ignore, custom, mapformats, options, getBasename(file));
+                 ignore, custom, mapformats, options, getBasename(reference));
        }
     }
 arguments:
@@ -80,7 +79,7 @@
           throwError('Forbidden transcript extension');
        }
 
-       return ['--log-file', getBasename(file)+"."+parameters.trans]
+       return ['--log-file', getBasename(reference)+"."+parameters.trans]
     }
 - identifier: locale
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/biber.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/biber.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/biber.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,15 +7,28 @@
 identifier: biber
 name: Biber
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Biber reference management software
   command: >
     @{
-        return getCommand('biber', options, getBasename(file));
+        if (tool) {
+            return getCommand('biber', '--tool', options);
+        }
+        else {
+            return getCommand('biber', options, getBasename(file));
+        }
     }
 arguments:
+- identifier: tool
+  flag: >
+    @{
+        return isTrue(parameters.tool);
+    }
+  default: >
+    @{
+        return false;
+    }
 - identifier: options
   flag: >
     @{

Modified: trunk/Master/texmf-dist/scripts/arara/rules/bibtex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/bibtex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/bibtex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: bibtex
 name: BibTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The BibTeX reference management software
   command: >
     @{
-        return getCommand('bibtex', options, getBasename(file))
+        return getCommand('bibtex', options, getBasename(reference))
     }
 arguments:
 - identifier: options

Modified: trunk/Master/texmf-dist/scripts/arara/rules/bibtex8.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/bibtex8.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/bibtex8.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: bibtex8
 name: BibTeX8
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: An 8-bit implementation of BibTeX 0.99 with a very large capacity
   command: >
     @{
-        return getCommand('bibtex8', options, getBasename(file));
+        return getCommand('bibtex8', options, getBasename(reference));
     }
 arguments:
 - identifier: options

Modified: trunk/Master/texmf-dist/scripts/arara/rules/bibtexu.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/bibtexu.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/bibtexu.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: bibtexu
 name: BibTeXu
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: An 8-bit implementation of BibTeX 0.99 with a very large capacity
   command: >
     @{
-        return getCommand('bibtexu', options, getBasename(file));
+        return getCommand('bibtexu', options, getBasename(reference));
     }
 arguments:
 - identifier: options

Modified: trunk/Master/texmf-dist/scripts/arara/rules/clean.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/clean.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/clean.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,8 +7,7 @@
 identifier: clean
 name: Clean
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: Cleaning feature
   command: >
@@ -21,13 +20,13 @@
             prefix = [ 'cmd', '/c', 'del' ];
         }
         if (extensions == '') {
-            if (getOriginalFile() == file) {
+            if (getOriginalReference() == reference) {
                 throwError('I cannot remove the main file reference.');
             }
-            return getCommand(prefix, file);
+            return getCommand(prefix, reference);
         }
         else {
-            base = getBasename(file);
+            base = getBasename(reference);
             removals = [];
             foreach(extension : extensions) {
                 if (base.concat('.').concat(extension) == getOriginalFile()) {

Modified: trunk/Master/texmf-dist/scripts/arara/rules/csplain.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/csplain.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/csplain.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,13 @@
 identifier: csplain
 name: CSplain
 authors:
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: CSplain engine
   command: >
     @{
         return getCommand('csplain', interaction, draft,
-               shell, synctex, options, file);
+               shell, synctex, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/datatooltk.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/datatooltk.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/datatooltk.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,8 +7,7 @@
 identifier: datatooltk
 name: DatatoolTk
 authors:
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The DatatoolTk software
   command: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/dvipdfm.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/dvipdfm.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/dvipdfm.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: dvipdfm
 name: DVIPDFM
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The DVIPDFM program
   command: >
     @{
-        base = getBasename(file).concat('.dvi');
+        base = getBasename(reference).concat('.dvi');
         out = getBasename(output).concat('.pdf');
         return getCommand('dvipdfm', base, '-o', out, options);
     }
@@ -25,7 +24,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/dvipdfmx.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/dvipdfmx.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/dvipdfmx.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: dvipdfmx
 name: DVIPDFMX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The DVIPDFMX program
   command: >
     @{
-        base = getBasename(file).concat('.dvi');
+        base = getBasename(reference).concat('.dvi');
         out = getBasename(output).concat('.pdf');
         return getCommand('dvipdfmx', base, '-o', out, options);
     }
@@ -25,7 +24,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/dvips.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/dvips.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/dvips.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: dvips
 name: DVIPS
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The DVIPS program
   command: >
     @{
-        base = getBasename(file).concat('.dvi');
+        base = getBasename(reference).concat('.dvi');
         out = getBasename(output).concat('.ps');
         return getCommand('dvips', base, '-o', out, options);
     }
@@ -25,7 +24,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/dvipspdf.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/dvipspdf.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/dvipspdf.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,20 +7,19 @@
 identifier: dvipspdf
 name: DVIPSPDF
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The DVIPS program
   command: >
     @{
-        base = getBasename(file).concat('.dvi');
-        out = getBasename(file).concat('.ps');
+        base = getBasename(reference).concat('.dvi');
+        out = getBasename(reference).concat('.ps');
         return getCommand('dvips', base, '-o', out, options1);
     }
 - name: The PS2PDF program
   command: >
     @{
-        base = getBasename(file).concat('.ps');
+        base = getBasename(reference).concat('.ps');
         out = getBasename(output).concat('.pdf');
         return getCommand('ps2pdf', options2, base, '-o', out);
     }
@@ -32,7 +31,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options1
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/dvisvgm.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/dvisvgm.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/dvisvgm.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -12,7 +12,7 @@
 - name: The dvisvgm program
   command: >
     @{
-        base = getBasename(file).concat('.dvi');
+        base = getBasename(reference).concat('.dvi');
         return getCommand('dvisvgm', base, options);
     }
 arguments:

Modified: trunk/Master/texmf-dist/scripts/arara/rules/etex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/etex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/etex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,14 +7,12 @@
 identifier: etex
 name: eTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
-- Nicola Talbot
+- Island of TeX
 commands:
 - name: Extended TeX engine
   command: >
     @{
-        return getCommand('etex', interaction, shell, options, file);
+        return getCommand('etex', interaction, shell, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -9,23 +9,23 @@
 authors:
 - Francesco Endrici
 - Enrico Gregorio
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The engine
   command: >
     @{
-        return getCommand(engine, interaction, shell, options, file)
+        return getCommand(engine, interaction, shell, options, reference)
     }
 - name: The frontispiece
   command: >
     @{
-        base = getBasename(file).concat('-frn');
+        base = getBasename(reference).concat('-frn');
         return getCommand(engine, interaction, shell, base);
     }
 - name: The DVIPS program
   command: >
     @{
-        base = getBasename(file).concat('-frn');
+        base = getBasename(reference).concat('-frn');
         eps = base.concat('.eps');
         return isTrue(engine == 'latex', getCommand('dvips', '-o',
                eps, base), '');
@@ -33,7 +33,7 @@
 - name: The engine
   command: >
     @{
-        return getCommand(engine, interaction, shell, options, file);
+        return getCommand(engine, interaction, shell, options, reference);
     }
 arguments:
 - identifier: engine

Modified: trunk/Master/texmf-dist/scripts/arara/rules/halt.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/halt.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/halt.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,11 +8,12 @@
 name: Halt
 authors:
 - Heiko Oberdiek
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The halt trigger
   command: >
     @{
-        return getTrigger('halt');
+        halt(0);
+        return true;
     }
 arguments: []

Modified: trunk/Master/texmf-dist/scripts/arara/rules/indent.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/indent.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/indent.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,13 +8,13 @@
 name: Indent
 authors:
 - Chris Hughes
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The latexindent.pl script
   command: >
     @{
         return getCommand('latexindent', silent, trace, screenlog,
-               settings, cruft, overwrite, output, file, modifylinebreaks,
+               settings, cruft, overwrite, output, reference, modifylinebreaks,
                replacement, options, logfile);
     }
 arguments:

Added: trunk/Master/texmf-dist/scripts/arara/rules/knitr.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/knitr.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/knitr.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,58 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: knitr
+name: knitr
+authors:
+- Adam Liter
+- Island of TeX
+commands:
+- name: knitr
+  command: >
+    @{
+        elements = [];
+        if (!isEmpty(tangle)) elements.add('tangle = ' + tangle);
+        if (!isEmpty(quiet)) elements.add('quiet = ' + quiet);
+        elements.add('envir = ' + envir);
+        elements.add('encoding = ' + encoding);
+        return getCommand('Rscript', '-e',
+               'library(knitr); knit("' + file + '", ' +
+               'output = ' + isEmpty(output, 'NULL', '"' + output + '"') + ', ' +
+               String.join(', ', elements) + ')');
+    }
+arguments:
+- identifier: output
+  flag: >
+    @{
+        return parameters.output;
+    }
+- identifier: tangle
+  flag: >
+    @{
+        if(isTrue(parameters.tangle) && !parameters.containsKey('output')) {
+            throwError('If you want to tangle the document, specify an output file.');
+        }
+        else {
+            isTrue(parameters.tangle, 'TRUE', 'FALSE')
+        }
+    }
+- identifier: quiet
+  flag: >
+    @{
+        isTrue(parameters.quiet, 'TRUE', 'FALSE')
+    }
+- identifier: envir
+  flag: >
+    @{
+        return parameters.envir;
+    }
+  default: 'parent.frame()'
+- identifier: encoding
+  flag: >
+    @{
+        return parameters.encoding;
+    }
+  default: 'getOption("encoding")'

Modified: trunk/Master/texmf-dist/scripts/arara/rules/latex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/latex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/latex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,16 +7,26 @@
 identifier: latex
 name: LaTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: LaTeX engine
   command: >
     @{
-        return getCommand('latex', interaction, draft, shell,
-               synctex, options, file);
+        return getCommand(branch, interaction, draft, shell,
+               synctex, options, reference);
     }
 arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'latex', 'developer' : 'latex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'latex'
 - identifier: interaction
   flag: >
     @{

Modified: trunk/Master/texmf-dist/scripts/arara/rules/latexmk.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/latexmk.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/latexmk.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,9 +7,7 @@
 identifier: latexmk
 name: LaTeXmk
 authors:
-- Marco Daniel
-- Brent Longborough
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: Tool LaTeXmk
   command: >
@@ -19,7 +17,7 @@
         }
         else {
             return getCommand('latexmk', isEmpty(program, engine,
-                   program), options, file);
+                   program), options, reference);
         }
     }
 arguments:

Added: trunk/Master/texmf-dist/scripts/arara/rules/luahbtex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/luahbtex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/luahbtex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,54 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: luahbtex
+name: LuaHBTeX
+authors:
+- Island of TeX
+commands:
+- name: LuaHBTeX engine
+  command: >
+    @{
+        return getCommand('luahbtex', interaction, draft, shell,
+               synctex, options, reference);
+    }
+arguments:
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: shell
+  flag: >
+    @{
+        isTrue(parameters.shell, '--shell-escape', '--no-shell-escape')
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: draft
+  flag: >
+    @{
+        isTrue(parameters.draft, '--draftmode')
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/lualatex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/lualatex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/lualatex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,16 +7,26 @@
 identifier: lualatex
 name: LuaLaTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: LuaLaTeX engine
   command: >
     @{
-        return getCommand('lualatex', interaction, draft, shell,
-               synctex, options, file);
+        return getCommand(branch, interaction, draft, shell,
+               synctex, options, reference);
     }
 arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'lualatex', 'developer' : 'lualatex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'lualatex'
 - identifier: interaction
   flag: >
     @{

Modified: trunk/Master/texmf-dist/scripts/arara/rules/luatex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/luatex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/luatex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,14 +7,13 @@
 identifier: luatex
 name: LuaTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: LuaTeX engine
   command: >
     @{
         return getCommand('luatex', interaction, draft, shell,
-               synctex, options, file);
+               synctex, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/make.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/make.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/make.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,8 +7,7 @@
 identifier: make
 name: Make
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Make program
   command: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,9 +7,7 @@
 identifier: makeglossaries
 name: MakeGlossaries
 authors:
-- Marco Daniel
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The MakeGlossaries software
   command: >
@@ -16,7 +14,7 @@
     @{
         if (isEmpty(clean))
         {
-           return getCommand('makeglossaries', options, getBasename(file));
+           return getCommand('makeglossaries', options, getBasename(reference));
         }
         else {
            prefix = [];
@@ -27,7 +25,7 @@
                prefix = [ 'cmd', '/c', 'del' ];
            }
 
-           base = getBasename(file);
+           base = getBasename(reference);
            removals = [];
 
            removals.add(getCommand(prefix, base.concat(".glsdefs")));

Modified: trunk/Master/texmf-dist/scripts/arara/rules/makeglossarieslite.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/makeglossarieslite.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/makeglossarieslite.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,14 +7,12 @@
 identifier: makeglossarieslite
 name: MakeGlossariesLite
 authors:
-- Marco Daniel
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The MakeGlossariesLite software
   command: >
     @{
-       return  getCommand('makeglossaries-lite', options, getBasename(file));
+       return  getCommand('makeglossaries-lite', options, getBasename(reference));
     }
 arguments:
 - identifier: options

Modified: trunk/Master/texmf-dist/scripts/arara/rules/makeindex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/makeindex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/makeindex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: makeindex
 name: MakeIndex
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The MakeIndex software
   command: >
     @{
-        base = getBasename(file);
+        base = getBasename(reference);
         infile = base.concat('.').concat(input);
         outfile = [ '-o', base.concat('.').concat(output) ];
         logfile = [ '-t', base.concat('.').concat(log) ];

Added: trunk/Master/texmf-dist/scripts/arara/rules/metapost.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/metapost.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/metapost.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,50 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: metapost
+name: Metapost
+authors:
+- Island of TeX
+commands:
+- name: Metapost
+  command: >
+    @{
+        return getCommand('mpost', interaction, numbersystem,
+               options, file);
+    }
+arguments:
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '-interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: numbersystem
+  flag: >
+    @{
+        if ([ 'scaled', 'double', 'binary',
+              'decimal' ].contains(parameters.numbersystem)) {
+            return '-numbersystem='.concat(parameters.numbersystem);
+        }
+        else {
+            throwError('The provided numbersystem value is not valid.');
+        }
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/nomencl.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/nomencl.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/nomencl.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,15 +7,13 @@
 identifier: nomencl
 name: Nomencl
 authors:
-- Marco Daniel
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Nomenclature software
   command: >
     @{
-        nlo = getBasename(file).concat('.nlo');
-        nls = getBasename(file).concat('.nls');
+        nlo = getBasename(reference).concat('.nlo');
+        nls = getBasename(reference).concat('.nls');
         return getCommand('makeindex', options, nlo, style, '-o', nls);
     }
 arguments:

Added: trunk/Master/texmf-dist/scripts/arara/rules/pbibtex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/pbibtex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/pbibtex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,27 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: pbibtex
+name: pBibTeX
+authors:
+- Island of TeX
+commands:
+- name: The pBibTeX reference management software
+  command: >
+    @{
+        return getCommand('pbibtex', options, getBasename(reference))
+    }
+arguments:
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/pdfcsplain.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/pdfcsplain.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/pdfcsplain.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,13 @@
 identifier: pdfcsplain
 name: PDFCSplain
 authors:
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: PDFCSplain engine
   command: >
     @{
         return getCommand('pdfcsplain', interaction, draft, shell,
-               synctex, options, file);
+               synctex, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,16 +7,26 @@
 identifier: pdflatex
 name: PDFLaTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: PDFLaTeX engine
   command: >
     @{
-        return getCommand('pdflatex', interaction, draft, shell,
-               synctex, options, file);
+        return getCommand(branch, interaction, draft, shell,
+               synctex, options, reference);
     }
 arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'pdflatex', 'developer' : 'pdflatex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'pdflatex'
 - identifier: interaction
   flag: >
     @{

Modified: trunk/Master/texmf-dist/scripts/arara/rules/pdftex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/pdftex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/pdftex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,14 +7,13 @@
 identifier: pdftex
 name: PDFTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: PDFTeX engine
   command: >
     @{
         return getCommand('pdftex', interaction, draft, shell,
-               synctex, options, file);
+               synctex, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/pdftk.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/pdftk.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/pdftk.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: pdftk
 name: PDFtk
 authors:
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: PDFtk
   command: >
    @{
-      input = getBasename(file).concat('.pdf');
+      input = getBasename(reference).concat('.pdf');
       return getCommand('pdftk', input, options);
     }
 arguments:

Added: trunk/Master/texmf-dist/scripts/arara/rules/platex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/platex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/platex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,60 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: platex
+name: pLaTeX
+authors:
+- Island of TeX
+commands:
+- name: pLaTeX engine
+  command: >
+    @{
+        return getCommand(branch, interaction, shell,
+               synctex, options, reference);
+    }
+arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'platex', 'developer' : 'platex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'platex'
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: shell
+  flag: >
+    @{
+        isTrue(parameters.shell, '--shell-escape', '--no-shell-escape')
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: ps2pdf
 name: PS2PDF
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The PS2PDF program
   command: >
     @{
-        infile = getBasename(file).concat('.ps');
+        infile = getBasename(reference).concat('.ps');
         outfile = getBasename(output).concat('.pdf');
         return getCommand('ps2pdf', options, infile, outfile);
     }
@@ -25,7 +24,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options
   flag: >

Added: trunk/Master/texmf-dist/scripts/arara/rules/ptex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/ptex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/ptex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,49 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: ptex
+name: pTeX
+authors:
+- Island of TeX
+commands:
+- name: pTeX engine
+  command: >
+    @{
+        return getCommand('ptex', interaction, shell,
+               synctex, options, reference);
+    }
+arguments:
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: shell
+  flag: >
+    @{
+        isTrue(parameters.shell, '--shell-escape', '--no-shell-escape')
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/sketch.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/sketch.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/sketch.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,13 +8,13 @@
 name: Sketch
 authors:
 - Sergey Ulyanov
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Sketch software
   command: >
     @{
-        output = getBasename(file).concat('.tex');
-        return getCommand('sketch', options, file, '-o', output);
+        output = getBasename(reference).concat('.tex');
+        return getCommand('sketch', options, reference, '-o', output);
     }
 arguments:
 - identifier: options

Modified: trunk/Master/texmf-dist/scripts/arara/rules/songidx.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/songidx.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/songidx.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,7 +8,7 @@
 name: SongIDX
 authors:
 - Francesco Endrici
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The SongIDX Lua script
   command: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/tex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/tex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/tex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: tex
 name: TeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: TeX engine
   command: >
     @{
-        return getCommand('tex', interaction, shell, options, file);
+        return getCommand('tex', interaction, shell, options, reference);
     }
 arguments:
 - identifier: interaction

Modified: trunk/Master/texmf-dist/scripts/arara/rules/texindy.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/texindy.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/texindy.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: texindy
 name: TeXindy
 authors:
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The TeXindy software
   command: >
     @{
-        base = getBasename(file);
+        base = getBasename(reference);
         infile = base.concat('.').concat(input);
         outfile = [ '-o', base.concat('.').concat(output) ];
         logfile = [ '-t', base.concat('.').concat(log) ];

Modified: trunk/Master/texmf-dist/scripts/arara/rules/tikzmake.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/tikzmake.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/tikzmake.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -8,12 +8,12 @@
 name: TikZmake
 authors:
 - Robbie Smith
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: TikZ list-and-make engine
   command: >
     @{
-        makefile = getBasename(file).concat('.makefile');
+        makefile = getBasename(reference).concat('.makefile');
         return getCommand('make', force, jobs, options, '-f', makefile);
     }
 arguments:

Added: trunk/Master/texmf-dist/scripts/arara/rules/upbibtex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/upbibtex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/upbibtex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,27 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: upbibtex
+name: upBibTeX
+authors:
+- Island of TeX
+commands:
+- name: The upBibTeX reference management software
+  command: >
+    @{
+        return getCommand('upbibtex', options, getBasename(reference))
+    }
+arguments:
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Added: trunk/Master/texmf-dist/scripts/arara/rules/uplatex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/uplatex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/uplatex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,60 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: uplatex
+name: upLaTeX
+authors:
+- Island of TeX
+commands:
+- name: upLaTeX engine
+  command: >
+    @{
+        return getCommand(branch, interaction, shell,
+               synctex, options, reference);
+    }
+arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'uplatex', 'developer' : 'uplatex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'uplatex'
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: shell
+  flag: >
+    @{
+        isTrue(parameters.shell, '--shell-escape', '--no-shell-escape')
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Added: trunk/Master/texmf-dist/scripts/arara/rules/uptex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/uptex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/uptex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,49 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: uptex
+name: upTeX
+authors:
+- Island of TeX
+commands:
+- name: upTeX engine
+  command: >
+    @{
+        return getCommand('uptex', interaction, shell,
+               synctex, options, reference);
+    }
+arguments:
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: shell
+  flag: >
+    @{
+        isTrue(parameters.shell, '--shell-escape', '--no-shell-escape')
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        }
+        else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Deleted: trunk/Master/texmf-dist/scripts/arara/rules/velocity.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/velocity.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/velocity.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,41 +0,0 @@
-!config
-# Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
-# All rights reserved.
-#
-# This rule is part of arara.
-identifier: velocity
-name: Velocity
-authors:
-- Paulo Cereda
-commands:
-- name: The Velocity engine
-  command: >
-    @{
-        mergeVelocityTemplate(isEmpty(input, reference, toFile(input)),
-                              toFile(output), context);
-        return true;
-    }
-arguments:
-- identifier: context
-  flag: >
-    @{
-        if (isMap(parameters.context)) {
-            return parameters.context;
-        }
-        else {
-            throwError('I was expecting a context map.');
-        }
-    }
-  required: true
-- identifier: output
-  flag: >
-    @{
-        return parameters.output;
-    }
-  required: true
-- identifier: input
-  flag: >
-    @{
-        return parameters.input;
-    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/xdvipdfmx.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/xdvipdfmx.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/xdvipdfmx.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: xdvipdfmx
 name: XDVIPDFMX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The XDVIPDFMX program
   command: >
     @{
-        infile = getBasename(file).concat('.dvi');
+        infile = getBasename(reference).concat('.dvi');
         outfile = getBasename(output).concat('.pdf');
         return getCommand('xdvipdfmx', infile, '-o', outfile, options);
     }
@@ -25,7 +24,7 @@
     }
   default: >
     @{
-        file
+        reference
     }
 - identifier: options
   flag: >

Modified: trunk/Master/texmf-dist/scripts/arara/rules/xelatex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/xelatex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/xelatex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,16 +7,26 @@
 identifier: xelatex
 name: XeLaTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: XeLaTeX engine
   command: >
     @{
-        return getCommand('xelatex', interaction, shell,
-               synctex, options, file);
+        return getCommand(branch, interaction, shell,
+               synctex, options, reference);
     }
 arguments:
+- identifier: branch
+  flag: >
+    @{
+        engines = [ 'stable' : 'xelatex', 'developer' : 'xelatex-dev' ];
+        if (engines.keySet().contains(parameters.branch)) {
+            return engines.get(parameters.branch);
+        } else {
+            throwError('The valid branch values are: ' + engines.keySet());
+        }
+    }
+  default: 'xelatex'
 - identifier: interaction
   flag: >
     @{

Modified: trunk/Master/texmf-dist/scripts/arara/rules/xetex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/xetex.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/xetex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,14 +7,13 @@
 identifier: xetex
 name: XeTeX
 authors:
-- Marco Daniel
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: XeTeX engine
   command: >
     @{
         return getCommand('xetex', interaction, shell,
-               synctex, options, file);
+               synctex, options, reference);
     }
 arguments:
 - identifier: interaction

Added: trunk/Master/texmf-dist/scripts/arara/rules/xindex.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/xindex.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/arara/rules/xindex.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,49 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: xindex
+name: xindex
+authors:
+- Island of TeX
+commands:
+- name: The xindex software
+  command: >
+    @{
+        return getCommand('xindex', config, language, options, input);
+    }
+arguments:
+- identifier: input
+  flag: >
+    @{
+        return parameters.input;
+    }
+- identifier: config
+  flag: >
+    @{
+        return [ '-c', parameters.config ];
+    }
+  default: >
+    @{
+        return [ '-c', 'cfg' ];
+    }
+- identifier: language
+  flag: >
+    @{
+        return [ '-l', parameters.language ];
+    }
+  default: >
+    @{
+        return [ '-l', 'en' ];
+    }
+- identifier: options
+  flag: >
+    @{
+        if (isList(parameters.options)) {
+            return parameters.options;
+        } else {
+            throwError('I was expecting a list of options.');
+        }
+    }

Modified: trunk/Master/texmf-dist/scripts/arara/rules/xindy.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/arara/rules/xindy.yaml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/scripts/arara/rules/xindy.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,6 +1,6 @@
 !config
 # Arara, the cool TeX automation tool
-# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# Copyright (c) 2020, Island of TeX 
 # All rights reserved.
 #
 # This rule is part of arara.
@@ -7,13 +7,12 @@
 identifier: xindy
 name: Xindy
 authors:
-- Nicola Talbot
-- Paulo Cereda
+- Island of TeX
 commands:
 - name: The Xindy software
   command: >
     @{
-        base = getBasename(file);
+        base = getBasename(reference);
         infile = base.concat('.').concat(input);
         outfile = [ '-o', base.concat('.').concat(output) ];
         logfile = [ '-t', base.concat('.').concat(log) ];

Added: trunk/Master/texmf-dist/source/support/arara/build.gradle.kts
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/build.gradle.kts	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/build.gradle.kts	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,255 @@
+// SPDX-License-Identifier: BSD-3-Clause
+
+import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.api.internal.project.ProjectInternal
+import org.gradle.api.java.archives.internal.DefaultManifest
+import org.gradle.api.tasks.testing.logging.TestExceptionFormat
+import org.gradle.api.tasks.testing.logging.TestLogEvent
+import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+    application
+    `maven-publish`
+    kotlin("jvm")
+    id("org.jetbrains.kotlin.plugin.serialization")
+    id("com.github.johnrengelman.shadow")
+    id("org.jetbrains.dokka")
+    id("com.diffplug.gradle.spotless")
+    jacoco
+}
+
+val kotlinVersion = project.getKotlinPluginVersion()
+dependencies {
+    implementation(kotlin("stdlib", kotlinVersion))
+    implementation(kotlin("reflect", kotlinVersion))
+    implementation("com.uchuhimo:konf-core:0.22.1")
+    implementation("com.github.ajalt:clikt:2.4.0")
+    implementation("ch.qos.cal10n:cal10n-api:0.8.1")
+    implementation("ch.qos.logback:logback-classic:1.2.3")
+    implementation("ch.qos.logback:logback-core:1.2.3")
+    implementation("org.mvel:mvel2:2.4.5.Final")
+    implementation("org.slf4j:slf4j-api:1.7.30")
+    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.10.2")
+    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.10.+")
+    implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0")
+    implementation("com.charleskorn.kaml:kaml:0.15.0")
+    implementation("org.zeroturnaround:zt-exec:1.11")
+
+    testImplementation("io.kotlintest:kotlintest-runner-junit5:3.4.2")
+}
+
+status = "development"
+val projectName = project.name.toLowerCase()
+val moduleName = group
+val mainClass = "$moduleName.Arara"
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_1_8
+    targetCompatibility = sourceCompatibility
+}
+
+sourceSets {
+    main {
+        java { setSrcDirs(listOf("src/main/java", "src/main/kotlin")) }
+        resources { setSrcDirs(listOf("src/main/resources")) }
+    }
+    test {
+        java { setSrcDirs(listOf("src/test/kotlin")) }
+        resources { setSrcDirs(listOf("src/test/resources")) }
+    }
+}
+
+application {
+    applicationName = project.name
+    mainClassName = mainClass
+}
+
+spotless {
+    java {
+        removeUnusedImports()
+        licenseHeader("// SPDX-License-Identifier: BSD-3-Clause")
+        trimTrailingWhitespace()
+        endWithNewline()
+    }
+    kotlin {
+        ktlint()
+        licenseHeader("// SPDX-License-Identifier: BSD-3-Clause")
+        trimTrailingWhitespace()
+        endWithNewline()
+    }
+}
+
+val mainManifest: Manifest = DefaultManifest((project as ProjectInternal).fileResolver)
+        .apply {
+            attributes["Implementation-Title"] = project.name
+            attributes["Implementation-Version"] = version
+            attributes["Main-Class"] = mainClass
+            if (java.sourceCompatibility < JavaVersion.VERSION_1_9) {
+                attributes["Automatic-Module-Name"] = moduleName
+            }
+        }
+
+tasks {
+    register<Jar>("dokkaJar") {
+        group = JavaBasePlugin.DOCUMENTATION_GROUP
+        description = "Create JAR with dokka documentation"
+        archiveClassifier.set("dokka")
+        from(dokka)
+    }
+    register<Jar>("sourcesJar") {
+        group = JavaBasePlugin.DOCUMENTATION_GROUP
+        description = "Assembles sources JAR"
+        archiveClassifier.set("sources")
+        from(sourceSets["main"].allSource)
+    }
+
+    named<JavaCompile>("compileJava") {
+        if (java.sourceCompatibility > JavaVersion.VERSION_1_8) {
+            inputs.property("moduleName", moduleName)
+            options.compilerArgs = listOf(
+                    // include Gradle dependencies as modules
+                    "--module-path", sourceSets["main"].compileClasspath.asPath)
+        }
+    }
+    withType<KotlinCompile> {
+        kotlinOptions {
+            freeCompilerArgs = listOf("-Xuse-experimental=kotlin.Experimental,kotlinx.serialization.ImplicitReflectionSerializer")
+            jvmTarget = "1.8"
+        }
+    }
+
+    withType<Jar> {
+        archiveBaseName.set("arara")
+        manifest.attributes.putAll(mainManifest.attributes)
+    }
+    named<ShadowJar>("shadowJar") {
+        manifest.attributes.putAll(mainManifest.attributes)
+        archiveAppendix.set("with-deps")
+        archiveClassifier.set("")
+    }
+    named<JavaExec>("run") {
+        if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
+            doFirst {
+                jvmArgs = listOf(
+                        "--module-path", classpath.asPath
+                )
+            }
+        }
+    }
+
+    withType<Test> {
+        useJUnitPlatform()
+
+        testLogging {
+            exceptionFormat = TestExceptionFormat.FULL
+            events(TestLogEvent.STANDARD_OUT, TestLogEvent.STANDARD_ERROR,
+                    TestLogEvent.SKIPPED, TestLogEvent.PASSED, TestLogEvent.FAILED)
+        }
+    }
+}
+tasks.named<Task>("assembleDist").configure {
+    dependsOn("shadowJar", "jacocoTestReport")
+}
+
+publishing {
+    publications {
+        create<MavenPublication>("GitLab") {
+            groupId = project.group.toString()
+            artifactId = "arara"
+            version = project.version.toString()
+
+            pom {
+                name.set("arara")
+                description.set("arara is a TeX automation tool based on " +
+                        "rules and directives. It gives you a way to enhance " +
+                        "your TeX experience.")
+                inceptionYear.set("2012")
+                url.set("https://gitlab.com/islandoftex/arara")
+                organization {
+                    name.set("Island of TeX")
+                    url.set("https://gitlab.com/islandoftex")
+                }
+                licenses {
+                    license {
+                        name.set("New BSD License")
+                        url.set("http://www.opensource.org/licenses/bsd-license.php")
+                        distribution.set("repo")
+                    }
+                }
+                developers {
+                    developer {
+                        name.set("Paulo Roberto Massa Cereda")
+                        email.set("cereda at users.sf.net")
+                        id.set("cereda")
+                        url.set("https://tex.stackexchange.com/users/3094")
+                        roles.set(listOf("Lead developer", "Creator", "Duck enthusiast"))
+                    }
+                    developer {
+                        name.set("Ben Frank")
+                        id.set("benfrank")
+                        url.set("https://gitlab.com/benfrank")
+                        roles.set(listOf("Release coordinator v5"))
+                    }
+                    developer {
+                        name.set("Marco Daniel")
+                        email.set("marco.daniel at mada-nada.de")
+                        id.set("marcodaniel")
+                        url.set("https://tex.stackexchange.com/users/5239")
+                        roles.set(listOf("Contributor", "Tester", "Fast driver"))
+                    }
+                    developer {
+                        name.set("Brent Longborough")
+                        email.set("brent at longborough.org")
+                        id.set("brent")
+                        url.set("https://tex.stackexchange.com/users/344")
+                        roles.set(listOf("Developer", "Contributor", "Tester",
+                                "Haskell fanatic"))
+                    }
+                    developer {
+                        name.set("Nicola Talbot")
+                        email.set("nicola.lc.talbot at gmail.com")
+                        id.set("nlct")
+                        url.set("https://tex.stackexchange.com/users/19862")
+                        roles.set(listOf("Developer", "Contributor", "Tester",
+                                "Hat enthusiast"))
+                    }
+                }
+                scm {
+                    connection.set("scm:git:https://gitlab.com/islandoftex/arara.git")
+                    developerConnection.set("scm:git:https://gitlab.com/islandoftex/arara.git")
+                    url.set("https://gitlab.com/islandoftex/arara")
+                }
+                ciManagement {
+                    system.set("GitLab")
+                    url.set("https://gitlab.com/islandoftex/arara/pipelines")
+                }
+                issueManagement {
+                    system.set("GitLab")
+                    url.set("https://gitlab.com/islandoftex/arara/issues")
+                }
+            }
+
+            from(components["java"])
+            artifact(tasks["sourcesJar"])
+            artifact(tasks["dokkaJar"])
+        }
+    }
+
+    repositories {
+        maven {
+            url = uri("https://gitlab.com/api/v4/projects/14349047/packages/maven")
+            credentials(HttpHeaderCredentials::class) {
+                if (project.hasProperty("jobToken")) {
+                    name = "Job-Token"
+                    value = project.property("jobToken").toString()
+                } else {
+		    logger.warn("Will be unable to publish (jobToken missing)")
+		}
+            }
+            authentication {
+                create<HttpHeaderAuthentication>("header")
+            }
+        }
+    }
+}

Deleted: trunk/Master/texmf-dist/source/support/arara/pom.java5.xml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/pom.java5.xml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/source/support/arara/pom.java5.xml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  - 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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.github.cereda</groupId>
-    <artifactId>arara</artifactId>
-    <version>4.0</version>
-    <packaging>jar</packaging>
-
-    <name>arara</name>
-    <url>https://github.com/cereda/arara</url>
-    <description>Arara is a TeX automation tool based on rules and directives.</description>
-    <inceptionYear>2012</inceptionYear>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>1.5</maven.compiler.source>
-        <maven.compiler.target>1.5</maven.compiler.target>
-    </properties>
-
-    <issueManagement>
-        <system>GitHub</system>
-        <url>https://github.com/cereda/arara/issues</url>
-    </issueManagement>
-
-    <licenses>
-        <license>
-            <name>New BSD License</name>
-            <url>http://www.opensource.org/licenses/bsd-license.php</url>
-            <distribution>repo</distribution>
-            <comments>New BSD License</comments>
-        </license>
-    </licenses>
-
-    <scm>
-        <connection>scm:git:https://github.com/cereda/arara.git</connection>
-        <developerConnection>scm:git:https://github.com/cereda/arara.git</developerConnection>
-        <url>https://github.com/cereda/arara</url>
-    </scm>
-
-    <developers>
-
-        <developer>
-            <name>Paulo Roberto Massa Cereda</name>
-            <email>cereda at users.sf.net</email>
-            <id>cereda</id>
-            <url>http://tex.stackexchange.com/users/3094</url>
-            <roles>
-                <role>Lead developer</role>
-                <role>Creator</role>
-                <role>Duck enthusiast</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Marco Daniel</name>
-            <email>marco.daniel at mada-nada.de</email>
-            <id>marcodaniel</id>
-            <url>http://tex.stackexchange.com/users/5239</url>
-            <roles>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Fast driver</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Brent Longborough</name>
-            <email>brent at longborough.org</email>
-            <id>brent</id>
-            <url>http://tex.stackexchange.com/users/344</url>
-            <roles>
-                <role>Developer</role>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Haskell fanatic</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Nicola Talbot</name>
-            <email>nicola.lc.talbot at gmail.com</email>
-            <id>nlct</id>
-            <url>http://tex.stackexchange.com/users/19862</url>
-            <roles>
-                <role>Developer</role>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Hat enthusiast</role>
-            </roles>
-        </developer>
-
-    </developers>
-
-    <build>
-
-        <finalName>arara-${project.version}</finalName>
-
-        <plugins>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.5.1</version>
-                <configuration>
-                    <source>1.5</source>
-                    <target>1.5</target>
-                    <compilerArgument>-Xlint:unchecked</compilerArgument>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.6</version>
-                <configuration>
-                    <descriptorRefs>
-                        <descriptorRef>jar-with-dependencies</descriptorRef>
-                    </descriptorRefs>
-                    <archive>
-                        <manifest>
-                            <mainClass>com.github.cereda.arara.Arara</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.10.4</version>
-                <configuration>
-                    <show>public</show>
-                    <defaultAuthor>Paulo Roberto Massa Cereda</defaultAuthor>
-                    <defaultSince>${project.version}</defaultSince>
-                    <defaultVersion>${project.version}</defaultVersion>
-                    <level>private</level>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.1</version>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>lib/</classpathPrefix>
-                            <mainClass>com.github.cereda.arara.Arara</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.10</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <includeScope>runtime</includeScope>
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>3.0.0</version>
-            </plugin>
-
-        </plugins>
-
-    </build>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.12</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.e-movimento.tinytools</groupId>
-            <artifactId>privilegedaccessor</artifactId>
-            <version>1.2.2</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.simpleframework</groupId>
-            <artifactId>simple-xml</artifactId>
-            <version>2.7.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-collections4</artifactId>
-            <version>4.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.zeroturnaround</groupId>
-            <artifactId>zt-exec</artifactId>
-            <version>1.9</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-io</groupId>
-                    <artifactId>commons-io</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-
-        <dependency>
-            <groupId>org.yaml</groupId>
-            <artifactId>snakeyaml</artifactId>
-            <version>1.17</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>1.3.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <version>1.1.2</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-core</artifactId>
-            <version>1.1.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>1.7.7</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.cal10n</groupId>
-            <artifactId>cal10n-api</artifactId>
-            <version>0.8.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mvel</groupId>
-            <artifactId>mvel2</artifactId>
-            <version>2.2.8.Final</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
-            <version>1.7</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-lang</groupId>
-                    <artifactId>commons-lang</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-        
-    </dependencies>
-
-</project>

Deleted: trunk/Master/texmf-dist/source/support/arara/pom.xml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/pom.xml	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/source/support/arara/pom.xml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  - 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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.github.cereda</groupId>
-    <artifactId>arara</artifactId>
-    <version>4.0</version>
-    <packaging>jar</packaging>
-
-    <name>arara</name>
-    <url>https://github.com/cereda/arara</url>
-    <description>Arara is a TeX automation tool based on rules and directives.</description>
-    <inceptionYear>2012</inceptionYear>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>1.6</maven.compiler.source>
-        <maven.compiler.target>1.6</maven.compiler.target>
-    </properties>
-
-    <issueManagement>
-        <system>GitHub</system>
-        <url>https://github.com/cereda/arara/issues</url>
-    </issueManagement>
-
-    <licenses>
-        <license>
-            <name>New BSD License</name>
-            <url>http://www.opensource.org/licenses/bsd-license.php</url>
-            <distribution>repo</distribution>
-            <comments>New BSD License</comments>
-        </license>
-    </licenses>
-
-    <scm>
-        <connection>scm:git:https://github.com/cereda/arara.git</connection>
-        <developerConnection>scm:git:https://github.com/cereda/arara.git</developerConnection>
-        <url>https://github.com/cereda/arara</url>
-    </scm>
-
-    <developers>
-
-        <developer>
-            <name>Paulo Roberto Massa Cereda</name>
-            <email>cereda at users.sf.net</email>
-            <id>cereda</id>
-            <url>http://tex.stackexchange.com/users/3094</url>
-            <roles>
-                <role>Lead developer</role>
-                <role>Creator</role>
-                <role>Duck enthusiast</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Marco Daniel</name>
-            <email>marco.daniel at mada-nada.de</email>
-            <id>marcodaniel</id>
-            <url>http://tex.stackexchange.com/users/5239</url>
-            <roles>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Fast driver</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Brent Longborough</name>
-            <email>brent at longborough.org</email>
-            <id>brent</id>
-            <url>http://tex.stackexchange.com/users/344</url>
-            <roles>
-                <role>Developer</role>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Haskell fanatic</role>
-            </roles>
-        </developer>
-
-        <developer>
-            <name>Nicola Talbot</name>
-            <email>nicola.lc.talbot at gmail.com</email>
-            <id>nlct</id>
-            <url>http://tex.stackexchange.com/users/19862</url>
-            <roles>
-                <role>Developer</role>
-                <role>Contributor</role>
-                <role>Tester</role>
-                <role>Hat enthusiast</role>
-            </roles>
-        </developer>
-
-    </developers>
-
-    <build>
-
-        <finalName>arara-${project.version}</finalName>
-
-        <plugins>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.5.1</version>
-                <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
-                    <compilerArgument>-Xlint:unchecked</compilerArgument>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>3.1.0</version>
-                <configuration>
-                    <descriptorRefs>
-                        <descriptorRef>jar-with-dependencies</descriptorRef>
-                    </descriptorRefs>
-                    <archive>
-                        <manifest>
-                            <mainClass>com.github.cereda.arara.Arara</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.10.4</version>
-                <configuration>
-                    <show>public</show>
-                    <defaultAuthor>Paulo Roberto Massa Cereda</defaultAuthor>
-                    <defaultSince>${project.version}</defaultSince>
-                    <defaultVersion>${project.version}</defaultVersion>
-                    <level>private</level>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>3.0.1</version>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>lib/</classpathPrefix>
-                            <mainClass>com.github.cereda.arara.Arara</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <version>2.10</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <includeScope>runtime</includeScope>
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>3.0.0</version>
-            </plugin>
-
-        </plugins>
-
-    </build>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.12</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.e-movimento.tinytools</groupId>
-            <artifactId>privilegedaccessor</artifactId>
-            <version>1.2.2</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.simpleframework</groupId>
-            <artifactId>simple-xml</artifactId>
-            <version>2.7.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-collections4</artifactId>
-            <version>4.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.zeroturnaround</groupId>
-            <artifactId>zt-exec</artifactId>
-            <version>1.9</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-io</groupId>
-                    <artifactId>commons-io</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-
-        <dependency>
-            <groupId>org.yaml</groupId>
-            <artifactId>snakeyaml</artifactId>
-            <version>1.17</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>1.3.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <version>1.1.2</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-core</artifactId>
-            <version>1.1.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>1.7.7</version>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.cal10n</groupId>
-            <artifactId>cal10n-api</artifactId>
-            <version>0.8.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mvel</groupId>
-            <artifactId>mvel2</artifactId>
-            <version>2.2.8.Final</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
-            <version>1.7</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-lang</groupId>
-                    <artifactId>commons-lang</artifactId>
-                </exclusion>
-            </exclusions> 
-        </dependency>
-        
-    </dependencies>
-
-</project>

Deleted: trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java	2020-03-05 00:49:39 UTC (rev 54088)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/java/com/github/cereda/arara/Arara.java	2020-03-05 00:49:50 UTC (rev 54089)
@@ -1,205 +0,0 @@
-/**
- * Arara, the cool TeX automation tool
- * Copyright (c) 2012 -- 2019, 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 $100
-    }
-
-}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/Methods.java
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/Methods.java	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/Methods.java	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,1222 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils;
+
+import kotlin.Pair;
+import org.islandoftex.arara.Arara;
+import org.islandoftex.arara.configuration.AraraSpec;
+import org.islandoftex.arara.filehandling.FileHandlingUtils;
+import org.islandoftex.arara.filehandling.FileSearchingUtils;
+import org.islandoftex.arara.localization.LanguageController;
+import org.islandoftex.arara.localization.Messages;
+import org.islandoftex.arara.model.AraraException;
+import org.islandoftex.arara.model.Session;
+import org.islandoftex.arara.ruleset.Command;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+/**
+ * Implements some auxiliary methods for runtime evaluation.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at SuppressWarnings("unused")
+public class Methods {
+
+    // the language controller
+    private static final LanguageController messages =
+            LanguageController.INSTANCE;
+
+    // the session controller
+    private static final Session session = Session.INSTANCE;
+
+    /**
+     * Get rule methods.
+     *
+     * @return A map of method names to method pointers.
+     */
+    public static Map<String, Object> getRuleMethods() {
+        Map<String, Object> map = new HashMap<>(getConditionalMethods());
+        try {
+            Method[] methods = Methods.class.getMethods();
+            Arrays.asList("getOriginalFile", "getOriginalReference", "isEmpty",
+                    "isNotEmpty", "isTrue", "isFalse", "trimSpaces",
+                    "getBasename", "getFiletype", "throwError", "getSession",
+                    "isWindows", "isLinux", "isMac", "isUnix", "isCygwin",
+                    "replicatePattern", "buildString", "getCommand",
+                    "checkClass", "isString", "isList", "isMap", "isBoolean",
+                    "isVerboseMode", "showMessage", "isOnPath",
+                    "unsafelyExecuteSystemCommand",
+                    "getCommandWithWorkingDirectory", "listFilesByExtensions",
+                    "listFilesByPatterns", "writeToFile", "readFromFile",
+                    "isSubdirectory", "halt").forEach(name ->
+                    map.put(name, Stream.of(methods).filter(
+                            m -> m.getName().equals(name)).findFirst().get()));
+        } catch (Exception exception) {
+            // quack, quack, quack
+        }
+        return map;
+    }
+
+    /**
+     * Get conditional methods.
+     *
+     * @return A map of method names to method pointers.
+     */
+    public static Map<String, Object> getConditionalMethods() {
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Method[] methods = Methods.class.getMethods();
+            Arrays.asList("exists", "missing", "changed", "unchanged", "found",
+                    "toFile", "showDropdown", "showInput", "showOptions",
+                    "currentFile", "loadClass", "loadObject").forEach(name ->
+                    map.put(name, Stream.of(methods).filter(
+                            m -> m.getName().equals(name)).findFirst().get()));
+        } catch (Exception exception) {
+            // quack, quack, quack
+        }
+        return map;
+    }
+
+    /**
+     * Exit the application normally
+     */
+    public static void halt() {
+        halt(0);
+    }
+
+    /**
+     * Exit the application with status code.
+     *
+     * @param status The exit value
+     */
+    public static void halt(int status) {
+        session.put("arara:" + getOriginalFile() + ":halt", status);
+    }
+
+    /**
+     * Gets the original file.
+     *
+     * @return The original file.
+     */
+    public static String getOriginalFile() {
+        File file = Arara.INSTANCE.getConfig()
+                .get(AraraSpec.Execution.INSTANCE.getReference());
+        return file.getName();
+    }
+
+    /**
+     * Gets the original reference.
+     *
+     * @return The original reference.
+     */
+    public static File getOriginalReference() {
+        return Arara.INSTANCE.getConfig()
+                .get(AraraSpec.Execution.INSTANCE.getReference());
+    }
+
+    /**
+     * Checks if the string is empty.
+     *
+     * @param string The string.
+     * @return A boolean value.
+     */
+    public static boolean isEmpty(String string) {
+        return string.equals("");
+    }
+
+    /**
+     * 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) && CommonUtils.INSTANCE.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) && !CommonUtils.INSTANCE.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 FileHandlingUtils.INSTANCE.getBasename(file);
+        } else {
+            throw new AraraException(
+                    CommonUtils.INSTANCE.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 FileHandlingUtils.INSTANCE.getBasename(new File(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 FileHandlingUtils.INSTANCE.getFileExtension(file);
+        } else {
+            throw new AraraException(
+                    CommonUtils.INSTANCE.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 FileHandlingUtils.INSTANCE.getFileExtension(new File(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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.checkOS("unix");
+    }
+
+    /**
+     * 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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.checkOS("unix") ? 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 FileHandlingUtils.INSTANCE.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 FileHandlingUtils.INSTANCE.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 filename.exists();
+    }
+
+    /**
+     * 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 FileHandlingUtils.INSTANCE.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.INSTANCE.generateString(objects);
+    }
+
+    /**
+     * 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.INSTANCE.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.INSTANCE.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;
+    }
+
+    /**
+     * Checks if the object is an instance 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 clazz.isInstance(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 Arara.INSTANCE.getConfig()
+                .get(AraraSpec.Execution.INSTANCE.getVerbose());
+    }
+
+    /**
+     * 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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.isOnPath(command);
+    }
+
+    /**
+     * 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 SystemCallUtils.INSTANCE.executeSystemCommand(command);
+    }
+
+    /**
+     * 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 Arara.INSTANCE.getConfig().get(AraraSpec.Execution
+                .INSTANCE.getFile());
+    }
+
+    /**
+     * 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.
+     */
+    // TODO: refactor to use the enum
+    public static Pair<Integer, Class<?>> loadClass(File file, String name) {
+        Pair<ClassLoadingUtils.ClassLoadingStatus, Class<?>> pair =
+                ClassLoadingUtils.INSTANCE.loadClass(file, name);
+        return new Pair<>(pair.getFirst().ordinal(), pair.getSecond());
+    }
+
+    /**
+     * 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.
+     */
+    // TODO: refactor to use the enum
+    public static Pair<Integer, Class<?>> loadClass(String ref, String name) {
+        Pair<ClassLoadingUtils.ClassLoadingStatus, Class<?>> pair =
+                ClassLoadingUtils.INSTANCE.loadClass(new File(ref), name);
+        return new Pair<>(pair.getFirst().ordinal(), pair.getSecond());
+    }
+
+    /**
+     * 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.
+     */
+    // TODO: refactor to use the enum
+    public static Pair<Integer, Object> loadObject(File file, String name) {
+        Pair<ClassLoadingUtils.ClassLoadingStatus, Object> pair =
+                ClassLoadingUtils.INSTANCE.loadObject(file, name);
+        return new Pair<>(pair.getFirst().ordinal(), pair.getSecond());
+    }
+
+    /**
+     * 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.
+     */
+    // TODO: refactor to use the enum
+    public static Pair<Integer, Object> loadObject(String ref, String name) {
+        Pair<ClassLoadingUtils.ClassLoadingStatus, Object> pair =
+                ClassLoadingUtils.INSTANCE.loadObject(new File(ref), name);
+        return new Pair<>(pair.getFirst().ordinal(), pair.getSecond());
+    }
+
+    /**
+     * 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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.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.INSTANCE.readFromFile(new File(path));
+    }
+
+    /**
+     * Checks whether a directory is under the project directory.
+     *
+     * @param directory The directory to be inspected.
+     * @return Logical value indicating whether the directoy is under root.
+     * @throws AraraException There was a problem with path retrieval.
+     */
+    public static boolean isSubdirectory(File directory)
+            throws AraraException {
+        return FileHandlingUtils.INSTANCE.isSubDirectory(
+                directory, getOriginalReference());
+    }
+}


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/java/org/islandoftex/arara/utils/Methods.java
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/Arara.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/Arara.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/Arara.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara
+
+import com.github.ajalt.clikt.parameters.options.versionOption
+import com.uchuhimo.konf.Config
+import java.time.LocalDate
+import kotlin.time.ExperimentalTime
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.configuration.Configuration
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.model.Extractor
+import org.islandoftex.arara.model.Interpreter
+import org.islandoftex.arara.ruleset.DirectiveUtils
+import org.islandoftex.arara.utils.DisplayUtils
+
+/**
+ * arara's main entry point
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 5.0
+ */
+object Arara {
+    // TODO: watch config files
+    val baseconfig = Config { addSpec(AraraSpec) }
+            .from.env()
+            .from.systemProperties()
+    var config = baseconfig.withLayer("initial")
+
+    /**
+     * Main method. This is the application entry point.
+     * @param args A string array containing all command line arguments.
+     */
+    @ExperimentalTime
+    @JvmStatic
+    fun main(args: Array<String>) {
+        // 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()
+
+        val version = config[AraraSpec.Application.version]
+        CLI().versionOption(version, names = setOf("-V", "--version"),
+                message = {
+                    "arara $version\n" +
+                            "Copyright (c) ${LocalDate.now().year}, Island of TeX\n" +
+                            LanguageController.getMessage(Messages
+                                    .INFO_PARSER_NOTES) + "\n\n" +
+                            "New features in version $version:\n" +
+                            Arara::class.java
+                                    .getResource("/org/islandoftex/arara/configuration/release-notes")
+                                    .readText()
+                })
+                .main(args)
+    }
+
+    @ExperimentalTime
+    fun run() {
+        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()
+
+            // 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;
+            // 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)
+            val extracted = Extractor.extract(config[AraraSpec.Execution
+                    .reference])
+
+            // it is time to validate the directives (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
+            val directives = DirectiveUtils.process(extracted)
+
+            // 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(directives).execute()
+        } catch (exception: AraraException) {
+            // 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)
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/CLI.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/CLI.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/CLI.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,171 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara
+
+import com.github.ajalt.clikt.core.CliktCommand
+import com.github.ajalt.clikt.parameters.arguments.argument
+import com.github.ajalt.clikt.parameters.arguments.multiple
+import com.github.ajalt.clikt.parameters.options.default
+import com.github.ajalt.clikt.parameters.options.flag
+import com.github.ajalt.clikt.parameters.options.option
+import com.github.ajalt.clikt.parameters.types.int
+import com.github.ajalt.clikt.parameters.types.path
+import com.github.ajalt.clikt.parameters.types.restrictTo
+import kotlin.system.exitProcess
+import kotlin.time.ClockMark
+import kotlin.time.ExperimentalTime
+import kotlin.time.MonoClock
+import kotlin.time.milliseconds
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.filehandling.FileSearchingUtils
+import org.islandoftex.arara.localization.Language
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.model.Session
+import org.islandoftex.arara.utils.CommonUtils
+import org.islandoftex.arara.utils.DisplayUtils
+import org.islandoftex.arara.utils.LoggingUtils
+
+/**
+ * arara's command line interface
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 5.0
+ */
+class CLI : CliktCommand(name = "arara", printHelpOnEmptyArgs = true) {
+    private val log by option("-l", "--log",
+            help = "Generate a log output")
+            .flag(default = AraraSpec.Execution.logging.default)
+    private val verbose by option("-v", "--verbose",
+            help = "Print the command output")
+            .flag("-s", "--silent",
+                    default = AraraSpec.Execution.verbose.default)
+    private val dryrun by option("-n", "--dry-run",
+            help = "Go through all the motions of running a command, but " +
+                    "with no actual calls")
+            .flag(default = AraraSpec.Execution.dryrun.default)
+    private val onlyheader by option("-H", "--header",
+            help = "Extract directives only in the file header")
+            .flag(default = AraraSpec.Execution.onlyHeader.default)
+    private val timeout by option("-t", "--timeout",
+            help = "Set the execution timeout (in milliseconds)")
+            .int().restrictTo(min = 1)
+    private val language by option("-L", "--language",
+            help = "Set the application language")
+            .default(AraraSpec.Application.defaultLanguageCode.default)
+    private val maxLoops by option("-m", "--max-loops",
+            help = "Set the maximum number of loops (> 0)")
+            .int().restrictTo(min = 1)
+            .default(AraraSpec.Execution.maxLoops.default)
+    private val preamble by option("-p", "--preamble",
+            help = "Set the file preamble based on the configuration file")
+    private val workingDirectory by option("-d", "--working-directory",
+            help = "Set the working directory for all tools")
+            .path(exists = true, fileOkay = false, readable = true)
+            .default(AraraSpec.Execution.workingDirectory.default)
+
+    private val reference by argument("file",
+            help = "The file(s) to evaluate and process")
+            .multiple(required = true)
+
+    /**
+     * Update the default configuration with the values parsed from the
+     * command line.
+     */
+    @ExperimentalTime
+    private fun updateConfigurationFromCommandLine() {
+        Arara.config[AraraSpec.Execution.language] = Language(language)
+        LanguageController.setLocale(Arara.config[AraraSpec.Execution.language]
+                .locale)
+
+        Arara.config[AraraSpec.Execution.logging] = log
+        Arara.config[AraraSpec.Execution.verbose] = verbose
+        Arara.config[AraraSpec.Execution.dryrun] = dryrun
+        Arara.config[AraraSpec.Execution.onlyHeader] = onlyheader
+        Arara.config[AraraSpec.Execution.maxLoops] = maxLoops
+        Arara.config[AraraSpec.Execution.workingDirectory] = workingDirectory
+        preamble?.let {
+            val preambles = Arara.config[AraraSpec.Execution.preambles]
+            if (preambles.containsKey(it)) {
+                Arara.config[AraraSpec.Execution.preamblesActive] = true
+                Arara.config[AraraSpec.Execution.preamblesContent] =
+                        // will never throw (see check above)
+                        preambles.getValue(it)
+            } else {
+                throw AraraException(
+                        LanguageController.getMessage(
+                                Messages.ERROR_PARSER_INVALID_PREAMBLE, it)
+                )
+            }
+        }
+        timeout?.let {
+            Arara.config[AraraSpec.Execution.timeout] = true
+            Arara.config[AraraSpec.Execution.timeoutValue] = it.milliseconds
+        }
+
+        Arara.config[AraraSpec.UserInteraction.displayTime] = true
+    }
+
+    /**
+     * The actual main method of arara (when run in command-line mode)
+     */
+    @ExperimentalTime
+    override fun run() {
+        // the first component to be initialized is the
+        // logging controller; note init() actually disables
+        // the logging, so early exceptions won't generate
+        // a lot of noise in the terminal
+        LoggingUtils.init()
+
+        // arara features a stopwatch, so we can see how much time has passed
+        // since everything started; 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)
+        val executionStart: ClockMark = MonoClock.markNow()
+
+        // arara stores the environment variables accessible at the start
+        // of the execution in the session object for the user
+        Session.updateEnvironmentVariables()
+
+        // logging has to be initialized only once and for all because
+        // context resets lead to missing output
+        LoggingUtils.enableLogging(log)
+
+        try {
+            // TODO: this will have to change for parallelization
+            reference.forEach {
+                // TODO: do we have to reset some more file-specific config?
+                // especially the working directory will have to be set and
+                // changed
+                Arara.config = Arara.baseconfig.withLayer(it)
+                // next, update the configuration
+                updateConfigurationFromCommandLine()
+                FileSearchingUtils.discoverFile(it)
+                Arara.run()
+                // add an empty line between file executions
+                println()
+            }
+
+            // 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(executionStart.elapsedNow().inSeconds)
+        } catch (ex: AraraException) {
+            DisplayUtils.printException(ex)
+            Arara.config[AraraSpec.Execution.status] = 2
+        }
+
+        // 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.
+        exitProcess(CommonUtils.exitStatus)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/AraraSpec.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/AraraSpec.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/AraraSpec.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.configuration
+
+import com.uchuhimo.konf.ConfigSpec
+import java.io.File
+import java.nio.file.Paths
+import kotlin.time.ExperimentalTime
+import kotlin.time.milliseconds
+import org.islandoftex.arara.localization.Language
+
+/**
+ * Configuration hierarchy for arara
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 5.0
+ */
+ at Suppress("MagicNumber")
+object AraraSpec : ConfigSpec() {
+    object Application : ConfigSpec() {
+        val defaultLanguageCode by optional("en")
+        val version by optional(AraraSpec::class.java.`package`.implementationVersion
+                ?: "DEVELOPMENT BUILD")
+        val namePattern by optional("arara:\\s")
+        val width by optional(65)
+    }
+
+    object Execution : ConfigSpec() {
+        val maxLoops by optional(10)
+        val timeout by optional(false)
+        @ExperimentalTime
+        val timeoutValue by optional(0.milliseconds)
+        val haltOnErrors by optional(true)
+
+        val databaseName by optional("arara")
+        val logName by optional("arara")
+
+        val verbose by optional(false)
+        val language by optional(Language(Application.defaultLanguageCode.default))
+        val logging by optional(false)
+        val dryrun by optional(false)
+        val status by optional(0)
+        val fileTypes by optional(ConfigurationUtils.defaultFileTypes)
+        val rulePaths by optional(setOf(
+                ConfigurationUtils.applicationPath.resolve("rules")
+                        .toString()
+        ))
+        val preambles by optional(mapOf<String, String>())
+        val preamblesActive by optional(false)
+        val preamblesContent by optional("")
+
+        val workingDirectory by optional(Paths.get(""))
+        val configurationName by optional("[none]")
+        val onlyHeader by optional(false)
+
+        // TODO: these are runtime values, they should be properly
+        // initialized and tested (maybe move them into their own
+        // Spec or session)
+        val reference by optional(File("/tmp/"))
+        val file by optional(File("/tmp/"))
+
+        object InfoSpec : ConfigSpec() {
+            val ruleId by optional<String?>(null)
+            val rulePath by optional<String?>(null)
+        }
+
+        object DirectiveSpec : ConfigSpec() {
+            val lines by optional(listOf<Int>())
+        }
+
+        val filePattern by optional("")
+    }
+
+    object Directive : ConfigSpec() {
+        val linebreakPattern by optional("^\\s*-->\\s(.*)$")
+
+        private const val directivestart = """^\s*(\w+)\s*(:\s*(\{.*\})\s*)?"""
+        private const val pattern = """(\s+(if|while|until|unless)\s+(\S.*))?$"""
+        val directivePattern by optional(directivestart + pattern)
+    }
+
+    object UserInteraction : ConfigSpec() {
+        val lookAndFeel by optional("none")
+        val displayTime by optional(false)
+        val displayLine by optional(true)
+        val displayResult by optional(false)
+        val displayRolling by optional(false)
+        val displayException by optional(false)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/Configuration.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/Configuration.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/Configuration.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.configuration
+
+import kotlin.time.ExperimentalTime
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.filehandling.FileHandlingUtils
+import org.islandoftex.arara.localization.Language
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+
+/**
+ * Implements the configuration model, which holds the default settings and can
+ * load the configuration file. 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 Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object Configuration {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * Loads the application configuration.
+     *
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @ExperimentalTime
+    @Throws(AraraException::class)
+    fun load() {
+        // initialize both file type and language models,
+        // since we can track errors from there instead
+        // of relying on a check on this level
+
+        // get the configuration file, if any
+        val file = ConfigurationUtils.configFile
+        if (file != null) {
+            // set the configuration file name for
+            // logging purposes
+            Arara.config[AraraSpec.Execution.configurationName] =
+                    FileHandlingUtils.getCanonicalPath(file)
+
+            // then validate it and update the
+            // configuration accordingly
+            val resource = ConfigurationUtils.loadLocalConfiguration(file)
+            update(resource)
+        }
+
+        // just to be sure, update the
+        // current locale in order to
+        // display localized messages
+        val locale = Arara.config[AraraSpec.Execution.language].locale
+        LanguageController.setLocale(locale)
+    }
+
+    /**
+     * Update the configuration based on the provided map.
+     *
+     * @param resource Map containing the new configuration settings.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    private fun update(resource: LocalConfiguration) {
+        if (resource.paths.isNotEmpty())
+            Arara.config[AraraSpec.Execution.rulePaths] =
+                    ConfigurationUtils.normalizePaths(resource.paths)
+
+        if (resource.filetypes.isNotEmpty()) {
+            Arara.config[AraraSpec.Execution.fileTypes] = ConfigurationUtils.normalizeFileTypes(resource.filetypes)
+        }
+
+        Arara.config[AraraSpec.Execution.verbose] = resource.isVerbose
+        Arara.config[AraraSpec.Execution.logging] = resource.isLogging
+        Arara.config[AraraSpec.Execution.onlyHeader] = resource.isHeader
+        Arara.config[AraraSpec.Execution.language] =
+                Language(resource.language)
+        Arara.config[AraraSpec.UserInteraction.lookAndFeel] = resource.laf
+
+        Arara.config[AraraSpec.Execution.databaseName] =
+                ConfigurationUtils.cleanFileName(resource.dbname)
+        Arara.config[AraraSpec.Execution.logName] =
+                ConfigurationUtils.cleanFileName(resource.logname)
+
+        val loops = resource.loops
+        if (loops <= 0) {
+            throw AraraException(messages.getMessage(Messages
+                    .ERROR_CONFIGURATION_LOOPS_INVALID_RANGE))
+        } else {
+            Arara.config[AraraSpec.Execution.maxLoops] = loops
+        }
+
+        if (resource.preambles.isNotEmpty())
+            Arara.config[AraraSpec.Execution.preambles] = resource.preambles
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/ConfigurationUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/ConfigurationUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/ConfigurationUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.configuration
+
+import com.charleskorn.kaml.Yaml
+import java.io.File
+import java.io.UnsupportedEncodingException
+import java.net.URLDecoder
+import java.nio.file.Path
+import java.nio.file.Paths
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.model.FileType
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements configuration utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object ConfigurationUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * This map contains all file types that arara accepts
+     * and their corresponding search patterns (for comments).
+     */
+    val defaultFileTypePatterns = mapOf(
+            "tex" to "^\\s*%\\s+",
+            "dtx" to "^\\s*%\\s+",
+            "ltx" to "^\\s*%\\s+",
+            "drv" to "^\\s*%\\s+",
+            "ins" to "^\\s*%\\s+"
+    )
+
+    /**
+     * Set of default file types provided by arara.
+     * Initialization may throw AraraException if file types are wrong
+     */
+    val defaultFileTypes: Set<FileType> by lazy {
+        defaultFileTypePatterns
+                .map { (extension, pattern) -> FileType(extension, pattern) }
+                .toSet()
+    }
+
+    /**
+     * The configuration file in use.
+     *
+     * Look for configuration files in the user's working directory first
+     * 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.
+     */
+    val configFile: File?
+        get() {
+            val names = listOf(".araraconfig.yaml",
+                    "araraconfig.yaml", ".arararc.yaml", "arararc.yaml")
+            Arara.config[AraraSpec.Execution.workingDirectory]
+                    .let { workingDir ->
+                        val first = names
+                                .map { workingDir.resolve(it).toFile() }
+                                .firstOrNull { it.exists() }
+                        if (first != null)
+                            return first
+                    }
+            CommonUtils.getSystemPropertyOrNull("user.home")?.let { userHome ->
+                return names.map { File(userHome).resolve(it) }
+                        .firstOrNull { it.exists() }
+            }
+            return null
+        }
+
+    /**
+     * The canonical absolute application path.
+     *
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    val applicationPath: Path
+        @Throws(AraraException::class)
+        get() {
+            try {
+                var path = Arara::class.java.protectionDomain.codeSource
+                        .location.path
+                path = URLDecoder.decode(path, "UTF-8")
+                return Paths.get(path).parent.toAbsolutePath()
+            } catch (exception: UnsupportedEncodingException) {
+                throw AraraException(
+                        messages.getMessage(
+                                Messages.ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION
+                        ),
+                        exception
+                )
+            }
+        }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun loadLocalConfiguration(file: File): LocalConfiguration {
+        return file.runCatching {
+            val text = readText()
+            if (!text.startsWith("!config"))
+                throw Exception("Configuration should start with !config")
+            Yaml.default.parse(LocalConfiguration.serializer(),
+                    text)
+        }.getOrElse {
+            throw AraraException(messages.getMessage(
+                    Messages.ERROR_CONFIGURATION_GENERIC_ERROR), it)
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun normalizePaths(paths: Iterable<String>): Set<String> =
+            paths.union(AraraSpec.Execution.rulePaths.default)
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun normalizeFileTypes(types: Iterable<FileType>): Set<FileType> =
+            types.union(defaultFileTypes)
+
+    /**
+     * Cleans the file name to avoid invalid entries.
+     *
+     * @param name The file name.
+     * @return A cleaned file name.
+     */
+    fun cleanFileName(name: String): String {
+        val result = File(name).name.trim()
+        return if (result.isEmpty()) "arara" else result.trim()
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/LocalConfiguration.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/LocalConfiguration.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/configuration/LocalConfiguration.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.configuration
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.model.FileType
+import org.islandoftex.arara.utils.CommonUtils
+import org.mvel2.templates.TemplateRuntime
+
+/**
+ * A local configuration which resembles configuration files in the working
+ * directory.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+class LocalConfiguration {
+    // rule paths
+    var paths: List<String> = listOf()
+        get() {
+            val user = mapOf(
+                    "home" to (CommonUtils.getSystemPropertyOrNull("user.home")
+                            ?: ""),
+                    "name" to (CommonUtils.getSystemPropertyOrNull("user.name")
+                            ?: ""))
+            val application = mapOf(
+                    "workingDirectory" to Arara.config[AraraSpec.Execution.workingDirectory].toAbsolutePath().toString()
+            )
+
+            return field.map { input ->
+                var path = CommonUtils.removeKeywordNotNull(input)
+                try {
+                    path = TemplateRuntime.eval(path, mapOf(
+                            "user" to user, "application" to application
+                    )) as String
+                } catch (_: RuntimeException) {
+                    // do nothing, gracefully fallback to
+                    // the default, unparsed path
+                }
+                path
+            }
+        }
+
+    // file types
+    var filetypes: List<FileType> = listOf()
+
+    // the application language
+    // default to English
+    var language: String = Arara.config[AraraSpec.Application.defaultLanguageCode]
+        get() = CommonUtils.removeKeywordNotNull(field)
+
+    // maximum number of loops
+    var loops: Int = Arara.config[AraraSpec.Execution.maxLoops]
+
+    // verbose flag
+    @SerialName("verbose")
+    var isVerbose: Boolean = Arara.config[AraraSpec.Execution.verbose]
+
+    // logging flag
+    @SerialName("logging")
+    var isLogging: Boolean = Arara.config[AraraSpec.Execution.logging]
+
+    // header flag
+    @SerialName("header")
+    var isHeader: Boolean = Arara.config[AraraSpec.Execution.onlyHeader]
+
+    // database name
+    var dbname: String = Arara.config[AraraSpec.Execution.databaseName]
+        get() = CommonUtils.removeKeywordNotNull(field)
+
+    // log name
+    var logname: String = Arara.config[AraraSpec.Execution.logName]
+        get() = CommonUtils.removeKeywordNotNull(field)
+
+    // map of preambles
+    var preambles: Map<String, String> = Arara.config[AraraSpec.Execution.preambles]
+
+    // look and feel
+    // default to none
+    var laf: String = Arara.config[AraraSpec.UserInteraction.lookAndFeel]
+        get() = CommonUtils.removeKeywordNotNull(field)
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/Database.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/Database.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/Database.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import kotlinx.serialization.Serializable
+
+/**
+ * The database model, which keeps track on file changes.
+ *
+ * This database is a map because it maps files to hashes. So the key will
+ * always be a file representation and the value always a string.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+data 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.
+     */
+    val map: MutableMap<String, String> = mutableMapOf()
+) : MutableMap<String, String> by map

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/DatabaseUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/DatabaseUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/DatabaseUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import com.charleskorn.kaml.Yaml
+import java.io.File
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+
+/**
+ * Implements database utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object DatabaseUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * Gets the file representing the YAML file (database).
+     *
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    private val file: File
+        @Throws(AraraException::class)
+        get() {
+            val reference = Arara.config[AraraSpec.Execution.reference]
+            val name = "${Arara.config[AraraSpec.Execution.databaseName]}.yaml"
+            val path = FileHandlingUtils.getParentCanonicalFile(reference)
+            return path.resolve(name)
+        }
+
+    /**
+     * Loads the YAML file representing the database.
+     *
+     * @return The database object.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun load(): Database {
+        return if (!exists()) {
+            Database()
+        } else {
+            file.runCatching {
+                val text = readText()
+                if (!text.startsWith("!database"))
+                    throw Exception("Database should start with !database")
+                Yaml.default.parse(Database.serializer(), text)
+            }.getOrElse {
+                it.printStackTrace()
+                throw AraraException(messages.getMessage(Messages
+                        .ERROR_LOAD_COULD_NOT_LOAD_XML, file.name), it)
+            }
+        }
+    }
+
+    /**
+     * Saves the database on a YAML file.
+     *
+     * @param database The database object.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun save(database: Database) {
+        file.runCatching {
+            val content = "!database\n" +
+                    Yaml.default.stringify(Database.serializer(), database)
+            writeText(content)
+        }.getOrElse {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_SAVE_COULD_NOT_SAVE_XML,
+                            file.name
+                    ), it)
+        }
+    }
+
+    /**
+     * Checks if the YAML file representing the database exists.
+     *
+     * @return A boolean value indicating if the YAML file exists.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    private fun exists(): Boolean {
+        return file.exists()
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,319 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import java.io.File
+import java.io.IOException
+import java.text.SimpleDateFormat
+import java.util.zip.CRC32
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+
+/**
+ * Implements file handling utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object FileHandlingUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * 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 val currentFile: File
+        get() = Arara.config[AraraSpec.Execution.file]
+
+    /**
+     * 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.
+     */
+    fun writeToFile(file: File, text: String, append: Boolean): Boolean {
+        return try {
+            // try to write the provided
+            // string to the file, with
+            // UTF-8 as encoding
+            if (append)
+                file.appendText(text, Charsets.UTF_8)
+            else
+                file.writeText(text, Charsets.UTF_8)
+            true
+        } catch (_: IOException) {
+            // if something bad happens,
+            // gracefully fallback to
+            // reporting the failure
+            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.
+     */
+    fun writeToFile(
+        file: File,
+        lines: List<String>,
+        append: Boolean
+    ): Boolean =
+            try {
+                writeToFile(file, lines.joinToString(System.lineSeparator()),
+                        append)
+            } catch (_: IOException) {
+                false
+            }
+
+    /**
+     * Reads the provided file (UTF-8) into a list of strings.
+     * @param file The file.
+     * @return A list of strings.
+     */
+    fun readFromFile(file: File): List<String> {
+        return try {
+            // returns the contents of
+            // the provided file as
+            // a list of strings
+            file.readLines(Charsets.UTF_8)
+        } catch (_: IOException) {
+            // if something bad happens,
+            // gracefully fallback to
+            // an empty file list
+            listOf()
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun exists(extension: String): Boolean {
+        val file = File(getPath(extension))
+        return file.exists()
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun getParentCanonicalPath(file: File): String {
+        return getParentCanonicalFile(file).toString()
+    }
+
+    /**
+     * Gets the parent canonical file of a file.
+     *
+     * @param file The file.
+     * @return The parent canonical file of a file.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun getParentCanonicalFile(file: File): File {
+        return file.runCatching {
+            this.canonicalFile.parentFile
+        }.getOrElse {
+            // it is IOException || is is SecurityException
+            throw AraraException(messages.getMessage(
+                    Messages.ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION), it)
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun getPath(extension: String): String {
+        val name = currentFile.nameWithoutExtension + ".$extension"
+        val path = getParentCanonicalFile(currentFile)
+        return path.resolve(name).toString()
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun getCanonicalPath(file: File): String {
+        return getCanonicalFile(file).toString()
+    }
+
+    /**
+     * Gets the canonical file from the provided file.
+     *
+     * @param file The file.
+     * @return The canonical file from the provided file.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun getCanonicalFile(file: File): File {
+        try {
+            return file.canonicalFile
+        } catch (exception: IOException) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_GETCANONICALFILE_IO_EXCEPTION
+                    ),
+                    exception
+            )
+        }
+    }
+
+    /**
+     * 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.
+     */
+    fun getLastModifiedInformation(file: File): String {
+        return SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
+                .format(file.lastModified())
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun calculateHash(file: File): String {
+        try {
+            return String.format("%08x", CRC32().run {
+                update(file.readBytes())
+                value
+            })
+        } catch (exception: IOException) {
+            throw AraraException(messages.getMessage(Messages
+                    .ERROR_CALCULATEHASH_IO_EXCEPTION), exception)
+        }
+    }
+
+    /**
+     * Gets the extension of a file.
+     *
+     * @param file The file.
+     * @return The corresponding file type.
+     */
+    fun getFileExtension(file: File): String = file.extension
+
+    /**
+     * Gets the base name of a file.
+     *
+     * @param file The file.
+     * @return The corresponding base name.
+     */
+    fun getBasename(file: File): String = file.nameWithoutExtension
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun hasChanged(file: File): Boolean {
+        val database = DatabaseUtils.load()
+        val path = getCanonicalPath(file)
+        return if (!file.exists()) {
+            if (database.containsKey(path)) {
+                database.remove(path)
+                DatabaseUtils.save(database)
+                true
+            } else {
+                false
+            }
+        } else {
+            val hash = calculateHash(file)
+            if (database.containsKey(path)) {
+                val value = database[path]
+                if (hash == value) {
+                    false
+                } else {
+                    database[path] = hash
+                    DatabaseUtils.save(database)
+                    true
+                }
+            } else {
+                database[path] = hash
+                DatabaseUtils.save(database)
+                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.
+     */
+    @Throws(AraraException::class)
+    fun hasChanged(extension: String): Boolean =
+            hasChanged(File(getPath(extension)))
+
+    /**
+     * Checks whether a directory is under a root directory.
+     *
+     * @param child Directory to be inspected.
+     * @param parent Root directory.
+     * @return Logical value indicating whether the directoy is under root.
+     * @throws AraraException There was a problem with path retrieval.
+     */
+    @Throws(AraraException::class)
+    fun isSubDirectory(child: File, parent: File): Boolean {
+        return if (child.isDirectory && parent.isDirectory) {
+            getCanonicalPath(child).startsWith(
+                    getParentCanonicalPath(parent) + File.separator
+            )
+        } else {
+            throw AraraException(messages.getMessage(
+                    Messages.ERROR_ISSUBDIRECTORY_NOT_A_DIRECTORY,
+                    child.name))
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,158 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import java.io.File
+import java.io.FileFilter
+import java.nio.file.FileSystems
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements file searching utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object 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.
+     */
+    fun listFilesByExtensions(
+        directory: File,
+        extensions: List<String>,
+        recursive: Boolean
+    ):
+            List<File> = try {
+        // return the result of the
+        // provided search
+        if (recursive)
+            directory.walkTopDown().asSequence()
+                    .filter { !it.isDirectory }
+                    .filter { extensions.contains(it.extension) }
+                    .toList()
+        else
+            directory.listFiles(
+                    FileFilter { extensions.contains(it.extension) })!!
+                    .toList()
+    } catch (_: Exception) {
+        // if something bad happens,
+        // gracefully fallback to
+        // an empty file list
+        listOf()
+    }
+
+    /**
+     * 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.
+     */
+    fun listFilesByPatterns(
+        directory: File,
+        patterns: List<String>,
+        recursive: Boolean
+    ):
+            List<File> = try {
+        // return the result of the provided
+        // search, with the wildcard filter
+        // and a potential recursive search
+        val pathMatcher = patterns.map {
+            FileSystems.getDefault().getPathMatcher("glob:$it")
+        }
+        if (recursive)
+            directory.walkTopDown().asSequence()
+                    .filter { !it.isDirectory }
+                    .filter { file ->
+                        pathMatcher.any { it.matches(file.toPath().fileName) }
+                    }.toList()
+        else
+            directory.listFiles { file: File ->
+                pathMatcher.any { it.matches(file.toPath().fileName) }
+            }!!.toList()
+    } catch (_: Exception) {
+        // if something bad happens,
+        // gracefully fallback to
+        // an empty file list
+        listOf()
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun discoverFile(reference: String) {
+        lookupFile(reference)
+                ?: throw AraraException(
+                        LanguageController.getMessage(
+                                Messages.ERROR_DISCOVERFILE_FILE_NOT_FOUND,
+                                reference,
+                                CommonUtils.fileTypesList
+                        )
+                )
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    private fun lookupFile(reference: String): File? {
+        val types = Arara.config[AraraSpec.Execution.fileTypes]
+        val file = Arara.config[AraraSpec.Execution.workingDirectory]
+                .resolve(reference).toFile()
+        val name = file.name
+        val parent = FileHandlingUtils.getParentCanonicalFile(file)
+
+        // direct search, so we are considering
+        // the reference as a complete name
+        val testFile = parent.resolve(name)
+        if (testFile.exists() && testFile.isFile) {
+            types.firstOrNull {
+                testFile.toString().endsWith("." + it.extension)
+            }?.let {
+                Arara.config[AraraSpec.Execution.filePattern] =
+                        it.pattern
+                Arara.config[AraraSpec.Execution.reference] = testFile
+                return testFile
+            }
+        }
+
+        // indirect search; in this case, we are considering
+        // that the file reference has an implicit extension,
+        // so we need to add it and look again
+        // TODO: disable this step in safe mode
+        return types.map { parent.resolve("$name.${it.extension}") to it }
+                .union(types.map {
+                    parent.resolve("${name.removeSuffix(".").trim()}.${it.extension}") to it
+                })
+                .firstOrNull { it.first.exists() && it.first.isFile }
+                ?.let {
+                    Arara.config[AraraSpec.Execution.filePattern] =
+                            it.second.pattern
+                    Arara.config[AraraSpec.Execution.reference] = it.first
+                    file
+                }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Language.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Language.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Language.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import java.util.Locale
+import org.islandoftex.arara.model.AraraException
+
+/**
+ * Implements the language model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class Language(code: String) {
+    // the language code, based on
+    // ISO 639-1 and language variants
+    private val code: String
+
+    /**
+     * Gets the language name.
+     *
+     * @return A string representing the language name.
+     */
+    val name: String
+        get() = languages.getValue(code).first
+
+    /**
+     * Gets the language locale.
+     *
+     * @return The language locale.
+     */
+    val locale: Locale
+        get() = languages.getValue(code).second
+
+    // throws an exception on invalid language
+    init {
+        if (languages.containsKey(code)) {
+            this.code = code
+        } else {
+            throw AraraException(
+                    LanguageController.getMessage(
+                            Messages.ERROR_LANGUAGE_INVALID_CODE,
+                            languagesList
+                    )
+            )
+        }
+    }
+
+    companion object {
+        // map containing all languages
+        // supported by arara
+        private val languages = mapOf(
+                "en" to Pair("English", Locale("en")),
+                "de" to Pair("German", Locale("de")),
+                "nl" to Pair("Dutch", Locale("nl")),
+                "qn" to Pair("Broad Norfolk", Locale("en", "QN")),
+                "ptbr" to Pair("Brazilian Portuguese", Locale("pt", "BR")),
+                "it" to Pair("Italian", Locale("it"))
+        )
+
+        /**
+         * String representing the list of available languages
+         * because they don't change initialized with the string
+         */
+        val languagesList: String = "(" + languages.map { (key, value) ->
+            value.first + ": " + key
+        }.joinToString(", ") + ")"
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/LanguageController.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/LanguageController.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/LanguageController.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import ch.qos.cal10n.IMessageConveyor
+import ch.qos.cal10n.MessageConveyor
+import java.util.Locale
+import org.islandoftex.arara.configuration.AraraSpec
+
+/**
+ * Implements the language controller. This controller provides a singleton
+ * object that holds the application messages, easily available to all model
+ * and utilitary classes.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object LanguageController {
+    // the message conveyor helps us to get localized messages
+    // according to the provided locale
+    // The fallback language is set to English for all
+    // messages in arara.
+    private var conveyor: IMessageConveyor = MessageConveyor(Locale(
+            AraraSpec.Application.defaultLanguageCode.default))
+
+    /**
+     * 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.
+     */
+    fun setLocale(locale: Locale) {
+        conveyor = 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.
+     */
+    @Suppress("SpreadOperator")
+    fun <E : Enum<*>> getMessage(key: E, vararg parameters: Any): String =
+            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.
+     */
+    fun <E : Enum<*>> getMessage(key: E): String = conveyor.getMessage(key)
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Messages.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Messages.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/localization/Messages.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import ch.qos.cal10n.BaseName
+import ch.qos.cal10n.Locale
+import ch.qos.cal10n.LocaleData
+
+/**
+ * This enumeration contains all application messages.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at BaseName("org.islandoftex.arara.localization.messages")
+ at 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"))
+enum class 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_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_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_RULE_NOT_FOUND,
+    ERROR_INTERPRETER_UNKNOWN_KEYS,
+    ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN,
+    ERROR_ISSUBDIRECTORY_NOT_A_DIRECTORY,
+    ERROR_LANGUAGE_INVALID_CODE,
+    ERROR_LOAD_COULD_NOT_LOAD_XML,
+    ERROR_PARSER_INVALID_PREAMBLE,
+    ERROR_PARSERULE_GENERIC_ERROR,
+    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_VALIDATE_EMPTY_FILES_LIST,
+    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_DUPLICATE_ARGUMENT_IDENTIFIERS,
+    ERROR_VALIDATEBODY_MISSING_KEYS,
+    ERROR_VALIDATEBODY_NULL_ARGUMENT_ID,
+    ERROR_VALIDATEBODY_NULL_COMMAND,
+    ERROR_VALIDATEHEADER_NULL_ID,
+    ERROR_VALIDATEHEADER_NULL_NAME,
+    ERROR_VALIDATEHEADER_WRONG_IDENTIFIER,
+    INFO_DISPLAY_EXCEPTION_MORE_DETAILS,
+    INFO_DISPLAY_EXECUTION_TIME,
+    INFO_DISPLAY_FILE_INFORMATION,
+    INFO_INTERPRETER_DRYRUN_MODE_BOOLEAN_MODE,
+    INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND,
+    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_NOTES,
+    LOG_INFO_BEGIN_BUFFER,
+    LOG_INFO_BOOLEAN_MODE,
+    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
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/AraraException.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/AraraException.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/AraraException.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+/**
+ * Implements the specific exception model for arara.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class AraraException : Exception {
+    /**
+     * The underlying exception, used to hold more details
+     * on what really happened
+     */
+    val exception: Exception?
+
+    /**
+     * Constructor. Takes the exception message.
+     * @param message The exception message.
+     */
+    constructor(message: String) : super(message) {
+        this.exception = null
+    }
+
+    /**
+     * Constructor. Takes the exception message and the underlying exception.
+     * @param message The exception message.
+     * @param exception The underlying exception object.
+     */
+    constructor(message: String, exception: Exception) : super(message) {
+        this.exception = exception
+    }
+
+    /**
+     * Constructor. Takes the exception message and the underlying exception.
+     * @param message The exception message.
+     * @param throwable The underlying exception as generic throwable.
+     */
+    constructor(message: String, throwable: Throwable) : super(message) {
+        this.exception = RuntimeException(throwable)
+    }
+
+    /**
+     * 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.
+     */
+    fun hasException(): Boolean = exception?.message != null
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Evaluator.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Evaluator.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Evaluator.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.ruleset.Conditional
+import org.islandoftex.arara.utils.Methods
+import org.mvel2.templates.TemplateRuntime
+
+/**
+ * Implements the evaluator model, on which a conditional can be analyzed and
+ * processed.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class Evaluator {
+    // this attribute holds the maximum number of
+    // loops arara will accept; it's like
+    // reaching infinity
+    private val loops: Int = Arara.config[AraraSpec.Execution.maxLoops]
+
+    // 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 var counter: Int = 0
+
+    // a flag that indicates the
+    // evaluation to halt regardless
+    // of the the result
+    private var halt: Boolean = false
+
+    /**
+     * Check if a condition is of type if or unless and whether halt
+     * is set.
+     * @param type The type to check.
+     * @param haltCheck The value [halt] should have.
+     * @return `(type == if || type == unless) && haltCheck`
+     */
+    private fun isIfUnlessAndHalt(
+        type: Conditional.ConditionalType,
+        haltCheck: Boolean = true
+    ): Boolean =
+            (type == Conditional.ConditionalType.IF ||
+                    type == Conditional.ConditionalType.UNLESS) &&
+                    halt == haltCheck
+
+    /**
+     * Only run the evaluation of the conditional including a check whether
+     * the result needs to be inverted.
+     * @param conditional The conditional.
+     * @return The result of the evaluation.
+     */
+    @Throws(AraraException::class, RuntimeException::class)
+    private fun evaluateCondition(conditional: Conditional): Boolean {
+        val result = TemplateRuntime.eval("@{ " + conditional.condition + " }",
+                Methods.getConditionalMethods())
+        return if (result is Boolean) {
+            if (conditional.type == Conditional.ConditionalType.UNLESS ||
+                    conditional.type == Conditional.ConditionalType.UNTIL)
+                !result
+            else
+                result
+        } else {
+            throw AraraException(messages.getMessage(
+                    Messages.ERROR_EVALUATE_NOT_BOOLEAN_VALUE))
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    @Suppress("TooGenericExceptionCaught")
+    fun evaluate(conditional: Conditional): Boolean {
+        // when in dry-run mode or not evaluating a
+        // conditional, arara always ignores conditional
+        // evaluations
+        if (conditional.type == Conditional.ConditionalType.NONE ||
+                Arara.config[AraraSpec.Execution.dryrun] ||
+                isIfUnlessAndHalt(conditional.type, true))
+            return false
+        else if (isIfUnlessAndHalt(conditional.type, false)) {
+            halt = true
+        }
+
+        // check counters and see if the execution
+        // has reached our concept of infinity,
+        // thus breaking the cycles
+        counter++
+        return when {
+            conditional.type === Conditional.ConditionalType.WHILE
+                    && counter > loops -> false
+            conditional.type === Conditional.ConditionalType.UNTIL
+                    && counter >= loops -> false
+            else -> {
+                try {
+                    evaluateCondition(conditional)
+                } catch (exception: RuntimeException) {
+                    throw AraraException(messages.getMessage(Messages
+                            .ERROR_EVALUATE_COMPILATION_FAILED),
+                            exception)
+                }
+            }
+        }
+    }
+
+    companion object {
+        // the application messages obtained from the
+        // language controller
+        private val messages = LanguageController
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Extractor.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Extractor.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Extractor.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import java.io.File
+import java.io.IOException
+import java.nio.charset.Charset
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.ruleset.Directive
+import org.islandoftex.arara.ruleset.DirectiveUtils
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Extractor for directives from the provided main file.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object Extractor {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * Extracts a list of directives from the provided main file, obtained from
+     * the configuration controller.
+     * @param file The file to extract the directives from.
+     * @param charset The charset of the file.
+     * @return A list of directives.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun extract(file: File, charset: Charset = Charsets.UTF_8):
+            List<Directive> {
+        try {
+            val content = CommonUtils.preambleContent.toMutableList()
+            content.addAll(file.readLines(charset))
+            return DirectiveUtils.extractDirectives(content)
+        } catch (ioexception: IOException) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_EXTRACTOR_IO_ERROR
+                    ),
+                    ioexception
+            )
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/FileType.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/FileType.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/FileType.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import java.util.regex.PatternSyntaxException
+import kotlinx.serialization.Serializable
+import org.islandoftex.arara.configuration.ConfigurationUtils
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements the file type model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+class FileType {
+    // string representing the
+    // file extension
+    var extension: String = INVALID_EXTENSION
+        get() = CommonUtils.removeKeywordNotNull(field)
+        private set
+    // string representing the
+    // file pattern to be used
+    // as directive lookup
+    var pattern: String = INVALID_PATTERN
+        @Throws(AraraException::class)
+        get() {
+            CommonUtils.removeKeywordNotNull(field)
+            if (field == INVALID_PATTERN) {
+                field = ConfigurationUtils.defaultFileTypePatterns[extension]
+                        ?: throw AraraException(
+                                LanguageController.getMessage(
+                                        Messages.ERROR_FILETYPE_UNKNOWN_EXTENSION,
+                                        extension,
+                                        CommonUtils.fileTypesList
+                                )
+                        )
+            }
+            return field
+        }
+        private set
+
+    constructor(extension: String, pattern: String) {
+        this.extension = extension
+        this.pattern = pattern
+
+        try {
+            pattern.toPattern()
+        } catch (e: PatternSyntaxException) {
+            if (!ConfigurationUtils.defaultFileTypePatterns.containsKey(extension))
+                throw AraraException(
+                        LanguageController.getMessage(
+                                Messages.ERROR_FILETYPE_UNKNOWN_EXTENSION,
+                                extension,
+                                CommonUtils.fileTypesList
+                        )
+                )
+        }
+    }
+
+    companion object {
+        /**
+         * This constant identifies an invalid extension. As unices do not
+         * allow a forward and Windows does not allow a backward slash, this
+         * should suffice.
+         */
+        const val INVALID_EXTENSION = "/\\"
+        /**
+         * This constant identifies an invalid pattern. This is a opening
+         * character class which is invalid.
+         */
+        const val INVALID_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 fun toString(): String {
+        return ".$extension"
+    }
+
+    /**
+     * Implements the file type equals method, checking if one file type is
+     * equal to another. Note that only the file extension is considered.
+     * @param other The object to be analyzed.
+     * @return A boolean value indicating if those two objects are equal.
+     */
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as FileType
+        if (extension != other.extension) return false
+        return true
+    }
+
+    /**
+     * Implements the file type hash code. Note that only the file extension is
+     * considered.
+     * @return An integer representing the file type hash code.
+     */
+    override fun hashCode(): Int {
+        return extension.hashCode()
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Interpreter.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Interpreter.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Interpreter.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,375 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import java.io.File
+import kotlin.time.ExperimentalTime
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.ruleset.Argument
+import org.islandoftex.arara.ruleset.Command
+import org.islandoftex.arara.ruleset.Conditional
+import org.islandoftex.arara.ruleset.Directive
+import org.islandoftex.arara.ruleset.Rule
+import org.islandoftex.arara.ruleset.RuleCommand
+import org.islandoftex.arara.ruleset.RuleUtils
+import org.islandoftex.arara.utils.CommonUtils
+import org.islandoftex.arara.utils.DisplayUtils
+import org.islandoftex.arara.utils.InterpreterUtils
+import org.islandoftex.arara.utils.Methods
+import org.mvel2.templates.TemplateRuntime
+import org.slf4j.LoggerFactory
+
+/**
+ * Interprets the list of directives.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class Interpreter(
+    /**
+     * The list of directives to be interpreted and evaluated.
+     */
+    val directives: List<Directive>
+) {
+    /**
+     * Exception class to represent that the interpreter should stop for some
+     * reason
+     */
+    private class HaltExpectedException(msg: String) : Exception(msg)
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    private fun getRule(directive: Directive): File {
+        return InterpreterUtils.buildRulePath(directive.identifier)
+                ?: throw AraraException(
+                        messages.getMessage(
+                                Messages.ERROR_INTERPRETER_RULE_NOT_FOUND,
+                                directive.identifier,
+                                "(" + CommonUtils.allRulePaths
+                                        .joinToString("; ") + ")"
+                        )
+                )
+    }
+
+    // TODO: in the following, extract the printing into the higher level
+    // function
+    /**
+     * "Run" a boolean return value
+     * @param value The boolean.
+     * @param conditional The conditional to print in dry-run mode.
+     * @param authors The authors of the rule.
+     * @return Returns [value]
+     */
+    private fun runBoolean(
+        value: Boolean,
+        conditional: Conditional,
+        authors: List<String>
+    ): Boolean {
+        logger.info(messages.getMessage(Messages.LOG_INFO_BOOLEAN_MODE,
+                value.toString()))
+
+        if (Arara.config[AraraSpec.Execution.dryrun]) {
+            DisplayUtils.printAuthors(authors)
+            DisplayUtils.wrapText(messages.getMessage(Messages
+                    .INFO_INTERPRETER_DRYRUN_MODE_BOOLEAN_MODE,
+                    value))
+            DisplayUtils.printConditional(conditional)
+        }
+
+        return value
+    }
+
+    /**
+     * Run a command
+     * @param command The command to run.
+     * @param conditional The conditional applied to the run (only for printing).
+     * @param authors The rule authors (only for printing).
+     * @param ruleCommandExitValue The exit value of the rule command.
+     * @return Success of the execution.
+     * @throws AraraException Execution failed.
+     */
+    @ExperimentalTime
+    @Throws(AraraException::class)
+    @Suppress("TooGenericExceptionCaught")
+    private fun runCommand(
+        command: Command,
+        conditional: Conditional,
+        authors: List<String>,
+        ruleCommandExitValue: String?
+    ): Boolean {
+        logger.info(messages.getMessage(Messages.LOG_INFO_SYSTEM_COMMAND,
+                command))
+        var success = true
+
+        if (!Arara.config[AraraSpec.Execution.dryrun]) {
+            val code = InterpreterUtils.run(command)
+            val check: Any = try {
+                val context = mapOf<String, Any>("value" to code)
+                TemplateRuntime.eval(
+                        "@{ " + (ruleCommandExitValue ?: "value == 0") + " }",
+                        context)
+            } catch (exception: RuntimeException) {
+                throw AraraException(CommonUtils.ruleErrorHeader +
+                        messages.getMessage(Messages
+                                .ERROR_INTERPRETER_EXIT_RUNTIME_ERROR),
+                        exception)
+            }
+
+            success = if (check is Boolean) {
+                check
+            } else {
+                throw AraraException(
+                        CommonUtils.ruleErrorHeader + messages.getMessage(
+                                Messages.ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN
+                        )
+                )
+            }
+        } else {
+            DisplayUtils.printAuthors(authors)
+            DisplayUtils.wrapText(messages.getMessage(
+                    Messages.INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND,
+                    command))
+            DisplayUtils.printConditional(conditional)
+        }
+
+        return success
+    }
+
+    /**
+     * Converts the command evaluation result to a flat list.
+     * @param result The result
+     * @return A flat list.
+     */
+    private fun resultToList(result: Any) = if (result is List<*>) {
+        CommonUtils.flatten(result)
+    } else {
+        listOf(result)
+    }
+
+    /**
+     * Execute a command.
+     * @param command The command to evaluate.
+     * @param conditional Under which condition to execute.
+     * @param rule The rule (only passed for output purposes).
+     * @param parameters The parameters for evaluation
+     * @throws AraraException Running the command failed.
+     */
+    @ExperimentalTime
+    @Throws(AraraException::class)
+    @Suppress("TooGenericExceptionCaught", "ThrowsCount")
+    private fun executeCommand(
+        command: RuleCommand,
+        conditional: Conditional,
+        rule: Rule,
+        parameters: Map<String, Any>
+    ) {
+        val result: Any = try {
+            TemplateRuntime.eval(command.command!!, parameters)
+        } catch (exception: RuntimeException) {
+            throw AraraException(CommonUtils.ruleErrorHeader +
+                    messages.getMessage(Messages
+                            .ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR),
+                    exception)
+        }
+
+        // TODO: check nullability
+        resultToList(result).filter { it.toString().isNotBlank() }
+                .forEach { current ->
+                    DisplayUtils.printEntry(rule.name, command.name
+                            ?: messages.getMessage(Messages
+                                    .INFO_LABEL_UNNAMED_TASK))
+
+                    val success = when (current) {
+                        is Boolean -> runBoolean(current, conditional,
+                                rule.authors)
+                        is Command -> runCommand(current, conditional,
+                                rule.authors, command.exit)
+                        else -> TODO("error: this should not happen" +
+                                "we are only supporting boolean + command")
+                    }
+
+                    DisplayUtils.printEntryResult(success)
+
+                    if (Arara.config[AraraSpec.Execution.haltOnErrors] && !success)
+                    // TODO: localize
+                        throw HaltExpectedException("Command failed")
+
+                    // TODO: document this key
+                    val haltKey = "arara:${Arara.config[AraraSpec
+                            .Execution.reference].name}:halt"
+                    if (Session.contains(haltKey)) {
+                        Arara.config[AraraSpec.Execution.status] =
+                                Session[haltKey].toString().toInt()
+                        // TODO: localize
+                        throw HaltExpectedException("User requested halt")
+                    }
+                }
+    }
+
+    /**
+     * Executes each directive, throwing an exception if something bad has
+     * happened.
+     *
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @ExperimentalTime
+    @Throws(AraraException::class)
+    @Suppress("NestedBlockDepth")
+    fun execute() {
+        for (directive in directives) {
+            logger.info(messages.getMessage(Messages.LOG_INFO_INTERPRET_RULE,
+                    directive.identifier))
+
+            Arara.config[AraraSpec.Execution.file] =
+                    directive.parameters.getValue("reference") as File
+            val file = getRule(directive)
+
+            logger.info(messages.getMessage(Messages.LOG_INFO_RULE_LOCATION,
+                    file.parent))
+
+            Arara.config[AraraSpec.Execution.InfoSpec.ruleId] =
+                    directive.identifier
+            Arara.config[AraraSpec.Execution.InfoSpec.rulePath] =
+                    file.parent
+            Arara.config[AraraSpec.Execution.DirectiveSpec.lines] =
+                    directive.lineNumbers
+
+            // parse the rule identified by the directive
+            // (may throw an exception)
+            val rule = RuleUtils.parseRule(file, directive.identifier)
+            val parameters = parseArguments(rule, directive)
+                    .plus(Methods.getRuleMethods())
+
+            val evaluator = Evaluator()
+
+            var available = true
+            if (InterpreterUtils.runPriorEvaluation(directive.conditional)) {
+                available = evaluator.evaluate(directive.conditional)
+            }
+
+            // if this directive is conditionally disabled, skip
+            if (!available) continue
+            // if not execute the commands associated with the directive
+            do {
+                rule.commands.forEach { command ->
+                    try {
+                        executeCommand(command, directive.conditional, rule, parameters)
+                    } catch (_: HaltExpectedException) {
+                        // if the user uses the halt rule to trigger
+                        // a halt, this will be raised
+                        return
+                    }
+                }
+            } while (evaluator.evaluate(directive.conditional))
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    private fun parseArguments(rule: Rule, directive: Directive):
+            Map<String, Any> {
+        val arguments = rule.arguments
+        val unknown = CommonUtils.getUnknownKeys(directive.parameters,
+                arguments).minus("reference")
+        if (unknown.isNotEmpty())
+            throw AraraException(CommonUtils.ruleErrorHeader +
+                    messages.getMessage(
+                            Messages.ERROR_INTERPRETER_UNKNOWN_KEYS,
+                            "(" + unknown.joinToString(", ") + ")"))
+
+        val resolvedArguments = mutableMapOf<String, Any>()
+        resolvedArguments["reference"] = directive.parameters
+                .getValue("reference")
+
+        val context = mapOf(
+                "parameters" to directive.parameters,
+                "reference" to directive.parameters.getValue("reference")
+        ).plus(Methods.getRuleMethods())
+
+        arguments.forEach { argument ->
+            resolvedArguments[argument.identifier!!] = processArgument(argument,
+                    directive.parameters.containsKey(argument.identifier!!),
+                    context)
+        }
+
+        return resolvedArguments
+    }
+
+    /**
+     * Process a single argument and return the evaluated result.
+     * @param argument The argument to process.
+     * @param idInDirectiveParams Whether the argument's identifier is
+     *   contained in the directive's parameters field.
+     * @param context The context for the evaluation.
+     * @return The result of the evaluation.
+     * @throws AraraException The argument could not be processed.
+     */
+    @Throws(AraraException::class)
+    @Suppress("TooGenericExceptionCaught", "ThrowsCount")
+    private fun processArgument(
+        argument: Argument,
+        idInDirectiveParams: Boolean,
+        context: Map<String, Any>
+    ): Any {
+        if (argument.isRequired && !idInDirectiveParams)
+            throw AraraException(CommonUtils.ruleErrorHeader +
+                    messages.getMessage(
+                            Messages.ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED,
+                            argument.identifier!!))
+
+        var ret = argument.default?.let {
+            try {
+                TemplateRuntime.eval(it, context)
+            } catch (exception: RuntimeException) {
+                throw AraraException(CommonUtils.ruleErrorHeader +
+                        messages.getMessage(Messages
+                                .ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR),
+                        exception)
+            }
+        } ?: ""
+
+        if (argument.flag != null && idInDirectiveParams) {
+            ret = try {
+                TemplateRuntime.eval(argument.flag!!, context)
+            } catch (exception: RuntimeException) {
+                throw AraraException(CommonUtils.ruleErrorHeader + messages
+                        .getMessage(Messages
+                                .ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION),
+                        exception)
+            }
+        }
+
+        return ret
+    }
+
+    companion object {
+        // the application messages obtained from the
+        // language controller
+        private val messages = LanguageController
+
+        // the class logger obtained from
+        // the logger factory
+        private val logger = LoggerFactory.getLogger(Interpreter::class.java)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Session.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Session.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/model/Session.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+
+/**
+ * Implements the session.
+ *
+ * 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 Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object Session {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    // 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 val map = mutableMapOf<String, Any>()
+
+    /**
+     * Gets the object indexed by the provided key from the session. This method
+     * holds the map method of the very same name.
+     *
+     * @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.
+     */
+    @Throws(AraraException::class)
+    operator fun get(key: String): Any {
+        return if (contains(key)) {
+            map.getValue(key)
+        } else {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_SESSION_OBTAIN_UNKNOWN_KEY,
+                            key
+                    )
+            )
+        }
+    }
+
+    /**
+     * Inserts (or overwrites) the object indexed by the provided key into the
+     * session. This method holds the map method of the very same name.
+     *
+     * @param key The provided key.
+     * @param value The value to be inserted.
+     */
+    fun put(key: String, value: Any) {
+        map[key] = value
+    }
+
+    /**
+     * Removes the entry indexed by the provided key from the session. This method
+     * holds the map method of the same name.
+     *
+     * @param key The provided key.
+     * @throws AraraException Something wrong happened, to be caught in the
+     * higher levels.
+     */
+    @Throws(AraraException::class)
+    fun remove(key: String) {
+        if (contains(key)) {
+            map.remove(key)
+        } else {
+            throw 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.
+     */
+    operator fun contains(key: String): Boolean = map.containsKey(key)
+
+    /**
+     * Clears the session (map). This method, as usual, holds the map method of
+     * the same name.
+     */
+    fun clear() = map.clear()
+
+    /**
+     * Update the environment variables stored in the session.
+     *
+     * @param additionFilter Which environment variables to include. You can
+     *   filter their names (the string parameter) but not their values. By
+     *   default all values will be added.
+     * @param removalFilter Which environment variables to remove beforehand.
+     *   By default all values will be removed.
+     */
+    fun updateEnvironmentVariables(
+        additionFilter: (String) -> Boolean = { true },
+        removalFilter: (String) -> Boolean = { true }
+    ) {
+        // remove all current environment variables to clean up the session
+        map.filterKeys { it.startsWith("environment:") }
+                .filterKeys(removalFilter)
+                .forEach { remove(it.key) }
+        // add all relevant new environment variables
+        System.getenv().filterKeys(additionFilter)
+                .forEach { map["environment:${it.key}"] = it.value }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Argument.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Argument.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Argument.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * The rule argument model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+class Argument {
+    /**
+     * The argument identifier
+     */
+    var identifier: String? = null
+        get() = CommonUtils.removeKeyword(field)
+
+    /**
+     * Boolean indicating if the current argument is required
+     */
+    @SerialName("required")
+    var isRequired: Boolean = false
+
+    /**
+     * Flag to hold the argument value manipulation
+     */
+    var flag: String? = null
+        get() = CommonUtils.removeKeyword(field)
+
+    /**
+     * The argument fallback if it is not defined in the directive
+     */
+    var default: String? = null
+        get() = CommonUtils.removeKeyword(field)
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Command.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Command.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Command.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import java.io.File
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements a command model, containing a list of strings.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class Command {
+    /**
+     * A list of elements which are components
+     * of a command and represented as strings
+     */
+    val elements: List<String>
+
+    /**
+     * An optional file acting as a reference for
+     * the default working directory
+     */
+    var workingDirectory: File = Arara.config[AraraSpec.Execution
+            .workingDirectory].toFile()
+
+    /**
+     * Constructor.
+     * @param values An array of objects.
+     */
+    constructor(vararg values: Any) {
+        elements = mutableListOf()
+        val result = CommonUtils.flatten(values.toList())
+        result.map { it.toString() }.filter { it.isNotEmpty() }
+                .forEach { elements.add(it) }
+    }
+
+    /**
+     * Constructor.
+     * @param elements A list of strings.
+     */
+    constructor(elements: List<String>) {
+        this.elements = elements
+    }
+
+    /**
+     * Provides a textual representation of the current command.
+     * @return A string representing the current command.
+     */
+    override fun toString(): String {
+        return "[ " + elements.joinToString(", ") + " ]" +
+                " @ $workingDirectory"
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Conditional.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Conditional.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Conditional.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+/**
+ * The conditional class, it represents the type of conditional available
+ * for a directive and its corresponding expression to be evaluated.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+data class Conditional(
+    /**
+     * The type of the condition indicates the meaning when evaluated.
+     * Defaults to [ConditionalType.NONE].
+     */
+    val type: ConditionalType = ConditionalType.NONE,
+    /**
+     * The expression to be evaluated according to its type. Defaults
+     * to no evaluation (empty string).
+     */
+    val condition: String = ""
+) {
+    /**
+     * The types of conditionals arara is able to recognize.
+     */
+    enum class 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 only if the
+         * result is true, and the process is repeated while the result still
+         * holds true.
+         */
+        WHILE
+    }
+
+    /**
+     * Provides a textual representation of the conditional object.
+     * @return A string representation of this object.
+     */
+    override fun toString(): String {
+        return "{ $type" +
+                if (type != ConditionalType.NONE)
+                    ", expression: ${condition.trim()}"
+                else "" + " }"
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Directive.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Directive.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Directive.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+/**
+ * Implements the directive model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+data class Directive(
+    /**
+     * The directive identifier, it is resolved to the rule identifier
+     * later on.
+     */
+    val identifier: String,
+    /**
+     * A map containing the parameters; they are validated later on in
+     * order to ensure they are valid.
+     */
+    val parameters: Map<String, Any>,
+    /**
+     * A conditional containing the type and the expression to be evaluated
+     * later on.
+     */
+    val conditional: Conditional,
+    /**
+     * A list contained all line numbers from the main file which built the
+     * current directive.
+     */
+    val lineNumbers: List<Int>
+)

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveAssembler.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveAssembler.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveAssembler.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+/**
+ * Implements a directive assembler in order to help build a directive from a
+ * list of strings.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class DirectiveAssembler {
+    // this variable holds a list of
+    // line numbers indicating which
+    // lines composed the resulting
+    // potential directive
+    private val lineNumbers = mutableListOf<Int>()
+
+    // this variable holds the textual
+    // representation of the directive
+    private var text: String = ""
+
+    /**
+     * Checks if an append operation is allowed.
+     * @return A boolean value indicating if an append operation is allowed.
+     */
+    val isAppendAllowed: Boolean
+        get() = lineNumbers.isNotEmpty()
+
+    /**
+     * Adds a line number to the assembler.
+     * @param line An integer representing the line number.
+     */
+    fun addLineNumber(line: Int) = lineNumbers.add(line)
+
+    /**
+     * Appends the provided line to the assembler text.
+     * @param line The provided line.
+     */
+    fun appendLine(line: String) {
+        text = text + " " + line.trim()
+    }
+
+    /**
+     * Gets the list of line numbers.
+     * @return The list of line numbers.
+     */
+    fun getLineNumbers(): List<Int> = lineNumbers
+
+    /**
+     * Gets the text.
+     * @return The assembler text, properly trimmed.
+     */
+    fun getText(): String = text.trim()
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/DirectiveUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,312 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
+import com.fasterxml.jackson.module.kotlin.readValue
+import com.fasterxml.jackson.module.kotlin.registerKotlinModule
+import java.io.File
+import java.util.regex.Pattern
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.filehandling.FileHandlingUtils
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.utils.DisplayUtils
+import org.slf4j.LoggerFactory
+
+/**
+ * Implements directive utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at UseExperimental(kotlinx.serialization.ImplicitReflectionSerializer::class)
+object DirectiveUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    // get the logger context from a factory
+    private val logger = LoggerFactory.getLogger(DirectiveUtils::class.java)
+
+    /**
+     * This function filters the lines of a file to identify the potential
+     * directives.
+     *
+     * @param lines The lines of the file.
+     * @return A map containing the line number and the line's content.
+     */
+    private fun getPotentialDirectiveLines(lines: List<String>):
+            Map<Int, String> {
+        val header = Arara.config[AraraSpec.Execution.onlyHeader]
+        val validLineRegex = Arara.config[AraraSpec.Execution.filePattern]
+        val validLinePattern = validLineRegex.toPattern()
+        val validLineStartPattern = (validLineRegex + Arara.config[AraraSpec
+                .Application.namePattern]).toPattern()
+        val map = mutableMapOf<Int, String>()
+        for ((i, text) in lines.withIndex()) {
+            val validLineMatcher = validLineStartPattern.matcher(text)
+            if (validLineMatcher.find()) {
+                val line = text.substring(validLineMatcher.end())
+                map[i + 1] = line
+
+                logger.info(messages.getMessage(
+                        Messages.LOG_INFO_POTENTIAL_PATTERN_FOUND,
+                        i + 1, line.trim()))
+            } else if (header && !checkLinePattern(validLinePattern, text)) {
+                // if we should only look within the file's header and reached
+                // a point where the line pattern does not match anymore, we
+                // assume we have left the header and break
+                break
+            }
+        }
+        return map
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    @Suppress("MagicNumber")
+    fun extractDirectives(lines: List<String>): List<Directive> {
+        val pairs = getPotentialDirectiveLines(lines)
+                .takeIf { it.isNotEmpty() }
+                ?: throw AraraException(messages.getMessage(
+                        Messages.ERROR_VALIDATE_NO_DIRECTIVES_FOUND))
+
+        val assemblers = mutableListOf<DirectiveAssembler>()
+        var assembler = DirectiveAssembler()
+        val linebreakPattern = Arara.config[AraraSpec.Directive
+                .linebreakPattern].toPattern()
+        for ((lineno, content) in pairs) {
+            val linebreakMatcher = linebreakPattern.matcher(content)
+            if (linebreakMatcher.find()) {
+                if (!assembler.isAppendAllowed) {
+                    throw AraraException(
+                            messages.getMessage(
+                                    Messages.ERROR_VALIDATE_ORPHAN_LINEBREAK,
+                                    lineno
+                            )
+                    )
+                } else {
+                    assembler.addLineNumber(lineno)
+                    assembler.appendLine(linebreakMatcher.group(1))
+                }
+            } else {
+                if (assembler.isAppendAllowed) {
+                    assemblers.add(assembler)
+                }
+                assembler = DirectiveAssembler()
+                assembler.addLineNumber(lineno)
+                assembler.appendLine(content)
+            }
+        }
+        if (assembler.isAppendAllowed) {
+            assemblers.add(assembler)
+        }
+
+        return assemblers.map { generateDirective(it) }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    @Suppress("MagicNumber")
+    fun generateDirective(assembler: DirectiveAssembler): Directive {
+        val matcher = Arara.config[AraraSpec.Directive.directivePattern]
+                .toPattern().matcher(assembler.getText())
+        if (matcher.find()) {
+            val directive = Directive(
+                    identifier = matcher.group(1)!!,
+                    parameters = getParameters(matcher.group(3),
+                            assembler.getLineNumbers()),
+                    conditional = Conditional(
+                            type = getType(matcher.group(5)),
+                            condition = matcher.group(6) ?: ""
+                    ),
+                    lineNumbers = assembler.getLineNumbers()
+            )
+
+            logger.info(messages.getMessage(
+                    Messages.LOG_INFO_POTENTIAL_DIRECTIVE_FOUND, directive))
+
+            return directive
+        } else {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT,
+                            "(" + assembler.getLineNumbers()
+                                    .joinToString(", ") + ")"
+                    )
+            )
+        }
+    }
+
+    /**
+     * Gets the conditional type based on the input string.
+     *
+     * @param text The input string.
+     * @return The conditional type.
+     */
+    private fun getType(text: String?): Conditional.ConditionalType {
+        return when (text) {
+            null -> Conditional.ConditionalType.NONE
+            "if" -> Conditional.ConditionalType.IF
+            "while" -> Conditional.ConditionalType.WHILE
+            "until" -> Conditional.ConditionalType.UNTIL
+            else -> Conditional.ConditionalType.UNLESS
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    private fun getParameters(
+        text: String?,
+        numbers: List<Int>
+    ): Map<String, Any> {
+        if (text == null)
+            return mapOf()
+
+        /* Before using kotlinx.serialization, there has been a dedicated
+         * directive resolver which instructed SnakeYAML to do the following:
+         *
+         * addImplicitResolver(Tag.MERGE, MERGE, "<")
+         * addImplicitResolver(Tag.NULL, NULL, "~nN\u0000")
+         * addImplicitResolver(Tag.NULL, EMPTY, null)
+         *
+         * This has been removed.
+         */
+        return ObjectMapper(YAMLFactory()).registerKotlinModule().runCatching {
+            readValue<Map<String, Any>>(text)
+        }.getOrElse {
+            throw AraraException(messages.getMessage(
+                    Messages.ERROR_VALIDATE_YAML_EXCEPTION,
+                    "(" + numbers.joinToString(", ") + ")"),
+                    it)
+        }
+    }
+
+    /**
+     * Replicate a directive for given files.
+     *
+     * @param holder The list of files.
+     * @param parameters The parameters for the directive.
+     * @param directive The directive to clone.
+     * @return List of cloned directives.
+     * @throws AraraException If there is an error validating the [holder]
+     *   object.
+     */
+    @Throws(AraraException::class)
+    private fun replicateDirective(
+        holder: Any,
+        parameters: Map<String, Any>,
+        directive: Directive
+    ): List<Directive> {
+        return if (holder is List<*>) {
+            // we received a file list, so we map that list to files
+            holder.filterIsInstance<Any>()
+                    .asSequence()
+                    .map { File(it.toString()) }
+                    .map(FileHandlingUtils::getCanonicalFile)
+                    // and because we want directives, we replicate our
+                    // directive to be applied to that file
+                    .map { reference ->
+                        directive.copy(parameters = parameters
+                                .plus("reference" to reference))
+                    }
+                    .toList()
+                    // we take the result if and only if we have at least one
+                    // file and we did not filter out any invalid argument
+                    .takeIf { it.isNotEmpty() && holder.size == it.size }
+            // TODO: check exception according to condition
+                    ?: throw AraraException(
+                            messages.getMessage(
+                                    Messages.ERROR_VALIDATE_EMPTY_FILES_LIST,
+                                    "(" + directive.lineNumbers
+                                            .joinToString(", ") + ")"
+                            )
+                    )
+        } else {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_VALIDATE_FILES_IS_NOT_A_LIST,
+                            "(" + directive.lineNumbers.joinToString(", ") + ")"
+                    )
+            )
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun process(directives: List<Directive>): List<Directive> {
+        val result = mutableListOf<Directive>()
+        directives.forEach { directive ->
+            val parameters = directive.parameters
+
+            if (parameters.containsKey("reference"))
+                throw AraraException(messages.getMessage(
+                        Messages.ERROR_VALIDATE_REFERENCE_IS_RESERVED,
+                        "(" + directive.lineNumbers.joinToString(", ") + ")"))
+
+            if (parameters.containsKey("files")) {
+                result.addAll(replicateDirective(parameters.getValue("files"),
+                        parameters.minus("files"), directive))
+            } else {
+                result.add(directive.copy(parameters = parameters
+                        .plus("reference" to
+                                Arara.config[AraraSpec.Execution.reference])))
+            }
+        }
+
+        logger.info(messages.getMessage(
+                Messages.LOG_INFO_VALIDATED_DIRECTIVES))
+        logger.info(DisplayUtils.displayOutputSeparator(
+                messages.getMessage(Messages.LOG_INFO_DIRECTIVES_BLOCK)))
+        result.forEach { logger.info(it.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 fun checkLinePattern(pattern: Pattern, line: String): Boolean {
+        return line.isBlank() || pattern.matcher(line).find()
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Rule.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Rule.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/Rule.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import kotlinx.serialization.Serializable
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements the rule model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+class Rule {
+    /**
+     * The rule identifier
+     */
+    var identifier: String = INVALID_RULE_IDENTIFIER
+        get() = CommonUtils.removeKeywordNotNull(field)
+
+    /**
+     * The rule name
+     */
+    var name: String = INVALID_RULE_NAME
+        get() = CommonUtils.removeKeywordNotNull(field)
+
+    /**
+     * The list of authors
+     */
+    var authors: List<String> = listOf()
+        get() = field.mapNotNull { CommonUtils.removeKeyword(it) }
+
+    /**
+     * The list of commands
+     */
+    var commands: List<RuleCommand> = listOf()
+
+    /**
+     * The list of arguments
+     */
+    var arguments: List<Argument> = listOf()
+
+    companion object {
+        const val INVALID_RULE_IDENTIFIER = "INVALID_RULE"
+        const val INVALID_RULE_NAME = "INVALID_RULE"
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleCommand.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleCommand.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleCommand.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import kotlinx.serialization.Serializable
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements the rule command model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+ at Serializable
+class RuleCommand {
+    /**
+     * The command name
+     */
+    var name: String? = null
+        get() = CommonUtils.removeKeyword(field)
+
+    /**
+     * The command instruction
+     */
+    var command: String? = null
+        get() = CommonUtils.removeKeyword(field)
+
+    /**
+     * The exit status expression
+     */
+    var exit: String? = null
+        get() = CommonUtils.removeKeyword(field)
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/ruleset/RuleUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.ruleset
+
+import com.charleskorn.kaml.Yaml
+import java.io.File
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.utils.CommonUtils
+
+/**
+ * Implements rule utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object RuleUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun parseRule(file: File, identifier: String): Rule {
+        val rule = file.runCatching {
+            val text = readText()
+            if (!text.startsWith("!config"))
+                throw Exception("Rule should start with !config")
+            Yaml.default.parse(Rule.serializer(), text)
+        }.getOrElse {
+            throw AraraException(
+                    CommonUtils.ruleErrorHeader + messages.getMessage(
+                            Messages.ERROR_PARSERULE_GENERIC_ERROR
+                    ), it)
+        }
+
+        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.
+     */
+    @Throws(AraraException::class)
+    @Suppress("ThrowsCount")
+    private fun validateHeader(rule: Rule, identifier: String) {
+        if (rule.identifier != Rule.INVALID_RULE_IDENTIFIER) {
+            if (rule.identifier != identifier) {
+                throw AraraException(CommonUtils.ruleErrorHeader +
+                        messages.getMessage(
+                                Messages.ERROR_VALIDATEHEADER_WRONG_IDENTIFIER,
+                                rule.identifier,
+                                identifier))
+            }
+        } else {
+            throw AraraException(CommonUtils.ruleErrorHeader +
+                    messages.getMessage(Messages.ERROR_VALIDATEHEADER_NULL_ID))
+        }
+        if (rule.name == Rule.INVALID_RULE_NAME) {
+            throw AraraException(
+                    CommonUtils.ruleErrorHeader + 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.
+     */
+    @Throws(AraraException::class)
+    @Suppress("ThrowsCount")
+    private fun validateBody(rule: Rule) {
+        if (rule.commands.any { it.command == null }) {
+            throw AraraException(CommonUtils.ruleErrorHeader +
+                    messages.getMessage(
+                            Messages.ERROR_VALIDATEBODY_NULL_COMMAND))
+        }
+
+        val arguments = mutableListOf<String>()
+        for (argument in rule.arguments) {
+            if (argument.identifier != null) {
+                if (argument.flag != null || argument.default != null) {
+                    arguments.add(argument.identifier!!)
+                } else {
+                    throw AraraException(
+                            CommonUtils.ruleErrorHeader + messages.getMessage(
+                                    Messages.ERROR_VALIDATEBODY_MISSING_KEYS
+                            )
+                    )
+                }
+            } else {
+                throw AraraException(
+                        CommonUtils.ruleErrorHeader + messages.getMessage(
+                                Messages.ERROR_VALIDATEBODY_NULL_ARGUMENT_ID
+                        )
+                )
+            }
+        }
+
+        arguments.intersect(listOf("files", "reference")).forEach {
+            throw AraraException(
+                    CommonUtils.ruleErrorHeader + messages.getMessage(
+                            Messages.ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED,
+                            it
+                    )
+            )
+        }
+
+        val expected = arguments.size
+        val found = arguments.toSet().size
+        if (expected != found) {
+            throw AraraException(
+                    CommonUtils.ruleErrorHeader + messages.getMessage(
+                            Messages.ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS
+                    )
+            )
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/ClassLoadingUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/ClassLoadingUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/ClassLoadingUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import java.io.File
+import java.lang.reflect.InvocationTargetException
+import java.net.MalformedURLException
+import java.net.URLClassLoader
+
+/**
+ * Implements utilitary methods for classloading and object instantiation.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object ClassLoadingUtils {
+    /**
+     * Indicator of success or failure of class loading.
+     */
+    enum class ClassLoadingStatus {
+        SUCCESS,
+        FILE_NOT_FOUND,
+        MALFORMED_URL,
+        CLASS_NOT_FOUND,
+        ILLEGAL_ACCESS,
+        INSTANTIATION_EXCEPTION
+    }
+
+    /**
+     * 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.
+     */
+    fun loadClass(file: File, name: String):
+            Pair<ClassLoadingStatus, Class<*>> {
+        // status and class to be returned,
+        // it defaults to an object class
+        var value: Class<*> = Any::class.java
+
+        // if file does not exist, nothing
+        // can be done, status is changed
+        val status = if (!file.exists()) {
+            ClassLoadingStatus.FILE_NOT_FOUND
+        } 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)
+                val classloader = URLClassLoader(arrayOf(file.toURI().toURL()),
+                        ClassLoadingUtils::class.java.classLoader)
+
+                // fetches the class from the
+                // instantiated classloader
+                value = Class.forName(name, true, classloader)
+                ClassLoadingStatus.SUCCESS
+            } catch (_: MalformedURLException) {
+                ClassLoadingStatus.MALFORMED_URL
+            } catch (_: ClassNotFoundException) {
+                ClassLoadingStatus.CLASS_NOT_FOUND
+            }
+        }
+
+        // return a new pair based on the
+        // current status and class holder
+        return status to 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.
+     */
+    fun loadObject(file: File, name: String): Pair<ClassLoadingStatus, Any> {
+        // load the corresponding class
+        // based on the qualified name
+        val pair = loadClass(file, name)
+
+        // status and object to be returned,
+        // it defaults to an object
+        var status = pair.first
+        var value = Any()
+
+        // checks if the class actually
+        // exists, otherwise simply
+        // ignore instantiation
+        if (status == ClassLoadingStatus.SUCCESS) {
+            // 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.second.getDeclaredConstructor().newInstance()
+            } catch (_: IllegalAccessException) {
+                status = ClassLoadingStatus.ILLEGAL_ACCESS
+            } catch (_: InstantiationException) {
+                // the user wanted to instantiate an abstract class
+                status = ClassLoadingStatus.INSTANTIATION_EXCEPTION
+            } catch (_: InvocationTargetException) {
+                // the underlying constructor caused an exception
+                status = ClassLoadingStatus.INSTANTIATION_EXCEPTION
+            }
+        }
+
+        // return a new pair based on the
+        // current status and object holder
+        return status to value
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/CommonUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/CommonUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/CommonUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,422 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import java.io.File
+import java.io.IOException
+import java.util.MissingFormatArgumentException
+import java.util.regex.Pattern
+import kotlin.math.ln
+import kotlin.math.pow
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.filehandling.FileHandlingUtils
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.ruleset.Argument
+
+/**
+ * Implements common utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object CommonUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    /**
+     * Gets the list of file types as string, in order.
+     *
+     * @return A string representation of the list of file types, in order.
+     */
+    val fileTypesList: String
+        get() = "[ " + Arara.config[AraraSpec.Execution.fileTypes]
+                .joinToString(" | ") + " ]"
+
+    /**
+     * 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.
+     */
+    val ruleErrorHeader: String
+        get() {
+            return if (Arara.config[AraraSpec.Execution.InfoSpec.ruleId] != null &&
+                    Arara.config[AraraSpec.Execution.InfoSpec.rulePath] != null) {
+                val id = Arara.config[AraraSpec.Execution.InfoSpec.ruleId]!!
+                val path = Arara.config[AraraSpec.Execution.InfoSpec.rulePath]!!
+                messages.getMessage(
+                        Messages.ERROR_RULE_IDENTIFIER_AND_PATH,
+                        id,
+                        path
+                ) + " "
+            } else {
+                ""
+            }
+        }
+
+    /**
+     * 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.
+     */
+    val allRulePaths: List<String>
+        @Throws(AraraException::class)
+        get() = Arara.config[AraraSpec.Execution.rulePaths].map {
+            val location = File(InterpreterUtils.construct(it, "quack"))
+            FileHandlingUtils.getParentCanonicalPath(location)
+        }
+
+    /**
+     * Returns the exit status of the application.
+     *
+     * @return An integer representing the exit status of the application.
+     */
+    val exitStatus: Int
+        get() = Arara.config[AraraSpec.Execution.status]
+
+    /**
+     * 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.
+     */
+    val preambleContent: List<String>
+        get() = if (Arara.config[AraraSpec.Execution.preamblesActive]) {
+            Arara.config[AraraSpec.Execution.preamblesContent]
+                    .split("\n")
+                    .dropLastWhile { it.isEmpty() }
+                    .toList()
+        } else {
+            listOf()
+        }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun checkBoolean(value: String): Boolean {
+        val yes = listOf("yes", "true", "1", "on")
+        val no = listOf("no", "false", "0", "off")
+        return if (!yes.union(no).contains(value.toLowerCase())) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN,
+                            value
+                    )
+            )
+        } else {
+            yes.contains(value.toLowerCase())
+        }
+    }
+
+    /**
+     * Removes the keyword from the beginning of the provided string.
+     *
+     * @param line A string to be analyzed.
+     * @return The provided string without the keyword.
+     */
+    fun removeKeyword(line: String?): String? {
+        return if (line == null) null
+        else removeKeywordNotNull(line)
+    }
+
+    /**
+     * Removes the keyword from the beginning of the provided string.
+     *
+     * @param line A string to be analyzed.
+     * @return The provided string without the keyword.
+     */
+    fun removeKeywordNotNull(line: String): String {
+        var tempLine = line
+        val pattern = "^(\\s)*<arara>\\s".toPattern()
+        val matcher = pattern.matcher(tempLine)
+        if (matcher.find()) {
+            tempLine = tempLine.substring(matcher.end())
+        }
+        return tempLine.trim()
+    }
+
+    /**
+     * Flattens a potential list of lists into a list of objects.
+     *
+     * @param list The list to be flattened.
+     * @return The flattened list.
+     */
+    // TODO: check nullity
+    fun flatten(list: List<*>): List<Any> {
+        val result = mutableListOf<Any>()
+        list.forEach { item ->
+            if (item is List<*>)
+                result.addAll(flatten(item))
+            else
+                result.add(item as Any)
+        }
+        return result
+    }
+
+    /**
+     * 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.
+     */
+    fun getUnknownKeys(
+        parameters: Map<String, Any>,
+        arguments: List<Argument>
+    ): Set<String> {
+        val found = parameters.keys
+        val expected = arguments.mapNotNull { it.identifier }
+        return found.subtract(expected)
+    }
+
+    /**
+     * Gets a human readable representation of a size.
+     *
+     * @param size The byte size to be converted.
+     * @return A string representation of the size.
+     */
+    @Suppress("MagicNumber")
+    fun byteSizeToString(size: Long): String {
+        val language = Arara.config[AraraSpec.Execution.language]
+        val conversionFactor = 1000.0
+        return if (size < conversionFactor) "$size B"
+        else
+            (ln(size.toDouble()) / ln(conversionFactor)).toInt().let { exp ->
+                "%.1f %sB".format(language.locale,
+                        size / conversionFactor.pow(exp.toDouble()),
+                        "kMGTPE"[exp - 1])
+            }
+    }
+
+    /**
+     * 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.
+     */
+    fun generateString(vararg objects: Any): String = objects
+            .map { it.toString() }.filter { it.isNotEmpty() }
+            .joinToString(" ")
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun checkRegex(extension: String, regex: String): Boolean {
+        val file = File(FileHandlingUtils.getPath(extension))
+        return checkRegex(file, regex)
+    }
+
+    /**
+     * Checks if the file contains the provided regex.
+     *
+     * As we use [File.readText] this should not be called on files > 2GB.
+     *
+     * @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.
+     */
+    @Throws(AraraException::class)
+    fun checkRegex(file: File, regex: String): Boolean {
+        try {
+            val text = file.readText()
+            val pattern = Pattern.compile(regex)
+            val matcher = pattern.matcher(text)
+            return matcher.find()
+        } catch (exception: IOException) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_CHECKREGEX_IO_EXCEPTION,
+                            file.name
+                    ),
+                    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.
+     */
+    @Throws(AraraException::class)
+    fun replicateList(
+        pattern: String,
+        values: List<Any>
+    ): List<Any> {
+        return try {
+            values.map { String.format(pattern, it) }
+        } catch (exception: MissingFormatArgumentException) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION
+                    ),
+                    exception
+            )
+        }
+    }
+
+    /**
+     * Checks if the provided operating system string holds according to the
+     * underlying operating system.
+     *
+     * Supported operating systems:
+     *
+     *   * Windows
+     *   * Linux
+     *   * Mac OS X
+     *   * Unix (Linux || Mac OS)
+     *   * Cygwin
+     *
+     * @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.
+     */
+    @Throws(AraraException::class)
+    fun checkOS(value: String): Boolean {
+        fun checkOSProperty(key: String): Boolean =
+                getSystemPropertyOrNull("os.name")
+                        ?.toLowerCase()?.startsWith(key.toLowerCase()) ?: false
+
+        val values = mutableMapOf<String, Boolean>()
+        values["windows"] = checkOSProperty("Windows")
+        values["linux"] = checkOSProperty("Linux")
+        values["mac"] = checkOSProperty("Mac OS X")
+        values["unix"] = checkOSProperty("Mac OS X") ||
+                checkOSProperty("Linux")
+        values["cygwin"] = SystemCallUtils["cygwin"] as Boolean
+        if (!values.containsKey(value.toLowerCase())) {
+            throw AraraException(
+                    messages.getMessage(
+                            Messages.ERROR_CHECKOS_INVALID_OPERATING_SYSTEM,
+                            value
+                    )
+            )
+        }
+        // will never throw, see check above
+        return values.getValue(value.toLowerCase())
+    }
+
+    /**
+     * 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.
+     */
+    fun getSystemProperty(key: String, fallback: String): String =
+            System.getProperties().runCatching {
+                getOrDefault(key, fallback).toString().takeIf { it != "" }
+            }.getOrNull() ?: fallback
+
+    /**
+     * Access a system property.
+     *
+     * @param key The key of the property.
+     * @return The value of the system property or null if there is an
+     *   exception.
+     */
+    fun getSystemPropertyOrNull(key: String): String? =
+            System.getProperties().runCatching { getValue(key).toString() }
+                    .getOrNull()
+
+    /**
+     * 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 fun appendExtensions(command: String): List<String> {
+        // list of extensions, specific for
+        // each operating system (in fact, it
+        // is more Windows specific)
+        val extensions = if (checkOS("windows")) {
+            // the application is running on
+            // Windows, so let's look for the
+            // following extensions in order
+
+            // this list is actually a sublist from
+            // the original Windows PATHEXT environment
+            // variable which holds the list of executable
+            // extensions that Windows supports
+            listOf(".com", ".exe", ".bat", ".cmd")
+        } else {
+            // no Windows, so the default
+            // extension will be just an
+            // empty string
+            listOf("")
+        }
+
+        // return the resulting list holding the
+        // filenames generated from the
+        // provided command
+        return extensions.map { "$command$it" }
+    }
+
+    /**
+     * Checks if the provided command name is reachable from the system path.
+     *
+     * @param command A string representing the command.
+     * @return A logic value.
+     */
+    fun isOnPath(command: String): Boolean {
+        // first and foremost, let's build the list
+        // of filenames based on the underlying
+        // operating system
+        val filenames = appendExtensions(command)
+        return kotlin.runCatching {
+            // break the path into several parts
+            // based on the path separator symbol
+            System.getenv("PATH").split(File.pathSeparator)
+                    .asSequence()
+                    .mapNotNull { File(it).listFiles() }
+                    // 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
+                    .firstOrNull {
+                        it.any { file ->
+                            filenames.contains(file.name) && !file.isDirectory
+                        }
+                    }?.let { true }
+        }.getOrNull() ?: false
+        // otherwise (and in case of an exception) it is not in the path
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/DisplayUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/DisplayUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/DisplayUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,415 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.configuration.ConfigurationUtils
+import org.islandoftex.arara.filehandling.FileHandlingUtils
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.ruleset.Conditional
+import org.slf4j.LoggerFactory
+
+/**
+ * Implements display utilitary methods.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object DisplayUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    // get the logger context from a factory
+    private val logger = LoggerFactory.getLogger(DisplayUtils::class.java)
+
+    /**
+     * The length of the longest result match as integer.
+     */
+    private val longestMatch: Int = listOf(
+            messages.getMessage(Messages.INFO_LABEL_ON_SUCCESS),
+            messages.getMessage(Messages.INFO_LABEL_ON_FAILURE),
+            messages.getMessage(Messages.INFO_LABEL_ON_ERROR))
+            .map { it.length }.max()!!
+    /**
+     * If the longest match is longer than the width, then it will be truncated
+     * to this length.
+     */
+    private const val shortenedLongestMatch = 10
+
+    /**
+     * The default terminal width defined in the settings.
+     */
+    private val width: Int
+        get() = Arara.config[AraraSpec.Application.width]
+
+    /**
+     * Checks if the execution is in dry-run mode.
+     */
+    private val isDryRunMode: Boolean
+        get() = Arara.config[AraraSpec.Execution.dryrun]
+
+    /**
+     * Checks if the execution is in verbose mode.
+     */
+    private val isVerboseMode: Boolean
+        get() = Arara.config[AraraSpec.Execution.verbose]
+
+    /**
+     * The application path.
+     */
+    private val applicationPath: String
+        get() = try {
+            ConfigurationUtils.applicationPath.toString()
+        } catch (ae: AraraException) {
+            "[unknown application path]"
+        }
+
+    /**
+     * Displays the short version of the current entry in the terminal.
+     *
+     * @param name Rule name.
+     * @param task Task name.
+     */
+    private fun buildShortEntry(name: String, task: String) {
+        val result = if (longestMatch >= width)
+            shortenedLongestMatch
+        else
+            longestMatch
+        val space = width - result - 1
+        val line = "($name) $task ".abbreviate(space - "... ".length)
+        print(line.padEnd(space, '.') + " ")
+    }
+
+    /**
+     * Displays the short version of the current entry result in the terminal.
+     *
+     * @param value The boolean value to be displayed.
+     */
+    private fun buildShortResult(value: Boolean) {
+        val result = longestMatch
+        println(getResult(value).padStart(result))
+    }
+
+    /**
+     * Displays the current entry result in the terminal.
+     *
+     * @param value The boolean value to be displayed.
+     */
+    fun printEntryResult(value: Boolean) {
+        Arara.config[AraraSpec.UserInteraction.displayLine] = false
+        Arara.config[AraraSpec.UserInteraction.displayResult] = true
+        Arara.config[AraraSpec.Execution.status] = if (value) 0 else 1
+        logger.info(
+                messages.getMessage(
+                        Messages.LOG_INFO_TASK_RESULT
+                ) + " " + 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 fun buildLongResult(value: Boolean) {
+        val width = width
+        println("\n" + (" " + getResult(value)).padStart(width, '-'))
+    }
+
+    /**
+     * Displays the current entry in the terminal.
+     *
+     * @param name The rule name.
+     * @param task The task name.
+     */
+    fun printEntry(name: String, task: String) {
+        logger.info(
+                messages.getMessage(
+                        Messages.LOG_INFO_INTERPRET_TASK,
+                        task,
+                        name
+                )
+        )
+        Arara.config[AraraSpec.UserInteraction.displayLine] = true
+        Arara.config[AraraSpec.UserInteraction.displayResult] = false
+        if (!isDryRunMode) {
+            if (!isVerboseMode) {
+                buildShortEntry(name, task)
+            } else {
+                buildLongEntry(name, task)
+            }
+        } else {
+            buildDryRunEntry(name, task)
+        }
+    }
+
+    /**
+     * Displays a long version of the current entry in the terminal.
+     *
+     * @param name Rule name.
+     * @param task Task name.
+     */
+    private fun buildLongEntry(name: String, task: String) {
+        if (Arara.config[AraraSpec.UserInteraction.displayRolling]) {
+            addNewLine()
+        } else {
+            Arara.config[AraraSpec.UserInteraction.displayRolling] = true
+        }
+        println(displaySeparator())
+        println("($name) $task".abbreviate(width))
+        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 fun buildDryRunEntry(name: String, task: String) {
+        if (Arara.config[AraraSpec.UserInteraction.displayRolling]) {
+            addNewLine()
+        } else {
+            Arara.config[AraraSpec.UserInteraction.displayRolling] = true
+        }
+        println("[DR] ($name) $task".abbreviate(width))
+        println(displaySeparator())
+    }
+
+    /**
+     * Displays the exception in the terminal.
+     *
+     * @param exception The exception object.
+     */
+    fun printException(exception: AraraException) {
+        Arara.config[AraraSpec.UserInteraction.displayException] = true
+        Arara.config[AraraSpec.Execution.status] = 2
+
+        val display = Arara.config[AraraSpec.UserInteraction.displayLine]
+        if (Arara.config[AraraSpec.UserInteraction.displayResult])
+            addNewLine()
+        if (display) {
+            if (!isDryRunMode) {
+                if (!isVerboseMode) {
+                    buildShortError()
+                } else {
+                    buildLongError()
+                }
+                addNewLine()
+            }
+        }
+        val text = (if (exception.hasException())
+            exception.message + " " + messages.getMessage(
+                    Messages.INFO_DISPLAY_EXCEPTION_MORE_DETAILS)
+        else
+            exception.message) ?: "EXCEPTION PROVIDES NO MESSAGE"
+        // TODO: check null handling
+        logger.error(text)
+        wrapText(text)
+        if (exception.hasException()) {
+            addNewLine()
+            displayDetailsLine()
+            val details = exception.exception!!.message!!
+            logger.error(details)
+            wrapText(details)
+        }
+    }
+
+    /**
+     * Gets the string representation of the provided boolean value.
+     *
+     * @param value The boolean value.
+     * @return The string representation.
+     */
+    private fun getResult(value: Boolean): String {
+        return if (value)
+            messages.getMessage(
+                    Messages.INFO_LABEL_ON_SUCCESS
+            )
+        else
+            messages.getMessage(Messages.INFO_LABEL_ON_FAILURE)
+    }
+
+    /**
+     * Displays the short version of an error in the terminal.
+     */
+    private fun buildShortError() {
+        val result = longestMatch
+        println(messages.getMessage(Messages.INFO_LABEL_ON_ERROR)
+                .padStart(result))
+    }
+
+    /**
+     * Displays the long version of an error in the terminal.
+     */
+    private fun buildLongError() {
+        println((" " + messages.getMessage(Messages.INFO_LABEL_ON_ERROR))
+                .padStart(width, '-'))
+    }
+
+    /**
+     * Displays the provided text wrapped nicely according to the default
+     * terminal width.
+     *
+     * @param text The text to be displayed.
+     */
+    fun wrapText(text: String) = println(text.wrap(width))
+
+    /**
+     * Displays the rule authors in the terminal.
+     *
+     * @param authors The list of authors.
+     */
+    fun printAuthors(authors: List<String>) {
+        val line = if (authors.size == 1)
+            messages.getMessage(Messages.INFO_LABEL_AUTHOR)
+        else
+            messages.getMessage(Messages.INFO_LABEL_AUTHORS)
+        val text = if (authors.isEmpty())
+            messages.getMessage(Messages.INFO_LABEL_NO_AUTHORS)
+        else
+            authors.joinToString(", ") { it.trim() }
+        wrapText("$line $text")
+    }
+
+    /**
+     * Displays the current conditional in the terminal.
+     *
+     * @param conditional The conditional object.
+     */
+    fun printConditional(conditional: Conditional) {
+        if (conditional.type !== Conditional.ConditionalType.NONE) {
+            wrapText(messages.getMessage(Messages.INFO_LABEL_CONDITIONAL) +
+                    " (" + conditional.type + ") " +
+                    conditional.condition)
+        }
+    }
+
+    /**
+     * Displays the file information in the terminal.
+     */
+    fun printFileInformation() {
+        val file = Arara.config[AraraSpec.Execution.reference]
+        val version = Arara.config[AraraSpec.Application.version]
+        val line = messages.getMessage(
+                Messages.INFO_DISPLAY_FILE_INFORMATION,
+                file.name,
+                CommonUtils.byteSizeToString(file.length()),
+                FileHandlingUtils.getLastModifiedInformation(file)
+        )
+        logger.info(messages.getMessage(
+                Messages.LOG_INFO_WELCOME_MESSAGE,
+                version
+        ))
+        logger.info(displaySeparator())
+        logger.debug("::: arara @ $applicationPath")
+        logger.debug("::: Java %s, %s".format(
+                CommonUtils.getSystemProperty("java.version",
+                        "[unknown version]"),
+                CommonUtils.getSystemProperty("java.vendor",
+                        "[unknown vendor]")
+        ))
+        logger.debug("::: %s".format(
+                CommonUtils.getSystemProperty("java.home",
+                        "[unknown location]")
+        ))
+        logger.debug("::: %s, %s, %s".format(
+                CommonUtils.getSystemProperty("os.name",
+                        "[unknown OS name]"),
+                CommonUtils.getSystemProperty("os.arch",
+                        "[unknown OS arch]"),
+                CommonUtils.getSystemProperty("os.version",
+                        "[unknown OS version]")
+        ))
+        logger.debug("::: user.home @ %s".format(
+                CommonUtils.getSystemProperty("user.home",
+                        "[unknown user's home directory]")
+        ))
+        logger.debug("::: CF @ %s".format(Arara.config[AraraSpec.Execution
+                .configurationName]))
+        logger.debug(displaySeparator())
+        logger.info(line)
+        wrapText(line)
+        addNewLine()
+    }
+
+    /**
+     * Displays the elapsed time in the terminal.
+     *
+     * @param seconds The elapsed seconds.
+     */
+    fun printTime(seconds: Double) {
+        val language = Arara.config[AraraSpec.Execution.language]
+
+        if (Arara.config[AraraSpec.UserInteraction.displayTime]) {
+            if (Arara.config[AraraSpec.UserInteraction.displayLine] ||
+                    Arara.config[AraraSpec.UserInteraction.displayException])
+                addNewLine()
+
+            val text = messages.getMessage(
+                    Messages.INFO_DISPLAY_EXECUTION_TIME,
+                    "%1.2f".format(language.locale, seconds))
+            logger.info(text)
+            wrapText(text)
+        }
+    }
+
+    /**
+     * Displays the application logo in the terminal.
+     */
+    fun printLogo() {
+        println("""
+              __ _ _ __ __ _ _ __ __ _
+             / _` | '__/ _` | '__/ _` |
+            | (_| | | | (_| | | | (_| |
+             \__,_|_|  \__,_|_|  \__,_|
+        """.trimIndent())
+        addNewLine()
+    }
+
+    /**
+     * Adds a new line in the terminal.
+     */
+    private fun addNewLine() {
+        println()
+    }
+
+    /**
+     * Displays a line containing details.
+     */
+    private fun displayDetailsLine() {
+        val line = messages.getMessage(
+                Messages.INFO_LABEL_ON_DETAILS) + " "
+        println(line.abbreviate(width).padEnd(width, '-'))
+    }
+
+    /**
+     * Gets the output separator with the provided text.
+     *
+     * @param message The provided text.
+     * @return A string containing the output separator with the provided text.
+     */
+    fun displayOutputSeparator(message: String): String {
+        return " $message ".center(width, '-')
+    }
+
+    /**
+     * Gets the line separator.
+     *
+     * @return A string containing the line separator.
+     */
+    fun displaySeparator(): String {
+        return "-".repeat(width)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/Extensions.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/Extensions.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/Extensions.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import kotlin.math.ceil
+
+/**
+ * Abbreviate a String to a maximal width.
+ *
+ * @param maxWidth The maximal width to truncate to.
+ * @param ellipsis The string to use to indicate an ellipsis.
+ * @throws IllegalArgumentException If the string would consist only of the
+ *   ellipsis after shortening.
+ * @return The abbreviated string.
+ */
+ at Throws(IllegalArgumentException::class)
+fun String.abbreviate(maxWidth: Int, ellipsis: String = "…"): String {
+    return when {
+        maxWidth < ellipsis.length + 1 ->
+            throw IllegalArgumentException("Can't abbreviate text further")
+        this.length < maxWidth -> this
+        else -> this.substring(0, maxWidth - ellipsis.length) + ellipsis
+    }
+}
+
+/**
+ * Center a string within a specified number of columns.
+ *
+ * This does not center anything if the string is longer than the specified
+ * width.
+ *
+ * @param width The number of columns.
+ * @param padChar The char to pad with.
+ * @return The padded string.
+ */
+fun String.center(width: Int, padChar: Char): String {
+    return if (this.length > width) this
+    else {
+        val charsLeft = width - this.length
+        padChar.toString().repeat(charsLeft / 2) + this +
+                padChar.toString().repeat(ceil(charsLeft.toDouble() / 2.0).toInt())
+    }
+}
+
+/**
+ * Wrap text at a specified width.
+ *
+ * Algorithm from Wikipedia:
+ * https://en.wikipedia.org/wiki/Line_wrap_and_word_wrap#Minimum_number_of_lines
+ *
+ * @param width The width to wrap at.
+ * @return Wrapped text.
+ */
+fun String.wrap(width: Int): String {
+    val words = this.split(" ")
+    var wrapped = words[0]
+    var spaceLeft = width - wrapped.length
+    words.drop(1).forEach {
+        val len = it.length
+        wrapped += if (len + 1 > spaceLeft) {
+            spaceLeft = width - len
+            "\n$it"
+        } else {
+            spaceLeft -= len + 1
+            " $it"
+        }
+    }
+    return wrapped
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/InterpreterUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/InterpreterUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/InterpreterUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.io.IOException
+import java.io.OutputStream
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+import kotlin.time.Duration
+import kotlin.time.ExperimentalTime
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.LanguageController
+import org.islandoftex.arara.localization.Messages
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.ruleset.Command
+import org.islandoftex.arara.ruleset.Conditional
+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 Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object InterpreterUtils {
+    // the application messages obtained from the
+    // language controller
+    private val messages = LanguageController
+
+    // get the logger context from a factory
+    private val logger = LoggerFactory.getLogger(InterpreterUtils::class.java)
+
+    /**
+     * 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.
+     */
+    fun runPriorEvaluation(conditional: Conditional): Boolean {
+        return if (Arara.config[AraraSpec.Execution.dryrun]) {
+            false
+        } else {
+            when (conditional.type) {
+                Conditional.ConditionalType.IF,
+                Conditional.ConditionalType.WHILE,
+                Conditional.ConditionalType.UNLESS -> true
+                else -> false
+            }
+        }
+    }
+
+    @ExperimentalTime
+    private fun getProcessExecutorForCommand(
+        command: Command,
+        buffer: OutputStream
+    ):
+            ProcessExecutor {
+        val timeOutValue = Arara.config[AraraSpec.Execution.timeoutValue]
+        var executor = ProcessExecutor().command((command).elements)
+                .directory(command.workingDirectory.absoluteFile)
+                .addDestroyer(ShutdownHookProcessDestroyer())
+        if (Arara.config[AraraSpec.Execution.timeout]) {
+            if (timeOutValue == Duration.ZERO) {
+                throw AraraException(messages.getMessage(Messages
+                        .ERROR_RUN_TIMEOUT_INVALID_RANGE))
+            }
+            executor = executor.timeout(timeOutValue.toLongNanoseconds(),
+                    TimeUnit.NANOSECONDS)
+        }
+        val tee = if (Arara.config[AraraSpec.Execution.verbose]) {
+            executor = executor.redirectInput(System.`in`)
+            TeeOutputStream(System.out, buffer)
+        } else {
+            TeeOutputStream(buffer)
+        }
+        executor = executor.redirectOutput(tee).redirectError(tee)
+        return executor
+    }
+
+    /**
+     * 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.
+     */
+    @ExperimentalTime
+    @Throws(AraraException::class)
+    fun run(command: Command): Int {
+        val buffer = ByteArrayOutputStream()
+        val executor = getProcessExecutorForCommand(command, buffer)
+        return executor.runCatching {
+            val exit = execute().exitValue
+            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)))
+            exit
+        }.getOrElse {
+            throw AraraException(messages.getMessage(
+                    when (it) {
+                        is IOException -> Messages.ERROR_RUN_IO_EXCEPTION
+                        is InterruptedException ->
+                            Messages.ERROR_RUN_INTERRUPTED_EXCEPTION
+                        is InvalidExitValueException ->
+                            Messages.ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION
+                        is TimeoutException ->
+                            Messages.ERROR_RUN_TIMEOUT_EXCEPTION
+                        else -> Messages.ERROR_RUN_GENERIC_EXCEPTION
+                    }), it)
+        }
+    }
+
+    /**
+     * 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.
+     */
+    @Throws(AraraException::class)
+    fun buildRulePath(name: String): File? {
+        Arara.config[AraraSpec.Execution.rulePaths].forEach { path ->
+            val location = 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.
+     */
+    @Throws(AraraException::class)
+    fun construct(path: String, name: String): String {
+        val fileName = "$name.yaml"
+        val location = File(path)
+        return if (location.isAbsolute) {
+            location.resolve(fileName).toString()
+        } else {
+            Arara.config[AraraSpec.Execution.workingDirectory]
+                    // first resolve the path (rule path) against the working
+                    // directory, then the rule name we want to resolve
+                    .resolve(path).resolve(fileName).toAbsolutePath().toString()
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/LoggingUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/LoggingUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/LoggingUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+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.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+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 Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object LoggingUtils {
+    // configuration resource as an input stream
+    // the configuration is actually a XML file.
+    private val resource: InputStream by lazy {
+        LoggingUtils::class.java
+                .getResourceAsStream("/org/islandoftex/arara/configuration/logback.xml")
+    }
+
+    /**
+     * 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.
+     */
+    fun enableLogging(enable: Boolean) {
+        // get the logger context from a factory, set a
+        // new context and reset it
+        val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
+
+        try {
+            // get a new configuration and set
+            // the context
+            val configurator = JoranConfigurator()
+            configurator.context = 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
+                val name = Arara.config[AraraSpec.Execution.logName]
+                loggerContext.putProperty("name", name)
+                configurator.doConfigure(resource)
+            }
+        } catch (_: JoranException) {
+            // quack, quack, quack!
+        }
+    }
+
+    /**
+     * Initializes the logging controller by disabling it. I don't want an odd
+     * behaviour out of the box.
+     */
+    fun init() {
+        enableLogging(false)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/MessageUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/MessageUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/MessageUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,266 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import javax.swing.JOptionPane
+import javax.swing.UIManager
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+
+/**
+ * Implements utilitary methods for displaying messages.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object MessageUtils {
+    // holds the default width for the
+    // message body, in pixels
+    private const val WIDTH = 250
+
+    // let's start the UI manager and set
+    // the default look and feel to be as
+    // close as possible to the system
+    init {
+        // get the current look and feel
+        var laf = Arara.config[AraraSpec.UserInteraction.lookAndFeel]
+
+        // check if one is actually set
+        if (laf != "none") {
+            // use a special keyword to indicate
+            // the use of a system look and feel
+            if (laf == "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) {
+                // quack, quack, quack
+            }
+        }
+    }
+
+    /**
+     * Normalizes the icon type to one of the five available icons.
+     * @param value An integer value.
+     * @return The normalized integer value.
+     */
+    @Suppress("MagicNumber")
+    private fun normalizeIconType(value: Int): Int {
+        // do the normalization according to the available
+        // icons in the underlying message implementation
+        return when (value) {
+            1 -> JOptionPane.ERROR_MESSAGE
+            2 -> JOptionPane.INFORMATION_MESSAGE
+            3 -> JOptionPane.WARNING_MESSAGE
+            4 -> JOptionPane.QUESTION_MESSAGE
+            else -> JOptionPane.PLAIN_MESSAGE
+        }
+    }
+
+    /**
+     * 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 fun normalizeMessageWidth(value: Int): Int {
+        return if (value > 0) value else 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.
+     */
+    fun showMessage(
+        width: Int,
+        type: Int,
+        title: String,
+        text: String
+    ) {
+        // 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.
+     */
+    fun showMessage(type: Int, title: String, text: String) {
+        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.
+     */
+    fun showOptions(
+        width: Int,
+        type: Int,
+        title: String,
+        text: String,
+        vararg buttons: Any
+    ): Int {
+        // 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.
+     */
+    @Suppress("SpreadOperator")
+    fun showOptions(
+        type: Int,
+        title: String,
+        text: String,
+        vararg buttons: Any
+    ): Int {
+        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.
+     */
+    fun showInput(
+        width: Int,
+        type: Int,
+        title: String,
+        text: String
+    ): String {
+        // get the string from the
+        // input text, if any
+        val 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
+        // return the trimmed string otherwise
+        // an empty string
+        return input?.trim() ?: ""
+    }
+
+    /**
+     * 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.
+     */
+    fun showInput(type: Int, title: String, text: String): String {
+        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.
+     */
+    fun showDropdown(
+        width: Int,
+        type: Int,
+        title: String,
+        text: String,
+        vararg elements: Any
+    ): Int {
+        // show the dropdown list and get
+        // the selected object, if any
+        val 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) {
+            elements.forEachIndexed { i, value ->
+                // if the element is found, simply
+                // return the index plus 1, as zero
+                // corresponds to no selection at all
+                if (value == 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.
+     */
+    @Suppress("SpreadOperator")
+    fun showDropdown(
+        type: Int,
+        title: String,
+        text: String,
+        vararg elements: Any
+    ): Int {
+        return showDropdown(WIDTH, type, title, text, *elements)
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/SystemCallUtils.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/SystemCallUtils.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/SystemCallUtils.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.ruleset.Command
+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 and makes unsafe calling of system
+ * commands available to rules.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+object SystemCallUtils {
+    /**
+     * When executing a system call goes wrong, this status code is returned.
+     */
+    const val errorExitStatus = -99
+    /**
+     * When executing a system call goes wrong and the caller asked for output,
+     * this output will be returned.
+     */
+    const val errorCommandOutput = ""
+
+    // 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
+    // create the new map instance to be
+    // populated on demand
+    private val map: MutableMap<String, Any> = mutableMapOf()
+
+    // 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
+    // create the new map of commands and
+    // add the corresponding system calls
+    private val commands: MutableMap<String, () -> Any> = mutableMapOf(
+            "cygwin" to {
+                // Implements the body of the command. In this particular
+                // instance, it checks if we are inside a Cygwin environment.
+                // Returns a boolean value indicating if we are inside a Cygwin
+                // environment.
+
+                // 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
+                executeSystemCommand(Command("uname", "-s"))
+                        .second.toLowerCase().startsWith("cygwin")
+            })
+
+    /**
+     * 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.
+     */
+    @Throws(NoSuchElementException::class, AraraException::class)
+    operator fun get(key: String): Any {
+        // if key is not found, meaning that
+        // the value wasn't required before
+        if (!map.containsKey(key)) {
+            if (commands.containsKey(key))
+            // perform the system call and
+            // populate the corresponding value
+                map[key] = commands[key]!!.invoke()
+            else
+                throw AraraException("The requested key could not be " +
+                        "translated into a command to get the call value.")
+        }
+
+        // simply return the corresponding
+        // value based on the provided key
+        return map.getValue(key)
+    }
+
+    /**
+     * 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.
+     */
+    fun executeSystemCommand(command: Command): Pair<Int, String> {
+        return ProcessExecutor(command.elements).runCatching {
+            directory(command.workingDirectory)
+            readOutput(true)
+            execute().run {
+                exitValue to outputUTF8()
+            }
+        }.getOrElse {
+            // quack, quack, do nothing, just
+            // return a default error code
+            errorExitStatus to errorCommandOutput
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/TeeOutputStream.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/TeeOutputStream.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/kotlin/org/islandoftex/arara/utils/TeeOutputStream.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import java.io.IOException
+import java.io.OutputStream
+
+/**
+ * Implements a stream splitter.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 4.0
+ */
+class TeeOutputStream(
+    /**
+     * The array of output streams holds every output stream that will be
+     * written to.
+     */
+    vararg outputStreams: OutputStream
+) : OutputStream() {
+    /**
+     * An array of streams in which an object of this class will split data.
+     */
+    private val streams: List<OutputStream> = outputStreams.toList()
+
+    /**
+     * Writes the provided integer to each stream.
+     *
+     * @param b The provided integer
+     * @throws IOException An IO exception.
+     */
+    @Throws(IOException::class)
+    override fun write(b: Int) = streams.forEach { it.write(b) }
+
+    /**
+     * 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 The length.
+     * @throws IOException An IO exception.
+     */
+    @Throws(IOException::class)
+    override fun write(b: ByteArray, offset: Int, length: Int) =
+            streams.forEach { it.write(b, offset, length) }
+
+    /**
+     * Flushes every stream.
+     *
+     * @throws IOException An IO exception.
+     */
+    @Throws(IOException::class)
+    override fun flush() = streams.forEach { it.flush() }
+
+    /**
+     * Closes every stream silently.
+     */
+    override fun close() = streams.forEach {
+        try {
+            it.close()
+        } catch (ignored: IOException) {
+            // do nothing on purpose
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/logback.xml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/logback.xml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/logback.xml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -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

Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/release-notes
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/release-notes	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/configuration/release-notes	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,5 @@
+* Introduced working directory support.
+* Reorganized code base for more speed. 
+* Removed triggers and introduced session namespaces.
+* Removed the velocity templating language and several outdated methods.
+* Removed string-based commands (return "command";).

Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=The ''isSubdirectory'' method requires a directory, not a file. It looks like ''{0}'' does not appear to be a directory at all.
+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 YAML 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 YAML 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_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_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 YAML database named ''{0}''. I have no idea why it failed, though. Perhaps I do not have the proper permissions to write the YAML file to disk.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=The ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Although executing in dry-run mode, this entry might be already processed since it returned a boolean value: {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=About to run: {0}
+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_NOTES=arara is released under the New BSD license.
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_BOOLEAN_MODE=Boolean value: {0}
+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}!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_de.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_de.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_de.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=Die ''isSubdirectory'' Methode erwartet als Argument einen Ordner, nicht eine Datei. ''{0}'' scheint kein Ordner zu sein.
+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 YAML-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_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_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 YAML-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 YAML-Datei auf der Festplatte zu speichern.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=Die ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Trotz dry-run Modus wurde dieser Eintrag wahrscheinlich bereits verarbeitet, da er den boolschen Wert {0} zurückgegeben hat.
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Los geht''s: {0}
+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_NOTES=arara ist unter der New BSD license veröffentlicht.
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_BOOLEAN_MODE=Boolscher Wert: {0}
+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}!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_de.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=The ''isSubdirectory'' method requires a directory, not a file. It looks like ''{0}'' does not appear to be a directory at all.
+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 YAML 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 YAML 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_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_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 YAML database named ''{0}''. I have no idea why it failed, though. Perhaps I do not have the proper permissions to write the YAML file to disk.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=The ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Although executing in dry-run mode, this entry might be already processed since it returned a boolean value: {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=About to run: {0}
+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_NOTES=arara is released under the New BSD license.
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_BOOLEAN_MODE=Boolean value: {0}
+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}!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en_QN.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en_QN.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en_QN.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -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.
+#
+# ---------------------------------------------------------------------
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=The ''isSubdirectory'' method requires a directory, not a file. It looks like ''{0}'' does not appear to be a directory at all.
+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 YAML 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 YAML 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_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_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 YAML 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 YAML 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 ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Although executing in dry-run mode, this entry might be already processed since it returned a boolean value: {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=This is what I''m abowt to dew: {0}
+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_NOTES=arara is released under the New BSD license.
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_BOOLEAN_MODE=Boolean value: {0}
+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}! (Thass one onnem hully big birds they git in Brazil.)


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_en_QN.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_it.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_it.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_it.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=Il metodo ''isSubdirectory'' richiede una directory, non un file. Sembra proprio che ''{0}'' non sia una directory.
+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 YAML 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 YAML 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_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_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 YAML con il nome ''{0}''. Purtroppo non ho idea del perché sia successo. Forse non ho i permessi appropriati per scrivere il file YAML sul disco.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=Il metodo ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Sebbene stia eseguendo in modo ''dry-run'', questo elemento potrebbe essere già stato elaborato, perché ha restituito un valore booleano: {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Sto per lanciare: {0}
+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_NOTES=arara stesso è rilasciato in accordo con la licenza New BSD.
+LOG_INFO_BEGIN_BUFFER=BEGIN OUTPUT BUFFER
+LOG_INFO_BOOLEAN_MODE=Valore booleano: {0}
+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}!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_it.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_nl.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_nl.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_nl.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=De ''isSubdirectory''-methode vereist een mapje, geen bestand. Het lijkt erop dat ''{0}'' geen mapje is.
+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 YAML-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 YAML-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_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_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 YAML-database met de naam ''{0}'' niet opslaan. Ik weet niet precies waarom het fout ging. Misschien heb ik niet de juiste schrijfrechten om het YAML-bestand op te slaan.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=De ''get''-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_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_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_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_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.
+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_BOOLEAN_MODE=Ondanks het uitvoeren in dry-runmodus is dit item mogelijk al verwerkt omdat het de booleaanse waarde terug heeft gegeven:  {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=Begin met uitvoeren: {0}
+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_NOTES=arara is uitgebracht onder de New BSD licentie.
+LOG_INFO_BEGIN_BUFFER=OPEN UITVOER
+LOG_INFO_BOOLEAN_MODE=Booleaanse waarde: {0}
+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})!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_nl.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_pt_BR.properties
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_pt_BR.properties	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_pt_BR.properties	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,119 @@
+# 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_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_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_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_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_ISSUBDIRECTORY_NOT_A_DIRECTORY=O método ''isSubdirectory'' requer um diretório, não um arquivo. Observe que ''{0}'' não parece ser um diretório.
+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 YAML 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 YAML 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_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_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 YAML chamado ''{0}''.  Não tenho ideia porque não deu certo. Talvez eu não tenha as permissões corretas para escrever o arquivo YAML no disco.
+ERROR_SESSION_OBTAIN_UNKNOWN_KEY=O método ''get'' 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_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_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_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_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.
+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_BOOLEAN_MODE=Apesar da execução em modo dry-run, é provável que esta entrada já foi processada, dado que o seguinte valor lógico foi retornado: {0}
+INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND=A executar: {0}
+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_NOTES=arara é distribuída sob a licença New BSD.
+LOG_INFO_BEGIN_BUFFER=INÍCIO DO BUFFER DE SAÍDA
+LOG_INFO_BOOLEAN_MODE=Valor lógico: {0}
+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})!


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/main/resources/org/islandoftex/arara/localization/messages_pt_BR.properties
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtilsTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtilsTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileHandlingUtilsTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+import java.io.File
+import java.nio.file.Files
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.model.AraraException
+
+class FileHandlingUtilsTest : ShouldSpec({
+    should("fail generating CRC sums on inexistent files") {
+        shouldThrow<AraraException> {
+            FileHandlingUtils.calculateHash(File("QUACK"))
+        }
+    }
+    should("generate correct CRC sums") {
+        FileHandlingUtils.calculateHash(File("../LICENSE")) shouldBe "2396b4e2"
+        FileHandlingUtils.calculateHash(File("../CODE_OF_CONDUCT.md")) shouldBe "536c426f"
+    }
+
+    should("find correct extension") {
+        FileHandlingUtils.getFileExtension(File("QUACK")) shouldBe ""
+        FileHandlingUtils.getFileExtension(File("a.tex")) shouldBe "tex"
+        FileHandlingUtils.getFileExtension(File(".tex")) shouldBe "tex"
+    }
+    should("find correct basename") {
+        FileHandlingUtils.getBasename(File("QUACK")) shouldBe "QUACK"
+        FileHandlingUtils.getBasename(File("a.tex")) shouldBe "a"
+        FileHandlingUtils.getBasename(File(".tex")) shouldBe ""
+    }
+
+    should("get subdirecotry relationship right") {
+        FileHandlingUtils.isSubDirectory(File("../docs"), File("..")) shouldBe true
+        FileHandlingUtils.isSubDirectory(File(".."), File("../docs")) shouldBe false
+        shouldThrow<AraraException> {
+            FileHandlingUtils.isSubDirectory(File("../LICENSE"), File(".."))
+        }
+        shouldThrow<AraraException> {
+            FileHandlingUtils.isSubDirectory(File(".."), File("../LICENSE"))
+        }
+    }
+
+    should("detect changes on file") {
+        val file = Files.createTempFile(null, null).toFile()
+        val referenceBackup = Arara.config[AraraSpec.Execution.reference]
+        Arara.config[AraraSpec.Execution.reference] = file.parentFile.resolve("reference")
+        FileHandlingUtils.hasChanged(file) shouldBe true
+        FileHandlingUtils.hasChanged(file) shouldBe false
+        file.writeText("QUACK")
+        FileHandlingUtils.hasChanged(file) shouldBe true
+        FileHandlingUtils.hasChanged(file) shouldBe false
+        file.writeText("QUACK2")
+        FileHandlingUtils.hasChanged(file) shouldBe true
+        file.delete()
+        FileHandlingUtils.hasChanged(file) shouldBe true
+        FileHandlingUtils.hasChanged(file) shouldBe false
+        Arara.config[AraraSpec.Execution.reference] = referenceBackup
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtilsTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtilsTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/filehandling/FileSearchingUtilsTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.filehandling
+
+import io.kotlintest.shouldBe
+import io.kotlintest.specs.ShouldSpec
+import java.nio.file.Files
+import java.nio.file.Path
+import kotlin.reflect.full.declaredMemberFunctions
+import kotlin.reflect.jvm.isAccessible
+
+class FileSearchingUtilsTest : ShouldSpec({
+    // TODO: test implicit extensions
+
+    fun prepareFileSystem(): Path {
+        val tempDir = Files.createTempDirectory(System.nanoTime().toString())
+        tempDir.resolve("quack/quack").toFile().mkdirs()
+        listOf("quack", "quack/quack", "quack/quack/quack").forEach {
+            tempDir.resolve("$it.tex").toFile().writeText(" ")
+            tempDir.resolve("$it.txt").toFile().writeText(" ")
+        }
+        return tempDir
+    }
+
+    should("fail looking up inexistent file") {
+        val lookupFile = FileSearchingUtils::class.declaredMemberFunctions
+                .first { it.name == "lookupFile" }
+        lookupFile.isAccessible = true
+        lookupFile.call(FileSearchingUtils, "QUACK") shouldBe null
+    }
+
+    should("fail on existing directory") {
+        val lookupFile = FileSearchingUtils::class.declaredMemberFunctions
+                .first { it.name == "lookupFile" }
+        lookupFile.isAccessible = true
+        lookupFile.call(FileSearchingUtils, "../buildSrc") shouldBe null
+    }
+
+    should("find file by extension") {
+        val tempDir = prepareFileSystem()
+        FileSearchingUtils.listFilesByExtensions(tempDir.toFile(),
+                listOf("tex"), false).toSet() shouldBe
+                setOf(tempDir.resolve("quack.tex").toFile())
+        FileSearchingUtils.listFilesByExtensions(tempDir.toFile(),
+                listOf("tex"), true).toSet() shouldBe
+                listOf("quack", "quack/quack", "quack/quack/quack")
+                        .map { tempDir.resolve("$it.tex").toFile() }.toSet()
+    }
+    should("find file by pattern") {
+        val tempDir = prepareFileSystem()
+        FileSearchingUtils.listFilesByPatterns(tempDir.toFile(),
+                listOf("*q*.txt"), false).toSet() shouldBe
+                setOf(tempDir.resolve("quack.txt").toFile())
+        FileSearchingUtils.listFilesByPatterns(tempDir.toFile(),
+                listOf("q*.txt"), true).toSet() shouldBe
+                listOf("quack", "quack/quack", "quack/quack/quack")
+                        .map { tempDir.resolve("$it.txt").toFile() }.toSet()
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageCoverageTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageCoverageTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageCoverageTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import ch.qos.cal10n.verifier.MessageKeyVerifier
+import io.kotlintest.inspectors.forAll
+import io.kotlintest.matchers.collections.shouldNotBeEmpty
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+import java.io.File
+import java.io.IOException
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.util.Locale
+import java.util.stream.Collectors
+import org.islandoftex.arara.model.AraraException
+
+class LanguageCoverageTest : ShouldSpec({
+    "locale definitions" {
+        /**
+         * Helper method, checks the provided locale (all keys set?).
+         *
+         * @param locale The locale.
+         * @return The size of the error list.
+         */
+        fun check(locale: Locale): Int {
+            val errors = MessageKeyVerifier(Messages::class.java).verify(locale)
+            errors.forEach(System.err::println)
+            return errors.size
+        }
+
+        should("succeed instantiating known locale") {
+            Language("en").locale.language shouldBe "en"
+        }
+        should("throw on unknown locale instantiation") {
+            shouldThrow<AraraException> {
+                Language("quack")
+            }
+        }
+
+        should("not error on known localizations") {
+            listOf("en", "de", "nl", "it").forAll {
+                check(Locale(it)) shouldBe 0
+            }
+            check(Locale("en", "QN")) shouldBe 0
+            check(Locale("pt", "BR")) shouldBe 0
+        }
+    }
+    "language coverage" {
+        /*
+         * Tests the localized messages, checking if all messages are properly
+         * quoted (but not necessarily whether they are loadable).
+         */
+        should("get all strings from every language") {
+            // get all files
+            val files = Files.list(
+                    Paths.get("src/main/resources/org/islandoftex/arara/localization"))
+                    .map { p: Path ->
+                        val f = p.toFile()
+                        if (f.name.endsWith("properties") && !f.isDirectory) f
+                        else null
+                    }
+                    .collect(Collectors.toList())
+                    .toList()
+                    .filterNotNull()
+            files.shouldNotBeEmpty()
+
+            // for each report, print
+            // the corresponding entry
+            files.map { file: File ->
+                try {
+                    LanguageReport.analyze(file)
+                } catch (exception: IOException) {
+                    throw AssertionError(
+                            "Fatal exception: an error was raised while " +
+                                    "trying to read one of the languages. Please " +
+                                    "make sure all languages in the provided " +
+                                    "directory have read permission.")
+                }
+            }.forEach { report ->
+                // debug output
+                println(report.reference.name +
+                        "\t" + String.format(" %2.2f%%", report.coverage))
+
+                // if there are problematic lines,
+                // add the current language report
+                if (report.lines.isNotEmpty()) {
+                    // legend: S = Simple message, single quotes should not be doubled
+                    //         P = Parametrized message, single quotes must be doubled
+
+                    // build the beginning of the line
+                    println(report.reference.name)
+                    // print error lines
+                    println(report.lines)
+                }
+
+                report.coverage shouldBe 100.0f
+            }
+        }
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageReport.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageReport.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageReport.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import java.io.File
+
+/**
+ * Implements the language report model.
+ *
+ * @author Island of TeX
+ * @version 5.0
+ * @since 5.0
+ */
+data class LanguageReport(
+    /**
+     * The file reference.
+     */
+    val reference: File,
+    /**
+     * Total of checked lines.
+     */
+    val total: Int,
+    /**
+     * List of problematic lines and their corresponding error types.
+     */
+    val lines: Map<Int, Char>
+) {
+    /**
+     * Language coverage of the file.
+     */
+    val coverage: Float
+        get() = if (lines.isEmpty()) {
+            100f
+        } else {
+            (1f - lines.size.toFloat() / total) * 100f
+        }
+
+    companion object {
+        /**
+         * Analyzes the list of lines.
+         *
+         * @param file The file to read.
+         * @return The language report.
+         */
+        internal fun analyze(file: File): LanguageReport {
+            // holds the current line number
+            var number = 1
+            // holds the number of checked lines
+            var checked = 0
+
+            // flag that holds the
+            // current analysis
+            var check: Int
+
+            val reportLines = mutableMapOf<Int, Char>()
+
+            // check every line of the language file
+            file.forEachLine { line ->
+                // let's only analyze lines
+                // that are not comments
+                if (!line.trim().startsWith("#")) {
+                    // increment the checked
+                    // line counter
+                    checked++
+
+                    // line is a parametrized message
+                    check = if (line.contains("{0}")) {
+                        // check the corresponding pattern
+                        checkParametrizedMessage(line)
+                    } else {
+                        // check the corresponding pattern
+                        checkMessage(line)
+                    }
+
+                    // we found an error,
+                    // report it
+                    if (check != 0) {
+                        // add line and error type to the report
+                        reportLines[number] = if (check == 1) 'P' else 'S'
+                    }
+                }
+
+                // let's move to the next line
+                number++
+            }
+
+            // return the language report
+            return LanguageReport(
+                    reference = file,
+                    total = checked,
+                    lines = reportLines)
+        }
+
+        /**
+         * Checks if the provided message follows the simple format.
+         *
+         * @param text Message.
+         * @return An integer value.
+         */
+        private fun checkMessage(text: String): Int {
+            var i = 0
+            var c: Char
+            for (element in text) {
+                c = element
+                i = if (c == '\'') {
+                    if (i == 1) {
+                        return 2
+                    } else {
+                        1
+                    }
+                } else {
+                    0
+                }
+            }
+            return 0
+        }
+
+        /**
+         * Checks if the provided message follows the parametrized format.
+         *
+         * @param text Message.
+         * @return An integer value.
+         */
+        private fun checkParametrizedMessage(text: String): Int {
+            var i = 0
+            var c: Char
+            for (element in text) {
+                c = element
+                if (c == '\'') {
+                    i += 1
+                } else {
+                    if (i != 0) {
+                        if (i != 2) {
+                            return 1
+                        } else {
+                            i = 0
+                        }
+                    }
+                }
+            }
+            return 0
+        }
+    }
+}

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/localization/LanguageTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.localization
+
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+import java.util.Locale
+import org.islandoftex.arara.model.AraraException
+
+class LanguageTest : ShouldSpec({
+    should("instantiate with known code") {
+        Language("en").locale shouldBe Locale.ENGLISH
+    }
+
+    should("throw on unknown language") {
+        shouldThrow<AraraException> {
+            Language("quack")
+        }
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/model/SessionTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/model/SessionTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/model/SessionTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.model
+
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldNotThrow
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+
+class SessionTest : ShouldSpec({
+    should("include all environment variables") {
+        Session.clear()
+        Session.updateEnvironmentVariables()
+        Session.contains("environment:PATH") shouldBe true
+    }
+
+    should("properly check existence") {
+        Session.clear()
+        Session.put("A", "B")
+        Session.contains("A") shouldBe true
+        Session.contains("C") shouldBe false
+    }
+
+    should("support insertion") {
+        Session.clear()
+        Session.put("A", "B")
+        Session.contains("A") shouldBe true
+    }
+
+    should("support get") {
+        Session.clear()
+        Session.put("A", "B")
+        Session["A"] shouldBe "B"
+    }
+
+    should("support removal") {
+        Session.clear()
+        Session.put("A", "B")
+        Session.put("C", "D")
+        Session.contains("A") shouldBe true
+        Session.contains("C") shouldBe true
+        Session.remove("A")
+        Session.contains("A") shouldBe false
+        Session.contains("C") shouldBe true
+    }
+
+    should("clear itself") {
+        Session.clear()
+        Session.put("A", "B")
+        Session.put("C", "D")
+        Session.contains("A") shouldBe true
+        Session.contains("C") shouldBe true
+        Session.clear()
+        Session.contains("A") shouldBe false
+        Session.contains("C") shouldBe false
+    }
+
+    should("throw on unknown removal") {
+        Session.clear()
+        Session.put("A", "B")
+        shouldNotThrow<AraraException> {
+            Session.remove("A")
+        }
+        shouldThrow<AraraException> {
+            Session.remove("C")
+        }
+    }
+
+    should("throw on unknown getter") {
+        Session.clear()
+        Session.put("A", "B")
+        Session["A"] shouldBe "B"
+        shouldThrow<AraraException> {
+            Session["C"]
+        }
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/CommonUtilsTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/CommonUtilsTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/CommonUtilsTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import io.kotlintest.shouldBe
+import io.kotlintest.specs.ShouldSpec
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.localization.Language
+
+class CommonUtilsTest : ShouldSpec({
+    should("format bytes correctly") {
+        Arara.config[AraraSpec.Execution.language] = Language("en")
+        mapOf(800 to "800 B",
+                1000 to "1.0 kB",
+                1024 to "1.0 kB",
+                1000000 to "1.0 MB").forEach { (key, value) ->
+            CommonUtils.byteSizeToString(key.toLong()) shouldBe value
+        }
+    }
+
+    should("find system utils") {
+        CommonUtils.isOnPath("echo") shouldBe true
+    }
+    should("not find utils with fantasy name") {
+        // hopefully no one will have such a command in the path…
+        CommonUtils.isOnPath("echoQuackForArara") shouldBe false
+    }
+
+    should("flatten lists correctly") {
+        CommonUtils.flatten(listOf(1, 2, listOf(3, 4, listOf(5, 6))))
+                .toSet() shouldBe (setOf(1, 2, 3, 4, 5, 6) as Set<Any>)
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExecutionTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExecutionTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExecutionTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,139 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import io.kotlintest.DoNotParallelize
+import io.kotlintest.matchers.string.shouldContain
+import io.kotlintest.matchers.string.shouldNotContain
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldNotBe
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.io.PrintStream
+import java.nio.file.Paths
+import kotlin.time.ExperimentalTime
+import org.islandoftex.arara.Arara
+import org.islandoftex.arara.configuration.AraraSpec
+import org.islandoftex.arara.configuration.Configuration
+import org.islandoftex.arara.filehandling.FileSearchingUtils
+import org.islandoftex.arara.model.AraraException
+import org.islandoftex.arara.model.Extractor
+import org.islandoftex.arara.model.Interpreter
+import org.islandoftex.arara.ruleset.DirectiveUtils
+
+ at ExperimentalTime
+ at DoNotParallelize
+class ExecutionTest : ShouldSpec({
+    fun getPathForTest(name: String): String = "src/test/resources/executiontests/$name"
+    fun outputForTest(testName: String, fileName: String = "$testName.tex"):
+            String {
+        val sysout = System.out
+        val output = ByteArrayOutputStream()
+        try {
+            System.setOut(PrintStream(output))
+            Arara.config[AraraSpec.Execution.workingDirectory] =
+                    Paths.get(getPathForTest(testName))
+            Configuration.load()
+            Arara.config[AraraSpec.Execution.verbose] = true
+            FileSearchingUtils.discoverFile(fileName)
+            val directives = DirectiveUtils.process(Extractor.extract(
+                    File("${getPathForTest(testName)}/$fileName")))
+            Interpreter(directives).execute()
+            return output.toByteArray().toString(Charsets.UTF_8)
+        } catch (ex: Exception) {
+            throw ex
+        } finally {
+            System.setOut(sysout)
+            output.close()
+        }
+    }
+
+    should("be able to store variables sessions") {
+        outputForTest("sessions") shouldContain "MeowQuack"
+    }
+
+    should("honor falsy existence test") {
+        val file = File(getPathForTest("conditionals") + "/conditionals.quack")
+        if (file.exists()) file.delete()
+        val output = outputForTest("conditionals")
+        output shouldContain "QuackOne"
+        output shouldContain "QuackFour"
+        output shouldNotContain "QuackTwo"
+        output shouldNotContain "QuackThree"
+    }
+    should("honor truthy existence (falsy contains) test") {
+        val file = File(getPathForTest("conditionals") + "/conditionals.quack")
+        file.writeText("Meow")
+        val output = outputForTest("conditionals")
+        file.delete()
+        output shouldContain "QuackOne"
+        output shouldContain "QuackFour"
+        output shouldContain "QuackTwo"
+        output shouldNotContain "QuackThree"
+    }
+    should("honor truthy contains test") {
+        val file = File(getPathForTest("conditionals") + "/conditionals.quack")
+        file.writeText("Duck")
+        val output = outputForTest("conditionals")
+        file.delete()
+        output shouldContain "QuackOne"
+        output shouldContain "QuackFour"
+        output shouldContain "QuackTwo"
+        output shouldContain "QuackThree"
+    }
+
+    should("track changes") {
+        val file = File(getPathForTest("changes") + "/arara.yaml")
+        if (file.exists()) file.delete()
+        outputForTest("changes") shouldContain "QuackOne"
+        outputForTest("changes") shouldNotContain "QuackOne"
+    }
+
+    should("gracefully halt on halt rule") {
+        val output = outputForTest("halt")
+        output shouldContain "QuackOne"
+        output shouldNotContain "QuackTwo"
+        CommonUtils.exitStatus shouldBe 0
+    }
+    should("forcefully halt on halt error rule") {
+        val output = outputForTest("halt-error")
+        output shouldContain "QuackOne"
+        output shouldNotContain "QuackTwo"
+        CommonUtils.exitStatus shouldNotBe 0
+    }
+
+    should("fail on invalid config") {
+        val exception = shouldThrow<AraraException> {
+            outputForTest("invalid-config")
+        }
+        exception.message shouldContain "could not parse the configuration"
+    }
+
+    should("read foreign extension") {
+        val output = outputForTest("foreign-extension", "foreign-extension.my")
+        output shouldContain "QuackOne"
+    }
+    should("fail on unknown extension") {
+        shouldThrow<AraraException> {
+            outputForTest("foreign-extension", "foreign-extension.xy")
+        }
+    }
+    should("accept empty pattern on known extension") {
+        val output = outputForTest("known-extension")
+        output shouldContain "QuackOne"
+    }
+
+    should("execute option-less directives") {
+        val output = outputForTest("simple-directive")
+        output shouldContain "The echoer"
+        output shouldContain "SUCCESS"
+    }
+    should("execute directive with options") {
+        val output = outputForTest("directive-with-options")
+        output shouldContain "The echoer"
+        output shouldContain "batchmode"
+        output shouldContain "SUCCESS"
+        output shouldNotContain "FAILURE"
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExtensionTest.kt
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExtensionTest.kt	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/kotlin/org/islandoftex/arara/utils/ExtensionTest.kt	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: BSD-3-Clause
+package org.islandoftex.arara.utils
+
+import io.kotlintest.shouldBe
+import io.kotlintest.shouldThrow
+import io.kotlintest.specs.ShouldSpec
+
+class ExtensionTest : ShouldSpec({
+    should("abbreviate strings correctly") {
+        "Quack quack".abbreviate(6) shouldBe "Quack…"
+        "Quack Quack".abbreviate(80) shouldBe "Quack Quack"
+        shouldThrow<IllegalArgumentException> { "Quack".abbreviate(1) }
+    }
+
+    should("center strings correctly") {
+        "Quack".center(3, '-') shouldBe "Quack"
+        "Quack".center(9, '-') shouldBe "--Quack--"
+    }
+
+    should("wrap strings correctly") {
+        "This text should be wrapped".wrap(10) shouldBe "This text\nshould be\nwrapped"
+    }
+})

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arara.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arara.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arara.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!database
+map:
+  "/home/paulo/Projetos/arara/application/src/test/resources/executiontests/changes/changes.tex": "404aaef6"
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/changes.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/changes.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/changes.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: echoone if changed('tex')
+Quack
+\bye


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/changes.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/changes/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/conditionals.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/conditionals.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/conditionals.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,6 @@
+% arara: echoone
+% arara: echotwo if exists('quack')
+% arara: echothree if (exists('quack') && found('quack', 'Duck'))
+% arara: echofour
+Quack
+\bye


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/conditionals.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echofour.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echofour.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echofour.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echofour
+name: Test rule for conditionals 4
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackFour');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echothree.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echothree.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echothree.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echothree
+name: Test rule for conditionals 3
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackThree');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echotwo.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echotwo.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/conditionals/echotwo.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echotwo
+name: Test rule for conditionals 2
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackTwo');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/directive-with-options.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/directive-with-options.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/directive-with-options.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,6 @@
+% arara: echoone: { interaction: batchmode }
+% arara: echoone: { synctex: 1 }
+% arara: echoone: { synctex: yes }
+% arara: echoone: { extensions: [aux, log, pdf] }
+Quack
+\bye


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/directive-with-options.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/directive-with-options/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,36 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne', interaction, synctex);
+      }
+arguments:
+- identifier: interaction
+  flag: >
+    @{
+        if ([ 'batchmode', 'nonstopmode', 'scrollmode',
+              'errorstopmode' ].contains(parameters.interaction)) {
+            return '--interaction='.concat(parameters.interaction);
+        }
+        else {
+            throwError('The provided interaction value is not valid.');
+        }
+    }
+- identifier: synctex
+  flag: >
+    @{
+        isTrue(parameters.synctex, '--synctex=1', '--synctex=0')
+    }
+- identifier: extensions
+  flag: >
+    @{
+        if (isList(parameters.extensions)) {
+            return parameters.extensions;
+        }
+        else {
+            throwError('I was expecting a list of extensions.');
+        }
+    }

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,6 @@
+!config
+paths:
+  - './'
+filetypes:
+  - extension: my
+    pattern: ^\s*%\s+
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.my
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.my	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.my	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: echoone
+Quack
+\bye
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.xy
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.xy	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/foreign-extension/foreign-extension.xy	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: echoone
+Quack
+\bye
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echotwo.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echotwo.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/echotwo.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echotwo
+name: Test rule for conditionals 2
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackTwo');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,5 @@
+% arara: echoone
+% arara: halt
+% arara: echotwo
+Quack
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,19 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2020, Island of TeX 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: halt
+name: Halt
+authors:
+- Heiko Oberdiek
+- Island of TeX
+commands:
+- name: The halt trigger
+  command: >
+    @{
+        halt(0);
+        return true;
+    }
+arguments: []


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt/halt.yaml
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echotwo.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echotwo.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/echotwo.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echotwo
+name: Test rule for conditionals 2
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackTwo');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt-error.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt-error.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt-error.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,5 @@
+% arara: echoone
+% arara: halt
+% arara: echotwo
+Quack
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt-error.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/halt-error/halt.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,16 @@
+!config
+# Arara, the cool TeX automation tool
+# Copyright (c) 2018, Paulo Roberto Massa Cereda 
+# All rights reserved.
+#
+# This rule is part of arara.
+identifier: halt
+name: Halt
+commands:
+  - name: The halt trigger
+    command: >
+      @{
+          halt(1);
+          return true;
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,2 @@
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/invalid-config.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/invalid-config.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/invalid-config.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: pdftex
+Quack
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/invalid-config/invalid-config.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,5 @@
+!config
+paths:
+  - './'
+filetypes:
+  - extension: tex
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/known-extension.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/known-extension.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/known-extension.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: echoone
+Quack
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/known-extension/known-extension.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessionrule.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessionrule.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessionrule.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,16 @@
+!config
+identifier: sessionrule
+name: Test rule for sessions
+commands:
+  - name: The echoer
+    command: >
+      @{
+          getSession().put('quack', 'Quack');
+          return getCommand('echo', 'Quack');
+      }
+  - name: The echoer mark II
+    command: >
+      @{
+          return getCommand('echo', 'Meow' + getSession().get('quack'));
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessions.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessions.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessions.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: sessionrule
+Quack
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/sessions/sessions.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/arararc.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/arararc.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/arararc.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+!config
+paths:
+  - './'
\ No newline at end of file

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/echoone.yaml
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/echoone.yaml	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/echoone.yaml	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,10 @@
+!config
+identifier: echoone
+name: Test rule for conditionals 1
+commands:
+  - name: The echoer
+    command: >
+      @{
+          return getCommand('echo', 'QuackOne');
+      }
+arguments: []

Added: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/simple-directive.tex
===================================================================
--- trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/simple-directive.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/simple-directive.tex	2020-03-05 00:49:50 UTC (rev 54089)
@@ -0,0 +1,3 @@
+% arara: echoone
+Quack
+\bye


Property changes on: trunk/Master/texmf-dist/source/support/arara/src/test/resources/executiontests/simple-directive/simple-directive.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the tex-live-commits mailing list.