Html Writer#

Question#

ADDQUESTION

Solution#

"""
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
"""

class TreeNode(list):
    def __init__(self, tag, wrapper_node=None, **kwds):
        super(TreeNode, self).__init__()
        self._wrap = wrapper_node
        self._tag = tag
        self._attrs = kwds

    def _render_attrs(self):
        if self._attrs:
            return ' ' + ' '.join('%s="%s"' % attr for attr in self._attrs.items())
        else:
            return ''

    def _render(self, depth=0):
        depthStr = " " * (depth * 4)
        result = [depthStr + '<%s%s>' % (self._tag, self._render_attrs())]
        for content in self:
            try:
                content = content._render(depth=depth+1)
            except AttributeError:
                content = str(content)
            if self._wrap:
                result.append(self._wrap(content)._render(depth=depth+1))
            else:
                result.append(content)
        result.append(depthStr + '</%s>' % self._tag)
        return '\n'.join(result)

    def __str__(self):
        return self._render()

class Document(TreeNode):
    def __init__(self, title):
        super(Document, self).__init__('body')
        self._title = title

    def _render(self, depth=0):
        html = TreeNode('html', lang='en')
        head = TreeNode('head')
        titleNode = TreeNode('title')
        titleNode.append(self._title)
        head.append(titleNode)
        html.append(head)
        body = super(Document, self)._render(depth+1)
        html.append(body)
        return html._render(depth=depth)

def _create_tag(tag, wrapper_node=None, use_list=False):
    def _tag(content=None, *args, **kwds):
        t = TreeNode(tag=tag, wrapper_node=wrapper_node, *args, **kwds)
        if content:
            if use_list:
                t.extend(content)
            else:
                t.append(content)
        return t
    return _tag

Paragraph = _create_tag('p')
Heading = _create_tag('h1')
Subheading = _create_tag('h2')
Row = _create_tag('tr', wrapper_node=_create_tag('td'), use_list=True)
HeadingRow = _create_tag('tr', wrapper_node=_create_tag('th'), use_list=True)
Table = _create_tag('table')



if __name__ == '__main__':
    # A simple example that creates a basic HTML document 
    # and outputs it to file.html

    doc = Document("Hello World")
    doc.append(Heading("This is a heading"))
    doc.append(Subheading("This is a subheading"))
    doc.append(Paragraph("This is a paragraph"))
    t = Table(cellpadding="10", border="1")
    t.append(HeadingRow(["Col1", "Col2", "Col3"]))
    t.append(Row(["Column1", "Column2", "Column3"]))
    doc.append(t)
    print(doc)
##    f=open('file.html', 'w')
##    f.write(doc)
##    f.close()
    

Explanation#