"""
This XML-writing module is an example of a context manager.
"""

class XmlTag:

    def __init__(self, tag, **attrs):
        self.tag = tag
        self.attrs = attrs

    def __enter__(self):
        if self.attrs:
            print('<%s' % self.tag, end=' ')
            for name in self.attrs:
                print('%s="%s"' % (name, self.attrs[name]), end=' ')
            print('>')
        else:
            print('<%s>' % self.tag)

    def __exit__(self, type, value, traceback):
        print('</%s>' % self.tag)


if __name__ == '__main__':
    # Use variables to store contexts that are reused (and help
    # readability).
    rowTag = XmlTag('tr')
    datumTag = XmlTag('td')
    boldTag = XmlTag('b')
    with XmlTag('html'):
        with XmlTag('body'):
            with XmlTag('h1'):
                print("Hello, Worlds!")
            print("An extraterrestrial's guide to the Solar System.")
            with XmlTag('table', border=10, rules='all'):
                with rowTag:
                    with datumTag:
                        with boldTag:
                            print("planet")
                    with datumTag, boldTag:
                        print("type")
                    with datumTag, boldTag:
                        print("comments")
                with rowTag:
                    with datumTag:
                        print("mercury")
                    with datumTag:
                        print("terrestrial")
                    with datumTag:
                        print("restaurants serve good food, but have no atmosphere")
                with rowTag:
                    with datumTag:
                        print("venus")
                    with datumTag:
                        print("terrestrial")
                    with datumTag:
                        print("OK, if you don't mind 462 deg C")
                with rowTag:
                    with datumTag:
                        print("earth")
                    with datumTag:
                        print("terrestrial (duh!)")
                    with datumTag:
                        print("too touristy")
                with rowTag:
                    with datumTag:
                        print("mars")
                    with datumTag:
                        print("terrestrial")
                    with datumTag:
                        print("don't let those NASA robots see you!")
                with rowTag:
                    with datumTag:
                        print("jupiter")
                    with datumTag:
                        print("gas giant")
                    with datumTag:
                        print("nice for you methane breathers")
                with rowTag:
                    with datumTag:
                        print("saturn")
                    with datumTag:
                        print("gas giant")
                    with datumTag:
                        print("has a familiar ring to it")
                with rowTag:
                    with datumTag:
                        print("uranus")
                    with datumTag:
                        print("gas giant")
                    with datumTag:
                        print("planet of the japes")
                with rowTag:
                    with datumTag:
                        print("neptune")
                    with datumTag:
                        print("gas giant")
                    with datumTag:
                        print("the outermost planet")
                        with boldTag:
                            print("now!")
