diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-02-24 04:03:49 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-02-24 04:03:49 +0000 |
commit | d9c46655cceb1263ed8d5e8ef0d0f703b881a443 (patch) | |
tree | dfdc4417013de556455105f0012fba95b6d3fde7 /docs | |
parent | 6654a22891abb31fab2a68e9b67d2c3e46f79d69 (diff) | |
download | gtk+-d9c46655cceb1263ed8d5e8ef0d0f703b881a443.tar.gz |
Added XML-structured TODO file. python script to turn TODO.xml into pretty
Wed Feb 23 22:59:50 2000 Owen Taylor <otaylor@redhat.com>
* TODO.xml: Added XML-structured TODO file.
* docs/make-todo: python script to turn TODO.xml into
pretty XML output.
Diffstat (limited to 'docs')
-rwxr-xr-x | docs/make-todo | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/docs/make-todo b/docs/make-todo new file mode 100755 index 0000000000..498a1e8a41 --- /dev/null +++ b/docs/make-todo @@ -0,0 +1,340 @@ +#!/usr/bin/python + +import xmllib; +import sys; +import string +import re + +def html_subst(s): + if s.group(1) != None: + return s.group(0) + elif s.group(2) != None: + return '<a href="' + s.group(0) + '">' + s.group(0) + '</a>' + elif s.group(3) != None: + return '<a href="mailto:' + s.group(0) + '">' + s.group(0) + '</a>' + +def htmlify(str): + return re.sub ("(<[^>]*>)|(http://[~.:/\w-]+)|([\w._!-]+@[\w_-]+).[\w_-]+", html_subst, str) + +def bug_subst(s): + if s.group(1) != None: + return s.group(0) + else: + n = s.group(2) + return '<a href="http://bugs.gnome.org/db/%s/%s.html">#%s</a>' % (n[0:2], n, n) + +def bugify(str): + str = re.sub ("(<[^>]*>)|#(\d+)", bug_subst, str) + return htmlify(str) + +def make_id(str): + return re.sub ("[^a-z]","-", string.lower(str)) + +class ParseError (Exception): + pass + +class Entry: + def __init__(self): + self.description = None + self.title = None + self.url = None + self.contact = None + self.bugs = None + + def set_size(self, size): + size = string.lower(size) + if size == "small": + self.size = "Small" + elif size == "medium": + self.size = "Medium" + elif size == "big": + self.size = "Big" + else: + raise ParseError, 'size must be "small", "medium", or "big"' + + def output(self): + if self.size == "Big": + bgcolor = "#88bb88" + elif self.size == "Medium": + bgcolor = "#b4d4b4" + else: + bgcolor = "#d0e0d0" + + print '''<table cellspacing="0" cellpadding="2" width="97%%" border="0" bgcolor="#000000"> + <tbody><tr><td colspan=2> + <table cellspacing="0" cellpadding="5" width="100%%" border="0" bgcolor="#ffffff"> + <tbody> + <tr bgcolor="%s"> + <td align="left"><font size="+1">%s</font></font></td> + <td align="left" width="20%%"><b>Size</b>: %s</td> + <td align="center" width="20%%"><b>Status</b>: %s</td> + <td align="right" width="20%%"><b>Target Version</b>: %s</td> + </tr> + <tr> + <td colspan=4> + %s + <table cellspacing="0" cellpadding="0"> + <tbody>''' % (bgcolor, self.title, self.size, self.status, self.target, htmlify(self.description)) + + if self.url != None: + print '''<tr><td width="0"><b>More Info</b>:</td> + <td>%s</td> + </tr>''' % htmlify (self.url) + + if self.bugs != None: + print '''<tr><td width="0"><b>Bug Reports</b>:</td> + <td>%s</td> + </tr>''' % bugify (self.bugs) + + if self.contact != None: + print '''<tr><td width="0"><b>Contact</b>:</td> + <td>%s</td> + </tr>''' % htmlify (self.contact) + + print '''</tbody> + </table> + </td> + </tr> + </tbody></table> + </td></tr></tbody></table> +''' + +class Section: + def __init__(self): + self.title = None + self.entries = [] + + def output(self): + + print '<h2><a name="%s">%s</a></h2>' % (make_id(self.title), self.title) + + first = 1 + for entry in self.entries: + if not first: + print "<br>" + first = 0 + entry.output() + +class TodoParser (xmllib.XMLParser): + def __init__(self): + xmllib.XMLParser.__init__(self) + + self.in_todo = 0 + self.in_data = 0 + self.data = "" + self.section = None + self.entry = None + self.sections = [] + + self.entitydefs = {} + + def start_todo(self,attributes): + if self.in_todo: + raise ParseError, "<todo> tags may not be nested" + self.in_todo = 1 + + def end_todo(self): + self.in_todo = 0 + + def start_section(self,attributes): + if self.section: + raise ParseError, "<section> tags may not be nested" + + self.section = Section() + + def end_section(self): + if self.section.title == None: + raise ParseError, "<section> requires <title>" + + self.sections.append(self.section) + self.section = None + + def start_title(self,attributes): + if not self.section and not self.entry: + raise ParseError, "<title> tag must be in <section> or <entry>" + if self.in_data: + raise ParseError, "Unexpected <title> tag in content" + self.in_data = 1 + + def end_title(self): + self.in_data = 0 + if self.entry: + self.entry.title = self.data + self.data = "" + else: + self.section.title = self.data + self.data = "" + + def start_description(self,attributes): + if not self.entry: + raise ParseError, "<description> tag must be in <entry>" + if self.in_data: + raise ParseError, "Unexpected <description> tag in content" + self.in_data = 1 + + def end_description(self): + self.in_data = 0 + self.entry.description = self.data + self.data = "" + + def start_url(self,attributes): + if not self.entry: + raise ParseError, "<url> tag must be in <entry>" + if self.in_data: + raise ParseError, "Unexpected <url> tag in content" + self.in_data = 1 + + def end_url(self): + self.in_data = 0 + self.entry.url = self.data + self.data = "" + + def start_contact(self,attributes): + if not self.entry: + raise ParseError, "<contact> tag must be in <contact>" + if self.in_data: + raise ParseError, "Unexpected <contact> tag in content" + self.in_data = 1 + + def end_contact(self): + self.in_data = 0 + self.entry.contact = self.data + self.data = "" + + def start_bugs(self,attributes): + if not self.entry: + raise ParseError, "<bugs> tag must be in <bugs>" + if self.in_data: + raise ParseError, "Unexpected <bugs> tag in content" + self.in_data = 1 + + def end_bugs(self): + self.in_data = 0 + self.entry.bugs = self.data + self.data = "" + + def start_entry(self,attributes): + if not self.section: + raise ParseError, "<entry> tag must be in <section>" + if self.entry: + raise ParseError, "<entry> tags may not be nested" + + self.entry = Entry() + + if not attributes.has_key("size"): + raise ParseError, '"size" attribute required for entry' + self.entry.set_size(attributes["size"]) + + if not attributes.has_key("status"): + raise ParseError, '"status" attribute (completion percentage) required for entry' + self.entry.status=attributes["status"] + + if not attributes.has_key("target"): + raise ParseError, '"target" attribute (target version) required for entry' + self.entry.target=attributes["target"] + + def end_entry(self): + if self.entry.title == None: + raise ParseError, "<entry> requires <title>" + + if self.entry.description == None: + raise ParseError, "<entry> requires <description>" + + self.section.entries.append(self.entry) + self.entry = None + + def handle_data(self,data): + if self.in_data: + self.data = self.data + data + + def unknown_starttag(self,tag,attributes): + if not self.in_data: + raise ParseError, "Unexpected start tag: " + tag + else: + self.data = self.data + "<" + tag + for (key,val) in attributes.items(): + self.data = self.data + ' %s="%s"' % (key,val) + self.data = self.data + ">" + + def unknown_endtag(self,tag): + if not self.in_data: + raise ParseError, "Unexpected end tag: " + tag + else: + self.data = self.data + "</%s>" % tag + + def syntax_error(self, err): + if re.match("reference to unknown entity", err): + pass + else: + xmllib.XMLParser.syntax_error (self, err) + + def unknown_entityref(self,ref): + if not self.in_data: + raise ParseError, "Unknown entity &" + ref + ";" + else: + self.data = self.data + "&" + ref + ";" + +file = open(sys.argv[1]) +parser = TodoParser() + +lineno = 1 +while 1: + line = file.readline() + if line == "": + break + + try: + parser.feed(line) + except ParseError, err: + sys.stderr.write("Parse error at line " + `lineno` + ": " + err.__str__() + "\n") + sys.exit(1) + except RuntimeError, err: + sys.stderr.write(err.__str__() + "\n") + sys.exit(1) + + lineno = lineno + 1 + +parser.close() + +print '''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<html> +<head> +<title>GTK+ TODO List</title> +</head> +<body bgcolor="#ffffff"> +<table width="100%" cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr valign="top"> + <td> + <h1>GTK+ TODO List</h1>''' + + +for section in parser.sections: + ntasks = len(section.entries) + id = make_id (section.title) + if ntasks == 1: + print '<a href="#%s">%s</a> (1 item)<br>' % (id,section.title) + else: + print '<a href="#%s">%s</a> (%d items)<br>' % (id,section.title,ntasks) + +print ''' + </td> + <td align="right"> + <img src="gtk-logo-rgb.gif" alt="GTK+ Logo"></img> + </td> + </tr> + </tbody> +</table> +''' + +first = 1 +for section in parser.sections: + if not first: + print "<br><br>" + first = 0 + section.output() + +print '''</body> +</html>''' + + |