Blame docs/make-todo

Packit Service fb6fa5
#!/usr/bin/python
Packit Service fb6fa5
Packit Service fb6fa5
import xmllib;
Packit Service fb6fa5
import sys;
Packit Service fb6fa5
import string
Packit Service fb6fa5
import re
Packit Service fb6fa5
Packit Service fb6fa5
def html_subst(s):
Packit Service fb6fa5
    if s.group(1) != None:
Packit Service fb6fa5
        return s.group(0)
Packit Service fb6fa5
    elif s.group(2) != None:
Packit Service fb6fa5
        return '' + s.group(0) + ''
Packit Service fb6fa5
    elif s.group(3) != None:
Packit Service fb6fa5
        return '' + s.group(0) + ''
Packit Service fb6fa5
        
Packit Service fb6fa5
def htmlify(str): 
Packit Service fb6fa5
    return re.sub ("(<[^>]*>)|(http://[~.:/\w-]+)|([\w._!-]+@[\w_-]+).[\w_-]+", html_subst, str)
Packit Service fb6fa5
Packit Service fb6fa5
def bug_subst(s):
Packit Service fb6fa5
    if s.group(1) != None:
Packit Service fb6fa5
        return s.group(0)
Packit Service fb6fa5
    else:
Packit Service fb6fa5
        n = s.group(2)
Packit Service fb6fa5
        return '#%s' % (n[0:2], n, n)
Packit Service fb6fa5
Packit Service fb6fa5
def bugify(str):
Packit Service fb6fa5
    str =  re.sub ("(<[^>]*>)|#(\d+)", bug_subst, str)
Packit Service fb6fa5
    return htmlify(str)
Packit Service fb6fa5
Packit Service fb6fa5
def make_id(str):
Packit Service fb6fa5
    return re.sub ("[^a-z]","-", string.lower(str))
Packit Service fb6fa5
Packit Service fb6fa5
class ParseError (Exception):
Packit Service fb6fa5
    pass
Packit Service fb6fa5
Packit Service fb6fa5
class Entry:
Packit Service fb6fa5
    def __init__(self):
Packit Service fb6fa5
        self.description = None
Packit Service fb6fa5
        self.title = None
Packit Service fb6fa5
        self.url = None
Packit Service fb6fa5
        self.contact = None
Packit Service fb6fa5
        self.bugs = None
Packit Service fb6fa5
Packit Service fb6fa5
    def set_size(self, size):
Packit Service fb6fa5
        size = string.lower(size)
Packit Service fb6fa5
        if size == "small":
Packit Service fb6fa5
            self.size = "Small"
Packit Service fb6fa5
        elif size == "medium":
Packit Service fb6fa5
            self.size = "Medium"
Packit Service fb6fa5
        elif size == "big":
Packit Service fb6fa5
            self.size = "Big"
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            raise ParseError, 'size must be "small", "medium", or "big"'
Packit Service fb6fa5
Packit Service fb6fa5
    def output(self):
Packit Service fb6fa5
        if self.size == "Big":
Packit Service fb6fa5
            bgcolor = "#88bb88"
Packit Service fb6fa5
        elif self.size == "Medium":
Packit Service fb6fa5
            bgcolor = "#b4d4b4"
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            bgcolor = "#d0e0d0"
Packit Service fb6fa5
        
Packit Service fb6fa5
        print '''
Packit Service fb6fa5
        
Packit Service fb6fa5
        
Packit Service fb6fa5
        
Packit Service fb6fa5
   	  
Packit Service fb6fa5
	     <font size="+1">%s</font></font>
Packit Service fb6fa5
	     Size: %s
Packit Service fb6fa5
	     Status: %s
Packit Service fb6fa5
	     Target Version: %s
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  
Packit Service fb6fa5
  	     
Packit Service fb6fa5
             %s
Packit Service fb6fa5
             
Packit Service fb6fa5
               ''' % (bgcolor, self.title, self.size, self.status, self.target, htmlify(self.description))
Packit Service fb6fa5
Packit Service fb6fa5
        if self.url != None:
Packit Service fb6fa5
            print '''More Info:
Packit Service fb6fa5
		     %s
Packit Service fb6fa5
                     ''' % htmlify (self.url)
Packit Service fb6fa5
Packit Service fb6fa5
        if self.bugs != None:
Packit Service fb6fa5
            print '''Bug Reports:
Packit Service fb6fa5
		     %s
Packit Service fb6fa5
                     ''' % bugify (self.bugs)
Packit Service fb6fa5
Packit Service fb6fa5
        if self.contact != None:
Packit Service fb6fa5
            print '''Contact:
Packit Service fb6fa5
		     %s
Packit Service fb6fa5
                     ''' % htmlify (self.contact)
Packit Service fb6fa5
Packit Service fb6fa5
        print '''
Packit Service fb6fa5
             
Packit Service fb6fa5
	     
Packit Service fb6fa5
	 
Packit Service fb6fa5
	
Packit Service fb6fa5
        
Packit Service fb6fa5
'''
Packit Service fb6fa5
Packit Service fb6fa5
class Section:
Packit Service fb6fa5
    def __init__(self):
Packit Service fb6fa5
        self.title = None
Packit Service fb6fa5
        self.entries = []
Packit Service fb6fa5
Packit Service fb6fa5
    def output(self):
Packit Service fb6fa5
Packit Service fb6fa5
        print '

%s

' % (make_id(self.title), self.title)
Packit Service fb6fa5
        
Packit Service fb6fa5
        first = 1
Packit Service fb6fa5
        for entry in self.entries:
Packit Service fb6fa5
            if not first:
Packit Service fb6fa5
                print "
"
Packit Service fb6fa5
            first = 0
Packit Service fb6fa5
            entry.output()
Packit Service fb6fa5
Packit Service fb6fa5
class TodoParser (xmllib.XMLParser):
Packit Service fb6fa5
    def __init__(self):
Packit Service fb6fa5
        xmllib.XMLParser.__init__(self)
Packit Service fb6fa5
        
Packit Service fb6fa5
        self.in_todo = 0
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
        self.section = None
Packit Service fb6fa5
        self.entry = None
Packit Service fb6fa5
        self.logourl = None
Packit Service fb6fa5
        self.title = None
Packit Service fb6fa5
        self.sections = []
Packit Service fb6fa5
Packit Service fb6fa5
        self.entitydefs = {}
Packit Service fb6fa5
Packit Service fb6fa5
    def start_todo(self,attributes):
Packit Service fb6fa5
        if self.in_todo:
Packit Service fb6fa5
            raise ParseError, "<todo> tags may not be nested"
Packit Service fb6fa5
        if attributes.has_key ("logourl"):
Packit Service fb6fa5
            self.logourl = attributes["logourl"]
Packit Service fb6fa5
        self.in_todo = 1
Packit Service fb6fa5
Packit Service fb6fa5
    def end_todo(self):
Packit Service fb6fa5
        self.in_todo = 0
Packit Service fb6fa5
Packit Service fb6fa5
    def start_section(self,attributes):
Packit Service fb6fa5
        if self.section:
Packit Service fb6fa5
            raise ParseError, "<section> tags may not be nested"
Packit Service fb6fa5
        
Packit Service fb6fa5
        self.section = Section()
Packit Service fb6fa5
Packit Service fb6fa5
    def end_section(self):
Packit Service fb6fa5
        if self.section.title == None:
Packit Service fb6fa5
            raise ParseError, "<section> requires <title>"
Packit Service fb6fa5
            
Packit Service fb6fa5
        self.sections.append(self.section)
Packit Service fb6fa5
        self.section = None
Packit Service fb6fa5
Packit Service fb6fa5
    def start_title(self,attributes):
Packit Service fb6fa5
        if not self.in_todo:
Packit Service fb6fa5
            raise ParseError, "<title> tag must be in <todo>, <section> or <entry>"
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected <title> tag in content"
Packit Service fb6fa5
        self.in_data = 1
Packit Service fb6fa5
    
Packit Service fb6fa5
    def end_title(self):
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        if self.entry:
Packit Service fb6fa5
            self.entry.title = self.data
Packit Service fb6fa5
        elif self.section:
Packit Service fb6fa5
            self.section.title = self.data
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            self.title = self.data
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
            
Packit Service fb6fa5
    def start_description(self,attributes):
Packit Service fb6fa5
        if not self.entry:
Packit Service fb6fa5
            raise ParseError, "<description> tag must be in <entry>"
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected <description> tag in content"
Packit Service fb6fa5
        self.in_data = 1
Packit Service fb6fa5
    
Packit Service fb6fa5
    def end_description(self):
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        self.entry.description = self.data
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
            
Packit Service fb6fa5
    def start_url(self,attributes):
Packit Service fb6fa5
        if not self.entry:
Packit Service fb6fa5
            raise ParseError, "<url> tag must be in <entry>"
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected <url> tag in content"
Packit Service fb6fa5
        self.in_data = 1
Packit Service fb6fa5
    
Packit Service fb6fa5
    def end_url(self):
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        self.entry.url = self.data
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
            
Packit Service fb6fa5
    def start_contact(self,attributes):
Packit Service fb6fa5
        if not self.entry:
Packit Service fb6fa5
            raise ParseError, "<contact> tag must be in <entry>"
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected <contact> tag in content"
Packit Service fb6fa5
        self.in_data = 1
Packit Service fb6fa5
    
Packit Service fb6fa5
    def end_contact(self):
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        self.entry.contact = self.data
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
            
Packit Service fb6fa5
    def start_bugs(self,attributes):
Packit Service fb6fa5
        if not self.entry:
Packit Service fb6fa5
            raise ParseError, "<bugs> tag must be in <bugs>"
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected <bugs> tag in content"
Packit Service fb6fa5
        self.in_data = 1
Packit Service fb6fa5
    
Packit Service fb6fa5
    def end_bugs(self):
Packit Service fb6fa5
        self.in_data = 0
Packit Service fb6fa5
        self.entry.bugs = self.data
Packit Service fb6fa5
        self.data = ""
Packit Service fb6fa5
            
Packit Service fb6fa5
    def start_entry(self,attributes):
Packit Service fb6fa5
        if not self.section:
Packit Service fb6fa5
            raise ParseError, "<entry> tag must be in <section>"
Packit Service fb6fa5
        if self.entry:
Packit Service fb6fa5
            raise ParseError, "<entry> tags may not be nested"
Packit Service fb6fa5
Packit Service fb6fa5
        self.entry = Entry()
Packit Service fb6fa5
Packit Service fb6fa5
        if not attributes.has_key("size"):
Packit Service fb6fa5
            raise ParseError, '"size" attribute required for entry'
Packit Service fb6fa5
        self.entry.set_size(attributes["size"])
Packit Service fb6fa5
Packit Service fb6fa5
        if not attributes.has_key("status"):
Packit Service fb6fa5
            raise ParseError, '"status" attribute (completion percentage) required for entry'
Packit Service fb6fa5
        self.entry.status=attributes["status"]
Packit Service fb6fa5
Packit Service fb6fa5
        if not attributes.has_key("target"):
Packit Service fb6fa5
            raise ParseError, '"target" attribute (target version) required for entry'
Packit Service fb6fa5
        self.entry.target=attributes["target"]
Packit Service fb6fa5
Packit Service fb6fa5
    def end_entry(self):
Packit Service fb6fa5
        if self.entry.title == None:
Packit Service fb6fa5
            raise ParseError, "<entry> requires <title>"
Packit Service fb6fa5
            
Packit Service fb6fa5
        if self.entry.description == None:
Packit Service fb6fa5
            raise ParseError, "<entry> requires <description>"
Packit Service fb6fa5
            
Packit Service fb6fa5
        self.section.entries.append(self.entry)
Packit Service fb6fa5
        self.entry = None
Packit Service fb6fa5
Packit Service fb6fa5
    def handle_data(self,data):
Packit Service fb6fa5
        if self.in_data:
Packit Service fb6fa5
            self.data = self.data + data
Packit Service fb6fa5
        
Packit Service fb6fa5
    def unknown_starttag(self,tag,attributes):
Packit Service fb6fa5
        if not self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected start tag: " + tag
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            self.data = self.data + "<" + tag
Packit Service fb6fa5
            for (key,val) in attributes.items():
Packit Service fb6fa5
                self.data = self.data + ' %s="%s"' % (key,val)
Packit Service fb6fa5
            self.data = self.data + ">"
Packit Service fb6fa5
Packit Service fb6fa5
    def unknown_endtag(self,tag):
Packit Service fb6fa5
        if not self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unexpected end tag: " + tag
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            self.data = self.data + "</%s>" % tag
Packit Service fb6fa5
Packit Service fb6fa5
    def syntax_error(self, err):
Packit Service fb6fa5
        if re.match("reference to unknown entity", err):
Packit Service fb6fa5
            pass
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            xmllib.XMLParser.syntax_error (self, err)
Packit Service fb6fa5
            
Packit Service fb6fa5
    def unknown_entityref(self,ref):
Packit Service fb6fa5
        if not self.in_data:
Packit Service fb6fa5
            raise ParseError, "Unknown entity &" + ref + ";"
Packit Service fb6fa5
        else:
Packit Service fb6fa5
            self.data = self.data + "&" + ref + ";"
Packit Service fb6fa5
Packit Service fb6fa5
file = open(sys.argv[1])
Packit Service fb6fa5
parser = TodoParser()
Packit Service fb6fa5
Packit Service fb6fa5
lineno = 1
Packit Service fb6fa5
while 1:
Packit Service fb6fa5
    line = file.readline()
Packit Service fb6fa5
    if line == "":
Packit Service fb6fa5
        break
Packit Service fb6fa5
Packit Service fb6fa5
    try:
Packit Service fb6fa5
        parser.feed(line)
Packit Service fb6fa5
    except ParseError, err:
Packit Service fb6fa5
        sys.stderr.write("Parse error at line " + `lineno` + ": " + err.__str__() + "\n")
Packit Service fb6fa5
        sys.exit(1)
Packit Service fb6fa5
    except RuntimeError, err:
Packit Service fb6fa5
        sys.stderr.write(err.__str__() + "\n")
Packit Service fb6fa5
        sys.exit(1)
Packit Service fb6fa5
Packit Service fb6fa5
    lineno = lineno + 1
Packit Service fb6fa5
Packit Service fb6fa5
parser.close()
Packit Service fb6fa5
if parser.title == None:
Packit Service fb6fa5
    sys.stderr.write ("<todo> Document must have a <title>\n")
Packit Service fb6fa5
    sys.exit (1)
Packit Service fb6fa5
Packit Service fb6fa5
print '''
Packit Service fb6fa5
<html>
Packit Service fb6fa5
<head>
Packit Service fb6fa5
<title>%s</title>
Packit Service fb6fa5
</head>
Packit Service fb6fa5
<body bgcolor="#ffffff">
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
    
Packit Service fb6fa5
      
Packit Service fb6fa5
        

%s

''' % (parser.title, parser.title)
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
for section in parser.sections:
Packit Service fb6fa5
    ntasks = len(section.entries)
Packit Service fb6fa5
    id = make_id (section.title)
Packit Service fb6fa5
    if ntasks == 1:
Packit Service fb6fa5
        print '%s (1 item)
' % (id,section.title)
Packit Service fb6fa5
    else:
Packit Service fb6fa5
        print '%s (%d items)
' % (id,section.title,ntasks)
Packit Service fb6fa5
Packit Service fb6fa5
print '''
Packit Service fb6fa5
      '''
Packit Service fb6fa5
if parser.logourl != None:
Packit Service fb6fa5
    print '''      
Packit Service fb6fa5
       Logo
Packit Service fb6fa5
      ''' % parser.logourl
Packit Service fb6fa5
print '''
Packit Service fb6fa5
    
Packit Service fb6fa5
  
Packit Service fb6fa5
Packit Service fb6fa5
''' 
Packit Service fb6fa5
Packit Service fb6fa5
first = 1
Packit Service fb6fa5
for section in parser.sections:
Packit Service fb6fa5
    if not first:
Packit Service fb6fa5
        print "

"
Packit Service fb6fa5
    first = 0
Packit Service fb6fa5
    section.output()
Packit Service fb6fa5
Packit Service fb6fa5
print '''</body>
Packit Service fb6fa5
</html>'''
Packit Service fb6fa5
    
Packit Service fb6fa5