[Commits] python.it commit r153 - www/branches/python/scripts/ht2html

commit a svn.python.it commit a svn.python.it
Ven 19 Maggio 2006 18:49:21 CEST


Author: manlio
Date: Fri May 19 18:49:21 2006
New Revision: 153

Modified:
   www/branches/python/scripts/ht2html/PDONewGenerator.py
Log:
correzione da parte di Stefano

Modified: www/branches/python/scripts/ht2html/PDONewGenerator.py
==============================================================================
--- www/branches/python/scripts/ht2html/PDONewGenerator.py	(original)
+++ www/branches/python/scripts/ht2html/PDONewGenerator.py	Fri May 19 18:49:21 2006
@@ -1,494 +1,554 @@
-"""
-ht2html Style class per creare python.it.
-
-Stefano Giraldi <e.tino a email.it>
-
-$Id$
-"""
-
-import os
-import posixpath
-#~ import whrandom
-
-from Skeleton import Skeleton
-from Sidebar import Sidebar, BLANKCELL
-from Banner import Banner
-from HTParser import HTParser
-from LinkFixer import LinkFixer
-#~ per SkeletonCSS
-from ht2html import __version__
-from types import StringType
-
-from cStringIO import StringIO
-import sys
-import time
-
-
-classversion = '0.0.2'
-
-sitelinks = [
-    ('%(rootdir)s',  'Home'),
-    ('%(rootdir)sdownload/',  'Download'),
-    ('%(rootdir)sdoc/',       'Documentazione'),
-    ('%(rootdir)sfaq/',  'FAQ'),
-    ('%(rootdir)shelp/',  'Aiutaci!!!'),
-    ]
-
-class SkeletonCSS(Skeleton):
-
-    def get_meta(self):
-        """Return extra meta-data.  Must be a string."""
-        import __main__
-        return '<meta name="generator" content="HT2HTML/%s">' \
-               % __version__
-    def get_body_attributes(self):
-        """Return extra attributes for the body start tag."""
-        # These are not supported in HTML, but are needed for
-        # Netscape 4
-        return None
-
-    def get_banner_attributes(self):
-        """Return extra attributes for the TABLE in the banner."""
-        return None
-
-    def get_charset(self):
-        """Return charset of pages"""
-        return 'us-ascii'
-
-    # Style sheets
-    def get_stylesheet(self):
-        """Return filename of CSS stylesheet."""
-        return ''
-
-
-    def get_stylesheet_pi(self):
-        s = self.get_stylesheet()
-        if s:
-            return '<?xml-stylesheet href="%s" type="%s"?>\n' \
-                   % (s, self.get_stylesheet_type(s))
-        else:
-            return ''
-
-    def get_stylesheet_type(self, filename):
-        ext = os.path.splitext(filename)[1]
-        if ext == ".css":
-            return "text/css"
-        elif ext in (".xsl", ".xslt"):
-            return "text/xslt"
-        else:
-            raise ValueError("unknown stylesheet language")
-
-    def get_style(self):
-        """Return the style sheet for this document"""
-        s = self.body_style()
-        if s:
-            return 'body { %s }' % self.body_style()
-        else:
-            return ''
-
-    def body_style(self):
-        if self.get_stylesheet():
-            # If there's an external stylesheet, rely on that for the body.
-            return ''
-        else:
-            return 'margin: 0px;'
-
-    # Call this method
-    def makepage(self):
-        banner = self.get_banner()
-        sidebar = self.get_sidebar()
-        corner = self.get_corner()
-        body = self.get_body()
-        cont = self.get_cont()
-        html = StringIO()
-        stdout = sys.stdout
-        closed = 0
-        try:
-            sys.stdout = html
-            self.__do_head()
-            self.__start_body()
-            print '<!-- start of page -->'
-            print '<div id="page">'
-
-            if banner is not None:
-                print '<!-- start of banner -->'
-                print '<div id="banner">'
-                if corner is not None:
-                    self.__do_corner(corner)
-                print banner
-                print '</div><!-- end of banner -->'
-            # if there is a body but no sidebar, then we'll just close the
-            # table right here and put the body (and any cont) in the full
-            # page.  if there is a sidebar but no body, then we still create
-            # the new row and just populate the body cell with a non-breaking
-            # space.  Watch out though because we don't want to close the
-            # table twice
-            if sidebar is None:
-                closed = 1
-            else:
-                print '<div id="sidebar"><!-- start of sidebar -->'
-                self.__do_sidebar(sidebar)
-                print '</div><!-- end sidebar -->'
-            if body is not None:
-                print '<div id="body"><!-- start of body -->'
-                if closed:
-                    print body
-                else:
-                    self.__do_body(body)
-                print '</div><!-- end of body -->'
-            if cont is not None:
-                print '<div id="cont"><!-- start of cont-->'
-                self.__do_cont(cont)
-                print '</div><!-- start of cont-->'
-            self.__finish_all()
-        finally:
-            sys.stdout = stdout
-        return html.getvalue()
-
-    def __do_corner(self, corner):
-        if corner is None:
-            print '&nbsp;',
-        else:
-            print corner,
-
-    def __do_sidebar(self, sidebar):
-        print sidebar
-
-    def __do_body(self, body):
-        print body
-
-    def __do_cont(self, cont):
-        print cont
-
-    def __do_head(self):
-        """Return the HTML <head> stuff."""
-        print '''\
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-%(xmlstyle)s<html>
-<!-- THIS PAGE IS AUTOMATICALLY GENERATED.  DO NOT EDIT. -->
-<!-- %(time)s -->
-<!-- USING HT2HTML %(version)s -->
-<!-- SEE http://ht2html.sf.net -->
-<!-- User-specified headers:
-Title: %(title)s
-%(headers)s
--->
-
-<head>
-<title>%(title)s</title>
-<meta http-equiv="Content-Type" content="text/html; charset=%(charset)s">
-%(meta)s
-%(style)s
-</head>''' % {'title'   : self.get_title(),
-              'headers' : self.get_headers(),
-              'meta'    : self.get_meta(),
-              'time'    : time.ctime(time.time()),
-              'version' : __version__,
-              'charset' : self.get_charset(),
-              'style'   : self.__do_styles(),
-              'xmlstyle': self.get_stylesheet_pi()
-              }
-
-    def __do_styles(self):
-        # assemble all the style information we have to produce the
-        # appropriate LINK and STYLE elements
-        stylesheet = self.get_stylesheet()
-        localstyle = self.get_style()
-        s = ''
-        if stylesheet and stylesheet.strip():
-            stylesheet = stylesheet.strip()
-            type = self.get_stylesheet_type(stylesheet)
-            s = '<link rel="stylesheet" href="%s" type="%s">' \
-                % (stylesheet, type)
-        if localstyle and localstyle.strip():
-            localstyle = '<style type="text/css">\n%s\n</style>' \
-                         % localstyle.strip()
-            if stylesheet:
-                s = s + "\n" + localstyle
-            else:
-                s = localstyle
-        return s
-
-    def __start_body(self):
-        print "<body>"
-
-    def __finish_all(self):
-        print '</div></body></html>'
-
-
-
-
-class BannerCSS(Banner):
-    def __init__(self, links, cols=4):
-        """Initialize the Banner instance.
-
-        This class is intended to be a mixin-class with Skeleton.
-
-        links must be a list of 2-tuples of the form: (URL, text).  If URL is
-        None, then the text is not hyperlinked.  These are arranged in a table
-        in order, evenly in the specified number of columns.
-
-        """
-        self.__links = links
-        self.__cols = cols
-        rows, leftover = divmod(len(links), self.__cols)
-        if leftover:
-            rows = rows + 1
-        self.__rows = rows
-
-    def get_banner(self):
-        stdout = sys.stdout
-        html = StringIO()
-        try:
-            sys.stdout = html
-            self.__start_table()
-            self.__do_table()
-            self.__end_table()
-        finally:
-            sys.stdout = stdout
-        return html.getvalue()
-
-    def __start_table(self):
-        #~ Modificato
-        print '<ul>'
-
-    def __end_table(self):
-        #~ Modificato
-        print '</ul>'
-
-    def __do_table(self):
-        #~ Modificato
-        col = 0
-        for item in self.__links:
-            if len(item) == 3:
-                url, text, extra = item
-            else:
-                url, text = item
-                extra = ''
-            if not url:
-                s = text + extra
-            else:
-                s = '<a href="%s">%s</a>%s' % (url, text, extra)
-            print '<li>'
-            print s
-            print '</li>'
-            
-class SidebarCSS(Sidebar):
-    def __init__(self, links):
-        """Initialize the Sidebar instance.
-
-        This class is indented to be a mixin-class with Skeleton.
-
-        links must be a list of elements for the sidebar.  Each entry in the
-        list can either be a string, indicating that the entry is a category
-        header, or a 2-tuple of the form: (URL, text) indicating it is taken
-        as a link to include under the category.
-
-        If the entry is a two tuple, the URL can be None to indicate that
-        there is no link to that text.
-
-        """
-        self.links = links
-
-    def get_sidebar(self):
-        stdout = sys.stdout
-        html = StringIO()
-        try:
-            sys.stdout = html
-            self.__start_table()
-            self.__do_link()
-            self.__finish()
-        finally:
-            sys.stdout = stdout
-        return html.getvalue()
-
-    def get_validated(self):
-        return """<tr><td bgcolor="%s">
-        <center>
-        <a href="http://validator.w3.org/check/referer"><img border="0"
-        src="http://www.w3.org/Icons/valid-html401"
-        alt="Valid HTML 4.01!" height="31" width="88"%s</a></center>
-        </td></tr>
-        """ % (self.get_lightshade(), self.empty_tag_end)
-
-    def __start_table(self):
-#ste        print '<!-- start of sidebar table -->'
-#ste        print '<table width="100%" border="0" cellspacing="0" cellpadding="3"'
-#ste        print '       bgcolor="%s">' % self.get_bgcolor()
-        print '<!-- start of sidebar -->'
-        print '<ul>'
-
-    def __finish(self):
-#ste        print '</table><!-- end of sidebar table -->'
-        print '</ul><!-- end of sidebar -->'
-
-    def __do_link(self):
-        done_one = 0
-        for item in self.links:
-            if type(item) == StringType:
-                # category header
-#ste                if done_one:
-#ste                    # get some separation between header and last item
-#ste                    print '<tr><td bgcolor="%s">&nbsp;' % (
-#ste                        self.get_lightshade())
-#ste                else:
-#ste                    done_one = 1
-#ste                print '<tr><td bgcolor="%s"><b><font color="%s">' % (
-#ste                    self.get_darkshade(), self.get_bgcolor())
-#ste                print item
-#ste                print '</font></b></td></tr>'
-                print '<li class="group">'
-                print item
-                print '</li>'
-            else:
-                if len(item) == 3:
-                    url, text, extra = item
-                else:
-                    url, text = item
-                    extra = ''
-                if url is None:
-                    s = text
-                else:
-                    s = '<a href="%s">%s</a>' % (url, text)
-#ste                print '<tr><td bgcolor="%s">' % self.get_lightshade()
-#ste                print '%s%s' % (s, extra)
-#ste                print '</td></tr>'
-                print '<li class="items">' 
-                print '%s%s' % (s, extra)
-                print '</li>'
-
-
-class PDONewGenerator(SkeletonCSS, SidebarCSS, BannerCSS):
-    AUTHOR = 'webmaster a python.it'
-
-    def __init__(self, file, rootdir, relthis):
-        root, ext = os.path.splitext(file)
-        html = root + '.html'
-        p = self.__parser = HTParser(file, self.AUTHOR)
-        f = self.__linkfixer = LinkFixer(html, rootdir, relthis)
-        self.__body = None
-        self.__cont = None
-        # calculate the sidebar links, adding a few of our own
-        self.__d = {'rootdir': rootdir}
-        p.process_sidebar()
-        p.sidebar.append(BLANKCELL)
-        # it is important not to have newlines between the img tag and the end
-        # end center tags, otherwise layout gets messed up
-        p.sidebar.append(('%(rootdir)s', '''
-    <img alt="" border="0"
-         src="%(rootdir)s/pics/PythonPoweredSmall.gif">
-''' % self.__d))
-        self.__linkfixer.massage(p.sidebar, self.__d)
-        SidebarCSS.__init__(self, p.sidebar)
-        #
-        # fix up our site links, no relthis because the site links are
-        # relative to the root of our web pages
-        #
-        sitelink_fixer = LinkFixer(f.myurl(), rootdir)
-        sitelink_fixer.massage(sitelinks, self.__d, aboves=1)
-        BannerCSS.__init__(self, sitelinks)
-        # calculate the random corner
-        # XXX Should really do a list of the pics directory...
-        i = 0
-        #~ s = self.__d['rootdir']+"python-logo.gif" 
-        s = posixpath.join(self.__d['rootdir'], 'styles/images/python-logo.gif')
-        self.__d['banner'] = s
-        self.__whichbanner = i
-
-    def get_meta(self):
-        s1 = Skeleton.get_meta(self)
-        s2 = self.__parser.get('meta', '')
-        if s1 and s2:
-            return s1 + "\n" + s2
-        else:
-            return s1 or s2
-
-    def get_style(self):
-        s1 = Skeleton.get_style(self)
-        s2 = self.__parser.get('local-css')
-        if s1:
-            if s2:
-                return s1 + "\n" + s2
-            else:
-                return s1
-        else:
-            return s2
-
-    def get_stylesheet(self):
-        #~ return posixpath.join('/style.css')
-        return posixpath.join(self.__d['rootdir'], 'styles/style.css')
-
-    def get_title(self):
-        return self.__parser.get('title')
-
-    def get_sidebar(self):
-        if self.__parser.get('wide-page', 'no').lower() == 'yes':
-            return None
-        return SidebarCSS.get_sidebar(self)
-
-    def get_banner(self):
-        return BannerCSS.get_banner(self)
-
-    def get_banner_attributes(self):
-        return 'cellspacing="0" cellpadding="0"'
-
-    def get_corner(self):
-        # it is important not to have newlines between the img tag and the end
-        # anchor and end center tags, otherwise layout gets messed up
-        return '''
-    <a href="%(rootdir)s/" id="logolink">
-    <img alt="" border="0"
-         src="%(rootdir)s/%(banner)s"></a>''' % \
-    self.__d 
-
-    def get_corner_bgcolor(self):
-        # this may not be 100% correct.  it uses PIL to get the RGB values at
-        # the corners of the image and then takes a vote as to the most likely
-        # value.  Some images may be `bizarre'.  See .../pics/backgrounds.py
-        return [
-             '#3399ff',  '#6699cc',  '#3399ff',  '#0066cc',  '#3399ff', 
-             '#0066cc',  '#0066cc',  '#3399ff',  '#3399ff',  '#3399ff', 
-             '#3399ff',  '#6699cc',  '#3399ff',  '#3399ff',  '#ffffff', 
-             '#6699cc',  '#0066cc',  '#3399ff',  '#0066cc',  '#3399ff', 
-             '#6699cc',  '#0066cc',  '#6699cc',  '#3399ff',  '#3399ff', 
-             '#6699cc',  '#3399ff',  '#3399ff',  '#6699cc',  '#6699cc', 
-             '#0066cc',  '#6699cc',  '#0066cc',  '#6699cc',  '#0066cc', 
-             '#0066cc',  '#6699cc',  '#3399ff',  '#0066cc',  '#bbd6f1', 
-             '#0066cc',  '#6699cc',  '#3399ff',  '#3399ff',  '#0066cc', 
-             '#0066cc',  '#0066cc',  '#6699cc',  '#6699cc',  '#3399ff', 
-             '#3399ff',  '#6699cc',  '#0066cc',  '#0066cc',  '#6699cc', 
-             '#0066cc',  '#6699cc',  '#3399ff',  '#6699cc',  '#3399ff', 
-             '#d6ebff',  '#6699cc',  '#3399ff',  '#0066cc',
-             ][self.__whichbanner]
-
-    def get_body(self):
-        self.__grokbody()
-        return self.__body
-
-    def get_cont(self):
-        self.__grokbody()
-        return self.__cont
-
-    def __grokbody(self):
-        if self.__body is None:
-            text = self.__parser.fp.read()
-            i = text.find('<!--table-stop-->')
-            if i >= 0:
-                self.__body = text[:i]
-                self.__cont = text[i+17:]
-            else:
-                # there is no wide body
-                self.__body = text
-
-    # python.org color scheme overrides
-    def get_lightshade(self):
-        return '#99ccff'
-
-    def get_mediumshade(self):
-        return '#3399ff'
-
-    def get_darkshade(self):
-        return '#003366'
-
-    def get_charset(self):
-        return 'iso-8859-1'
+"""Generates the www.python.it website style
+    Realizzata da Stefano Giraldi <e.tino a email.it>
+    sulla base di PDOGenerator.py per ht2html
+"""
+
+import os
+import posixpath
+#~ import whrandom
+
+from Skeleton import Skeleton
+from Sidebar import Sidebar, BLANKCELL
+from Banner import Banner
+from HTParser import HTParser
+from LinkFixer import LinkFixer
+#~ per SkeletonCSS
+from ht2html import __version__
+
+from cStringIO import StringIO
+import sys
+import time
+
+sitelinks = [
+    ('%(rootdir)s/',  'Home'),
+    ('%(rootdir)s/download/',  'Download'),
+    ('%(rootdir)s/doc/',       'Documentazione'),
+    ('%(rootdir)s/faq/',  'FAQ'),
+    ('%(rootdir)s/help/',  'Aiutaci!!!'),
+    ]
+
+
+class SkeletonCSS(Skeleton):
+
+    def get_banner(self):
+        """Returns HTML for the top banner, or None if no banner.
+        """
+        return None
+
+    def get_left_sidebar(self):
+        """Returns HTML for the left sidebar or None.
+        """
+        return None
+    # for backwards compatibility
+    get_sidebar = get_left_sidebar
+
+    def get_right_sidebar(self):
+        """Returns HTML for the right sidebar or None.
+        """
+        return None
+
+    def get_banner_width(self):
+        """HTML `width' of banner column as a percentage.
+
+        Should be a string that does not include the percent sign (e.g. "90").
+        This affects the column containing both the banner and body text (if
+        they exist).
+        """
+        return '90'
+
+    def get_corner(self):
+        """Returns HTML for the upper-left corner or None.
+
+        Note that if get_banner() and get_sidebar() both return None, then
+        get_corner() is ignored.  Also if both get_banner() and get_sidebar()
+        return a string, but get_corner() returns None, the smallest blank
+        corner possible is emitted.
+        """
+        return None
+
+    def get_body(self):
+        """Returns HTML for the internal document body.
+
+        Note that using this method causes the get_sidebar() -- if there is
+        one -- to run the full height of the page.  If you don't want this,
+        then make sure get_cont() returns a string.
+        """
+        return '<b>Intentionally left blank</b>'
+
+    def get_cont(self):
+        """Returns HTML for the continuation of the body.
+
+        When this method returns a string, and there is a get_sidebar(), the
+        continuation text appears below the get_sidebar() and get_body() at
+        the full width of the screen.  If there is no get_sidebar(), then
+        having a get_cont() is pointless.
+        """
+        return None
+
+    def get_title(self):
+        """Return the title of the page.  Required."""
+        return 'Intentionally left blank'
+
+    def get_meta(self):
+        """Return extra meta-data.  Must be a string."""
+        import __main__
+        return '<meta name="generator" content="HT2HTML/%s">' \
+               % __version__
+
+    def get_headers(self):
+        """Return extra header information.  Must be a string."""
+        return ''
+
+    def get_bgcolor(self):
+        """Return the background color"""
+        return '#ffffff'
+
+    def get_fgcolor(self):
+        """Return foreground color"""
+        return '#000000'
+
+    def get_linkcolor(self):
+        """Return link color"""
+        return '#0000bb'
+
+    def get_vlinkcolor(self):
+        """Return vlink color"""
+        return '#551a8b'
+
+    def get_alinkcolor(self):
+        """Return alink color"""
+        return '#ff0000'
+
+    def get_corner_bgcolor(self):
+        """Return the background color for the corner"""
+        return self.get_lightshade()
+
+    # Barry's prefs
+    def get_lightshade(self):
+        """Return lightest of 3 color scheme shade."""
+        return '#cdba96'
+
+    def get_mediumshade(self):
+        """Return middle of 3 color scheme shade."""
+        return '#cc9966'
+
+    def get_darkshade(self):
+        """Return darkest of 3 color scheme shade."""
+        return '#b78900'
+
+    def get_body_attributes(self):
+        """Return extra attributes for the body start tag."""
+        # These are not supported in HTML, but are needed for
+        # Netscape 4
+        return 'marginwidth="0" marginheight="0"'
+
+    def get_banner_attributes(self):
+        """Return extra attributes for the TABLE in the banner."""
+        return 'cellspacing="0" cellpadding="2"'
+
+    def get_charset(self):
+        """Return charset of pages"""
+        return 'us-ascii'
+
+    # Style sheets
+    def get_stylesheet(self):
+        """Return filename of CSS stylesheet."""
+        return ''
+
+
+    def get_stylesheet_pi(self):
+        s = self.get_stylesheet()
+        if s:
+            return '<?xml-stylesheet href="%s" type="%s"?>\n' \
+                   % (s, self.get_stylesheet_type(s))
+        else:
+            return ''
+
+    def get_stylesheet_type(self, filename):
+        ext = os.path.splitext(filename)[1]
+        if ext == ".css":
+            return "text/css"
+        elif ext in (".xsl", ".xslt"):
+            return "text/xslt"
+        else:
+            raise ValueError("unknown stylesheet language")
+
+    def get_style(self):
+        """Return the style sheet for this document"""
+        s = self.body_style()
+        if s:
+            return 'body { %s }' % self.body_style()
+        else:
+            return ''
+
+    def body_style(self):
+        if self.get_stylesheet():
+            # If there's an external stylesheet, rely on that for the body.
+            return ''
+        else:
+            return 'margin: 0px;'
+
+    # Call this method
+    def makepage(self):
+        banner = self.get_banner()
+        sidebar = self.get_sidebar()
+        corner = self.get_corner()
+        body = self.get_body()
+        cont = self.get_cont()
+        html = StringIO()
+        stdout = sys.stdout
+        closed = 0
+        try:
+            sys.stdout = html
+            self.__do_head()
+            self.__start_body()
+            print '<!-- start of page -->'
+            print '<div id="page">'
+
+            if banner is not None:
+                print '<!-- start of banner -->'
+                print '<div id="banner">'
+                if corner is not None:
+                    self.__do_corner(corner)
+                print banner
+                print '</div><!-- end of banner -->'
+            # if there is a body but no sidebar, then we'll just close the
+            # table right here and put the body (and any cont) in the full
+            # page.  if there is a sidebar but no body, then we still create
+            # the new row and just populate the body cell with a non-breaking
+            # space.  Watch out though because we don't want to close the
+            # table twice
+            if sidebar is None:
+#ste                print '</table><!-- end of page table -->'
+                closed = 1
+            else:
+#ste                print '<tr><!-- start of sidebar/body row -->'
+                print '<div id="sidebar"><!-- start of sidebar -->'
+                self.__do_sidebar(sidebar)
+                print '</div><!-- end sidebar -->'
+            if body is not None:
+                print '<div id="body"><!-- start of body -->'
+                if closed:
+                    print body
+                else:
+                    self.__do_body(body)
+                print '</div><!-- end of body -->'
+#            if not closed:
+# ste               print '</tr><!-- end of sidebar/body row -->'
+# ste               print '</table><!-- end of page table -->'
+#                print '</div><!-- end of page-->'
+            if cont is not None:
+                print '<div id="cont"><!-- start of cont-->'
+                self.__do_cont(cont)
+                print '</div><!-- start of cont-->'
+            self.__finish_all()
+        finally:
+            sys.stdout = stdout
+        return html.getvalue()
+
+    def __do_corner(self, corner):
+#ste        print '<!-- start of corner cells -->'
+#ste        print '<td width="150" valign="middle" bgcolor="%s" class="corner">' \
+#ste              % self.get_corner_bgcolor()
+        # it is important not to have a newline between the corner text and
+        # the table close tag, otherwise layout is messed up
+        if corner is None:
+            print '&nbsp;',
+        else:
+            print corner,
+#ste        print '</td>'
+#ste        print '<td width="15" bgcolor="%s">&nbsp;&nbsp;</td><!--spacer-->' % (
+#ste            self.get_lightshade())
+#ste        print '<!-- end of corner cells -->'
+
+    def __do_sidebar(self, sidebar):
+#ste        print '<!-- start of sidebar cells -->'
+#ste        print '<td width="150" valign="top" bgcolor="%s" class="sidebar">' % (
+#ste            self.get_lightshade())
+        print sidebar
+#ste        print '</td>'
+#ste        print '<td width="15">&nbsp;&nbsp;</td><!--spacer-->'
+#ste        print '<!-- end of sidebar cell -->'
+
+    def __do_body(self, body):
+#ste        print '<!-- start of body cell -->'
+#ste        print '<td valign="top" width="%s%%" class="body"><br>' % (
+#ste            self.get_banner_width())
+#ste        print '<!-- start of side/content -->'
+#ste        print '<div id="sidecontent">'
+
+        print body
+#ste        print '</td><!-- end of body cell -->'
+#ste        print '</div><!-- end of side/content -->'
+
+    def __do_cont(self, cont):
+#ste       print '<div class="body">'
+#ste        print '<div class="continuation">'
+#ste        print '<!-- start of continued wide-body text -->'
+#ste        print '<div id="body">'
+#ste        print '<!-- start of continued wide-body text -->'
+        print cont
+#ste        print '<!-- end of continued wide-body text -->'
+#ste        print '</div>'
+#ste        print '</div>'
+
+    def __do_head(self):
+        """Return the HTML <head> stuff."""
+        print '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+%(xmlstyle)s<html>
+<!-- THIS PAGE IS AUTOMATICALLY GENERATED.  DO NOT EDIT. -->
+<!-- %(time)s -->
+<!-- USING HT2HTML %(version)s -->
+<!-- SEE http://ht2html.sf.net -->
+<!-- User-specified headers:
+Title: %(title)s
+%(headers)s
+-->
+
+<head>
+<title>%(title)s</title>
+<meta http-equiv="Content-Type" content="text/html; charset=%(charset)s">
+%(meta)s
+%(style)s
+</head>''' % {'title'   : self.get_title(),
+              'headers' : self.get_headers(),
+              'meta'    : self.get_meta(),
+              'time'    : time.ctime(time.time()),
+              'version' : __version__,
+              'charset' : self.get_charset(),
+              'style'   : self.__do_styles(),
+              'xmlstyle': self.get_stylesheet_pi(),
+              }
+
+    def __do_styles(self):
+        # assemble all the style information we have to produce the
+        # appropriate LINK and STYLE elements
+        stylesheet = self.get_stylesheet()
+        localstyle = self.get_style()
+        s = ''
+        if stylesheet and stylesheet.strip():
+            stylesheet = stylesheet.strip()
+            type = self.get_stylesheet_type(stylesheet)
+            s = '<link rel="stylesheet" href="%s" type="%s">' \
+                % (stylesheet, type)
+        if localstyle and localstyle.strip():
+            localstyle = '<style type="text/css">\n%s\n</style>' \
+                         % localstyle.strip()
+            if stylesheet:
+                s = s + "\n" + localstyle
+            else:
+                s = localstyle
+        return s
+
+    def __start_body(self):
+        #~ print '''\
+#~ <body bgcolor="%(bgcolor)s" text="%(fgcolor)s"
+      #~ %(extraattrs)s
+      #~ link="%(linkcolor)s"  vlink="%(vlinkcolor)s"
+      #~ alink="%(alinkcolor)s">''' % {
+            #~ 'bgcolor'   : self.get_bgcolor(),
+            #~ 'fgcolor'   : self.get_fgcolor(),
+            #~ 'linkcolor' : self.get_linkcolor(),
+            #~ 'vlinkcolor': self.get_vlinkcolor(),
+            #~ 'alinkcolor': self.get_alinkcolor(),
+            #~ 'extraattrs': self.get_body_attributes(),
+            #~ }
+        print "<body>"
+
+    def __finish_all(self):
+#ste        print '</body></html>'
+        print '</div></body></html>'
+
+
+
+
+class BannerCSS(Banner):
+    def __init__(self, links, cols=4):
+        """Initialize the Banner instance.
+
+        This class is intended to be a mixin-class with Skeleton.
+
+        links must be a list of 2-tuples of the form: (URL, text).  If URL is
+        None, then the text is not hyperlinked.  These are arranged in a table
+        in order, evenly in the specified number of columns.
+
+        """
+        self.__links = links
+        self.__cols = cols
+        rows, leftover = divmod(len(links), self.__cols)
+        if leftover:
+            rows = rows + 1
+        self.__rows = rows
+
+    def get_banner(self):
+        stdout = sys.stdout
+        html = StringIO()
+        try:
+            sys.stdout = html
+            self.__start_table()
+            self.__do_table()
+            self.__end_table()
+        finally:
+            sys.stdout = stdout
+        return html.getvalue()
+
+    def __start_table(self):
+        #~ Modificato
+        print '<ul>'
+
+    def __end_table(self):
+        #~ Modificato
+        print '</ul>'
+
+    def __do_table(self):
+        #~ Modificato
+        col = 0
+        for item in self.__links:
+            if len(item) == 3:
+                url, text, extra = item
+            else:
+                url, text = item
+                extra = ''
+            if not url:
+                s = text + extra
+            else:
+                s = '<a href="%s">%s</a>%s' % (url, text, extra)
+            print '<li>'
+            print s
+            print '</li>'
+
+class PDONewGenerator(SkeletonCSS, Sidebar, BannerCSS):
+    AUTHOR = 'webmaster a python.it'
+
+    def __init__(self, file, rootdir, relthis):
+        root, ext = os.path.splitext(file)
+        html = root + '.html'
+        p = self.__parser = HTParser(file, self.AUTHOR)
+        f = self.__linkfixer = LinkFixer(html, rootdir, relthis)
+        self.__body = None
+        self.__cont = None
+        # calculate the sidebar links, adding a few of our own
+        self.__d = {'rootdir': rootdir}
+        p.process_sidebar()
+        p.sidebar.append(BLANKCELL)
+        # it is important not to have newlines between the img tag and the end
+        # end center tags, otherwise layout gets messed up
+        p.sidebar.append(('%(rootdir)s', '''
+    <img alt="" border="0"
+         src="%(rootdir)s/pics/PythonPoweredSmall.gif">
+''' % self.__d))
+        self.__linkfixer.massage(p.sidebar, self.__d)
+        Sidebar.__init__(self, p.sidebar)
+        #
+        # fix up our site links, no relthis because the site links are
+        # relative to the root of our web pages
+        #
+        sitelink_fixer = LinkFixer(f.myurl(), rootdir)
+        sitelink_fixer.massage(sitelinks, self.__d, aboves=1)
+        Banner.__init__(self, sitelinks)
+        # calculate the random corner
+        # XXX Should really do a list of the pics directory...
+        i = 0
+        #~ s = self.__d['rootdir']+"python-logo.gif" 
+        s = posixpath.join(self.__d['rootdir'], 'styles/images/python-logo.gif')
+        self.__d['banner'] = s
+        self.__whichbanner = i
+
+    def get_meta(self):
+        s1 = Skeleton.get_meta(self)
+        s2 = self.__parser.get('meta', '')
+        if s1 and s2:
+            return s1 + "\n" + s2
+        else:
+            return s1 or s2
+
+    def get_style(self):
+        s1 = Skeleton.get_style(self)
+        s2 = self.__parser.get('local-css')
+        if s1:
+            if s2:
+                return s1 + "\n" + s2
+            else:
+                return s1
+        else:
+            return s2
+
+    def get_stylesheet(self):
+        #~ return posixpath.join('/style.css')
+        return posixpath.join(self.__d['rootdir'], 'styles/style.css')
+
+    def get_title(self):
+        return self.__parser.get('title')
+
+    def get_sidebar(self):
+        if self.__parser.get('wide-page', 'no').lower() == 'yes':
+            return None
+        return Sidebar.get_sidebar(self)
+
+    def get_banner(self):
+        return Banner.get_banner(self)
+
+    def get_banner_attributes(self):
+        return 'cellspacing="0" cellpadding="0"'
+
+    def get_corner(self):
+        # it is important not to have newlines between the img tag and the end
+        # anchor and end center tags, otherwise layout gets messed up
+        return '''
+    <a href="%(rootdir)s/" id="logolink">
+    <img alt="" border="0"
+         src="%(rootdir)s/%(banner)s"></a>''' % \
+    self.__d 
+
+    def get_corner_bgcolor(self):
+        # this may not be 100% correct.  it uses PIL to get the RGB values at
+        # the corners of the image and then takes a vote as to the most likely
+        # value.  Some images may be `bizarre'.  See .../pics/backgrounds.py
+        return [
+             '#3399ff',  '#6699cc',  '#3399ff',  '#0066cc',  '#3399ff', 
+             '#0066cc',  '#0066cc',  '#3399ff',  '#3399ff',  '#3399ff', 
+             '#3399ff',  '#6699cc',  '#3399ff',  '#3399ff',  '#ffffff', 
+             '#6699cc',  '#0066cc',  '#3399ff',  '#0066cc',  '#3399ff', 
+             '#6699cc',  '#0066cc',  '#6699cc',  '#3399ff',  '#3399ff', 
+             '#6699cc',  '#3399ff',  '#3399ff',  '#6699cc',  '#6699cc', 
+             '#0066cc',  '#6699cc',  '#0066cc',  '#6699cc',  '#0066cc', 
+             '#0066cc',  '#6699cc',  '#3399ff',  '#0066cc',  '#bbd6f1', 
+             '#0066cc',  '#6699cc',  '#3399ff',  '#3399ff',  '#0066cc', 
+             '#0066cc',  '#0066cc',  '#6699cc',  '#6699cc',  '#3399ff', 
+             '#3399ff',  '#6699cc',  '#0066cc',  '#0066cc',  '#6699cc', 
+             '#0066cc',  '#6699cc',  '#3399ff',  '#6699cc',  '#3399ff', 
+             '#d6ebff',  '#6699cc',  '#3399ff',  '#0066cc',
+             ][self.__whichbanner]
+
+    def get_body(self):
+        self.__grokbody()
+        return self.__body
+
+    def get_cont(self):
+        self.__grokbody()
+        return self.__cont
+
+    def __grokbody(self):
+        if self.__body is None:
+            text = self.__parser.fp.read()
+            i = text.find('<!--table-stop-->')
+            if i >= 0:
+                self.__body = text[:i]
+                self.__cont = text[i+17:]
+            else:
+                # there is no wide body
+                self.__body = text
+
+    # python.org color scheme overrides
+    def get_lightshade(self):
+        return '#99ccff'
+
+    def get_mediumshade(self):
+        return '#3399ff'
+
+    def get_darkshade(self):
+        return '#003366'
+
+    def get_charset(self):
+        return 'iso-8859-1'


More information about the Commits mailing list