forked from AuroraMiddleware/gtk
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.
This commit is contained in:
parent
6654a22891
commit
d9c46655cc
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
@ -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>
|
2000-02-23 Jonathan Blandford <jrb@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
* gtk/gtkstyle.c (gtk_default_draw_handle): add a 'paned' mode to
|
||||||
|
236
TODO.xml
Normal file
236
TODO.xml
Normal file
@ -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 <otaylor@redhat.com></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 <otaylor@redhat.com></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 <timj@gtk.org></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>
|
340
docs/make-todo
Executable file
340
docs/make-todo
Executable file
@ -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>'''
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user