cinap_lenrekadd hg and python4bb9e2215 years agoHistory
100 lines · 2.2 KB · Python
RawDownload
#! /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 whichisn't part of a group of similar items is not modified."""__version__ = '$Revision: 29268 $' import reimport StringIOimport sys  def cmp_entries(e1, e2):    return cmp(e1[1].lower(), e2[1].lower()) 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()