Pythonで開発開始、名前はまだない

一昨日いっていた話の続き。職場で使うシステムをPythonで作ると決めて、そして実際に書き始めました。といっても、まだ全然進んでいなくて、HTMLの出力に役立つクラスを書き始めたところです。

こんな感じ:

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

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):
        self.encode = encode
        self.lang = lang
        self.sitetitle = sitetitle
        self.pagetitle = pagetitle
        self.titledelimiter = titledelimiter
        self.cssfiles = cssfiles
        self.jsfiles = jsfiles


    # 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 print_resp_header(self):
        if self.encode == '':
            print(u'Content-Type: text/html\n')
        else:
            print(u'Content-Type: text/html; charset=' + self.encode + u'\n')


    # printers

    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

参考にしたのは、Perlで広く使われているモジュール、CGI.pm日本語訳)で、これとPython標準のモジュールであるcgiを組み合わせようと思っています。

クラスやモジュール、変数等の名前は、PEP 8 -- Style Guide for Python Codeを参考にしています。クラスの名前も、最初はHTMLPrinterだったのだけど、managerとかが入ってくると要注意とのアドバイスを見たので、心を鬼にしてPrinterを落としました。

それが正しい選択かどうかはわかんない。

最終的にどう決着するかはわからないけど、このクラスは使い回しが利くよう、今作ろうとしているシステムの色がつかないようにしたいと思っています。なるたけ柔軟に使える、なるたけ標準的なXHTMLを出力するものができればいいけど、まああんまり最初から気負わないように、気楽に作っていくつもりです。