(Entschuldigen Sie, falls ich die Terminologie falsch verwende.)
Ich möchte eine Direktive für arara schreiben, die ein Argument annehmen kann. Die Direktive soll den Namen der Ausgabedatei nach den folgenden Regeln festlegen:
- Wenn kein Argument angegeben ist, verwenden Sie einen Standardwert.
- Wenn das Argument angegeben ist, aber keinen Wert hat, verwenden Sie die
file
Variable. - Wenn ein Argument angegeben ist, verwenden Sie dieses.
Ich dachte, der richtige Weg hierfür wäre:
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
aber ich bekomme: ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.
wenn ich kein tatsächliches Argument übergebe.
Hier ist ein MWE:
!config
# test rule for arara
# author: Andrew Stacey
identifier: echo
name: Echo the value of the argument
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
Dann versuche ich in meinem Testdokument eines der folgenden:
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: }
% arara: echo: {name: ''}
Die ersten beiden funktionieren, die zweiten beiden nicht.
Ist das möglich?
Antwort1
Mit der neuen 3.x
Reihe können wir der Argumenterweiterung einfach einen Standardwert hinzufügen.
Hier ist die neue echo
Regel:
!config
# test rule for arara
# author: Andrew Stacey
# requires arara 3.0+
identifier: echo
name: Echo the value of the argument
command: <arara> echo @{name}
arguments:
- identifier: name
flag: <arara> @{ isTrue( isEmpty( parameters.name ), file, parameters.name ) }
default: <arara> @{file}
Neue Konzepte:
value
wurde durch eine Map mit dem Namen ersetzt . Wenn wir beispielsweise auf das Direktiveargumentparameters
zugreifen möchten , rufen wir einfach auf , anstatt den Wert im Kontext des Regelarguments anzunehmen.one
parameters.one
value
<arara>
wird am Anfang der Werte verwendet, um ein paar Anführungszeichen zu sparen. Der Erweiterungsmechanismus kann dieses Schlüsselwort erkennen und sicher entfernen. Sie können weiterhin Anführungszeichen verwenden, es gibt kein Problem.- Jetzt kann ein Regelargument einen
default
Wert haben, der bei der Verarbeitung des Arguments als erstes ausgewertet wird. Wenn kein Wertdefault
angegeben ist, setzt der Mechanismus den Wert auf''
(leere Zeichenfolge). - Wir verfügen nun über mehrere integrierte Funktionen im Regelkontext, die uns beim Schreiben prägnanteren Codes helfen können:
string isTrue(boolean b, string s1, string s2)
: Gibt zurück,s1
wennb
isttrue
, oders2
andernfalls.boolean isEmpty(string s)
: prüft, obs
leer ist und gibt einenboolean
Wert zurück:true
wenns
leer,false
andernfalls.
Es ist wichtig zu beachten, dass @{file}
jetzt der Dateiname anstelle des Basisnamens angezeigt wird. Wenn wir dennoch den Basisnamen abrufen möchten, gibt es dafür auch eine integrierte Funktion: string getBasename(string s)
, @{ getBasename( file ) }
die dies tut.
Sehen wir uns nun die Ausführung an:
Erste Regel: Wenn kein Argument angegeben ist, verwenden Sie einen Standardwert.
% arara: echo
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Zweite Regel: Wenn das Argument angegeben ist, aber keinen Wert hat, verwenden Sie die file
Variable.
% arara: echo: { name: '' }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Dritte Regel: Wenn ein Argument angegeben ist, verwenden Sie es.
% arara: echo: { name: duck }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
duck
Status: SUCCESS
Der Kommentar in der ursprünglichen Antwort gilt % arara: echo: { name: }
weiterhin. Da name
kein Argumentwert vorhanden ist, schlägt der Extraktor fehl.
Ursprüngliche Antwort aus historischen Gründen hinterlassen. Sie gilt fürarara 2.x
Wie konnte ich das verpassen?araraEtikett?:)
Leider ist Ihnen ein Ärgernis aufgefallen, das während meiner Testsuites zur Veröffentlichung der 2.x
Serie unbemerkt blieb: Die einzige Variable, die im arguments
Kontext erweitert werden kann, ist die value
selbst. Daher file
funktioniert sie – und alle anderen Variablen – leider nicht und arara
führt zu einem Fehler. Hoffentlich wird dieses Problem in der nächsten Version behoben.
Außerdem plane ich für die nächste Version einen Standard-Fallback für Argumente, sodass wir keine Bedingungen schreiben müssen, um zu prüfen, ob der Wert festgelegt ist. Aber das ist eine andere Geschichte, hoffentlich für die neue 3.x
Serie.:)
Die einzige Möglichkeit, die Regel zum Funktionieren zu bringen, besteht derzeit echo
darin, die Variablen im command
Kontext zu überprüfen:
command: 'echo @{ name == "" ? file : name }'
arguments:
- identifier: name
flag: '@{value}'
In der neuen Version können wir Folgendes schreiben:
command: 'echo @{name}'
arguments:
- identifier: name
flag: '@{value}'
default: '@{file}'
Die Richtlinien
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: something}
% arara: echo: {name: ''}
sollte funktionieren (der letztehatzu arbeiten, es sei denn, Sie haben ein anderes Ärgernis gefunden). :)
Nun,
% arara: echo: {name: }
hat keinen Argumentwert, deshalb schlägt der Extraktor fehl.