2002-08-31 18:17:02 +00:00
|
|
|
#!@PYTHON@
|
2002-04-29 20:53:02 +00:00
|
|
|
import formatter
|
|
|
|
import htmllib
|
|
|
|
import os
|
|
|
|
import os.path
|
|
|
|
import sgmllib
|
|
|
|
import string
|
|
|
|
import sys
|
|
|
|
|
|
|
|
base_dict = {
|
|
|
|
'glib' : 'http://developer.gnome.org/doc/API/glib/',
|
|
|
|
'gdk' : 'http://developer.gnome.org/doc/API/gdk/',
|
|
|
|
'gtk' : 'http://developer.gnome.org/doc/API/gtk/',
|
|
|
|
'gdk-pixbuf' : 'http://developer.gnome.org/doc/API/gdk-pixbuf/',
|
|
|
|
'glib-2.0' : 'http://developer.gnome.org/doc/API/2.0/glib/',
|
|
|
|
'gobject-2.0' : 'http://developer.gnome.org/doc/API/2.0/gobject/',
|
|
|
|
'atk' : 'http://developer.gnome.org/doc/API/2.0/atk/',
|
|
|
|
'pango' : 'http://developer.gnome.org/doc/API/2.0/pango/',
|
|
|
|
'gdk-2.0' : 'http://developer.gnome.org/doc/API/2.0/gdk/',
|
|
|
|
'gtk-2.0' : 'http://developer.gnome.org/doc/API/2.0/gtk/',
|
|
|
|
'gdk-pixbuf-2.0' : 'http://developer.gnome.org/doc/API/2.0/gdk-pixbuf/',
|
|
|
|
'gnome-vfs-2.0' : 'http://developer.gnome.org/doc/API/2.0/gnome-vfs/',
|
|
|
|
'libxml-2' : 'http://xmlsoft.org/html/',
|
|
|
|
'libgnome' : 'http://developer.gnome.org/doc/API/2.0/libgnome/',
|
|
|
|
'libgnomeui' : 'http://developer.gnome.org/doc/API/2.0/libgnomeui/',
|
|
|
|
}
|
|
|
|
|
|
|
|
def does_dict_have_keys (dict, keys):
|
|
|
|
for key in keys:
|
|
|
|
if not dict.has_key (key):
|
|
|
|
return 0
|
|
|
|
if len(dict) != len(keys):
|
|
|
|
return 0
|
|
|
|
return 1
|
|
|
|
|
|
|
|
class BookParser (sgmllib.SGMLParser):
|
|
|
|
def __init__ (self):
|
|
|
|
sgmllib.SGMLParser.__init__ (self)
|
|
|
|
self.a = self.parents = []
|
|
|
|
self.dict = {}
|
|
|
|
self.last = self.link = ""
|
|
|
|
self.is_a = self.level = 0
|
|
|
|
self.first = 1
|
|
|
|
|
|
|
|
def unknown_starttag (self, tag, attrs):
|
|
|
|
if tag == 'a':
|
|
|
|
self.is_a = 1
|
|
|
|
for attr in attrs:
|
|
|
|
if attr[0] == "href":
|
|
|
|
self.link = attr[1]
|
|
|
|
break
|
|
|
|
|
|
|
|
if tag in ['dd', 'ul']:
|
|
|
|
self.parents.append (self.last)
|
|
|
|
self.level = self.level + 1
|
|
|
|
|
|
|
|
def unknown_endtag (self, tag):
|
|
|
|
if tag == 'a':
|
|
|
|
self.is_a = 0
|
|
|
|
|
|
|
|
if tag in ['dd', 'ul']:
|
|
|
|
self.level = self.level - 1
|
|
|
|
self.parents.pop()
|
|
|
|
|
|
|
|
def handle_data (self, data):
|
|
|
|
data = string.strip (data)
|
|
|
|
if not data or data in [ ">", "<" ]:
|
|
|
|
return
|
|
|
|
|
|
|
|
if self.first:
|
|
|
|
self.dict['name'] = data
|
|
|
|
self.first = 0
|
|
|
|
return
|
|
|
|
|
|
|
|
if data == self.dict['name'] or data in [ "Next Page", "Previous Page", "Home", "Next"]:
|
|
|
|
return
|
|
|
|
|
|
|
|
if len (self.parents) == 0:
|
|
|
|
dict = self.dict
|
|
|
|
elif len (self.parents) == 1:
|
|
|
|
dict = self.dict[self.parents[0]]
|
|
|
|
elif len (self.parents) == 2:
|
|
|
|
dict = self.dict[self.parents[0]][self.parents[1]]
|
|
|
|
elif len (self.parents) == 3:
|
|
|
|
dict = self.dict[self.parents[0]][self.parents[1]][self.parents[2]]
|
|
|
|
else:
|
|
|
|
dict = None
|
|
|
|
|
|
|
|
if self.is_a:
|
|
|
|
if dict == None:
|
|
|
|
return
|
|
|
|
|
|
|
|
if not dict.has_key (data):
|
|
|
|
dict[data] = {}
|
|
|
|
if not dict.has_key ('order'):
|
|
|
|
dict['order'] = []
|
|
|
|
dict['order'].append (data)
|
|
|
|
dict[data]['link'] = self.link
|
|
|
|
|
|
|
|
self.last = data
|
|
|
|
|
|
|
|
class FunctionParser (htmllib.HTMLParser):
|
|
|
|
SKIP_DATA = [ "Next Page", "Previous Page", "Home", "Next", "Up", "<", ">", "Figure 1", "[1]"]
|
|
|
|
is_a = 0
|
|
|
|
a = []
|
|
|
|
link = ""
|
|
|
|
def anchor_bgn (self, href, name, type):
|
|
|
|
self.is_a = 1
|
|
|
|
self.link = href
|
|
|
|
|
|
|
|
def anchor_end (self):
|
|
|
|
self.is_a = 0
|
|
|
|
|
|
|
|
def handle_data (self, data):
|
|
|
|
data = string.strip (data)
|
|
|
|
if data in self.SKIP_DATA:
|
|
|
|
return
|
|
|
|
|
|
|
|
if not '#' in self.link:
|
|
|
|
return
|
|
|
|
|
|
|
|
if self.link[:2] == "..":
|
|
|
|
return
|
|
|
|
|
|
|
|
if self.is_a and self.link:
|
|
|
|
self.a.append ((data, self.link))
|
|
|
|
|
|
|
|
def parse_file_for_functions (fd):
|
|
|
|
try:
|
|
|
|
p = FunctionParser (formatter.NullFormatter ())
|
|
|
|
p.feed (fd.read ())
|
|
|
|
p.close ()
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
raise SystemExit
|
|
|
|
return p.a
|
|
|
|
|
|
|
|
def output_chapter (fd, main_dict, level=1):
|
|
|
|
if not main_dict.has_key ('order'):
|
|
|
|
return
|
|
|
|
|
|
|
|
for sub in main_dict['order']:
|
|
|
|
dict = main_dict[sub]
|
|
|
|
|
|
|
|
if not does_dict_have_keys (dict, ['link']):
|
|
|
|
fd.write (' '*(level*4))
|
|
|
|
fd.write ('<sub name="%s" link="%s">\n' % (sub, dict['link']))
|
|
|
|
output_chapter (fd, dict, level+1)
|
|
|
|
fd.write (' '*(level*4))
|
|
|
|
fd.write ('</sub>\n')
|
|
|
|
else:
|
|
|
|
fd.write (' '*(level*4))
|
|
|
|
fd.write ('<sub name="%s" link="%s"/>\n' % (sub, dict['link']))
|
|
|
|
|
|
|
|
def get_functions (dir):
|
|
|
|
function_list = []
|
|
|
|
|
|
|
|
for file in os.listdir (dirname):
|
|
|
|
if file[-5:] != ".html":
|
|
|
|
continue
|
|
|
|
|
|
|
|
fd = open (dirname + os.sep + file)
|
|
|
|
functions = parse_file_for_functions (fd)
|
|
|
|
|
|
|
|
for function in functions:
|
|
|
|
if not function in function_list:
|
|
|
|
function_list.append (function)
|
|
|
|
return function_list
|
|
|
|
|
|
|
|
def get_index_filename (dir):
|
|
|
|
dir = os.path.abspath (dir)
|
|
|
|
|
|
|
|
filename = dir + os.sep + 'index.html'
|
|
|
|
if os.path.exists (filename):
|
|
|
|
return filename
|
|
|
|
|
|
|
|
filename = dir + os.sep + 'book1.html'
|
|
|
|
if os.path.exists (filename):
|
|
|
|
return filename
|
|
|
|
else:
|
|
|
|
raise SystemExit, "Can't find an index file"
|
|
|
|
|
|
|
|
def output_xml (fd, filename, bookname, version):
|
|
|
|
global base_dict
|
|
|
|
|
|
|
|
templ = \
|
|
|
|
'<book title="%(title)s"\n' \
|
|
|
|
' name="%(name)s"\n%(version)s' \
|
|
|
|
' base="%(base)s"\n' \
|
|
|
|
' link="%(link)s">\n\n'
|
|
|
|
|
|
|
|
|
|
|
|
link = os.path.basename (filename)
|
|
|
|
|
|
|
|
input_fd = open (filename)
|
|
|
|
p = BookParser ()
|
|
|
|
p.feed (input_fd.read ())
|
|
|
|
p.close ()
|
|
|
|
|
|
|
|
fd.write ('<?xml version="1.0"?>\n')
|
|
|
|
|
|
|
|
full = book_full_name (bookname, version)
|
|
|
|
if base_dict.has_key (full):
|
|
|
|
base = base_dict[full]
|
|
|
|
else:
|
|
|
|
base = ""
|
|
|
|
|
|
|
|
if version:
|
|
|
|
version = ' version="%s"\n' % version
|
|
|
|
|
|
|
|
fd.write (templ % { 'title' : p.dict['name'],
|
|
|
|
'name' : bookname,
|
|
|
|
'version' : version,
|
|
|
|
'base' : base,
|
|
|
|
'link' : link })
|
|
|
|
|
|
|
|
fd.write ('<chapters>\n')
|
|
|
|
output_chapter (fd, p.dict)
|
|
|
|
fd.write ('</chapters>\n\n')
|
|
|
|
|
|
|
|
fd.flush ()
|
|
|
|
|
|
|
|
def output_functions (fd, dirname):
|
|
|
|
functions = get_functions (dirname)
|
|
|
|
functions.sort ()
|
|
|
|
|
|
|
|
fd.write ('<functions>\n')
|
|
|
|
for name, link in functions:
|
|
|
|
fd.write (' <function name="%s" link="%s"/>\n' % (name, link))
|
|
|
|
fd.write ('</functions>\n\n')
|
|
|
|
|
|
|
|
def dirname_to_bookname (dirname):
|
|
|
|
dirname = os.path.basename (dirname)
|
|
|
|
if string.find (dirname, '-') == -1:
|
|
|
|
return (dirname, "")
|
|
|
|
else:
|
|
|
|
pos = string.rfind (dirname, '-')
|
|
|
|
return (dirname[:pos], dirname[pos+1:])
|
|
|
|
|
|
|
|
def book_full_name (book, version):
|
|
|
|
if version:
|
|
|
|
return "%s-%s" % (book, version)
|
|
|
|
else:
|
|
|
|
return book
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if len (sys.argv) != 2 and \
|
|
|
|
len (sys.argv) != 3:
|
|
|
|
print 'Usage: %s dirname [output]' % sys.argv[0]
|
|
|
|
raise SystemExit
|
|
|
|
|
|
|
|
index_filename = get_index_filename (sys.argv[1])
|
|
|
|
dirname = os.path.abspath (sys.argv[1])
|
|
|
|
book, version = dirname_to_bookname (sys.argv[1])
|
|
|
|
if len (sys.argv) != 2:
|
|
|
|
if sys.argv[2] == "-s":
|
|
|
|
fd = sys.stdout
|
|
|
|
else:
|
|
|
|
output_filename = sys.argv[2]
|
|
|
|
fd = open (output_filename, 'w')
|
|
|
|
else:
|
|
|
|
output_filename = book_full_name (book, version) + '.devhelp'
|
|
|
|
fd = open (output_filename, 'w')
|
|
|
|
|
|
|
|
output_xml (fd, index_filename, book, version)
|
|
|
|
output_functions (fd, dirname)
|
|
|
|
fd.write ('</book>\n')
|
|
|
|
fd.close ()
|
|
|
|
|
|
|
|
|