]> Pileus Git - ~andy/gtk/commitdiff
Added XML-structured TODO file. python script to turn TODO.xml into pretty
authorOwen Taylor <otaylor@redhat.com>
Thu, 24 Feb 2000 04:03:49 +0000 (04:03 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Thu, 24 Feb 2000 04:03:49 +0000 (04:03 +0000)
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.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
TODO.xml [new file with mode: 0644]
docs/make-todo [new file with mode: 0755]

index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
index 27306256e564a6a1761dde4b2617bc3b8a8ad588..652bb532c6926e0c881473a3d16b48e78c7db91b 100644 (file)
@@ -1,3 +1,9 @@
+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. 
+
 2000-02-23  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
diff --git a/TODO.xml b/TODO.xml
new file mode 100644 (file)
index 0000000..0ab270c
--- /dev/null
+++ b/TODO.xml
@@ -0,0 +1,236 @@
+<todo>
+
+  <section>
+    <title>GDK</title>
+
+    <entry size="medium" status="70%" target="1.4">
+      <title>Add backing store support</title>
+      <description>
+       <p>
+         GTK+'s drawing model involves clearing to a background, and
+         then drawing widgets on top of this. Without having
+         backing-store support, this results in flickering in various
+         situations. Backing store cannot be added widget-by-widget,
+         because the drawing in a particular window is not confined
+         to a single widget. Instead it needs to be added per GDK
+         window. 
+       </p>
+       <p>
+         The way this is done is by having
+         <tt>gdk_window_begin_paint()</tt>
+         and <tt>gdk_window_end_paint()</tt> functions that
+         redirect all drawing to a particular window to an offscreen
+         pixmap, and then copy that offscreen pixmap back onto the
+         screen when the paint operation is done. The implementation
+         of this is mostly complete in the <tt>gtk-no-flicker</tt> branch of
+         GTK+.
+       </p>
+      </description>
+      <url>http://www.gtk.org/~otaylor/gtk/1.4/gdk-drawing.html</url>
+      <contact>Owen Taylor &lt;otaylor@redhat.com&gt;</contact>
+    </entry>
+
+    <entry size="medium" status="70%" target="1.4">
+      <title>32 Bit Coordinates</title>
+      <description>
+       <p>
+         GTK+-1.2 and earlier share X's limitation on the
+         size of coordinates and restrict all dimensions
+         to 16 bit quantities. By clever use of X it is
+         possible to lift this restriction and present a
+         full 32-bit space to the user.
+       </p>
+      </description>
+      <url>http://www.gtk.org/~otaylor/gtk/1.4/gdk-drawing.html</url>
+      <contact>Owen Taylor &lt;otaylor@redhat.com&gt;</contact>
+    </entry>
+
+    <entry size="small" status="0%" target="1.4">
+      <title>Customizable double-click timeout</title>
+      <description>
+       <p>
+         The current fixed double-click timeout in GTK+
+         is too small for some users. This needs to be
+         customizable
+       </p>
+      </description>
+      <contact>gtk-devel-list@redhat.com</contact>
+      <bugs>#3958</bugs>
+    </entry>
+  </section>
+
+  <section>
+    <title>Internationalization</title>
+    
+    <entry size="big" status="0%" target="1.4">
+      <title>Integrate Pango</title>
+      <description>
+       <p>
+         The purpose of the Pango project is to provide a system for
+         layout and rendering of internationlized text. It handles
+         most of the issues necessary to 
+       </p>
+      </description>
+      <url>http://www.pango.org</url>
+      <contact>gtk-i18n-list@redhat.com</contact>
+    </entry>
+
+    <entry size="medium" status="20%" target="1.4">
+      <title>Switch to using UTF-8</title>
+      <description>
+       <p>
+         This is closely related to Pango integration. Pango deals
+         with all strings in terms of UTF-8; by switching GTK+ over
+         to UTF-8 we make it considerably simpler for developers to
+         support multiple languages properly while still retaining
+         a large degree of compatiblity with existing programs.
+       </p>
+       <p>
+         Some work has already been done on this as part of the Win32
+         port, since the Win32 port is currently using UTF-8 for all
+         strings. In general, this should be an easy job; the hardest
+         parts are places like GtkFileSelection, cut and paste, and
+         input method support where there is interaction between GTK+
+         and the operating system.
+       </p>
+      </description>
+      <contact>gtk-i18n-list@redhat.com</contact>
+    </entry>
+
+    <entry size="big" status="0%" target="1.4">
+      <title>Rewrite Input Method Support</title>
+      <description>
+       <p>
+         Current support for Input Methods is done via XIM, with
+         supported styles being over-the-spot and the root-window
+         styles. However, the over-the-spot style is not going to
+         work well with the Pango integration, since it relies on the
+         text rendering in the program being done in the standard
+         Xlib style, so it will be necessary to also support
+         on-the-spot input. On-the-spot input is done by supplying a
+         set of callbacks that are invoked by the input methods.
+       </p>
+       <p>
+         While adding the above support, it may be desirable to
+         generalize the input-method support to the point where 
+       </p>
+      </description>
+      <contact>gtk-i18n-list@redhat.com</contact>
+    </entry>
+  </section>
+
+  <section>
+    <title>GTK+ Core</title>
+
+    <entry size="big" status="25%" target="1.4">
+      <title>Split GtkObject out</title>
+      <description>
+       <p>
+         The GTK+ object system is already in use in quite a few different
+         non-GUI applications; it would be desirable for these uses
+         to have the object system separated from the GUI portions
+         of GTK+.
+       </p>
+      </description>
+      <contact>Tim Janik &lt;timj@gtk.org&gt;</contact>
+    </entry>
+
+    <entry size="big" status="0%" target="1.4">
+      <title>Allow argument customization</title>
+      <description>
+       <p>
+         Many types of object arguments (expander style in the CList,
+         default padding in button boxes, etc), conceptually go with
+         the theme, or as user preferences; they should not be set by
+         a particular program.
+       </p>
+       <p>
+         There needs to be a mechanism for themes to be able to
+         control these arguments from the RC file. 
+       </p>
+      </description>
+    </entry>
+
+    <entry size="medium" status="0%" target="1.4">
+      <title>Allow global customization</title>
+      <description>
+       <p>
+         There are a number of global parameters in GTK+ and GDK that should be
+         customizable by the user, such as the double-click timeout,
+         or whether widgets should be backing-stored by default. 
+       </p>
+       <p>
+         If we had argument customization from an RC file, it might
+         be possible to do this simply with a global object with
+         arguments for the various global parameters that was
+         customized in the same fashion as object arguments.
+       </p>
+      </description>
+    </entry>
+  </section>
+
+  <section>
+    <title>GTK+ Widgets</title>
+
+    <entry size="small" status="0%" target="1.4">
+      <title>Make GtkFrame use a label</title>
+      <description>
+       <p>
+         The title of a frame should simply be another child widget
+         which, by default, holds a label widget. This will important
+         with Pango where proper text behavior will be more complex to
+         implement, but is also useful for certain user-interface
+         designs. (It can be useful, for example, to put a checkbutton
+         in that slot.)
+       </p>
+      </description>
+      <contact>gtk-devel-list@redhat.com</contact>
+    </entry>
+
+    <entry size="big" status="50%" target="1.4">
+      <title>Replace GtkText Widget</title>
+      <description>
+       <p>
+         The GtkText widget is badly in need of replacement, since it is
+         buggy and insufficiently feature rich. There are a number
+         of possible candidates for a replacement, with the most
+         promising at the current time being Havoc Pennington's
+         (hp@redhat.com) port of the Tk Text widget.
+       </p>
+       <p>
+         As part of this job it will be necessary to add
+         <a href="http://www.pango.org">Pango</a> support to the
+         replacement. The structure of the Tk text widget port seems
+         suited to this as it works paragraph-by-paragraph, and
+         Pango works at a sub-paragraph scale.
+       </p>
+      </description>
+      <contact>gtk-devel-list@redhat.com</contact>
+    </entry>
+
+    <entry size="big" status="0%" target="> 1.4">
+      <title>Add unified set of List/Tree/Grid widgets</title>
+      <description>
+       <p>
+         Currently, GTK+ has a large number of list and tree widgets
+         (GtkList, GtkTree, GtkCList, GtkCTree), non of which are
+         ideal. The GtkList and GtkTree widgets perform badly on large
+         sets. (GtkTree widget is also quite buggy.) GtkCList
+         and GtkCTree mostly solve the size problem, but are quite
+         complex and, despite that, not very flexible. They are limited to
+         displaying pixmaps and text, and neither support arbitrary
+         widgets nor custom drawing functions.
+       </p>
+       <p>
+         In addition to list and tree widgets, a closely related need
+         is a sheet widget that displays a (possibly editable) 2-D grid.
+         It would be desirable to have a complete set of widgets that
+         could be presented as the one-true-solution for these needs.
+         Model/View techniques could be used effectively to increase
+         both the simplicity and power of the interfaces.
+       </p>
+      </description>
+      <contact>gtk-devel-list@redhat.com</contact>
+    </entry>
+  </section>
+</todo>
diff --git a/docs/make-todo b/docs/make-todo
new file mode 100755 (executable)
index 0000000..498a1e8
--- /dev/null
@@ -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>'''
+    
+