#!/usr/bin/env perl # #(c) Copyright 1998-2009 Apostolos Syropoulos # asyropoulos@yahoo.com # # The LaTeX Project Public License (lppl) # This software is copyright but you are granted a license which gives you, # the "user" of the software, legal permission to copy, distribute, and/or # modify the software. However, if you modify the software and then distribute # it (even just locally) you must change the name of the software, or use other # technical means to avoid confusion. # $makeindex = "makeindex"; #name of the index generation utility sub g2e { $word = $_[0]; $tword = ""; foreach $_ (split(//, $word)) { if (/^a|^A|^á|^Á|^Ü|^\xA2|^\xB6/) { $tword .= "a";} elsif (/^b|^B|^â|^Â/) { $tword .= "b"; } elsif (/^d|^D|^ä|^Ä/) { $tword .= "d"; } elsif (/^e|^E|^å|^Å|^Ý|^¸/) { $tword .= "e"; } elsif (/^i|^I|^é|^É|^ß|^º|^À/) { $tword .= "i"; } elsif (/^o|^O|^ï|^Ï|^ü|^¼/) { $tword .= "o"; } elsif (/^p|^P|^ð|^Ð/) { $tword .= "p"; } elsif (/^g|^G|^ã|^Ã/) { $tword .= "c"; } elsif (/^z|^Z|^æ|^Æ/) { $tword .= "f"; } elsif (/^h|^H|^ç|^Ç|^Þ|^¹/) { $tword .= "g"; } elsif (/^j|^J|^è|^È/) { $tword .= "h"; } elsif (/^k|^K|^ê|^Ê/) { $tword .= "j"; } elsif (/^l|^L|^ë|^Ë/) { $tword .= "k"; } elsif (/^m|^M|^ì|^Ì/) { $tword .= "l"; } elsif (/^n|^N|^í|^Í/) { $tword .= "m"; } elsif (/^x|^X|^î|^Î/) { $tword .= "n"; } elsif (/^r|^R|^ñ|^Ñ/) { $tword .= "q"; } elsif (/^s|^c|^S|^ó|^ò|^Ó/) { $tword .= "r"; } elsif (/^t|^T|^ô|^Ô/) { $tword .= "s"; } elsif (/^u|^U|^õ|^Õ|^ý|^¾|^à/) { $tword .= "t"; } elsif (/^f|^F|^ö|^Ö/) { $tword .= "u"; } elsif (/^q|^Q|^÷|^×/) { $tword .= "v"; } elsif (/^y|^Y|^ø|^Ø/) { $tword .= "w"; } elsif (/^w|^W|^ù|^Ù|^þ|^¿/) { $tword .= "x"; } elsif (/^'|^`|^~|^<|^>/) { } else { $tword .= $_ } } return $tword; } $argc = @ARGV; if ($argc == 0 || $argc > 4 ) # no command line arguments or more than 3 { # arguments die "Usage: mkgrkindex.pl [-s A|a] [-l] index\n"; } else { print "This is mkgrkindex (previously known as mkindex) version 2.2\n"; $style = 0; $is_latin = 0; SWITCHES: while($_ = $ARGV[0]) { shift; if (/^-s/) { if ($ARGV[0] eq "a") { $style = -1; } elsif ($ARGV[0] eq "A") { $style = 1; } else { die "$ARGV[0]: Illegal argument for switch -s\n"; } shift; } elsif (/^-l/) { $is_latin = 1; } elsif (/^-\w+/) { die "$_: Illegal command line switch!\n"; } else { $file = $_; } } die "No index file name specified!\n" if $file eq ""; if (! (-e $file)) { die "$file: no such file!\n" if $file =~ /.+\..+/; die "$file.idx: no such file!\n" if (! (-e "$file.idx")); $index_file = "$file.idx"; } else { $index_file = $file; $file = $1 if $index_file =~ /(.+)\..+/; } } $old_file="$index_file.old"; if ($is_latin == 0) { rename $index_file, $old_file; open(OLD, "<$old_file") || die "Can't open file $old_file\n"; open(NEW, ">$index_file") || die "Can't open file $index_file\n"; while () { #\x7B = {, \x7D = },\x40 = @, \x7C = |, \x21 = !, \x28 = (, \x29 = ) chomp; #Nikos Platis has suggested the replacement of the original code with a better #parsing method. The code that follows is essentially Nikos's code with #some minnor modifications, as explained in the documentation. $newentry = ""; /^\\indexentry\x7B(.+)\x7D(.+)/; $fullentry = $1; $page = $2; ($indexentry, $format) = split(/(? 0) { $newentry .= "!" } $tx = g2e($x); if ($y) { $newentry .= "$tx\@$y" } else { $newentry .= "$tx\@$x"; } } print NEW "\\indexentry{$newentry"; if ($format) { print NEW "|$format" } print NEW "}$page\n" } close OLD; close NEW; unlink $old_file; } rename $index_file, $old_file; open(OLD, "<$old_file") || die "Can't open file $old_file\n"; open(NEW, ">$index_file") || die "Can't open file $index_file\n"; while() { chomp($_); if (/\\indexentry\x7B(.+)\x7D\x7B\\textlatin\s*?\x7B(\w+)\x7D\x7D/) { print NEW "\\indexentry{$1|textlatin}{$2}\n"; } else { print NEW "$_\n"; } } close OLD; close NEW; unlink $old_file; if ($style < 0) { system("$makeindex -s lowercase-headers.ist $file"); } elsif ($style > 0) { system("$makeindex -s uppercase-headers.ist $file"); } else { system("$makeindex $file"); } if ($style != 0) { %e2g = ( 'a' => 'á', 'A' => 'Á', 'b' => 'â', 'B' => 'Â', 'c' => 'ã', 'C' => 'Ã', 'd' => 'ä', 'D' => 'Ä', 'e' => 'å', 'E' => 'Å', 'f' => 'æ', 'F' => 'Æ', 'g' => 'ç', 'G' => 'Ç', 'h' => 'è', 'H' => 'È', 'i' => 'é', 'I' => 'É', 'j' => 'ê', 'J' => 'Ê', 'k' => 'ë', 'K' => 'Ë', 'l' => 'ì', 'L' => 'Ì', 'm' => 'í', 'M' => 'Í', 'n' => 'î', 'N' => 'Î', 'o' => 'ï', 'O' => 'Ï', 'p' => 'ð', 'P' => 'Ð', 'q' => 'ñ', 'Q' => 'Ñ', 'r' => 'óv', 'R' => 'Ó', 's' => 'ô', 'S' => 'Ô', 't' => 'õ', 'T' => 'Õ', 'u' => 'ö', 'U' => 'Ö', 'v' => '÷', 'V' => '×', 'w' => 'ø', 'W' => 'Ø', 'x' => 'ù', 'X' => 'Ù' ); $ind_file = "$file.ind"; $old_file="$ind_file.old"; if ($is_latin == 0) { rename $ind_file, $old_file; open(OLD, "<$old_file") || die "Can't open file $old_file\n"; open(NEW, ">$ind_file") || die "Can't open file $ind_file\n"; while () { if (/^{\\hfil (\w?) \\hfil}/) { $lettergr = $e2g{$1}; print NEW "{\\hfil $lettergr \\hfil}\\nopagebreak\n"; } else { print NEW ; } } close OLD; close NEW; unlink $old_file; } rename $ind_file, $old_file; open(OLD, "<$old_file") || die "Can't open file $old_file\n"; open(NEW, ">$ind_file") || die "Can't open file $ind_file\n"; while () { if (/^\x7B\\hfil (\w)ymbols \\hfil\x7D/) { if ($1 eq "s") { print NEW "{\\hfil \\textgreek{\\textbf{s'umbola}}"; print NEW "\\hfil}\\nopagebreak\n"; } elsif ($1 eq "S") { print NEW "{\\hfil \\textgreek{\\textbf{S'umbola}}"; print NEW "\\hfil}\\nopagebreak\n"; } else { die "Illegal header $1 in .ind file\n"; } } else { print NEW; } } close OLD; close NEW; unlink $old_file; } __END__