¿Cómo especifico dos opciones predeterminadas para un identificador arara?

¿Cómo especifico dos opciones predeterminadas para un identificador arara?

(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:

  1. Si no se proporciona ningún argumento, utilice un valor predeterminado.
  2. Si se da el argumento pero no tiene valor, use la filevariable.
  3. 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.xserie, podemos agregar fácilmente un valor predeterminado a la expansión del argumento.

Aquí está la nueva echoregla:

!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:

  • valuefue reemplazado por un mapa llamado parameters. Si queremos acceder, digamos, al oneargumento directivo, simplemente llamamos parameters.oneen lugar de valueasumir 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 defaultvalor, que es el primero que se evalúa cuando se procesa el argumento. Si no defaultse 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): devuelve s1si bes trueo s2no.
    • boolean isEmpty(string s): comprueba si sestá vacío y devuelve un booleanvalor: truesi sestá vacío, falseen 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 filevariable.

% 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 nameno 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í el¿etiqueta?:)

Lamentablemente, encontraste una molestia que pasó desapercibida durante mis conjuntos de pruebas para el lanzamiento de la 2.xserie: la única variable disponible para expansión en el argumentscontexto es la valuemisma. Desafortunadamente file, y cualquier otra variable, no funcionará y araragenerará 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.xserie.:)

Por ahora, la única forma de hacer que la echoregla funcione es verificar las variables en el commandcontexto:

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á.

información relacionada