Como especifico duas opções padrão para um identificador arara?

Como especifico duas opções padrão para um identificador arara?

(Desculpas se a terminologia estiver incorreta.)

Quero escrever uma diretriz para arara que possa argumentar. A diretiva deve definir o nome do arquivo de saída de acordo com as seguintes regras:

  1. Se nenhum argumento for fornecido, use um valor padrão.
  2. Se o argumento for fornecido, mas não tiver valor, use a filevariável.
  3. Se um argumento for fornecido, use-o.

Eu pensei que a maneira certa de fazer isso seria:

command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
  flag: '@{value == "" ? file : value }'

mas eu entendo: ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.se eu não passar em um argumento real.

Aqui está um 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 }'

Então, no meu documento de teste, tento um dos seguintes:

% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: }
% arara: echo: {name: ''}

Os dois primeiros funcionam, os dois segundos não.

Isso é possível?

Responder1

Com a nova 3.xsérie, podemos facilmente adicionar um valor padrão à expansão do argumento.

Aqui está a nova echoregra:

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

Novos conceitos:

  • valuefoi substituído por um mapa chamado parameters. Se quisermos acessar, digamos, o oneargumento da diretiva, simplesmente chamamos parameters.oneem vez de valueassumir o valor no contexto do argumento da regra.
  • <arara>é usado no início dos valores apenas para salvar algumas aspas. O mecanismo de expansão pode detectar esta palavra-chave e removê-la com segurança. Você ainda pode usar aspas, não há problema.
  • Agora, um argumento de regra pode ter um defaultvalor, que é o primeiro a ser avaliado quando o argumento é processado. Se não defaultfor fornecido, o mecanismo define o valor como ''(string vazia).
  • Agora temos diversas funções integradas no contexto da regra que podem nos ajudar a escrever um código mais conciso:
    • string isTrue(boolean b, string s1, string s2): retorna s1se bfor trueou s2caso contrário.
    • boolean isEmpty(string s): verifica se sestá vazio e retorna um booleanvalor: trueif sestá vazio, falsecaso contrário.

É importante observar que @{file}agora se expande para o nome do arquivo em vez do nome base. Se ainda quisermos obter o nome base, também há uma função integrada para ele: string getBasename(string s), @{ getBasename( file ) }does that.

Agora vamos ver a execução:

Primeira regra: se nenhum argumento for fornecido, use um valor padrão.

% arara: echo
\documentclass{article}
...

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Running Echo the value of the argument...

teste.tex
Status: SUCCESS

Segunda regra: se o argumento for dado mas não tiver valor, use a filevariável.

% arara: echo: { name: '' }
\documentclass{article}
...

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Running Echo the value of the argument...

teste.tex
Status: SUCCESS

Terceira regra: se for dado um argumento, use-o.

% arara: echo: { name: duck }
\documentclass{article}
...

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Running Echo the value of the argument...

duck
Status: SUCCESS

O comentário na resposta original sobre % arara: echo: { name: }ainda é válido. Como namenão possui valor de argumento, o extrator falhará.


Resposta original deixada para fins históricos. Aplica-se aarara 2.x

Como eu perdi omarcação?:)

Infelizmente, você encontrou um aborrecimento que passou despercebido durante meus testes de lançamento da 2.xsérie: a única variável disponível para expansão no argumentscontexto é a valueprópria. Infelizmente file- e quaisquer outras variáveis ​​- não funcionarão e araragerarão um erro. Esperançosamente, a próxima versão resolverá esse problema.

Também na próxima versão, tenho um plano de substituto padrão para argumentos, portanto não precisaremos escrever condicionais para verificar se o valor está definido. Mas isso é outra história, espero que para a nova 3.xsérie.:)

Por enquanto, a única maneira de fazer a echoregra funcionar é verificar as variáveis ​​no commandcontexto:

command: 'echo @{ name == "" ? file : name }'
arguments:
- identifier: name
  flag: '@{value}'

Na nova versão, poderemos escrever isto:

command: 'echo @{name}'
arguments:
- identifier: name
  flag: '@{value}'
  default: '@{file}'

As diretivas

% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: something}
% arara: echo: {name: ''}

deve funcionar (o últimotempara trabalhar, a menos que você encontre outro aborrecimento). :)Agora,

% arara: echo: {name: }

não tem valor de argumento, então o extrator falhará.

informação relacionada