作りかけのclass HTML

d:id:imait:20090210:1234266258で公開したSessionを簡単に試せるように、HTMLクラスも公開しておきます。これは、HTMLを一々書きたくないから作ってるんですが、"%s"を使った置き換えの方がスマートなんではないかと思ったりしているところ。

最終的には、リストを渡したらul/olリストを、辞書を渡したらdlリストを、また2次元配列でtableを生成するくらいまでやりたいと思うけど、まあそのへんは将来の課題。

以下にソースをのせときます。

# -*- coding: utf-8 -*-
'''
Class for assist to make HTML
'''
import Cookie

class HTML:
    '''Class to make HTML code.'''

    def __init__(self, encode='utf-8', lang='en', sitetitle=u'Untitled Site', \
                 pagetitle=u'Untitled', titledelimiter=u' :: ', \
                 cssfiles=None, jsfiles=None, cookie=None):
        self.encode = encode
        self.lang = lang
        self.sitetitle = sitetitle
        self.pagetitle = pagetitle
        self.titledelimiter = titledelimiter
        self.cssfiles = cssfiles
        self.jsfiles = jsfiles
        self.cookie = cookie


    # setters

    def set_encode(self, encode):
        self.encode = encode

    def set_lang(self, lang):
        self.lang = lang

    def set_site_title(self, sitetitle):
        self.sitetitle = sitetitle

    def set_page_title(self, pagetitle):
        self.pagetitle = pagetitle

    def set_cookie(self, cookie):
        self.cookie = cookie


    # printers

    def print_resp_header(self):
        if self.encode == u'' or not isinstance(self.encode, basestring):
            print(u'Content-Type: text/html')
        else:
            print(u'Content-Type: text/html; charset=' + self.encode)

        if isinstance(self.cookie, Cookie.SimpleCookie):
            print self.cookie.output()

        print(u'')

    def print_html_header(self):
        dtd = u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n' + \
              u'\t"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
        print(dtd)
        print(u'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="' + \
              self.lang + '" lang="' + self.lang + '">')
        print(u'<head>')
        print(u'<meta http-equiv="Content-Style-Type" content="text/css" />')
        print(u'<meta http-equiv="Content-Script-Type" content="text/javascript" />')
        print(u'<title>' + self.pagetitle + u' ' + self.titledelimiter + \
              u' ' + self.sitetitle + u'</title>')

        if isinstance(self.cssfiles, list):
            for cssfile in self.cssfiles:
                print(u'<link rel="stylesheet" type="text/css" href="' + \
                      cssfile + \
                      u'" />')
        elif isinstance(self.cssfiles, basestring):
            print(u'<link rel="stylesheet" type="text/css" href="' + \
                  self.cssfiles + \
                  u'" />')

        if isinstance(self.jsfiles, list):
            for jsfile in self.jsfiles:
                print(u'<script type="text/javascript" src="' + \
                      jsfile + \
                      u'"></script>')
        elif isinstance(self.jsfiles, basestring):
            print(u'<script type="text/javascript" src="' + \
                  self.jsfiles + \
                  u'"></script>')

        print(u'</head>')
        print(u'<body>')

    def print_html_close(self):
        print(u'</body>\n</html>')


    # elements

    def p(self, content, attrs=None):
        return self._create_element(u'p', content, attrs)

    def a(self, content, attrs=None):
        return self._create_element(u'a', content, attrs)

    def div(self, content, attrs=None):
        return self._create_element(u'div', content, attrs)


    # internal methods

    def _create_start_tag(self, elemname, attrs=None):
        starttag = u'<' + elemname

        if isinstance(attrs, dict):
            for attrname in (attrs.keys()):
                starttag = starttag + u' ' + attrname + u'="' + \
                           attrs[attrname] + u'"'
        starttag = starttag + u'>'

        return starttag

    def _create_end_tag(self, elemname):
        endtag = u'</' + elemname + u'>'
        return endtag

    def _create_element(self, elemname, content, attrs=None):
        starttag = self._create_start_tag(elemname, attrs)
        endtag = self._create_end_tag(elemname)
        return starttag + content + endtag