Как указать два параметра по умолчанию для идентификатора arara?

Как указать два параметра по умолчанию для идентификатора arara?

(Извините, если я неправильно выразился.)

Я хочу написать директиву для arara, которая может принимать аргумент. Директива должна устанавливать имя выходного файла в соответствии со следующими правилами:

  1. Если аргумент не указан, используйте значение по умолчанию.
  2. Если аргумент указан, но не имеет значения, используйте fileпеременную.
  3. Если приведен аргумент, используйте его.

Я подумал, что правильным способом сделать это будет:

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

но я получаю: ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.если я не передам фактический аргумент.

Вот 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 }'

Затем в своем тестовом документе я пробую одно из следующего:

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

Первые два работают, вторые два — нет.

Это возможно?

решение1

С помощью новой 3.xсерии мы можем легко добавить значение по умолчанию к расширению аргумента.

Вот новое echoправило:

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

Новые концепции:

  • valueбыла заменена картой с именем parameters. Если мы хотим получить доступ, скажем, к oneаргументу директивы, мы просто вызываем parameters.oneвместо того, valueчтобы предполагать значение в контексте аргумента правила.
  • <arara>используется в начале значений, чтобы просто сэкономить несколько кавычек. Механизм расширения может обнаружить это ключевое слово и безопасно удалить его. Вы по-прежнему можете использовать кавычки, нет никаких проблем.
  • Теперь аргумент правила может иметь defaultзначение, которое будет оценено первым при обработке аргумента. Если аргумент не defaultуказан, механизм устанавливает значение ''(пустая строка).
  • Теперь у нас есть несколько встроенных функций в контексте правил, которые могут помочь нам написать более лаконичный код:
    • string isTrue(boolean b, string s1, string s2): возвращает, s1если bравно true, или s2в противном случае.
    • boolean isEmpty(string s): проверяет, sпусто ли, и возвращает booleanзначение: trueесли sпусто, falseв противном случае.

Важно отметить, что @{file}теперь расширяется до имени файла вместо базового имени. Если мы все еще хотим получить базовое имя, для этого также есть встроенная функция: string getBasename(string s), @{ getBasename( file ) }делает это.

Теперь давайте посмотрим на исполнение:

Первое правило: если аргумент не указан, используйте значение по умолчанию.

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

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

Running Echo the value of the argument...

teste.tex
Status: SUCCESS

Второе правило: если аргумент задан, но не имеет значения, используйте fileпеременную.

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

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

Running Echo the value of the argument...

teste.tex
Status: SUCCESS

Третье правило: если приведен аргумент, используйте его.

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

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

Running Echo the value of the argument...

duck
Status: SUCCESS

Комментарий в исходном ответе о % arara: echo: { name: }все еще имеет место. Поскольку nameне имеет значения аргумента, экстрактор потерпит неудачу.


Оригинальный ответ оставлен в исторических целях. Он относится кarara 2.x

Как я пропустилярлык?:)

К сожалению, вы столкнулись с неприятностью, которая осталась незамеченной во время моих тестовых наборов для выпуска серии 2.x: единственная переменная, доступная для расширения в argumentsконтексте, — это valueсама. Так что, к сожалению file, и любые другие переменные не будут работать и araraвызовут ошибку. Надеюсь, в следующей версии эта проблема будет решена.

Также в следующем выпуске у меня есть план отката по умолчанию для аргументов, так что нам не нужно будет писать условные операторы для проверки, установлено ли значение. Но это уже другая история, надеюсь, для новой 3.xсерии.:)

На данный момент единственный способ заставить echoправило работать — это проверить переменные в commandконтексте:

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

В новом релизе мы сможем написать следующее:

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

Директивы

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

должно работать (последнийимеетработать, если только вы не нашли другую неприятность). :)Теперь,

% arara: echo: {name: }

не имеет значения аргумента, поэтому экстрактор завершится ошибкой.

Связанный контент