[Site] Patch ht2html

Stefano e.tino a email.it
Gio 31 Ago 2006 17:13:00 CEST


Allego al messaggio la patch sostanziale per ht2html personalizzato per 
python.it.

Come stabilito un po' di tempo fa:

- sono state eliminate le classi *CSS e le personalizzazioni sono state 
portate all'interno delle classi Banner, Sidebar, Skeletron.

- nell'occasione le classi in questione sono state pulite da ogni 
riferimento a codice HTML relativo a tag di presentazione (tipo 
background ecc...). Ora il codice è molto più semplice e lineare.

- Ho modificato la classe PDONewGenerator, che ancora deve essere 
utilizzata per la generazione del sito. Al prossimo giro la sostituisco 
a PDOGenerator.

- Nella classe sono stati aggiunti i riferimenti alla validazione XHTMl 
e CSS. Il codice generato è valido, tranne nel caso in cui i file .ht e 
.h di partenza contengono codice errato.

- E' stato modificato anche style.css ma ancora non è valido.

TODO
- allineare i file ht e h a codice XHTML valido (quelli della root 
principale)
- revisionare i fogli di stile a css valido
- aggiungere i credits
- aggiungere le informazione sul copyright per lo stile (non ho trovato 
riferimenti a copyright sul sito python.org non se Manlio vuoi postare 
nella ML di sviluppo del sito per avere una risposta - scusa ma il mio 
inglese scritto lascia un po' desiderare ;-) )

Riprenderò lo sviluppo non appena fatto il commit della patch.

Saluti
Stefano
-------------- parte successiva --------------
Index: trunk/python.it/links.h
===================================================================
--- trunk/python.it/links.h	(revision 208)
+++ trunk/python.it/links.h	(working copy)
@@ -2,7 +2,7 @@
 <li><a href="doc/intro.html">Che cos'è Python?</a>
 <h3>Versioni Python
     <img alt="[off-site link]" border="0" class="offsitelink"
-         height="15" src="./pics/offsite.gif" width="17"></h3>
+         height="15" src="./pics/offsite.gif" width="17" /></h3>
 <li><a href="http://www.python.org/2.4/">Python 2.4</a> <a href="http://www.python.org/dev/doc/devel/">(docs)</a> 
 <li><a href="http://www.python.org/2.3.4/">Python 2.3</a> <a href="http://www.python.org/doc/2.3.4/">(docs)</a> 
 <li><a href="http://www.python.org/download/download_mac.html">MacPython</a> 
Index: trunk/python.it/styles/style.css
===================================================================
--- trunk/python.it/styles/style.css	(revision 208)
+++ trunk/python.it/styles/style.css	(working copy)
@@ -26,6 +26,10 @@
 	margin: 0;
 	padding: 0;
 }
+
+a>img { 
+	border: 0px;
+	}
 
 #page {
 	width: 100%;
@@ -199,15 +203,23 @@
 
 
 /* This avoids the white border around the page in MSIE. */
-html                 { border: 0px;
-                       margin: 0px;
-                       padding: 0px; }
+html { 
+	border: 0px;
+    margin: 0px;
+    padding: 0px; 
+	}
 
-.continuation        { margin-left: 1em;
-                       margin-right: 1em; }
+.continuation { 
+	margin-left: 1em;
+    margin-right: 1em; 
+}
 
 
 /* additional rules */
-img.offsitelink { border: 0 }
+img.offsitelink { 
+	border: 0 
+}
 
-dt { font-weight: bolder }
+dt { 
+	font-weight: bolder 
+}
Index: trunk/scripts/ht2html/Banner.py
===================================================================
--- trunk/scripts/ht2html/Banner.py	(revision 208)
+++ trunk/scripts/ht2html/Banner.py	(working copy)
@@ -1,4 +1,4 @@
-"""Generate a site links table for use in a banner.
+"""Generate a site links table for use in a banner.
 """
 
 import sys
@@ -7,8 +7,9 @@
 except IOError:
     from StringIO import StringIO
 
-class Banner:
-    def __init__(self, links, cols=4):
+class Banner:
+    
+    def __init__(self, links):
         """Initialize the Banner instance.
 
         This class is intended to be a mixin-class with Skeleton.
@@ -19,12 +20,7 @@
 
         """
         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()
@@ -37,45 +33,28 @@
             sys.stdout = stdout
         return html.getvalue()
 
-    def __start_table(self):
-        print '<!-- start of site links table -->'
-        print '<table width="100%" border="0"'
-        print self.get_banner_attributes()
-        print '       bgcolor="%s">' % (
-            self.get_bgcolor())
-        print '<tr>'
+    def __start_table(self):
+        print '<ul>'
+
+    def __end_table(self):
+        print '</ul>'
 
-    def __end_table(self):
-        print '</tr>'
-        print '</table><!-- end of site links table -->'
-
-    def __do_table(self):
-        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)
-            if col >= self.__cols:
-                # break the row
-                print '</tr><tr>'
-                col = 0
-            print '    <td bgcolor="%s">' % self.get_lightshade()
-            print s
-            print '    </td>'
-            col = col + 1
-        # fill rest of row with non-breaking spaces.
-        while col and col < self.__cols:
-            print '    <td bgcolor="%s">' % self.get_lightshade()
-            print '&nbsp;&nbsp;</td>'
-            col = col + 1
-
-
+    def __do_table(self):
+        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>'
+
+
 from Skeleton import _Skeleton
 
 class _Banner(_Skeleton, Banner):
@@ -85,7 +64,8 @@
     def get_banner(self):
         return Banner.get_banner(self)
 
-if __name__ == '__main__':
+if __name__ == '__main__':
+    from ht2html import __version__
     t = _Banner([('page1.html', 'First Page'),
                  ('page2.html', 'Second Page'),
                  ('page3.html', 'Third Page'),
Index: trunk/scripts/ht2html/PDONewGenerator.py
===================================================================
--- trunk/scripts/ht2html/PDONewGenerator.py	(revision 208)
+++ trunk/scripts/ht2html/PDONewGenerator.py	(working copy)
@@ -1,4 +1,4 @@
-"""
+"""
 ht2html Style class per creare python.it.
 
 Stefano Giraldi <e.tino a email.it>
@@ -19,9 +19,6 @@
 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
@@ -41,340 +38,8 @@
     ('%(rootdir)s/help/',  '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):
-        # XXX TODO use XHTML instead?
-        """Return the HTML <head> stuff."""
-        print '''\
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-%(xmlstyle)s<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
-<!-- 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()
-        #~ added css reference for print media
-        printsheet = self.get_printsheet()
-        #~ added referce for favicon
-        favicon = self.get_favicon()
-        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" media="screen">\n' \
-                % (stylesheet, type)
-        #~ added css reference for print media
-        if printsheet and printsheet.strip():
-            printsheet = printsheet.strip()
-            type = self.get_stylesheet_type(printsheet)
-            s = s + '<link rel="stylesheet" href="%s" type="%s" media="print">\n' \
-                %(printsheet, type)
-        if favicon and favicon.strip():
-            favicon = favicon.strip()
-            s = s + '<link rel="shortcut icon" type="image/ico" href="%s" />\n'\
-                %(favicon)
-        if localstyle and localstyle.strip():
-            localstyle = '<style type="text/css">\n%s\n</style>' \
-                         % localstyle.strip()
-            if stylesheet or printsheet:
-                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):
-        print '<ul>'
-
-    def __end_table(self):
-        print '</ul>'
-
-    def __do_table(self):
-        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):
-        print '<!-- start of sidebar -->'
-        print '<ul>'
-
-    def __finish(self):
-        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):
+           
+class PDONewGenerator(Skeleton, Sidebar, Banner):
     AUTHOR = 'webmaster a python.it'
 
     def __init__(self, file, rootdir, relthis):
@@ -386,30 +51,26 @@
         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))
+        p.process_sidebar()
+        #~ Sezione Crediti e link validatori XHTML e CSS
+        p.sidebar.append('Crediti')
+        p.sidebar.append(('http://www.python.org/', 
+                            'Pyhton Powered'))
+        p.sidebar.append(('http://validator.w3.org/check?uri=referer', 
+                            'Valid XHTML 1.0 Strict'))
+        p.sidebar.append(('http://jigsaw.w3.org/css-validator/', 
+                            'Valid CSS W3C'))
         self.__linkfixer.massage(p.sidebar, self.__d)
-        SidebarCSS.__init__(self, p.sidebar)
+        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)
-        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" 
+        Banner.__init__(self, sitelinks)
         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)
@@ -430,60 +91,38 @@
         else:
             return s2
 
-    def get_stylesheet(self):
-        #~ return posixpath.join('/style.css')
-        return posixpath.join(self.__d['rootdir'], 'styles/style.css')
-        
-    def get_printsheet(self):
-        #~ return stylesheet for print media called by SkeletronCSS.__do_style()
-        return posixpath.join(self.__d['rootdir'], 'styles/print.css')
-    def get_favicon(self):
-        #~ return favicon reference
-        return posixpath.join(self.__d['rootdir'], 'styles/favicon.ico')
-
     def get_title(self):
         return self.__parser.get('title')
-
+
+    def get_stylesheet(self):
+        #~ return posixpath.join('/style.css')
+        return posixpath.join(self.__d['rootdir'], 'styles/style.css')
+        
+    def get_printsheet(self):
+        #~ return stylesheet for print media called by SkeletronCSS.__do_style()
+        return posixpath.join(self.__d['rootdir'], 'styles/print.css')
+
+    def get_favicon(self):
+        #~ return favicon reference
+        return posixpath.join(self.__d['rootdir'], 'styles/favicon.ico')
+
     def get_sidebar(self):
         if self.__parser.get('wide-page', 'no').lower() == 'yes':
             return None
-        return SidebarCSS.get_sidebar(self)
+        return Sidebar.get_sidebar(self)
 
     def get_banner(self):
-        return BannerCSS.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>''' % \
+    <img alt="" 
+         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
@@ -511,15 +150,5 @@
                 # 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'
Index: trunk/scripts/ht2html/Sidebar.py
===================================================================
--- trunk/scripts/ht2html/Sidebar.py	(revision 208)
+++ trunk/scripts/ht2html/Sidebar.py	(working copy)
@@ -1,4 +1,4 @@
-"""Sidebar generator.
+"""Sidebar generator.
 """
 
 import sys
@@ -9,7 +9,8 @@
 BLANKCELL = (None, '&nbsp;')
 
 
-class Sidebar:
+class Sidebar:
+    
     def __init__(self, links):
         """Initialize the Sidebar instance.
 
@@ -25,7 +26,7 @@
 
         """
         self.links = links
-
+
     def get_sidebar(self):
         stdout = sys.stdout
         html = StringIO()
@@ -37,7 +38,7 @@
         finally:
             sys.stdout = stdout
         return html.getvalue()
-
+
     def get_validated(self):
         return """<tr><td bgcolor="%s">
         <center>
@@ -46,48 +47,40 @@
         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):
-        print '<!-- start of sidebar table -->'
-        print '<table width="100%" border="0" cellspacing="0" cellpadding="3"'
-        print '       bgcolor="%s">' % self.get_bgcolor()
-
-    def __finish(self):
-        print '</table><!-- end of sidebar table -->'
-
-    def __do_link(self):
-        done_one = 0
-        for item in self.links:
-            if type(item) == StringType:
-                # category header
-                if done_one:
-                    # get some separation between header and last item
-                    print '<tr><td bgcolor="%s">&nbsp;' % (
-                        self.get_lightshade())
-                else:
-                    done_one = 1
-                print '<tr><td bgcolor="%s"><b><font color="%s">' % (
-                    self.get_darkshade(), self.get_bgcolor())
-                print item
-                print '</font></b></td></tr>'
-            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)
-                print '<tr><td bgcolor="%s">' % self.get_lightshade()
-                print '%s%s' % (s, extra)
-                print '</td></tr>'
-
-
+
+    def __start_table(self):
+        print '<!-- start of sidebar -->'
+        print '<ul>'
+
+    def __finish(self):
+        print '</ul><!-- end of sidebar -->'
+
+
+    def __do_link(self):
+        done_one = 0
+        for item in self.links:
+            if type(item) == StringType:
+                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)
+                print '<li class="items">' 
+                print '%s%s' % (s, extra)
+                print '</li>'
+
+
 from Skeleton import _Skeleton
 from Banner import _Banner
-
+
 class _Sidebar(_Skeleton, _Banner, Sidebar):
     def __init__(self, sitelinks, toclinks):
         _Banner.__init__(self, sitelinks)
@@ -100,7 +93,8 @@
         return _Banner.get_banner(self)
 
 
-if __name__ == '__main__':
+if __name__ == '__main__':
+    from ht2html import __version__
     t = _Sidebar(
         # banner links
         [('page1.html', 'First Page'),
@@ -132,7 +126,7 @@
          ('help.html', 'python-help a python.org'),
          (None, 'For help with Website:'),
          ('web.html', 'webmaster a python.org'),
-         (None, '<br>'),
+         (None, '<br/>'),
          ('pp.html', '[Python Powered]'),
          ])
 
Index: trunk/scripts/ht2html/Skeleton.py
===================================================================
--- trunk/scripts/ht2html/Skeleton.py	(revision 208)
+++ trunk/scripts/ht2html/Skeleton.py	(working copy)
@@ -1,4 +1,4 @@
-"""Skeleton class.
+"""Skeleton class.
 
 Should be sub-classed to provide basic generation of able-contained HTML
 document.
@@ -16,33 +16,70 @@
     #
     # for sub-classes to override
     #
-
+    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" />' \
+               % __main__.__version__
+
+    def get_headers(self):
+        """Return extra header information.  Must be a string."""
+        return ''
+
+    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_printsheet(self):
+        """Return filename of CSS stylesheet."""
+        return ''
+
+    def get_favicon(self):
+        """Return filename of CSS stylesheet."""
+        return ''
+
+    def get_link_type(self, filename):
+        ext = os.path.splitext(filename)[1]
+        if ext == ".css":
+            return "text/css"
+        elif ext in (".xsl", ".xslt"):
+            return "text/xslt"
+        elif ext == ".ico":
+            return "image/ico"
+
+        else:
+            raise ValueError("unknown stylesheet language")
+
+    def get_body_style(self):
+        if self.get_stylesheet():
+            # If there's an external stylesheet, rely on that for the body.
+            return ''
+        else:
+            return 'margin: 0px;'
+
+
+    def get_style(self):
+        """Return the style sheet for this document"""
+        s = self.get_body_style()
+        if s:
+            return 'body { %s }' % self.body_style()
+        else:
+            return ''
+
     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.
 
@@ -72,284 +109,174 @@
         """
         return None
 
-    def get_title(self):
-        """Return the title of the page.  Required."""
-        return 'Intentionally left blank'
+    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_styles(self):
+        # assemble all the style information we have to produce the
+        # appropriate LINK and STYLE elements
+        stylesheet = self.get_stylesheet()
+        #~ added css reference for print media
+        printsheet = self.get_printsheet()
+        #~ added referce for favicon
+        favicon = self.get_favicon()
+        #~ reference to localstyle
+        localstyle = self.get_style()
+        s = ''
+        if stylesheet and stylesheet.strip():
+            stylesheet = stylesheet.strip()
+            type = self.get_link_type(stylesheet)
+            s = '<link rel="stylesheet" href="%s" type="%s" media="screen" />\n' \
+                % (stylesheet, type)
+        #~ added css reference for print media
+        if printsheet and printsheet.strip():
+            printsheet = printsheet.strip()
+            type = self.get_link_type(printsheet)
+            s = s + '<link rel="stylesheet" href="%s" type="%s" media="print" />\n' \
+                %(printsheet, type)
+        if favicon and favicon.strip():
+            favicon = favicon.strip()
+            type = self.get_link_type(favicon)
+            s = s + '<link rel="shortcut icon" href="%s" type="%s" />\n'\
+                %(favicon, type)
+        if localstyle and localstyle.strip():
+            localstyle = '<style type="text/css">\n%s\n</style>' \
+                         % localstyle.strip()
+            if stylesheet or printsheet:
+                s = s + "\n" + localstyle
+            else:
+                s = localstyle
+        return s
+
+    def __do_head(self):
+        # XXX TODO use XHTML instead?
+        """Return the HTML <head> stuff."""
+        print '''\
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- 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
+-->
+<html>
+<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(),
+              }
+              
+    def __start_body(self):
+        print "<body>"
+
+    def __finish_all(self):
+        print '</div></body></html>'
+
 
-    def get_meta(self):
-        """Return extra meta-data.  Must be a string."""
-        import __main__
-        return '<meta name="generator" content="HT2HTML/%s">' \
-               % __main__.__version__
+    # 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 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 table -->'
-            print ('<table width="100%" border="0"'
-                   ' cellspacing="0" cellpadding="0">')
-            if banner is not None:
-                print '<!-- start of banner row -->'
-                print '<tr>'
-                if corner is not None:
-                    self.__do_corner(corner)
-                print '<!-- start of banner -->'
-                print '<td width="%s%%" bgcolor="%s" class="banner">' % (
-                    self.get_banner_width(), self.get_lightshade())
-                print banner
-                print '</td><!-- end of banner -->'
-                print '</tr><!-- end of banner row -->'
-            # 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:
-                print '</table><!-- end of page table -->'
-                closed = 1
-            else:
-                print '<tr><!-- start of sidebar/body row -->'
-                self.__do_sidebar(sidebar)
-            if body is not None:
-                if closed:
-                    print body
-                else:
-                    self.__do_body(body)
-            if not closed:
-                print '</tr><!-- end of sidebar/body row -->'
-                print '</table><!-- end of page table -->'
-            if cont is not None:
-                self.__do_cont(cont)
-            self.__finish_all()
-        finally:
-            sys.stdout = stdout
-        return html.getvalue()
-
-    def __do_corner(self, corner):
-        print '<!-- start of corner cells -->'
-        print '<td width="150" valign="middle" bgcolor="%s" class="corner">' \
-              % 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,
-        print '</td>'
-        print '<td width="15" bgcolor="%s">&nbsp;&nbsp;</td><!--spacer-->' % (
-            self.get_lightshade())
-        print '<!-- end of corner cells -->'
-
-    def __do_sidebar(self, sidebar):
-        print '<!-- start of sidebar cells -->'
-        print '<td width="150" valign="top" bgcolor="%s" class="sidebar">' % (
-            self.get_lightshade())
-        print sidebar
-        print '</td>'
-        print '<td width="15">&nbsp;&nbsp;</td><!--spacer-->'
-        print '<!-- end of sidebar cell -->'
-
-    def __do_body(self, body):
-        print '<!-- start of body cell -->'
-        print '<td valign="top" width="%s%%" class="body"><br>' % (
-            self.get_banner_width())
-        print body
-        print '</td><!-- end of body cell -->'
-
-    def __do_cont(self, cont):
-        print '<div class="body">'
-        print '<div class="continuation">'
-        print '<!-- start of continued wide-body text -->'
-        print cont
-        print '<!-- end of continued wide-body text -->'
-        print '</div>'
-        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(),
-            }
-
-    def __finish_all(self):
-        print '</body></html>'
-
-
-
 # test script
-class _Skeleton(Skeleton):
+class _Skeleton(Skeleton):
+
+    def get_stylesheet(self):
+        import posixpath
+        #~ return posixpath.join('/style.css')
+        return posixpath.join('styles/style.css')
+        
+    def get_printsheet(self):
+        import posixpath
+        #~ return stylesheet for print media called by SkeletronCSS.__do_style()
+        return posixpath.join('styles/print.css')
+
+    def get_favicon(self):
+        import posixpath
+        #~ return favicon reference
+        return posixpath.join('styles/favicon.ico')
+
     def get_banner(self):
         return '<b>The Banner</b>'
 
     def get_sidebar(self):
-        return '''<ul><li>Sidebar line 1
-        <li>Sidebar line 2
-        <li>Sidebar line 3
+        return '''<ul><li>Sidebar line 1</li>
+        <li>Sidebar line 2</li>
+        <li>Sidebar line 3</li>
         </ul>'''
 
     def get_corner(self):
-        return '<center><em>CORNER</em></center>'
+        return None
 
     def get_body(self):
         return 'intentionally left blank ' * 110
@@ -357,13 +284,7 @@
     def get_cont(self):
         return 'wide stuff ' * 100
 
-    def get_corner_bgcolor(self):
-        return 'yellow'
 
-    def get_banner_width(self):
-        return "80"
-
-
 if __name__ == '__main__':
     t = _Skeleton()
     print t.makepage()


Maggiori informazioni sulla lista Site