diff options
author | Karl Berry <karl@freefriends.org> | 2013-02-05 23:00:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-02-05 23:00:15 +0000 |
commit | 5951dc20b924b01da871a6b772f7cd30f66e07fd (patch) | |
tree | 6df25558e8efc9d7e28ce858f1ef7866bd567702 /Master | |
parent | b5620e0b06e34b0db7481f8b3c6417c6e8b13c1a (diff) |
arara (6feb13)
git-svn-id: svn://tug.org/texlive/trunk@29036 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
115 files changed, 11979 insertions, 1 deletions
diff --git a/Master/bin/alpha-linux/arara b/Master/bin/alpha-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/alpha-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/amd64-freebsd/arara b/Master/bin/amd64-freebsd/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/amd64-freebsd/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/amd64-kfreebsd/arara b/Master/bin/amd64-kfreebsd/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/amd64-kfreebsd/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/armel-linux/arara b/Master/bin/armel-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/armel-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/i386-cygwin/arara b/Master/bin/i386-cygwin/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/i386-cygwin/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/i386-freebsd/arara b/Master/bin/i386-freebsd/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/i386-freebsd/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/i386-kfreebsd/arara b/Master/bin/i386-kfreebsd/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/i386-kfreebsd/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/i386-linux/arara b/Master/bin/i386-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/i386-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/i386-solaris/arara b/Master/bin/i386-solaris/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/i386-solaris/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/mipsel-linux/arara b/Master/bin/mipsel-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/mipsel-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/powerpc-aix/arara b/Master/bin/powerpc-aix/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/powerpc-aix/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/powerpc-linux/arara b/Master/bin/powerpc-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/powerpc-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/sparc-solaris/arara b/Master/bin/sparc-solaris/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/sparc-solaris/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/universal-darwin/arara b/Master/bin/universal-darwin/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/universal-darwin/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/x86_64-darwin/arara b/Master/bin/x86_64-darwin/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/x86_64-darwin/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/x86_64-linux/arara b/Master/bin/x86_64-linux/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/x86_64-linux/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/bin/x86_64-solaris/arara b/Master/bin/x86_64-solaris/arara new file mode 120000 index 00000000000..2e51fc5fe48 --- /dev/null +++ b/Master/bin/x86_64-solaris/arara @@ -0,0 +1 @@ +../../texmf-dist/scripts/arara/arara.sh
\ No newline at end of file diff --git a/Master/texmf-dist/doc/support/arara/README b/Master/texmf-dist/doc/support/arara/README new file mode 100644 index 00000000000..5ce0a415000 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/README @@ -0,0 +1,18 @@ +arara -- the cool TeX automation tool +===================================== + +Copyright (c) 2012, Paulo Roberto Massa Cereda +- cereda at users dot sf dot net + +About +===== + +arara is a TeX automation tool based on rules and +directives. It gives you subsidies to enhance your +TeX experience. + +License +======= + +This application is licensed under the New BSD +License. diff --git a/Master/texmf-dist/doc/support/arara/arara-usermanual.pdf b/Master/texmf-dist/doc/support/arara/arara-usermanual.pdf Binary files differnew file mode 100644 index 00000000000..92e76e22612 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/arara-usermanual.pdf diff --git a/Master/texmf-dist/doc/support/arara/arara-usermanual.tex b/Master/texmf-dist/doc/support/arara/arara-usermanual.tex new file mode 100644 index 00000000000..7817cabc86e --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/arara-usermanual.tex @@ -0,0 +1,3498 @@ +% arara: pdflatex +% arara: pdflatex +% arara: biber +% arara: pdflatex +% arara: pdflatex +% arara: clean: { files: [ arara-usermanual.aux, arara-usermanual.bbl ] } +% arara: clean: { files: [ arara-usermanual.bcf, arara-usermanual.cod ] } +% arara: clean: { files: [ arara-usermanual.blg, arara-usermanual.lof ] } +% arara: clean: { files: [ arara-usermanual.lot, arara-usermanual.out ] } +% arara: clean: { files: [ arara-usermanual.toc, arara-usermanual.log ] } +% arara: clean: { files: [ arara-usermanual.run.xml ] } +% ------------------------------------------------- +% 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. +% ------------------------------------------------- + +\documentclass[a4paper,twoside,12pt]{memoir} + +% packages +% ------------------------------------------------- +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{arara} +% ------------------------------------------------- + +% bibliography +% ------------------------------------------------- +\addbibresource{references.bib} +% ------------------------------------------------- + +% current version +% ------------------------------------------------- +\newcommand{\araraversion}{3.0} +% ------------------------------------------------- + +% document +% ------------------------------------------------- +\begin{document} + +% title page +% ------------------------------------------------- +\begin{titlingpage} + +\begin{center} +\vspace*{2em} + +\scalebox{1.15}{\araralogo} + +\vspace{2em} + +{\color{araracolor}\fontfamily{fco}\bfseries\Huge The cool \TeX{} automation tool} + +\vspace{10em} + +{\Huge\sffamily\bfseries User Manual} + +\vspace{3em} + +{\large +\tabcolsep=1em +\begin{tabular}{cc} +\multicolumn{2}{c}{Paulo R.\ M.\ Cereda}\\ +\multicolumn{2}{c}{\url{cereda@users.sf.net}}\\[1.5em] +Marco Daniel & Brent Longborough\\ +\url{marco.daniel@mada-nada.de} & \url{brent@longborough.org} +\end{tabular}} + +\vfill + +{\LARGE\sffamily\bfseries Version \araraversion} + +\end{center} + +\end{titlingpage} +% ------------------------------------------------- + +% set styles +% ------------------------------------------------- +\chapterstyle{madsen} +\pagestyle{headings} +\frontmatter +\nouppercaseheads +% ------------------------------------------------- + +% Prologue +% ------------------------------------------------- +\chapter*{Prologue} +\label{chap:prologue} + +\epigraph{\emph{Moral of the story: never read the documentation, bad things happen.}}{David Carlisle} + +When I released the very first version of \arara on a Friday 13th, April 2012, I never thought the tool would +receive so many positive comments and feedback. To be honest, since \arara was written for helping me +with my own personal \LaTeX\ projects, I really doubted if the tool could be of service to anyone else. And, +to my surprise, it seems \arara did good. To a lot of people around the \TeX\ world. + +I never intended to release the tool to the whole world, since I wasn't sure if other people could benefit from +\arara's features. After all, there's already a plethora of tools available to the \TeX\ community in general, +although with different approaches. The reason I decided to make \arara publicly available is quite simple: +I wanted to somehow contribute to the \TeX\ community, and I wanted to give my best to make such +community even more awesome. + +As time goes by, I'm quite satisfied with the current state of \arara~--~this is our 3rd major release. We +have reached a very mature code and a great team of developers, translators and testers. Since version 1.0, +the code evolved a lot -- new features, lots of bug fixes, improvements -- thanks to all the feedback I +received. In my humble opinion, that's how any project should evolve: based on what our users expect and +want to achieve. I'm proud to see \arara being 100\% community-driven, it's a big achievement for a project +with less than one year old. + +First of all, I'd like to thank some friends of mine that really made \arara possible: Alan Munn, for providing +great ideas and suggestions to the manual; Andrew Stacey, for heavily testing \arara, providing great user +cases, and for suggesting improvements to the program; Brent Longborough, a member of the core team, +for providing great suggestions and ideas to the program logic, writing rules, testing the code and also for +working with the Portuguese and Turkish translations; Clemens Niederberger, for testing \arara, and also +writing a great tutorial about it in his +\href{http://www.mychemistry.eu/2012/06/arara-automate-latex-birds-music/}{blog on chemistry and \LaTeX}; +David Carlisle, for reminding me to work on \arara, and also encouraging me to write answers about it in +our \TeX\ community; Enrico Gregorio, for reviewing the original manual, testing \arara, providing great +ideas and suggestions to the manual and to the program itself, and for working with the Italian translation; +Francesco Endrici, for providing the very first \arara rule outside our core team; Harish Kumar, for being a +heavy \arara user and integrating it with WinEdt and Inlage; \.Ilhan Polat for working with Brent in the Turkish +translation; Joseph Wright, for testing it, providing contributed code for Linux and Mac installations, and also +blogging about \arara in his \href{http://www.texdev.net}{personal blog}; Gonzalo Medina, for providing the +Spanish translation; Mikaël Maunier, for providing the French translation; Marco Daniel, one of core team +members, for heavily testing \arara, suggesting enhancements to the manual and to the program itself, +providing lots of contributed rules for common tasks, and also for the German version; Patrick Gundlach, +for advertising \arara in the official Twitter channel of \href{http://www.dante.de}{Dante} -- the German +\TeX\ User Group; Sergey Ulyanov, for providing the Russian translation and contributed rules; Stefan Kottwitz, +for encouraging me to write an article about \arara, published in the +\href{http://latex-community.org/know-how/435-gnuplot-arara}{\LaTeX\ Community} forum, and also +tweeting about it. Thank you very much. I'm sorry if I forgot to mention somebody, I really have so much +people to thank and my memory happens to be very short. + +That said, I still believe that the warning featured in the first version of this manual still applies: +\textsc{Hic Sunt Dracones}. Though the code really evolved from the first commit I made, \arara is far from +being bug-free. And you will learn that \arara gives you enough rope. In other words, \emph{you} will be +responsible for how \arara behaves and all the consequences from your actions. Sorry to sound scary, but I +really needed to tell you this. After all, one of \arara's greatest features is the freedom it offers. But as you +know, freedom always comes at a cost. Please, don't send us angry letters -- or e-mails, perhaps -- if +something bad happen. + +Feedback is surely welcome for me to improve this humble tool, just write an e-mail to me or any other +member of the team and we will reply as soon as possible. The source code is fully available at +\url{http://github.com/cereda/arara}, feel free to contribute to the project by forking it, submitting bugs, +sending pull requests or even translating it to your language. If you want to support the \LaTeX\ development +by a donation, the best way to do this is donating to the \href{http://www.tug.org/}{\TeX\ Users Group}. +Please also consider joining our \TeX\ community at \href{http://tex.stackexchange.com}{StackExchange}. + +\vspace{2em} + +\begin{flushright} +Paulo Roberto Massa Cereda\\ +\emph{on behalf of the \arara team} +\end{flushright} + +%\vspace{8em} +\vfill + +\begin{center} +\scalebox{0.55}{\araralogo} + +\vspace{0.3em} + +{\color{araracolor}\fontfamily{fco}\bfseries\large Proudly made on Earth} +\end{center} +% ------------------------------------------------- + +\cleardoublepage + +% Special thanks +% ------------------------------------------------- +\section*{Special thanks} + +\begin{mdframed}[roundcorner=10pt,linecolor=araracolor,middlelinewidth=1pt] +\centering +{\renewcommand{\arraystretch}{1.5} +\sffamily +\begin{tabular}{ccc} +Alan Munn & Andrew Stacey & Brent Longborough\\ +Clemens Niederberger & David Carlisle & Enrico Gregorio\\ +Francesco Endrici & Harish Kumar & \.Ilhan Polat\\ +Joseph Wright & Gonzalo Medina & Mikaël Maunier\\ +Marco Daniel & Patrick Gundlach & Sergey Ulyanov\\ +Stefan Kottwitz & & +\end{tabular}} +\end{mdframed} + +\vspace{1em} + +\noindent\arara also makes use of some specific opensource Java projects and libraries in order to properly +work. I would like to thank the following projects and their respective developers: + +\begin{enumerate} +\item \href{http://commons.apache.org}{Apache Commons}, a project from the Apache Foundation focused +on all aspects of reusable Java components. \arara uses three of the Commons libraries: +\href{http://commons.apache.org/cli/}{CLI}, which provides a command line arguments parser, +\href{http://commons.apache.org/collections/}{Collections}, a library which extends the Java Collections +Framework, and \href{http://commons.apache.org/exec/}{Exec}, an API for dealing with external process +execution and environment management in Java. + +\item \href{http://logback.qos.ch}{Logback}, a logging framework intended to be the successor to the +popular \href{http://logging.apache.org/log4j/}{log4j} project. According to some benchmarks, it is faster +and has a smaller footprint than all existing logging systems, sometimes by a wide margin. + +\item \href{http://code.google.com/p/snakeyaml}{SnakeYAML}, a YAML parser and emitter for the Java +programming language. YAML is a data serialization format designed for human readability and interaction +with scripting languages. \arara uses YAML as the rule format. + +\item \href{http://www.slf4j.org/}{SLF4J}, a simple facade or abstraction for various logging frameworks, +allowing the end user to plug in the desired logging framework at deployment time. + +\item \href{http://mvel.codehaus.org}{MVEL}, a powerful expression language for Java-based applications. +It provides a plethora of features and is suited for everything from the smallest property binding and extraction, +to full blown scripts. \arara relies on MVEL to provide the expansion mechanism for rules. + +\item \href{http://maven.apache.org/}{Apache Maven}, a software project management and comprehension tool. +Based on the concept of a project object model, Maven can manage a project's build, reporting and documentation +from a central piece of information. + +\item \href{http://izpack.github.com}{IzPack}, a Java-based software installer builder that will run on any +operating system coming with a Java Virtual Machine that is compliant with the Oracle JVM 1.5 or higher. +\end{enumerate} + +A special thanks goes to my great friend \href{http://antoineneveux.fr/}{Antoine Neveux} for encouraging me to +try out the \href{http://maven.apache.org}{Apache Maven} software project management. In the past, \arara was +released as a NetBeans project, which is based on \href{http://ant.apache.org/}{Apache Ant}, another great tool +from the Apache Foundation. Although I'm really fine with Ant, thanks to Maven, now it is way easier to build and +to maintain the code. And it's always nice to learn another tool. + +And at last but not least, I want to thank you, dear reader and potential user, for giving \arara a try. Do not despair +if you don't succeed with \arara at first; just try again. I'm sure you will find your way. This humble project is +opensource and it will always be. Let the bird be your guide through the journey to the typographic land. Have a +good read. +% ------------------------------------------------- + +\cleardoublepage + +% Release information +% ------------------------------------------------- +\section*{Release information} + +\subsection*{Version 3.0} +\begin{itemize} +\item[\newfeature] Localizated messages in English, Brazilian Portuguese, German, Italian, Spanish, French, Turkish and Russian. +\item[\bugfix] Improved error analysis for rules and directives. +\item[\newfeature] Friendly and very detailed messages instead of generic ones. +\item[\newfeature] An optional configuration file is now available in order to customize and enhance the application behaviour. +\item[\bugfix] Improved rule syntax, new keys added. +\item[\newfeature] Now rules are unified in a plain format. No more compiled rules. +\item[\newfeature] Rules can allow an arbitrary number of commands instead of just one. +\item[\newfeature] Built-in functions in the rule context to ease the writing process. +\item[\bugfix] Improved expansion mechanism. +\end{itemize} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[ht] +\centering +\caption{Lines of code for version 3.0.} +\begin{tabular}{lrrrr} +\hline +\textbf{Language} & \textbf{Files} & \textbf{Blank} & \textbf{Comment} & \textbf{Code}\\ +\hline +\hline +Java & 25 & 847 & 2722 & 1659\\ +XML & 2 & 12 & 0 & 181\\ +\hline +Sum & 27 & 859 & 2722 & 1840\\ +\hline +\end{tabular} +\label{tab:locarara30} +\end{table}} + +\subsection*{Version 2.0} +\begin{itemize} +\item[\newfeature] + Added the |--timeout n| flag to allow setting a timeout for every task. If + the timeout is reached before the task ends, \arara will kill it and + interrupt the processing. The $n$ value is expressed in milliseconds. +\item[\bugfix] + Fixed the |--verbose| flag to behave as a realtime output. +\item[\newfeature] + There's no need of noninteractive commands anymore. \arara can now handle + user input through the |--verbose| tag. If the flag is not set and the + command requires user interaction, the task execution is interrupted. +\item[\bugfix] + Fixed the execution of some script-based system commands to ensure + cross-platform compatibility. +\item[\newfeature] + Added the |@{SystemUtils}| orb tag to provide specific operating system + checks. The orb tag maps the |SystemUtils| class from the amazing + \href{http://commons.apache.org/lang/}{Apache Commons Lang} library and + all of its methods and properties. +\end{itemize} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[ht] +\centering +\caption{Lines of code for version 2.0.} +\begin{tabular}{lrrrr} +\hline +\textbf{Language} & \textbf{Files} & \textbf{Blank} & \textbf{Comment} & \textbf{Code}\\ +\hline +\hline +Java & 20 & 608 & 1642 & 848\\ +XML & 1 & 0 & 0 & 12\\ +\hline +Sum & 21 & 608 & 1642 & 860\\ +\hline +\end{tabular} +\label{tab:locarara20} +\end{table}} + +\subsection*{Version 1.0.1} + +\begin{itemize} +\item[\newfeature] + Added support for |.tex|, |.dtx| and |.ltx| files. When no extension is + provided, \arara will automatically look for these extensions in this + specific order. +\item[\newfeature] + Added the |--verbose| flag to allow printing the complete log in the + terminal. A short |-v| tag is also available. Both |stdout| and |stderr| + are printed. +\item[\bugfix] + Fixed exit status when an exception is thrown. Now \arara also returns a + non-zero exit status when something wrong happened. Note that this + behaviour happens only when \arara is processing a file. +\end{itemize} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[ht] +\centering +\caption{Lines of code for version 1.0.1.} +\begin{tabular}{lrrrr} +\hline +\textbf{Language} & \textbf{Files} & \textbf{Blank} & \textbf{Comment} & \textbf{Code}\\ +\hline +\hline +Java & 20 & 585 & 1671 & 804\\ +XML & 1 & 0 & 6 & 12\\ +\hline +Sum & 21 & 585 & 1677 & 816\\ +\hline +\end{tabular} +\label{tab:locarara101} +\end{table}} + +\subsection*{Version 1.0} + +\begin{itemize} +\item[\newfeature] First public release. +\end{itemize} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[ht] +\centering +\caption{Lines of code for version 1.0.} +\begin{tabular}{lrrrr} +\hline +\textbf{Language} & \textbf{Files} & \textbf{Blank} & \textbf{Comment} & \textbf{Code}\\ +\hline +\hline +Java & 20 & 524 & 1787 & 722\\ +XML & 1 & 0 & 6 & 12\\ +\hline +Sum & 21 & 524 & 1793 & 734\\ +\hline +\end{tabular} +\label{tab:locarara10} +\end{table}} +% ------------------------------------------------- + +\cleardoublepage + +% License +% ------------------------------------------------- +\section*{License} +\label{sec:license} + +\arara is licensed under the +\href{http://www.opensource.org/licenses/bsd-license.php}{New BSD License}. It's +important to observe that the New BSD License has been verified as a +GPL-compatible free software license by the +\href{http://www.fsf.org/}{Free Software Foundation}, and has been vetted as an +open source license by the +\href{http://www.opensource.org/}{Open Source Initiative}. + +\vspace{1.5em} + +\ornamentline + +\vfill + +\begin{mdframed}[roundcorner=10pt,linecolor=araracolor,middlelinewidth=1pt] +\noindent +\begingroup + \color{araracolor}\fontfamily{fco}\bfseries + \arara \ -- the cool \TeX{} automation tool +\endgroup + +\vspace{.5em} + +\noindent Copyright \copyright{} 2012, Paulo Roberto Massa Cereda + +\noindent All rights reserved. + +\vspace{1em} + +\noindent Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +\vspace{1em} + +\begin{itemize} +\item Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +\item 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. +\end{itemize} + +\vspace{1em} + +\noindent\textsc{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.} +\end{mdframed} +% ------------------------------------------------- + +\cleardoublepage + +\vspace*{25em} + +\begin{flushright} +\em To my cat Fubá, who loves birds. +\end{flushright} + +\cleardoublepage + +% TOC and list of codes +% ------------------------------------------------- +\tableofcontents* + +\cleardoublepage + +\listoffigures* + +\cleardoublepage + +\listoftables* + +\cleardoublepage + +\listofcodes* +% ------------------------------------------------- + +\mainmatter + +\part{The application} +\label{part:application} + +\chapter{Introduction} +\label{chap:introduction} + +\epigraph{\emph{You can do such a lot with a Wompom, you can use every part of it too. +For work or for pleasure, it's a triumph, it's a treasure, +oh there's nothing that a Wompom cannot do.}}{Flanders \& Swann} + +Hello there, welcome to \arara! I'm glad you were not intimidated by the threatening +message in the prologue. This chapter is actually a quick introduction to what you +can expect from \arara. Don't be afraid, it will be easy to digest, I promise. + +\section{What is \texorpdfstring{\arara}{arara}?} +\label{sec:whatisarara} + +Good question! \arara is a \TeX\ automation tool based on rules and directives. It is, +in some aspects, similar to other well-known tools like |latexmk|~\cite{collins:2001} +and |rubber|~\cite{rubber:2009}. The key difference might be the fact that \arara +aims at explicit instructions in the source code in order to determine what to do instead +of relying on other resources, such as log file analysis. It's a different approach for an automation tool, and +we have both advantages and disadvantages of such decision. Let's talk about +disadvantages first. + +Since we need to explicitly tell \arara what we want it to do, it might not be intuitive +for casual users. Tools like |latexmk| and |rubber| rely on a analysis scheme in which +the document is generated with a simple call to |latexmk mydoc.tex| or |rubber --pdf mydoc.tex|, +while a similar call to |arara mydoc.tex| does absolutely nothing; it's not wrong, it's by design: +\arara needs to know what you want. We do this by adding a directive in our |.tex| file, as shown +in line~1 of Code~\ref{code:hellolatex}. Don't worry with the terms now, we will come back to the +concepts later on in this manual, in Chapter~\ref{chap:importantconcepts}. + +\begin{code}[htbp] +\caption{\mycmd{mydoc.tex}} +\label{code:hellolatex} +\begin{latex} +% (*@@*)arara: pdflatex +\documentclass{article} + +\begin{document} +Hello world. +\end{document} +\end{latex} +\end{code} + +When we add a directive in our source code, we are explicitly telling \arara what we want it to do, +but I'm afraid that's not sufficient. So far, \arara knows \emph{what} to do, but now it needs to know +\emph{how} the task should be done. Then, for every directive, we need to have an associated rule. +In other words, if we want \arara to run |pdflatex| on |mydoc.tex|, we need to have a set of instructions +which tells our tool how to run that specific application. 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 hardcoded, +making the automation process even more transparent. + +Now, let's talk about some advantages. In my humble opinion, since \arara doesn't 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 easily. +Maybe \arara's verbosity on automation steps might not be suitable for small documents, but the tool +really shines when you have a document which needs full control of the automation process. + +Another advantage that comes to my mind right now is the fact that directives and rules can be parametrized. +In other words, you can create conditional branches, execution workflows based on parameters, flags, and so +on, by simply providing a parameter in a directive. Besides, \arara also provides a lot of helper functions +in order to enhance rules; for example, you can have a rule which executes a certain command when in Windows, +and a different one when in Unix. + +The rules are written in a human-readable format. The reason for this decision came as an attempt to simplify +the life of many casual users which are not versed into programming. Sadly, writing complex XML mappings or +even deliberately injecting code into an application is not a trivial task, so we opted for an easy way of declaring +the set of instructions that tells \arara how to do a task. We will discuss about the format later on, in Section~\ref{sec:rules}. + +Now that \arara was properly introduced, let me explain the meaning of the name. \emph{Arara} is the Brazilian +name of a macaw bird (Figure~\ref{fig:arara}). Have you ever watched \emph{Rio: the movie}, produced by Blue +Sky Studios? The protagonist is a blue arara. The word \emph{arara} comes from the Tupian word \emph{a'rara}, +which means \emph{big bird}~\cite{tupi:2012}. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.6]{figures/arara.png} +\caption{A lovely photo of an arara.} +\label{fig:arara} +\end{figure} + +Lovely bird, isn't it? Now, you are probably wondering why I chose this name. Well, araras are colorful, noisy, +naughty and very funny. Everybody loves araras. So why can't you love a tool with the very same name? And +there is also another motivation of the name \emph{arara}: the chatroom residents of +\href{http://chat.stackexchange.com/rooms/41}{\TeX.sx} -- including myself -- are fans of palindromes, +especially palindromic numbers. As you can already tell, \emph{arara} is a palindrome. + +\section{How does it work?} +\label{sec:howdoesitwork} + +Now that we know what \arara is, let's take a look on how the tool actually works. The whole idea is pretty +straightforward, but some concepts might be confusing at first. Do not despair, we will come back to +them later on in the manual, in Chapter~\ref{chap:importantconcepts}. + +First of all, we need to add at least one instruction in the source code to tell \arara what to do. This instruction +is named \emph{directive} and it will be parsed during the preparation phase. By default, an \arara directive is +defined in a line of its own, started with a comment, followed by the word |arara:| and the name of the task. +Code~\ref{code:hellolatex} has one directive, referencing |pdflatex|. It's important to observe that |pdflatex| +is not the command to be executed, but the name of the rule associated with that directive. + +Once \arara finds a directive, it will look for the associated \emph{rule}. In our example, it will look for a rule named +|pdflatex| which will evidently run the |pdflatex| command line application. The rule is analyzed, all possible +parameters are defined, the command line call is built and then it goes to a queue of commands to be executed. + +After extracting all directives from a source code and mapping each one of them to their respective rules, \arara +then executes the queue of commands. The execution chain requires that the command $i$ was successfully +executed to then proceed to the 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. If we run \arara on |mydoc.tex| -- we can also run +|arara mydoc| too, we will discuss this later on -- presented in Code~\ref{code:hellolatex}, we get the output +presented in Code~\ref{code:araraoutputexample}. + +\begin{code}[htbp] +\caption{Running \arara on \mycmd{mydoc.tex}.} +\label{code:araraoutputexample} +\begin{bash} +$ arara mydoc + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +Running PDFLaTeX... SUCCESS +\end{bash} +\end{code} + +That is pretty much how \arara works: directives in the source code are mapped to rules, which are converted to +commands and added to a queue. The queue is then executed and the status is reported. We will cover more details +about the expansion process later on in the manual. In short, we teach \arara to do a task by providing a rule, +and tell it to execute it via directives in the source code. + +\section{Features} +\label{sec:features} + +To name a few features I like in \arara, I'd mention the ability to write rules in a human-readable format called YAML, +which rhymes with the word \emph{camel}. YAML is actually a recursive acronym for \emph{YAML Ain't Markup Language}, +and it's known as a human friendly data serialization standard for all programming languages~\cite{yaml:2001}. So far, +I think this format is quite suitable to write rules, specially if you want to avoid the need of writing complicated XML mappings or +even injecting code directly into the application. + +Another feature worth mentioning is the fact that \arara is platform independent. The application was written in 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 5, 6 and 7, and OpenJDK 6 and 7. +In Chapter~\ref{chap:buildingfromsources}, there are instructions on how to build \arara from sources. Even if +you use multiple operating systems, \arara should behave the same, including the rules. There are helper functions +available in order to provide support for system-specific rules based on the underlying operating system, presented +in Section~\ref{sec:functions}. + +From version 3.0 on, \arara can now display localized messages. The default language is set to English, but the user can +receive feedback from the execution process and logging in other languages as well, such as Brazilian Portuguese, German, +Italian, French, Spanish, Russian and Turkish. There's also a way to redefine the default language by adding an entry in the configuration +file, discussed later on in Section~\ref{sec:language}. + +Speaking of which, \arara has now an optional configuration file in which we can add rule paths, set the default language and +define custom extensions and directive patterns, located in the user home directory. That way, we can extend \arara's behaviour +to deal with other extensions, such as |.c| files, and use the tool with other formats. We will come back on this subject later on +in Chapter~\ref{chap:configurationfile}. + +\arara is also easily integrated with other \TeX\ integrated development environment, such as \TeX works~\cite{texworks:2009}, an +environment for authoring \TeX\ documents shipped with both \TeX\ Live and MiK\TeX. Chapter~\ref{chap:ideintegration} covers +the integration of \arara with several environments. + +\section{Common uses} +\label{sec:commonuses} + +\arara can be used in complex workflows, like theses and books. You can tell \arara to compile the document, generate +indices and apply styles, remove temporary files, compile other |.tex| documents, create glossaries, call |pdfcrop|, move files, +run \hologo{METAPOST} or \hologo{METAFONT}, and so forth. You can easily come up with your own rules. + +There's an \href{http://latex-community.org/know-how/435-gnuplot-arara}{article} available in the \LaTeX\ community which +describes the integration of |gnuplot| and \arara~\cite{cereda:2012}. This article was submitted as an entry to a contest organized +by Stefan Kottwitz. It might be worth a read. + +Let's see a few examples. Code~\ref{code:exlatexone} contains the workflow I used for another article I recently wrote. Note that the first call to +|pdflatex| creates the |.aux| file, then |bibtex| will extract the cited publications. The next calls to |pdflatex| will insert +and refine the references. + +\begin{code}[htbp] +\caption{\mycmd{article.tex}} +\label{code:exlatexone} +\begin{latex} +% (*@@*)arara: pdflatex +% (*@@*)arara: bibtex +% (*@@*)arara: pdflatex +% (*@@*)arara: pdflatex +\documentclass[journal]{IEEEtran} +... +\end{latex} +\end{code} + +Code~\ref{code:exlatextwo} contains another workflow I used for a manual. I had to use a package that required shell escape, +so the calls to |pdflatex| had to enable it. Also, I had an index with a custom formatting, then |makeindex| was called with the + proper style. + +\begin{code}[htbp] +\caption{\mycmd{manual.tex}} +\label{code:exlatextwo} +\begin{latex} +% (*@@*)arara: pdflatex: { shell: yes } +% (*@@*)arara: makeindex: { style: mystyle } +% (*@@*)arara: pdflatex: { shell: yes } +% (*@@*)arara: pdflatex: { shell: yes } +\documentclass{book} +... +\end{latex} +\end{code} + +And of course, the \arara user manual is also compiled with |arara|. You can take a look in the source code and check the +header. By the way, note that I had to use a trick to avoid |arara| to read the example directives in this manual. As we will +see later, \arara reads directives everywhere. Actually, I could have changed the directive pattern for |.tex| files through +the configuration file, but that's another story. + +Other workflows can be easily created. There can be an arbitrary number of instructions for \arara to execute, so feel free to +come up with your own workflow. \arara will handle it for you. My friend Joseph Wright wrote a great article about \arara in +his personal blog, it's really worth a read~\cite{wright:2012}. + +I really hope you like my humble contribution to the \TeX\ community. Let \arara enhance your \TeX\ experience, it will help you +when you'll need it the most. Enjoy the manual. + +\printbibliography[heading=subbibliography] + +\chapter{Installation} +\label{chap:installation} + +\epigraph{\emph{Adjust \texttt{\string\hsize}: old man Fermat couldn't.}}{Enrico Gregorio} + +Spledid, so you decided to give \arara a try? This chapter will cover the installation procedure. We basically +have two methods of installing \arara: the first one is through a cross-platform installer, which is of course +the recommended method; the second one is a manual deployment, with the provided |.jar| file -- a +self-contained, batteries-included executable Java archive file. If you have a recent \TeX\ Live distribution, +good news: \arara is already available in your system! + +\section{Prerequisites} +\label{sec:prerequisites} + +I know I've mentioned this before in Section~\ref{sec:features} and, at the risk of being repetitive, there we +go again: \arara is written in Java and thus depends on a virtual machine in the underlying operating system. +If you use a Mac or even a fairly recent Linux distribution, I have good news for you: it's mostly certain that +you already have a Java virtual machine installed. + +It's very easy to check if you have a Java virtual machine installed: try running |java -version| in the terminal +(bash, command prompt, you name it) and see if you get an output similar to the one provided in +Code~\ref{code:javainstalled}. + +\begin{code}[htbp] +\caption{Checking if \mycmd{java} is installed.} +\label{code:javainstalled} +\begin{bash} +$ java -version +java version "1.6.0_24" +OpenJDK Runtime Environment (IcedTea6 1.11.1) +OpenJDK Client VM (build 20.0-b12, mixed mode) +\end{bash} +\end{code} + +If the output goes along the lines of |java: command not found|, I'm afraid you don't have a Java virtual +machine installed in your operating system. Since the virtual machine is a prerequisite for \arara to run, +you can install one via your favorite package manager or manually install it from the binaries available +in the official \href{http://www.java.com}{Java website}. Make sure to download the correct version for +your operating system. The installation procedure is very straightforward. If you get stuck, take a look +on the installation instructions. + +It's important to mention that \arara runs also with the Java virtual machine from the OpenJDK +project~\cite{openjdk:2006}, which is already available in most of the recent Linux distributions -- actually +the output from Code~\ref{code:javainstalled} shows the OpenJDK version from my Fedora machine. +Feel free to use the virtual machine you feel most comfortable with. + +Speaking of virtual machines, \arara requires at least Java 5 to run. Don't worry, it's quite easy to spot the Java +version: just look at the second digit of the version string. For example, Code~\ref{code:javainstalled} outputs |1.6.0_24|, +which means we have Java 6 installed. + +\section{Obtaining \texorpdfstring{\arara}{arara}} +\label{sec:obtainingarara} + +Before proceeding, we need to choose the installation method. We have two options: the first option is the easiest one, +which installs \arara through a cross-platform installer; the second option is a manual deployment. + +From version 3.0 on, \arara is also available as part of the \TeX\ Live distribution. If you have a recent \TeX\ distro, +it's almost certain that you already have \arara; make sure to select it in the |tlmgr| application. + +If we opt for the installer, go to the \href{http://github.com/cereda/arara/downloads}{downloads} section of the project + repository and download |arara-3.0-installer.jar| for all operating systems or |arara-3.0-installer.exe| for Windows. +Please note that the |.exe| version is only a wrapper which will launch |arara-3.0-installer.jar| under the hood. The +installer also requires Java. + +If we want to do things the complicated way, go to the \href{http://github.com/cereda/arara/downloads}{downloads} +section of the project repository and download the |arara.jar| file, which is a self-contained, batteries-included executable +Java archive file. + +In case you want to build \arara from source, please refer to Chapter~\ref{chap:buildingfromsources} which will +cover the whole process. Thanks to Apache Maven, the build process is very easy. + +\section{Using the cross-platform installer} +\label{sec:usingthecrossplatforminstaller} + +After downloading |arara-3.0-installer.jar| (or its |.exe| counterpart), it's now just a matter of running it. +The installer is built with IzPack~\cite{izpack:2001}, an amazing tool for packaging applications on the Java +platform. Of course the source is also available at the project repository. Personally, I suggest you to run the +installer in privileged mode, but you can also run it in user mode -- just keep in mind that some features might +not work, like creating symbolic links or adding the application to the system path, which inevitably requires a +privileged mode. + +When running |arara-3.0-installer.jar| or its |.exe| wrapper on Windows by simply double-clicking it, the installer +will automatically run in privileged mode. A general Unix-based installation can be triggered by the command +presented in Code~\ref{code:runinstaller1}. There's also an alternative command presented in +Code~\ref{code:runinstaller2}. + +\begin{code}[htbp] +\caption{Running the installer in a Unix-based system -- method 1.} +\label{code:runinstaller1} +\begin{bash} +$ sudo java -jar arara-3.0-installer.jar +\end{bash} +\end{code} + +\begin{code}[htbp] +\caption{Running the installer in a Unix-based system -- method 2.} +\label{code:runinstaller2} +\begin{bash} +$ su -c 'java -jar arara-3.0-installer.jar' +\end{bash} +\end{code} + +Since Windows doesn't have a similar command to |su| or |sudo|, you need to open the command prompt as +administrator and then run the command presented in Code~\ref{code:runinstallerwin}. You can right-click +the command prompt shortcut and select the ``Run as administrator\ldots'' option. + +\begin{code}[htbp] +\caption{Running the installer in the Windows command prompt as administrator.} +\label{code:runinstallerwin} +\begin{bash} +C:\> java -jar arara-3.0-installer.jar +\end{bash} +\end{code} + +The installation process will begin. Hopefully, the first screen of the installer will appear, which is the +language selection (Figure~\ref{fig:instlang}). By the way, if you called the installer through the command line, +please do not close the terminal! It might end the all running processes, including our installer. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-langsel.png} +\caption{Language selection screen.} +\label{fig:instlang} +\end{figure} + +The installer currently supports six languages: English, German, French, Italian, Spanish, and Brazilian Portuguese. +I plan to add more languages to the list in the near feature. + +The next screen welcomes you to the installation (Figure~\ref{fig:instwelcome}). There's the application name, the +current version, the team, and the project homepage. We can proceed by clicking the \textit{Next} button. +Note that you can quit the installer at any time by clicking the \textit{Quit} button -- please, don't do it; a kitten dies +every time you abort the installation\footnote{Of course, this statement is just a joke. No animals were +harmed, killed or severely wounded during the making of this user manual. After all, \arara is environmentally friendly.}. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-welcome.png} +\caption{Welcome screen.} +\label{fig:instwelcome} +\end{figure} + +Moving on, the next screen shows the license agreement (Figure~\ref{fig:instlicense}). \arara is licensed under the +\href{http://www.opensource.org/licenses/bsd-license.php}{New BSD License}~\cite{bsd:2012}. It's important to +observe that the New BSD License has been verified as a GPL-compatible free software license by the Free Software +Foundation~\cite{fsf:1985}, and has been vetted as an open source license by the Open Source Initiative~\cite{osi:1998}. +The full license is also available in this document (page~\pageref{sec:license}). You need to accept the terms of the +license agreement before proceeding. + +The next screen is probably the most important section of the installation: in here we will choose the packs we want to +install (Figure~\ref{fig:instpacks}). All packs are described in Table~\ref{tab:packs}. Note that the grayed packs are +required. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-packs.png} +\caption{Packs screen.} +\label{fig:instpacks} +\end{figure} + +\begin{table}[htbp] +\centering +\caption{Available packs.} +\label{tab:packs} +\renewcommand{\arraystretch}{1.5} +\footnotesize +\begin{tabular}{p{0.30\textwidth}p{0.12\textwidth}p{0.4\textwidth}} +\hline +\textbf{Pack name} & \textbf{OS} & \textbf{Description} \\ +\hline +\hline +Main application & All & This pack contains the core application. It also +provides an |.exe| wrapper for Windows and a bash file for Unix. \\ +\hline +Include the \arara user manual & All & This pack installs this user manual into +the |docs/| subdirectory of \arara. \\ +\hline +Include predefined rules & All & Of course, \arara has a set of predefined rules +for you to start with. If you prefer to write your own rules from scratch, do +not select this pack. \\ +\hline +Add a symbolic link to \arara in |/usr/local/bin| & Unix & If you ran the +installer in privileged mode, a symbolic link to \arara can be created in the +|/usr/local/bin| directory. There's no magic here, the installer uses the good +old |ln| command. \\ +\hline +Add \arara to the system path & Windows & Like the Unix task, \arara can also +add itself to the system path. This feature is provided by a Windows script named +\href{http://legroom.net/software/modpath}{Modify Path}~\cite{modpath:2012}. \\ +\hline +\end{tabular} +\end{table} + +It's very important to mention that all these modifications in the operating +system -- the symbolic link creation for Unix or the addition to the path for +Windows -- are safely removed when you run the \arara uninstaller. We will talk +about it later, in Section~\ref{sec:uninstallingarara}. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-license.png} +\caption{License agreement screen.} +\label{fig:instlicense} +\end{figure} + +In the next screen, we will select the installation path (Figure~\ref{fig:instpath}). The installer +will automatically set the default installation path according to the Table~\ref{tab:paths}, but +feel free to install \arara in your favorite structure -- even |/opt| or your home folder. + +\begin{table}[htbp] +\centering +\caption{Default installation paths.} +\label{tab:paths} +\renewcommand{\arraystretch}{1.5} +\begin{tabular}{cl} +\hline +\textbf{OS} & \textbf{Default installation path}\\ +\hline +\hline +Windows & |C:\Program Files\arara|\\ +Unix & |/usr/local/arara|\\ +\hline +\end{tabular} +\end{table} + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-path.png} +\caption{Installation path screen.} +\label{fig:instpath} +\end{figure} + +After selecting the installation path, the installer will then confirm the creation of the target directory +(Figure~\ref{fig:instnewfolder}). We simply click \textit{OK} to accept it. For convenience, the full installation path +defined in the installation path screen (Figure~\ref{fig:instpath}) will be referred as |ARARA_HOME| from now on. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-pathwarning.png} +\caption{Target directory confirmation.} +\label{fig:instnewfolder} +\end{figure} + +Now, just sit back and relax while \arara is being installed (Figure~\ref{fig:instprogress}). All selected packs will +be installed accordingly. The post installation tasks -- like creating the symbolic link or adding \arara to the system +path -- are performed here as well. If the installation has completed successfully, we will reach the final screen of +the installer congratulating us for installing \arara (Figure~\ref{fig:instfinish}). + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-progress.png} +\caption{Progress screen.} +\label{fig:instprogress} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/install-finish.png} +\caption{Final screen.} +\label{fig:instfinish} +\end{figure} + +The full installation scheme is presented in Figure~\ref{fig:ararastructure}. The directory structure is +presented here as a whole; keep in mind that some parts will be omitted according to your operating +system and pack selection. For example, the |etc/| subdirectory will only be installed if and only if +you are in Windows and the system path pack is selected. Other files are platform-specific, such as +|arara.exe| for Windows and the |arara| bash file for Unix. + +\begin{figure}[htbp] +\centering +\begin{tikzpicture}[grow via three points={one child at (0.5,-0.7) and two children at (0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\tikzparentnode.south) |- (\tikzchildnode.west)}, anchor=west, font=\ttfamily] + \node {ARARA\_HOME/} + child { node {arara.jar}} + child { node {arara.exe}} + child { node {arara}} + child { node {docs/} + child { node {arara-usermanual.pdf}} + } + child [missing] {} + child { node {etc/} + child { node {modpath.exe}} + } + child [missing] {} + child { node {Uninstaller/} + child { node {uninstaller.jar}} + } + child [missing] {} + child { node {rules/} + child { node {biber.yaml}} + child { node {\ldots}} + child { node {xetex.yaml}} + }; +\end{tikzpicture} +\caption{Installation scheme.} +\label{fig:ararastructure} +\end{figure} + +That's it, \arara is installed in your operating system. If you opted for the symbolic link creation or the path addition, +\arara is already available in your terminal by simply typing |arara|. Have fun! + +\section{Manual installation} +\label{sec:manualinstallation} + +Thankfully, \arara is also very easy to be manually deployed. First of all, we must create the application directory. +Feel free to create this directory anywhere in your computer; it can be |C:\arara|, |/opt/arara| or another location +of your choice. This procedure is similar to the installation path screen (Figure~\ref{fig:instpath}) from +Section~\ref{sec:installer}. Again, for convenience, the full installation path will be referred as |ARARA_HOME| from +now on. Although it's not mandatory, try to avoid folders structures with spaces in the path. In any case, +\arara can handle such spaces. + +After downloading |arara.jar| from the \href{http://github.com/cereda/arara/downloads}{downloads} section of +the project repository, let's copy it to the |ARARA_HOME| directory we've created in the previous step. +Since |arara.jar| is a self-contained, batteries-included executable Java archive file, \arara is already installed. + +In order to run \arara from a manual installation, we should open a terminal and run |java -jar $ARARA_HOME/arara.jar|, +but that is far from being intuitive. To make our lives easier, we will create a shortcut for this +command. + +If you are deploying \arara in Windows, there are two methods for creating a shortcut: the first method -- the +easiest -- consists of downloading the |arara.exe| wrapper from the \href{http://github.com/cereda/arara/downloads}{downloads} +section and copying it to the |ARARA_HOME| directory, in the same level of |arara.jar|. This |.exe| wrapper, provided by \href{http://launch4j.sourceforge.net}{Launch4J}~\cite{launch4j:2005}, wraps |.jar| files in Windows native executables +and allows to run them like a regular Windows program. + +The second method for creating a shortcut in Windows is to provide a batch file which will call |java -jar $ARARA_HOME/arara.jar| +for us. Create a file named |arara.bat| or |arara.cmd| inside the |ARARA_HOME| directory, in the same level of |arara.jar|, and +add the content from Code~\ref{code:windows}. + +\begin{code}[htbp] +\caption{Creating a batch file for \arara in Windows.} +\label{code:windows} +\begin{bash} +@echo off +java -jar "%~dp0\arara.jar" %* +\end{bash} +\end{code} + +After creating the batch file, add the full |ARARA_HOME| path to the system path. Unfortunately, this manual can't cover +the path settings, since it's again a matter of personal taste. I'm sure you can find tutorials on how to add a directory to +the system path. + +If you are deploying \arara in Linux or Mac, we also need to create a shortcut to |java -jar $ARARA_HOME/arara.jar|. +Create a file named |arara| inside the |ARARA_HOME| directory, in the same level of |arara.jar|, and add the content +from Code~\ref{code:unix}. + +\begin{code}[htbp] +\caption{Creating a script for \arara in Linux and Mac.} +\label{code:unix} +\begin{bash} +#!/bin/bash +# Example script of arara +# Installation and usage are described in the documentation +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd -P "$( dirname "$SOURCE" )" && pwd )" +java -jar "$DIR/arara.jar" "$@" +\end{bash} +\end{code} + +We now need to add execute permissions for our newly created script through |chmod +x arara|. The |arara| script can +be invoked through path addition or symbolic link. I personally prefer to add |ARARA_HOME| to my user path, but a +symbolic link creation seems way more robust -- it's what the installer does. Anyway, it's up to you to decide which method +you want to use. There's no need to use both. + +Once we conclude the manual installation, it's time to check if \arara is working properly. Try running |arara| in the terminal +and see if you get the output shown in Code~\ref{code:arararun}. + +\begin{code}[p] +\caption{Testing if \arara is working properly.} +\label{code:arararun} +\begin{nolanguage} +$ arara + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +arara 3.0 - The cool TeX automation tool +Copyright (c) 2012, Paulo Roberto Massa Cereda +All rights reserved. + +usage: arara [file [--log] [--verbose] [--timeout N] [--language L] | --help | --version] + + -h,--help print the help message + -L,--language <arg> set the application language + -l,--log generate a log output + -t,--timeout <arg> set the execution timeout (in milliseconds) + -v,--verbose print the command output + -V,--version print the application version +\end{nolanguage} +\end{code} + +If the terminal doesn't display the \arara logo and usage, please review the manual installation steps. +Every step is important in order to make \arara available in your system. You can also try the cross-platform +installer. If you still have any doubts, feel free to contact us. + +\section{Updating \texorpdfstring{\arara}{arara}} +\label{sec:updatingarara} + +If there is a newer version of \arara available in the \href{http://github.com/cereda/arara/downloads}{downloads} +section of the project repository, simply download the |arara.jar| file and copy it to the |ARARA_HOME| directory, +replacing the current one. No further steps are needed, the newer version is deployed. Try running |arara --version| +in the terminaland see if the version shown in the output is equal to the one you have downloaded. + +Anyway, for every version, \arara has the proper cross-platform installer available for download in the project repository. +You can always uninstall the old \arara setup and install the new one. Please note that only major versions are released +with the installer. + +If you have \arara through the \TeX\ Live distribution, the update process is straightforward: simply open a +terminal and run |tlmgr update arara| in order to update the application. This is of course the preferred method. + +\section{Uninstalling \texorpdfstring{\arara}{arara}} +\label{sec:uninstallingarara} + +If you want to uninstall \arara, there are two methods available. If you installed \arara through the cross-platform installer, +I have good news for you: it's just a matter of running the uninstaller. Now, if \arara was deployed through the manual +installation, we might have to remove some links or path additions. + +A general Unix-based uninstallation can be triggered by the command presented in Code~\ref{code:uninstall1}. +There's also an alternative command presented in Code~\ref{code:uninstall2}. + +\begin{code}[htbp] +\caption{Running the uninstaller in a Unix-based system -- method 1.} +\label{code:uninstall1} +\begin{bash} +$ sudo java -jar $ARARA_HOME/Uninstaller/uninstaller.jar +\end{bash} +\end{code} + +\begin{code}[htbp] +\caption{Running the uninstaller in a Unix-based system -- method 2.} +\label{code:uninstall2} +\begin{bash} +$ su -c 'java -jar $ARARA_HOME/Uninstaller/uninstaller.jar' +\end{bash} +\end{code} + +Since Windows doesn't have a similar command to |su| or |sudo|, you need to open the command prompt as administrator +and then run the command presented in Code~\ref{code:uninstallwin}. You can right-click the command prompt shortcut +and select the ``Run as administrator\ldots'' option. + +\begin{code}[htbp] +\caption{Running the uninstaller in the Windows command prompt as administrator.} +\label{code:uninstallwin} +\begin{bash} +C:\> java -jar $ARARA_HOME/Uninstaller/uninstaller.jar +\end{bash} +\end{code} + +The uninstallation process will begin. Hopefully, the first and only creen of the uninstaller will appear +(Figure~\ref{fig:uninstallone}). By the way, if you called the uninstaller through the command line, please +do not close the terminal! It might end the all running processes, including our uninstaller. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/uninstall-welcome.png} +\caption{The uninstaller screen.} +\label{fig:uninstallone} +\end{figure} + +There's nothing much to see in the uninstaller. We have an option to force the deletion of the |ARARA_HOME| directory, +but that's all. By clicking the \textit{Uninstall} button, the uninstaller will remove the symbolic link or the path entry for +\arara from the operating system, if selected during the installation. Then it will erase the |ARARA_HOME| directory +(Figure~\ref{fig:uninstalltwo}). + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/installer/uninstall-finish.png} +\caption{The uninstaller screen, after the execution.} +\label{fig:uninstalltwo} +\end{figure} + +Unfortunately, even if you force the deletion of the |ARARA_HOME| directory in Windows, the operating system can't +remove the |Uninstaller| subdirectory because the uninstaller was being executed from there. But that's the only trace +left. You can safely delete |ARARA_HOME| after running the uninstaller. + +If \arara was manually installed, we need to remove the symbolic link reference or the path entry, if any, then delete +the |ARARA_HOME| directory. Don't leave any traces of \arara in system directories or configuration files; a broken +symbolic link or a wrong path entry might cause trouble in the future. + +\printbibliography[heading=subbibliography] + +\chapter{Building from sources} +\label{chap:buildingfromsources} + +\epigraph{\emph{Knowledge brings fear.}}{From a \emph{Futurama} episode} + +Although \arara already features a self-contained, batteries-included executable Java archive file, an |.exe| wrapper, and a cross-platform +installer, you can easily build it from sources. The only requirements are a working Java Development Kit~\cite{oracle:2012} +and the Apache Maven software project management~\cite{maven:2012}. The next sections will cover the entire process, +from obtaining the sources to the build itself. Sadly, this manual doesn't cover Java and Maven deployments, so I kindly ask you +to check their websites and read the available documentation. + +\section{Obtaining the sources} +\label{sec:obtainingthesources} + +First of all, we need to get the source code, available in the project repository hosted on \href{https://github.com/cereda/arara}{GitHub}. +We have two options on how to obtain the sources: either by clicking the \href{https://github.com/cereda/arara/archive/master.zip}{Zip} button in the project page and download a snapshot +of the whole structure in an archive file, or by using |git| and clone the repository into our machine. The second option is easily done by executing the command presented in Code~\ref{code:gitobtain}, provided of course that you have |git| installed. + +\begin{code}[htbp] +\caption{Cloning the project repository.} +\label{code:gitobtain} +\begin{bash} +$ git clone git://github.com/cereda/arara.git +\end{bash} +\end{code} + +After cloning the project repository (Code~\ref{code:gitobtain}), a new subdirectory named |arara| is created in the current directory +with the project structure -- the very same available in the project repository on GitHub. The application source code is inside +|arara/arara|. Note that there are other source codes for the cross-platform installer and the |.exe| wrapper, as well as the predefined +rules, each one in a subdirectory of its own. + +If you opted for downloading the archive file, you'll have a file named |arara-master.zip| generated automatically by GitHub. +Just extract the file somewhere in your computer and you'll end up with the very same project structure as the one available in the +project repository. + +\section{Building \texorpdfstring{\arara}{arara}} +\label{sec:buildingarara} + +Inside the |arara/arara| directory, we have the most important file for building \arara: a file named |pom.xml|. We now just need to +call the |mvn| command with the proper target and relax while Maven takes care of the building process for us. First of all, let's take +a look at some targets available in our |pom.xml| file: + +\begin{ruleoptions} +\item[compile] This target compiles the source code, generating the Java bytecode. +\item[package] The |package| target is very similar to the |compile| one, but instead of only compiling the source code, it also +packs the Java bytecode into an executable Java archive file without dependencies. The file will be available inside the +|arara/arara/target| directory. +\item[assembly:assembly] This target is almost identical to the |package| one, but it also includes all the dependencies into a +final Java archive file. The file will be available inside the |arara/arara/target| directory. This is of course our preferred target, +since \arara is shipped as a self-contained executable Java archive file. +\item[clean] The |clean| target removes all the generated Java bytecode and deployment traces, cleaning the project structure. +\end{ruleoptions} + +Now that we know the targets, we only need to call |mvn| with the target we want. If you want to generate the very same Java archive file +we use for releases, execute the command presented in Code~\ref{code:mvnassembly}. + +\begin{code}[htbp] +\caption{Building \arara with Maven, first attempt.} +\label{code:mvnassembly} +\begin{bash} +$ mvn assembly:assembly +\end{bash} +\end{code} + +Actually, the command presented in Code~\ref{code:mvnassembly}, as the project structure is at the moment, will fail! Let me explain +why: the application is not yet linked with the localized messages, so we need to convert our translation files into a correct format and +then run the target in Maven. The error message after running |mvn assembly:assembly| presented in Code~\ref{code:errorlangnotfound} +gives us a hint on what we should do. + +\begin{code}[htbp] +\caption{The Maven error message about missing localization files.} +\label{code:errorlangnotfound} +\begin{bash} +Failed tests: testLocalizationFile(com.github.arara.AraraTest): +arara requires at least the default localization file +Messages.properties located at the translations/ directory in +the project repository. Rename Messages.input to +Messages.properties and copy the new file to the src/ +directory, under com/github/arara/localization, and build +arara again. + +Tests run: 1, Failures: 1, Errors: 0, Skipped: 0 + +[INFO] --------------------------------------------- +[INFO] BUILD FAILURE +[INFO] --------------------------------------------- +\end{bash} +\end{code} + +Let's go into |arara/translations| and run the commands presented in Code~\ref{code:convertinglocales}. Since we are dealing with +languages that require an encoding in UTF-8 while the localization files are set in ASCII, we need to run a conversion program in +order to generate valid |.properties| files. + +\begin{code}[htbp] +\caption{Converting the localization files.} +\label{code:convertinglocales} +\begin{bash} +$ native2ascii -encoding utf8 Messages.input ../application/src/main/resources/com/github/arara/localization/Messages.properties +$ native2ascii -encoding utf8 Messages_de.input ../application/src/main/resources/com/github/arara/localization/Messages_de.properties +$ native2ascii -encoding utf8 Messages_es.input ../application/src/main/resources/com/github/arara/localization/Messages_es.properties +$ native2ascii -encoding utf8 Messages_fr.input ../application/src/main/resources/com/github/arara/localization/Messages_fr.properties +$ native2ascii -encoding utf8 Messages_it.input ../application/src/main/resources/com/github/arara/localization/Messages_it.properties +$ native2ascii -encoding utf8 Messages_pt_BR.input ../application/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties +$ native2ascii -encoding utf8 Messages_ru.input ../application/src/main/resources/com/github/arara/localization/Messages_ru.properties +$ native2ascii -encoding utf8 Messages_tr.input ../application/src/main/resources/com/github/arara/localization/Messages_tr.properties +\end{bash} +\end{code} + +Now we can simply rerun the command presented in Code~\ref{code:mvnassembly}. Hopefully, we won't have trouble this time. +Relax while Maven takes care of the building process. It might take a while, since all dependencies will be downloaded to your Maven repository. After a while, Maven will tell us that the project was built successfully! + +After a successful build via Maven, we can now get the generated executable Java archive file |arara-3.0-with-dependencies.jar| which is inside the |arara/arara/target| directory, rename it to |arara.jar| and use it as we have seen in the previous chapters. + +\section{Notes on the installer and wrapper} +\label{sec:notesontheinstallerandwrapper} + +The project directory has additional subdirectories regarding the \arara cross-platform installer and the |.exe| wrapper. It's important to +observe that only the build files are available, which means that you need to review the compilation process and make adjustments +according to your directory structure. + +The cross-platform installer Java archive file is generated with IzPack~\cite{izpack:2001}, while the |.exe| wrapper is built with +Launch4J~\cite{launch4j:2005}. Both build files are written in plain XML, so you can easily adapt them to your needs. Sadly, the main +purpose of this chapter is to cover the build process of \arara itself and not its helper tools; if you want to generate your own wrapper +or installer, please refer to the available documentation on how to build each file. The build process is also very straightforward. + +\printbibliography[heading=subbibliography] + +\chapter{IDE integration} +\label{chap:ideintegration} + +\epigraph{\emph{The answer to ``can Emacs\ldots'' is always ``yes''.}}{David Carlisle} + +This chapter covers the integration of \arara with several integrated development environments. For obvious reasons, it's almost +impossible for us to cover the full range of editors available nowadays, so we tried to focus only on a couple of them. If you use +\arara with an IDE other than the ones listed here, please let us know! It would be great to include your contribution in this user +manual. + +\section{\texorpdfstring{\TeX works}{TeXworks}} +\label{sex:texworks} + +\arara can be easily integrated with \TeX works~\cite{texworks:2009}, an environment for authoring \TeX\ documents shipped +with both \TeX\ Live and MiK\TeX. In this section, we will learn how to integrate \arara and this cross-platform \TeX\ front-end +program. + +First of all, make sure \arara is properly installed in your operating system. Thankfully, it's very easy to add a new tool in \TeX works, +just open the program and click in \textit{Edit} $\rightarrow$ \textit{Preferences\ldots} to open the preferences screen (Figure~\ref{fig:texworkspref}). + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/texworks/texworks-prefs.png} +\caption{Opening the preferences screen in \TeX works.} +\label{fig:texworkspref} +\end{figure} + +The next screen is the \TeX works preferences (Figure~\ref{fig:texworksprefscreen}). There are several tabs available. Navigate to the +\textit{Typesetting} tab, which contains two lists: the paths for \TeX\ and related programs, and the processing tools. In the second +list -- the processing tools -- click the \textit{Plus (+)} button to add another tool. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/texworks/texworks-add.png} +\caption{The \TeX works preferences screen.} +\label{fig:texworksprefscreen} +\end{figure} + +We are now in the new tool screen (Figure~\ref{fig:texworksarara}). \TeX works provides an very straightforward interface for adding +new tools; we just need to provide the tool name, the executable path, and the parameters. Table~\ref{tab:texworksarara} helps us on +what to type in each field. When done, just click \textit{OK} and our new tool will be available. + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/texworks/texworks-arara.png} +\caption{The new tool screen.} +\label{fig:texworksarara} +\end{figure} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[htbp] +\centering +\footnotesize +\begin{tabular}{p{0.15\textwidth}p{0.25\textwidth}p{0.50\textwidth}} +\hline +\textbf{Field name} & \textbf{Value} & \textbf{Description} \\ +\hline +\hline +Name & |arara| & The tool name. You can actually type whatever name your heart +desires. This value will be displayed in the compilation profile. \\ +\hline +Program & |$ARARA_HOME/arara| & The full executable path. Just browse the +filesystem and select the correct \arara path. Observe that symbolic links are +resolved to their full targets. For Windows, select the |.exe| wrapper; for +Unix, select the bash script. \\ +\hline +Arguments & {\renewcommand{\arraystretch}{1} +\begin{tabular}[t]{l} +|$fullname|\\ +|--verbose|\\ +|--log| +\end{tabular}} & The tool arguments. Note that you need to type one argument at +a time, by clicking the \textit{Plus (+)} button. The first argument is a +\TeX works variable which will expand to the current filename. The second and +third arguments are \arara flags, discussed later, in +Chapter~\ref{chap:runningarara}. \\ +\hline +\end{tabular} +\caption{Configuring \arara in \TeX works.} +\label{tab:texworksarara} +\end{table}} + +We are now back to the preferences screen (Figure~\ref{fig:texworksprefscreen}). Hopefully, \arara is in the list of processing tools. +Just click \textit{OK} to confirm the new addition. Congratulations, now \arara is available as a compilation profile in \TeX works +(Figure~\ref{fig:texworksprofile}). + +\begin{figure}[htbp] +\centering +\includegraphics[scale=0.5]{figures/texworks/texworks-profile.png} +\caption{Using \arara in the \TeX works compilation profile.} +\label{fig:texworksprofile} +\end{figure} + +And we are done, \arara is now integrated with \TeX works! Just make sure to select the correct profile when running the compilation +process. + +\section{WinEdt} +\label{sec:winedt} + +The following procedure is kindly provided by Harish Kumar. It's very easy to integrate \arara with WinEdt, let's take a look at the steps. + +\subsection{Getting images for icons and toolbar} + +WinEdt uses $16 \times 16$ |.png| images for menu items, the toolbar and the tree control. They are available in \texttt{\%B\textbackslash Bitmaps\textbackslash Images}\footnote{\texttt{\%B} maps to \texttt{C:\textbackslash Program Files\textbackslash WinEdt Team\textbackslash WinEdt 7} for default installation.} folder and they are automatically loaded on startup or later through the \textit{Options Interface} (or |ReloadImages| macro function). Restricted users can place additional images in their \texttt{\%b\textbackslash Bitmaps\textbackslash Images}\footnote{\texttt{\%b} maps to \texttt{C:\textbackslash Users\textbackslash <username>\textbackslash AppData\textbackslash Roaming\textbackslash WinEdt Team\textbackslash WinEdt 7} for default installation} folder. At the moment all images have a $16\times16$ dimension and use 32-bit transparent |.png| format. + +The images for the \arara toolbar can be downloaded from the \href{http://github.com/cereda/arara/downloads}{downloads area} of the project repository. It would suffice to have a $16 \times 16$ |.png| image for WinEdt v7 while for WinEdt v6, one has to use $16 \times 16$ |.bmp| image. The downloaded images must be copied to \texttt{\%B\textbackslash Bitmaps\textbackslash Images} or \texttt{\%b\textbackslash Bitmaps\textbackslash Images} (depending upon the admin privileges). Once copied, WinEdt has to be restarted to load the images. Now the images should be available for use. + +\subsection{Adding a menu entry} + +The following steps describe how to add a menu entry for \arara in WinEdt v6 and v7. + +\begin{enumerate} +\item Go to \textit{Options $\rightarrow$ Options Interface}. A side window will appear on the left side as shown in Figure~\ref{fig:optionsinterface}. +\item From the \textit{Menus and Toolbar} drop down list, select \textit{Main Menu} and double click to open the file |Main Menu.ini|. +\item In the |Main Menu.ini| file, type the code presented in Code~\ref{code:mainmenuwinedt} somewhere in the file. +\item Save the file. Now the current script has to be loaded by clicking the \textit{Load current script} button, which is the first button in the tool bar in \textit{Options Interface} window shown in Figure~\ref{fig:optionsinterface}. +\item Now in the WinEdt \textit{\TeX} menu, a submenu called \textit{Arara} should be visible and functional (Figure~\ref{fig:winedtmenu}). +\item From the \textit{Menus and Toolbar} drop down list, select \textit{Toolbar} and double click to open the file |Toolbar.ini|. +\item In the |Toolbar.ini| file, type the following line, somewhere in the file: |BUTTON="arara"|. +\item Save the file |Toolbar.ini|. Now the current script has to be loaded by clicking the \textit{Load current script} button, which is the first button in the tool bar in \textit{Options Interface} window (Figure~\ref{fig:optionsinterface}). +\item Now a button for \arara should be visible as shown in Figure~\ref{fig:wineditararabutton}. +\end{enumerate} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.4\textwidth]{figures/winedt/winedt-optionsinterface.png} +\caption{The \textit{Options Interface} window in WinEdt.} +\label{fig:optionsinterface} +\end{figure} + +\begin{code}[htbp] +\caption{Adding an entry to \arara in \mycmd{Main Menu.ini}.} +\label{code:mainmenuwinedt} +\begin{lstlisting}[basicstyle=\footnotesize\ttfamily, columns=flexible, showspaces=false, breaklines=true] +ITEM="Arara" +CAPTION="Arara" +IMAGE="arara16" +SAVE_INPUT=1 +MACRO=:RunConsole('arara "\%F"','\%P','arara...'); +REQ_FILTER=:"\%!M=TeX"|"\%!M=TeX:STY"|"\%!M=TeX:AUX" +\end{lstlisting} +\end{code} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/winedt/winedt-menu.png} +\caption{The WinEdt \textit{\TeX} menu.} +\label{fig:winedtmenu} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.5\textwidth]{figures/winedt/winedt-ararabutton.png} +\caption{The \arara button in WinEdt.} +\label{fig:wineditararabutton} +\end{figure} + +And we are done! \arara is successfully integrated in WinEdt. Now you can add directives to your files and click the buttons to trigger the execution. + +\section{Inlage} +\label{sec:inlage} + +The following procedure is kindly provided by Harish Kumar. It's very easy to integrate \arara with Inlage, let's take a look at the steps. + +\subsection{Inlage v4} + +The following steps describe how to add a menu entry for \arara in Inlage v4. It's an easy procedure. + +\begin{enumerate} +\item Go to \textit{Build $\rightarrow$ User Commands}. A window named \textit{Edit Commands} will appear as shown in Figure~\ref{fig:inlageeditcommands}. +\item Now press the \textit{Plus (+)} button to get the \textit{Add Command} window as shown in Figure~\ref{fig:inlageaddcommand}. +\item Under the \textit{Name} textfield, type |arara| and under the \textit{Command Line} textarea, type |arara \%f|. Now the new configuration should be saved using the \textit{Save} button. Now an entry for \arara should be visible as seen in Figure~\ref{fig:inlagelistarara}. +\item These settings must be then updated using the \textit{Update} button in the \textit{Edit Commands} window shown in Figure~\ref{fig:inlageeditcommands}. +\item Now a menu entry for \arara should be visible in \textit{Build $\rightarrow$ Execute $\rightarrow$ arara}. +\end{enumerate} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.4\textwidth]{figures/inlage/inlage-editcommands.png} +\caption{The \textit{Edit Commands} window in Inlage.} +\label{fig:inlageeditcommands} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.5\textwidth]{figures/inlage/inlage-addcommand.png} +\caption{The \textit{Add Command} window in Inlage.} +\label{fig:inlageaddcommand} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.4\textwidth]{figures/inlage/inlage-listarara.png} +\caption{\arara added to the \textit{Edit Commands} window in Inlage.} +\label{fig:inlagelistarara} +\end{figure} + +That's it, \arara is now successfully integrated in Inlage v4. Have fun! + +\subsection{Inlage v5} + +The following steps describe how to add a menu entry for \arara in Inlage v5. It's an easy procedure. + +\begin{enumerate} +\item Go to \textit{Build $\rightarrow$ Compiler Options\ldots}. A \textit{Settings} window will appear as shown in Figure~\ref{fig:inlagesettings}. +\item Under \textit{Profiles}, create a new profile clicking the \textit{New} button. A new window will open; now let's type the name for the new profile as |arara|, as shown in Figure~\ref{fig:inlagenewprofile}. Now press \textit{Okay}. +\item Under \textit{Compiler Order}, press \textit{Add Compiler}, as shown in Figure~\ref{fig:inlageaddcompiler}. +\item Under \textit{Binaries}, change the following: +\begin{enumerate} +\item In \textit{Implementation}, choose \textit{Custom}. +\item In \textit{Binary Name}, choose the executable for \arara using the \textit{Browse} button. +\item In \textit{Parameters}, you can choose the parameters, such as |--verbose|. +\item In \textit{Target File}, choose \textit{Active File/Masterfile}. +\end{enumerate} +\item Save these settings. After the previous steps, you should get a menu for \arara in Inlage v5 as seen in Figure~\ref{fig:inlageararamenu}. +\end{enumerate} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/inlage/inlage-settings.png} +\caption{The \textit{Settings} window in Inlage.} +\label{fig:inlagesettings} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/inlage/inlage-newprofile.png} +\caption{Adding a new profile in Inlage.} +\label{fig:inlagenewprofile} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/inlage/inlage-addcompiler.png} +\caption{Adding a compiler in Inlage.} +\label{fig:inlageaddcompiler} +\end{figure} + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/inlage/inlage-araramenu.png} +\caption{\arara added to the menu in Inlage.} +\label{fig:inlageararamenu} +\end{figure} + +That's it, \arara is successfully integrated with Inlage v5. Have fun! + +\section{\texorpdfstring{\TeX Shop}{TeXShop}} +\label{sec:texshop} + +Integrating \arara with \TeX shop is probably one of the easiest procedures. Simply open your terminal, go to |~/Library/TeXShop/Engines| and create a file named |arara.engine| with the content presented in Code~\ref{code:texshopcode}. + +Now, we need to add execute permissions to our newly created file. A simple |chmod +x arara.engine| will do the trick. Now, open \TeX shop and you will see \arara available for use in the list of engines (Figure~\ref{fig:texshop}). + +\begin{figure}[htbp] +\centering +\includegraphics[width=.8\textwidth]{figures/texshop/texshop-arara.png} +\caption{\arara available in \TeX shop.} +\label{fig:texshop} +\end{figure} + +No more steps are needed, \arara is successfully deployed in \TeX shop. If you want to remove \arara from \TeX shop, just remove |arara.engine| from the |Engines| directory. + +\begin{code}[htbp] +\caption{\mycmd{arara.engine}} +\label{code:texshopcode} +\begin{bash} +#!/bin/bash +export PATH=/usr/texbin:/usr/local/bin:${PATH} +arara "$1" +\end{bash} +\end{code} + +\section{\texorpdfstring{\TeX nic Center}{TeXnic Center}} +\label{sec:texniccenter} + +\TeX nic Center has also an easy integration with \arara. The first step is to go to \textit{Build $\rightarrow$ Define Output Profiles\ldots}. The \textit{Profiles} window should open, as shown in Figure~\ref{fig:txnprofiles}. + +\begin{figure}[htbp] +\centering +\includegraphics[width=.8\textwidth]{figures/texniccenter/texniccenter-profiles.png} +\caption{The \textit{Profiles} window in \TeX nic Center.} +\label{fig:txnprofiles} +\end{figure} + +Let's now create a new profile! Click the \textit{Add} button. A window will pop up and ask for the new profile name (Figure~\ref{fig:txnnewprofile}). Type |arara| as the profile name and click \textit{OK}. + +\begin{figure}[htbp] +\centering +\includegraphics[width=.7\textwidth]{figures/texniccenter/texniccenter-newprofile.png} +\caption{Creating a new profile in \TeX nic Center.} +\label{fig:txnnewprofile} +\end{figure} + +The last step is the easiest one. With the |arara| profile selected, check the box which says \textit{Run (La)\TeX in this profile}, then enter the full path to |arara| in the textbox named \textit{Path to the (La)\TeX compiler} and write |--log --verbose "%wm"| in the texbox named \textit{Command line arguments to pass to the compiler}; click \textit{OK}, as shown in Figure~\ref{fig:txnsettings}. + +\begin{figure}[htbp] +\centering +\includegraphics[width=.8\textwidth]{figures/texniccenter/texniccenter-config.png} +\caption{Configuring \arara in \TeX nic Center.} +\label{fig:txnsettings} +\end{figure} + +That's it, now \arara is integrated with \TeX nic Center! Just make sure to select |arara| in the dropdown list of available profiles. + +\printbibliography[heading=subbibliography] + +\chapter{Important concepts} +\label{chap:importantconcepts} + +\epigraph{\emph{Beware of bugs in the above code; I have only proved it correct, not tried it.}}{Donald Knuth} + +Time for our first contact with \arara! It's important to understand a few concepts in which \arara relies before we proceed +to the usage itself. Do not worry, these concepts are easy to follow, yet they are vital to the comprehension of the application +and the logic behind it. + +\section{Rules} +\label{sec:rules} + +Do you remember |mydoc.tex| from Code~\ref{code:hellolatex} in page~\pageref{code:hellolatex}? When we tried to mimic |rubber| and +run |arara mydoc|, nothing happened. We should tell \arara how it should handle this execution. Let's start with the rules. + +A \emph{rule} is a formal description of how \arara should handle a certain task. For example, if we want to use |pdflatex| with +\arara, we should have a rule for that. Once a rule is defined, \arara automatically provides an access layer to that rule through +directives, a concept to be introduced in Section~\ref{sec:directives}. + +A rule is a plain text file written in the YAML format~\cite{yaml:2001}. I opted for this format because it's cleaner and more intuitive to +use than other markup languages, besides of course being a data serialization standard for all programming languages. As a bonus, the +acronym \emph{YAML} rhymes with the word \emph{camel}, so \arara is heavily environmentally friendly\footnote{Perl, I'm looking at you.}. + +The default rules, that is, the rules shipped with \arara, are placed inside a special subdirectory named |rules/| inside |ARARA_HOME|. We will learn in +Section~\ref{sec:searchpaths} that we can add an arbitrary number of paths for storing our own rules, in order of priority, so don't worry +with the location of the default rules, although it's important to understand and acknowledge their existance. The basic structure of an +\arara rule is presented in Code~\ref{code:yamlrule}. + +\begin{code}[htbp] +\caption{\mycmd{makefoo.yaml}, a basic structure of an \arara rule.} +\label{code:yamlrule} +\begin{yaml} +!config +# I am a comment +identifier: makefoo +name: MakeFoo +command: makefoo @{file} +arguments: [] +\end{yaml} +\end{code} + +The |!config| keyword (line 1) is mandatory and it must be the first line of any \arara rule. Note that the format also accepts +comments (line 2) by simply starting a line with the |#| symbol. The following keys are defined: + +\begin{ruleoptions} +\item[identifier] This key (line 3) acts as a unique identifier for the rule. It's highly recommended to use lowercase letters without +spaces, accents or punctuation symbols. As a convention, if you have an identifier named |makefoo|, the rule filename must +be |makefoo.yaml|. +\item[name] The |name| key (line 4) holds the name of the task. When running \arara, this value will be displayed in the output. +In our example, \arara will display |Running MakeFoo| in the output when dealing with this task. +\item[command] This key (line 5) contains the system command to be executed. You can use virtually any type of command, +interactive or noninteractive. But beware: if \arara is running in silent mode, which is the default behaviour, an +interactive command wich might require the user input will be halted and the execution will fail. Don't despair, you can use a +special |--verbose| flag with \arara in order to interact with such commands -- we will talk about flags in +Chapter~\ref{chap:runningarara}. There are cases in which you might want to have a list of commands instead of a single one; +\arara has support for multiple commands inside one rule, we just need to replace |command| by |commands| and provide +a list of commands to be executed, as seen in Code~\ref{code:excommands}. +You probably noticed a strange element |@{file}| in the |command| line: this element is called \emph{orb tag}. For now, just admit these elements exist. We will come back to them later on, in Section~\ref{sec:orbtags}, I promise. +\item[arguments] The |arguments| key (line 6) denotes a list of arguments for the rule command. In our example, we have an empty list, +denoted as |[]|. You can define as many arguments as your command requires. Please check Code~\ref{code:makebar} for an example of a list of arguments. +\end{ruleoptions} + +There are cases in which we need to run more than just one command for a certain rule. Take, for example, the |frontespizio| rule +released with \arara: when using the |frontespizio| package\footnote{\url{http://ctan.org/pkg/frontespizio}, written by Enrico Gregorio.}, +the document has to processed by the choosen engine, say |pdflatex|, no less than three times; if |latex| is used, there's an additional +run of |dvips|. In that case, the logic is enclosed inside the rule, so there's no need to write every compilation step as required by the +package as directives in the source code; a simple call to |frontespizio| is enough to generate the proper results. + +If you need to run more than one command inside a rule, replace the |command| identifier by |commands| and add one command per line, +preceeded by |-| to indicate an item in the list. Code~\ref{code:excommands} presents a sample |makefoobar| rule which runs the +|makefoo| program two times, followed by one run of the |makebar| program. + +\begin{code}[htbp] +\caption{\mycmd{makefoobar.yaml}, an \arara rule with multiple commands.} +\label{code:excommands} +\begin{yaml} +!config +identifier: makefoobar +name: MakeFooBar +commands: +- makefoo @{file} +- makefoo @{file} +- makebar @{file} +arguments: [] +\end{yaml} +\end{code} + +For more complex rules, we might want to use arguments. Code~\ref{code:makebar} presents a new rule which makes use of them +instead of an empty list as we saw in Code~\ref{code:yamlrule}. + +\begin{code}[htbp] +\caption{\mycmd{makebar.yaml}, a rule with arguments.} +\label{code:makebar} +\begin{yaml} +!config +identifier: makebar +name: MakeBar +command: makebar @{one} @{two} @{file} +arguments: +- identifier: one + flag: -i @{parameters.one} +- identifier: two + flag: -j @{parameters.two} +\end{yaml} +\end{code} + +For every argument in the |arguments| list, we have a |-| mark and the proper indentation. The required keys for an argument are: + +\begin{ruleoptions} +\item[identifier] This key (lines 6 and 8) acts as a unique identifier for the argument. It's highly recommended to use lowercase letters +without spaces, accents or punctuation symbols. +\item[flag] The |flag| key (lines 7 and 9) represents the argument value. Note that we have other orb tags in the arguments definitions, +|@{parameters.one}| and |@{parameters.two}|; we will discuss them later on, in Section~\ref{sec:orbtags}. Just to give some context, +|parameters| is a special keyword which maps the elements available in the directives. For example, if we have |one: 1| in a directive, +|parameters.one| will resolve to |1|. The argument |flag| value is only triggered, that is, resolved, if and only if there's an explicit directive argument. Say, if |one| is not defined as a directive argument, the |flag| value of the argument |one| will be resolved to an empty string. There's a way of overriding the default empty string value when a directive argument is not specified, which is done by using the |default| key. +By the way, the |flag| key is not really mandatory, but for most of the rules, you'll need it. At least one of the |flag| and |default| keys is +mandatory. +\end{ruleoptions} + +If we need to set a default value other than an empty string to a rule argument, we can use the |default| key. When a rule argument just needs +a default value, you can safely ignore the |flag| key and rely on the |default| key. If you need to map a directive argument into a rule argument +without falling back to a default value different than an empty string, just use the |flag| key. Now, if you need mapping and fallback, +stick with both keys. + +For now, we need to keep in mind that \arara uses rules to tell it how to do a certain task. In the next sections, when more concepts are +presented, we will come back to this subject. Just a taste of things to come, as we mentioned before already: directives are mapped to rules through orb tags. Don't worry, I'll explain how things work. + +\section{Directives} +\label{sec:directives} + +A \emph{directive} is a special comment inserted in the |.tex| file in which you indicate how \arara should behave. You can +insert as many directives as you want, and in any position of the |.tex| file. \arara will read the whole file and extract the directives. +A directive should be placed in a line of its own, in the form |% arara: <directive>| -- actually, we will see in Section~\ref{sec:filepatterns} +that the prefix search can be altered. There are two types of directives: + +\begin{description} +\item[empty directive] An empty directive, as the name indicates, has only the rule identifier, as we seen in Section~\ref{sec:rules}. +Lines 1 and 3 of Code~\ref{code:directiveslatex} show an example of empty directives. Note that you can suppress arguments +(line 3 in contrast to line 2), but we will see that \arara assumes that you know exactly what you are doing. The syntax for an empty +directive is |% arara: makefoo|. +\item[parametrized directive] A parametrized directive has the rule identifier followed by its arguments. Line 2 of Code~\ref{code:directiveslatex} shows an +example of a parametrized directive. It's very important to mention that the arguments are mapped by their identifiers and not by +their positions. The syntax for a parametrized directive is |% arara: makefoo: { arglist }|. The argument is in the form |arg: value|; a +list of arguments and their respective values is separated by comma. +\end{description} + +\begin{code}[htbp] +\caption{Example of directives in a .tex file.} +\label{code:directiveslatex} +\begin{latex} +%% (*@@*)arara: makefoo +%% (*@@*)arara: makebar: { one: hello, two: bye } +%% (*@@*)arara: makebar +\documentclass{article} +... +\end{latex} +\end{code} + +The arguments are defined according to the rule mapped by the directive. For example, the rule |makebar| (Code~\ref{code:makebar}) +has a list of two arguments, |one| and |two|. So you can safely write |makebar: { one: hello }|, but trying to map a nonexisting argument +with |makebar: { three: hi }| will raise an error. + +If you want to disable an \arara directive, there's no need of removing it from the |.tex| file. Simply replace |% arara:| by |% !arara:| and +this directive will be ignored. \arara always look for a line that, after removing the leading and trailing spaces, starts with a comment |%| +and has the keyword |arara:| in it. In Section~\ref{sec:filepatterns}, we will learn how to override this search pattern, but the |arara:| +keyword is always immutable. + +Directives are mapped to rules. In Section~\ref{sec:orbtags} we will learn about orb tags and then revisit rules and directives. I hope the concepts will be clearer since we will understand what an orb tag is and how it works. How about a nice cup of coffee? + +\section{Orb tags} +\label{sec:orbtags} + +When I was planning the mapping scheme, I opted for a templating mechanism. I was looking for flexibility, and the powerful +\href{http://mvel.codehaus.org}{MVEL} expression language~\cite{mvel:2012} was perfect for the job. I could extend my mapping +plans by using orb tags. An \emph{orb tag} consists of a |@| character followed by braces |{...}| which contain regular MVEL expressions. +In particular, \arara uses the |@{}| expression orb, which contains a value expression which will be evaluated to a string, and +appended to the output template. For example, the following template |Hello, my name is @{name}| with the |name| variable resolving +to |Paulo| will be expanded to the string |Hello, my name is Paulo|. Cool, isn't it? Code~\ref{code:exorbtags} presents a few examples +on how orb tags are expanded. + +\begin{code}[htbp] +\caption{A few examples on how orb tags are expanded.} +\label{code:exorbtags} +\begin{bash} +# always consider: name = Paulo + +In[1]: Hello, my name is @{name}. +Out[1]: Hello, my name is Paulo. + +In[2]: @{name == "Paulo"} +Out[2]: true + +In[3]: @{name.toUpperCase()} +Out[3]: PAULO + +In[4]: Hello, I am @{name == "Paulo" ? "John" : "Mary"}. +Out[4]: Hello, I am John. +\end{bash} +\end{code} + +In the first example of Code~\ref{code:exorbtags}, |@{name}| simply indicates the expansion of the variable into its value, so the output is a +concatenation of the text with the variable value. The second example is a conditional test, that is, whether the |name| variable has its +value equals to |Paulo|; the result of this evaluation is then expanded, which is |true|. The third example presents a more complex construction: since |name| holds a string, MVEL resolves this variable to a |String| object and automatically all methods from the |String| class in Java are available to the variable, so the method |toUpperCase()| is called in order to make all characters in the string to be capitalized, and the output is presented. The fourth and last example presents a ternary operation, which starts with a conditional to be evaluated; if this test evaluates to true, the first string is printed, with the second string being printed in case the test is false. + +When mapping rules, every command argument will be mapped to the form |@{identifier}| with value equals to the content of the |flag| key. +The |@{identifier}| orb tag might hold the value of the |default| key instead, if the key is defined and there were no directive parameters +referring to |identifier|. There are three reserved orb tags, |@{file}|, |@{item}| and |@{parameters}| -- actually, that's not true, there's a +fourth reserved orb tag which plays a very special role in \arara \ -- |@{SystemUtils}| -- but we will talk about it later on. The |@{file}| +orb tag refers to the filename argument passed to \arara. The |@{file}| value can be overriden, but we will discuss it later. The second +reserved orb tag |@{item}| refers to a list of items, in case the rule might use some sort of list iteration, discussed later on. The +third reserved orb tag |@{parameters}| is a map which can expand to the argument value passed in the directive. If you have |makebar: { one: hello }|, the |flag| key of argument |one| will be expanded from the original definition |-i @{parameters.one}| to |-i hello|. Now |@{one}| contains the expanded |flag| value, which is |-i hello|. All arguments tags are expanded in the rule command. If one of them is not defined in the directive, \arara will admit an empty value, so the |command| flag will be expanded to |makebar -i hello mydoc|, unless of course the current argument doesn't have a |default| elements in its definition. The whole procedure is summarized as follows: + +\begin{enumerate} +\item \arara processes a file named |mydoc.tex|. +\item A directive |makebar: { one: hello }| is found, so \arara will look up the rule |makebar.yaml| (Code~\ref{code:makebar}) inside the default rules directory. +\item The argument |one| is defined and has value |hello|, so the corresponding |flag| key will have the orb tag |@{parameters.one}| expanded to |hello|. The new value is now added to the template referenced by the |command| key and then |@{one}| is +expanded to |-i hello|. +\item The argument |two| is not defined, so the template referenced by the |command| key has |@{two}| expanded to an empty string, since there's no |default| key in the argument definition. +\item There are no more arguments, so the template referenced by the |command| key now expands |@{file}| to |mydoc|. +\item The final command is now |makebar -i hello mydoc|. +\end{enumerate} + +There's a reserved directive key named |files|, which is in fact a list. In case you want to override the default value of the |@{file}| orb tag, use the |files| key, +like |makebar: { files: [ thedoc.tex ] }|. This will result in |makebar thedoc.tex| instead of |makebar mydoc.tex|. The very same concept applies +to the other reserved directive key named |items|, which is also a list, and the expansion happens in the |@{item}| orb tag. + +If you provide more than one element in the list, \arara will replicate the directive for every file found, so |makebar: { files: [ a, b, c ] }| will +result in three commands: |makebar a|, |makebar b| and |makebar c|. If you happen to have a rule which makes use of both |files| and +|items| in the directive, you'll end up with a cartesian product of those two lists. + +\printbibliography[heading=subbibliography] + +\chapter{Configuration file} +\label{chap:configurationfile} + +\epigraph{\emph{An algorithm must be seen to be believed.}}{Donald Knuth} + +\arara has support for an optional configuration file in order to enhance and override some settings of the application without the need of delving into the source code. The optional configuration file has to reside inside the user home directory, which is usually |C:\Users\Username| for Windows Vista and superior, or |~/username| for the Unix world, under the name |araraconfig.yaml|. \arara always looks for a configuration file during every execution. In fact, |araraconfig.yaml| is just a plain text file written in the YAML format, starting with the |!config| line and at with least one of the three settings presented in the following sections. The order doesn't matter, as long as they are consistent. + +\section{Search paths} +\label{sec:searchpaths} + +When looking for rules, \arara always searches the default rule path located at |ARARA_HOME/rules|; if no rule is found, the execution +halts with an error. It's not wise to mess with the default rule path, so we use the configuration file to add search paths, that is, a list of +directories in which \arara should look for rules. An example of a new search path is presented in Code~\ref{code:searchone}. + +\begin{code}[htbp] +\caption{An example of a new search path for the configuration file.} +\label{code:searchone} +\begin{yaml} +!config +paths: +- /home/paulo/rules +\end{yaml} +\end{code} + +According to Code~\ref{code:searchone}, from now on, \arara will look for rules first in the |/home/paulo/rules|; if the rule is not found, +then the search falls back to the default search path located at |ARARA_HOME/rules|. We can even add an arbitrary number of paths, as seen in Code~\ref{code:searchtwo}. + +\begin{code}[htbp] +\caption{An arbitrary number of paths added in the configuration file.} +\label{code:searchtwo} +\begin{yaml} +!config +paths: +- /home/paulo/rules +- /opt/arara/rules +- /home/paulo/myrules +\end{yaml} +\end{code} + +The items order defines the search priority. \arara also features a special orb tag for search paths named |@{userhome}| which maps the variable to the user home directory, for example, |/home/paulo|, according to your operating system. But before we proceed, a word on the YAML format. + +Sadly, we can't start values with |@| because this symbol is reserved for future use in the YAML format. For example, |foo: @bar| is an invalid YAML format, so the correct usage is to enclose it in quotes: |foo: '@bar'| or |foo: "@bar"|. We also need to enclose our strings with quotes in \arara, but now we can save them by simply adding the |<arara>| prefix to the value. In other words, |foo: <arara > @bar| is correctly parsed; when that keyword in that specific position is found, \arara removes it. That means that the orb tag presented in Code~\ref{code:searchthree} will be correctly parsed. + +\begin{code}[htbp] +\caption{Using the special orb tag for mapping the home directory in the configuration file.} +\label{code:searchthree} +\begin{yaml} +!config +- '@{userhome}/rules' +- /opt/arara/rules +- <arara> @{userhome}/myrules +\end{yaml} +\end{code} + +It's important to observe that the |<arara>| prefix is also valid in the rules context, presented in Section~\ref{sec:rules}. The idea of using this prefix is to actually ease the writing of rules that involve quoting without the need of escaping all internal quotes or even alternating between single and double quotes. It's also a way of writing cleaner rules. + +\section{Language} +\label{sec:language} + +\arara currently features localized messages in English, French, Italian, German, Spanish, Brazilian Portuguese, Russian and Turkish. The default language fallback is English, but we can easily change the language by adding |language: <code>| to the configuration file, as seen in Code~\ref{code:conflang}. The list of languages and codes is presented in Table~\ref{tab:langcodeconf}. + +\begin{code}[htbp] +\caption{Changing the language in the configuration file.} +\label{code:conflang} +\begin{yaml} +!config +language: en +\end{yaml} +\end{code} + +\begin{table}[htbp] +\centering +\caption{Languages and codes.} +\label{tab:langcodeconf} +\renewcommand{\arraystretch}{1.5} +\begin{tabular}{lr} +\hline +\textbf{Language} & \textbf{Code} \\ +\hline +\hline +English & |en| \\ +Brazilian Portuguese & |ptbr| \\ +Italian & |it| \\ +Spanish & |es| \\ +German & |de| \\ +French & |fr| \\ +Russian & |ru| \\ +Turkish & |tr| +\end{tabular} +\end{table} + +There's also a |--language| command line flag which has a higher priority, so it overrides the configuration file setting, if any. Beware of the terminal you use; the Windows command prompt has serious troubles in understanding UTF-8. You probably won't run into problems with the applications shipped in Mac or Linux. + +\section{File patterns} +\label{sec:filepatterns} + +\arara accepts the following filetypes: |tex|, |dtx| and |ltx|. If no file extension is provided in the command line, for example, calling |arara mydoc| instead of |arara mydoc.tex|, the application will automatically look for files that match the filetypes in that specific order, that is, |mydoc.tex|, |mydoc.dtx| and |mydoc.ltx|. Let's say we want to change the order by promoting |dtx| to the first match; we can easily achieve that by rearranging the items of the list of filetypes in the configuration file according to Code~\ref{code:itemsconf}. + +\begin{code}[htbp] +\caption{Rearranging the list of filetypes in the configuration file.} +\label{code:itemsconf} +\begin{yaml} +!config +filetypes: +- extension: dtx +- extension: tex +- extension: ltx +\end{yaml} +\end{code} + +The |filetypes| key in the configuration file is actually way more powerful than the example shown in Code~\ref{code:itemsconf}. Before +we continue, let's start with some basics. Consider the three directives presented in Code~\ref{code:confdirectives}. + +\begin{code}[htbp] +\caption{Three directives with different formatting patterns.} +\label{code:confdirectives} +\begin{latex} +% (*@@*)arara: foo + % (*@@*)arara: foo +% (*@@*) arara: foo +\documentclass{book} +... +\end{latex} +\end{code} + +The default setting for \arara is to recognize the three directives shown in Code~\ref{code:confdirectives}. In other words, the search pattern for all the three extensions is |^(\\s)*%\\s+| plus |arara:\\s| which is immutable, of course. Let’s say that, for the |dtx| format, you want +\arara to look for directives that have no spaces in the beginning of the line, that is, the line must start with only one percentage sign followed by at least one space and the default prefix. We can easily achieve such requirement by adding a |pattern| element to our list, as presented in Code~\ref{code:confdirectivessearch}. + +\begin{code}[htbp] +\caption{Changing the search pattern for \mycmd{.dtx} files.} +\label{code:confdirectivessearch} +\begin{yaml} +!config +!config filetypes: +- extension: dtx + pattern: ^%\\s+ +- extension: tex +- extension: ltx +\end{yaml} +\end{code} + +Now, only the first directive of Code~\ref{code:confdirectives} is recognized, if the analyzed file has the |.dtx| extension. All other extensions -- |.tex| and |.ltx| -- will follow the default search pattern. + +We can also extend \arara to analyze files with arbitrary extensions. As an example, let's suppose we have a sample |hello.c| file, presented in Code~\ref{code:helloc}. Note that the code was omitted for obvious reasons, since we are interested in the header. + +\begin{code}[htbp] +\caption{A sample \mycmd{hello.c} code.} +\label{code:helloc} +\begin{clang} +// arara: gcc +#include <stdio.h> +... +\end{clang} +\end{code} + +We can add the |.c| extension to be recognized by \arara by simply adding the extension and search pattern entries in the configuration file, as presented in Code~\ref{code:confc}. + +\begin{code}[htbp] +\caption{Adding support for \mycmd{.c} files in the configuration file.} +\label{code:confc} +\begin{yaml} +!config +filetypes: +- extension: c + pattern: ^\\s*//\\s* +\end{yaml} +\end{code} + +Done, now \arara can support |.c| files! We can run |arara hello.c| and have our code compiled, provided we have a |gcc| rule, of course. The extensions list will be |.tex|, |.dtx|, |.ltx| and |.c|. If you want to change the order, it’s a matter of rearranging the items, as shown in Code~\ref{code:confctwo}. + +\begin{code}[htbp] +\caption{Rearranging items of arbitrary extensions in the configuration file.} +\label{code:confctwo} +\begin{yaml} +!config +filetypes: +- extension: c + pattern: ^\\s*//\\s* +- extension: tex +- extension: dtx +- extension: ltx +\end{yaml} +\end{code} + +From now on, the |.c| has priority over all other extensions. It's very important to note that for customized extensions, the |pattern| key is mandatory. For default extensions, use the |pattern| key if and only if you want to override the search pattern. + +\arara comes with a rule for Sketch~\cite{sketch:2013}, written by Sergey Ulyanov. We can easily add |% arara: sketch: { files: [ drawing.sk ] }| +and Sketch will be properly called. Let's say we want to make \arara recognize Sketch files; it's just a matter of adding the extension and the +search pattern in our configuration file, as presented in Code~\ref{code:sketchconfig}. + +\begin{code}[htbp] +\caption{Adding support for Sketch files in the configuration file.} +\label{code:sketchconfig} +\begin{yaml} +!config +filetypes: +- extension: sk + pattern: ^(\\s)*[%#]\\s+ +\end{yaml} +\end{code} + +Now \arara supports |.sk| files! We can write a sample Sketch file (borrowed from the documentation) presented in Code~\ref{code:sketchsample} and add a |sketch| directive. The comments in the Sketch language allow both |%| and |#| symbols at the beginning of the line. + +\begin{code}[htbp] +\caption{\mycmd{drawing.sk}, a sample Sketch file.} +\label{code:sketchsample} +\begin{latex} +% arara: sketch +polygon(0,0,1)(1,0,0)(0,1,0) +line(-1,-1,-1)(2,2,2) +\end{latex} +\end{code} + +With the new settings presented in Code~\ref{code:sketchconfig}, we can run |arara drawing| or |arara drawing.sk| (Code~\ref{code:sketchsample}) and Sketch will be properly executed through \arara with no problems. + +\printbibliography[heading=subbibliography] + +\chapter{Running \texorpdfstring{\arara}{arara}} +\label{chap:runningarara} + +\epigraph{\emph{Never trust a computer you can't throw out a window.}}{Steve Wozniak} + +Now that we have learned some basics, it's time to run \arara! Thankfully, the application is very user-friendly; if something +goes wrong, we can easily find out what happened through messages and the log file. + +\section{Command line} +\label{sec:commandline} + +\arara has a very simple command line interface. A simple |arara mydoc| does the trick -- provided that |mydoc| has the proper directives. +The default behaviour is to run in silent mode, that is, only the name and the execution status of the current task are displayed. +The idea of the silent mode is to provide a concise output. Sadly, in some cases, we want to follow the compilation workflow and even +interact with a command which requires user input. If you have an interactive command, \arara won't even bother about it: the execution +will halt and the command will fail. Well, that's the silent mode. Thankfully, \arara has a set of flags that can change the default +behaviour or even enhance the compilation workflow. Table~\ref{tab:araraflags} shows the list of available \arara flags, +with both short and long options. + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[htbp] +\centering +\footnotesize +\begin{tabular}{p{0.1\textwidth}p{0.2\textwidth}p{0.55\textwidth}} +\hline +\textbf{Flag} & & \textbf{Behaviour}\\ +\hline +\hline +|-h| & |--help| & This flag prints the help message, as seen in +Code~\ref{code:arararun}, and exits the application. If you run |arara| without +any flags or a file to process, this is the default behaviour. \\ +\hline +|-L c| & |--language c| & The |--language| flag sets the language of the current +execution of \arara, where |c| is the language code presented in Table~\ref{tab:langcodeconf}, +on page~\pageref{tab:langcodeconf}. Note that this flag has higher priority than the +language set in the configuration file. \\ +\hline +|-l| & |--log| & The |--log| flag enables the logging feature of \arara. All +streams from all commands will be logged and, at the end of the execution, an +|arara.log| file will be generated. The logging feature is discussed in +Section~\ref{sec:logging}. \\ +\hline +|-t n| & |--timeout n| & This flag sets an execution timeout for every task. If +the timeout is reached before the task ends, \arara will kill it and interrupt +the processing. The $n$ value is expressed in milliseconds. \\ +\hline +|-v| & |--verbose| & The |--verbose| flag enables all streams to be flushed to +the terminal -- exactly the opposite of the silent mode. This flag also allows +user input if the current command requires so. The user input interaction is +possible thanks to the amazing Apache Commons Exec library~\cite{exec:2010}. \\ +\hline +|-V| & |--version| & This flag, as the name indicates, prints the current +\arara version and exits the application. \\ +\hline +\end{tabular} +\caption{The list of available \arara flags.} +\label{tab:araraflags} +\end{table}} + +\arara can recognize three types of files based on their extension, in this order: |.tex|, |.dtx| and |.ltx|. Other extensions are not recognized, unless of +course you provide the correct mapping for them in the configuration file, as discussed in Section~\ref{sec:filepatterns}. + +The combination of flags is very useful to enhance the \TeX\ experience. They can provide nice features for integrating \arara with +\TeX\ IDEs, as seen in Chapter~\ref{chap:ideintegration}. Note that both |--log| and |--verbose| flags are the most common combo +to use in an IDE, so we can have both terminal and file output at the same time without any cost. + +\section{Messages} +\label{sec:messages} + +Messages are the first type of feedback provided by \arara. They are basically related to rules, directives and configuration settings. +Bad syntax, nonexisting rules, malformed directives, wrong expansion, \arara tries to tell you what went wrong. Those messages are +usually associated with errors. We tried to include useful messages, like telling in which directive and line an error ocurred, or +that a certain rule does not exist or has an incorrect format. \arara also checks if a command is valid. For example, if you try to call a rule +that executes a nonexisting |makefoo| command, \arara will complain about it. + +These messages usually cover the events that can happen during the preprocessing phase. Don't panic, \arara will tell you what happened. +Of course, an error halts the execution, so we need to fix the reported issue before proceeding. Note that \arara can also complain about nonexisting commands -- in this case, the error will be raised in runtime, since it's an underlying operating system dependency. + +If you use the |--language| flag or set up the |language| key in the configuration file, \arara will be able to display localized messages +according to the provided language code. In other words, users will be able to read messages from the application in languages other +English. Currently, \arara is able to display messages in English, Brazilian Portuguese, Spanish, German, Italian, French, Russian and Turkish. +Have fun! + +\section{Logging} +\label{sec:logging} + +Another way of looking for an abnormal behaviour is to read the proper |.log| file. Unfortunately, not every command emits a report of +its execution and, even if the command generates a |.log| file, multiple runs would overwrite the previous reports and we would have +only the last call. \arara provides a more consistent way of monitoring commands and their own behaviour through a global +|.log| file that holds every single bit of information. You can enable the logging feature by adding either the |--log| or |-l| flags to +the |arara| application. + +Before we continue, I need to explain about standard streams, since they constitute an important part of the generated |.log| file +by \arara. Wikipedia~\cite{streams:2012} has a nice definition of them: + +\begin{quotation} +\noindent ``In computer programming, standard streams are preconnected input and +output channels between a computer program and its environment (typically a +text terminal) when it begins execution. The three \textsc{i/o} connections are +called standard input (|stdin|), standard output (|stdout|) and standard error +(|stderr|).'' +\end{quotation} + +Basically, the operating system provides two streams directed to display data: |stdout| and |stderr|. Usually, the first stream is +used by a program to write its output data, while the second one is typically used to output error messages or diagnostics. +Of course, the decision of what output stream to use is up to the program author. + +When \arara traces a command execution, it logs both |stdout| and |stderr|. The log entry for both |stdout| and |stderr| is referred +as \emph{Output logging}. Again, an output to |stderr| does not necessarily mean that an error was found in the code, while an +output to |stdout| does not necessarily mean that everything ran flawlessly. It's just a naming convention, as the program author +decides how to handle the messages flow. That's why \arara logs them both in the same output stream. Read the log entries carefully. +A excerpt of the resulting |arara.log| from |arara helloindex --log| is shown in Code~\ref{code:araralog} -- several lines were removed in order to leave only the more important parts. + +\begin{code}[htbp] +\caption{\mycmd{arara.log} from \mycmd{arara helloindex {-}{-}log}.} +\label{code:araralog} +\begin{lstlisting}[basicstyle=\footnotesize\ttfamily, columns=flexible, showspaces=false, breaklines=true] +09 Abr 2012 11:27:58.400 INFO Arara - Welcome to Arara! +09 Abr 2012 11:27:58.406 INFO Arara - Processing file helloindex.tex, please wait. +09 Abr 2012 11:27:58.413 INFO DirectiveExtractor - Reading directives from helloindex.tex. +09 Abr 2012 11:27:58.413 TRACE DirectiveExtractor - Directive found in line 1 with pdflatex. +... +09 Abr 2012 11:27:58.509 INFO DirectiveParser - Parsing directives. +09 Abr 2012 11:27:58.536 INFO TaskDeployer - Deploying tasks into commands. +09 Abr 2012 11:27:58.703 INFO CommandTrigger - Ready to run commands. +09 Abr 2012 11:27:58.704 INFO CommandTrigger - Running PDFLaTeX. +09 Abr 2012 11:27:58.704 TRACE CommandTrigger - Command: pdflatex helloindex.tex +09 Abr 2012 11:27:59.435 TRACE CommandTrigger - Output logging: This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) +... +Output written on helloindex.pdf (1 page, 12587 bytes). +Transcript written on helloindex.log. +09 Abr 2012 11:27:59.435 INFO CommandTrigger - PDFLaTeX was successfully executed. +09 Abr 2012 11:27:59.655 INFO CommandTrigger - Running MakeIndex. +09 Abr 2012 11:27:59.655 TRACE CommandTrigger - Command: makeindex helloindex.idx +09 Abr 2012 11:27:59.807 TRACE CommandTrigger - Output logging: This is makeindex, version 2.15 [TeX Live 2011] (kpathsea + Thai support). +... +Generating output file helloindex.ind..done (9 lines written, 0 warnings). +Output written in helloindex.ind. +Transcript written in helloindex.ilg. +09 Abr 2012 11:27:59.807 INFO CommandTrigger - MakeIndex was successfully executed. +... +09 Abr 2012 11:28:00.132 INFO CommandTrigger - All commands were successfully executed. +09 Abr 2012 11:28:00.132 INFO Arara - Done. +\end{lstlisting} +\end{code} + +The \arara log is useful for keeping track of the execution flow as well as providing feedback on how both rules and directives are being +expanded. The log file contains information about the directive extraction and parsing, rules checking and expansion, deployment of tasks +and execution of commands. The \arara messages are also logged. + +If by any chance your code is not working, try to run |arara| with the logging feature enabled. It might take a while for you to digest the log +entries, but I'm sure you will be able to track every single step of the execution and fix the offending line in your code. + +\section{Command output} +\label{sec:commandoutput} + +Even when the |--log| flag is enabled, \arara still runs in silent mode. There's a drawback of this mode: if there's an interactive command +wich requires the user input, \arara will simply halt the task and the execution will fail. We need to make |stdin| -- the standard input stream -- available for us. Thanks to the amazing Apache Commons Exec library~\cite{exec:2010}, \arara can also provide an access layer to the +standard input stream in order to interact with commands, when needed. We just need to use a special |--verbose| flag. + +It's important to note that both |--log| and |--verbose| flags can be used together; \arara will log everything, including the input stream. +I usually recommend those two flags when integrating \arara with \TeX\ IDEs, like we did in Chapter~\ref{chap:ideintegration}. + +\printbibliography[heading=subbibliography] + +\part{For authors} +\label{part:forauthors} + +\chapter{Quick start} +\label{sec:quickstarta} + +\epigraph{\emph{Snakes! Why did it have to be snakes?}}{Indiana Jones, \emph{Raiders of the Lost Ark} (1981)} + +This chapter covers a quick start of \arara, including an overview of the predefined rules and some notes on how to properly organize +directives in the source code. + +\section{Predefined rules} +\label{sec:predefinedrules} + +Let's take a look on the predefined rules and a brief description of their parameters. Note that these rules are constantly updated; +the most recent versions are available in the project repository. + +For convenience, we will use |yes| and |no| for representing boolean values. Note that you can also use other pairs: |on| and |off|, +and |true| and |false|. These values are also case insensitive, so entries like |True| or |NO| are valid. + +Note that the |latex|, |pdflatex|, |xelatex| and |lualatex| rules have a |shell| parameter resolving to |--shell-escape|. This flag is +also available in MiK\TeX, but as an alias to the special |--enable-write18| flag. If you want to use \arara with an outdated +MiK\TeX\ distribution which doesn't support the |--shell-escape| alias, make sure to edit the predefined rules accordingly -- +these rules are located inside |$ARARA_HOME/rules| -- and replace all occurrences of |--shell-escape| by |--enable-write18|. +Another option is to add another search path in the configuration file with modified rules, since custom search paths have higher priority +than the default rules directory. If you use \TeX~Live or a recent Mik\TeX\ installation, there's no need to edit the rules, since the +|--shell-escape| flag is already available. + +\subsection*{\texorpdfstring{\hologo{biber}}{biber}} + +\begin{description} +\item[Description] This rule maps \hologo{biber}, calling the |biber| command +with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: biber| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{BibTeX}}{BibTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{BibTeX}, calling the |bibtex| command +with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: bibtex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Clean} + +\begin{description} +\item[Description] This rule maps the removal command from the underlying operating system. There are no parameters for this rule, +except the the reserved directive key |files| which \textit{must} be used. If |files| is not used in the directive, \arara will simply ignore this rule. +\item[Syntax] |% arara: clean| +\end{description} + +\subsection*{dvips} + +\begin{description} +\item[Description] This rule maps dvips, calling the |dvips| command with the +proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: dvips| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[output] This parameter is used to set the output PostScript filename. +If not provided, the default output name is set to |@{getBasename(file)}.ps|. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{frontespizio} + +\begin{description} +\item[Description] This rule maps a compilation chain defined in |frontespizio|, a package written by Enrico Gregorio; it calls a defined \TeX\ engine three times with the proper parameters, when available. All parameters are optional. If no engine is provided, |pdflatex| is used as default. When |latex| is the chosen engine, there's an additional call to dvips. +\item[Syntax] |% arara: frontespizio| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[engine] This parameter is used to set the \TeX\ engine. If not provided, |pdflatex| is used as a default value. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{LaTeX}}{LaTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{LaTeX}, calling the |latex| command +with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: latex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[draft] This is a boolean parameter which sets the draft mode, that is, no +PDF output is generated. When value set to true, the draft mode is enabled, +while false disables it. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Latexmk cleanup} + +\begin{description} +\item[Description] This rule calls the cleanup option of Latexmk, according to the provided parameters. All parameters are optional. +\item[Syntax] |% arara: lmkclean| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[include] This parameter, if equals to |all|, will remove all generated files, leaving only the source code intact; otherwise only the auxiliary files will be removed. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{LuaLaTeX}}{LuaLaTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{LuaLaTeX}, calling the |lualatex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: lualatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[draft] This is a boolean parameter which sets the draft mode, that is, +no PDF output is generated. When value set to true, the draft mode is enabled, +while false disables it. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Latexmk with \texorpdfstring{\hologo{LuaLaTeX}}{LuaLaTeX}} + +\begin{description} +\item[Description] This rule calls Latexmk with \hologo{LuaLaTeX} as engine. All parameters are optional. +\item[Syntax] |% arara: lualatexmk| +\end{description} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\item[style] This parameter is used in case you want to provide a style for |makeindex|, if different than the default style. +\end{ruleoptions} + + +\subsection*{\texorpdfstring{\hologo{LuaTeX}}{LuaTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{LuaTeX}, calling the |luatex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: luatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[draft] This is a boolean parameter which sets the draft mode, that is, +no PDF output is generated. When value set to true, the draft mode is enabled, +while false disables it. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + + +\subsection*{Make} + +\begin{description} +\item[Description] This rule maps Make, calling the |make| command with the +proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: make| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[task] This parameter is used to set the task name for |make| to execute. +\end{ruleoptions} + +\subsection*{MakeGlossaries} + +\begin{description} +\item[Description] This rule maps MakeGlossaries, calling the |makeglossaries| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: makeglossaries| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{MakeIndex} + +\begin{description} +\item[Description] This rule maps MakeIndex, calling the |makeindex| command +with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: makeindex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[style] This parameter sets the index style. If not defined, |makeindex| +relies on the default index style. +\item[german] This is a boolean parameter which sets the German word ordering +in the index. If true, the German word ordering will be employed; if the value +is set to false, |makeindex| will rely on the default behaviour. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Nomencl} + +\begin{description} +\item[Description] This rule maps Nomencl, which is in fact a call to the +|makeindex| command with the the nomenclature feature. All parameters are optional. +\item[Syntax] |% arara: nomencl| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[style] This parameter sets the nomenclature style. If not defined, +|makeindex| relies on the default nomenclature style. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{pdfLaTeX}}{PDFLaTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{pdfLaTeX}, calling the |pdflatex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: pdflatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[draft] This is a boolean parameter which sets the draft mode, that is, no +PDF output is generated. When value set to true, the draft mode is enabled, +while false disables it. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Latexmk with \texorpdfstring{\hologo{pdfLaTeX}}{pdfLaTeX}} + +\begin{description} +\item[Description] This rule calls Latexmk with \hologo{pdfLaTeX} as engine. All parameters are optional. +\item[Syntax] |% arara: pdflatexmk| +\end{description} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\item[style] This parameter is used in case you want to provide a style for |makeindex|, if different than the default style. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{pdfTeX}}{PDFTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{pdfTeX}, calling the |pdftex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: pdflatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[draft] This is a boolean parameter which sets the draft mode, that is, no +PDF output is generated. When value set to true, the draft mode is enabled, +while false disables it. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{ps2pdf} + +\begin{description} +\item[Description] This rule maps pdf2pdf, calling the |ps2pdf| command with +the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: ps2pdf| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[output] This parameter is used to set the output PDF filename. If not +provided, the default output name is set to |@{getBasename(file)}.pdf|. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Sketch} + +\begin{description} +\item[Description] This rule maps Sketch, a small, simple system for producing line drawings of two or three-dimensional objects and scenes. All parameters are optional. +\item[Syntax] |% arara: sketch| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[input] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{songidx} + +\begin{description} +\item[Description] This rule maps |songidx|, a command line tool used to extract songs metadata from an file generated by the |songs| package\footnote{\url{http://songs.sourceforge.net}, written by Kevin Hamlen.} The parameter is mandatory. +\item[Syntax] |% arara: songidx| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[input] This parameter sets the name of the file generated by |songs| in which |songidx| will extract the songs metadata. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\TeX}{TeX}} + +\begin{description} +\item[Description] This rule maps \TeX, calling the |tex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: pdflatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{XeLaTeX}}{XeLaTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{XeLaTeX}, calling the |xelatex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: xelatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\subsection*{Latexmk with \texorpdfstring{\hologo{XeLaTeX}}{XeLaTeX}} + +\begin{description} +\item[Description] This rule calls Latexmk with \hologo{XeLaTeX} as engine. All parameters are optional. +\item[Syntax] |% arara: xelatexmk| +\end{description} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\item[style] This parameter is used in case you want to provide a style for |makeindex|, if different than the default style. +\end{ruleoptions} + +\subsection*{\texorpdfstring{\hologo{XeTeX}}{XeTeX}} + +\begin{description} +\item[Description] This rule maps \hologo{XeTeX}, calling the |xetex| +command with the proper parameters, when available. All parameters are optional. +\item[Syntax] |% arara: xelatex| +\end{description} + +\subsubsection*{Parameters} + +\begin{ruleoptions} +\item[action] This parameter sets the interaction mode flag. Possible options +are |batchmode|, |nonstopmode|, |scrollmode|, and |errorstopmode|. If not +defined, no flag will be set. +\item[shell] This is a boolean parameter which sets the shell escape mode. If +true, shell escape will be enabled; if the value is set to false, the feature +will be completely disabled. If not defined, the default behaviour is rely on +restricted mode. +\item[synctex] This parameter is defined as boolean and sets the generation of +Sync\TeX\ data for previewers. If true, data will be generated; false will +disable this feature. If not defined, no flag will be set. +\item[options] This parameter is used to provide flags which were not +mapped. It is recommended to enclose the value with single or double quotes. +\end{ruleoptions} + +\section{Organizing directives} +\label{sec:organizingdirectives} + +Actually, there's nothing much to say about directives, they are really easy to use. The important part when dealing with directives is to make sure we will only use the right amount of them. Remember, for each directive, there will be call to the command line tool, and this might take some time. + +Since a directive can have as many parameters as its corresponding rule has, we need to take care. If an argument value has spaces, enclose it with quotes. Again, try to avoid at all costs values with spaces, but if you really need them, enclose the value with single quotes. If you want to make sure that both rules and directives are being mapped and expanded correctly, enable the logging option with the |--log| flag and verify +the output. All expansions are logged. + +Although \arara reads the whole file looking for directives, it's a good idea to organize them at the top of the file. It will surely make your life easier, as you can quickly spot the compilation chain to be applied to the current document. If there's something wrong with a directive, don't worry, \arara will be able to track the inconsistency down and warn us about it. + +\chapter{Reference for rule library} +\label{chap:referenceforrulelibraryone} + +\epigraph{\emph{Your brain may give birth to any technology, but other brains will decide whether the technology thrives. The number of possible technologies is infinite, and only a few pass this test of affinity with human nature.}}{Robert Wright} + +This chapter aims at discussing the reserved keywords of \arara for directive arguments and special orb tags, their purpose and how to correctly use them in the context of a document. + +\section{Directive arguments} +\label{sec:directivearguments} + +As seen in the previous chapters, \arara has two reserved keywords for directive arguments which cannot be defined as arguments of a rule: |files| and |items|. Those variables do not hold a single value as the usual directive argument does, but they actually refer to a list of values instead. in the YAML format, a list is defined as a sequence of elements separated by a comma and enclosed with |[]|. For example, |items: [ a, b, c ]| is a list and refers to the elements |a|, |b| and |c|. Let's see in more details about each directive argument. + +\begin{ruleoptions} +\item[files] When not defined with a proper value in the directive definition, |files| contains only one value: the current file reference. When we explicitly add this argument to a directive, the value is overriden, and \arara considers one iteration per element. In order words, if we have |foo: { files: [ a, b, c ] }|, \arara will perform the execution of the task |foo| three times, one for each value of |files|. Each value of |files| is expanded to the |@{file}| orb tag in the rule context. +\item[items] The |items| directive argument, although it has the exact behaviour of |files| in the processing phase, happens to have a different semantics. Think of a rule that needs to process a list of elements, say, a list of extensions, files to copy, and so forth; for every value defined in |items|, \arara will perform the execution the current task. It's important to note that |items| has an empty list by default. Each value of |items| is expanded to the |@{item}| orb tag in the rule context. +\end{ruleoptions} + +Both |files| and |items| can be used in any directive, if the rule of course makes use of their corresponding |@{file| and |@{item}| orb tags. Please note that, if those two lists are defined in the directive, \arara will resolve the variables as the cartesian product of the lists. + +\section{Special orb tags} +\label{sec:specialorbtags} + +In the rule context, \arara has four reserved keywords which cannot be assigned as arguments identifiers; each one of them has its own purpose and semantics, besides of course mapping different values. These orb tags are |@{file}|, |@{item}|, |@{parameters}| and |@{SystemUtils}|. + +\begin{ruleoptions} +\item[file] This orb tags always resolve to the filename processed by \arara. If the |files| directive argument is used in the directive definition, |@{file}| will resolve, in each iteration, to the current value of that list. The variable always hold an string value and it's never empty. +\item[item] The |@{item}| orb tag resolves to each element of the list of items defined through the |items| directive argument. In each iteration of the |items| list, |@{item}| will resolve to the current value of that list. The variable always hold an string value and it is empty by default. +\item[parameters] This orb tag is actually a map, that is, a collection of variables. The |@{parameters}| orb tag is set with all the directive arguments and their corresponding values. The access to a variable is done through |parameters.<variable>|, so if we want to access the |foo| directive argument value, we simply write |@{parameters.foo}|. +\item[SystemUtils] This orb tag maps the |SystemUtils| class from the Apache Commons Lang library~\cite{lang:2001} and provides a lot of methods and properties in order to write cross-platform rules. Table~\ref{tab:properties} on page~\pageref{tab:properties} presents the list of properties available in the |@{SystemUtils}| orb tag. +\end{ruleoptions} + +Since these are reserved keywords used for special orb tags, \arara will raise an error if there's an attempt of assigning one of them as rule argument identifier. + +\printbibliography[heading=subbibliography] + +\part{For rulemakers} +\label{part:forrulemakers} + +\chapter{Quick start} +\label{chap:quickstartrm} + +\epigraph{\emph{Cause and effect act in webs, not chains.}}{Steve Grand} + +Now that we know about rules, directives and orb tags, it's time to come up with some examples. I know it might not be trivial to understand how \arara works in a glance, but I'm sure the examples will help with the concepts. Please note that there might have platform-specific rules, so double-check the commands before running them -- actually, don't worry, \arara has a card up its sleeve. + +\section{Writing rules} +\label{sec:writingrules} + +Before we proceed, I think it's important to mention this note again: we can't start values with |@| because this symbol is reserved for future use in the YAML format. For example, |foo: @bar| is an invalid YAML format, so the correct usage is to enclose it in quotes: |foo: '@bar'| or |foo: "@bar"|. We also need to enclose our strings with quotes in \arara, but we can save them by simply adding the |<arara>| prefix to the value. In other words, |foo: <arara > @bar| is correctly parsed; when that keyword in that specific position is found, \arara removes it. + +Our first example is to add support to \hologo{pdfLaTeX} instead of using the default rule. Our first attempt to write this rule is presented in Code~\ref{code:pdflatexone}. Make sure to create a directory to store your own rules and don't forget to add this directory to the search path in the configuration file (Chapter~\ref{chap:configurationfile}). + +\begin{code}[htbp] +\caption{\mycmd{pdflatex.yaml}, first attempt.} +\label{code:pdflatexone} +\begin{yaml} +!config +identifier: pdflatex +name: PDFLaTeX +command: pdflatex "@{file}" +arguments: [] +\end{yaml} +\end{code} + +So far, so good. The |command| flag has the |pdflatex| program and the |@{file}| +orb tag. Now we can add the |pdflatex| directive to our |.tex| file, as we can see in +Code~\ref{code:helloexampleone}. + +\begin{code}[htbp] +\caption{\mycmd{helloworld.tex}} +\label{code:helloexampleone} +\begin{latex} +% (*@@*)arara: pdflatex +\documentclass{article} + +\begin{document} +Hello world. +\end{document} +\end{latex} +\end{code} + +It's just a matter of calling |arara helloworld| -- you can also provide the |.tex| +extension by calling |arara helloworld.tex|, after all the extension will be +removed anyway -- and \arara will process our file, according to the +Code~\ref{code:araraoutputone}. + +\begin{code}[htbp] +\caption{\arara output for the \mycmd{pdflatex} task.} +\label{code:araraoutputone} +\begin{bash} +$ arara helloworld + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +Running PDFLaTeX... SUCCESS +\end{bash} +\end{code} + +Great, our first rule works like a charm. Once we define a rule, the directive is +automatically available for us to call it as many times as we want. What if we +make this rule better? Consider the following situation: + +\begin{quotation} +\noindent Sometimes, we need to use |\write18| to call a package that makes use of +it (for example, |minted|). It's very dangerous to enable shell escape globally, +but changing the |pdflatex| call every time we need it sounds boring. +\end{quotation} + +\arara has a special treatment for cases like this. We will rewrite our |pdflatex| rule to include a flag for shell escape. Another +cool feature will be presented now, as we can see in the new rule shown in Code~\ref{code:pdflatextwo}. + +\begin{code}[htbp] +\caption{\mycmd{pdflatex.yaml}, second attempt.} +\label{code:pdflatextwo} +\begin{yaml} +!config +identifier: pdflatex +name: PDFLaTeX +command: pdflatex @{shell} "@{file}" +arguments: +- identifier: shell + flag: <arara> @{parameters.shell == "yes" ? "--shell-escape" : "--no-shell-escape" } +\end{yaml} +\end{code} + +Line 7 from Code~\ref{code:pdflatextwo} makes use of the ternary operator |?:| which defines a conditional expression. In the first part of the evaluation, we check if |parameters.shell| is equal to the string |"yes"|. If so, |"--shell-escape"| is defined as the result of the operation. If the conditional expression is false, |"--no-shell-escape"| is set instead. + +What if you want to allow |true| and |on| as valid options as well? We can easily rewrite our orb tag to check for additional values, but \arara has a clever way of doing that: a function to look for boolean values! In this case, we will use a function named |isTrue()|, available in the rule context. Please refer to Section~\ref{sec:functions} for a list of the available functions and their meanings. The new attempt is presented in Code~\ref{code:pdflatexthree} + +\begin{code}[htbp] +\caption{\mycmd{pdflatex.yaml}, third attempt.} +\label{code:pdflatexthree} +\begin{yaml} +!config +identifier: pdflatex +name: PDFLaTeX +command: pdflatex @{shell} "@{file}" +arguments: +- identifier: shell + flag: <arara> @{ isTrue( parameters.shell, "--shell-escape" , "--no-shell-escape" ) } +\end{yaml} +\end{code} + +With this new rule, it's now easy to enable the shell escape option in |pdflatex|. Simply go with the directive |pdflatex: { shell: yes }|. You can also use |true| or |on| instead of |yes|. Any other value for |shell| will disable the shell escape option. It's important to observe that \arara directives have no mandatory arguments. If you want to add a dangerous option like |--shell-escape|, consider calling it as an argument with a proper check and rely on a safe state for the argument fallback. + +For the next example, we will create a rule for MakeIndex. To be honest, although |makeindex| has a lot of possible arguments, I only use the |-s| flag once in a while. Code~\ref{code:makeindexone} shows our first attempt of writing this rule. Note that we are making use of another built-in function of \arara named |getBasename()|; this function returns the name of the file without the extension. + +\begin{code}[htbp] +\caption{\mycmd{makeindex.yaml}, first attempt.} +\label{code:makeindexone} +\begin{yaml} +!config +identifier: makeindex +name: MakeIndex +command: makeindex @{style} "@{ getBasename(file) }.idx" +arguments: +- identifier: style + flag: <arara> -s @{parameters.style} +\end{yaml} +\end{code} + +As a follow-up to our first attempt, we will now add support for the |-g| flag that employs German word ordering in the index. Since this flag is basically a switch, we can borrow the same tactic used for enabling shell escape in the |pdflatex| rule from Code~\ref{code:pdflatexthree}. The new rule is presented in Code~\ref{code:makeindextwo}. + +\begin{code}[htbp] +\caption{\mycmd{makeindex.yaml}, second attempt.} +\label{code:makeindextwo} + +\begin{yaml} +!config +identifier: makeindex +name: MakeIndex +command: makeindex @{style} "@{ getBasename(file) }.idx" +arguments: +- identifier: style + flag: <arara> -s @{parameters.style} +- identifier: german + flag: <arara> @{ isTrue( parameters.german, "-g" ) } +\end{yaml} +\end{code} + +The new |makeindex| rule presented in Code~\ref{code:makeindextwo} looks good. We can now test the compilation workflow with an example. Consider a file named |helloindex.tex| which has a few index entries for testing purposes, presented in Code~\ref{code:examplemakeindex}. As usual, I'll present my normal workflow, that involves calling |pdflatex| two times to get references right, one call to |makeindex| and finally, a last call to |pdflatex|. Though there's no need of calling |pdflatex| two times in the beginning, I'll keep that as a good practice from my side. + +\begin{code}[htbp] +\caption{\mycmd{helloindex.tex}} +\label{code:examplemakeindex} +\begin{latex} +% (*@@*)arara: pdflatex +% (*@@*)arara: pdflatex +% (*@@*)arara: makeindex +% (*@@*)arara: pdflatex +\documentclass{article} + +\usepackage{makeidx} + +\makeindex + +\begin{document} + +Hello world\index{Hello world}. + +Goodbye world\index{Goodbye world}. + +\printindex + +\end{document} +\end{latex} +\end{code} + +By running |arara helloindex| or |arara helloindex.tex| in the terminal, we will obtain the same output from Code~\ref{code:araramakeexample}. The execution order is defined by the order of directives in the |.tex| file. If any command fails, \arara halts at that position and nothing else is executed. + +You might ask how \arara knows if the command was successfully executed. The idea is quite simple: good programs like |pdflatex| make use of a concept known as exit status. In short, when a program had a normal execution, the exit status is zero. Other values are returned when an abnormal execution happened. When |pdflatex| successfully compiles a |.tex| file, it returns zero, so \arara intercepts this number. Again, it's a good practice to make command line applications return a proper exit status according to the execution flow, but beware: you might find applications or shell commands that don't feature this control (in the worst case, the returned value is always zero). \arara relies on +the \href{http://commons.apache.org/exec/}{Apache Commons Exec} library to provide the system calls. + +\begin{code}[!htbp] +\caption{Running \mycmd{helloindex.tex}.} +\label{code:araramakeexample} +\begin{bash} +$ arara helloindex + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +Running PDFLaTeX... SUCCESS +Running PDFLaTeX... SUCCESS +Running MakeIndex... SUCCESS +Running PDFLaTeX... SUCCESS +\end{bash} +\end{code} + +According to the terminal output shown in Code~\ref{code:araramakeexample}, \arara executed all the commands successfully. In Section~\ref{sec:logging} we discuss how \arara works with commands and how to get their streams for a more detailed analysis. + +For the next example, we will write a rule for both \hologo{BibTeX} and \hologo{biber}. Instead of writing two rules -- one for each command -- I'll show how we can use conditional expressions and run different commands in a single rule. The common scenario is to have each tool mapped to its own rule, but as we can see, rules are very flexible. Let's see how \arara handles this unusual |bibliography| rule presented in Code~\ref{code:bibone}. + +\begin{code}[htbp] +\caption{\mycmd{bibliography.yaml}} +\label{code:bibone} +\begin{yaml} +!config +identifier: bibliography +name: Bibliography +command: <arara> @{engine} @{args} @{ getBasename(file) } +arguments: +- identifier: engine + flag: <arara> @{ isTrue( parameters.engine == "biber", "biber", "bibtex" ) } + default: bibtex +- identifier: args + flag: <arara> @{parameters.args} +\end{yaml} +\end{code} + +The |bibliography| rule is quite simple, actually. If no |engine| is provided in the |bibliography| directive, the |default| element of the |engine| argument will be set to |bibtex|. Otherwise, if the |engine| parameter is set to |biber| -- and only this value -- the |engine| orb tag +will expand the result to |biber|. Code~\ref{code:examplebib} presents only the header of our |biblio.tex| file using the new |bibliography| directive. Other options are shown in Table~\ref{tab:biblio}. + +\begin{code}[htbp] +\caption{\mycmd{biblio.tex}} +\label{code:examplebib} +\begin{latex} +% (*@@*)arara: pdflatex +% (*@@*)arara: bibliography +% (*@@*)arara: pdflatex +\documentclass{article} +... +\end{latex} +\end{code} + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[ht] +\centering +\footnotesize +\begin{tabular}{p{0.3\textwidth}p{0.55\textwidth}} +\hline +\textbf{Directive} & \textbf{Behaviour}\\ +\hline +\hline +\mycmd{bibliography: \{ engine: bibtex \}} & This directive sets the |engine| +parameter to |bibtex|, which will expand the command to |bibtex| in the rule. +Note that any value other than |biber| will expand the command to |bibtex|. \\ +\hline +\mycmd{bibliography: \{ engine: biber \}} & This directive sets the |engine| +parameter to |biber|, which will expand the command to |biber| in the rule. +This is the only possible value that will set |biber| as the rule command. \\ +\hline +\mycmd{bibliography: \{ engine: bibtex, args: '-min-crossrefs=2' \}} & This +directive sets the |engine| parameter to |bibtex| and also provides an argument +to the command. Note that the |args| value is specific to |bibtex| -- using this +argument value with |biber| will surely raise an error. \\ +\hline +\mycmd{bibliography: \{ engine: biber, args: '{-}{-}sortcase=true' \}} & This +directive sets the |engine| parameter to |biber| and also provides an argument +to the command. Note that the |args| value is specific to |biber| -- using this +argument value with |bibtex| will surely raise an error. \\ +\hline +\end{tabular} +\caption{Other directive options for \mycmd{bibliography}.} +\label{tab:biblio} +\end{table}} + +It's important to note that |bibtex| and |biber| differ in their flags, so I used a global |args| parameter. It is recommended to enclose the |args| value with single or double quotes. Use this parameter with great care, since the values differ from tool to tool. The output is presented in +Code~\ref{code:ararabib}. + +\begin{code}[!htbp] +\caption{Running \mycmd{biblio.tex}.} +\label{code:ararabib} +\begin{bash} +$ arara biblio + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +Running PDFLaTeX... SUCCESS +Running Bibliography... SUCCESS +Running PDFLaTeX... SUCCESS +\end{bash} +\end{code} + +According to the terminal output shown in Code~\ref{code:ararabib}, \arara +executed all the commands successfully. A friendly warning: this rule is very +powerful because of its flexibility, but the syntax -- specially the conditional +expression and the expansion tricks -- might mislead the user. My advice is to +exhaustively test the rules before deploying them into production. After all, +better be safe than sorry. + +Note that \arara already includes both |bibtex| and |biber| rules. We believe this is the best approach to deal with such tools instead of a generic |bibliography| rule. Take a look on the existing rules, they might help the learning process. + +\section{Cross-platform rules} +\label{sec:crossplatformrules} + +One of the goals when writing \arara was to provide a cross-platform tool which +behaves exactly the same on every single operating system. Similarly, the rules +also follow the same idea, but sadly that's not always possible. After all, at +some point, commands are bounded to the underlying operating system. + +A rule that call |pdflatex|, for example, is easy to maintain; you just need to +ensure there's an actual |pdflatex| command available in the operating system -- +in the worst case, \arara warns about a nonexisting command. But there are cases +in which you need to call system-specific commands. You could write two or three +rules for the same task, say |makefoowin|, |makefoolinux|, and |makefoomac|, but +this approach is not intuitive. Besides, if you share documents between operating +systems, you'd have to also change the respective directive in your |.tex| file +in order to reflect which operating system you are on. + +Thankfully, there's a better solution for writing cross-platform rules which +require system-specific commands. In Section~\ref{sec:specialorbtags}, we mentioned about +a special orb tag called |@{SystemUtils}| -- it's now time to unveil its power. +This orb tag is available for all rules and maps the |SystemUtils| class from +the Apache Commons Lang library~\cite{lang:2001}. In other words, we +have access to all methods and properties from that class. + +Even though we have access to all public methods of the |SystemUtils| class, I +believe we won't need to use them -- the available properties are far more useful +for us. Table~\ref{tab:properties} shows the most relevant properties for our +context. The +\href{http://commons.apache.org/lang/api/org/apache/commons/lang3/SystemUtils.html}% +{Apache Commons Lang documentation} contains the full class description. + +{\renewcommand{\arraystretch}{1.5} +\begin{table}[htpb] +\centering +\footnotesize +\begin{tabular}{lp{0.6\textwidth}} +\hline +\textbf{Property} & \textbf{Description}\\ +\hline +\hline +|IS_OS_AIX| & True if this is AIX.\\ +|IS_OS_FREE_BSD| & True if this is FreeBSD.\\ +|IS_OS_HP_UX| & True if this is HP-UX.\\ +|IS_OS_IRIX| & True if this is Irix.\\ +|IS_OS_LINUX| & True if this is Linux.\\ +|IS_OS_MAC| & True if this is Mac.\\ +|IS_OS_MAC_OSX| & True if this is Mac.\\ +|IS_OS_NET_BSD| & True if this is NetBSD.\\ +|IS_OS_OPEN_BSD| & True if this is OpenBSD.\\ +|IS_OS_OS2| & True if this is OS/2.\\ +|IS_OS_SOLARIS| & True if this is Solaris.\\ +|IS_OS_SUN_OS| & True if this is Sun OS.\\ +|IS_OS_UNIX| & True if this is a Unix-like system, as in any of AIX, HP-UX, Irix, Linux, Mac~OS~X, Solaris or Sun OS.\\ +|IS_OS_WINDOWS| & True if this is Windows.\\ +|IS_OS_WINDOWS_2000| & True if this is Windows 2000.\\ +|IS_OS_WINDOWS_2003| & True if this is Windows 2003.\\ +|IS_OS_WINDOWS_2008| & True if this is Windows 2008.\\ +|IS_OS_WINDOWS_7| & True if this is Windows 7.\\ +|IS_OS_WINDOWS_95| & True if this is Windows 95.\\ +|IS_OS_WINDOWS_98| & True if this is Windows 98.\\ +|IS_OS_WINDOWS_ME| & True if this is Windows ME.\\ +|IS_OS_WINDOWS_NT| & True if this is Windows NT.\\ +|IS_OS_WINDOWS_VISTA| & True if this is Windows Vista.\\ +|IS_OS_WINDOWS_XP| & True if this is Windows XP.\\ +\hline +\end{tabular} +\caption{Most relevant properties of \mycmd{SystemUtils}.} +\label{tab:properties} +\end{table}} + +Every time we want to call any of the available properties presented in +Table~\ref{tab:properties}, we just need to use the |SystemUtils.PROPERTY| +syntax, check the corresponding value through conditional expressions and define +commands or arguments according to the underlying operating system. + +Let's go back to our examples and add a new plain rule featuring the new |@{SystemUtils}| orb tag. Right after +running |arara helloindex| successfully (Code~\ref{code:araramakeexample}), we now have as a result a new |helloindex.pdf| file, but also a lot of auxiliary files, as we can see in Code~\ref{code:lsone}. + +\begin{code}[htbp] +\caption{List of all files after running \mycmd{arara helloindex}.} +\label{code:lsone} +\begin{bash} +$ ls +helloindex.aux helloindex.ilg helloindex.log helloindex.tex +helloindex.idx helloindex.ind helloindex.pdf +\end{bash} +\end{code} + +What if we write a new |clean| rule to remove all the auxiliary files? The idea is to use |rm| to remove each one of them. For now, let's stick with a system-specific rule -- don't worry, we will improve this rule later on. + +Since we want our rule to be generic enough, it's now a good opportunity to introduce the use of the reserved directive key |files|. This special key is a list that overrides the default |@{file}| value and replicates the directive for every element in the list. I'm sure this will be the easiest rule we've written so far. The |clean| rule is presented in Code~\ref{code:cleanone}. + +\begin{code}[htbp] +\caption{\mycmd{clean.yaml}, first attempt.} +\label{code:cleanone} +\begin{yaml} +!config +identifier: clean +name: CleaningTool +command: rm -f "@{file}" +arguments: [] +\end{yaml} +\end{code} + +Note that the command |rm| has a |-f| flag. As mentioned before, commands return an exit status after their calls. If we try to remove a nonexisting file, |rm| will complain and return a value different than zero. This will make \arara halt and print a big ``failure'' on screen, since a non-zero exit status is considered an abnormal execution. If we provide the |-f| flag, |rm| will not complain of a nonexisting file, so we won't be bothered for this trivial task. + +Now we need to add the new |clean| directive to our |helloindex.tex| file (Code~\ref{code:examplemakeindex}). Of course, |clean| will be the last directive, since it will only be reachable if everything executed before was returned withno errors. The new header of |helloindex.tex| is presented in +Code~\ref{code:examplemakeindextwo}. + +\begin{code}[htbp] +\caption{\mycmd{helloindex.tex} with the new \mycmd{clean} directive.} +\label{code:examplemakeindextwo} +\begin{latex} +% (*@@*)arara: pdflatex +% (*@@*)arara: pdflatex +% (*@@*)arara: makeindex +% (*@@*)arara: pdflatex +% (*@@*)arara: clean: { files: [ helloindex.aux, helloindex.idx, helloindex.ilg, helloindex.ind, helloindex.log ] } +\documentclass{article} +... +\end{latex} +\end{code} + +The reserved directive key |files| has five elements, so the |clean| rule will be replicated five times with the orb tag |@{file}| being expanded to each element. Time to run |arara helloindex| again and see if our new |clean| rule works! Code~\ref{code:araramakeexampletwo} shows both \arara execution and directory listing. We expect to find only our source |helloindex.tex| and the resulting |helloindex.pdf| file. + +\begin{code}[htbp] +\caption{Running \mycmd{helloindex.tex} with the new \mycmd{clean} rule.} +\label{code:araramakeexampletwo} +\begin{bash} +$ arara helloindex + __ _ _ __ __ _ _ __ __ _ + / _` | '__/ _` | '__/ _` | +| (_| | | | (_| | | | (_| | + \__,_|_| \__,_|_| \__,_| + +Running PDFLaTeX... SUCCESS +Running PDFLaTeX... SUCCESS +Running MakeIndex... SUCCESS +Running PDFLaTeX... SUCCESS +Running CleaningTool... SUCCESS +Running CleaningTool... SUCCESS +Running CleaningTool... SUCCESS +Running CleaningTool... SUCCESS +Running CleaningTool... SUCCESS +$ ls +helloindex.pdf helloindex.tex +\end{bash} +\end{code} + +Great, the |clean| rule works like a charm! But we have a big issue: if we try to use this rule in Windows, it doesn't work -- after all, |rm| is not a proper Windows command. Worse, replacing |rm| by the equivalent |del| won't probably work. Commands like |del| must be called in the form |cmd /c del|. Should we write another system-specific rule, say, |cleanwin|? Of course not, there's a very elegant way to solve this issue: the |@{SystemUtils}| orb tag. + +The idea is very simple: we check if \arara is running in a Windows operating system; if true, we set the command to |cmd /c del|, or |rm -f| otherwise. The new version of our |clean| rule is presented in Code~\ref{code:cleantwo}. + +\begin{code}[htbp] +\caption{\mycmd{clean.yaml}, second attempt.} +\label{code:cleantwo} +\begin{yaml} +!config +identifier: clean +name: CleaningTool +command: <arara> @{ SystemUtils.IS_OS_WINDOWS ? "cmd /c del" : "rm -f" } "@{file}" +arguments: [] +\end{yaml} +\end{code} + +There we go, our first cross-platform rule! There's no need of writing a bunch of system-specific rules; only one cross-platform rule is enough. We know that the |clean| rule will work as expected in every operating system, even if the task to be performed relies on system-specific commands. With cross-platform rules, we are able to write cleaner and more concise code. + +There's another way of writing the |clean| rule, now with a built-in function instead of the |@{SystemUtils}| orb tag: we can use a function named |isWindows()| to check if \arara is running in a Windows operating System. The third attempt of our |clean| rule is presented in Code~\ref{code:cleanthree}. + +\begin{code}[htbp] +\caption{\mycmd{clean.yaml}, third attempt.} +\label{code:cleanthree} +\begin{yaml} +!config +identifier: clean +name: CleaningTool +command: <arara> @{ isWindows( "cmd /c del" , "rm -f" ) } "@{file}" +arguments: [] +\end{yaml} +\end{code} + +Note that the |clean| rule is expecting |@{file}| to be overriden, since we rely on the reserved directive key |files|. If by any chance this rule is called without the |files| directive key, that is, an empty directive |% arara: clean|, I have very bad news to you: the rule will be expanded to +|rm -f mydoc.tex| and your |.tex| file will be gone! Is there any way to avoid this behaviour? Yes, there is. + +For our fourth attempt of rewritting the |clean| rule, we will make use of two new built-in functions. The first one is named |isFalse()|, which only expands the value if the conditional expression resolves to false; the second one is named |getOriginalFile()|, which holds the original reference to the file processed by \arara. The idea here is very simple: if the current |@{file}| is different than the original file, run the task; otherwise, the whole command is expanded to an empty string -- empty commands are discarded by \arara. We will use a rule argument to hold the whole command, but note that the |flag| element is not important here, since we won't use this argument in the directive; only |default| matters in this context. The new |clean| rule is presented in Code~\ref{code:cleanfour}. + +\begin{code}[htbp] +\caption{\mycmd{clean.yaml}, fourth attempt.} +\label{code:cleanfour} +\begin{yaml} +!config +identifier: clean +name: CleaningTool +command: <arara> @{remove} +arguments: +- identifier: remove + default: <arara> @{ isFalse( file == getOriginalFile(), isWindows( "cmd /c del", "rm -f" ).concat(' "').concat(file).concat('"')) } +\end{yaml} +\end{code} + +Now we have a safe version of the |clean| rule. If we try to run \arara on our document with |% arara: clean|, nothing will happen and our original file won't be removed. That means that |clean| will only take action when we have an explicit list of files to be removed, and even +if the element in the |files| list is different than the original file. + +Take a look in all the default rules available in the \href{http://github.com/cereda/arara}{project directory} on GitHub. They are very easy to understand. If you get stuck in any part, a good advice is to enable the logging feature through the |--log| flag, since \arara logs every expansion and command. + +\printbibliography[heading=subbibliography] + +\chapter{Reference for rule library} +\label{chap:referenceforrulelibrarytwo} + +\epigraph{\emph{I first saw the \TeX book lying beside a brand new Macintosh Plus back in 1985 and was instantly amazed by both.}}{Enrico Gregorio} + +This chapter presents a list of built-in functions of \arara available in the rule context, as well as some notes on expansion. These functions have to be used always inside an orb tag, that is, |@{ <function> }|, in order to properly work, since they are written for the MVEL expression language. + +\section{Functions} +\label{sec:functions} + +\arara features some functions in order to ease trivial tasks during the writing process of a rule. In this section, we will present a list of these functions, including their parameters and return value. + +\subsection*{getOriginalFile} + +\begin{description} +\item[Syntax] |string getOriginalFile()| +\item[Description] Returns the original file reference processed by \arara as |string|. +\end{description} + +\subsection*{isEmpty} + +\begin{description} +\item[Syntax] |boolean isEmpty(string s)| +\item[Description] Checks if |s| is empty and returns a |boolean| value: |true| if |s| is empty, |false| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isEmpty(string s1, string s2)| +\item[Description] Checks if |s1| is empty and returns a |string| value: |s2| if |s1| is empty, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isEmpty(string s1, string s2, string s3)| +\item[Description] Checks if |s1| is empty and returns a |string| value: |s2| if |s1| is empty, or |s3| otherwise. +\end{description} + +\subsection*{isNotEmpty} + +\begin{description} +\item[Syntax] |boolean isNotEmpty(string s)| +\item[Description] Checks if |s| is not empty and returns a |boolean| value: |true| if |s| is not empty, |false| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isNotEmpty(string s1, string s2)| +\item[Description] Checks if |s1| is not empty and returns a |string| value: |s2| if |s1| is not empty, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isNotEmpty(string s1, string s2, string s3)| +\item[Description] Checks if |s1| is not empty and returns a |string| value: |s2| if |s1| is not empty, or |s3| otherwise. +\end{description} + +\subsection*{isTrue} + +\begin{description} +\item[Syntax] |boolean isTrue(string s)| +\item[Description] Checks if |s| has any of the values in the \arara context that are considered |true| -- |true|, |yes|, |y| and |1| -- and returns a |boolean| value: |true| if |s| has a valid |true| value, or |false| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isTrue(string s1, string s2)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |true| -- |true|, |yes|, |y| and |1| -- and returns a |string| value: |s2| if |s1| has a valid |true| value, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isTrue(string s1, string s2, string s3)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |true| -- |true|, |yes|, |y| and |1| -- and returns a |string| value: |s2| if |s1| has a valid |true| value, or |s3| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isTrue(string s1, string s2, string s3, string s4)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |true| -- |true|, |yes|, |y| and |1| -- and returns a |string| value: |s2| if |s1| has a valid |true| value, |s3| if |s1| has any of the values in the \arara context that are considered |false| -- |false|, |no|, |n| and |0| -- or |s4| otherwise as a default fallback. +\end{description} + +\begin{description} +\item[Syntax] |string isTrue(boolean b, string s)| +\item[Description] Returns |s| if |b| is |true|, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isTrue(boolean b, string s1, string s2)| +\item[Description] Returns |s1| if |b| is |true|, or |s2| otherwise. +\end{description} + +\subsection*{isFalse} + +\begin{description} +\item[Syntax] |boolean isFalse(string s)| +\item[Description] Checks if |s| has any of the values in the \arara context that are considered |false| -- |false|, |no|, |n| and |0| -- and returns a |boolean| value: |true| if |s| has a valid |false| value, or |false| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isFalse(string s1, string s2)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |false| -- |false|, |no|, |n| and |0| -- and returns a |string| value: |s2| if |s1| has a valid |false| value, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isFalse(string s1, string s2, string s3)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |false| -- |false|, |no|, |n| and |0| -- and returns a |string| value: |s2| if |s1| has a valid |false| value, or |s3| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isFalse(string s1, string s2, string s3, string s4)| +\item[Description] Checks if |s1| has any of the values in the \arara context that are considered |false| -- |false|, |no|, |n| and |0| -- and returns a |string| value: |s2| if |s1| has a valid |false| value, |s3| if |s1| has any of the values in the \arara context that are considered |true| -- |true|, |yes|, |y| and |1| -- or |s4| otherwise as a default fallback. +\end{description} + +\begin{description} +\item[Syntax] |string isFalse(boolean b, string s)| +\item[Description] Returns |s| if |b| is |false|, or an empty |string| otherwise. +\end{description} + +\begin{description} +\item[Syntax] |string isFalse(boolean b, string s1, string s2)| +\item[Description] Returns |s1| if |b| is |false|, or |s2| otherwise. +\end{description} + +\subsection*{trimSpaces} + +\begin{description} +\item[Syntax] |string trimSpaces(string s)| +\item[Description] Returns |s| with the trailing and leading spaces trimmed. +\end{description} + +\subsection*{getFilename} + +\begin{description} +\item[Syntax] |string getFilename(string s)| +\item[Description] This function takes a file path in the form of a |string| and returns a |string| containing only the file name, or an empty |string| in case of error. +\end{description} + +\subsection*{getBasename} + +\begin{description} +\item[Syntax] |string getBasename(string s)| +\item[Description] Returns the base name of |s| as a |string|, that is, the file name without the extension, or an empty |string| in case of error. +\end{description} + +\subsection*{getFiletype} + +\begin{description} +\item[Syntax] |string getFiletype(string s)| +\item[Description] Returns the file type of |s| as a |string|, that is, the extension of the file name, or an empty |string| in case of error. +\end{description} + +\subsection*{getDirname} + +\begin{description} +\item[Syntax] |string getDirname(string s)| +\item[Description] This function takes a file path in the form of a |string| and returns a |string| containing only the directory structure without the file name, or an empty |string| in case of error. +\end{description} + +\subsection*{isFile} + +\begin{description} +\item[Syntax] |boolean isFile(string s)| +\item[Description] Returns |true| if |s| is a valid reference to a file, or |false| otherwise. +\end{description} + +\subsection*{isDir} + +\begin{description} +\item[Syntax] |boolean isDir(string s)| +\item[Description] Returns |true| if |s| is a valid reference to a directory, or |false| otherwise. +\end{description} + +\subsection*{isWindows} + +\begin{description} +\item[Syntax] |string isWindows(string s1, string s2)| +\item[Description] Returns |s1| if \arara is running in a Windows operating system, or |s2| otherwise. +\end{description} + +\subsection*{isLinux} + +\begin{description} +\item[Syntax] |string isLinux(string s1, string s2)| +\item[Description] Returns |s1| if \arara is running in a Linux operating system, or |s2| otherwise. +\end{description} + +\subsection*{isUnix} + +\begin{description} +\item[Syntax] |string isUnix(string s1, string s2)| +\item[Description] Returns |s1| if \arara is running in a Unix operating system, or |s2| otherwise. +\end{description} + +\subsection*{isMac} + +\begin{description} +\item[Syntax] |string isMac(string s1, string s2)| +\item[Description] Returns |s1| if \arara is running in a Mac operating system, or |s2| otherwise. +\end{description} + +All the functions described are available in the rule context and can be concatenated in order to create more complex checkings. + +\section{Notes on expansion} +\label{sec:notesonexpansion} + +It's important to observe that \arara always try to rely on a smooth fallback to empty strings in case of function errors or unused arguments. This approach allows the application to not halt in case of a recoverable situation. If, for example, \arara finds an empty command to execute -- like in the |clean| rule presented in Code~\ref{code:cleanfour} when |files| isn't used -- the task is simply ignored. That way, we can make more robust rules without worrying too much with expansion. + +Remember that \arara basically deals with string values, and some times, with boolean operations. We decided to stick with those two types because of simplicity. Taking care of string comparisons, using the built-in functions and limiting the scope of the command is sufficient to write good rules. + +\end{document} diff --git a/Master/texmf-dist/doc/support/arara/arara.sty b/Master/texmf-dist/doc/support/arara/arara.sty new file mode 100644 index 00000000000..c03fa484e61 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/arara.sty @@ -0,0 +1,674 @@ +% ------------------------------------------------- +% 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. +% ------------------------------------------------- + +% package definition +% ------------------------------------------------- +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{arara}[2012/04/02 Arara User Manual Configuration] +% ------------------------------------------------- + +% required packages +% ------------------------------------------------- +\RequirePackage{graphicx} +\RequirePackage{xcolor} +\RequirePackage{listings} +\RequirePackage{tikz} +\usetikzlibrary{trees} +\RequirePackage{cantarell} +\RequirePackage{enumitem} +\RequirePackage{xspace} +\RequirePackage{upquote} +\RequirePackage{hologo} +\RequirePackage{lmodern} +\RequirePackage[scaled=0.8]{beramono} +\RequirePackage[framemethod=TikZ]{mdframed} +\RequirePackage{fourier-orns} + +\RequirePackage[backend=biber,backref=true,hyperref=auto,refsection=chapter,citereset=chapter]{biblatex} + +% colors +% ------------------------------------------------- +\definecolor{araracolor}{cmyk}{1.0,0.8,0.0,0.6} +% ------------------------------------------------- + +% language environments + +% YAML +% ------------------------------------------------- +\lstnewenvironment{yaml}{\lstset{% + basicstyle=\ttfamily, + numbers=left, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + columns=flexible, + mathescape=false +}}{} +% ------------------------------------------------- + +% Java +% ------------------------------------------------- +\lstnewenvironment{java}{\lstset{% + language=Java, + basicstyle=\ttfamily, + columns=flexible, + showspaces=false, + numbers=left, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + breakatwhitespace=true, + showstringspaces=false +}}{} +% ------------------------------------------------- + +% C +% ------------------------------------------------- +\lstnewenvironment{clang}{\lstset{% + language=C, + basicstyle=\ttfamily, + columns=flexible, + showspaces=false, + numbers=left, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + breakatwhitespace=true, + showstringspaces=false +}}{} +% ------------------------------------------------- + +% LaTeX +% ------------------------------------------------- +\lstnewenvironment{latex}{\lstset{% + language=[LaTeX]TeX, + basicstyle=\ttfamily, + columns=flexible, + showspaces=false, + numbers=left, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + breakatwhitespace=true, + showstringspaces=false, + escapeinside={(*@}{@*)} +}}{} + +% bash +% ------------------------------------------------- +\lstnewenvironment{bash}{\lstset{% + language=bash, + basicstyle=\ttfamily, + columns=flexible, + showspaces=false, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + %breakatwhitespace=true, + showstringspaces=false +}}{} + +\lstnewenvironment{nolanguage}{\lstset{% + basicstyle=\ttfamily, + columns=flexible, + showspaces=false, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + breakatwhitespace=true, + showstringspaces=false +}}{} +% ------------------------------------------------- + +\lstMakeShortInline[basicstyle=\ttfamily]{|} + +% list of codes +% ------------------------------------------------- +\newcommand{\codename}{Code} +\newcommand{\listcodename}{List of Codes} +\newlistof{listofcodes}{cod}{\listcodename} +\newfloat{code}{cod}{\codename} +\newlistentry{code}{cod}{0} +% ------------------------------------------------- + +% caption style +% ------------------------------------------------- +\captionnamefont{\bfseries} +% ------------------------------------------------- + +% sectional styles +% ------------------------------------------------- +\renewcommand{\booknamefont}{\huge\sffamily\bfseries} +\renewcommand{\booknumfont}{\huge\sffamily\bfseries} +\renewcommand{\booktitlefont}{\Huge\sffamily\bfseries} +\renewcommand{\partnumfont}{\huge\sffamily\bfseries} +\renewcommand{\partnamefont}{\huge\sffamily\bfseries} +\renewcommand{\parttitlefont}{\Huge\sffamily\bfseries} +\renewcommand{\chapnamefont}{\huge\sffamily\bfseries} +\renewcommand{\chapnumfont}{\huge\sffamily\bfseries} +\renewcommand{\chaptitlefont}{\Huge\sffamily\bfseries} +\renewcommand{\secheadstyle}{\Large\sffamily\bfseries} +\renewcommand{\subsecheadstyle}{\large\sffamily\bfseries} +\renewcommand{\subsubsecheadstyle}{\normalsize\sffamily\bfseries} +\renewcommand{\paraheadstyle}{\normalsize\sffamily\bfseries} +\renewcommand{\subparaheadstyle}{\normalsize\sffamily\bfseries} +\renewcommand{\cftpartnumwidth}{25pt} +% ------------------------------------------------- + +% description style +% ------------------------------------------------- +\setlist[description]{font=\sffamily\bfseries,style=nextline,leftmargin=2em} +\newlist{ruleoptions}{description}{1} +\setlist[ruleoptions]{font=\normalfont\ttfamily,style=nextline,leftmargin=2em} +% ------------------------------------------------- + +% hyperref here, so it won't cause any trouble +% ------------------------------------------------- +\RequirePackage[colorlinks, linkcolor={black},citecolor={araracolor}, urlcolor={araracolor},pdfpagelabels]{hyperref} + +% ------------------------------------------------- + +% Helper macros +% ------------------------------------------------- +\newcommand*\arara{{\fontfamily{fco}\color{araracolor}\bfseries arara}\xspace} +\newcommand{\feature}[1]{% +\begin{tikzpicture}[baseline=-0.65ex]% +\node[fill=araracolor,inner sep=1pt,minimum height=0.5cm, minimum width=0.8cm,rounded corners=3pt,font=\color{white}\sffamily\bfseries\tiny] {#1}; +\end{tikzpicture}% +} +\newcommand{\newfeature}{\feature{\raisebox{-.5pt}[\height][0pt]{new}}} +\newcommand{\bugfix}{\feature{\raisebox{0pt}[\height][0pt]{fixed}}} +\newcommand{\mycmd}[1]{\texttt{#1}} +% ------------------------------------------------- + +% Ornament line +% ------------------------------------------------- +\newcommand{\ornamentline}{{\color{araracolor}\noindent\hrulefill\hspace{0.2cm} \raisebox{-0.6ex}{\decoone} \hspace{0.2cm} \hrulefill}} +% ------------------------------------------------- + +% arara logo +% ------------------------------------------------- +\newcommand{\araralogo}{% +\begin{tikzpicture}[y=0.80pt, x=0.8pt,yscale=-1, inner sep=0pt, outer sep=0pt] + \path[fill=araracolor,nonzero rule] (202.9198,250.4579) .. controls + (197.7300,250.5135) and (196.4604,250.6090) .. (193.5875,251.0766) .. controls + (189.6630,251.7153) and (186.8193,252.3214) .. (184.6162,252.9843) -- + (182.9663,253.4999) -- (184.1521,253.6030) -- (185.2864,253.7061) -- + (183.4819,254.4280) .. controls (177.5843,256.8119) and (175.0673,258.3967) .. + (170.8498,262.2650) .. controls (167.7616,265.0978) and (166.8640,266.1713) .. + (166.1063,268.1428) .. controls (165.6202,269.4081) and (165.5328,271.5399) .. + (165.9517,271.8035) .. controls (166.2357,271.9824) and (168.1533,271.6859) .. + (169.0969,271.2879) .. controls (169.5043,271.1162) and (169.9170,271.0159) .. + (170.0249,271.0817) .. controls (170.1314,271.1469) and (170.7823,270.8337) .. + (171.4686,270.4114) .. controls (172.7982,269.5931) and (173.4230,269.4984) .. + (173.8403,269.9989) .. controls (174.3567,270.6187) and (178.3274,270.1478) .. + (179.0994,269.3802) .. controls (179.4043,269.0772) and (182.2175,268.1336) .. + (186.4208,266.9054) .. controls (188.2651,266.3662) and (192.9219,265.6164) .. + (194.3094,265.6164) .. controls (194.9313,265.6164) and (195.4557,265.7314) .. + (195.6500,265.9257) .. controls (196.0821,266.3578) and (197.2259,266.3305) .. + (199.1560,265.8226) .. controls (200.0353,265.5912) and (201.2344,265.3586) .. + (201.7855,265.3586) .. controls (202.3315,265.3586) and (203.2903,265.2745) .. + (203.8479,265.1524) .. controls (204.8067,264.9426) and (204.9676,264.9587) .. + (206.4259,265.6679) .. controls (207.2837,266.0851) and (208.2121,266.4413) .. + (208.4883,266.4413) .. controls (208.7596,266.4413) and (209.3785,266.6168) .. + (209.8288,266.8023) .. controls (211.2657,267.3939) and (217.3810,271.0660) .. + (217.3049,271.2879) .. controls (217.2650,271.4044) and (217.3581,271.8601) .. + (217.5112,272.2676) .. controls (218.1236,273.8974) and (217.9797,274.8143) .. + (216.9956,275.5158) .. controls (216.5566,275.8287) and (215.9914,276.5050) .. + (215.7066,277.0626) -- (215.1910,278.0938) -- (213.7989,277.9392) .. controls + (213.0268,277.8691) and (211.7681,277.7515) .. (211.0662,277.6814) .. controls + (209.8438,277.5591) and (209.7665,277.5763) .. (208.9007,278.2485) .. controls + (208.4075,278.6315) and (207.9727,279.1282) .. (207.9727,279.3313) .. controls + (207.9727,279.5414) and (208.2957,280.0417) .. (208.7461,280.4140) .. controls + (209.5421,281.0722) and (209.6134,281.0449) .. (211.7365,280.9812) .. controls + (213.7524,280.9206) and (213.9454,280.8629) .. (214.9332,280.2078) .. controls + (215.5122,279.8237) and (216.0922,279.5375) .. (216.2222,279.5375) .. controls + (216.3543,279.5375) and (216.3209,279.5961) .. (216.1707,279.6921) .. controls + (215.9780,279.8154) and (215.9771,280.0754) .. (216.1192,280.5686) .. controls + (216.3463,281.3576) and (216.6321,281.2471) .. (212.6647,281.7545) .. controls + (210.0483,282.0890) and (206.8417,282.8687) .. (205.4979,283.5075) .. controls + (205.1439,283.6761) and (203.6176,284.0434) .. (202.0950,284.3325) .. controls + (200.5724,284.6215) and (199.3064,284.9040) .. (199.2592,284.9512) .. controls + (199.2125,284.9979) and (199.4919,285.2008) .. (199.8779,285.3637) .. controls + (201.1027,285.8805) and (203.3319,285.6809) .. (205.4979,284.8996) .. controls + (208.2631,283.9024) and (208.7196,283.8150) .. (213.1803,283.6622) -- + (217.2019,283.5591) -- (219.8314,286.0855) .. controls (221.2683,287.4927) and + (222.8650,289.0247) .. (223.3890,289.4368) .. controls (224.3326,290.1791) and + (224.3682,290.1654) .. (224.0078,290.6743) .. controls (223.7375,291.0558) and + (223.6002,291.6949) .. (223.5953,293.0460) .. controls (223.5853,295.4265) and + (223.3091,296.6248) .. (222.5641,297.4286) .. controls (222.2365,297.7820) and + (221.6079,298.7577) .. (221.1720,299.5941) .. controls (220.4119,301.0524) and + (219.7926,301.6049) .. (218.9549,301.6049) .. controls (218.7756,301.6049) and + (218.1318,302.2163) .. (217.4597,302.9454) .. controls (215.8189,304.7254) and + (214.6638,305.3806) .. (213.5928,305.1625) .. controls (213.1527,305.0729) and + (212.2855,305.0295) .. (211.6851,305.0594) .. controls (210.8487,305.1008) and + (210.3910,304.9477) .. (209.5711,304.4922) .. controls (208.9921,304.1705) and + (208.0974,303.8969) .. (207.6119,303.8735) .. controls (207.1083,303.8492) and + (206.0076,303.4914) .. (205.0855,303.0485) .. controls (204.1847,302.6160) and + (203.3317,302.2751) .. (203.1778,302.2751) .. controls (202.7503,302.2751) and + (201.5553,301.4737) .. (200.0326,300.1612) .. controls (197.8237,298.2573) and + (192.8295,294.5590) .. (191.9378,294.1803) .. controls (191.5059,293.9969) and + (190.3851,293.7220) .. (189.4629,293.5616) .. controls (186.7822,293.0954) and + (185.8344,292.2455) .. (186.9365,291.2414) .. controls (187.2885,290.9208) and + (187.7427,290.8470) .. (189.3083,290.8805) .. controls (192.0962,290.9401) and + (192.7726,290.4138) .. (191.4222,289.2822) .. controls (190.3958,288.4220) and + (186.0136,286.3238) .. (181.5743,284.5387) .. controls (179.3869,283.6590) and + (177.2522,282.7027) .. (176.7793,282.4248) .. controls (176.3049,282.1460) and + (174.6326,280.8522) .. (173.0670,279.4859) .. controls (169.3355,276.2296) and + (166.3066,274.2116) .. (165.5909,274.4846) .. controls (165.2214,274.6255) and + (163.6690,279.1089) .. (162.9098,282.2185) .. controls (161.9098,286.3146) and + (161.5808,288.9276) .. (161.5693,292.9429) .. controls (161.5492,299.6982) and + (162.6653,303.6356) .. (165.9518,308.4107) .. controls (169.5090,313.5791) and + (173.6364,317.2964) .. (178.0683,319.3413) .. controls (180.9849,320.6871) and + (185.1371,321.4579) .. (186.8850,320.9912) .. controls (187.5671,320.8091) and + (187.5233,320.6794) .. (186.4725,320.0116) .. controls (184.7140,318.8941) and + (182.3701,316.7394) .. (181.1619,315.1134) .. controls (179.8869,313.3978) and + (178.3785,310.7301) .. (178.5839,310.5246) .. controls (178.6431,310.4652) and + (179.6730,310.6806) .. (180.8525,310.9887) .. controls (182.8826,311.5190) and + (183.1621,311.5176) .. (186.9365,311.4012) .. controls (193.9707,311.1837) and + (198.1762,309.9105) .. (204.6214,305.9874) .. controls (205.6722,305.3477) and + (206.5454,304.8633) .. (206.5807,304.9047) .. controls (206.6163,304.9461) and + (206.8196,306.2265) .. (206.9932,307.7920) .. controls (207.4401,311.8238) and + (208.5266,314.0822) .. (210.0867,314.0822) .. controls (210.7828,314.0822) and + (211.1048,314.5992) .. (210.8601,315.3712) .. controls (210.6017,316.1862) and + (210.9226,316.8049) .. (211.6851,316.9696) .. controls (212.5643,317.1595) and + (213.1287,317.6549) .. (213.1287,318.2586) .. controls (213.1287,318.6924) and + (213.1990,318.7181) .. (214.0568,318.6195) .. controls (214.9146,318.5208) and + (215.0385,318.6018) .. (215.7583,319.3413) .. controls (216.1932,319.7881) and + (216.9534,320.7562) .. (217.4597,321.5068) -- (218.3878,322.8473) -- + (221.4814,322.8473) .. controls (227.9099,322.9005) and (235.3038,322.5246) .. + (241.0739,317.3820) .. controls (241.1432,317.4513) and (241.3363,317.4913) .. + (241.4864,317.4335) .. controls (241.6625,317.3658) and (241.5892,317.2923) .. + (241.3318,317.2789) .. controls (241.2452,317.2739) and (241.1775,317.3177) .. + (241.1256,317.3304) .. controls (241.3405,317.1374) and (241.5341,316.9184) .. + (241.7443,316.7117) .. controls (241.2941,316.4462) and (240.8437,316.1770) .. + (240.4037,315.8868) .. controls (240.1620,315.8010) and (239.9612,315.7167) .. + (239.8881,315.6290) .. controls (239.8297,315.5589) and (239.7952,315.5138) .. + (239.7850,315.4744) .. controls (238.8533,314.8281) and (237.9892,314.1197) .. + (237.1039,313.3605) .. controls (237.0859,313.5565) and (237.0620,313.6227) .. + (237.0008,313.4636) .. controls (236.9775,313.4030) and (236.9510,313.3200) .. + (236.9493,313.2573) .. controls (236.9413,313.2493) and (236.9573,313.2132) .. + (236.9493,313.2058) .. controls (236.3039,312.6454) and (235.6108,312.0735) .. + (234.9901,311.4528) .. controls (228.6483,305.1110) and (225.4516,297.4802) .. + (225.4516,288.5089) .. controls (225.4516,287.7205) and (225.5054,286.9571) .. + (225.5547,286.1887) .. controls (225.3447,286.0418) and (225.1422,285.8627) .. + (225.1422,285.8278) .. controls (225.1422,285.6775) and (225.3280,285.7714) .. + (225.5547,285.9309) .. controls (225.8603,281.6579) and (226.9703,277.7176) .. + (228.8029,274.0722) .. controls (228.4759,274.0169) and (228.2499,273.9890) .. + (227.8233,273.9176) .. controls (227.4876,273.8613) and (227.4073,273.9440) .. + (227.4624,274.3301) .. controls (227.5502,274.9445) and (227.1038,274.9658) .. + (225.9672,274.3816) .. controls (224.7662,273.7646) and (222.3330,273.7642) .. + (221.9455,274.3816) .. controls (221.6629,274.8319) and (221.6521,274.8575) .. + (220.9659,274.2785) -- (220.2956,273.6598) -- (220.0374,275.4643) .. controls + (219.8896,276.4508) and (219.7354,277.3129) .. (219.6765,277.3720) .. controls + (219.5755,277.4729) and (217.6183,277.4258) .. (217.5110,277.3205) .. controls + (217.4874,277.2974) and (217.6478,276.5111) .. (217.8719,275.5674) .. controls + (218.0960,274.6238) and (218.2844,273.5274) .. (218.2844,273.1442) .. controls + (218.2844,272.7581) and (218.2824,272.4739) .. (218.3359,272.4739) .. controls + (218.3881,272.4739) and (218.8351,272.6995) .. (219.2640,272.9895) -- + (220.0374,273.5566) -- (220.5014,273.0926) .. controls (221.1596,272.4795) and + (224.0352,272.4741) .. (225.1933,273.0926) .. controls (225.6222,273.3216) and + (226.2041,273.5566) .. (226.4823,273.5566) .. controls (226.8906,273.5566) and + (226.9817,273.4321) .. (226.8948,273.0926) .. controls (226.7690,272.6007) and + (226.7974,272.6339) .. (229.3696,272.9895) .. controls (230.8408,270.3347) and + (232.6861,267.8169) .. (234.9896,265.5134) .. controls (237.2453,263.2577) and + (239.6753,261.4457) .. (242.2595,259.9965) -- (242.2595,259.8419) -- + (241.0737,259.2746) .. controls (232.1952,255.0792) and (218.7587,251.3145) .. + (209.8802,250.5095) .. controls (209.3495,250.4615) and (206.2223,250.4225) .. + (202.9197,250.4580) -- cycle(216.0159,277.8875) .. controls + (216.1030,277.8727) and (216.2634,277.8875) .. (216.5315,277.8875) .. controls + (217.0676,277.8875) and (217.3151,277.9429) .. (217.0471,277.9906) .. controls + (216.7897,278.0363) and (216.3248,278.0363) .. (216.0674,277.9906) .. controls + (215.9335,277.9667) and (215.9287,277.9030) .. (216.0159,277.8875) -- + cycle(218.0782,277.8875) .. controls (218.1656,277.8727) and + (218.3579,277.8845) .. (218.5938,277.8875) .. controls (219.0657,277.8945) and + (219.2200,277.9435) .. (218.9547,277.9906) .. controls (218.6974,278.0371) and + (218.2783,277.9906) .. (218.0782,277.9391) .. controls (218.0897,277.9341) and + (218.0564,277.8914) .. (218.0782,277.8877) -- cycle(222.5639,278.5578) .. + controls (222.8464,278.5029) and (223.1555,278.5377) .. (223.5951,278.6609) .. + controls (224.0776,278.7962) and (224.0578,278.8223) .. (223.2857,278.9187) .. + controls (222.5566,279.0098) and (222.5147,279.0913) .. (222.9248,279.2281) .. + controls (223.1822,279.3139) and (223.3889,279.4345) .. (223.3889,279.5374) .. + controls (223.3889,279.9192) and (222.4161,280.7151) .. (221.4296,281.0842) .. + controls (220.5949,281.3964) and (220.1858,281.3838) .. (219.0063,281.1873) .. + controls (217.4837,280.9334) and (217.4037,280.7452) .. (218.6454,280.5171) .. + controls (219.8463,280.2966) and (221.4270,279.5472) .. (221.8421,279.0218) .. + controls (222.0371,278.7750) and (222.2814,278.6128) .. (222.5639,278.5578) -- + cycle(224.0076,282.4763) .. controls (224.5557,282.5591) and + (224.5610,282.8089) .. (224.2138,283.8169) .. controls (223.9922,284.4602) and + (224.0553,284.5904) .. (224.5232,284.9512) .. controls (224.8020,285.1661) and + (224.9204,285.3121) .. (224.7810,285.3121) .. controls (224.6308,285.3121) and + (224.4436,285.2309) .. (224.3685,285.1059) .. controls (224.2913,284.9772) and + (224.1814,284.9320) .. (224.0591,285.0027) .. controls (223.9427,285.0700) and + (223.8738,285.0283) .. (223.9045,284.8996) .. controls (223.9344,284.7746) and + (223.7106,284.4459) .. (223.3889,284.1778) .. controls (222.8099,283.6953) and + (222.7666,283.7384) .. (223.1311,283.0950) .. controls (223.3985,282.6232) and + (223.6617,282.4242) .. (224.0076,282.4763) -- cycle(163.3737,285.1058) .. + controls (163.5881,285.1058) and (163.8239,285.2048) .. (163.8893,285.3121) .. + controls (163.9542,285.4182) and (163.7272,287.2019) .. (163.3737,289.2822) .. + controls (163.0200,291.3624) and (162.7034,293.5896) .. (162.7034,294.2319) .. + controls (162.7034,294.9610) and (162.6443,295.4177) .. (162.4972,295.4177) .. + controls (162.1759,295.4177) and (162.3353,288.0589) .. (162.7034,286.3433) .. + controls (162.9106,285.3782) and (163.0743,285.1058) .. (163.3737,285.1058) -- + cycle(198.1247,308.4107) .. controls (198.1785,308.4027) and + (198.2008,308.4109) .. (198.2279,308.4107) .. controls (198.1403,308.4658) and + (197.9273,308.5963) .. (197.6607,308.7201) .. controls (194.6154,310.1340) and + (189.7205,311.1519) .. (189.7205,310.3700) .. controls (189.7205,310.1716) and + (190.1344,309.9980) .. (190.9064,309.9059) .. controls (191.5455,309.8298) and + (193.3237,309.4851) .. (194.8249,309.1326) .. controls (196.7765,308.6745) and + (197.7662,308.4639) .. (198.1247,308.4107) -- cycle; + \path[fill=araracolor,nonzero rule] (187.5922,267.3762) .. controls + (187.5922,267.6466) and (187.2920,268.1530) .. (186.9274,268.4974) .. controls + (186.1844,269.1991) and (185.6622,270.2499) .. (185.6622,271.0434) .. controls + (185.6622,271.3436) and (185.5206,271.6597) .. (185.3405,271.7618) .. controls + (185.0750,271.9123) and (185.0600,272.0621) .. (185.2547,272.6196) .. controls + (185.4297,273.1204) and (185.4213,273.6169) .. (185.2225,274.5390) -- + (184.9544,275.7829) -- (184.5255,274.8285) .. controls (184.2915,274.3080) and + (184.0526,273.2845) .. (184.0001,272.5768) .. controls (183.9059,271.3117) and + (183.9308,271.2364) .. (184.9924,269.5637) .. controls (186.5034,267.1832) and + (187.5922,266.2671) .. (187.5922,267.3762); + \path[fill=araracolor,nonzero rule] (184.8043,267.7408) .. controls + (184.8043,267.8703) and (184.4661,268.4163) .. (184.0537,268.9525) .. controls + (183.6413,269.4886) and (183.2427,270.2568) .. (183.1689,270.6574) .. controls + (183.0117,271.5118) and (182.6598,271.4080) .. (182.6598,270.5072) .. controls + (182.6598,269.5851) and (183.3636,268.3404) .. (184.1395,267.8904) .. controls + (184.5470,267.6541) and (184.8043,267.5962) .. (184.8043,267.7408); + \path[fill=araracolor,nonzero rule] (182.0057,270.9791) .. controls + (182.2362,272.5660) and (182.2259,272.9641) .. (181.9306,273.8313) .. controls + (181.7408,274.3889) and (181.5874,275.0020) .. (181.5874,275.2038) .. controls + (181.5874,275.4043) and (181.2014,275.8877) .. (180.7296,276.2783) .. controls + (179.7427,277.0951) and (179.7324,277.0910) .. (180.2364,276.0831) .. controls + (180.4654,275.6250) and (180.6168,274.7320) .. (180.6438,273.6812) .. controls + (180.6712,272.6089) and (180.8407,271.6081) .. (181.1156,270.8933) .. controls + (181.3548,270.2714) and (181.5872,269.6359) .. (181.6411,269.4564) .. controls + (181.6939,269.2806) and (181.8592,269.9711) .. (182.0056,270.9791); + \path[fill=araracolor,nonzero rule] (180.1828,270.5823) .. controls + (179.8924,271.2042) and (179.6527,272.0923) .. (179.6467,272.5660) .. controls + (179.6367,273.3595) and (179.6119,273.3917) .. (179.3158,272.9949) .. controls + (179.0082,272.5830) and (178.8909,270.8718) .. (179.1275,270.2499) .. controls + (179.2027,270.0520) and (179.4108,269.9694) .. (179.6681,270.0355) .. controls + (179.9255,270.1015) and (180.1358,270.0109) .. (180.2150,269.7996) .. controls + (180.2873,269.6066) and (180.4234,269.4564) .. (180.5259,269.4564) .. controls + (180.6267,269.4564) and (180.4729,269.9604) .. (180.1828,270.5823); + \path[fill=araracolor,nonzero rule] (177.9418,271.4938) .. controls + (177.9659,272.0942) and (178.0225,272.8491) .. (178.0704,273.2094) .. controls + (178.1178,273.5650) and (178.2575,274.5819) .. (178.3825,275.4826) .. controls + (178.6297,277.2626) and (178.4975,277.8850) .. (177.7273,278.5646) -- + (177.2341,278.9997) -- (177.3647,278.2491) .. controls (177.7675,275.9330) and + (177.7641,275.3173) .. (177.3404,273.9386) .. controls (177.1035,273.1665) and + (176.8502,272.0709) .. (176.7730,271.4830) -- (176.6336,270.4215) -- + (177.0518,271.1721) -- (177.4700,271.9227) -- (177.6844,271.1721) -- + (177.8989,270.4215) -- (177.9418,271.4938); + \path[fill=araracolor,nonzero rule] (193.0180,271.0451) .. controls + (194.6352,271.6454) and (195.6056,273.1236) .. (195.5936,274.9679) .. controls + (195.5804,277.0786) and (194.0473,278.6984) .. (191.9242,278.8464) .. controls + (189.8011,278.9944) and (188.1509,277.8018) .. (187.5961,275.7185) .. controls + (186.8075,272.7590) and (190.0671,269.9497) .. (193.0180,271.0451) -- + cycle(189.3079,272.6233) .. controls (188.1981,273.7232) and + (188.0031,274.8822) .. (188.6971,276.2547) .. controls (189.3396,277.5262) and + (190.3158,278.0852) .. (191.6883,277.9682) .. controls (192.9107,277.8642) and + (193.6686,277.3308) .. (194.2461,276.1689) .. controls (194.8857,274.8821) and + (194.6693,273.7026) .. (193.5970,272.6304) .. controls (192.8346,271.8680) and + (192.6963,271.8154) .. (191.4524,271.8154) .. controls (190.2086,271.8154) and + (190.0703,271.8676) .. (189.3079,272.6233); + \path[fill=araracolor,nonzero rule] (175.5068,272.0942) .. controls + (175.6307,272.8234) and (175.8152,273.6175) .. (175.9151,273.8528) .. controls + (176.0897,274.2639) and (176.0760,274.2675) .. (175.5827,273.9450) .. controls + (174.7740,273.4157) and (174.4884,272.6732) .. (174.7387,271.7511) .. controls + (175.0651,270.5493) and (175.2591,270.6359) .. (175.5068,272.0942); + \path[fill=araracolor,nonzero rule] (204.6200,272.2356) .. controls + (204.9569,272.3603) and (204.8559,272.4243) .. (204.1482,272.5339) .. controls + (203.4405,272.6434) and (203.1763,272.8135) .. (202.9151,273.3274) .. controls + (202.7036,273.7436) and (202.2395,274.1275) .. (201.6391,274.3831) .. controls + (200.7176,274.7756) and (200.3225,275.2467) .. (200.0337,276.2976) .. controls + (199.8979,276.7919) and (199.8550,276.7372) .. (199.6554,275.8150) .. controls + (199.5022,275.1073) and (199.4980,274.5761) .. (199.6422,274.1530) .. controls + (199.8577,273.5204) and (200.7597,272.8877) .. (201.4459,272.8877) .. controls + (201.6486,272.8877) and (201.9821,272.7326) .. (202.1965,272.5390) .. controls + (202.6205,272.1562) and (203.9551,271.9889) .. (204.6199,272.2356); + \path[fill=araracolor,nonzero rule] (171.0577,272.1800) .. controls + (171.0692,272.3198) and (171.3781,272.7805) .. (171.7333,273.1880) .. controls + (172.2269,273.7543) and (172.4163,274.2173) .. (172.5053,275.0752) .. controls + (172.5698,275.6971) and (172.5310,276.4496) .. (172.4195,276.7372) -- + (172.2158,277.2626) -- (171.6368,276.6836) .. controls (170.5064,275.5532) and + (170.1411,273.8742) .. (170.7412,272.5660) .. controls (170.9085,272.2014) and + (171.0455,272.0342) .. (171.0577,272.1800); + \path[fill=araracolor,nonzero rule] (207.3221,274.7477) .. controls + (208.2130,275.0479) and (210.1744,275.6150) .. (211.7185,276.0188) -- + (214.5064,276.7479) -- (212.2546,276.6510) .. controls (208.2657,276.4797) and + (204.3356,275.7036) .. (203.4834,274.9189) .. controls (202.5340,274.0450) and + (204.9202,273.9386) .. (207.3222,274.7477); + \path[fill=araracolor,nonzero rule] (183.1421,276.2761) .. controls + (183.2686,276.7374) and (183.0340,277.2626) .. (182.3754,277.9917) .. controls + (181.7732,278.6585) and (181.0513,279.0074) .. (179.9147,279.1807) .. controls + (179.0569,279.3115) and (179.0082,279.2930) .. (179.2178,278.9139) .. controls + (179.3415,278.6900) and (179.8826,278.3372) .. (180.4187,278.1311) .. controls + (181.0192,277.9002) and (181.7078,277.3887) .. (182.2094,276.8015) .. controls + (182.9236,275.9651) and (183.0389,275.9002) .. (183.1421,276.2761); + \path[fill=araracolor,nonzero rule] (198.3071,276.7694) .. controls + (197.4997,278.2706) and (196.4896,279.5998) .. (195.4842,280.4846) .. controls + (194.4548,281.3905) and (194.3030,281.4569) .. (193.5112,281.3484) .. controls + (191.4953,281.0720) and (185.7012,279.9558) .. (184.8043,279.6707) -- + (183.8393,279.3643) -- (185.1260,279.3543) .. controls (185.8376,279.3473) and + (187.2277,279.5275) .. (188.2356,279.7553) .. controls (190.9807,280.3751) and + (192.2378,280.3120) .. (194.0903,279.4617) .. controls (194.9481,279.0680) and + (196.3150,278.1857) .. (197.1141,277.5100) .. controls (198.0362,276.7302) and + (198.4748,276.4583) .. (198.3071,276.7701); + \path[fill=araracolor,nonzero rule] (202.9473,278.9532) .. controls + (201.6605,279.6474) and (199.6018,281.4445) .. (199.6018,281.8734) .. controls + (199.6018,282.0055) and (199.7197,282.1093) .. (199.8698,282.1093) .. controls + (200.0216,282.1093) and (200.4167,282.2952) .. (200.7813,282.5382) -- + (201.4246,282.9671) -- (199.4945,282.9496) .. controls (197.4358,282.9308) and + (196.1027,283.1581) .. (194.2833,283.8381) .. controls (192.6757,284.4390) and + (191.8814,284.3738) .. (189.9941,283.4864) .. controls (189.0797,283.0564) and + (187.0990,282.3892) .. (185.5549,281.9914) -- (182.7670,281.2730) -- + (184.5899,281.3266) .. controls (186.1983,281.3739) and (186.6272,281.4787) .. + (188.2356,282.2166) .. controls (189.9433,283.0002) and (190.1872,283.0536) .. + (192.0958,283.0637) .. controls (193.6399,283.0717) and (194.5069,282.9576) .. + (195.6772,282.5919) .. controls (197.0283,282.1696) and (197.2976,281.9955) .. + (197.8325,281.1979) .. controls (198.1720,280.6916) and (198.8726,280.0482) .. + (199.4087,279.7503) .. controls (199.9449,279.4525) and (200.6455,278.9998) .. + (200.9850,278.7317) .. controls (201.4759,278.3442) and (201.8535,278.2513) .. + (202.9043,278.2599) -- (204.2125,278.2714) -- (202.9472,278.9540); + \path[fill=araracolor,nonzero rule] (181.9521,281.9129) .. controls + (182.4363,282.0092) and (183.8285,282.4203) .. (185.0510,282.8277) .. controls + (186.2733,283.2352) and (187.8487,283.7315) .. (188.5573,283.9322) .. controls + (189.2650,284.1327) and (190.0370,284.4177) .. (190.2729,284.5657) .. controls + (190.9002,284.9592) and (192.2674,285.1415) .. (195.7416,285.2955) -- + (198.8512,285.4334) -- (197.0283,285.7341) .. controls (195.0124,286.0665) and + (192.1709,286.1791) .. (191.6669,285.9464) .. controls (191.4910,285.8654) and + (190.6161,285.6558) .. (189.7368,285.4842) .. controls (188.3323,285.2101) and + (187.2277,284.8829) .. (185.5549,284.2457) .. controls (185.3119,284.1530) and + (184.8472,284.0212) .. (184.4826,283.9414) .. controls (183.6463,283.7579) and + (179.4082,282.1186) .. (179.1427,281.8758) .. controls (178.8907,281.6453) and + (180.7297,281.6697) .. (181.9521,281.9129); + \path[fill=araracolor,nonzero rule] (242.2784,299.2121) .. controls + (242.2784,300.4560) and (242.2197,300.7232) .. (241.9674,300.6275) .. controls + (241.7947,300.5622) and (241.5898,300.0807) .. (241.5063,299.5445) .. controls + (241.3796,298.7296) and (241.4279,298.5094) .. (241.8173,298.1291) -- + (242.2784,297.6788) -- (242.2784,299.2121); + \path[fill=araracolor,nonzero rule] (192.6963,272.2967) .. controls + (192.9547,272.4206) and (193.3649,272.9306) .. (193.6034,273.4239) .. controls + (194.1632,274.5819) and (193.9830,275.4732) .. (193.0180,276.3207) .. controls + (190.8500,278.2247) and (187.8018,275.6327) .. (189.3083,273.1665) .. controls + (189.9493,272.1172) and (191.4953,271.7202) .. (192.6963,272.2967) -- + cycle(190.0585,273.7455) .. controls (190.0585,274.1316) and + (190.1966,274.3012) .. (190.5517,274.3512) .. controls (191.0870,274.4264) and + (191.3785,273.9814) .. (191.1586,273.4239) .. controls (191.0806,273.2255) and + (190.8198,273.1080) .. (190.5410,273.1451) .. controls (190.1936,273.1914) and + (190.0585,273.3595) .. (190.0585,273.7455); + \path[fill=araracolor] (261.4271,267.9564) .. controls (258.5655,267.9565) and + (255.8973,268.4978) .. (253.4225,269.5805) .. controls (250.9476,270.6633) and + (248.8014,272.1231) .. (246.9840,273.9599) .. controls (245.1665,275.7967) and + (243.7261,277.9525) .. (242.6627,280.4273) .. controls (241.5992,282.9022) and + (241.0675,285.5317) .. (241.0676,288.3159) .. controls (241.0675,291.1002) and + (241.5992,293.7297) .. (242.6627,296.2045) .. controls (243.7261,298.6794) and + (245.1665,300.8352) .. (246.9840,302.6720) .. controls (248.8014,304.5088) and + (250.9476,305.9686) .. (253.4225,307.0513) .. controls (255.8973,308.1341) and + (258.5655,308.6755) .. (261.4271,308.6755) .. controls (264.2499,308.6755) and + (266.8988,308.1341) .. (269.3737,307.0513) .. controls (271.8485,305.9686) and + (274.0043,304.4992) .. (275.8412,302.6430) .. controls (277.6779,300.7869) and + (279.1280,298.6311) .. (280.1915,296.1755) .. controls (281.2549,293.7200) and + (281.7866,291.1002) .. (281.7866,288.3159) .. controls (281.7866,285.5318) and + (281.2549,282.9119) .. (280.1915,280.4564) .. controls (279.1280,278.0009) and + (277.6779,275.8450) .. (275.8412,273.9889) .. controls (274.0043,272.1328) and + (271.8485,270.6633) .. (269.3737,269.5805) .. controls (266.8988,268.4978) and + (264.2499,267.9565) .. (261.4271,267.9564) -- cycle(281.7866,314.7659) -- + (281.7866,313.6058) .. controls (278.8863,315.9260) and (275.7348,317.7048) .. + (272.3319,318.9422) .. controls (268.9289,320.1797) and (265.2940,320.7984) .. + (261.4271,320.7984) .. controls (252.4557,320.7984) and (244.7992,317.6275) .. + (238.4574,311.2857) .. controls (232.1155,304.9439) and (228.9446,297.2873) .. + (228.9446,288.3159) .. controls (228.9446,279.3446) and (232.1155,271.6881) .. + (238.4574,265.3462) .. controls (244.7992,259.0044) and (252.4557,255.8335) .. + (261.4271,255.8335) .. controls (270.3210,255.8335) and (277.9776,259.0044) .. + (284.3968,265.3462) .. controls (290.7386,271.6881) and (293.9095,279.3446) .. + (293.9095,288.3159) -- (293.9095,314.7659) .. controls (293.9095,316.4287) and + (293.3198,317.8498) .. (292.1404,319.0292) .. controls (290.9609,320.2087) and + (289.5398,320.7984) .. (287.8771,320.7984) .. controls (286.1756,320.7984) and + (284.7351,320.2087) .. (283.5557,319.0292) .. controls (282.3763,317.8498) and + (281.7866,316.4287) .. (281.7866,314.7659) -- cycle; + \path[fill=araracolor] (315.0811,261.8659) -- (315.0811,263.0260) .. controls + (317.9813,260.7059) and (321.1329,258.9271) .. (324.5358,257.6896) .. controls + (327.9387,256.4523) and (331.5737,255.8336) .. (335.4407,255.8335) .. controls + (337.1421,255.8336) and (338.9692,255.9495) .. (340.9221,256.1815) .. controls + (342.8748,256.4136) and (344.6730,256.8293) .. (346.3165,257.4286) .. controls + (347.9599,258.0281) and (349.3230,258.8498) .. (350.4058,259.8938) .. controls + (351.4885,260.9379) and (352.0298,262.2914) .. (352.0299,263.9541) .. controls + (352.0298,264.8049) and (351.8656,265.5976) .. (351.5369,266.3323) .. controls + (351.2081,267.0671) and (350.7731,267.7148) .. (350.2318,268.2754) .. controls + (349.6904,268.8362) and (349.0523,269.2712) .. (348.3176,269.5805) .. controls + (347.5828,269.8899) and (346.7901,270.0446) .. (345.9394,270.0446) .. controls + (345.2047,270.0446) and (344.3540,269.8319) .. (343.3873,269.4065) .. controls + (340.9510,268.4398) and (338.3022,267.9565) .. (335.4407,267.9564) .. controls + (332.6177,267.9565) and (329.9689,268.4882) .. (327.4941,269.5515) .. controls + (325.0192,270.6150) and (322.8634,272.0651) .. (321.0266,273.9018) .. controls + (319.1898,275.7387) and (317.7396,277.8945) .. (316.6762,280.3693) .. controls + (315.6128,282.8442) and (315.0811,285.4931) .. (315.0811,288.3159) -- + (315.0811,314.7659) .. controls (315.0811,316.4287) and (314.4914,317.8498) .. + (313.3120,319.0293) .. controls (312.1326,320.2087) and (310.7114,320.7984) .. + (309.0487,320.7984) .. controls (307.3472,320.7984) and (305.9067,320.2087) .. + (304.7273,319.0293) .. controls (303.5479,317.8498) and (302.9582,316.4287) .. + (302.9582,314.7659) -- (302.9582,261.8659) .. controls (302.9582,260.2032) and + (303.5479,258.7821) .. (304.7273,257.6026) .. controls (305.9067,256.4233) and + (307.3472,255.8336) .. (309.0487,255.8335) .. controls (310.7115,255.8336) and + (312.1326,256.4233) .. (313.3120,257.6026) .. controls (314.4914,258.7821) and + (315.0811,260.2032) .. (315.0811,261.8659) -- cycle; + \path[fill=araracolor] (384.7572,267.9564) .. controls (381.8957,267.9565) and + (379.2275,268.4978) .. (376.7526,269.5805) .. controls (374.2778,270.6633) and + (372.1316,272.1231) .. (370.3142,273.9599) .. controls (368.4967,275.7967) and + (367.0562,277.9525) .. (365.9928,280.4273) .. controls (364.9294,282.9022) and + (364.3977,285.5317) .. (364.3977,288.3159) .. controls (364.3977,291.1002) and + (364.9294,293.7297) .. (365.9928,296.2045) .. controls (367.0562,298.6794) and + (368.4967,300.8352) .. (370.3142,302.6720) .. controls (372.1316,304.5088) and + (374.2778,305.9686) .. (376.7526,307.0513) .. controls (379.2275,308.1341) and + (381.8957,308.6755) .. (384.7572,308.6755) .. controls (387.5801,308.6755) and + (390.2289,308.1341) .. (392.7039,307.0513) .. controls (395.1787,305.9686) and + (397.3345,304.4992) .. (399.1713,302.6430) .. controls (401.0081,300.7869) and + (402.4582,298.6311) .. (403.5217,296.1755) .. controls (404.5850,293.7200) and + (405.1167,291.1002) .. (405.1168,288.3159) .. controls (405.1167,285.5318) and + (404.5850,282.9119) .. (403.5217,280.4564) .. controls (402.4582,278.0009) and + (401.0081,275.8450) .. (399.1713,273.9889) .. controls (397.3345,272.1328) and + (395.1787,270.6633) .. (392.7039,269.5805) .. controls (390.2289,268.4978) and + (387.5801,267.9565) .. (384.7572,267.9564) -- cycle(405.1168,314.7659) -- + (405.1168,313.6058) .. controls (402.2165,315.9260) and (399.0649,317.7048) .. + (395.6621,318.9422) .. controls (392.2591,320.1797) and (388.6242,320.7984) .. + (384.7572,320.7984) .. controls (375.7859,320.7984) and (368.1293,317.6275) .. + (361.7875,311.2857) .. controls (355.4457,304.9439) and (352.2748,297.2873) .. + (352.2748,288.3159) .. controls (352.2748,279.3446) and (355.4457,271.6881) .. + (361.7875,265.3462) .. controls (368.1293,259.0044) and (375.7859,255.8335) .. + (384.7572,255.8335) .. controls (393.6512,255.8335) and (401.3078,259.0044) .. + (407.7270,265.3462) .. controls (414.0687,271.6881) and (417.2396,279.3446) .. + (417.2397,288.3159) -- (417.2397,314.7659) .. controls (417.2396,316.4287) and + (416.6499,317.8498) .. (415.4706,319.0292) .. controls (414.2911,320.2087) and + (412.8700,320.7984) .. (411.2072,320.7984) .. controls (409.5057,320.7984) and + (408.0653,320.2087) .. (406.8859,319.0292) .. controls (405.7064,317.8498) and + (405.1167,316.4287) .. (405.1168,314.7659) -- cycle; + \path[fill=araracolor] (438.4113,261.8659) -- (438.4113,263.0260) .. controls + (441.3115,260.7059) and (444.4630,258.9271) .. (447.8660,257.6896) .. controls + (451.2689,256.4523) and (454.9038,255.8336) .. (458.7708,255.8335) .. controls + (460.4722,255.8336) and (462.2994,255.9495) .. (464.2522,256.1815) .. controls + (466.2050,256.4136) and (468.0031,256.8293) .. (469.6466,257.4286) .. controls + (471.2900,258.0281) and (472.6531,258.8498) .. (473.7359,259.8938) .. controls + (474.8186,260.9379) and (475.3600,262.2914) .. (475.3601,263.9541) .. controls + (475.3600,264.8049) and (475.1957,265.5976) .. (474.8670,266.3323) .. controls + (474.5383,267.0671) and (474.1033,267.7148) .. (473.5619,268.2754) .. controls + (473.0205,268.8362) and (472.3825,269.2712) .. (471.6478,269.5805) .. controls + (470.9130,269.8899) and (470.1203,270.0446) .. (469.2696,270.0446) .. controls + (468.5348,270.0446) and (467.6841,269.8319) .. (466.7174,269.4065) .. controls + (464.2812,268.4398) and (461.6323,267.9565) .. (458.7708,267.9564) .. controls + (455.9479,267.9565) and (453.2990,268.4882) .. (450.8242,269.5515) .. controls + (448.3493,270.6150) and (446.1935,272.0651) .. (444.3567,273.9018) .. controls + (442.5199,275.7387) and (441.0698,277.8945) .. (440.0064,280.3693) .. controls + (438.9430,282.8442) and (438.4113,285.4931) .. (438.4113,288.3159) -- + (438.4113,314.7659) .. controls (438.4113,316.4287) and (437.8216,317.8498) .. + (436.6422,319.0293) .. controls (435.4627,320.2087) and (434.0416,320.7984) .. + (432.3788,320.7984) .. controls (430.6774,320.7984) and (429.2369,320.2087) .. + (428.0575,319.0293) .. controls (426.8781,317.8498) and (426.2884,316.4287) .. + (426.2884,314.7659) -- (426.2884,261.8659) .. controls (426.2884,260.2032) and + (426.8781,258.7821) .. (428.0575,257.6026) .. controls (429.2369,256.4233) and + (430.6774,255.8336) .. (432.3788,255.8335) .. controls (434.0416,255.8336) and + (435.4627,256.4233) .. (436.6422,257.6026) .. controls (437.8216,258.7821) and + (438.4113,260.2032) .. (438.4113,261.8659) -- cycle; + \path[fill=araracolor] (508.0874,267.9564) .. controls (505.2258,267.9565) and + (502.5576,268.4978) .. (500.0828,269.5805) .. controls (497.6079,270.6633) and + (495.4618,272.1231) .. (493.6443,273.9599) .. controls (491.8268,275.7967) and + (490.3864,277.9525) .. (489.3230,280.4273) .. controls (488.2596,282.9022) and + (487.7279,285.5317) .. (487.7279,288.3159) .. controls (487.7279,291.1002) and + (488.2596,293.7297) .. (489.3230,296.2045) .. controls (490.3864,298.6794) and + (491.8268,300.8352) .. (493.6443,302.6720) .. controls (495.4618,304.5088) and + (497.6079,305.9686) .. (500.0828,307.0513) .. controls (502.5576,308.1341) and + (505.2258,308.6755) .. (508.0874,308.6755) .. controls (510.9103,308.6755) and + (513.5591,308.1341) .. (516.0340,307.0513) .. controls (518.5088,305.9686) and + (520.6646,304.4992) .. (522.5015,302.6430) .. controls (524.3382,300.7869) and + (525.7884,298.6311) .. (526.8518,296.1755) .. controls (527.9152,293.7200) and + (528.4469,291.1002) .. (528.4469,288.3159) .. controls (528.4469,285.5318) and + (527.9152,282.9119) .. (526.8518,280.4564) .. controls (525.7884,278.0009) and + (524.3382,275.8450) .. (522.5015,273.9889) .. controls (520.6646,272.1328) and + (518.5088,270.6633) .. (516.0340,269.5805) .. controls (513.5591,268.4978) and + (510.9102,267.9565) .. (508.0874,267.9564) -- cycle(528.4469,314.7659) -- + (528.4469,313.6058) .. controls (525.5467,315.9260) and (522.3951,317.7048) .. + (518.9922,318.9422) .. controls (515.5893,320.1797) and (511.9543,320.7984) .. + (508.0874,320.7984) .. controls (499.1160,320.7984) and (491.4595,317.6275) .. + (485.1177,311.2857) .. controls (478.7759,304.9439) and (475.6050,297.2873) .. + (475.6050,288.3159) .. controls (475.6050,279.3446) and (478.7759,271.6881) .. + (485.1177,265.3462) .. controls (491.4595,259.0044) and (499.1160,255.8335) .. + (508.0874,255.8335) .. controls (516.9814,255.8335) and (524.6379,259.0044) .. + (531.0571,265.3462) .. controls (537.3989,271.6881) and (540.5698,279.3446) .. + (540.5698,288.3159) -- (540.5698,314.7659) .. controls (540.5698,316.4287) and + (539.9801,317.8498) .. (538.8007,319.0292) .. controls (537.6212,320.2087) and + (536.2001,320.7984) .. (534.5374,320.7984) .. controls (532.8359,320.7984) and + (531.3954,320.2087) .. (530.2161,319.0292) .. controls (529.0366,317.8498) and + (528.4469,316.4287) .. (528.4469,314.7659) -- cycle; +\end{tikzpicture}} +% -------------------------------------------------
\ No newline at end of file diff --git a/Master/texmf-dist/doc/support/arara/figures/arara.png b/Master/texmf-dist/doc/support/arara/figures/arara.png Binary files differnew file mode 100644 index 00000000000..e6bb5bf6da8 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/arara.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcommand.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcommand.png Binary files differnew file mode 100644 index 00000000000..dd077acdc60 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcommand.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcompiler.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcompiler.png Binary files differnew file mode 100644 index 00000000000..a823794aed3 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-addcompiler.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-araramenu.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-araramenu.png Binary files differnew file mode 100644 index 00000000000..b2d146fa668 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-araramenu.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-editcommands.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-editcommands.png Binary files differnew file mode 100644 index 00000000000..3a4973e701b --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-editcommands.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-listarara.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-listarara.png Binary files differnew file mode 100644 index 00000000000..122b94b8d71 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-listarara.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-newprofile.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-newprofile.png Binary files differnew file mode 100644 index 00000000000..d33a4ba735d --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-newprofile.png diff --git a/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-settings.png b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-settings.png Binary files differnew file mode 100644 index 00000000000..157b137d358 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/inlage/inlage-settings.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-finish.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-finish.png Binary files differnew file mode 100644 index 00000000000..deb4d1a6dfd --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-finish.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-langsel.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-langsel.png Binary files differnew file mode 100644 index 00000000000..0d6812dfce2 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-langsel.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-license.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-license.png Binary files differnew file mode 100644 index 00000000000..443c73cb636 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-license.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-packs.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-packs.png Binary files differnew file mode 100644 index 00000000000..4afd50f6070 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-packs.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-path.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-path.png Binary files differnew file mode 100644 index 00000000000..01d36f6501b --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-path.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-pathwarning.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-pathwarning.png Binary files differnew file mode 100644 index 00000000000..a4408a798ce --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-pathwarning.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-progress.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-progress.png Binary files differnew file mode 100644 index 00000000000..d824341cbf7 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-progress.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/install-welcome.png b/Master/texmf-dist/doc/support/arara/figures/installer/install-welcome.png Binary files differnew file mode 100644 index 00000000000..1d27725e9ac --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/install-welcome.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-finish.png b/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-finish.png Binary files differnew file mode 100644 index 00000000000..e9c60b2ebec --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-finish.png diff --git a/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-welcome.png b/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-welcome.png Binary files differnew file mode 100644 index 00000000000..71f81c0b2d5 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/installer/uninstall-welcome.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-config.png b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-config.png Binary files differnew file mode 100644 index 00000000000..154a46f74ca --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-config.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-newprofile.png b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-newprofile.png Binary files differnew file mode 100644 index 00000000000..41b4dd61531 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-newprofile.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-profiles.png b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-profiles.png Binary files differnew file mode 100644 index 00000000000..ad61446e097 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texniccenter/texniccenter-profiles.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texshop/texshop-arara.png b/Master/texmf-dist/doc/support/arara/figures/texshop/texshop-arara.png Binary files differnew file mode 100644 index 00000000000..320baacf278 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texshop/texshop-arara.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-add.png b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-add.png Binary files differnew file mode 100644 index 00000000000..317930ead31 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-add.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-arara.png b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-arara.png Binary files differnew file mode 100644 index 00000000000..d5da5656b9e --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-arara.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-prefs.png b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-prefs.png Binary files differnew file mode 100644 index 00000000000..d128a64eb25 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-prefs.png diff --git a/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-profile.png b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-profile.png Binary files differnew file mode 100644 index 00000000000..87ff763d8e9 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/texworks/texworks-profile.png diff --git a/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-ararabutton.png b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-ararabutton.png Binary files differnew file mode 100644 index 00000000000..1f765eb69e6 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-ararabutton.png diff --git a/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-menu.png b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-menu.png Binary files differnew file mode 100644 index 00000000000..ddb46450ab6 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-menu.png diff --git a/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-optionsinterface.png b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-optionsinterface.png Binary files differnew file mode 100644 index 00000000000..8b77e440c86 --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/figures/winedt/winedt-optionsinterface.png diff --git a/Master/texmf-dist/doc/support/arara/references.bib b/Master/texmf-dist/doc/support/arara/references.bib new file mode 100644 index 00000000000..5b54e783efc --- /dev/null +++ b/Master/texmf-dist/doc/support/arara/references.bib @@ -0,0 +1,237 @@ +% This file was created with JabRef 2.8. +% Encoding: Cp1252 + +@MISC{sketch:2013, + author = {Eugene Ressler}, + title = {Sketch}, + note = {Sketch is a small, simple system for producing line drawings of two or three-dimensional objects and scenes.}, + owner = {Paulo}, + timestamp = {2013.01.30}, + url = {http://www.frontiernet.net/~eugene.ressler} +} + +@MISC{modpath:2012, + author = {Jared Breland}, + title = {Modify Path}, + year = {2012}, + note = {This tool in released under the GNU Lesser General Public License + (LGPL), version 3.}, + owner = {Paulo}, + timestamp = {2012.06.27}, + url = {http://legroom.net/software/modpath} +} + +@MISC{mvel:2012, + author = {Mike Brock}, + title = {MVEL, the MVFLEX Expression Language}, + note = {MVEL is a powerful expression language for Java-based applications.}, + owner = {Paulo}, + timestamp = {2012.06.28}, + url = {http://mvel.codehaus.org/} +} + +@MISC{cereda:2012, + author = {Paulo Roberto Massa Cereda}, + title = {Fun with \texttt{gnuplot} and \texttt{arara}}, + year = {2012}, + note = {This article was submitted to the \LaTeX\ and Graphics contest organized + by the \LaTeX\ community.}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {http://latex-community.org/know-how/435-gnuplot-arara} +} + +@MISC{collins:2001, + author = {John Collins}, + title = {Latexmk}, + year = {2001}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {http://www.phys.psu.edu/~collins/latexmk/} +} + +@MISC{texworks:2009, + author = {Jonathan Kew and Stefan L\"{o}ffler and Charlie Sharpsteen}, + title = {\TeX works: lowering the entry barrier to the \TeX\ world}, + year = {2009}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {http://www.tug.org/texworks/} +} + +@MISC{launch4j:2005, + author = {Grzegorz Kowal}, + title = {Launch4J, a cross-platform Java executable wrapper}, + year = {2005}, + owner = {Paulo}, + timestamp = {2012.06.27}, + url = {http://launch4j.sourceforge.net/} +} + +@MISC{niederberger:2012, + author = {Clemens Niederberger}, + title = {\arara \ -- automate your \LaTeX\ with birds music}, + year = {2012}, + owner = {Paulo}, + timestamp = {2012.06.28}, + url = {http://www.mychemistry.eu/2012/06/arara-automate-latex-birds-music/} +} + +@MISC{osi:1998, + author = {Bruce Perens and Eric Steven Raymond}, + title = {Open Source Initiative}, + year = {1998}, + note = {Nonprofit corporation with global scope formed to educate about and + advocate for the benefits of open source and to build bridges among + different constituencies in the open source community.}, + owner = {Paulo}, + timestamp = {2012.06.26}, + url = {http://www.opensource.org/} +} + +@MISC{izpack:2001, + author = {Julien Ponge}, + title = {IzPack}, + year = {2001}, + note = {The project is developed by a community of benevolent contributors.}, + owner = {Paulo}, + timestamp = {2012.06.26}, + url = {http://izpack.org/} +} + +@MISC{fsf:1985, + author = {Richard Stallman}, + title = {Free Software Foundation}, + year = {1985}, + note = {Nonprofit organization with a worldwide mission to promote computer + user freedom and to defend the rights of all free software users.}, + owner = {Paulo}, + timestamp = {2012.06.26}, + url = {http://www.fsf.org/} +} + +@MISC{exec:2010, + author = {{The Apache Software Foundation}}, + title = {Apache Commons Exec}, + year = {2010}, + owner = {Paulo}, + timestamp = {2012.06.28}, + url = {http://commons.apache.org/exec/} +} + +@MISC{lang:2001, + author = {{The Apache Software Foundation}}, + title = {Apache Commons Lang}, + year = {2001}, + owner = {Paulo}, + timestamp = {2012.06.29}, + url = {http://commons.apache.org/lang/} +} + +@MISC{wright:2012, + author = {Joseph Wright}, + title = {\arara: making \LaTeX\ files your way}, + year = {2012}, + owner = {Paulo}, + timestamp = {2012.06.28}, + url = {http://www.texdev.net/2012/04/24/arara-making-latex-files-your-way/} +} + +@MISC{jcl:2012, + author = {Kamran Zafar}, + title = {Jar Class Loader}, + owner = {Paulo}, + timestamp = {2012.07.19}, + url = {http://sourceforge.net/projects/jcloader/} +} + +@MISC{bsd:2012, + title = {The New BSD License}, + owner = {Paulo}, + timestamp = {2012.06.26}, + url = {http://www.opensource.org/licenses/bsd-license.php} +} + +@MISC{maven:2012, + title = {Apache Maven}, + note = {Software project management and comprehension tool}, + owner = {Paulo}, + timestamp = {2012.07.19}, + url = {http://maven.apache.org/} +} + +@MISC{oracle:2012, + title = {Java Development Kit}, + owner = {Paulo}, + timestamp = {2012.07.19}, + url = {http://www.oracle.com/technetwork/java/javase/downloads/index.html} +} + +@MISC{snakeyaml:2012, + title = {SnakeYAML, a YAML parser and emitter for Java}, + owner = {Paulo}, + timestamp = {2012.07.05}, + url = {http://code.google.com/p/snakeyaml/} +} + +@MISC{streams:2012, + title = {Standard streams}, + note = {Wikipedia, the free encyclopedia}, + owner = {Paulo}, + timestamp = {2012.07.04}, + url = {http://en.wikipedia.org/wiki/Standard_streams} +} + +@MISC{tupi:2012, + title = {Tupi -- Portuguese Dictionary}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {http://www.redebrasileira.com/tupi/vocabulario/a.asp} +} + +@MISC{vim:1991, + title = {Vim the editor}, + note = {Vim is a highly configurable text editor built to enable efficient + text editing.}, + owner = {Paulo}, + timestamp = {2012.07.05}, + url = {http://www.vim.org} +} + +@MISC{rubber:2009, + title = {Rubber}, + year = {2009}, + note = {The tool was originally developed by Emmanuel Beffara but the development + largely ceased after 2007. The current team was formed to help keep + the tool up to date.}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {https://launchpad.net/rubber} +} + +@MISC{openjdk:2006, + title = {The OpenJDK Project}, + year = {2006}, + owner = {Paulo}, + timestamp = {2012.06.26}, + url = {http://openjdk.java.net/} +} + +@MISC{yaml:2001, + title = {YAML}, + year = {2001}, + owner = {Paulo}, + timestamp = {2012.06.23}, + url = {http://www.yaml.org/} +} + +@comment{jabref-meta: selector_review:} + +@comment{jabref-meta: selector_publisher:} + +@comment{jabref-meta: selector_author:} + +@comment{jabref-meta: selector_journal:} + +@comment{jabref-meta: selector_keywords:} + diff --git a/Master/texmf-dist/scripts/arara/arara.jar b/Master/texmf-dist/scripts/arara/arara.jar Binary files differnew file mode 100644 index 00000000000..6b8a7a36ffd --- /dev/null +++ b/Master/texmf-dist/scripts/arara/arara.jar diff --git a/Master/texmf-dist/scripts/arara/arara.sh b/Master/texmf-dist/scripts/arara/arara.sh new file mode 100644 index 00000000000..564af5c7794 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/arara.sh @@ -0,0 +1,4 @@ +#!/bin/bash +jarpath=`kpsewhich --progname=arara --format=texmfscripts arara.jar` +java -jar "$jarpath/arara.jar" "$@" + diff --git a/Master/texmf-dist/scripts/arara/rules/biber.yaml b/Master/texmf-dist/scripts/arara/rules/biber.yaml new file mode 100644 index 00000000000..ad27377e8bf --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/biber.yaml @@ -0,0 +1,10 @@ +!config +# Biber rule for arara +# author: Marco Daniel +# requires arara 3.0+ +identifier: biber +name: Biber +command: <arara> biber @{options} "@{getBasename(file)}" +arguments: +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/bibtex.yaml b/Master/texmf-dist/scripts/arara/rules/bibtex.yaml new file mode 100644 index 00000000000..055b60d47ea --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/bibtex.yaml @@ -0,0 +1,10 @@ +!config +# BibTeX rule for arara +# author: Marco Daniel +# requires arara 3.0+ +identifier: bibtex +name: BibTeX +command: <arara> bibtex @{options} "@{getBasename(file)}.aux" +arguments: +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/clean.yaml b/Master/texmf-dist/scripts/arara/rules/clean.yaml new file mode 100644 index 00000000000..c9542f7979e --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/clean.yaml @@ -0,0 +1,11 @@ +!config +# Clean rule for arara +# author: Paulo Cereda +# requires arara 3.0+ +identifier: clean +name: CleaningTool +command: <arara> @{remove} +arguments: +- identifier: remove + default: <arara> @{isFalse(file == getOriginalFile(), isWindows("cmd /c del", "rm -f").concat(' "').concat(file).concat('"'))} + diff --git a/Master/texmf-dist/scripts/arara/rules/dvips.yaml b/Master/texmf-dist/scripts/arara/rules/dvips.yaml new file mode 100644 index 00000000000..48e9172e972 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/dvips.yaml @@ -0,0 +1,13 @@ +!config +# DVIPS rule for arara +# author: Marco Daniel +# requires arara 3.0+ +identifier: dvips +name: DVIPS +command: <arara> dvips "@{getBasename(file)}.dvi" -o "@{output}.ps" @{options} +arguments: +- identifier: output + flag: <arara> @{parameters.output} + default: <arara> @{getBasename(file)} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml b/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml new file mode 100644 index 00000000000..9387f32fa6d --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/frontespizio.yaml @@ -0,0 +1,18 @@ +!config +# Frontespizio rule for arara +# author: Francesco Endrici +# author: Enrico Gregorio +# requires arara 3.0+ +identifier: frontespizio +name: Frontespizio +commands: +- <arara> @{engine} "@{getBasename(file)}" +- <arara> @{engine} "@{getBasename(file)}-frn" +- <arara> @{dvips} +- <arara> @{engine} "@{getBasename(file)}" +arguments: +- identifier: engine + flag: <arara> @{parameters.engine} + default: pdflatex +- identifier: dvips + default: <arara> @{ isTrue(parameters.engine == 'latex', 'dvips -o "' + getBasename(file) + '-frn.eps" "'+ getBasename(file) + '-frn"') } diff --git a/Master/texmf-dist/scripts/arara/rules/latex.yaml b/Master/texmf-dist/scripts/arara/rules/latex.yaml new file mode 100644 index 00000000000..2a02cd5d41e --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/latex.yaml @@ -0,0 +1,19 @@ +!config +# LaTeX rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: latex +name: LaTeX +command: <arara> latex @{action} @{draft} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: draft + flag: <arara> @{isTrue(parameters.draft,"--draftmode")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/lmkclean.yaml b/Master/texmf-dist/scripts/arara/rules/lmkclean.yaml new file mode 100644 index 00000000000..0dda56496f6 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/lmkclean.yaml @@ -0,0 +1,11 @@ +!config +# Clean rule for arara, via latexmk +# author: Brent Longborough +# requires arara 3.0+ +identifier: lmkclean +name: LaTeXmKCleaner +command: <arara> latexmk @{include} "@{file}" +arguments: +- identifier: include + flag: <arara> @{isTrue(parameters.include.toLowerCase() == "all", "-C", "-c") } + default: <arara> -c diff --git a/Master/texmf-dist/scripts/arara/rules/lualatex.yaml b/Master/texmf-dist/scripts/arara/rules/lualatex.yaml new file mode 100644 index 00000000000..06c7f60eef5 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/lualatex.yaml @@ -0,0 +1,19 @@ +!config +# LuaLaTeX rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: lualatex +name: LuaLaTeX +command: <arara> lualatex @{action} @{draft} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: draft + flag: <arara> @{isTrue(parameters.draft,"--draftmode")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/lualatexmk.yaml b/Master/texmf-dist/scripts/arara/rules/lualatexmk.yaml new file mode 100644 index 00000000000..1c82b83aa4d --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/lualatexmk.yaml @@ -0,0 +1,19 @@ +!config +# LaTeXmk with LuaLaTeX rule for arara +# author: Brent Longborough +# requires: arara 3.0+ +identifier: lualatexmk +name: luaLaTeXmK +command: <arara> latexmk -e '$pdflatex=q/lualatex%O%S/' @{action} @{synctex} @{shell} @{options} @{style} -pdf "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape"," --no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=0","--synctex=1")} +- identifier: options + flag: <arara> @{parameters.options} +- identifier: style + flag: <arara> -e '$makeindex=q/makeindex %O -s @{parameters.style}.ist -o %D %S/' + diff --git a/Master/texmf-dist/scripts/arara/rules/luatex.yaml b/Master/texmf-dist/scripts/arara/rules/luatex.yaml new file mode 100644 index 00000000000..359781f1703 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/luatex.yaml @@ -0,0 +1,18 @@ +!config +# LuaTeX rule for arara +# author: Paulo Cereda +# requires arara 3.0+ +identifier: luatex +name: LuaTeX +command: <arara> luatex @{action} @{draft} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: draft + flag: <arara> @{isTrue(parameters.draft,"--draftmode")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/make.yaml b/Master/texmf-dist/scripts/arara/rules/make.yaml new file mode 100644 index 00000000000..ad3e565a443 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/make.yaml @@ -0,0 +1,12 @@ +!config +# Make rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: make +name: Make +command: <arara> make @{task} +arguments: +- identifier: task + flag: <arara> @{parameters.task} + diff --git a/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml b/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml new file mode 100644 index 00000000000..1d2cd053101 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/makeglossaries.yaml @@ -0,0 +1,10 @@ +!config +# MakeGlossaries rule for arara +# author: Marco Daniel +# requres arara 3.0+ +identifier: makeglossaries +name: MakeGlossaries +command: <arara> makeglossaries @{options} "@{getBasename(file)}" +arguments: +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/makeindex.yaml b/Master/texmf-dist/scripts/arara/rules/makeindex.yaml new file mode 100644 index 00000000000..7cb1f5c6a2c --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/makeindex.yaml @@ -0,0 +1,16 @@ +!config +# MakeIndex rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: makeindex +name: MakeIndex +command: <arara> makeindex @{german} @{style} @{options} "@{getBasename(file)}.idx" +arguments: +- identifier: style + flag: <arara> -s @{parameters.style} +- identifier: german + flag: <arara> @{isTrue(parameters.german,"-g")} +- identifier: options + flag: <arara> @{parameters.options} + diff --git a/Master/texmf-dist/scripts/arara/rules/nomencl.yaml b/Master/texmf-dist/scripts/arara/rules/nomencl.yaml new file mode 100644 index 00000000000..ce939975d4d --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/nomencl.yaml @@ -0,0 +1,15 @@ +!config +# Nomencl rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: nomencl +name: Nomencl +command: <arara> makeindex @{options} "@{getBasename(file)}.nlo" -s "@{style}.ist" -o "@{getBasename(file)}.nls" +arguments: +- identifier: style + flag: <arara> @{parameters.style} + default: nomencl +- identifier: options + flag: <arara> @{parameters.options} + diff --git a/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml b/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml new file mode 100644 index 00000000000..90e28ec0945 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/pdflatex.yaml @@ -0,0 +1,19 @@ +!config +# PDFLaTeX rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: pdflatex +name: PDFLaTeX +command: <arara> pdflatex @{action} @{draft} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: draft + flag: <arara> @{isTrue(parameters.draft,"--draftmode")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/pdflatexmk.yaml b/Master/texmf-dist/scripts/arara/rules/pdflatexmk.yaml new file mode 100644 index 00000000000..b3cadf62889 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/pdflatexmk.yaml @@ -0,0 +1,18 @@ +!config +# LaTeXmk with pdfLaTeX rule for arara +# author: Brent Longborough +# requires arara 3.0+ +identifier: pdflatexmk +name: pdfLaTeXmK +command: <arara> latexmk -e '$pdflatex=q/pdflatex%O%S/' @{action} @{synctex} @{shell} @{options}@{style} -pdf "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape"," --no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=0","--synctex=1")} +- identifier: options + flag: <arara> @{parameters.options} +- identifier: style + flag: <arara> -e '$makeindex=q/makeindex %O -s @{parameters.style}.ist -o %D %S/' diff --git a/Master/texmf-dist/scripts/arara/rules/pdftex.yaml b/Master/texmf-dist/scripts/arara/rules/pdftex.yaml new file mode 100644 index 00000000000..db084597cbe --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/pdftex.yaml @@ -0,0 +1,19 @@ +!config +# PDFTeX rule for arara +# author: Paulo Cereda +# requires arara 3.0+ +identifier: pdftex +name: PDFTeX +command: <arara> pdftex @{action} @{draft} @{shell} @{synctex} @{options} "@{file}" +arguments: +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: draft + flag: <arara> @{isTrue(parameters.draft,"--draftmode")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml b/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml new file mode 100644 index 00000000000..a5e82d545e5 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/ps2pdf.yaml @@ -0,0 +1,14 @@ +!config +# PS2PDF rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: ps2pdf +name: PS2PDF +command: <arara> ps2pdf @{options} "@{getBasename(file)}.ps" "@{output}.pdf" +arguments: +- identifier: output + flag: <arara> @{parameters.output} + default: <arara> @{getBasename(file)} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/sketch.yaml b/Master/texmf-dist/scripts/arara/rules/sketch.yaml new file mode 100644 index 00000000000..3f98518a319 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/sketch.yaml @@ -0,0 +1,10 @@ +!config +# Sketch rule for arara +# author: Sergey Ulyanov +# requires arara 3.0+ +identifier: sketch +name: Sketch +command: <arara> sketch @{options} "@{file}" -o "@{getBasename(file)}.tex" +arguments: +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/songidx.yaml b/Master/texmf-dist/scripts/arara/rules/songidx.yaml new file mode 100644 index 00000000000..faa64e70d20 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/songidx.yaml @@ -0,0 +1,11 @@ + !config +# songidx rule for arara +# author: Francesco Endrici +# requires arara 3.0 +identifier: songidx +name: SongIDX +command: <arara> songidx "@{input}.sxd" +arguments: +- identifier: input + flag: <arara> @{parameters.input} + diff --git a/Master/texmf-dist/scripts/arara/rules/tex.yaml b/Master/texmf-dist/scripts/arara/rules/tex.yaml new file mode 100644 index 00000000000..49f7cf73074 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/tex.yaml @@ -0,0 +1,16 @@ +!config +# TeX rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: tex +name: TeX +command: <arara> tex @{action} @{shell} @{options} "@{file}" +arguments: +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/xelatex.yaml b/Master/texmf-dist/scripts/arara/rules/xelatex.yaml new file mode 100644 index 00000000000..0321f612447 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/xelatex.yaml @@ -0,0 +1,17 @@ +!config +# XeLaTeX rule for arara +# author: Marco Daniel +# last edited by: Paulo Cereda +# requires arara 3.0+ +identifier: xelatex +name: XeLaTeX +command: <arara> xelatex @{action} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/scripts/arara/rules/xelatexmk.yaml b/Master/texmf-dist/scripts/arara/rules/xelatexmk.yaml new file mode 100644 index 00000000000..149cf6cb860 --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/xelatexmk.yaml @@ -0,0 +1,19 @@ +!config +# LaTeXmk with XeLaTeX rule for arara +# author: Brent Longborough +# requires arara 3.0+ +identifier: xelatexmk +name: XeLaTeXmK +command: <arara> latexmk -e '$pdflatex=q/xelatex%O%S/' @{action} @{synctex} @{shell} @{options} @{style} -pdf "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape"," --no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=0","--synctex=1")} +- identifier: options + flag: <arara> @{parameters.options} +- identifier: style + flag: <arara> -e '$makeindex=q/makeindex %O -s @{parameters.style}.ist -o %D %S/' + diff --git a/Master/texmf-dist/scripts/arara/rules/xetex.yaml b/Master/texmf-dist/scripts/arara/rules/xetex.yaml new file mode 100644 index 00000000000..20cfca8511e --- /dev/null +++ b/Master/texmf-dist/scripts/arara/rules/xetex.yaml @@ -0,0 +1,16 @@ +!config +# XeLaTeX rule for arara +# author: Paulo Cereda +# requires arara 3.0+ +identifier: xetex +name: XeTeX +command: <arara> xetex @{action} @{shell} @{synctex} @{options} "@{file}" +arguments: +- identifier: action + flag: <arara> --interaction=@{parameters.action} +- identifier: shell + flag: <arara> @{isTrue(parameters.shell,"--shell-escape","--no-shell-escape")} +- identifier: synctex + flag: <arara> @{isTrue(parameters.synctex,"--synctex=1","--synctex=0")} +- identifier: options + flag: <arara> @{parameters.options} diff --git a/Master/texmf-dist/source/support/arara/pom.xml b/Master/texmf-dist/source/support/arara/pom.xml new file mode 100644 index 00000000000..ec01ed9c125 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/pom.xml @@ -0,0 +1,180 @@ + +<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.arara</groupId> + <artifactId>arara</artifactId> + <version>3.0</version> + <packaging>jar</packaging> + + <name>arara</name> + <url>http://cereda.github.com/arara</url> + <description>The cool TeX automation tool</description> + <inceptionYear>2012</inceptionYear> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </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@users.sf.net</email> + <id>cereda</id> + <url>http://tex.stackexchange.com/users/3094</url> + <roles> + <role>Lead Developer</role> + <role>Creator</role> + </roles> + </developer> + <developer> + <name>Marco Daniel</name> + <email>marco.daniel@mada-nada.de</email> + <id>marcodaniel</id> + <url>http://tex.stackexchange.com/users/5239</url> + <roles> + <role>Contributor</role> + <role>Tester</role> + </roles> + </developer> + <developer> + <name>Brent Longborough</name> + <email>brent@longborough.org</email> + <id>brent</id> + <url>http://tex.stackexchange.com/users/344</url> + <roles> + <role>Developer</role> + <role>Contributor</role> + <role>Tester</role> + </roles> + </developer> + </developers> + + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.10</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.yaml</groupId> + <artifactId>snakeyaml</artifactId> + <version>1.11</version> + </dependency> + <dependency> + <groupId>org.mvel</groupId> + <artifactId>mvel2</artifactId> + <version>2.0.19</version> + </dependency> + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + <version>1.2</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.1</version> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-core</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.6.4</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-exec</artifactId> + <version>1.1</version> + </dependency> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + <version>3.2.1</version> + </dependency> + </dependencies> + + <build> + <finalName>arara-${project.version}</finalName> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>2.5.1</version> + <configuration> + <source>1.5</source> + <target>1.5</target> + </configuration> + </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <version>2.3</version> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + <archive> + <manifest> + <mainClass>com.github.arara.Arara</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.7</version> + <configuration> + <show>public</show> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.4</version> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <classpathPrefix>lib/</classpathPrefix> + <mainClass>com.github.arara.Arara</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java new file mode 100644 index 00000000000..bbad5404845 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/Arara.java @@ -0,0 +1,196 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * Arara: The main class. Basically, this class will get the file name from the + * arguments list and call the proper methods from the other helper classes. + */ +// package definition +package com.github.arara; + +// needed imports +import com.github.arara.model.AraraDirective; +import com.github.arara.utils.*; +import java.io.File; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The main arara class. The code logic is encapsulated in the helper class, so + * if something goes wrong, the generic exception catch here will simply print + * it. I tried to make the code as easier as possible. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class Arara { + + // the logger + final static Logger logger = LoggerFactory.getLogger(Arara.class); + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * The main method. The idea is to provide to arara only the supported file + * name and let it handle. The application will remove the file extension + * (if any) and call the other helper classes. + * + * @param args The command line arguments. In fact, arara supports a lot of + * flags, all listed in the CommandLineAnalyzer. + */ + public static void main(String[] args) { + + // the application status, zero for a normal execution, + // or nonzero for an abnormal execution + int exitStatus; + + // trying to have a normal execution + try { + + // print the application header + AraraUtils.printHeader(); + + // create a configuration instance and load + // the proper settings, if any + ConfigurationLoader configuration = new ConfigurationLoader(); + configuration.load(); + + // create a new analyzer + CommandLineAnalyzer commandLine = new CommandLineAnalyzer(args, configuration); + + // if the minimum parameters are not satisfied or it's a simple + // help or version request + if (!commandLine.parse()) { + + // simply return + exitStatus = 0; + + // exit right now, good job + System.exit(exitStatus); + } + + // it's a normal workflow, let's define the main file + File file; + + // create a new file reference + file = new File(commandLine.getFile()); + + // welcome message + logger.info(localization.getMessage("Log_WelcomeMessage")); + + // process file + logger.info(localization.getMessage("Log_ProcessingFile", file.getName())); + + // file exists, let's proceed with the directive extractor + DirectiveExtractor dirExtractor = new DirectiveExtractor(file, configuration); + + // extract all directives from the file + dirExtractor.extract(); + + // get all directives found + List<AraraDirective> directives = dirExtractor.getDirectives(); + + // set the overall result flag + boolean overallResult = true; + + // check if any directive was found + if (!directives.isEmpty()) { + + // now let's parse the directives + DirectiveParser dirParser = new DirectiveParser(directives); + + // set the file + dirParser.setFile(file); + + // parse the directives + TaskDeployer taskDeployer = new TaskDeployer(dirParser.parse(), configuration); + + // deploy the tasks through a command trigger + CommandTrigger commandTrigger = new CommandTrigger(taskDeployer.deploy()); + + // set verbose option, if enabled + commandTrigger.setVerbose(commandLine.isVerbose()); + + // set an execution timeout, if set + commandTrigger.setExecutionTimeout(commandLine.getExecutionTimeout()); + + // execute the tasks + overallResult = commandTrigger.execute(); + } + else { + + // no directives found, add message to the log + logger.info(localization.getMessage("Log_NoDirectivesFound", file.getName())); + + // print message + System.out.println(AraraUtils.wrap(localization.getMessage("Msg_NoDirectivesFound", file.getName()))); + } + + // final message + logger.info(localization.getMessage("Log_Done")); + + // if everything was ok, that is, every command in the command list + // returned with an exit status of zero + if (overallResult) { + + // everything fine + exitStatus = 0; + + } else { + + // something wrong happened, so let's consider the whole + // execution as abnormal + exitStatus = 1; + } + + } catch (Exception exception) { + + // something bad happened, print the error message + System.out.println(AraraUtils.wrap(exception.getMessage())); + + // catch error in the log + logger.error(localization.getMessage("Log_ExceptionRaised")); + logger.error(exception.getMessage()); + + // error, set status to an abnormal execution + exitStatus = 1; + + } + + // send the exit code to the terminal, and we are done + System.exit(exitStatus); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java new file mode 100644 index 00000000000..5f51a48e43f --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/exception/AraraException.java @@ -0,0 +1,87 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraException: This class aims at reducing every exception that happens in the + * whole application to a single self-contained exception. + */ +// package definition +package com.github.arara.exception; + +/** + * Aims at reducing every exception that happens in the whole application to a + * single self-contained exception. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraException extends Exception { + + /** + * Constructor. + */ + public AraraException() { + super(); + } + + /** + * Constructor with a message. + * + * @param message A message containing the cause of the exception thrown. + */ + public AraraException(String message) { + super(message); + } + + /** + * Constructor with both message and the cause of the exception. + * + * @param message A message containing the cause of the exception thrown. + * @param cause The throwable cause. + */ + public AraraException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructor with the cause of the exception. + * + * @param cause The throwable cause. + */ + public AraraException(Throwable cause) { + super(cause); + } + +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java new file mode 100644 index 00000000000..5e065b49ab4 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraCommand.java @@ -0,0 +1,99 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraCommand: This class provides the model for commands to be executed by + * the runtime. It's a plain old Java object. + */ +// package definition +package com.github.arara.model; + +/** + * Provides the model for commands to be executed by the runtime. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraCommand { + + // the name to be displayed in the command line + private String name; + // the command itself + private String command; + + /** + * Getter for command. + * + * @return The command to be executed by the runtime. + */ + public String getCommand() { + + // return it + return command; + } + + /** + * Setter for command. + * + * @param command The command, already expanded. + */ + public void setCommand(String command) { + + // set the command + this.command = command; + } + + /** + * Getter for the command name. + * + * @return The command name, provided by the rule. + */ + public String getName() { + + // return it + return name; + } + + /** + * Setter for the command name. + * + * @param name The command name. + */ + public void setName(String name) { + + // set the name + this.name = name; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java new file mode 100644 index 00000000000..7d783225a51 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraConfiguration.java @@ -0,0 +1,221 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraConfiguration: This class holds the model for the arara configuration + * file. + */ +// package definition +package com.github.arara.model; + +// needed imports +import com.github.arara.exception.AraraException; +import com.github.arara.utils.AraraUtils; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import org.apache.commons.lang3.SystemUtils; +import org.mvel2.templates.TemplateRuntime; + +/** + * Holds the model for the arara configuration file. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraConfiguration { + + // the application language + private String language; + // the list of search paths + private List<String> paths; + // the list of filetypes + private List<AraraFilePattern> filetypes; + // the path runtime exception + private RuntimeException pathRuntimeException; + // the path IO exception + private IOException pathIOException; + + /** + * Getter for the search paths. + * + * @return The search paths. + */ + public List<String> getPaths() { + return paths; + } + + /** + * Getter for the language. + * + * @return The language. + */ + public String getLanguage() { + return language; + } + + /** + * Setter for the language. + * + * @param language The language. + */ + public void setLanguage(String language) { + this.language = language; + } + + /** + * Setter for the search paths. + * + * @param rules The search paths. + */ + public void setPaths(List<String> rules) throws AraraException, Exception { + this.paths = rules; + + // refresh paths + refreshPaths(); + } + + /** + * Getter for the filetypes. + * + * @return The filetypes. + */ + public List<AraraFilePattern> getFiletypes() { + return filetypes; + } + + /** + * Setter for the filetypes. + * + * @param filetypes The filetypes. + */ + public void setFiletypes(List<AraraFilePattern> filetypes) { + this.filetypes = filetypes; + } + + /** + * Constructor. + */ + public AraraConfiguration() { + + // creates both lists + paths = new ArrayList<String>(); + filetypes = new ArrayList<AraraFilePattern>(); + pathRuntimeException = null; + } + + /** + * Refreshes all paths, replacing possible variables in the template + */ + private void refreshPaths() throws AraraException, Exception { + + // create a map + HashMap map = new HashMap(); + + // add the variables + map.put("userhome", SystemUtils.USER_HOME); + + // for every path in the list + for (int i = 0; i < paths.size(); i++) { + + try { + + // remove the keyword + String fullPath = AraraUtils.removeKeyword(paths.get(i)); + + // apply the template + fullPath = (String) TemplateRuntime.eval(fullPath, map); + + try { + + // attempt to create a file reference and + // get the canonical path, if the operation + // succeeds, it's a valid path + File validFile = new File(fullPath); + validFile.getCanonicalPath(); + + // sanitize the path in order to be displayed correctly + fullPath = new File(new File(fullPath).toURI()).getPath(); + + // set the path in the list + paths.set(i, fullPath); + + } catch (IOException ioException) { + + // the path is terribly invalid, get the exception, + // if null + if (pathIOException == null) { + + // set the path IO exception + pathIOException = ioException; + } + } + + } catch (RuntimeException runtimeException) { + + // an error has occurred, register the exception for + // later access + + // if there isn't an exception yet + if (pathRuntimeException == null) { + + // set the exception + pathRuntimeException = runtimeException; + } + + } + } + } + + /** + * Getter for the path runtime exception. + * + * @return The path runtime exception. + */ + public RuntimeException getPathRuntimeException() { + return pathRuntimeException; + } + + /** + * Getter for the path IO exception. + * + * @return The path IO exception. + */ + public IOException getPathIOException() { + return pathIOException; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java new file mode 100644 index 00000000000..d0ff90daf14 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraDirective.java @@ -0,0 +1,148 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraDirective: This class provides the model for representing the arara + * directives found in the source file. It's a plain old Java object. + */ +// package definition +package com.github.arara.model; + +// needed imports +import java.util.Map; + +/** + * Provides the model for representing the arara directives found in the source + * file. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraDirective { + + // the directive name + private String name; + // the configuration + private Map config; + // the line number + private int lineNumber = 0; + + /** + * Constructor. + * + * @param name The directive name. + * @param config The configuration. + */ + public AraraDirective(String name, Map config) { + + // set the name + this.name = name; + + // set the configuration + this.config = config; + } + + /** + * Constructor. + */ + public AraraDirective() { + } + + /** + * Getter for configuration. + * + * @return The configuration. + */ + public Map getConfig() { + + // return it + return config; + } + + /** + * Setter for configuration. + * + * @param config The configuration. + */ + public void setConfig(Map config) { + + // set the configuration + this.config = config; + } + + /** + * Getter for the directive name. + * + * @return The directive name. + */ + public String getName() { + + // return it + return name; + } + + /** + * Setter for the directive name. + * + * @param name The directive name. + */ + public void setName(String name) { + + // set it + this.name = name; + } + + /** + * Getter for the line number. + * + * @return The line number. + */ + public int getLineNumber() { + + // return it + return lineNumber; + } + + /** + * Setter for the line number. + * + * @param lineNumber The line number. + */ + public void setLineNumber(int lineNumber) { + + // set it + this.lineNumber = lineNumber; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java new file mode 100644 index 00000000000..99035737134 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraFilePattern.java @@ -0,0 +1,93 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraFilePattern: This class maps the supported filetypes. + */ +// package definition +package com.github.arara.model; + +// needed imports +import com.github.arara.utils.AraraConstants; + +/** + * Maps the supported filetypes. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraFilePattern { + + // file extension + private String extension; + // file pattern + private String pattern; + + /** + * Getter for the file extension. + * + * @return The file extension. + */ + public String getExtension() { + return extension; + } + + /** + * Setter for the file extension. + * + * @param extension The file extension. + */ + public void setExtension(String extension) { + this.extension = extension; + } + + /** + * Getter for the file pattern. + * + * @return The file pattern. + */ + public String getPattern() { + return pattern; + } + + /** + * Setter for the file pattern. + * + * @param pattern The file pattern. + */ + public void setPattern(String pattern) { + this.pattern = pattern.concat(AraraConstants.DIRECTIVEPREFIX); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java new file mode 100644 index 00000000000..dbcda5b1549 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraLanguage.java @@ -0,0 +1,137 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraLanguage: This class holds the data model for the arara language + * specification. + */ +// package definition. +package com.github.arara.model; + +// needed import +import java.util.Locale; + +/** + * Holds the data model for the arara language specification. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraLanguage { + + // language name + private String name; + // language code + private String code; + // language locale + private Locale locale; + + /** + * Getter for the language name. + * + * @return The language name. + */ + public String getName() { + return name; + } + + /** + * Setter for the language name. + * + * @param name The language name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Getter for the language code. + * + * @return The language code. + */ + public String getCode() { + return code; + } + + /** + * Setter for the language code. + * + * @param code The language code. + */ + public void setCode(String code) { + this.code = code; + } + + /** + * Getter for the language locale. + * + * @return The language locale. + */ + public Locale getLocale() { + return locale; + } + + /** + * Setter for the language locale. + * + * @param locale The language locale. + */ + public void setLocale(Locale locale) { + this.locale = locale; + } + + /** + * Constructor. + * + * @param name The language name. + * @param code The language code. + * @param locale The language locale. + */ + public AraraLanguage(String name, String code, Locale locale) { + this.name = name; + this.code = code; + this.locale = locale; + } + + /** + * Returns a string representation of the object. + * + * @return The string representation of the object. + */ + @Override + public String toString() { + return name.concat(" [").concat(code).concat("]"); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java new file mode 100644 index 00000000000..ec7edf71e86 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleArgument.java @@ -0,0 +1,124 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * PlainAraraRuleArgument: This class provides the model for representing a + * plain Arara rule argument based on the YAML files. It's a plain old Java + * object. + */ +// package definition +package com.github.arara.model; + +// needed import +import com.github.arara.utils.AraraUtils; + +/** + * Provides the model for representing a plain Arara rule argument based on the + * YAML files. This class will be used to map YAML rules into Java objects. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraRuleArgument { + + // the rule argument identifier + private String identifier; + // the command flag + private String flag; + // the default value + private String defaultValue; + + /** + * Getter for the default value. + * + * @return The default value. + */ + public String getDefault() { + return defaultValue; + } + + /** + * Setter for the default value. + * + * @param defaultValue The default value. + */ + public void setDefault(String defaultValue) { + this.defaultValue = AraraUtils.removeKeyword(defaultValue); + } + + /** + * Getter for flag. + * + * @return The command flag. + */ + public String getFlag() { + + // return it + return flag; + } + + /** + * Setter for flag. + * + * @param flag The command flag. + */ + public void setFlag(String flag) { + + // set the flag + this.flag = AraraUtils.removeKeyword(flag); + } + + /** + * Getter for the argument identifier. + * + * @return The argument identifier. + */ + public String getIdentifier() { + + // return it + return identifier; + } + + /** + * Setter for the argument identifier. + * + * @param identifier The argument identifier. + */ + public void setIdentifier(String identifier) { + + // set the identifier + this.identifier = identifier; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java new file mode 100644 index 00000000000..172c899bf14 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraRuleConfig.java @@ -0,0 +1,223 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * PlainAraraRuleConfig: This class provides the model for representing a plain + * Arara rule configuration based on the YAML files. It's a plain old Java + * object. + */ +// package definition +package com.github.arara.model; + +// needed imports +import com.github.arara.utils.AraraUtils; +import java.util.ArrayList; +import java.util.List; + +/** + * Provides the model for representing a plain Arara rule configuration based on + * the YAML files. This class will be used to map YAML rules into Java objects. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraRuleConfig { + + // the rule identifier + private String identifier; + // the rule name + private String name; + // the rule command + private String command; + // the rule commands + private List<String> commands; + // the arguments list + private List<AraraRuleArgument> arguments; + + public List<String> getCommands() { + return commands; + } + + /** + * Setter for the rule commands. + * + * @param commands A list containing the rule commands. + */ + public void setCommands(List<String> commands) { + this.commands = commands; + + // for every entry + for (int i = 0; i < commands.size(); i++) { + + // remove keyword and reinsert into the list + String currentCommand = AraraUtils.removeKeyword(commands.get(i)); + commands.set(i, currentCommand); + } + } + + /** + * Getter for the rule identifier. + * + * @return The rule identifier. + */ + public String getIdentifier() { + + // return it + return identifier; + } + + /** + * Setter for the rule identifier. + * + * @param identifier The rule identifier. + */ + public void setIdentifier(String identifier) { + + // set the identifier + this.identifier = identifier; + } + + /** + * Getter for the rule name. + * + * @return The rule name. + */ + public String getName() { + + // return it + return name; + } + + /** + * Setter for the rule name. + * + * @param name The rule name. + */ + public void setName(String name) { + + // set the rule name + this.name = name; + } + + /** + * Getter for the rule command. + * + * @return The rule command. + */ + public String getCommand() { + + // return it + return command; + } + + /** + * Setter for the rule command. + * + * @param command The rule command. + */ + public void setCommand(String command) { + + // set the command + this.command = AraraUtils.removeKeyword(command); + } + + /** + * Getter for the arguments list. + * + * @return The arguments list. + */ + public List<AraraRuleArgument> getArguments() { + + // return the list + return arguments; + } + + /** + * Setter for the arguments list. + * + * @param arguments The arguments list. + */ + public void setArguments(List<AraraRuleArgument> arguments) { + + // set the list + this.arguments = arguments; + } + + /** + * Returns a list containing all argument identifiers. + * + * @return A list containing all argument identifiers. + */ + public List<String> getIdentifiersList() { + + // create a new list + List<String> result = new ArrayList<String>(); + + // for every argument + for (AraraRuleArgument argument : getArguments()) { + + // add identifier + result.add(argument.getIdentifier()); + } + + // return list + return result; + } + + /** + * Returns the forbidden identifier, if any. + * + * @return The forbidden identifier, if any. + */ + public String checkForForbiddenIdentifiers() { + + // for every argument + for (AraraRuleArgument argument : getArguments()) { + + // get the current argument value + String value = argument.getIdentifier().toLowerCase(); + + // check if it's a forbidden argument identifier + if ((value.equals("file")) || (value.equals("files")) || (value.equals("item")) || (value.equals("items"))) { + + // return the value + return value; + } + } + + // nothing wrong was found + return null; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java new file mode 100644 index 00000000000..5bb679afdc1 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/model/AraraTask.java @@ -0,0 +1,109 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraTask: This class provides the model for representing the Arara tasks + * based on the directives and rules. It's a plain old Java object. + */ +// package definition +package com.github.arara.model; + +// needed import +import java.util.HashMap; + +/** + * Provides the model for representing the Arara tasks based on the directives + * and rules. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraTask { + + // the task name + private String name; + // a map to hold the tasks parameters + private HashMap parameters; + + /** + * Empty constructor. + */ + public AraraTask() { + } + + /** + * Getter for name. + * + * @return The task name. + */ + public String getName() { + + // return it + return name; + } + + /** + * Setter for name. + * + * @param name The task name. + */ + public void setName(String name) { + + // set the name + this.name = name; + } + + /** + * Getter for parameters. + * + * @return A map containing all the task parameters. + */ + public HashMap getParameters() { + + // return it + return parameters; + } + + /** + * Setter for parameters. + * + * @param parameters The task parameters as a map. + */ + public void setParameters(HashMap parameters) { + + // set parameters + this.parameters = parameters; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java new file mode 100644 index 00000000000..5139bb7b884 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraConstants.java @@ -0,0 +1,96 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraConstants: This class contains all the constants used in the main + * application. + */ +// package definition +package com.github.arara.utils; + +/** + * Contains all the constants used in the main application. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraConstants { + + /** + * The arara version. + */ + public static final String VERSION = "3.0"; + /** + * The number of characters per line in messages. + */ + public static final int WRAPLENGTH = 65; + /** + * The name of the default configuration file. + */ + public static final String ARARACONFIG = "araraconfig.yaml"; + /** + * The directive prefix for the pattern matching method. + */ + public static final String DIRECTIVEPREFIX = "arara:\\s"; + /** + * The rule pattern for string reference. + */ + public static final String RULEPATTERN = "^(\\s)*<arara>\\s"; + /** + * The name of the log file generated by arara. + */ + public static final String LOGNAME = "arara"; + /** + * The copyright year. + */ + public static final String COPYRIGHTYEAR = "2012"; + /** + * The variable exception matching pattern. + */ + public static final String VAREXCEPTIONPATTERN = "^\\[Error: could not access: (.*);"; + /** + * The method exception matching pattern. + */ + public static final String METHODEXCEPTIONPATTERN = "^\\[Error: unable to access property \\((.*)\\): (.*)\\]"; + /** + * The full directive matching pattern. + */ + public static final String FULLDIRECTIVEPATTERN = "^\\s*(\\w+)\\s*:\\s*\\{.*\\}\\s*$"; + /** + * The empty directive matching pattern. + */ + public static final String EMPTYDIRECTIVEPATTERN = "^\\s*(\\w+)\\s*$"; + +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java new file mode 100644 index 00000000000..b3444f615bf --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLocalization.java @@ -0,0 +1,126 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraLocalization: This class contains a few helper methods in order to ease + * the localization process during the execution. This class is a singleton + * reference. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * Contains a few helper methods in order to ease the localization process + * during the execution. This class is a singleton reference. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraLocalization { + + // the singleton reference + private static AraraLocalization selfRef; + // the resource bundle for the whole application + private ResourceBundle resources; + + /** + * Constructs the singleton instance. + */ + private AraraLocalization() { + + // set the self-reference + selfRef = this; + + // instead of relying in the default locale from the + // operating system, always fallback to english + Locale.setDefault(Locale.ENGLISH); + + // get the resource bundle + resources = ResourceBundle.getBundle("com.github.arara.localization.Messages"); + } + + /** + * Provides reference to the singleton object. + * + * @return The singleton instance. + */ + public static final AraraLocalization getInstance() { + + // if there's no current object, call the private constructor + if (selfRef == null) { + selfRef = new AraraLocalization(); + } + + // return the actual object + return selfRef; + } + + /** + * Returns a simple message from the resource bundle. + * + * @param message The message identifier. + * @return A string from the resource bundle. + */ + public String getMessage(String message) { + return resources.getString(message); + } + + /** + * Returns a message containing parameters from the resource bundle. + * + * @param message The message identifier. + * @param parameters A list of parameters to be replaced in the message. + * @return A string from the resource bundle, with the correct parameters. + */ + public String getMessage(String message, Object... parameters) { + return MessageFormat.format(resources.getString(message), parameters); + } + + /** + * Refresh the resource bundle reference, if by any chance, the application + * language is changed in runtime. + */ + public void refresh() { + + // clear cache and reload the resource bundle + // ResourceBundle.clearCache(); // not supported by Java 5 + resources = ResourceBundle.getBundle("com.github.arara.localization.Messages"); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java new file mode 100644 index 00000000000..ad5cf19d861 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraLogging.java @@ -0,0 +1,82 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraLogging: This class configures the logging features. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; +import org.slf4j.LoggerFactory; + +/** + * Configures the logging features. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraLogging { + + public static void enableLogging(boolean enable) { + + // get the context + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + + try { + + // create a new configurator + JoranConfigurator configurator = new JoranConfigurator(); + + // set context and reset it + configurator.setContext(loggerContext); + loggerContext.reset(); + + // if logging should be enabled + if (enable) { + + // add the correct properties and load the XML file + loggerContext.putProperty("araraLogName", AraraConstants.LOGNAME); + configurator.doConfigure(AraraLogging.class.getResourceAsStream("/com/github/arara/conf/logback.xml")); + } + + } catch (JoranException joranException) { + // do nothing + } + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java new file mode 100644 index 00000000000..e7699c96d56 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraMethods.java @@ -0,0 +1,481 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraMethods: This class contains methods for the MVEL expression language to + * be used in the rules. + */ +// package definition +package com.github.arara.utils; + +// needed import +import java.io.File; +import org.apache.commons.lang3.SystemUtils; + +/** + * Contains methods for the MVEL expression language to be used in the rules. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraMethods { + + /** + * Holds the original filename. + */ + private static String originalFile; + + /** + * Setter for the original filename. + * + * @param originalFile The original filename. + */ + public static void setOriginalFile(String originalFile) { + AraraMethods.originalFile = originalFile; + } + + /** + * Getter for the original filename. + * + * @return A string containing the original filename. + */ + public static String getOriginalFile() { + return originalFile; + } + + /** + * Checks if string is empty. + * + * @param string The string. + * @return A logical value according to the condition. + */ + public static boolean isEmpty(String string) { + return string.isEmpty(); + } + + /** + * Checks if string is not empty. + * + * @param string The string. + * @return A logical value according to the condition. + */ + public static boolean isNotEmpty(String string) { + return !string.isEmpty(); + } + + /** + * Checks if string is empty. + * + * @param string The string. + * @param ifTrue Value if true. + * @return A string according the condition. + */ + public static String isEmpty(String string, String ifTrue) { + return (string.isEmpty() ? ifTrue : string); + } + + /** + * Checks if string is not empty. + * + * @param string The string. + * @param ifTrue Value if true. + * @return A string according the condition. + */ + public static String isNotEmpty(String string, String ifTrue) { + return (!string.isEmpty() ? ifTrue : string); + } + + /** + * Checks if string is empty. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @return A string according the condition. + */ + public static String isEmpty(String string, String ifTrue, String ifFalse) { + return (string.isEmpty() ? ifTrue : ifFalse); + } + + /** + * Checks if string is not empty. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @return A string according the condition. + */ + public static String isNotEmpty(String string, String ifTrue, String ifFalse) { + return (!string.isEmpty() ? ifTrue : ifFalse); + } + + /** + * Checks if string resolves to a logic value representing true. + * + * @param string The string. + * @return A string according the condition. + */ + public static boolean isTrue(String string) { + string = string.toLowerCase(); + if ((string.equals("yes")) || (string.equals("on")) || (string.equals("true")) || (string.equals("y")) || (string.equals("1"))) { + return true; + } else { + return false; + } + } + + /** + * Checks if string resolves to a logic value representing false. + * + * @param string The string. + * @return A string according the condition. + */ + public static boolean isFalse(String string) { + string = string.toLowerCase(); + if ((string.equals("no")) || (string.equals("off")) || (string.equals("false")) || (string.equals("n")) || (string.equals("0"))) { + return true; + } else { + return false; + } + } + + /** + * Checks if string resolves to a logic value representing true. + * + * @param string The string. + * @param ifTrue Value if true. + * @return A string according the condition. + */ + public static String isTrue(String string, String ifTrue) { + return (isTrue(string) ? ifTrue : ""); + } + + /** + * Checks if string resolves to a logic value representing false. + * + * @param string The string. + * @param ifTrue Value if true. + * @return A string according the condition. + */ + public static String isFalse(String string, String ifTrue) { + return (isFalse(string) ? ifTrue : ""); + } + + /** + * Checks if string resolves to a logic value representing true. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @return A string according the condition. + */ + public static String isTrue(String string, String ifTrue, String ifFalse) { + return (isTrue(string) ? ifTrue : ifFalse); + } + + /** + * Checks if string resolves to a logic value representing false. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @return A string according the condition. + */ + public static String isFalse(String string, String ifTrue, String ifFalse) { + return (isFalse(string) ? ifTrue : ifFalse); + } + + /** + * Checks if string resolves to a logic value representing true. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @param defaultValue Value if the string is neither true or false. + * @return A string according the condition. + */ + public static String isTrue(String string, String ifTrue, String ifFalse, String defaultValue) { + if (isTrue(string)) { + return ifTrue; + } + if (isFalse(string)) { + return ifFalse; + } + return defaultValue; + } + + /** + * Checks if string resolves to a logic value representing false. + * + * @param string The string. + * @param ifTrue Value if true. + * @param ifFalse Value if false. + * @param defaultValue Value if the string is neither true or false. + * @return A string according the condition. + */ + public static String isFalse(String string, String ifTrue, String ifFalse, String defaultValue) { + if (isFalse(string)) { + return ifTrue; + } + if (isTrue(string)) { + return ifFalse; + } + return defaultValue; + } + + /** + * Trim spaces from the string. + * + * @param string The string. + * @return The string with the trailing and leading spaces trimmed. + */ + public static String trimSpaces(String string) { + return string.trim(); + } + + /** + * Returns the filename. + * + * @param f The string. + * @return The filename. + */ + public static String getFilename(String f) { + try { + return (new File(f)).getName(); + } catch (Exception exception) { + return ""; + } + } + + /** + * Returns the base name. + * + * @param f The string. + * @return The base name. + */ + public static String getBasename(String f) { + try { + f = (new File(f)).getName(); + int i = f.lastIndexOf(".") != -1 ? f.lastIndexOf(".") : f.length(); + return f.substring(0, i); + } catch (Exception exception) { + return ""; + } + } + + /** + * Returns the filetype. + * + * @param f The string. + * @return The filetype. + */ + public static String getFiletype(String f) { + try { + f = (new File(f)).getName(); + if (f.lastIndexOf(".") != -1) { + return f.substring(f.lastIndexOf(".") + 1, f.length()); + } + return ""; + } catch (Exception exception) { + return ""; + } + } + + /** + * Returns the directory name. + * + * @param f The string. + * @return The directory name. + */ + public static String getDirname(String f) { + try { + return (new File(f)).getParent(); + } catch (Exception exception) { + return ""; + } + } + + /** + * Checks if the string is a valid existing file. + * + * @param f The string. + * @return A logic value indicating if the string is a valid existing file. + */ + public static boolean isFile(String f) { + try { + return (new File(f)).isFile(); + } catch (Exception exception) { + return false; + } + } + + /** + * Checks if the string is a valid existing directory. + * + * @param f The string. + * @return A logic value indicating if the string is a valid existing + * directory. + */ + public static boolean isDir(String f) { + try { + return (new File(f)).isDirectory(); + } catch (Exception exception) { + return false; + } + } + + /** + * Checks if the operating system is Windows. + * + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isWindows(String ifTrue, String ifFalse) { + if (SystemUtils.IS_OS_WINDOWS) { + return ifTrue; + } + else { + return ifFalse; + } + } + + /** + * Checks if the operating system is Linux. + * + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isLinux(String ifTrue, String ifFalse) { + if (SystemUtils.IS_OS_LINUX) { + return ifTrue; + } + else { + return ifFalse; + } + } + + /** + * Checks if the operating system is Unix. + * + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isUnix(String ifTrue, String ifFalse) { + if (SystemUtils.IS_OS_UNIX) { + return ifTrue; + } + else { + return ifFalse; + } + } + + /** + * Checks if the operating system is Mac. + * + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isMac(String ifTrue, String ifFalse) { + if (SystemUtils.IS_OS_MAC) { + return ifTrue; + } + else { + return ifFalse; + } + } + + /** + * Checks if the logic condition is true. + * + * @param value Logic condition to be evaluated. + * @param ifTrue The value if true. + * @return A string according the condition. + */ + public static String isTrue(boolean value, String ifTrue) { + if (value) { + return ifTrue; + } + return ""; + } + + /** + * Checks if the logic condition is true. + * + * @param value Logic condition to be evaluated. + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isTrue(boolean value, String ifTrue, String ifFalse) { + if (value) { + return ifTrue; + } + return ifFalse; + } + + /** + * Checks if the logic condition is false. + * + * @param value Logic condition to be evaluated. + * @param ifTrue The value if true. + * @return A string according the condition. + */ + public static String isFalse(boolean value, String ifTrue) { + if (!value) { + return ifTrue; + } + return ""; + } + + /** + * Checks if the logic condition is false. + * + * @param value Logic condition to be evaluated. + * @param ifTrue The value if true. + * @param ifFalse The value if false. + * @return A string according the condition. + */ + public static String isFalse(boolean value, String ifTrue, String ifFalse) { + if (!value) { + return ifTrue; + } + return ifFalse; + } + +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java new file mode 100644 index 00000000000..54d280be2cb --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraResolver.java @@ -0,0 +1,74 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraResolver: This class extends a Resolver class to disable mapping of + * numeric times, as arara works better with text. + */ +// package definition +package com.github.arara.utils; + +// needed import +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.resolver.Resolver; + +/** + * Extends a Resolver class to disable mapping of numeric times, as Arara works + * better with text. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class AraraResolver extends Resolver { + + /** + * Adds the implicit resolvers to the Yaml mechanism. + */ + @Override + protected void addImplicitResolvers() { + + // for merges + addImplicitResolver(Tag.MERGE, MERGE, "<"); + + // for null values + addImplicitResolver(Tag.NULL, NULL, "~nN\0"); + + // for empty values + addImplicitResolver(Tag.NULL, EMPTY, null); + + // for values + addImplicitResolver(Tag.VALUE, VALUE, "="); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java new file mode 100644 index 00000000000..2439cb70150 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/AraraUtils.java @@ -0,0 +1,224 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraUtils: This class contains some helper methods used for general purpose. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.text.WordUtils; +import org.yaml.snakeyaml.error.MarkedYAMLException; + +/** + * Contains some helper methods used for general purpose. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraUtils { + + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Removes the reserved keyword in the strings to be analyzed by the MVEL + * template engine. The keyword is set in AraraConstants. + * + * @param line The line to be analyzed. + * @return The new line without the keyword. + */ + public static String removeKeyword(String line) { + + // set a new pattern and matcher + Pattern pattern = Pattern.compile(AraraConstants.RULEPATTERN); + Matcher matcher = pattern.matcher(line); + + // if the keyword is found + if (matcher.find()) { + + // remove the keyword + line = (line.substring(matcher.end(), line.length())).trim(); + } + + // and return it + return line; + } + + /** + * Prints the arara ASCII header. + */ + public static void printHeader() { + + // print the ASCII art + System.out.println(" __ _ _ __ __ _ _ __ __ _ "); + System.out.println(" / _` | '__/ _` | '__/ _` |"); + System.out.println("| (_| | | | (_| | | | (_| |"); + System.out.println(" \\__,_|_| \\__,_|_| \\__,_|\n"); + + } + + /** + * Wraps the string to several lines, according to the wrap length set in + * the AraraConstants class. + * + * @param message The message to be wrapped. + * @return A new message. + */ + public static String wrap(String message) { + + // create a new tokenizer in order to allow line breaks, so + // every line is processed individually + StringTokenizer tokens = new StringTokenizer(message, "\n", true); + String result = ""; + + // iterate through tokens + while (tokens.hasMoreTokens()) { + + // wrap line according to the wrap length + result = result.concat(WordUtils.wrap(tokens.nextToken(), AraraConstants.WRAPLENGTH)); + } + + // return the result + return result; + } + + /** + * Gets the variable reference from a RuntimeException object. + * @param runtimeException The RuntimeException object. + * + * @return The variable reference name. + */ + public static String getVariableFromException(RuntimeException runtimeException) { + + // set pattern and matcher + Pattern pattern = Pattern.compile(AraraConstants.VAREXCEPTIONPATTERN); + Matcher matcher = pattern.matcher(runtimeException.getMessage()); + + // if the variable is found + if (matcher.find()) { + + // check if it's a valid reference + if (matcher.groupCount() != 0) { + + // return the variable name + return matcher.group(1); + } + + } else { + + // maybe it's a method call, let's investigate + pattern = Pattern.compile(AraraConstants.METHODEXCEPTIONPATTERN); + matcher = pattern.matcher(runtimeException.getMessage()); + + if (matcher.find()) { + + // check if it's a valid reference + if (matcher.groupCount() > 1) { + + // return the method name + return matcher.group(2); + } + + } + + } + + // nothing is found, so return an unknown reference + return "<unknown>"; + } + + /** + * Extracts information from a MarkedYAMLException object. + * + * @param yamlException The exception object. + * @return A string containing all the available information from the + * exception object. + */ + public static String extractInformationFromYAMLException(MarkedYAMLException yamlException) { + StringBuilder stringBuilder = new StringBuilder(); + if (yamlException.getContext() != null) { + stringBuilder.append(localization.getMessage("YamlError_Context", yamlException.getContext())).append("\n"); + } + if (yamlException.getProblem() != null) { + stringBuilder.append(localization.getMessage("YamlError_Problem", yamlException.getProblem())).append("\n"); + } + if (yamlException.getProblemMark() != null) { + stringBuilder.append(localization.getMessage("YamlError_ErrorLocation", yamlException.getProblemMark().getLine(), yamlException.getProblemMark().getColumn())).append("\n"); + } + if (yamlException.getProblemMark().get_snippet() != null) { + stringBuilder.append(yamlException.getProblemMark().get_snippet()); + } + return stringBuilder.toString(); + } + + /** + * Checks if the line contains a valid full directive. + * + * @param line The current line. + * @return A logic value indicating if a valid directive was found. + */ + public static boolean checkForFullDirective(String line) { + Pattern pattern = Pattern.compile(AraraConstants.FULLDIRECTIVEPATTERN); + Matcher m = pattern.matcher(line); + if (m.find()) { + return true; + } + else { + return false; + } + } + + /** + * Checks if the line contains a valid empty directive. + * + * @param line The current line. + * @return A logic value indicating if a valid directive was found. + */ + public static boolean checkForEmptyDirective(String line) { + Pattern pattern = Pattern.compile(AraraConstants.EMPTYDIRECTIVEPATTERN); + Matcher m = pattern.matcher(line); + if (m.find()) { + return true; + } + else { + return false; + } + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java new file mode 100644 index 00000000000..18257a3d532 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandLineAnalyzer.java @@ -0,0 +1,488 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * CommandLineAnalyzer: This class implements a command line parser to provide + * better control of flags and files to process. + */ +// package definition +package com.github.arara.utils; + +// needed import +import java.io.File; +import org.apache.commons.cli.*; + +/** + * Implements a command line parser to provide better control of flags and files + * to process. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class CommandLineAnalyzer { + + // the file to process + private String theFile; + // the command line arguments + private String[] theArgs; + // the command line options + private Options commandLineOptions; + // the verbose option + private boolean showVerboseOutput; + // the execution timeout, + // in milliseconds + private long executionTimeout; + // the configuration + private ConfigurationLoader configuration; + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Constructor. + * + * @param theArgs The command line arguments. + * @param configuration The current configuration. + */ + public CommandLineAnalyzer(String[] theArgs, ConfigurationLoader configuration) { + + // set the array + this.theArgs = theArgs; + + // set the configuration + this.configuration = configuration; + + // create new options + commandLineOptions = new Options(); + + // set the default value to the output + showVerboseOutput = false; + + } + + /** + * Parses the command line arguments and provides feedback to the main + * class. + * + * @return A boolean value if there is a file to be processed by Arara. + */ + public boolean parse() { + + // create the version option + Option optVersion = new Option("V", "version", false, localization.getMessage("Help_Version")); + + // create the help option + Option optHelp = new Option("h", "help", false, localization.getMessage("Help_Help")); + + // create the log option + Option optLog = new Option("l", "log", false, localization.getMessage("Help_Log")); + + // create the verbose option + Option optVerbose = new Option("v", "verbose", false, localization.getMessage("Help_Verbose")); + + // create the timeout option + Option optTimeout = new Option("t", "timeout", true, localization.getMessage("Help_Timeout")); + + // create the language option + Option optLanguage = new Option("L", "language", true, localization.getMessage("Help_Language")); + + // add version + commandLineOptions.addOption(optVersion); + + // add help + commandLineOptions.addOption(optHelp); + + // add log + commandLineOptions.addOption(optLog); + + // add verbose + commandLineOptions.addOption(optVerbose); + + // add timeout + commandLineOptions.addOption(optTimeout); + + // add language + commandLineOptions.addOption(optLanguage); + + // create a new basic parser + CommandLineParser parser = new BasicParser(); + + // lets try to parse everthing + try { + + // parse the arguments + CommandLine line = parser.parse(commandLineOptions, theArgs); + + // if -L or --language found + if (line.hasOption("language")) { + + // create a new language controler + LanguageController language = new LanguageController(); + + // if the attempt to set the language according to the command + // line has failed + if (!language.setLanguage(line.getOptionValue("language"))) { + + // print the list of available languages + language.printLanguageHelp(); + + // print the usage + printUsage(); + + // and simply return + return false; + } + else { + + // new language, refresh the options + optVersion.setDescription(localization.getMessage("Help_Version")); + optHelp.setDescription(localization.getMessage("Help_Help")); + optLog.setDescription(localization.getMessage("Help_Log")); + optVerbose.setDescription(localization.getMessage("Help_Verbose")); + optTimeout.setDescription(localization.getMessage("Help_Timeout")); + optLanguage.setDescription(localization.getMessage("Help_Language")); + } + } + + // if -h or --help found + if (line.hasOption("help")) { + + // print version + printVersion(); + + // and usage + printUsage(); + + // return + return false; + + } else { + + // if -v or --version found + if (line.hasOption("version")) { + + // print version + printVersion(); + + printSpecialThanks(); + + // and return + return false; + + } else { + + // get the list of files + String[] files = line.getArgs(); + + // we only expect one file + if (files.length != 1) { + + // print version + printVersion(); + + // usage + printUsage(); + + // and return + return false; + + } else { + + // if -t or --timeout found + if (line.hasOption("timeout")) { + + // try to convert the argument to a number + try { + + // parse the long value + executionTimeout = Long.parseLong(line.getOptionValue("timeout")); + + // if it's not a valid number + if (executionTimeout <= 0) { + + // print version + printVersion(); + + // usage + printUsage(); + + // and return + return false; + + } + } catch (NumberFormatException numberFormatException) { + + // we have a bad conversion + + // print version + printVersion(); + + // usage + printUsage(); + + // and return + return false; + } + } else { + + // fallback to the default value, that is, + // timeout is disabled + executionTimeout = 0; + } + + // active logging + AraraLogging.enableLogging(line.hasOption("log")); + + // set verbose flag + showVerboseOutput = line.hasOption("verbose"); + + // everything is fine, set + // the file + theFile = files[0]; + + // check if file exists + if (!checkFile(theFile, configuration.getValidExtensions())) { + + // file not found, return false + return false; + + } + + // and return + return true; + } + } + } + + } catch (ParseException parseException) { + + // something happened, in the last case print version + printVersion(); + + // and usage + printUsage(); + + // and simply return + return false; + + } + } + + /** + * Prints the usage message. + */ + private void printUsage() { + + // new formatter + HelpFormatter formatter = new HelpFormatter(); + + // add the text and print + formatter.printHelp("arara [file [--log] [--verbose] [--timeout N] [--language L] | --help | --version]", commandLineOptions); + } + + /** + * Prints the application version. + */ + private void printVersion() { + + // print the version + System.out.println("arara ".concat(AraraConstants.VERSION).concat(" - ").concat(localization.getMessage("Header_Slogan"))); + System.out.println("Copyright (c) ".concat(AraraConstants.COPYRIGHTYEAR).concat(", Paulo Roberto Massa Cereda")); + System.out.println(localization.getMessage("Header_AllRightsReserved").concat("\n")); + } + + /** + * Getter for file obtained from the command line. + * + * @return The file. + */ + public String getFile() { + + // return it + return theFile; + } + + /** + * Checks if file is valid. + * + * @param filename The file name. + * @param extensions A priority list of allowed extensions. + * @return A boolean value to determine if the file is valid. + */ + private boolean checkFile(String filename, String[] extensions) { + + // flag to indicate the file was found + boolean foundFile = false; + + // iterate through all the extensions + for (String currentExtension : extensions) { + + // check if the file has the current extension + if (filename.toLowerCase().endsWith(currentExtension)) { + + // set flag + foundFile = true; + + // set configuration + configuration.setChosenFilePattern(currentExtension); + + // break iteration + break; + } + } + + // create a new file status + File fileStatus = null; + + // check if a reference was found + if (foundFile) { + + // create new instance + fileStatus = new File(filename); + + // check if exists + if (fileStatus.exists()) { + + // add file + theFile = filename; + + // found it! + return true; + } else { + + // print message about it + System.out.println(localization.getMessage("Error_FileDoesNotExist", filename)); + + // not found + return false; + } + + } else { + + // there's no extension, we will add them and see if something + // is found + for (String currentExtension : extensions) { + + // new file with extension + fileStatus = new File(filename + currentExtension); + + // let's check it + if (fileStatus.exists()) { + + // add file + theFile = filename + currentExtension; + + // add reference + configuration.setChosenFilePattern(currentExtension); + + // found it! + return true; + + } + + } + + // print message about it + System.out.println(AraraUtils.wrap(localization.getMessage("Error_FileDoesNotExistWithExtensionsList", filename, getExtensionsList(extensions)))); + + // file not found + return false; + + } + + } + + /** + * Returns a string with the extensions list. + * + * @param extensions The extensions list. + * @return A string with the extensions list. + */ + private String getExtensionsList(String[] extensions) { + + // if it's an empty vector + if (extensions.length == 0) { + + // return an empty string + return ""; + + } else { + + // get first element + String result = "[".concat(extensions[0]); + + // iterate through the other values + for (int i = 1; i < extensions.length; i++) { + + // add the current extension + result = result.concat(", ").concat(extensions[i]); + } + + // close the list + result = result.concat("]"); + + // return it + return result; + } + } + + /** + * Checks if the output must be verbose. + * + * @return A boolean value. + */ + public boolean isVerbose() { + + // return it + return showVerboseOutput; + } + + /** + * Getter for the execution timeout. + * + * @return The execution timeout. + */ + public long getExecutionTimeout() { + + // return it + return executionTimeout; + } + + /** + * Prints the special thanks message. + */ + private void printSpecialThanks() { + System.out.println(AraraUtils.wrap(localization.getMessage("Msg_SpecialThanks"))); + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java new file mode 100644 index 00000000000..2ab887c2883 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/CommandTrigger.java @@ -0,0 +1,285 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * CommandTrigger: This class is responsible for running the arara commands. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.exception.AraraException; +import com.github.arara.model.AraraCommand; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import org.apache.commons.exec.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implements an environment for running the arara commands. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class CommandTrigger { + + // the logger + final static Logger logger = LoggerFactory.getLogger(CommandTrigger.class); + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + // the commands list + private List<AraraCommand> commands; + // flag to determine verbose output + private boolean showVerboseOutput; + // value for the execution timeout + private long executionTimeout; + + /** + * Constructor. + * + * @param commands The commands list. + */ + public CommandTrigger(List<AraraCommand> commands) { + + // set the list + this.commands = commands; + } + + /** + * Setter for the execution timeout. + * + * @param executionTimeout The execution timeout. + */ + public void setExecutionTimeout(long executionTimeout) { + + // set the value + this.executionTimeout = executionTimeout; + } + + /** + * Setter for the verbose mode. + * + * @param verbose A flag to indicate the verbose mode. + */ + public void setVerbose(boolean verbose) { + + // set the flag + showVerboseOutput = verbose; + } + + /** + * Executes the arara commands provided in the list. + * + * @return A boolean value about the execution. To be honest, I don't think + * it's necessary to return an actual value, but I kept it for possible + * future use. + * @throws AraraException Raised when the command is not found in the + * underlying system. + */ + public boolean execute() throws AraraException { + + // log action + logger.info(localization.getMessage("Log_ReadyToRunCommands")); + + // for every command in the list + for (AraraCommand currentAraraCommand : commands) { + + // print a message + System.out.print(localization.getMessage("Msg_RunningCommand", currentAraraCommand.getName()).concat(" ")); + + // if verbose + if (showVerboseOutput) { + + // add two lines + System.out.println("\n"); + } + + // log action + logger.info(localization.getMessage("Log_CommandName", currentAraraCommand.getName())); + + // log command + logger.trace(localization.getMessage("Log_Command", currentAraraCommand.getCommand())); + + // if the execution was ok + //if (runCommand(currentAraraCommand)) { + if (runCommand(currentAraraCommand)) { + + // print a message + System.out.println(localization.getMessage("Msg_Success")); + + // log action + logger.info(localization.getMessage("Log_CommandSuccess", currentAraraCommand.getName())); + + } else { + + // something bad happened, print message + System.out.println(localization.getMessage("Msg_Failure")); + + // log action + logger.warn(localization.getMessage("Log_CommandFailure", currentAraraCommand.getName())); + + // and return false + return false; + + } + + // if verbose + if (showVerboseOutput) { + + // add one line to the output + System.out.println(""); + } + + } + + // log action + logger.info(localization.getMessage("Log_AllCommandsSuccess")); + + // everything went ok, simply return true + return true; + + } + + /** + * Run the arara command. + * + * @param command The Arara command. + * @return A boolean indicating if the execution was successful. + * @throws AraraException Throws an exception in case the command was not + * found. + */ + private boolean runCommand(AraraCommand command) throws AraraException { + + // create a new byte array for the output logger + ByteArrayOutputStream stringLogger = new ByteArrayOutputStream(); + + // let's try + try { + + // set a query + String query = command.getCommand(); + + // create a new command line from the query + CommandLine commandLine = CommandLine.parse(query); + + // create a new tee + TeeOutputStream tee; + + // create a new execution handler + PumpStreamHandler streamHandler; + + // if verbose + if (showVerboseOutput) { + + // the new tee should include the normal output + // and the log + tee = new TeeOutputStream(System.out, stringLogger); + + // verbose mode enables input mode as well + streamHandler = new PumpStreamHandler(tee, tee, System.in); + + } else { + + // no verbose, so include only the log output + tee = new TeeOutputStream(stringLogger); + + // define the handler only with the log output + streamHandler = new PumpStreamHandler(tee); + } + + // create a new executor + DefaultExecutor executor = new DefaultExecutor(); + + // set the handler + executor.setStreamHandler(streamHandler); + + // check if there should be an execution timeout + if (executionTimeout > 0) { + + // create a new watch dog + ExecuteWatchdog watchDog = new ExecuteWatchdog(executionTimeout); + + // add it to the execution + executor.setWatchdog(watchDog); + } + + // set the shutdown hook + ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer(); + + // add it to the executor + executor.setProcessDestroyer(processDestroyer); + + // execute the command and get the exit code + int exitValue = executor.execute(commandLine); + + // if we are in verbose mode + if (showVerboseOutput) { + + // print the output status + System.out.print(localization.getMessage("Msg_Status").concat(" ")); + + } + + // add the output to the logger + logger.trace(localization.getMessage("Log_OutputLogging")); + logger.trace(stringLogger.toString()); + + // return the status as a boolean + return (exitValue == 0 ? true : false); + + } catch (ExecuteException executeException) { + + // in case of an error, or the watchdog in action, + // the logger addition is not reached, so we need + // to replicate it here + logger.trace(localization.getMessage("Log_OutputLogging")); + logger.trace(stringLogger.toString()); + + // something bad happened, return false + return false; + + } catch (IOException ioException) { + + // log error + logger.error(localization.getMessage("Log_CommandNotFound", command.getName(), command.getCommand())); + + // command not found, throw exception + throw new AraraException(localization.getMessage("Error_CommandNotFound", command.getName(), command.getCommand())); + + } + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java new file mode 100644 index 00000000000..cb2b2a7705d --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/ConfigurationLoader.java @@ -0,0 +1,394 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * ConfigurationLoader: This class provides an object handler for the arara + * configuration file. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.Arara; +import com.github.arara.exception.AraraException; +import com.github.arara.model.AraraConfiguration; +import com.github.arara.model.AraraFilePattern; +import java.io.File; +import java.io.FileReader; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.SystemUtils; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.error.MarkedYAMLException; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Representer; + +/** + * Provides an object handler for the arara configuration file. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class ConfigurationLoader { + + // list of search paths + private List<String> paths; + // the application path, that is, where arara is located + private String applicationPath; + // list of file patterns + private List<AraraFilePattern> filePatterns; + // list of valid extensions + private String[] validExtensions; + // the chosen pattern + private AraraFilePattern chosenFilePattern; + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Constructor. + */ + public ConfigurationLoader() { + + // create a new list of paths + paths = new ArrayList<String>(); + + // try to obtain the application path + try { + applicationPath = Arara.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + applicationPath = URLDecoder.decode(applicationPath, "UTF-8"); + applicationPath = new File(applicationPath).getParentFile().getPath(); + } catch (Exception exception) { + applicationPath = ""; + } + } + + /** + * Loads the configuration settings, either the default setup or through the + * configuration file. + * + * @throws Exception An exception is thrown if something unexpected happens + * during the execution of this method. + */ + public void load() throws Exception { + + // create the default patterns + + // for .tex files + AraraFilePattern texPattern = new AraraFilePattern(); + texPattern.setExtension("tex"); + texPattern.setPattern("^(\\s)*%\\s+"); + + // for .dtx files + AraraFilePattern dtxPattern = new AraraFilePattern(); + dtxPattern.setExtension("dtx"); + dtxPattern.setPattern("^(\\s)*%\\s+"); + + // for .ltx files + AraraFilePattern ltxPattern = new AraraFilePattern(); + ltxPattern.setExtension("ltx"); + ltxPattern.setPattern("^(\\s)*%\\s+"); + + // create a list of default patterns + List<AraraFilePattern> defaultPatterns = new ArrayList<AraraFilePattern>(); + + // add the default ones + defaultPatterns.add(texPattern); + defaultPatterns.add(dtxPattern); + defaultPatterns.add(ltxPattern); + + // create a list of file patterns + filePatterns = new ArrayList<AraraFilePattern>(); + + // create a file reference + File configurationFile = new File(SystemUtils.USER_HOME + File.separator + AraraConstants.ARARACONFIG); + + // if there is not a configuration file + if (!configurationFile.exists()) { + + // there's only one path to look for rules + paths.add(applicationPath + File.separator + "rules"); + + // the only file patterns are the default ones + filePatterns.addAll(defaultPatterns); + + // create an array of valid extensions + validExtensions = new String[filePatterns.size()]; + + // add them according to the file patterns + for (int i = 0; i < filePatterns.size(); i++) { + validExtensions[i] = ".".concat(filePatterns.get(i).getExtension()); + } + + // simply return, there's nothing more to do + return; + } + + // create the YAML representer + Representer representer = new Representer(); + representer.addClassTag(AraraConfiguration.class, new Tag("!config")); + representer.addClassTag(AraraFilePattern.class, new Tag("!pattern")); + + // create the YAML parser + Yaml yaml = new Yaml(new Constructor(AraraConfiguration.class), representer); + + // create the file reader + FileReader fileReader = new FileReader(configurationFile); + + // set the new configuration object + AraraConfiguration configuration = null; + + try { + + // try to read the configuration object + configuration = (AraraConfiguration) yaml.load(fileReader); + + } catch (MarkedYAMLException yamlException) { + + // there's an error with the YAML file, so an exception is thrown + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_InvalidYAMLConfigurationFile").concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException))); + } + catch (Exception e) { + System.out.println(e.getMessage()); + } + + // close the file reader + fileReader.close(); + + // check if the configuration is invalid + if (configuration == null) { + + // it's invalid, raise an exception + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_InvalidConfigurationFile")); + } + + // check if there's an available language + if (configuration.getLanguage() != null) { + + // create a new language control + LanguageController languageController = new LanguageController(); + + // if the language is not valid + if (languageController.setLanguage(configuration.getLanguage()) == false) { + + // it's invalid, raise an exception + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_InvalidLanguageConfigurationFile", languageController.getLanguagesList())); + } + } + + // check if there are new paths + if (configuration.getPaths() != null) { + + // a runtime exception happened when resolving some + // path names + if (configuration.getPathRuntimeException() != null) { + + // raise an exception + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_PathRuntimeErrorConfigurationFile", AraraUtils.getVariableFromException(configuration.getPathRuntimeException()))); + } + + // a IO exception happened when checking if it was + // a valid path entry + if (configuration.getPathIOException() != null) { + + // raise an exception + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_PathIOErrorConfigurationFile")); + } + + // for every path set + for (String currentPath : configuration.getPaths()) { + + // add it to the paths list + paths.add(currentPath); + } + } + + // the last path to be added is the application path + paths.add(applicationPath + File.separator + "rules"); + + // check if there are new file patterns + if (configuration.getFiletypes() != null) { + + // get all file patterns + List<AraraFilePattern> filetypes = configuration.getFiletypes(); + + // reorder the list of filetypes + for (int i = 0; i < defaultPatterns.size(); i++) { + + // if the filetype is not in the default list + if (!isAlreadyDefined(defaultPatterns.get(i), filetypes)) { + + // simply add it + filePatterns.add(defaultPatterns.get(i)); + } + } + + // merge the two lists + filePatterns.addAll(filetypes); + + // create a new array of valid extensions + validExtensions = new String[filePatterns.size()]; + int counter = 0; + + // sanity check, if there are valid extensions and patterns + for (AraraFilePattern currentPattern : filePatterns) { + + // check if either of those fields is missing + if ((currentPattern.getPattern() == null) || (currentPattern.getExtension() == null)) { + + // it's invalid, raise an exception + AraraLogging.enableLogging(false); + throw new AraraException(localization.getMessage("Error_InvalidFiletypesConfigurationFile")); + + } + + // add the dot to the extension + validExtensions[counter] = ".".concat(currentPattern.getExtension()); + counter++; + } + } else { + + // no new filetypes, simply merge the lists + filePatterns.addAll(defaultPatterns); + + // create a new array for extensions + validExtensions = new String[filePatterns.size()]; + + // iterate through all filetypes and add the extension to the array + for (int i = 0; i < filePatterns.size(); i++) { + validExtensions[i] = ".".concat(filePatterns.get(i).getExtension()); + } + } + + } + + /** + * Checks if the filetype is already defined in the list, and updates the + * latter if needed. + * + * @param filePattern The filetype object. + * @param list The list to be inspected. + * @return A boolean indicating if the filetype is already defined in the + * list. + */ + private boolean isAlreadyDefined(AraraFilePattern filePattern, List<AraraFilePattern> list) { + + // iterate through all elements + for (int i = 0; i < list.size(); i++) { + + // check if it already exists + if (filePattern.getExtension().equalsIgnoreCase(list.get(i).getExtension())) { + + // update the element if needed + if (list.get(i).getPattern() == null) { + list.set(i, filePattern); + } + + // already defined + return true; + } + } + + // not found + return false; + } + + /** + * Getter for the paths. + * + * @return The paths. + */ + public List<String> getPaths() { + return paths; + } + + /** + * Getter for the file patterns. + * + * @return The file patterns. + */ + public List<AraraFilePattern> getFilePatterns() { + return filePatterns; + } + + /** + * Getter for the valid extensions available. + * + * @return An array containing the valid extensions. + */ + public String[] getValidExtensions() { + return validExtensions; + } + + /** + * Setter for the chosen file pattern. + * + * @param extension A string containing a reference for the file extension. + */ + public void setChosenFilePattern(String extension) { + + // for every file pattern + for (AraraFilePattern currentPattern : filePatterns) { + + // if the extension matches + if (".".concat(currentPattern.getExtension()).equals(extension)) { + + // we found our pattern + chosenFilePattern = currentPattern; + + // return + return; + } + } + + // nothing found + chosenFilePattern = null; + } + + /** + * Getter for the chosen file pattern. + * + * @return The chosen file pattern. + */ + public AraraFilePattern getChosenFilePattern() { + return chosenFilePattern; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java new file mode 100644 index 00000000000..847fe933cef --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveExtractor.java @@ -0,0 +1,287 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * DirectiveExtractor: This class reads the file and extracts all the directives + * it could find. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.exception.AraraException; +import com.github.arara.model.AraraDirective; +import java.io.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.error.MarkedYAMLException; +import org.yaml.snakeyaml.representer.Representer; + +/** + * Reads the file and extracts all the directives it could find. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class DirectiveExtractor { + + // the logger + final static Logger logger = LoggerFactory.getLogger(DirectiveExtractor.class); + // the list of directives + private List<AraraDirective> directives; + // the file + private File file; + // the current line number + private int currentLineNumber; + // the configuration object + private ConfigurationLoader configuration; + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Constructor. + */ + public DirectiveExtractor() { + + // create new list + directives = new ArrayList<AraraDirective>(); + + // set file to null + file = null; + } + + /** + * Constructor. + * + * @param file The file. + */ + public DirectiveExtractor(File file, ConfigurationLoader configuration) { + + // create a new list + directives = new ArrayList<AraraDirective>(); + + this.configuration = configuration; + + // set file + this.file = file; + } + + /** + * Setter for file. + * + * @param file The file. + */ + public void setFile(File file) { + + // set the file + this.file = file; + } + + /** + * Getter for Arara directives. + * + * @return A list containing all Arara directives. + */ + public List<AraraDirective> getDirectives() { + + // return the list + return directives; + } + + /** + * Extracts the directives from the file. + * + * @throws FileNotFoundException Raised when file not found. + * @throws IOException Raised when an IO error happened. + * @throws AraraException Raised when there's a problem with the directive. + */ + public void extract() throws FileNotFoundException, IOException, AraraException { + + // create a new file reader + FileReader fileReader = new FileReader(file); + + // create a new buffer + BufferedReader bufferedReader = new BufferedReader(fileReader); + + // variable to hold the current line + String currentLine; + + // the line count + currentLineNumber = 0; + + // log directives + logger.info("Reading directives from {}.", file.getName()); + + // while not EOF + while ((currentLine = bufferedReader.readLine()) != null) { + + // increment the current line number + currentLineNumber++; + + // extract directive + extractDirective(currentLine); + } + + // close the buffer + bufferedReader.close(); + + // close the reader + fileReader.close(); + + } + + /** + * Extracts the Arara directives from the current line. + * + * @param currentLine The current line. + * @throws AraraException Raised when there is a problem with the directive. + */ + private void extractDirective(String currentLine) throws AraraException { + + // get the pattern for the chosen filetype + Pattern linePattern = Pattern.compile(configuration.getChosenFilePattern().getPattern()); + + // create the matcher according to the pattern + Matcher matcher = linePattern.matcher(currentLine); + + // if the pattern is found + if (matcher.find()) { + + // get the substring + currentLine = (currentLine.substring(matcher.end(), currentLine.length())).trim(); + + // there is actually something after the keyword + if (!currentLine.isEmpty()) { + + // log directive + logger.trace(localization.getMessage("Log_DirectiveFound", currentLineNumber, currentLine)); + + // look for a full directive + if (AraraUtils.checkForFullDirective(currentLine)) { + + // add it + addAraraDirective(currentLine); + } + else { + + // look for an empty directive + if (AraraUtils.checkForEmptyDirective(currentLine)) { + + // add it + addEmptyAraraDirective(currentLine.trim()); + } + else { + + // an invalid directive was found, throw error + throw new AraraException(localization.getMessage("Error_InvalidDirective", currentLineNumber)); + } + } + + } + } + } + + /** + * Extracts an empty Arara directive. + * + * @param currentLine The current line. + */ + private void addEmptyAraraDirective(String currentLine) { + + // create a new directive + AraraDirective araraDirective = new AraraDirective(); + + // set the name + araraDirective.setName(currentLine); + + // set the config + araraDirective.setConfig(new HashMap()); + + // set the line number, in case of error + araraDirective.setLineNumber(currentLineNumber); + + // add the directive to the list + directives.add(araraDirective); + + } + + /** + * Extracts am Arara directive. + * + * @param currentLine The current line. + * @throws AraraException Raised when there is a problem with the directive. + */ + private void addAraraDirective(String currentLine) throws AraraException { + + // lets try + try { + + // create a new YAML parser + Yaml yaml = new Yaml(new Constructor(), new Representer(), new DumperOptions(), new AraraResolver()); + + // create a new map and load the current line + Map config = (Map) yaml.load(currentLine); + + // create a new directive + AraraDirective ad = new AraraDirective(); + + // set the name + ad.setName(currentLine); + + // set the config + ad.setConfig(config); + + // set line number. in case of error + ad.setLineNumber(currentLineNumber); + + // add the directive to the list + directives.add(ad); + + } catch (MarkedYAMLException yamlException) { + + // malformed directive, throw exception + throw new AraraException(localization.getMessage("Error_InvalidYAMLDirective", currentLineNumber).concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException))); + } + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java new file mode 100644 index 00000000000..7c547be1a07 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/DirectiveParser.java @@ -0,0 +1,321 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * DirectiveParser: This class analyzes the list of directives and converts them + * to a list of arara tasks. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.exception.AraraException; +import com.github.arara.model.AraraDirective; +import com.github.arara.model.AraraTask; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Analyzes the list of directives and converts them to a list of arara tasks. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class DirectiveParser { + + // the logger + final static Logger logger = LoggerFactory.getLogger(DirectiveParser.class); + // the list of directives + private List<AraraDirective> directives; + // the list of tasks + private List<AraraTask> tasks; + // the list of file names, to use as a temporary variable + private List<String> fileNames; + // the list of items + private List<String> items; + // the current file reference + private File file; + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Constructor + */ + public DirectiveParser() { + } + + /** + * Constructor. + * + * @param directives The Arara directives. + */ + public DirectiveParser(List<AraraDirective> directives) { + + // set the directives + this.directives = directives; + + // create a new list of tasks + this.tasks = new ArrayList<AraraTask>(); + + // create a new list of file names + this.fileNames = new ArrayList<String>(); + + // create a new list of items + this.items = new ArrayList<String>(); + } + + /** + * Setter for file. + * + * @param file The file. + */ + public void setFile(File file) { + + // set the file + this.file = file; + } + + /** + * Setter for the list of Arara directives. + * + * @param directives The list of Arara directives. + */ + public void setDirectives(List<AraraDirective> directives) { + + // set the list + this.directives = directives; + } + + /** + * Parses the list of Arara directives. + * + * @return A list of Arara tasks based on the directives. + * @throws AraraMalformedDirective Raised when a malformed directive is + * found. + */ + public List<AraraTask> parse() throws AraraException { + + // log message + logger.info("Parsing directives."); + + // for every directive + for (AraraDirective currentDirective : directives) { + + // clear the list of files + fileNames.clear(); + + // clear the task name + String taskName = ""; + + // create a new map + Map taskConfig = new HashMap(); + + // if there's no configuration + if (currentDirective.getConfig().isEmpty()) { + + // set the name + taskName = currentDirective.getName(); + + } else { + + // get the current config + Map currentConfig = currentDirective.getConfig(); + + // and get the directive name + String directiveName = (String) currentConfig.keySet().iterator().next(); + + // set the name to the task + taskName = directiveName; + + // get the parameters + Object currentConfigParameters = currentConfig.get(directiveName); + + // if it is a map + if (currentConfigParameters instanceof Map) { + + // get the map + Map currentParameters = (Map) currentConfigParameters; + + // if it is empty, error + if (currentParameters.isEmpty()) { + + // raise an error + throw new AraraException(localization.getMessage("Error_DirectiveEmptyCurlyBrackets", directiveName, currentDirective.getLineNumber())); + + } else { + + // for every parameter + for (Object currentParameterKey : currentParameters.keySet()) { + + // if the parameter is a string + if (currentParameters.get(currentParameterKey) instanceof String) { + + // if it is a file reference, error + if (((String) currentParameterKey).equals("files")) { + + // raise an error + throw new AraraException(localization.getMessage("Error_DirectiveInvalidArgumentList", directiveName, currentDirective.getLineNumber(), "files")); + } + + if (((String) currentParameterKey).equals("items")) { + + // raise an error + throw new AraraException(localization.getMessage("Error_DirectiveInvalidArgumentList", directiveName, currentDirective.getLineNumber(), "items")); + } + + // if it is a file reference, error + if (((String) currentParameterKey).equals("file")) { + + // raise an error + throw new AraraException(localization.getMessage("Error_DirectiveReservedKeyword", directiveName, currentDirective.getLineNumber(), "file", "files")); + } + + if (((String) currentParameterKey).equals("item")) { + + // raise an error + throw new AraraException(localization.getMessage("Error_DirectiveReservedKeyword", directiveName, currentDirective.getLineNumber(), "item", "items")); + } + + + // add the parameter to the configuration + taskConfig.put(currentParameterKey, (String) currentParameters.get(currentParameterKey)); + + } else { + + // if it is a list + if (currentParameters.get(currentParameterKey) instanceof List) { + + // if it is a file reference + if (((String) currentParameterKey).equals("files")) { + + // get the list + for (Object currentListValue : ((List) currentParameters.get(currentParameterKey))) { + + // add the file names + fileNames.add(currentListValue.toString()); + } + } else { + + if (((String) currentParameterKey).equals("items")) { + + // get the list + for (Object currentListValue : ((List) currentParameters.get(currentParameterKey))) { + + // add the file names + items.add(currentListValue.toString()); + } + } else { + + // raise error + throw new AraraException(localization.getMessage("Error_DirectiveListError", directiveName, currentDirective.getLineNumber())); + } + } + } else { + + // raise error + throw new AraraException(localization.getMessage("Error_DirectiveGenericError", directiveName, currentDirective.getLineNumber())); + } + } + } + } + } else { + + // raise error + throw new AraraException(localization.getMessage("Error_DirectiveGenericError", directiveName, currentDirective.getLineNumber())); + } + } + + // set original file name + AraraMethods.setOriginalFile(file.getName()); + + // if there is not a list of filenames + if (fileNames.isEmpty()) { + + // add the only filename available + fileNames.add(file.getName()); + } + + // if there are no items available + if (items.isEmpty()) { + + // simply add an empty entry + items.add(""); + } + + // for every filename + for (String filename : fileNames) { + + // and for every item + for (String item : items) { + + // create a new task + AraraTask araraTask = new AraraTask(); + + // set the name + araraTask.setName(taskName); + + // create a new map based on the current configuration + HashMap currentTaskConfig = new HashMap(taskConfig); + + // add the current file + currentTaskConfig.put("file", filename); + currentTaskConfig.put("item", item); + + // set the parameters + araraTask.setParameters(currentTaskConfig); + + // and add the task to the list + tasks.add(araraTask); + + // the current task is now null + araraTask = null; + } + } + + // clear the list of files and items + fileNames.clear(); + items.clear(); + + } + + // return the list of tasks + return tasks; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java new file mode 100644 index 00000000000..9595479933c --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/LanguageController.java @@ -0,0 +1,159 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * LanguageController: This class holds the language model controller for arara. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.model.AraraLanguage; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Holds the language model controller for arara. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class LanguageController { + + // list of available languages + private List<AraraLanguage> languages; + // the localization singleton instance + final static AraraLocalization localization = AraraLocalization.getInstance(); + + /** + * Constructor. + */ + public LanguageController() { + + // create a new list of languages + languages = new ArrayList<AraraLanguage>(); + + // add the resources + languages.add(new AraraLanguage("English", "en", new Locale("en"))); + languages.add(new AraraLanguage("Brazilian Portuguese", "ptbr", new Locale("pt", "BR"))); + languages.add(new AraraLanguage("Italian", "it", new Locale("it"))); + languages.add(new AraraLanguage("French", "fr", new Locale("fr"))); + languages.add(new AraraLanguage("Spanish", "es", new Locale("es"))); + languages.add(new AraraLanguage("German", "de", new Locale("de"))); + languages.add(new AraraLanguage("Turkish", "tr", new Locale("tr", "TR"))); + languages.add(new AraraLanguage("Russian", "ru", new Locale("ru"))); + + } + + /** + * Sets the current language according to the provided country code. + * + * @param code The country code. + * @return A boolean value indicating if the new language was properly + * applied. + */ + public boolean setLanguage(String code) { + + // get the index of the language + int i = getIndex(code); + + // if it's valid + if (i != -1) { + + // set locale and refresh the resource bundle + Locale.setDefault(languages.get(i).getLocale()); + localization.refresh(); + + // everything went fine + return true; + } + + // the country code is invalid + return false; + } + + /** + * Returns a string containing the list of available languages. + * + * @return A string containing the list of available languages. + */ + public String getLanguagesList() { + + // get the first one in the list + String result = languages.get(0).toString(); + + // iterate through the rest + for (int i = 1; i < languages.size(); i++) { + + // separate them by commas + result = result.concat(", ").concat(languages.get(i).toString()); + } + + // return the string + return result; + } + + /** + * Prints the language help. + */ + public void printLanguageHelp() { + + // print message + System.out.println(AraraUtils.wrap(localization.getMessage("Error_InvalidLanguage").concat("\n\n").concat(getLanguagesList()).concat("\n"))); + } + + /** + * Gets the index for the country code. + * @param code The country code. + * @return An integer representing the index. + */ + private int getIndex(String code) { + + // for every language + for (int i = 0; i < languages.size(); i++) { + + // if the codes are equal + if (languages.get(i).getCode().equalsIgnoreCase(code)) { + + // return the current counter + return i; + } + } + + // nothing was found, return a negative value + return -1; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java new file mode 100644 index 00000000000..bba0fa377ff --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java @@ -0,0 +1,532 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * TaskDeployer: This class is responsible for taking the tasks and turning them + * into rara commands. + */ +// package definition +package com.github.arara.utils; + +// needed imports +import com.github.arara.exception.AraraException; +import com.github.arara.model.AraraCommand; +import com.github.arara.model.AraraRuleArgument; +import com.github.arara.model.AraraRuleConfig; +import com.github.arara.model.AraraTask; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.*; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.SystemUtils; +import org.mvel2.templates.TemplateRuntime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.error.MarkedYAMLException; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Representer; + +/** + * Class responsible for taking the tasks and turning them into Arara commands. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 1.0 + */ +public class TaskDeployer { + + // the logger + final static Logger logger = LoggerFactory.getLogger(TaskDeployer.class); + // the localization class + final static AraraLocalization localization = AraraLocalization.getInstance(); + // the tasks list + private List<AraraTask> tasks; + //the output list with the proper commands + private List<AraraCommand> commands; + // the configuration + private ConfigurationLoader configuration; + + /** + * Constructor. + * + * @param tasks The Arara tasks. + */ + public TaskDeployer(List<AraraTask> tasks, ConfigurationLoader configuration) { + + // set everything + this.tasks = tasks; + + // set the configuration + this.configuration = configuration; + + // create the list + commands = new ArrayList<AraraCommand>(); + + } + + /** + * Deploys the tasks and returns the commands list. + * + * @return The Arara commands list. + * @throws Exception Raised if something bad happened. + */ + public List<AraraCommand> deploy() throws Exception { + + // log message + logger.info("Deploying tasks into commands."); + + // for each task + for (AraraTask currentTask : tasks) { + + // get the index where the rule is located + int pathIndex = findRule(currentTask); + + // if it's not a negative index, that is, the rule was found + if (pathIndex != -1) { + + // deploy plain rule + deployRule(currentTask, pathIndex); + + } else { + + // not found, throw exception + throw new AraraException(localization.getMessage("Error_RuleNotFound", currentTask.getName())); + } + } + + // return the commands + return commands; + + } + + /** + * Finds the rule in the rules directory. + * + * @param task The task to find. + * @return The rule location. + */ + private int findRule(AraraTask task) { + + // get the search path + List<String> paths = configuration.getPaths(); + + // for every entry in the search path + for (int i = 0; i < paths.size(); i++) { + + // if the current task is found in the current path + if (new File(paths.get(i).concat(File.separator).concat(task.getName()).concat(".yaml")).exists()) { + + // add an entry to the logger + logger.trace(localization.getMessage("Log_RuleFound", task.getName(), paths.get(i))); + + // return the index of the current path + return i; + } + } + + // nothing was found, return a negative value + return -1; + + } + + /** + * Deploys plain rule. + * + * @param task The task. + * @throws Exception The rule has a bad definition. + */ + private void deployRule(AraraTask task, int pathIndex) throws Exception { + + // create a representer + Representer representer = new Representer(); + + // add a class tag + representer.addClassTag(AraraRuleConfig.class, new Tag("!config")); + representer.addClassTag(AraraRuleArgument.class, new Tag("!argument")); + + // create a new YAML parser + Yaml yaml = new Yaml(new Constructor(AraraRuleConfig.class), representer); + + FileReader fileReader = null; + + // new file reader + fileReader = new FileReader(configuration.getPaths().get(pathIndex).concat(File.separator).concat(task.getName()).concat(".yaml")); + + // load rule + AraraRuleConfig plainRule = null; + + try { + + // try to load the rule + plainRule = (AraraRuleConfig) yaml.load(fileReader); + + } catch (MarkedYAMLException yamlException) { + + // YAML syntax error, throw exception + throw new AraraException(localization.getMessage("Error_InvalidYAMLRule", task.getName(), configuration.getPaths().get(pathIndex)).concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException))); + } + + try { + + // close reader + fileReader.close(); + + } catch (IOException ioException) { + // do nothing here + } + + // check if the rule is invalid + if (plainRule == null) { + + // raise an error + throw new AraraException(localization.getMessage("Error_InvalidRule", task.getName(), configuration.getPaths().get(pathIndex))); + } + + // verify if the identifier is empty + if (plainRule.getIdentifier() == null) { + + // raise error + throw new AraraException(localization.getMessage("Error_EmptyIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex))); + + } else { + + // check if the rule has a proper name + if (plainRule.getName() == null) { + + // raise error + throw new AraraException(localization.getMessage("Error_EmptyNameRule", task.getName(), configuration.getPaths().get(pathIndex))); + + } else { + + // check if the rule has a proper list of arguments + if (plainRule.getArguments() == null) { + + // raise error + throw new AraraException(localization.getMessage("Error_EmptyArgumentsListRule", task.getName(), configuration.getPaths().get(pathIndex))); + + } + } + } + + // if the rule name doesn't match with the file name + if (!task.getName().equals(plainRule.getIdentifier())) { + + // throw exception + throw new AraraException(localization.getMessage("Error_WrongIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.getIdentifier())); + } + + // check if the rule has any forbidden identifier + if (plainRule.checkForForbiddenIdentifiers() != null) { + + // raise error + throw new AraraException(localization.getMessage("Error_ForbiddenIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.checkForForbiddenIdentifiers())); + } + + // get the list of all arguments available in the rule + List<String> availableArgumentsInRule = plainRule.getIdentifiersList(); + + // add the two reserved keywords + availableArgumentsInRule.add("file"); + availableArgumentsInRule.add("item"); + + // get the parameters for the task + HashMap directiveMap = task.getParameters(); + + // for every entry in the parameters map of the task, add it to the + // list of available parameters in the directive + List<String> availableArgumentsInDirective = new ArrayList<String>(); + for (Object theKey : directiveMap.keySet()) { + availableArgumentsInDirective.add((String) theKey); + } + + // find out which arguments are not defined in the directive and in + // the rule + List<String> argumentsNotDefinedInDirective = (List<String>) CollectionUtils.subtract(availableArgumentsInRule, availableArgumentsInDirective); + List<String> argumentsNotDefinedInRule = (List<String>) CollectionUtils.subtract(availableArgumentsInDirective, availableArgumentsInRule); + + // if there are invalid arguments in the directive + if (!argumentsNotDefinedInRule.isEmpty()) { + + // raise error + throw new AraraException(localization.getMessage("Error_ArgumentsNotDefinedInRule", task.getName(), configuration.getPaths().get(pathIndex), argumentsNotDefinedInRule.toString())); + } + + // for all arguments in the rule not mapped in the directive, set + // their default value to an empty string + for (String currentKey : argumentsNotDefinedInDirective) { + directiveMap.put(currentKey, ""); + } + + // add entries in the arguments map + HashMap argumentMap = new HashMap(); + argumentMap.put("file", directiveMap.get("file")); + argumentMap.put("item", directiveMap.get("item")); + directiveMap.remove("file"); + directiveMap.remove("item"); + argumentMap.put("parameters", directiveMap); + + // helper functions added + argumentMap.put("SystemUtils", SystemUtils.class); + argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class)); + argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class)); + argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class)); + argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class)); + argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class)); + argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class)); + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class)); + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class)); + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class)); + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class)); + argumentMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class)); + argumentMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class)); + argumentMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class)); + argumentMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class)); + argumentMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class)); + argumentMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class)); + argumentMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class)); + argumentMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class)); + argumentMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class)); + argumentMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class)); + argumentMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class)); + + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class)); + argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class)); + argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class)); + + argumentMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile")); + + // create a rule map + HashMap ruleMap = new HashMap(); + + // for every argument in the rule + for (AraraRuleArgument currentArgument : plainRule.getArguments()) { + + // if there's not a default value + if (currentArgument.getDefault() == null) { + + // set the default to an empty string + ruleMap.put(currentArgument.getIdentifier(), ""); + + } else { + + // there's actually a default value + try { + + // get the default value and apply the template + String defaultValue = (String) TemplateRuntime.eval(currentArgument.getDefault(), argumentMap); + + // put the new default value into the rule map + ruleMap.put(currentArgument.getIdentifier(), defaultValue); + + } catch (RuntimeException runtimeException) { + + // an error occurred, throw exception + throw new AraraException(localization.getMessage("Error_DefaultValueRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException))); + + } + } + } + + // after setting the default values into the rule map, let's add + // the directive parameters and both file and item references + ruleMap.put("parameters", directiveMap); + ruleMap.put("file", argumentMap.get("file")); + ruleMap.put("item", argumentMap.get("item")); + + // helper classes + ruleMap.put("SystemUtils", SystemUtils.class); + ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class)); + ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class)); + ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class)); + ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class)); + ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class)); + ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class)); + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class)); + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class)); + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class)); + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class)); + ruleMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class)); + ruleMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class)); + ruleMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class)); + ruleMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class)); + ruleMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class)); + ruleMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class)); + ruleMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class)); + ruleMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class)); + ruleMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class)); + ruleMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class)); + ruleMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class)); + + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class)); + ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class)); + ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class)); + + ruleMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile")); + + // remove references to file and item + availableArgumentsInDirective.remove("file"); + availableArgumentsInDirective.remove("item"); + + // for all arguments in the rule + for (AraraRuleArgument currentArgument : plainRule.getArguments()) { + + // if the current argument is defined in the directive + if (isArgumentDefinedInDirective(availableArgumentsInDirective, currentArgument)) { + + // if there is a valid flag + if (currentArgument.getFlag() != null) { + + try { + + // get the flag and apply template + String defaultFlag = (String) TemplateRuntime.eval(currentArgument.getFlag(), ruleMap); + + // put the new flag reference into the rule map + ruleMap.put(currentArgument.getIdentifier(), defaultFlag); + } catch (RuntimeException runtimeException) { + + // an error occurred, throw exception + throw new AraraException(localization.getMessage("Error_FlagRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException))); + + } + } + } + } + + // create a new list of commands to be executed by the current task + List<String> commandsList = new ArrayList<String>(); + + // if there is a command element in the rule + if (plainRule.getCommand() != null) { + + // and if there isn't a list of commands + if (plainRule.getCommands() == null) { + + // add the current command to the list of commands to + // be executed + commandsList.add(plainRule.getCommand()); + + } else { + + // both are defined, throw an error + throw new AraraException(localization.getMessage("Error_DuplicatedCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex))); + + } + } else { + + // none of the fields is defined + if (plainRule.getCommands() == null) { + + // neither of the elements is defined, throw an error + throw new AraraException(localization.getMessage("Error_MissingCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex))); + + } else { + + // there's a list of commands, add them to the list + commandsList.addAll(plainRule.getCommands()); + } + } + + // for every command to be processed + for (String commandTemplate : commandsList) { + + try { + // get the current command and apply template + commandTemplate = (String) TemplateRuntime.eval(commandTemplate, ruleMap); + + } catch (RuntimeException runtimeException) { + + // an error occurred, throw exception + throw new AraraException(localization.getMessage("Error_CommandRuntimeErrorRule", task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException))); + + } + + // check if it's a valid command + if (!commandTemplate.trim().isEmpty()) { + + // create a new command + AraraCommand araraCommand = new AraraCommand(); + + // add the command + araraCommand.setCommand(commandTemplate); + + // add the name + araraCommand.setName(plainRule.getName()); + + // add to the list + commands.add(araraCommand); + + } + } + } + + /** + * Checks if the current argument is included in the list of arguments from + * the directive. + * + * @param arguments List of arguments from the directive. + * @param argument The current argument to be analyzed. + * @return A logic value indicating if the current argument is included in + * the list of arguments from the directive. + */ + private boolean isArgumentDefinedInDirective(List<String> arguments, AraraRuleArgument argument) { + + // for every argument in the list + for (String current : arguments) { + + // if the identifiers match + if (current.equalsIgnoreCase(argument.getIdentifier())) { + + // found it + return true; + } + } + + // not found + return false; + } +} diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java new file mode 100644 index 00000000000..95aa32e6f30 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TeeOutputStream.java @@ -0,0 +1,155 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * TeeOutputStream: This class implements an output stream that handles other + * streams, so the flow is propagated to all of them in an easy way. + */ +// package definition +package com.github.arara.utils; + +// needed importa +import java.io.IOException; +import java.io.OutputStream; + +/** + * Implements an output stream that handles other streams, so the flow is + * propagated to all of them in an easy way. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 2.0 + */ +public class TeeOutputStream extends OutputStream { + + // the list of the output streams + private final OutputStream[] streams; + + /** + * Constructor. + * + * @param outputStreams An array containing the output streams. + */ + public TeeOutputStream(OutputStream... outputStreams) { + + // set the array + streams = outputStreams; + } + + /** + * Writes the byte to all the output streams. + * + * @param b The byte to write. + * @throws IOException Exception if an error ocurred. + */ + @Override + public void write(int b) throws IOException { + + // for every stream + for (OutputStream ostream : streams) { + + // write the byte + ostream.write(b); + } + } + + /** + * Writes an array of bytes to all the output streams. + * + * @param b The bytes to write. + * @param offset The offset. + * @param length Number of bytes. + * @throws IOException Exception if an error ocurred. + */ + @Override + public void write(byte[] b, int offset, int length) throws IOException { + + // for every stream + for (OutputStream ostream : streams) { + + // write the array + ostream.write(b, offset, length); + } + } + + /** + * Flushes the stream. + * + * @throws IOException Exception if an error ocurred. + */ + @Override + public void flush() throws IOException { + + // for every stream + for (OutputStream ostream : streams) { + + // flush the stream + ostream.flush(); + } + } + + /** + * Closes the stream. + * + * @throws IOException Exception if an error ocurred. + */ + @Override + public void close() throws IOException { + + // for every stream + for (OutputStream ostream : streams) { + + // try to close the stream + forceClose(ostream); + } + } + + /** + * Forces the stream to close without raising exceptions. + * + * @param ostream The stream. + */ + private void forceClose(OutputStream ostream) { + + // try to close + try { + + // close it + ostream.close(); + + } catch (IOException exception) { + // do nothing + } + } +}
\ No newline at end of file diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml new file mode 100644 index 00000000000..22f73680d00 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/conf/logback.xml @@ -0,0 +1,13 @@ +<configuration> + <appender name="FILE" class="ch.qos.logback.core.FileAppender"> + <file>${araraLogName}.log</file> + <append>false</append> + <encoder> + <charset>UTF-8</charset> + <pattern>%date{dd MMM yyyy HH:mm:ss.SSS} %-5level %logger{0} - %msg%n</pattern> + </encoder> + </appender> + <root level="ALL"> + <appender-ref ref="FILE" /> + </root> +</configuration>
\ No newline at end of file diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties new file mode 100644 index 00000000000..dbcde45e7f8 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages.properties @@ -0,0 +1,163 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages: This file holds the default messages for arara. +# +# author: Paulo Roberto Massa Cereda +# e-mail: cereda@users.sf.net + +Log_WelcomeMessage = Welcome to arara! + +Log_ProcessingFile = Processing file ''{0}'', please wait. + +Log_Done = Done. + +Log_ExceptionRaised = Arara raised an exception with the following message: + +Log_ReadyToRunCommands = Ready to run commands. + +Log_CommandName = Running ''{0}''. + +Log_Command = Command: {0} + +Log_CommandSuccess = ''{0}'' was successfully executed. + +Log_CommandFailure = ''{0}'' returned an error status. + +Log_AllCommandsSuccess = All commands were successfully executed. + +Log_OutputLogging = Output logging: + +Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} + +Log_DirectiveFound = Directive found in line {0} with {1}. + +Log_RuleFound = Task ''{0}'' found in ''{1}''. + +Log_NoDirectivesFound = No directives found in ''{0}''. + +Help_Version = print the application version + +Help_Help = print the help message + +Help_Log = generate a log output + +Help_Verbose = print the command output + +Help_Timeout = set the execution timeout (in milliseconds) + +Help_Language = set the application language + +Header_Slogan = The cool TeX automation tool + +Header_AllRightsReserved = All rights reserved. + +Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? + +Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. + +Msg_RunningCommand = Running {0}... + +Msg_Success = SUCCESS + +Msg_Failure = FAILURE + +Msg_Status = Status: + +YamlError_Context = Context: {0} + +YamlError_Problem = Problem: {0} + +YamlError_ErrorLocation = Error found in line {0}, column {1}. + +Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. + +Error_FileDoesNotExist = File ''{0}'' does not exist. + +Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? + +Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: + +Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. + +Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. + +Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. + +Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' + +Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? + +Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: + +Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. + +Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. + +Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. + +Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. + +Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. + +Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. + +Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: + +Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? + +Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: + +Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? + +Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? + +Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? + +Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? + +Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). + +Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? + +Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} + +Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' + +Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' + +Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. + +Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. + +Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties new file mode 100644 index 00000000000..e0183983cf8 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_de.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages_de: Diese Datei beinhalted alle Meldungen f\u00fcr arara in Deutsch. +# +# translator: Marco Daniel +# e-mail: marco.daniel@mada-nada.de + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = Willkommen zu arara! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Bearbeitung der Datei ''{0}'', bitte warten. + +# Log_Done = Done. +Log_Done = Fertig. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Eine Ausnahme mit folgender Nachricht ist durch arara ausgel\u00f6st worden: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Bereit zum Start der Anweisungen. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = Verarbeitung von: ''{0}''. + +# Log_Command = Command: {0} +Log_Command = Anweisung: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' wurde erfolgreich ausgef\u00fchrt. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' gibt einen Fehlerwert zur\u00fcck. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = Alle Anweisungen wurden erfolgreich ausgef\u00fchrt. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Ausgabe des Protokolls: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' wurde nicht im Suchpfad gefunden. Ausf\u00fchrungsversuch: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Anweisung in Zeile {0} mit {1} gefunden. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = Aufgabe ''{0}'' gefunden in ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = Keine Anweisungen in ''{0}'' gefunden. + +# Help_Version = print the application version +Help_Version = Ausgabe der Version. + +# Help_Help = print the help message +Help_Help = Ausgabe der Hilfe. + +# Help_Log = generate a log output +Help_Log = Erstelle eine Protokolldatei (.log-Datei). + +# Help_Verbose = print the command output +Help_Verbose = Zeige das Protokoll der Anweisungen im Terminal an. + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = Deklariere die Zeitbeschr\u00e4nkung je Anweisung (in Millisekunden). + +# Help_Language = set the application language +Help_Language = Lege die Sprache der Anwendung fest. + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = Das coole TeX Automatisierungstool + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = Alle Rechte vorbehalten! + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = Ich habe keine Anweisungen in ''{0}'' gefunden und daher nichts getan. Ist es das, was du wirklich wolltest. + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Ein besonderes Danke geht an Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz und viele andere, die dieses bescheidene Tool erm\u00f6glichten. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = Verarbeite {0}... + +# Msg_Success = SUCCESS +Msg_Success = ERFOLGREICH + +# Msg_Failure = FAILURE +Msg_Failure = FEHLERHAFT + +# Msg_Status = Status: +Msg_Status = Status: + +# YamlError_Context = Context: {0} +YamlError_Context = Kontext: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Problem: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = Fehler in Zeile {0}, Spalte {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = Es tut mir Leid, aber die Datei ''{0} {1}'' existiert nicht. Beachte bitte, dass wenn du nur den Dateinamen (ohne Endung) oder eine unbekannte Dateiendung angegeben hast, arara stets versucht nach unterst\u00fctzten Dateiendungen in der Reihenfolge {1} zu suchen. Du kannst die Reihenfolge bzw. das Suchmuster \u00e4ndern oder sogar neue Dateiendung hinzuf\u00fcgen. Bitte konsolidiere die Dokumentation, um mehr \u00fcber dieses und andere Features zu erfahren. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = Datei ''{0}'' existiert nicht. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = Es tut mir Leid, aber die Anweisung der Aufgabe ''{0}'' konnte nicht gefunden werden. Bist du dir sicher, dass die Anweisung ''{1}'' korrekt oder \u00fcber die Systempfade zug\u00e4nglich ist? + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = Es tut mir Leid, aber deine arara Konfigurationsdatei ist unzul\u00e4ssig. Dies kann aus einem unzul\u00e4ssigen oder fehlenden YAML Eintrag resultieren. + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = Uh-oh, die Konfigurationsdatei scheint unzul\u00e4ssig zu sein. Bist du dir sicher, dass es sich um eine korrekt erstellte YAML-Datei handelt? Leider kann arara nicht fortsetzen, bis eine passende Konfigurationsdatei bereitgestellt wird. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = Housten, wir haben ein Problem. Leider ist die in der Konfigurationsdatei spezifizierte Sprache nicht zul\u00e4ssig. Momentan kann arara die folgenden Sprachen unterst\u00fctzen: {0}. Stelle sicher, dass eine g\u00fcltige Sprache gew\u00e4hlt wird oder entferne den Eintrag aus deiner Konfigurationsdatei (der Sprachschl\u00fcssel ist optional), ansonsten kann arara nicht ausgef\u00fchrt werden. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = Es tut mir Leid, aber es scheint, dass du eine benutzerdefinierte Konfigurationsdatei nutzt, bei der weder die Dateiendung noch das Muster definiert wurde. Beides wird zum Fortfahren ben\u00f6tigt. Bitte behebe diesen Fehler in deiner Konfigurationsdatei und versuche es erneut. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = Es tut mir Leid, aber einer der Eintr\u00e4ge des Suchpfades in deiner Konfigurationsdatei hat eine nicht verf\u00fcgbare Variable im Zusammenhang mit dem Pfad: {0} + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = Es tut mir Leid, aber einer der Eintr\u00e4ge des Suchpfades in deiner Konfigurationsdatei hat eine ung\u00fcltige Verzeichnisstruktur. Kannst du einen Blick drauf werfen? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Es scheint, als g\u00e4be es eine deformierte Anweisung in der Zeile {0}. Die Anweisung kann einen Fehler in der YAML-Syntax aufweisen bzw. einen ung\u00fcltiger Eintrag haben. + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = Die Anweisung {0} in Zeile {1} hat ein leeres geschweiftes Klammerpaar. Beachte bitte, dass arara f\u00fcr eine klare Syntax optimiert ist, wenn kein Parameter \u00fcbergeben wird, sollte auch keine Klammer angegeben werden. Um den Fehler zu beseitigen, reicht es aus, die geschweiften Klammern zu entfernen oder ein Argument f\u00fcr die Anweisung zu \u00fcbergeben. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = Die Anweisung {0} in Zeile {1} hat einen unzul\u00e4ssigen Argumenttypen. Das Argument {2} ist ein reserviertes Schl\u00fcsselwort von arara und verlangt stets eine Liste. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = Die Anweisung {0} in Zeile {1} hat einen unzul\u00e4ssigen Argumentnamen. Der Name {2} ist ein reserviertes Schl\u00fcsselwort von arara und repr\u00e4sentiert jedes Element in der Liste {3}. Bitte w\u00e4hle einen anderen Namen als Argument. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = Die Anweisung ''{0}'' in Zeile ''{1}'' hat einen unzul\u00e4ssigen Argumenttypen. Nur die Argumente ''files'' und ''items'' k\u00f6nnen eine liste haben. Beides sind reservierte Schl\u00fcsselw\u00f6rter von arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = Anscheinend gibt es eine ung\u00fcltige Direktive in der Zeile {0}. Bitte pr\u00fcfe es. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = Die Anweisung ''{0}'' in Zeile ''{1}'' scheint deformiert zu sein. Es kann ein Fehler in der YAML-Syntax oder eine falsche Zuordnung sein. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = Es tut mir Leid, aber die gew\u00e4hlte Sprache ist nicht verf\u00fcgbar. Im Moment werden folgende Sprachen unterst\u00fctzt: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = Uh-oh, Ich konnte die Regel ''{0}'' im Suchpfad nicht finden. Kannst du bitte pr\u00fcfen, ob der Regelname korrekt ist und die Regel durch den Suchpfad gefunden wird. + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = Es scheint, dass die Aufgabe ''{0}'' einen Fehler in der YAML-Syntax hat oder einen ung\u00fcltiges Feld nutzt. Kannst du einen Blick auf die Datei ''{0}.yaml'' im Pfad ''{1}'' werfen. I versuchte mein Bestes, um die Fehlermeldung auszuwerfen, daher hier ist sie: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = Uh-oh, Die Aufgabe ''{0}'' scheint ung\u00fcltig zu sein. Bist du dir sicher, dass die Datei ''{0}.yaml'' im Pfad ''{1}'' eine g\u00fcltige YAML file ist? + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = Ein Problem in der Aufgabe ''{0}'' wurde festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt einen g\u00fcltigen Bezeichner (identifier). Siehst du den Fehler? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = Ein Problem in der Aufgabe ''{0}'' wurde festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt einen g\u00fcltigen Dateinamen. Kannst du es beheben? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat einen ung\u00fcltigen Argumenteinbezeichner. ''{2}'' ist ein reserviertes Schl\u00fcsselwort und kann daher nicht genutzt werden. Kannst du einen anderen nutzen? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = Ein Problem wurde in der Aufgabe ''{0}'' festgestellt. Die Datei ''{0}.yaml'' im Pfad ''{1}'' verlangt eine validierte Liste an Argumenten. Kannst du es beheben? Beachte, dass die Liste der Argumente auch leer sein kann. Es ist aber unbedingt notwendig, dass das Argument explizit angeben wird: ''arguments: []''. + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat einen falschen ''identifier'' - es wurde ''{0}'' anstelle von ''{2}'' erwartet. Kannst du es beheben? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = Oh nein, es gibt Argumente in der Anweisung ''{0}'', welche nicht in der Regel ''{0}.yaml'' im Pfad ''{1}'' definiert wurden. Du kannst sie aus der Anweisung ''{0}'' entfernen oder als Liste von Argumenten in der Regel ''{0}.yaml'' erg\u00e4nzen. Hier sind sie: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = Es tut mir Leid, aber der Defaultwert f\u00fcr das Argument ''{0}'' der Aufgabe ''{1}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat eine ung\u00fcltige Variable/Methode im Regelkontext: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = Es tut mir Leid, aber der Flag f\u00fcr das Argument ''{0}'' der Aufgabe ''{1}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat eine ung\u00fcltige Variable/Methode im Regelkontext: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = Uh-oh, in der Aufgabe ''{0}'' werden beide Felder ''command'' und ''commands'' verwendet (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}''). Du kannst nur eine der Anweisungen ausw\u00e4hlen. Sollte deine Aufgabe von einem einzelnen Kommando abh\u00e4ngen, kannst du ''command'' optimieren. Sollte deine Regel mehrere Anweisungen ben\u00f6tigen, k\u00f6nnte das Feld ''commands'' geeignet sein. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = Uh-oh, die Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') hat weder 'command'' noch 'commands'' Elemente. Du musst nur eine der Anweisungen ausw\u00e4hlen. Sollte deine Aufgabe von einem einzelnen Kommando abh\u00e4ngen, kannst du ''command'' optimieren. Sollte deine Regel mehrere Anweisungen ben\u00f6tigen, k\u00f6nnte das Feld ''commands'' geeignet sein. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = Es tut mir Leid, aber das Kommando, welches in der Aufgabe ''{0}'' (Referenzierung auf Datei ''{0}.yaml'' im Pfad ''{1}'') genutzt wird, hat eine ung\u00fcltige Variable/Methode im Regelsinn: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties new file mode 100644 index 00000000000..f48535fe9ce --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_es.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages: This file holds the default Spanish messages for arara. +# +# author: Gonzalo Medina +# e-mail: gmedinaar@unal.edu.co + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = \u00a1Bienvenido a arara! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Procesando el archivo ''{0}'', por favor espere. + +# Log_Done = Done. +Log_Done = Listo. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Arara gener\u00f3 una excepci\u00f3n con el siguiente mensaje: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Listo para ejecutar comandos. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = Ejecutando ''{0}''. + +# Log_Command = Command: {0} +Log_Command = Comando: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' se ejecut\u00f3 de manera exitosa. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' emiti\u00f3 un estado de error. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = Todos los comandos han sido ejecutados de manera exitosa. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Recuento de la salida: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' no se encontr\u00f3 en la ruta. Tentativa de ejecuci\u00f3n: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Directiva encontrada en la l\u00ednea {0} con {1}. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = Tarea ''{0}'' encontrada en ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = No se encontraron directivas en ''{0}''. + +# Help_Version = print the application version +Help_Version = imprime la versi\u00f3n de la aplicaci\u00f3n + +# Help_Help = print the help message +Help_Help = imprime el mensaje de ayuda + +# Help_Log = generate a log output +Help_Log = genera el registro de la salida + +# Help_Verbose = print the command output +Help_Verbose = imprime la salida del comando + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = configura el 'timeout' de la ejecuci\u00f3n (en milisegundos) + +# Help_Language = set the application language +Help_Language = configura el idioma de la aplicaci\u00f3n + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = The cool TeX automation tool + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = Todos los derechos reservados. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = No encontr\u00e9 directivas en ''{0}'', por lo que no ejecut\u00e9 ninguna acci\u00f3n. \u00bfEra esto lo que realmente deseaba? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Un agradecimiento especial a Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, y a muchos otros por hacer posible esta herramienta. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = Ejecutando {0}... + +# Msg_Success = SUCCESS +Msg_Success = \u00c9XITO + +# Msg_Failure = FAILURE +Msg_Failure = FALLO + +# Msg_Status = Status: +Msg_Status = Estado: + +# YamlError_Context = Context: {0} +YamlError_Context = Contexto: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Problema: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = Error encontrado en la l\u00ednea {0}, columna {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = Lo siento, pero el archivo ''{0} {1}'' no existe. Note que cuando \u00fanicamente se utiliza el nombre base (es decir, el nombre del archivo sin la extensi\u00f3n) o cuando se usa una extansi\u00f3n desconocida, arara intentar\u00e1 buscar los archivos terminados en las extensiones predefinidas {1} en ese orden. El orden y los patrones de b\u00fasqueda se pueden modificar, incluso se puede agregar soporte para nuevas extensiones, utilizando el archivo de configuraci\u00f3n. Por favor consulte el manual de arara para mayor informaci\u00f3n. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = El archivo ''{0}'' no existe. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = \nLo siento, pero el comando para la tarea ''{0}'' no se encontr\u00f3. Aseg\u00farese de que el comando ''{1}'' sea correcto y accesible desde la ruta (''path'') del sistema. + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = Lo siento, pero aparentemente su archivo de configuraci\u00f3n de arara no es v\u00e1lido; es decir, algunas entradas YAML hacen falta o son no v\u00e1lidas. Desafortunadamente, arara no puede seguir adelante hasta que se corrija el error. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente: + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = \u00a10h, oh! El archivo de configuraci\u00f3n parece no ser v\u00e1lido. Aseg\u00farese de que sea un archivo YAML correcto. Desafortunadamente, arara no puede continuar a menos que el archivo de configuraci\u00f3n sea correcto. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = !Houston, tenemos un problema! Lamentablemente, el idioma configurado en el archivo de configuraci\u00f3n no es v\u00e1lido. Actualemente arara soporta los siguientes idiomas: {0}. Aseg\u00farese de escoger un idioma v\u00e1lido o suprima la entrada del archivo de configuraci\u00f3n (el campo es opcional), de lo contrario, arara no podr\u00e1 continuar. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = Lo siento, pero parece que el archivo de configuraci\u00f3n contiene tipos de archivo para los cuales no se ha definido una extensi\u00f3n o un patr\u00f3n. Los dos son necesarios para continuar. Por favor, corrija este error en el archivo de configuraci\u00f3n e intente nuevamente. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = Lo siento, pero una de las entradas de la ruta de b\u00fasqueda en el archivo de configuraci\u00f3n contiene una variable no disponible en este contexto: ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = Lo siento, pero una de las entradas de la ruta de b\u00fasqueda en el archivo de configuraci\u00f3n tiene una estructura jer\u00e1rquica mal formada. \u00bfPodr\u00eda por favor revisar las entradas? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Parece que hay una directiva mal formada en la l\u00ednea {0}; es decir, una directiva con un error de sintaxis YAML o con un campo inv\u00e1lido. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente: + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = La directiva ''{0}'' en la l\u00ednea {1} no tiene contenido entre un par de llaves. Note que arara utiliza una sintaxis m\u00e1s simple cuando una directiva no tiene par\u00e1metros. Para corregir este error, es suficiente remover las llaves o insertar un argumento en la directiva. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = La directiva ''{0}'' en la l\u00ednea {1} tiene un tipo de argumento no v\u00e1lido. El argumento ''{2}'' es una palabra clave reservada de arara que siempre requiere de una lista. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = La directiva ''{0}'' en la l\u00ednea {1} tiene un nombre de argumento no v\u00e1lido. El nombre ''{2}'' es una palabra clave reservada de arara que representa todos los elementos de la lista ''{3}''. Por favor, escoja otro nombre para el argumento. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = La directiva ''{0}'' en la l\u00ednea {1} tiene un tipo de argumento no v\u00e1lido. \u00danicamente los argumentos ''files'' e ''items'' pueden contener una lista; los dos son palabras claves reservadas de arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = Aparentemente, hay una directiva no v\u00e1lida en la l\u00ednea {0}. Por favor rev\u00edsela y haga las correcciones necesarias. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = La directiva ''{0}'' en la l\u00ednea {1} est\u00e1 mal formada. Podr\u00eda tratarse de un error de sintaxis YAML o de una asignaci\u00f3n incorrecta. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = Lo siento, pero el c\u00f3digo de idioma escogido es inv\u00e1lido. Actualmente, arara soporta los siguientes idiomas: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = \u00a1Oh, oh! No se pudo hallar la regla ''{0}'' en la ruta de b\u00fasqueda. Revise que el nombre de la regla sea el corrceto y que la regla sea accesible usando la ruta de b\u00fasqueda. + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = Aparentemente la tarea ''{0}'' contiene un error de sintaxis YAML o un campo incorrecto. Por favor revise el archivo ''{0}.yaml'' localizado en ''{1}''. Hice mi mejor esfuerzo registrando el mensaje de error, que es el siguiente: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = !Oh, oh! Parece que la tarea ''{0}'' es inv\u00e1lida. Aseg\u00farese de que el archivo ''{0}.yaml'' localizado en ''{1}'' sea un archivo YAML correcto. + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita un identificador v\u00e1lido. \u00bfPodr\u00eda, por favor, corregirlo? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita un nombre v\u00e1lido. \u00bfPodr\u00eda, por favor, corregirlo? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = !Oh, oh! La tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') contiene un identificador de argumentos inv\u00e1lido. ''{2}'' es una palabra reservada y no puede ser utilizada. Por favor, utilice otro nombre. + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = Se detect\u00f3 un problema en la tarea ''{0}''. El archivo ''{0}.yaml'' localizado en ''{1}'' necesita una lista valida de argumentos. Por favor, corr\u00edjala. Note que la lista de argumentos puede ser vac\u00eda, pero esto debe declararse expl\u00edcitamente (utilizando ''arguments: []''). + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = \u00a1Oh, oh! La tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') tiene un identificadoe err\u00f3neo - Se esperaba ''{0}'' y no ''{2}''. Por favor, corr\u00edjalo. + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = \u00a1Oh, no! En la directiva ''{0}'' se usan argumentos que no est\u00e1n definidos en la regla ''{0}.yaml'' localizada en ''{1}''. Puede o bien removerlos de la directiva ''{0}'' o bien agregarlos a la lista de argumentos en la regla ''{0}.yaml''. Estos son: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = Lo siento, pero el valor por defecto asignado al argumento ''{0}'' de la tarea ''{1}'' (que hace referencia al archivo ''{1}.yaml'' localizado en ''{2}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = Lo siento, pero la se\u00f1al (''flag'') asignada al argumento ''{0}'' de la tarea ''{1}'' (que hace referencia al archivo ''{1}.yaml'' localizado en ''{2}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = \u00a1Oh, oh! Los dos campos ''command'' y ''commands'' fueron simult\u00e1neamente asignados en la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}''). Es necesario escoger \u00fanicamente uno de los dos. Si la tarea tan solo requiere un \u00fanico comando, puede usar ''command''; si la regla requiere un conjunto de comandos, quiz\u00e1 sea preferible utilizar el campo ''commands''. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = \u00a1Oh, oh! En la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') hace falta o bien ''command'' o bien ''commands''. Es necesario utilizar uno de ellos. Si la tarea tan solo requiere un \u00fanico comando, puede usar ''command''; si la regla requiere de un conjunto de comandos, quiz\u00e1 sea preferible utilizar el campo ''commands''. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = Lo siento, pero el comando asignado a la tarea ''{0}'' (que hace referencia al archivo ''{0}.yaml'' localizado en ''{1}'') contiene una variable o un m\u00e9todo no v\u00e1lido en el contexto de la regla: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties new file mode 100644 index 00000000000..8796caa1817 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_fr.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages_fr: This file holds the French language messages for arara. +# +# translator: Mika\u00ebl Maunier +# e-mail: mmaunier2001@yahoo.fr + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = Arara vous souhaite la bienvenue ! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Traitement du fichier ''{0}'', veuillez patienter. + +# Log_Done = Done. +Log_Done = Termin\u00e9. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Arara a g\u00e9n\u00e9r\u00e9 une erreur avec le message suivant : + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Pr\u00eat \u00e0 executer des commandes. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = Execution de ''{0}''. + +# Log_Command = Command: {0} +Log_Command = Commande : {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' ex\u00e9cut\u00e9 avec succ\u00e8s. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' a renvoy\u00e9 une erreur. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = Toutes les commandes ont \u00e9t\u00e9 correctement ex\u00e9cut\u00e9es. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Journal de sortie: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' non trouv\u00e9(e) dans le PATH. Tentative d''execution : {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Instruction trouv\u00e9e \u00e0 la ligne {0} avec {1}. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = T\u00e2che ''{0}'' trouv\u00e9e dans ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = Aucune instructions trouv\u00e9es dans ''{0}''. + +# Help_Version = print the application version +Help_Version = affiche la version de l'application + +# Help_Help = print the help message +Help_Help = affiche le message d'aide + +# Help_Log = generate a log output +Help_Log = g\u00e9n\u00e8re un journal de sortie + +# Help_Verbose = print the command output +Help_Verbose = affiche la sortie de la commande. + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = d\u00e9finit le temps d'execution (en millisecondes) + +# Help_Language = set the application language +Help_Language = d\u00e9finit la langue de l'application + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = L'outil de traitement TeX vraiment cool + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = Tous droits r\u00e9serv\u00e9s. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = Je n''ai trouv\u00e9 aucunes instructions dans ''{0}'', aussi n''ai-je rien fait. Est-ce r\u00e9ellment ce que vous vouliez ? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Un remerciement sp\u00e9cial pour Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, et de nombreux autres qui ont rendu possible la cr\u00e9ation de cet humble outil. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = Execution de {0}... + +# Msg_Success = SUCCESS +Msg_Success = SUCC\u00c8S + +# Msg_Failure = FAILURE +Msg_Failure = \u00c9CHEC + +# Msg_Status = Status: +Msg_Status = Status : + +# YamlError_Context = Context: {0} +YamlError_Context = Contexte : {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Probl\u00e8me: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = Erreur trouv\u00e9e \u00e0 la ligne {0}, colonne {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = Je suis d\u00e9sol\u00e9 mais le fichier ''{0} {1}'' n''existe pas. Notez qu''en ne fournissant que le nom de base (i.e, le nom sans l''extension) ou bien une extension inconnue, arara essaiera de chercher des fichiers se terminant par les extensions pr\u00e9d\u00e9finies {1} dans cet ordre. Vous pouvez modifier l''ordre, le motif pour la recherche ou m\u00eame ajouter de nouvelles extensions par le biais du fichier de configuration. Merci de vous r\u00e9f\u00e9rer au manuel d'arara pour en apprendre plus sur cette caract\u00e9ristique. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = Le fichier ''{0}'' n''existe pas. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = \nJe suis navr\u00e9, mais la commande en provenance de la t\u00e2che ''{0}'' n''a pas \u00e9t\u00e9 trouv\u00e9e. \u00cates-vous sur(e) que la commande ''{1}'' est correcte et accessible depuis le PATH ? + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = Je suis d\u00e9sol\u00e9, apparemment votre fichier de configuration d'arara est invalide ; il contient des entr\u00e9es YAML invalides ou certaines sont manquantes. Malheureusement, arara ne peut pas continuer tant que l'erreur n'est pas r\u00e9par\u00e9e. J'ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d'erreur, le voici : + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = Oh-oh, le fichier de configuration est invalide. \u00cates-vous sur(e) qu'il s'agit d'un fichier YAML correct ? Malheureusement, arara ne pourra pas continuer tant qu'un fichier de configuration correct ne sera pas disponible. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = Houston, nous avons un probl\u00e8me. C''est triste \u00e0 dire mais le langage d\u00e9finit dans le fichier de configuration est incorrect. Pour l''instant, arara supporte les langages suivants : {0}. Soyez sur(e) de choisir un langage correct ou de retirer l''entr\u00e9e du fichier de configuration (le champ est optionnel), sinon arara ne pourra pas continuer. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = Je suis navr\u00e9 mais il semble que votre fichier de configuration contient des extensions de fichiers personnalis\u00e9es dont ni l'extension ni le motif ne sont d\u00e9finis. Les deux sont requis pour pouvoir continuer. Veuillez r\u00e9gler ce probl\u00e8me dans votre fichier de configuration puis essayer \u00e0 nouveau. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = Je suis d\u00e9sol\u00e9 mais une des entr\u00e9es du chemin de recherche dans votre fichier de configuration contient une variable non disponible dans le contexte du PATH : ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = D\u00e9sol\u00e9. Une des entr\u00e9es du chemin de recherche dans votre fichier de configuration contient une structure de r\u00e9pertoire incorrecte. Pourriez vous y jetez un coup d'oeil ? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Il semble qu''il y ait une intruction mal \u00e9crite \u00e0 la ligne {0}. Il est possible que ce soit une instruction qui contiennent une erreur de syntaxe YAML ou un champ invalide. J''ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d''erreur, le voici : + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = L''instruction ''{0}'' \u00e0 la ligne {1} a des accolades vides. Notez qu''arara opte pour une syntaxe plus \u00e9pur\u00e9e quand une instruction n''a pas de param\u00e8tres. Pour r\u00e9gler le probl\u00e8me, il suffit soit d''enlever les accolades soit de fournir les arguments pour la commande. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = L''instruction ''{0}'' \u00e0 la ligne {1} a un type d''argument incorrect. L''argument ''{2}'' est un mot-cl\u00e9 pour arara et requiert obligatoirement une liste. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = L''instruction ''{0}'' \u00e0 la ligne {1} a un nom d''argument incorrect. Le nom ''{2}'' est un mot-cl\u00e9 pour arara qui repr\u00e9sente tous les \u00e9l\u00e9ments dans la liste ''{3}''. Veuillez choisir un autre nom pour cet argument. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = L''instruction ''{0}'' \u00e0 la ligne {1} a type d''argument incorrect. Seul les arguments ''files'' et ''items'' peuvent avoir une liste. Les deux sont des mots-cl\u00e9s r\u00e9serv\u00e9s pour arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = Apparemment, il y a une commande invalide \u00e0 la ligne {0}. S''il vous pla\u00eet, veuillez y jeter un oeil et r\u00e9gler le probl\u00e8me. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = L''instruction ''{0}'' \u00e0 la ligne {1} semble malform\u00e9e. Cela pourrait \u00eatre une erreur de syntaxe YAML ou un mauvais mapping. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = Je suis d\u00e9sol\u00e9 mais la langue choisie est incorrecte. Pour l'instant, seuls les langages suivants sont support\u00e9s : + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = Oh-oh, Je n''ai pas trouv\u00e9 la r\u00e8gle ''{0}'' dans le chemin de recherche. Pourriez-vous v\u00e9rifier si le nom de la r\u00e8gle est correct et si celle-ci est accessible dans le chemin de recherche ? + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = Il semble que la t\u00e2che ''{0}'' contienne une erreur de syntaxe YAML ou un champ invalide. Pourriez-vous v\u00e9rifier le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}''. J''ai fait de mon mieux pour r\u00e9cup\u00e9rer le message d'erreur, le voici : + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = Oh-oh, la t\u00e2che ''{0}'' semble invalide. \u00cates vous sur(e) que le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' est un fichier YAML valide ? + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert un identifiant valide. Pouvez-vous r\u00e9gler \u00e7a ? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert un nom valide. Pouvez-vous r\u00e9gler \u00e7a ? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = Oh-oh, la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') a un identifiant d''argument invalide. ''{2}'' est un mot-cl\u00e9 r\u00e9serv\u00e9, aussi il ne peut pas \u00eatre utilis\u00e9. Pouvez-vous utiliser un autre nom ? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = Un probl\u00e8me a \u00e9t\u00e9 d\u00e9tect\u00e9 dans la t\u00e2che ''{0}''. Le fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'' requiert une liste d''arguments valide. Pourriez-vous r\u00e9gler cela ? Notez que la liste d''arguments peut aussi \u00eatre vide, mais il sera toujours n\u00e9cessaire de la d\u00e9finir explicitement (avec ''arguments: []''). + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = Oh-oh, la t\u00e2che ''{0}'' (faisant r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') a un mauvais identifiant - ''{0}'' \u00e9tait attendu, au lieu de ''{2}''. Pourriez-vous r\u00e9gler cela ? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = Oh, non ! Il y a des arguments utilis\u00e9s dans l''instruction ''{0}'' qui ne sont pas d\u00e9finis dans la r\u00e8gle ''{0}.yaml'' situ\u00e9 dans ''{1}''. Vous pouvez soit les enlever de la commande ''{0}'' ou les ajouter \u00e0 la liste des arguments de la r\u00e8gle ''{0}.yaml''. Les voil\u00e0 : {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = D\u00e9sol\u00e9, mais la valeur par d\u00e9faut d\u00e9finie pour l''agument ''{0}'' de la r\u00e8gle ''{1}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{2}'') a une variable/m\u00e9thode incorrecte dans le contexte de la r\u00e8gle : ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = Je suis d\u00e9sol\u00e9 mais le drapeau d\u00e9finit par l''argument ''{0}'' de la t\u00e2che ''{1}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{2}'') a une variable/m\u00e9thode incorrecte dans le contexte de la r\u00e8gle : ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = Oh-oh, les 2 champs ''command'' et ''commands'' sont simultan\u00e9ment d\u00e9finis dans la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}''). Vous ne devez en choisir qu''un des deux. Si votre t\u00e2che n''a besoin que d''une seule commande, vous pouvez choisir ''command''; s''il s''agit d''une succession de commandes, peut-\u00eatre que le champ ''commands'' serait plus avis\u00e9. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = Oh-oh, la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') ne contient ni l''\u00e9l\u00e9ment ''command'' ni l''\u00e9l\u00e9ment ''commands''. Vous devez en choisir un des deux. Si votre t\u00e2che n''a besoin que d''une seule commande, vous pouvez choisir ''command''; s''il s''agit d''une succession de commandes, peut-\u00eatre que le champ ''commands'' serait plus avis\u00e9. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = Je suis d\u00e9sol\u00e9, mais la commande d\u00e9finie pour la t\u00e2che ''{0}'' (qui fait r\u00e9f\u00e9rence au fichier ''{0}.yaml'' situ\u00e9 dans ''{1}'') contient une variable/m\u00e9thode non disponible dans le contexte de la r\u00e8gle : ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties new file mode 100644 index 00000000000..e851d9eef11 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_it.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages: This file holds the default Italian language messages for arara. +# +# translator: Enrico Gregorio +# e-mail: Enrico.Gregorio@univr.it + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = arara ti d\u00e0 il benvenuto! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Sto elaborando il file ''{0}'', attendi. + +# Log_Done = Done. +Log_Done = Done. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Arara ha sollevato un'eccezione con il seguente messaggio: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Pronto a eseguire comandi. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = Sto eseguendo ''{0}''. + +# Log_Command = Command: {0} +Log_Command = Comando: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' \u00e8 stato eseguito con successo. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' ha emesso uno stato di errore. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = Tutti i comandi sono stati eseguiti con successo. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Resoconto dell'output: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' non \u00e8 stato trovato nel ''path''. Tentativo di esecuzione: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Direttiva trovata alla riga {0} con {1}. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = Compito ''{0}'' trovato in ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = Non ho trovato direttive in ''{0}''. + +# Help_Version = print the application version +Help_Version = stampa la versione dell'applicazione + +# Help_Help = print the help message +Help_Help = stampa il messaggio di aiuto + +# Help_Log = generate a log output +Help_Log = genera un resoconto dell'output + +# Help_Verbose = print the command output +Help_Verbose = stampa l'output del comando + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = imposta il 'timeout' dell'esecuzione (in millisecondi) + +# Help_Language = set the application language +Help_Language = imposta la lingua dell'applicazione + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = The cool TeX automation tool + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = Tutti i diritti riservati. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = Non ho trovato direttive in ''{0}'', cos\u00ec non ho fatto niente. \u00c8 proprio quello che volevi? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Un ringraziamento speciale va a Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz e molti altri che hanno reso possibile la realizzazione di questo umile strumento. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = Sto eseguendo {0}... + +# Msg_Success = SUCCESS +Msg_Success = SUCCESSO + +# Msg_Failure = FAILURE +Msg_Failure = FALLIMENTO + +# Msg_Status = Status: +Msg_Status = Stato: + +# YamlError_Context = Context: {0} +YamlError_Context = Contesto: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Problema: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = Ho trovato un errore alla riga {0}, colonna {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = Splacente, ma il file ''{0} {1}'' non esiste. Osserva che quando inserisci solo il nome proprio (cio\u00e8 il nome del file senza estensione) o il nome con un''estensione sconosciuta, arara cercher\u00e0 un file che termini con le estensioni predefinite {1} in quest''ordine. \u00c8 possibile modificare l''ordine, lo schema di ricerca e anche abilitare nuove estensioni agendo sul file di configurazione. Consulta il manuale di arara per saperne di pi\u00f9. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = Il file ''{0}'' non esiste. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = \nMi dispiace, ma il comando chiesto dal compito ''{0}'' non \u00e8 stato trovato. Assicurati che il comando ''{1}'' sia corretto e accessibile dal ''path'' di sistema. + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = Mi dispiace, ma sembra che il file di configurazione di arara non sia valido, cio\u00e8 che abbia istruzioni YAML mancanti o scorrette. Sfortunatamente arara non pu\u00f2 andare oltre finch\u00e9 l'errore non viene corretto. Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo: + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = Oh, oh! Il file di configurazione non sembra valido. Assicurati che sia un file YAML corretto. Sfortunatamente arara non pu\u00f2 andare oltre finch\u00e9 non trova un file di configurazione corretto. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = Houston, abbiamo un problema. Spiacente, la lingua impostata nel file di configurazione non \u00e8 valida. Attualmente arara comprende le seguenti lingue: {0}. Assicurati di scegliere una lingua della lista o togli quella sbagliata dal file di configurazione (la lingua \u00e8 facoltativa), altrimenti arara non pu\u00f2 andare oltre. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = Spiacente, ma sembra che il file di configurazione abbia tipi di file personalizzati senza che siano stati definiti un'estensione o uno schema: entrambi sono richiesti per poter continuare. Per favore, correggi l'errore nel file di configurazione e riprova. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = Spiacente, ma uno degli elementi nel percorso di ricerca indicato nel file di configurazione usa una variabile non disponibile in questo contesto: ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = Spiacente, ma uno degli elementi nel percorso di ricerca indicato nel file di configurazione ha una struttura gerarchica malformata. Puoi darci un'occhiata? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Sembra che ci sia una direttiva malformata alla riga {0}, cio\u00e8 una direttiva con un errore di sintassi YAML oppure un campo non valido. Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo: + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = La direttiva ''{0}'' alla riga {1} non ha nulla tra le graffe. Osserva che arara preferisce una sintassi pi\u00f9 snella quando una direttiva non ha parametri. Per correggere, \u00e8 sufficiente togliere le graffe o inserire un argomento per la direttiva. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = La direttiva ''{0}'' alla riga {1} ha un argomento di tipo non valido. L''argomento ''{2}'' \u00e8 una parola chiave riservata di arara che richiede sempre una lista. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = La direttiva ''{0}'' alla riga {1} ha un nome di argomento non valido. Il nome ''{2}'' \u00e8 una parola chiave riservata di arara che rappresenta tutti gli elementi della lista ''{3}''. Per favore, scegli un nome diverso per quell''argomento. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = La direttiva ''{0}'' alla riga {1} ha un tipo di argomento non valido. Solo gli argomenti ''files'' e ''items'' possono contenere una lista. Entrambi sono parole chiave riservate di arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = Sembra che ci sia una direttiva non valida alla riga {0}. Dacci un''occhiata e correggi. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = La direttiva ''{0}'' alla riga {1} sembra malformata. Potrebbe essere un errore di sintassi YAML o un''assegnazione sbagliata. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = Spiacente, ma questo codice di lingua non \u00e8 valido. Attualmente arara comprende le seguenti lingue: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = Oh, oh! Non sono riuscito a trovare la regola ''{0}'' nel percorso di ricerca. Puoi controllare che il nome della regola sia giusto e che la regola sia accessibile nel percorso di ricerca? + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = Sembra che il compito ''{0}'' abbia un errore di sintassi YAML o un campo non valido. Puoi dare un''occhiata al file ''{0}.yaml'' che si trova in ''{1}''? Ho fatto del mio meglio registrando il messaggio di errore che \u00e8 questo: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = Oh, oh! Il compito ''{0}'' sembra non valido. Assicurati che il file ''{0}.yaml'' che si trova in ''{1}'' sia un file YAML corretto. + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = C''\u00e8 un problema nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richiede un identificatore valido. Puoi correggerlo? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = C''\u00e8 un problema nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richede un nome valido. Puoi correggerlo? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') ha un identificatore di argomento non valido. ''{2}'' \u00e8 una parola chiave riservata e non pu\u00f2 essere usato. Puoi scegliere un altro nome? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = C''\u00e8 un problame nell''eseguire ''{0}''. Il file ''{0}.yaml'' che si trova in ''{1}'' richiede una lista di argomenti valida. Puoi correggerlo? Nota che la lista di argomenti pu\u00f2 anche essere vuota, ma \u00e8 comunque necessario definirla esplicitamente (con ''arguments: []''). + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') ha un identificatore sbagliato; mi aspettavo ''{0}'' e non ''{2}''. Puoi correggerlo? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = Oh, no! Alcuni argomenti usati nella direttiva ''{0}'' non sono definiti nella regola ''{0}.yaml'' che si trova in ''{1}''. Puoi rimuoverli dalla direttiva ''{0}'' oppure aggiungerli alla lista di argomenti nella regola ''{0}.yaml''. Eccoli: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = Spiacente, ma il valore di default impostato per l''argomento ''{0}'' del compito ''{1}'' (riferito al file ''{1}.yaml'' che si trova in ''{2}'') usa un metodo o una variabile che non \u00e8 disponibile nel contesto della regola: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = Spiacente, ma il segnale (flag) impostato per l''argomento ''{0}'' del compito ''{1}'' (riferito al file ''{1}.yaml'' che si trova in ''{2}'') vuole un metodo o una variabile che non \u00e8 disponibile nel contesto della regola: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = Oh, oh! Entrambi i campi ''command'' e ''commands'' sono impostati per il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}''). Si pu\u00f2 adoperarne solo uno. Se il compito richiede a un solo comando, scegli ''command''; se la regola richiede pi\u00f9 comandi, forse il campo ''commands'' \u00e8 pi\u00f9 adatto. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = Oh, oh! Il compito ''{0}'' (riferito al file ''{0}.yaml'' che si trova in ''{1}'') non ha n\u00e9 il campo ''command'' n\u00e9 ''commands''. Occorre usare uno (solo) di essi. Se il compito richiede un solo comando, scegli ''command''; se la regola richiede pi\u00f9 comandi, forse il campo ''commands'' \u00e8 pi\u00f9 adatto. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = Spiacente, ma il comando impostato per il compito ''{0}'' task (riferito al file ''{0}.yaml'' che si trova in ''{1}'') usa un metodo o una variabile non disponibile nel contesto della regola: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties new file mode 100644 index 00000000000..f41c27490cb --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_pt_BR.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages: This file holds the default Brazilian Portuguese messages for arara. +# +# author: Paulo Roberto Massa Cereda +# e-mail: cereda@users.sf.net + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = Bem-vindo ao arara! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Processando o arquivo ''{0}''; por favor, aguarde. + +# Log_Done = Done. +Log_Done = Conclu\u00eddo. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Arara gerou uma exce\u00e7\u00e3o com a seguinte mensagem: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Pronto para executar comandos. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = Executando ''{0}''. + +# Log_Command = Command: {0} +Log_Command = Comando: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' foi executado com sucesso. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' retornou um status de erro. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = Todos os comandos foram executados com sucesso. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Registro de sa\u00edda: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' n\u00e3o foi encontrado no caminho do sistema. Tentativa de execu\u00e7\u00e3o: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Diretiva encontrada na linha {0} com {1}. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = Tarefa ''{0}'' encontrada em ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = Nenhuma diretiva foi encontrada em ''{0}''. + +# Help_Version = print the application version +Help_Version = imprime a vers\u00e3o da aplica\u00e7\u00e3o + +# Help_Help = print the help message +Help_Help = imprime a mensagem de ajuda + +# Help_Log = generate a log output +Help_Log = gera uma sa\u00edda para registro + +# Help_Verbose = print the command output +Help_Verbose = imprime a sa\u00edda do comando + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = define o timeout de execu\u00e7\u00e3o (em milissegundos) + +# Help_Language = set the application language +Help_Language = define o idioma da aplica\u00e7\u00e3o + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = A ferramenta legal de automa\u00e7\u00e3o TeX + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = Todos os direitos reservados. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = Eu n\u00e3o encontrei nenhuma diretiva em ''{0}'', e ent\u00e3o n\u00e3o fiz absolutamente nada. \u00c9 isso que voc\u00ea realmente queria? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Um agradecimento especial aos amigos Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, e muitos outros por tornar poss\u00edvel esta humilde ferramenta. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = Executando {0}... + +# Msg_Success = SUCCESS +Msg_Success = SUCESSO + +# Msg_Failure = FAILURE +Msg_Failure = FRACASSO + +# Msg_Status = Status: +Msg_Status = Status: + +# YamlError_Context = Context: {0} +YamlError_Context = Contexto: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Problema: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = Erro encontrado na linha {0}, coluna {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = Sinto muito, mas o arquivo ''{0} {1}'' n\u00e3o existe. Observe que se voc\u00ea fornecer apenas o nome base (isto \u00e9, o nome do arquivo sem a extens\u00e3o) ou com uma extens\u00e3o desconhecida, arara tentar\u00e1 encontrar arquivos terminados com as extens\u00f5es predefinidas {1} nesta ordem. Voc\u00ea pode alterar a ordem, o padr\u00e3o de busca ou mesmo adicionar suporte para novas extens\u00f5es atrav\u00e9s do arquivo de configura\u00e7\u00e3o. Por favor, verifique o manual para aprender mais sobre essa funcionalidade. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = O arquivo ''{0}'' n\u00e3o existe. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = \nSinto muito, mas o comando da tarefa ''{0}'' n\u00e3o foi encontrado. Voc\u00ea tem certeza de que ''{1}'' est\u00e1 correto, ou mesmo acess\u00edvel a partir do caminho do sistema? + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = Sinto muito, mas aparentemente o seu arquivo de configura\u00e7\u00e3o arara \u00e9 inv\u00e1lido, isto \u00e9, cont\u00e9m entradas YAML inv\u00e1lidas ou inexistentes. Infelizmente, arara n\u00e3o pode prosseguir at\u00e9 que o erro seja reparado. Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1: + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = Uh-oh, o arquivo de configura\u00e7\u00e3o parece ser inv\u00e1lido. Voc\u00ea tem certeza de que ele \u00e9 um arquivo YAML adequado? Infelizmente, arara n\u00e3o pode prosseguir at\u00e9 que um arquivo de configura\u00e7\u00e3o v\u00e1lido seja fornecido. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = Houston, temos um problema. Infelizmente, o idioma definido no arquivo de configura\u00e7\u00e3o n\u00e3o \u00e9 v\u00e1lido. No momento, arara oferece suporte para os seguintes idiomas: {0}. Certifique-se de ter escolhido um idioma v\u00e1lido, ou remova a entrada do arquivo de configura\u00e7\u00e3o (o campo \u00e9 opcional). Caso contr\u00e1rio arara n\u00e3o poder\u00e1 prosseguir. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = Sinto muito, mas parece que o seu arquivo de configura\u00e7\u00e3o tem tipos de arquivos personalizados sem a extens\u00e3o ou o padr\u00e3o de busca definidos. Ambos s\u00e3o requeridos para que arara prossiga. Por favor, conserte o erro no seu arquivo de configura\u00e7\u00e3o e tente novamente. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = Sinto muito, mas uma das entradas do caminho de busca no seu arquivo de configura\u00e7\u00e3o tem uma vari\u00e1vel n\u00e3o resolvida no contexto do caminho: ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? + Error_PathIOErrorConfigurationFile = Sinto muito, mas uma das entradas do caminho de busca no seu arquivo de configura\u00e7\u00e3o tem uma estrutura de diret\u00f3rio malformada. Voc\u00ea poderia dar uma olhadinha? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Parece que existe uma diretiva malformada encontrada na linha {0}, isto \u00e9, uma diretiva que pode ter um erro na sintaxe YAML ou um campo inv\u00e1lido. Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1: + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = A diretiva ''{0}'' na linha {1} tem chaves vazias. Observe que arara opta por uma sintaxe mais limpa quando uma diretiva n\u00e3o tem par\u00e2metros. Para repar\u00e1-la, \u00e9 suficiente remover as chaves ou fornecer os argumentos para a diretiva. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = A diretiva ''{0}'' na linha {1} tem um tipo de argumento inv\u00e1lido. O argumento ''{2}'' \u00e9 uma palavra reservada arara e sempre requer uma lista. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = A diretiva ''{0}'' na linha {1} tem um nome de argumento inv\u00e1lido. O nome ''{2}'' \u00e9 uma palavra reservada arara representando cada elemento na lista ''{3}''. Por favor, escolha um outro nome para esse argumento. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = A diretiva ''{0}'' na linha {1} tem um tipo de argumento inv\u00e1lido. Apenas os argumentos ''files'' e ''items'' podem conter uma lista. Ambos s\u00e3o palavras reservadas arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = Aparentemente, existe uma diretiva inv\u00e1lida na linha {0}. Por favor, d\u00ea uma olhadinha e conserte a diretiva. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = A diretiva ''{0}'' na linha {1} parece ser malformada. Pode ser um erro na sintaxe YAML ou um mapeamento incorreto. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = Sinto muito, mas o c\u00f3digo de idioma que voc\u00ea escolheu \u00e9 inv\u00e1lido. No momento, os seguintes idiomas s\u00e3o suportados: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = Uh-oh, eu n\u00e3o consegui encontrar a regra ''{0}'' no caminho de busca. Voc\u00ea poderia conferir se o nome da regra est\u00e1 correto e se a regra \u00e9 acess\u00edvel a partir do caminho de busca? + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = Parece que a tarefa ''{0}'' tem um erro na sintaxe YAML ou um campo inv\u00e1lido. Voc\u00ea poderia dar uma olhadinha no arquivo ''{0}.yaml'' localizado em ''{1}''? Fiz o meu melhor para exibir a mensagem de erro; aqui est\u00e1: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = Uh-oh, a tarefa ''{0}'' parece ser inv\u00e1lida. Voc\u00ea tem certeza de que o arquivo ''{0}.yaml'' localizado em ''{1}'' \u00e9 um arquivo YAML apropriado? + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer um identificador v\u00e1lido. Voc\u00ea pode consert\u00e1-lo? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer um nome v\u00e1lido. Voc\u00ea pode consert\u00e1-lo? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem um identificador de argumento inv\u00e1lido. ''{2}'' \u00e9 uma palavra reservada, portanto n\u00e3o pode ser utilizada. Voc\u00ea poderia utilizar outro nome? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = Um problema foi detectado na tarefa ''{0}''. O arquivo ''{0}.yaml'' localizado em ''{1}'' requer uma lista v\u00e1lida de argumentos. Voc\u00ea pode consert\u00e1-lo? Observe que a lista de argumentos tamb\u00e9m pode ser vazia, mas mesmo assim \u00e9 necess\u00e1rio defin\u00ed-la explicitamente (com ''arguments: []''). + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem o identificador incorreto - era esperado ''{0}'', ao inv\u00e9s de ''{2}''. Voc\u00ea pode consert\u00e1-lo? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = Uh-oh, existem argumentos utilizados na diretiva ''{0}'' que n\u00e3o est\u00e3o definidos na regra ''{0}.yaml'' localizada em ''{1}''. Voc\u00ea pode remover esses argumentos inexistentes da diretiva ''{0}'' ou adicion\u00e1-los \u00e0 lista de argumentos na regra ''{0}.yaml''. Aqui est\u00e3o eles: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = Sinto muito, mas o valor padr\u00e3o definido para o argumento ''{0}'' da tarefa ''{1}'' (referenciando o arquivo ''{1}.yaml'' localizado em ''{2}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = Sinto muito, mas a flag definida para o argumento ''{0}'' da tarefa ''{1}'' (referenciando o arquivo ''{1}.yaml'' localizado em ''{2}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = Uh-oh, os campos ''command'' e ''commands'' est\u00e3o definidos ao mesmo tempo na tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}''). Voc\u00ea precisa escolher apenas um deles. Se a sua regra precisa de apenas um comando, voc\u00ea pode optar por ''command''; se a sua regra requer um conjunto de comandos, talvez o campo ''commands'' seja mais adequado. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = Uh-oh, a tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') n\u00e3o possui o elemento ''command'' ou ''commands''. Voc\u00ea precisa escolher um deles. Se a sua regra precisa de apenas um comando, voc\u00ea pode optar por ''command''; se a sua regra requer um conjunto de comandos, talvez o campo ''commands'' seja mais adequado. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = Sinto muito, mas o conjunto de comandos da tarefa ''{0}'' (referenciando o arquivo ''{0}.yaml'' localizado em ''{1}'') tem uma vari\u00e1vel ou m\u00e9todo indispon\u00edvel no contexto da regra: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties new file mode 100644 index 00000000000..0e2278ae4dd --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_ru.properties @@ -0,0 +1,226 @@ +# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages: This file holds the default Russian language messages for arara. +# +# author: Sergey Ulyanov +# e-mail: ulyanov.sergey@gmail.com + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 arara! + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 ''{0}'', \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435. + +# Log_Done = Done. +Log_Done = \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = Arara \u0432\u044b\u0434\u0430\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = \u0413\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 ''{0}''. + +# Log_Command = Command: {0} +Log_Command = \u041a\u043e\u043c\u0430\u043d\u0434\u0430: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' \u0431\u044b\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = \u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = \u0416\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0430: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u043f\u0443\u0442\u0438. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u0441 {1}. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = \u0417\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 ''{1}''. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = \u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0432 ''{0}''. + +# Help_Version = print the application version +Help_Version = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f + +# Help_Help = print the help message +Help_Help = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 + +# Help_Log = generate a log output +Help_Log = \u0432\u0435\u0441\u0442\u0438 \u0436\u0443\u0440\u043d\u0430\u043b \u0432\u044b\u0432\u043e\u0434\u0430 + +# Help_Verbose = print the command output +Help_Verbose = \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434 + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0432 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445) + +# Help_Language = set the application language +Help_Language = \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = \u041a\u0440\u0443\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 TeX + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = \u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0432 ''{0}'', \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = \u041e\u0441\u043e\u0431\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz \u0438 \u043c\u043d\u043e\u0433\u0438\u043c \u0434\u0440\u0443\u0433\u0438\u043c, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u043c\u0443 \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 {0}... + +# Msg_Success = SUCCESS +Msg_Success = \u0423\u0421\u041f\u0415\u0428\u041d\u041e + +# Msg_Failure = FAILURE +Msg_Failure = \u041d\u0415\u0423\u0414\u0410\u0427\u0410 + +# Msg_Status = Status: +Msg_Status = \u0421\u0442\u0430\u0442\u0443\u0441: + +# YamlError_Context = Context: {0} +YamlError_Context = \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043f\u043e\u0437\u0438\u0446\u0438\u0438 {1}. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0444\u0430\u0439\u043b ''{0} {1}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u043c\u044f (\u0442.\u0435., \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f) \u0438\u043b\u0438 \u0438\u043c\u044f \u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c, arara \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 {1} \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0449\u0438\u0440\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443 arara, \u0447\u0442\u043e \u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431 \u044d\u0442\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = \u0424\u0430\u0439\u043b ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = = \n\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438 ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 ''{1}'' \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430 \u0438\u043b\u0438 \u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438? + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0430\u0448 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 arara, \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0435\u0432\u0435\u0440\u0435\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 YAML. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, arara \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430\u200b\u200b. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e: + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = \u041e\u0439-\u043e\u0439, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435\u0432\u0435\u0440\u0435\u043d. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b YAML? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, arara \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = \u0425\u044c\u044e\u0441\u0442\u043e\u043d, \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f\u0437\u044b\u043a, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f arara \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432: {0}. \u0423\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0430 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u043f\u043e\u043b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c), \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 arara \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0438\u0434\u0438\u043c\u043e, \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0437\u0446\u0430. \u0418 \u0442\u043e \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0443\u0442\u0438: ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0443\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0432\u0430\u0448\u0435\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u044d\u0442\u043e? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = \u041f\u043e\u0445\u043e\u0436\u0435, \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 YAML \u0438\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e: + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0441\u0442\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e arara \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0431\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c arara \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418\u043c\u044f ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c arara, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 ''{3}''. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1} \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b ''files'' \u0438 ''items'' \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438. \u041e\u0431\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u043e\u043c\u0438 arara. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = \u0412\u0438\u0434\u0438\u043c\u043e, \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {0} \u043d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0435\u0435. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = \u0414\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 ''{0}'' \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 {1}, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 YAML \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = \u041e\u0439-\u043e\u0439, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 ''{0}'' \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u0435\u0440\u043d\u043e \u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043e \u0438\u043c\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043b\u0438 \u043e\u043d\u043e \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430? + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = \u041f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 YAML \u0438\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}''. \u042f \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0438\u0437\u043e \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0438\u0442\u0430\u043a, \u0432\u043e\u0442 \u043e\u043d\u043e: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = \u041e\u0439-\u043e\u0439, \u043f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u0434\u0430\u0447\u0430 ''{0}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0439. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'', \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c YAML \u0444\u0430\u0439\u043b\u043e\u043c? + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 ''{2}'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 \u0444\u0430\u0439\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}'', \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c? \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u044f\u0432\u043d\u043e (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ''arguments: []''). + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 - ''{0}'' \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u0430 \u043d\u0435 ''{2}''. \u041d\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = \u041e \u043d\u0435\u0442, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 ''{0}'', \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0432 ''{1}''. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b ''{0}'', \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 ''{0}.yaml''. \u0412\u043e\u0442 \u043e\u043d\u0438: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' \u0437\u0430\u0434\u0430\u0447\u0438 ''{1}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{1}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{2}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0444\u043b\u0430\u0433, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 ''{0}'' \u0437\u0430\u0434\u0430\u0447\u0438 ''{1}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{1}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{2}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = \u041e\u0439-\u043e\u0439, \u043e\u0431\u0430 \u043f\u043e\u043b\u044f ''command'' \u0438 ''commands'' \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}''). \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c ''command'', \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u043b\u0435 ''commands'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = \u041e\u0439-\u043e\u0439, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ''command'' \u0438\u043b\u0438 ''commands'' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d. \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c ''command'', \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u043e\u043b\u0435 ''commands'' \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 ''{0}'' (\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b ''{0}.yaml'', \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 ''{1}'') \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e / \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties new file mode 100644 index 00000000000..f7fbb2423ab --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/main/resources/com/github/arara/localization/Messages_tr.properties @@ -0,0 +1,228 @@ +\ufeff# Arara -- the cool TeX automation tool +# Copyright (c) 2012, Paulo Roberto Massa Cereda +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the project's author nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Messages_tr: This file holds the Turkish language messages for arara. +# +# initially translated by: Brent Longborough (Obviously not a fluent Turkish speaker!) +# e-mail: brent@longborough.org +# enjoyed and revised by: \u0130lhan Polat (Brent is just humble, he is wonderful) +# e-mail: i.polat@tudelft.nl + +# Log_WelcomeMessage = Welcome to arara! +Log_WelcomeMessage = arara'ya ho\u015fgeldin + +# Log_ProcessingFile = Processing file ''{0}'', please wait. +Log_ProcessingFile = Dosya ''{0}'' i\u015fleniyor, biraz bekletecegim. + +# Log_Done = Done. +Log_Done = Haz\u0131r. + +# Log_ExceptionRaised = Arara raised an exception with the following message: +Log_ExceptionRaised = arara bir istisna farketti ve \u015f\u00f6yle dedi: + +# Log_ReadyToRunCommands = Ready to run commands. +Log_ReadyToRunCommands = Komutlar icin beklemede. + +# Log_CommandName = Running ''{0}''. +Log_CommandName = ''{0}'' komutu yerine getiriliyor. + +# Log_Command = Command: {0} +Log_Command = Komut: {0} + +# Log_CommandSuccess = ''{0}'' was successfully executed. +Log_CommandSuccess = ''{0}'' ba\u015far\u0131yla yerine getirildi. + +# Log_CommandFailure = ''{0}'' returned an error status. +Log_CommandFailure = ''{0}'' hata durumu bildirdi. + +# Log_AllCommandsSuccess = All commands were successfully executed. +Log_AllCommandsSuccess = T\u00fcm komutlar ba\u015far\u0131yla yerine getirildi. + +# Log_OutputLogging = Output logging: +Log_OutputLogging = Kay\u0131t \u00c7\u0131kt\u0131s\u0131: + +# Log_CommandNotFound = ''{0}'' was not found in the path. Execution attempt: {1} +Log_CommandNotFound = ''{0}'' komutuna giden uygun bir yol bulunamad\u0131. Deneme: {1} + +# Log_DirectiveFound = Directive found in line {0} with {1}. +Log_DirectiveFound = Sat\u0131r {1} \u00fczerinde {0} y\u00f6nergesi bulundu. + +# Log_RuleFound = Task ''{0}'' found in ''{1}''. +Log_RuleFound = ''{1}'' de/da ''{0}'' g\u00f6revi bulundu. + +# Log_NoDirectivesFound = No directives found in ''{0}''. +Log_NoDirectivesFound = ''{0}'' dosyas\u0131nda hi\u00e7bir y\u00f6nerge bulunamad\u0131. + +# Help_Version = print the application version +Help_Version = uygulama s\u00fcr\u00fcm\u00fcn\u00fc yazd\u0131r\u0131r + +# Help_Help = print the help message +Help_Help = yard\u0131m iletisini yazd\u0131r\u0131r + +# Help_Log = generate a log output +Help_Log = kay\u0131t \u00e7\u0131kt\u0131s\u0131 \u00fcretir + +# Help_Verbose = print the command output +Help_Verbose = komut \u00e7\u0131kt\u0131s\u0131 yazd\u0131r\u0131r + +# Help_Timeout = set the execution timeout (in milliseconds) +Help_Timeout = y\u00fcr\u00fctme zaman a\u015f\u0131m\u0131n\u0131 (milisaniye cinsinden) ayarlar + +# Help_Language = set the application language +Help_Language = uygulama dilini ayarlar + +# Header_Slogan = The cool TeX automation tool +Header_Slogan = \u015eahane TeX otomasyon arac\u0131 + +# Header_AllRightsReserved = All rights reserved. +Header_AllRightsReserved = T\u00fcm haklar\u0131 sakl\u0131d\u0131r. + +# Msg_NoDirectivesFound = I didn''t find any directives in ''{0}'', and so didn''t do anything. Is that what you really wanted? +Msg_NoDirectivesFound = Ben ''{0}'' dosyas\u0131nda hi\u00e7bir y\u00f6nerge bulamad\u0131m, nedenle bir \u015fey yapmad\u0131m. Ger\u00e7ekten istedi\u011fin bu mu? + +# Msg_SpecialThanks = A special thanks goes to Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, and many others for making this humble tool possible. +Msg_SpecialThanks = Alan Munn, Andrew Stacey, Brent Longborough, Clemens Niederberger, David Carlisle, Enrico Gregorio, Francesco Endrici, Gonzalo Medina, Harish Kumar, \u0130lhan Polat, Joseph Wright, Marco Daniel, Mika\u00ebl Maunier, Patrick Gundlach, Rasmus Roulund, Sergey Ulyanov, Stefan Kottwitz, ve di\u011ferlerine bu m\u00fctevazi arac\u0131 m\u00fcmk\u00fcn k\u0131ld\u0131klar\u0131 i\u00e7in \u00e7ok te\u015fekk\u00fcrler. + +# Msg_RunningCommand = Running {0}... +Msg_RunningCommand = {0} yerine getiriliyor... + +# Msg_Success = SUCCESS +Msg_Success = BA\u015eARILI + +# Msg_Failure = FAILURE +Msg_Failure = BA\u015eARISIZ + +# Msg_Status = Status: +Msg_Status = Durum: + +# YamlError_Context = Context: {0} +YamlError_Context = Ba\u011flam: {0} + +# YamlError_Problem = Problem: {0} +YamlError_Problem = Sorun: {0} + +# YamlError_ErrorLocation = Error found in line {0}, column {1}. +YamlError_ErrorLocation = {0}. sat\u0131r, {1}. s\u00fctunda hata bulundu. + +# Error_FileDoesNotExistWithExtensionsList = I''m sorry, but the file ''{0} {1}'' does not exist. Note that when you provide only the basename (i.e, the filename without the extension) or with an unknown extension, arara will try to look for files ending with the predefined extensions {1} in that order. You can override the order, the search pattern or even add support for new extensions through the configuration file. Please refer to the arara manual to learn more about this feature. +Error_FileDoesNotExistWithExtensionsList = \u00dczg\u00fcn\u00fcm ama ''{0} {1}'' diye bir dosya yok. Ancak, uzant\u0131s\u0131 olmayan (veya bilinmeyen bir uzant\u0131s\u0131 olan) dosya ad\u0131n\u0131 girdi\u011finde, arara s\u0131ras\u0131yla {1} uzant\u0131lar\u0131n\u0131 bulmay\u0131 dener. Elbette bu s\u0131ray\u0131 ge\u00e7ersiz k\u0131lmak, de\u011fi\u015ftirmek hatta yeni uzant\u0131lar ekleyebilmek m\u00fcmk\u00fcn. Bu \u00f6zellik hakk\u0131nda daha fazla bilgi edinmek i\u00e7in arara k\u0131lavuzuna bak\u0131n. + +# Error_FileDoesNotExist = File ''{0}'' does not exist. +Error_FileDoesNotExist = ''{0}'' diye bir dosya yok. + +# Error_CommandNotFound = \nI''m sorry, but the command from the ''{0}'' task could not be found. Are you sure the command ''{1}'' is correct, or even accessible from the system path? +Error_CommandNotFound = \n\u00dczg\u00fcn\u00fcm ama ''{0}'' g\u00f6revindeki komutu bulunamad\u0131. ''{1}'' komutunun do\u011fru veya sistem yolu ile eri\u015filebilir oldu\u011fundan emin misin? + +# Error_InvalidYAMLConfigurationFile = I'm sorry, but apparently your arara configuration file is invalid, that is, it has invalid or missing YAML entries. Unfortunately, arara cannot proceed until the error is fixed. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLConfigurationFile = \u00dczg\u00fcn\u00fcm, ama g\u00f6r\u00fcn\u00fc\u015fe g\u00f6re arara yap\u0131land\u0131rma dosyas\u0131 ge\u00e7ersiz, daha do\u011frusu ge\u00e7ersiz veya eksik YAML giri\u015fleri bar\u0131nd\u0131r\u0131yor. Maalesef, arara bu hata giderilene kadar devam edemeyecek. Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m: + +# Error_InvalidConfigurationFile = Uh-oh, the configuration file appears to be invalid. Are you sure it's a proper YAML file? Unfortunately, arara cannot proceed until a proper configuration file is provided. +Error_InvalidConfigurationFile = T\u00fch, yap\u0131land\u0131rma dosyas\u0131 ge\u00e7ersiz g\u00f6r\u00fcn\u00fcyor. Uygun bir YAML dosyas\u0131 oldu\u011fundan emin misin? Uygun bir yap\u0131land\u0131rma dosyas\u0131 girilene kadar maalesef arara devam edemeyecek. + +# Error_InvalidLanguageConfigurationFile = Houston, we have a problem. Sadly, the language set in the configuration file is not valid. Currently, arara can provide support for the following languages: {0}. Make sure to choose a valid language or remove the entry from the configuration file (the field is optional), otherwise arara cannot proceed. +Error_InvalidLanguageConfigurationFile = Houston, bir sorun var. Ne yaz\u0131k ki, yap\u0131land\u0131rma dosyas\u0131nda ayarlanan dil ge\u00e7erli de\u011fil. \u015eu anda, arara \u015fu dilleri destekliyor: {0}. Anlayabildi\u011fim bir dil se\u00e7in ya da yap\u0131land\u0131rma dosyas\u0131ndan bu (iste\u011fe ba\u011fl\u0131) giri\u015fi kald\u0131r\u0131n, aksi takdirde arara devam edemeyecek. + +# Error_InvalidFiletypesConfigurationFile = I'm sorry, but it seems your configuration file has customized filetypes with neither the extension or pattern defined. Both are required in order to continue. Please fix this error in your configuration file and try again. +Error_InvalidFiletypesConfigurationFile = \u00dczg\u00fcn\u00fcm ama g\u00f6r\u00fcn\u00fc\u015fe g\u00f6re yap\u0131land\u0131rma dosyas\u0131nda ne desen tan\u0131m\u0131 olan ne de uzant\u0131s\u0131 bilinen \u00f6zelle\u015ftirilmi\u015f dosya tipleri var. Her iki bilgininde sa\u011flanm\u0131\u015f olmas\u0131 devam edebilmek i\u00e7in gerekli. Yap\u0131land\u0131rma dosyas\u0131ndaki bu hatay\u0131 d\u00fczeltin, ve tekrar deneyin. + +# Error_PathRuntimeErrorConfigurationFile = I''m sorry, but one of the entries of the search path in your configuration file has an unavailable variable in the path context: ''{0}'' +Error_PathRuntimeErrorConfigurationFile = \u00dczg\u00fcn\u00fcm ama yap\u0131land\u0131rma dosyas\u0131nda arama yolu girdilerinden birinde kullan\u0131lamayacak bir de\u011fi\u015fken var: ''{0}'' + +# Error_PathIOErrorConfigurationFile = I'm sorry, but one of the entries of the search path in your configuration file has a malformed directory structure. Could you take a look at it? +Error_PathIOErrorConfigurationFile = \u00dczg\u00fcn\u00fcm ama yap\u0131land\u0131rma dosyas\u0131nda arama yoluna girdilerinden birini hatal\u0131 bi\u00e7imlendirilmi\u015f bir dizin yap\u0131s\u0131 vard\u0131r. Benim i\u00e7in bir bakabilir misin? + +# Error_InvalidYAMLDirective = It appears there is a malformed directive found at line {0}, that is, a directive that might have a YAML syntax error or an invalid field. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLDirective = Sat\u0131r {0} \u00fczerinde bozuk, yani, YAML s\u00f6zdizimi hatas\u0131 veya ge\u00e7ersiz bir alan\u0131 olabilecek bir y\u00f6nerge var gibi duruyor. Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m: + +# Error_DirectiveEmptyCurlyBrackets = Directive ''{0}'' at line {1} has empty curly brackets. Note that arara opts for a cleaner syntax when a directive has no parameters. To fix it, it''s enough to either remove the curly brackets or provide the arguments for the directive. +Error_DirectiveEmptyCurlyBrackets = Sat\u0131r {1} \u00fczerindeki ''{0}'' y\u00f6nergesinde bo\u015f k\u00fcme parantezleri buldum. arara y\u00f6nergenin arg\u00fcmanlar\u0131 yoksa sade bir s\u00f6zdizimi yap\u0131s\u0131n\u0131 tercih eder. Bunu d\u00fczeltmek i\u00e7in, bo\u015f k\u00fcme parantezlerini kald\u0131rmak veya y\u00f6nerge i\u00e7in arg\u00fcmanlar sunmak yeterli. + +# Error_DirectiveInvalidArgumentList = Directive ''{0}'' at line {1} has an invalid argument type. The argument ''{2}'' is a reserved arara keyword and always requires a list. +Error_DirectiveInvalidArgumentList = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. ''{2}'' arg\u00fcman\u0131 arara''ya \u00f6zeldir her zaman bir liste gerektirir. + +# Error_DirectiveReservedKeyword = Directive ''{0}'' at line {1} has an invalid argument name. The name ''{2}'' is a reserved arara keyword representing every element in the ''{3}'' list. Please, pick another name for that argument. +Error_DirectiveReservedKeyword = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. ''{2}'' kelimesi arara''ya ait ''{3}'' listesinde her elementi temsil eden \u00f6zel bir kelimedir. L\u00fctfen, ba\u015fka bir kelime se\u00e7in. + +# Error_DirectiveListError = Directive ''{0}'' at line {1} has an invalid argument type. Only the arguments ''files'' and ''items'' can have a list. Both are reserved arara keywords. +Error_DirectiveListError = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi i\u00e7in ge\u00e7ersiz bir arg\u00fcman t\u00fcr\u00fc var. Sadece ''file'' ve ''items'' arg\u00fcmanlar\u0131 bir liste olabilir. Her ikisi de arara''ya ait \u00f6zel kelimelerdir. + +# Error_InvalidDirective = Apparently, there''s an invalid directive at line {0}. Please take a look and fix it. +Error_InvalidDirective = G\u00f6r\u00fcn\u00fc\u015fe g\u00f6re, {0}. sat\u0131rda ge\u00e7ersiz bir y\u00f6nerge var. Bir g\u00f6z at\u0131p d\u00fczeltin l\u00fctfen. + +# Error_DirectiveGenericError = Directive ''{0}'' at line {1} seems to be malformed. It might be a YAML syntax error or a wrong mapping. +Error_DirectiveGenericError = Sat\u0131r {1} \u00fczerinde ''{0}'' y\u00f6nergesi bozuk gibi. YAML s\u00f6zdizimi hatas\u0131 ya da yanl\u0131\u015f bir e\u015fleme olabilir. + +# Error_InvalidLanguage = I'm sorry, but the language code you chose is invalid. Currently, the following languages are supported: +Error_InvalidLanguage = \u00dczg\u00fcn\u00fcm, ama se\u00e7ti\u011fin dil kodu ge\u00e7ersiz. \u015eimdilik a\u015fa\u011f\u0131daki dilleri konu\u015fabiliyorum: + +# Error_RuleNotFound = Uh-oh, I could not find the ''{0}'' rule in the search path. Could you take a look if the rule name is correct and if the rule is accessible through the search path? +Error_RuleNotFound = T\u00fch, arama yolunda ''{0}'' kural\u0131n\u0131 bulamad\u0131m. Kural arama yolu \u00fczerinden eri\u015filebilir ise kural ad\u0131n\u0131n do\u011fru oldu\u011funa bakar m\u0131s\u0131n? + +# Error_InvalidYAMLRule = It appears that the ''{0}'' task has a YAML syntax error or an invalid field. Could you take a look at the ''{0}.yaml'' file located at ''{1}''. I tried my best to dump the error message, so here it is: +Error_InvalidYAMLRule = ''{0}'' g\u00f6revi bir YAML s\u00f6zdizimi hatas\u0131 veya ge\u00e7ersiz bir alan i\u00e7eriyor gibi g\u00f6r\u00fcn\u00fcyor. ''{1}'' rdeki ''{0}.yaml'' dosyas\u0131na bir bakar m\u0131s\u0131n? Elimden geldi\u011fince, \u015f\u00f6yle bir hata d\u00f6k\u00fcm\u00fc \u00e7\u0131kartt\u0131m: + +# Error_InvalidRule = Uh-oh, the ''{0}'' task appears to be invalid. Are you sure the ''{0}.yaml'' file located at ''{1}'' is a proper YAML file? +Error_InvalidRule = T\u00fch, ''{0}'' g\u00f6revi ge\u00e7ersiz g\u00f6r\u00fcn\u00fcyor. ''{1}'' de bulunan ''{0}.yaml'' uygun bir YAML dosyas\u0131 oldu\u011fundan emin misin? + +# Error_EmptyIdentifierRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid identifier. Could you fix it? +Error_EmptyIdentifierRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' deki ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir tan\u0131mlay\u0131c\u0131 gerek. D\u00fczeltebilir misin? + +# Error_EmptyNameRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid name. Could you fix it? +Error_EmptyNameRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' yer ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir isim gerek. D\u00fczeltebilir misin? + +# Error_ForbiddenIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an invalid argument identifier. ''{2}'' is a reserved keyword, so it cannot be used. Could you use another name? +Error_ForbiddenIdentifierRule = T\u00fch, ''{0}'' g\u00f6revi (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) ge\u00e7ersiz bir arg\u00fcman tan\u0131mlay\u0131c\u0131s\u0131 i\u00e7eriyor. ''{2}'' \u00f6zel bir kelime, bu nedenle kullan\u0131lamaz. Ba\u015fka bir isim kullanabilir misin? + +# Error_EmptyArgumentsListRule = A problem was detected in the ''{0}'' task. The ''{0}.yaml'' file located at ''{1}'' requires a valid list of arguments. Could you fix it? Note that the list of arguments can also be empty, but it is still necessary to define it explicitly (with ''arguments: []''). +Error_EmptyArgumentsListRule = ''{0}'' g\u00f6revinde bir sorun var. ''{1}'' deki ''{0}.yaml'' dosyas\u0131 i\u00e7in ge\u00e7erli bir arg\u00fcman listesi gerek. Bunu d\u00fczeltebilir misin? Bu arada, arg\u00fcmanlar listesi bo\u015f dahi olabilir, ama yine de ''arguments: []'' ile belirtmek gerekiyor. + +# Error_WrongIdentifierRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has the wrong identifier - ''{0}'' was expected, rather than ''{2}''. Could you fix it? +Error_WrongIdentifierRule = T\u00fch, ''{0}'' g\u00f6revi (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) yanl\u0131\u015f bir tan\u0131mlay\u0131c\u0131s\u0131 i\u00e7eriyor - ''{0}}'' yerine ''{2}'' bekliyordum. Bunu d\u00fczeltebilir misin? + +# Error_ArgumentsNotDefinedInRule = Oh no, there are arguments used in the diretive ''{0}'' which are not defined in the ''{0}.yaml'' rule located at ''{1}''. You can either remove them from the ''{0}'' directive or add them to the list of arguments in the ''{0}.yaml'' rule. Here they are: {2} +Error_ArgumentsNotDefinedInRule = ''{0}'' y\u00f6nergesinde, ''{1}'' deki ''{0}.yaml'' kural\u0131 taraf\u0131ndan tan\u0131mlanmam\u0131\u015f arg\u00fcmanlar\u0131 kullan\u0131yor. Bunlar\u0131 ya ''{0}'' y\u00f6nergesinden kald\u0131rabilirsin ya da ''{0}.yaml'' kural\u0131 arg\u00fcman listesine ekleyebilirsin. Bahsetti\u011fim arg\u00fcmanlar \u015funlar: {2} + +# Error_DefaultValueRuntimeErrorRule = I''m sorry, but the default value set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_DefaultValueRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{1}'' g\u00f6revinin ''{0}'' arg\u00fcman\u0131n\u0131n varsay\u0131lan de\u011feri (''{2}'' deki ''{1}.yaml'' dosyas\u0131na atfen) kullan\u0131lamayan bir de\u011fi\u015fken/y\u00f6ntem i\u00e7eriyor: ''{3}'' + +# Error_FlagRuntimeErrorRule = I''m sorry, but the flag set for the argument ''{0}'' of the ''{1}'' task (referencing the ''{1}.yaml'' file located at ''{2}'') has an unavailable variable/method in the rule context: ''{3}'' +Error_FlagRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{1}'' g\u00f6revinin ''{0}'' arg\u00fcman imlecinde (''{2}'' deki ''{1}.yaml'' dosyas\u0131na atfen) bu kural i\u00e7in kullan\u0131lamayan bir de\u011fi\u015fken/y\u00f6ntem var: ''{3}'' + +# Error_DuplicatedCommandElementsRule = Uh-oh, both ''command'' and ''commands'' fields are set in the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}''). You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_DuplicatedCommandElementsRule = T\u00fch, her iki ''command'' ve ''commands'' alan\u0131 da ''{0}'' g\u00f6revinde (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) kullan\u0131lmaya ayarlanm\u0131\u015f. Sadece birinin se\u00e7ilmi\u015f olmas\u0131 gerekiyor. E\u011fer i\u015flenecek g\u00f6rev sadece bir komut i\u00e7eriyorsa, ''command'' kullanabilirsin; birden fazla komut kullan\u0131m\u0131 i\u00e7in ''commands'' daha uygun olacakt\u0131r. + +# Error_MissingCommandElementsRule = Uh-oh, the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') does not have either the ''command'' or ''commands'' elements. You need to pick only one of them. If your task only relies on a single command, you can opt for ''command''; if your rule requires a set of commands, maybe the ''commands'' field is more suitable. +Error_MissingCommandElementsRule = her iki ''command'' ve ''commands'' alan\u0131 da ''{0}'' g\u00f6revinde (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) kullan\u0131lmaya ayarlanm\u0131\u015f. \u0130kisinden birinin kullan\u0131l\u0131yor olmas\u0131 gerekiyor. E\u011fer i\u015flenecek g\u00f6rev sadece bir komut i\u00e7eriyorsa, ''command'' kullanabilirsin; birden fazla komut kullan\u0131m\u0131 i\u00e7in ''commands'' daha uygun olacakt\u0131r. + +# Error_CommandRuntimeErrorRule = I''m sorry, but the command set for the ''{0}'' task (referencing the ''{0}.yaml'' file located at ''{1}'') has an unavailable variable/method in the rule context: ''{2}'' +Error_CommandRuntimeErrorRule = \u00dczg\u00fcn\u00fcm ama ''{0}'' g\u00f6revi i\u00e7in belirlenmi\u015f komut (''{1}'' deki ''{0}.yaml'' dosyas\u0131na atfen) bu kural i\u00e7in kullan\u0131lamayacak bir de\u011fi\u015fken/y\u00f6ntem i\u00e7eriyor: ''{2}'' + diff --git a/Master/texmf-dist/source/support/arara/src/test/java/com/github/arara/AraraTest.java b/Master/texmf-dist/source/support/arara/src/test/java/com/github/arara/AraraTest.java new file mode 100644 index 00000000000..4e779f9c247 --- /dev/null +++ b/Master/texmf-dist/source/support/arara/src/test/java/com/github/arara/AraraTest.java @@ -0,0 +1,87 @@ +/** + * \cond LICENSE + * Arara -- the cool TeX automation tool + * Copyright (c) 2012, Paulo Roberto Massa Cereda + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the project's author nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * \endcond + * + * AraraTest: This class checks if the localization files are in place in order + * to Maven correctly build the application. + */ +// package definition +package com.github.arara; + +// needed imports +import java.net.URL; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Checks if the localization files are in place in order to Maven correctly + * build the application. + * + * @author Paulo Roberto Massa Cereda + * @version 3.0 + * @since 3.0 + */ +public class AraraTest extends TestCase { + + /** + * Create the test case. + * + * @param testName The name of the test case. + */ + public AraraTest(String testName) { + super(testName); + } + + /** + * @return The suite of tests being tested. + */ + public static Test suite() { + return new TestSuite(AraraTest.class); + } + + /** + * Checks if the localization resource exists. + */ + public void testLocalizationFile() { + URL url = Arara.class.getResource("/com/github/arara/localization/Messages.properties"); + if (url == null) { + fail("arara requires at least the default localization file Messages.properties " + + "located at the translations/ directory in the project repository. Rename " + + "Messages.input to Messages.properties and copy the new file to the src/ " + + "directory, under com/github/arara/localization, and build arara again."); + + } + } +} diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 4435d481edb..3fc1f2a984e 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -2279,6 +2279,7 @@ $standardxmt='\.xmt'; 'a2ping' => '\.pl$', 'accfonts' => 'mkt1font|vpl2', 'adhocfilelist' => 'adhocfilelist\.sh$', + 'arara' => 'arara\.sh$', 'authorindex' => 'authorindex$', 'bibexport' => 'bibexport\.sh$', 'bundledoc' => '(arlatex|bundledoc)$', diff --git a/Master/tlpkg/tlpsrc/arara.tlpsrc b/Master/tlpkg/tlpsrc/arara.tlpsrc new file mode 100644 index 00000000000..dca338c719c --- /dev/null +++ b/Master/tlpkg/tlpsrc/arara.tlpsrc @@ -0,0 +1 @@ +binpattern f bin/${ARCH}/${PKGNAME} diff --git a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc index df0f2503de6..1aafe60e5c0 100644 --- a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc @@ -7,7 +7,7 @@ depend collection-basic depend a2ping depend adhocfilelist -#depend arara +depend arara depend asymptote depend bibtex8 depend bibtexu |