!config
# Arara, the cool TeX automation tool
# Copyright (c) 2023, Island of TeX
# All rights reserved.
#
# This rule is part of arara.
identifier: makeglossaries
name: MakeGlossaries
authors:
- Island of TeX
commands:
- name: The MakeGlossaries software
 command: >
   @{
       if (clean.isEmpty())
       {
          return getCommand('makeglossaries', options,
                            getBasename(reference.fileName));
       }
       else {
          prefix = [];
          if (isUnix()) {
              prefix = [ 'rm', '-f' ];
          }
          else {
              prefix = [ 'cmd', '/c', 'del' ];
          }

          base = getBasename(reference);
          removals = [];

          removals.add(getCommand(prefix, base.concat(".glsdefs")));

          lines = readFromFile(base.concat('.').concat('aux'));

          java.util.regex.Pattern glsPattern =
               java.util.regex.Pattern.compile(
                "\\\\@newglossary\\{.*\\}\\{(.*)\\}\\{(.*)\\}\\{(.*)\\}");

          java.util.regex.Pattern istPattern =
            (clean[0] == 'partial' ? null :
             java.util.regex.Pattern.compile("\\\\@istfilename\\{(.*)\\}"));

          foreach (line: lines)
          {
             matcher = glsPattern.matcher(line);

             if (matcher.matches())
             {
                foreach(extension: [matcher.group(1), matcher.group(2), matcher.group(3)])
                {
                   removals.add(getCommand(prefix, base.concat('.').concat(extension)));
                }
             }
             else if (istPattern != null)
             {
                matcher = istPattern.matcher(line);

                if (matcher.matches())
                {
                   removals.add(getCommand(prefix, matcher.group(1)));
                   istPattern = null;
                }
             }
          }

          return removals;
       }
   }
arguments:
- identifier: options
 flag: >
   @{
       if (isList(parameters.options)) {
           return parameters.options;
       }
       else {
           throwError('I was expecting a list of options.');
       }
   }
- identifier: clean
 flag: >
   @{
       if ([ 'all', 'partial' ].contains(parameters.clean)) {
          return parameters.clean;
       }
       else {
           throwError('The provided clean value is not valid.');
       }
   }