+++ /dev/null
-#!/usr/bin/env python
-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 ()
-
-