From 62d380a1ee4cca65e2146447f67ee6d81189242b Mon Sep 17 00:00:00 2001 From: axel Date: Thu, 25 Jan 2007 11:27:28 +1000 Subject: [PATCH] Make first stab at a manual page parser. It takes the name of a command as input and outputs completions for it. darcs-hash:20070125012728-ac50b-442dec7a0252f7cf817f442623161e33ce50c355.gz --- make_completions.py | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 make_completions.py diff --git a/make_completions.py b/make_completions.py new file mode 100755 index 000000000..ec20470fc --- /dev/null +++ b/make_completions.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import sys +import commands +import re + +def escape_quotes(s): + return re.sub('\'', '\\\'', s) + +def escape(s): + return re.sub('([\'"#%*?])', r"\\\1", s) + +def print_completion( cmd, switch_name, desc ): + + offset=1 + switch_type = "o" + + if len(switch_name) == 2: + switch_type = "s" + + if switch_name[1] == "-": + switch_type = "l" + offset=2 + + print "complete -c %s -%s %s --description '%s'" % (cmd, switch_type, escape( switch_name[offset:] ), escape_quotes(desc)) + +def clean_whitespace( str ): + clean_whitespace_prog0 = re.compile( r"-[ \t]*\n[ \t\r]+" ) + clean_whitespace_prog1 = re.compile( r"[ \n\t]+" ) + clean_whitespace_prog2 = re.compile( r"^[ \t\r]*", re.MULTILINE ) + str = clean_whitespace_prog0.sub( "", str ) + str = clean_whitespace_prog1.sub( " ", str ) + str = clean_whitespace_prog2.sub( "", str ) + return str + + + +cmd = sys.argv[1] +man = commands.getoutput( "man %s | col -b" % cmd ) +remainder = man + +re1 = r"\n( *-[^ ,]* *(|\n))+[^.]+" +prog1 = re.compile(re1, re.MULTILINE) + +re2 = r"^(|=[^ ]*)( |\n)*(?P-[^ =./\n]+)( *[^-\n ]*\n|)" +prog2 = re.compile(re2, re.MULTILINE) + +while True: + + match = prog1.search( remainder ) + + if match == None: + break + +# print "yay match!!!\n" + str = match.string[match.start():match.end()] + +# print str + + rem2 = str + + switch = [] + + while True: + match2 = prog2.search( rem2 ) + + if match2 == None: + break + + sw = match2.expand( r"\g" ) +# print "yay switch %s!!!\n" %sw + + switch.append( sw ) + + rem2 = rem2[match2.end():] + + desc = clean_whitespace(rem2) + + if len( desc) > 8: + +# print "Yay desc '%s'!!\n" % desc + + for i in switch: + print_completion( cmd, i, desc ) + + + remainder = remainder[match.end():] +