#! /usr/bin/env python

"""Combine similar index entries into an entry and subentries.

For example:

    \item {foobar} (in module flotz), 23
    \item {foobar} (in module whackit), 4323

becomes

    \item {foobar}
      \subitem in module flotz, 23
      \subitem in module whackit, 4323

Note that an item which matches the format of a collapsable item but which
isn't part of a group of similar items is not modified.
"""
__version__ = '$Revision$'

import re
import string
import StringIO
import sys


def cmp_entries(e1, e2, lower=string.lower):
    return cmp(lower(e1[1]), lower(e2[1])) or cmp(e1, e2)


def dump_entries(write, entries):
    if len(entries) == 1:
        write("  \\item %s (%s)%s\n" % entries[0])
        return
    write("  \item %s\n" % entries[0][0])
    # now sort these in a case insensitive manner:
    if len(entries) > 0:
        entries.sort(cmp_entries)
    for xxx, subitem, pages in entries:
        write("    \subitem %s%s\n" % (subitem, pages))


breakable_re = re.compile(
    r"  \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)")


def process(ifn, ofn=None):
    if ifn == "-":
        ifp = sys.stdin
    else:
        ifp = open(ifn)
    if ofn is None:
        ofn = ifn
    ofp = StringIO.StringIO()
    entries = []
    match = breakable_re.match
    write = ofp.write
    while 1:
        line = ifp.readline()
        if not line:
            break
        m = match(line)
        if m:
            entry = m.group(1, 2, 3)
            if entries and entries[-1][0] != entry[0]:
                dump_entries(write, entries)
                entries = []
            entries.append(entry)
        elif entries:
            dump_entries(write, entries)
            entries = []
            write(line)
        else:
            write(line)
    del write
    del match
    ifp.close()
    data = ofp.getvalue()
    ofp.close()
    if ofn == "-":
        ofp = sys.stdout
    else:
        ofp = open(ofn, "w")
    ofp.write(data)
    ofp.close()


def main():
    import getopt
    outfile = None
    opts, args = getopt.getopt(sys.argv[1:], "o:")
    for opt, val in opts:
        if opt in ("-o", "--output"):
            outfile = val
    filename = args[0]
    outfile = outfile or filename
    process(filename, outfile)


if __name__ == "__main__":
    main()
