User:Skagedal/Footnote renumbering tool

From Wikipedia, the free encyclopedia

Version 0.1. This script was written for the Schizophrenia article. I actually don't know how generalizable it is.

#!/usr/bin/python
#
# This script will renumber the footnotes on a page, so that the first footnote is number 1,
# the second number 2, etc.
#
# For instance, if you have a page that looks like:
#
#    Philip J. Fry{{fn|34}} is a character{{fn|21}} in the Futurama{{fn|25}} series
#    ==Notes==
#    * {{fnb|21}} Yes, he really is a character
#    * {{fnb|25}} By Matt Groening
#    * {{fnb|34}} Silly name, huh?
#
# This script will change it to
#
#    Philip J. Fry{{fn|1}} is a character{{fn|2}} in the Futurama{{fn|3}} series.
#    ==Notes==
#    * {{fnb|2}} Yes, he really is a character
#    * {{fnb|3}} By Matt Groening
#    * {{fnb|1}} Silly name, huh?
#
# As you see, it will not (yet?) reorder your list of footnotes.  You'll have to 
# do that yourself.
#
# Usage: Give the input on stdin, and you'll get output on stdout.

import sys, re

# Use these regular expressions for enwiki
re_fn = re.compile('\{\{fn\|([0-9]+)\}\}', re.I)
re_fnb = re.compile('\{\{fnb\|([0-9]+)\}\}', re.I)

content = sys.stdin.read()

# Create a map from old footnote number to new footnote number

map = {}
new_num = 0
for match in re_fn.finditer(content):
        fnum = int(match.group(1))
        if not map.has_key(fnum):
                # first encounter of this footnote 
                new_num = new_num + 1
                map[fnum] = new_num

# Change all footnotes in string s.  Returns the changed string.

def change_footnotes(re, s):
        match = re.search(s)
        if match:
                fnum = int(match.group(1))
                pre = s[:match.start(1)]
                post = change_footnotes(re, s[match.end(1):])
                if not map.has_key(fnum):
                        sys.stderr.write("I think you have a {{Fnb|" + \
                                         str(fnum) + "}} with no matching {{Fn|" + \
                                         str(fnum) + "}}.\n")
                        return pre + str(fnum) + post
                return pre + str(map[fnum]) + post
        else:
                return s

print change_footnotes(re_fn, change_footnotes (re_fnb, content))