[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 ' </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 ' ',
- 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"> ' % (
-#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, ' ')
-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"> ' % (
- 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 ' ',
+ 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 ' ',
- else:
- print corner,
- print '</td>'
- print '<td width="15" bgcolor="%s"> </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"> </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