(Disculpas si tengo la terminología incorrecta).
Quiero escribir una directiva para arara que pueda aceptar un argumento. La directiva debe establecer el nombre del archivo de salida de acuerdo con las siguientes reglas:
- Si no se proporciona ningún argumento, utilice un valor predeterminado.
- Si se da el argumento pero no tiene valor, use la
file
variable. - Si se da un argumento, utilícelo.
Pensé que la forma correcta de hacer esto sería:
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
pero entiendo: ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.
si no paso un argumento real.
Aquí hay un 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 }'
Luego, en mi documento de prueba, pruebo uno de:
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: }
% arara: echo: {name: ''}
Los dos primeros funcionan, los dos segundos no.
es posible?
Respuesta1
Con la nueva 3.x
serie, podemos agregar fácilmente un valor predeterminado a la expansión del argumento.
Aquí está la nueva echo
regla:
!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}
Nuevos conceptos:
value
fue reemplazado por un mapa llamadoparameters
. Si queremos acceder, digamos, alone
argumento directivo, simplemente llamamosparameters.one
en lugar devalue
asumir el valor en el contexto del argumento de la regla.<arara>
se usa al principio de los valores solo para guardar algunas comillas. El mecanismo de expansión puede detectar esta palabra clave y eliminarla de forma segura. Aún puedes usar comillas, no hay problema.- Ahora un argumento de regla puede tener un
default
valor, que es el primero que se evalúa cuando se procesa el argumento. Si nodefault
se proporciona, el mecanismo establece el valor en''
(cadena vacía). - Ahora tenemos varias funciones integradas en el contexto de la regla que podrían ayudarnos a escribir código más conciso:
string isTrue(boolean b, string s1, string s2)
: devuelves1
sib
estrue
os2
no.boolean isEmpty(string s)
: comprueba sis
está vacío y devuelve unboolean
valor:true
sis
está vacío,false
en caso contrario.
Es importante observar que @{file}
ahora se expande al nombre del archivo en lugar del nombre base. Si aún queremos obtener el nombre base, también hay una función incorporada para ello: string getBasename(string s)
, @{ getBasename( file ) }
hace eso.
Ahora veamos la ejecución:
Primera regla: si no se proporciona ningún argumento, utilice un valor predeterminado.
% arara: echo
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Segunda regla: si el argumento se da pero no tiene valor, use la file
variable.
% arara: echo: { name: '' }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
Tercera regla: si se da un argumento, utilícelo.
% arara: echo: { name: duck }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
duck
Status: SUCCESS
El comentario en la respuesta original sobre % arara: echo: { name: }
todavía se mantiene. Como name
no tiene valor de argumento, el extractor fallará.
La respuesta original se dejó con fines históricos. Se aplica aarara 2.x
¿Cómo me perdí elarara¿etiqueta?:)
Lamentablemente, encontraste una molestia que pasó desapercibida durante mis conjuntos de pruebas para el lanzamiento de la 2.x
serie: la única variable disponible para expansión en el arguments
contexto es la value
misma. Desafortunadamente file
, y cualquier otra variable, no funcionará y arara
generará un error. Con suerte, la próxima versión resolverá este problema.
Además, en la próxima versión, tengo un plan de respaldo predeterminado para los argumentos, por lo que no necesitaremos escribir condicionales para verificar si el valor está establecido. Pero esa es otra historia, con suerte para la nueva 3.x
serie.:)
Por ahora, la única forma de hacer que la echo
regla funcione es verificar las variables en el command
contexto:
command: 'echo @{ name == "" ? file : name }'
arguments:
- identifier: name
flag: '@{value}'
En la nueva versión, podremos escribir esto:
command: 'echo @{name}'
arguments:
- identifier: name
flag: '@{value}'
default: '@{file}'
las directivas
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: something}
% arara: echo: {name: ''}
debería funcionar (el últimotienetrabajar, a menos que encuentres otra molestia). :)
Ahora,
% arara: echo: {name: }
no tiene valor de argumento, por lo que el extractor fallará.