# Definitions for use of splitindex package: Arrange to use the splitindex
# program instead of makeindex when needed, otherwise to do standard run of
# makeindex.

# John Collins and Ernst Reissner, 2024-09-27.


# Specify extra files that need to be cleaned up when splitindex is in use:
$clean_ext .= " %R-*.ind %R-*.idx %R-*.ilg %R-*.ind";

# Use an internal subroutine to do the processing.  **Important**: Pass the
# name of the source file, etc as arguments obtained by place-holder
# substitution instead of having the subroutine use variables like
# $$Psource.  This is because by default latexmk temporarily changes
# directory to the aux directory before the invoking the command (or
# whatever) specified by $makeindex.  The change of directory is to avoid
# some deficiencies in the standard makeindex program.  See the latexmk
# documentation for further information. After the change of directory, the
# value of $$Psource will typically be wrong. Instead we use placeholders
# for the relevant quantities, since after doing the change of directory,
# latexmk's internal processing adjusts the substitutions for %S, %D etc
# appropriately.  Also, include the string for aux_dir in the arguments, as
# needed for the treatment of dependencies.

$makeindex = 'internal splitindex3 %S %D %Y %R %B %O';

#-------------

sub HaveMultiIdx {
 # Subroutine to test whether (.idx) file has entries of the form given by
 # splitindex package with multiple indexes.
 use strict;
 my $fileName = $_[0];

 # Use a precompiled RE:
 my $patternMultiIndex = qr/^\\indexentry\[[^\]]*\]\{/;

 my $info;
 if (! open $info, '<', $fileName ) {
     die "In splitindex processing, the file '$fileName' was supposed to\n",
         "exist, but I could not read it:\n$!";
     return 0;
 }
 while (my $line = <$info>) {
   if ( $line =~ $patternMultiIndex ) {
     #  We have a multi-index
     close $info;
     return 1;
   }
 }
 close $info;
 # There was no multi-index:
 return 0;
}

#-------------

sub splitindex3 {
  use strict;
  my ($source, $dest, $auxdir, $root, $base, @opts) = @_;

  if (! HaveMultiIdx($source)) {
     print "Running standard makeindex program:\n";
     return system( "makeindex", @opts, '-o', $dest, $source );
  }
  # Else:
  print "Running splitindex program:\n";

  # Ensure dummy file for standard destination file exists, so that
  # latexmk is satisfied that its expectation for the main generated file
  # is satisfied.
  open( my $ind_fh, '>>', $dest );
  close $ind_fh;

  # Arrange to obtain dependency information from splitindex by invoking
  # it in a verbose mode, and redirecting its output to the standard .ilg
  # file, and later parsing it for the relevant lines.
  my $ilg = $dest;
  $ilg =~ s/\.[^\.]+$/\.ilg/;
  my $ret2 = system "splitindex -v -v \"$source\" >> \"$ilg\"";
  if ($ret2) { return $ret2;}


  my $ilg_fh;
  if (! open( $ilg_fh, '<', $ilg ) ) {
      warn "In sub splitindex, could not read '$ilg'\n";
      return 1;
  }
  while (<$ilg_fh>) {
      if ( /^New index file (.*)\s*$/ ) {
           # .idx file generated by splitindex
         my $idx = $1;
           # Ensure path to idx file is correct if we've done the change of
           # directory caused by the setting of $makeindex_fudge:
         if ($makeindex_fudge) { $idx = $auxdir.$idx; }
           # In addition to the .idx files that the splitindex program
           # reports that it generates, there are corresponding .ind files
           # generated by the instances of makeindex that are invoked by
           # splitindex.  These are important to latexmk's knowledge of
           # the network of dependencies because they are read in by the
           # next run of *latex.
         my $ind = $idx;
         $ind =~ s/\.idx$/\.ind/;
         print  "splitindex generated files '$idx' '$ind'\n";
         rdb_add_generated( $ind, $idx );
      }
  }
  close $ilg_fh;
  return $ret2;
}

#-------------