| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | 
							- """
 
- Runs through a reST file looking for old-style literals, and helps replace them
 
- with new-style references.
 
- """
 
- import re
 
- import sys
 
- import shelve
 
- refre = re.compile(r'``([^`\s]+?)``')
 
- ROLES = (
 
-     'attr',
 
-     'class',
 
-     "djadmin",
 
-     'data',
 
-     'exc',
 
-     'file',
 
-     'func',
 
-     'lookup',
 
-     'meth',
 
-     'mod',
 
-     "djadminopt",
 
-     "ref",
 
-     "setting",
 
-     "term",
 
-     "tfilter",
 
-     "ttag",
 
-     # special
 
-     "skip",
 
- )
 
- ALWAYS_SKIP = [
 
-     "NULL",
 
-     "True",
 
-     "False",
 
- ]
 
- def fixliterals(fname):
 
-     data = open(fname).read()
 
-     last = 0
 
-     new = []
 
-     storage = shelve.open("/tmp/literals_to_xref.shelve")
 
-     lastvalues = storage.get("lastvalues", {})
 
-     for m in refre.finditer(data):
 
-         new.append(data[last:m.start()])
 
-         last = m.end()
 
-         line_start = data.rfind("\n", 0, m.start())
 
-         line_end = data.find("\n", m.end())
 
-         prev_start = data.rfind("\n", 0, line_start)
 
-         next_end = data.find("\n", line_end + 1)
 
-         # Skip always-skip stuff
 
-         if m.group(1) in ALWAYS_SKIP:
 
-             new.append(m.group(0))
 
-             continue
 
-         # skip when the next line is a title
 
-         next_line = data[m.end():next_end].strip()
 
-         if next_line[0] in "!-/:-@[-`{-~" and \
 
-                 all(c == next_line[0] for c in next_line):
 
-             new.append(m.group(0))
 
-             continue
 
-         sys.stdout.write("\n" + "-" * 80 + "\n")
 
-         sys.stdout.write(data[prev_start + 1:m.start()])
 
-         sys.stdout.write(colorize(m.group(0), fg="red"))
 
-         sys.stdout.write(data[m.end():next_end])
 
-         sys.stdout.write("\n\n")
 
-         replace_type = None
 
-         while replace_type is None:
 
-             replace_type = raw_input(
 
-                 colorize("Replace role: ", fg="yellow")).strip().lower()
 
-             if replace_type and replace_type not in ROLES:
 
-                 replace_type = None
 
-         if replace_type == "":
 
-             new.append(m.group(0))
 
-             continue
 
-         if replace_type == "skip":
 
-             new.append(m.group(0))
 
-             ALWAYS_SKIP.append(m.group(1))
 
-             continue
 
-         default = lastvalues.get(m.group(1), m.group(1))
 
-         if default.endswith("()") and \
 
-                 replace_type in ("class", "func", "meth"):
 
-             default = default[:-2]
 
-         replace_value = raw_input(
 
-             colorize("Text <target> [", fg="yellow") + default + \
 
-                     colorize("]: ", fg="yellow")).strip()
 
-         if not replace_value:
 
-             replace_value = default
 
-         new.append(":%s:`%s`" % (replace_type, replace_value))
 
-         lastvalues[m.group(1)] = replace_value
 
-     new.append(data[last:])
 
-     open(fname, "w").write("".join(new))
 
-     storage["lastvalues"] = lastvalues
 
-     storage.close()
 
- def colorize(text='', opts=(), **kwargs):
 
-     """
 
-     Returns your text, enclosed in ANSI graphics codes.
 
-     Depends on the keyword arguments 'fg' and 'bg', and the contents of
 
-     the opts tuple/list.
 
-     Returns the RESET code if no parameters are given.
 
-     Valid colors:
 
-         'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'
 
-     Valid options:
 
-         'bold'
 
-         'underscore'
 
-         'blink'
 
-         'reverse'
 
-         'conceal'
 
-         'noreset' - string will not be auto-terminated with the RESET code
 
-     Examples:
 
-         colorize('hello', fg='red', bg='blue', opts=('blink',))
 
-         colorize()
 
-         colorize('goodbye', opts=('underscore',))
 
-         print colorize('first line', fg='red', opts=('noreset',))
 
-         print 'this should be red too'
 
-         print colorize('and so should this')
 
-         print 'this should not be red'
 
-     """
 
-     color_names = ('black', 'red', 'green', 'yellow',
 
-                    'blue', 'magenta', 'cyan', 'white')
 
-     foreground = dict([(color_names[x], '3%s' % x) for x in range(8)])
 
-     background = dict([(color_names[x], '4%s' % x) for x in range(8)])
 
-     RESET = '0'
 
-     opt_dict = {'bold': '1',
 
-                 'underscore': '4',
 
-                 'blink': '5',
 
-                 'reverse': '7',
 
-                 'conceal': '8'}
 
-     text = str(text)
 
-     code_list = []
 
-     if text == '' and len(opts) == 1 and opts[0] == 'reset':
 
-         return '\x1b[%sm' % RESET
 
-     for k, v in kwargs.iteritems():
 
-         if k == 'fg':
 
-             code_list.append(foreground[v])
 
-         elif k == 'bg':
 
-             code_list.append(background[v])
 
-     for o in opts:
 
-         if o in opt_dict:
 
-             code_list.append(opt_dict[o])
 
-     if 'noreset' not in opts:
 
-         text = text + '\x1b[%sm' % RESET
 
-     return ('\x1b[%sm' % ';'.join(code_list)) + text
 
- if __name__ == '__main__':
 
-     try:
 
-         fixliterals(sys.argv[1])
 
-     except (KeyboardInterrupt, SystemExit):
 
-         print
 
 
  |