(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:
- Se nenhum argumento for fornecido, use um valor padrão.
- Se o argumento for fornecido, mas não tiver valor, use a
file
variável. - 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.x
série, podemos facilmente adicionar um valor padrão à expansão do argumento.
Aqui está a nova echo
regra:
!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:
value
foi substituído por um mapa chamadoparameters
. Se quisermos acessar, digamos, oone
argumento da diretiva, simplesmente chamamosparameters.one
em vez devalue
assumir 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
default
valor, que é o primeiro a ser avaliado quando o argumento é processado. Se nãodefault
for 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)
: retornas1
seb
fortrue
ous2
caso contrário.boolean isEmpty(string s)
: verifica ses
está vazio e retorna umboolean
valor:true
ifs
está vazio,false
caso 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 file
variá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 name
não possui valor de argumento, o extrator falhará.
Resposta original deixada para fins históricos. Aplica-se aarara 2.x
Como eu perdi oAraramarcação?:)
Infelizmente, você encontrou um aborrecimento que passou despercebido durante meus testes de lançamento da 2.x
série: a única variável disponível para expansão no arguments
contexto é a value
própria. Infelizmente file
- e quaisquer outras variáveis - não funcionarão e arara
gerarã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.x
série.:)
Por enquanto, a única maneira de fazer a echo
regra funcionar é verificar as variáveis no command
contexto:
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á.