Html Formatter#

Question#

ADDQUESTION

Solution#

# written by Eric
# http://studiozero.proboards.com/index.cgi?board=opensrc&action=display&thread=10666

import sys

if sys.version.startswith('3'):
    from html.parser import HTMLParser
else:
    from html.parser import HTMLParser

class HTMLFormatter(HTMLParser):
    """Formats HTML"""
    
    def __init__(self):
        HTMLParser.__init__(self)
        self.tabbed = 0
        self.formatted = []

    def append(self, data):
        self.formatted.append(str(data))

    def _write_tabs(self):
        self.append('\t'*self.tabbed)

    def _format_attrs(self, attrs):
        fattrs = ""
        for a,v in attrs:
            fattrs = fattrs + " " + a + '="' + v.replace('"', '\\"') + '"'
        return fattrs
            
    def _format_tag(self, tag, ttype='start', ats=None):
        ftag = '<'
        if ttype == 'end':
            ftag = ftag + '/'
        ftag = ftag + tag
        if ats != None and len(ats):
            ftag = ftag + self._format_attrs(ats)
        if ttype == 'self':
            ftag = ftag + ' /'
        ftag = ftag + '>'
        return ftag
    
    def handle_starttag(self, tag, attrs):
        self._write_tabs()
        self.tabbed = self.tabbed + 1
        self.append(self._format_tag(tag, ats=attrs) + '\n')

    def handle_endtag(self, tag):
        self.tabbed = self.tabbed - 1
        self._write_tabs()
        self.append(self._format_tag(tag, ttype='end') + '\n')

    def handle_startendtag(self, tag, attrs):
        self._write_tabs()
        self.append(self._format_tag(tag, ttype='self', ats=attrs) + '\n')
        
    def handle_data(self, data):
        data = data.strip()
        if(len(data)):
            self._write_tabs()
            self.append(data + '\n')

    def handle_charref(self, name):
        self.append('&#'+name+';')

    def handle_entityref(self, name):
        self.append('&'+name+';')

    def handle_comment(self, data):
        data = '<!--' + data + '-->'
        self._write_tabs();
        self.append(data + '\n')

    def handle_decl(self, decl):
        self._write_tabs()
        self.append('<!'+decl+'>')

    def handle_pi(self, data):
        self._write_tabs()
        self.append('<?'+data+'>')

    def render(self):
        return "".join(self.formatted)

if __name__ == "__main__":
    import sys
    if len(sys.argv) == 3:
        try:
            n = HTMLFormatter()
            f = open(sys.argv[1], 'r')
            n.feed(f.read())
            f.close()
            f = open(sys.argv[2], 'w')
            f.write(n.render())
            f.close()
        except IOError:
            print(("Failed opening or writing to files '{0}', '{1}'".format(sys.argv[1], sys.argv[2])))
    else:
        print("Wrong number of arguments")

Explanation#