Adding third-party module used for Monitor's web pages.
[monitor.git] / www / HyperText / Documents.py
diff --git a/www/HyperText/Documents.py b/www/HyperText/Documents.py
new file mode 100644 (file)
index 0000000..60c4f69
--- /dev/null
@@ -0,0 +1,109 @@
+__version__ = "$Revision: 1.4 $"[11:-4]
+
+import HTML
+import sys
+from string import join
+
+class Document:
+
+    generator = HTML.META(name="generator",
+                          content="HyperText package (Python)")
+    DOCTYPE = HTML.DOCTYPE
+    body_element = HTML.BODY
+
+    def __init__(self, *content, **attrs):
+       from HTML import HEAD, HTML
+       self.doctype = self.DOCTYPE
+       self.body = apply(self.body_element, content, attrs)
+       self.head = HEAD(self.generator)
+       if hasattr(self, 'style'): self.head.append(self.style)
+       if hasattr(self, 'title'): self.head.append(self.title)
+       self.html = HTML(self.head, self.body)
+       self.setup()
+
+    def setup(self): pass
+
+    def append(self, *items): map(self.body.content.append, items)
+
+    def __str__(self, indent=0, perlevel=2):
+       return join([self.doctype.__str__(indent, perlevel),
+                    self.html.__str__(indent, perlevel)], '')
+
+    def writeto(self, fp=sys.stdout, indent=0, perlevel=2):
+       self.doctype.writeto(fp, indent, perlevel)
+       self.html.writeto(fp, indent, perlevel)
+
+
+class FramesetDocument(Document):
+
+    DOCTYPE = HTML.DOCTYPE_frameset
+    body_element = HTML.FRAMESET
+
+
+class CGIMixIn:
+
+    def setup(self):
+       self.content_type = "text/html"
+       self.headers = []
+       self.nobody = 0
+
+    def _str_content_type(self):
+       return 'Content-Type: %s\r\n\r\n' % self.content_type
+
+    def __str__(self, indent=0, perlevel=2):
+       s = self.headers[:]
+       s.append(self._str_content_type())
+       if not self.nobody:
+           s.append(self.doctype.__str__(indent, perlevel))
+           s.append(self.html.__str__(indent, perlevel))
+       return join(s, '')
+
+    def writeto(self, fp=sys.stdout, indent=0, perlevel=2):
+       fp.writelines(self.headers)
+       fp.write(self._str_content_type())
+       if not self.nobody:
+           self.doctype.writeto(fp, indent, perlevel)
+           self.html.writeto(fp, indent, perlevel)
+
+
+class HTTPMixIn(CGIMixIn):
+
+    def setup(self):
+       CGIMixIn.setup(self)
+       if not hasattr(self, 'response'):
+           self.response = (200, 'Output follows')
+       self.date = None
+
+    http_response_str = "%s %s %s\r\nServer: %s %s\r\nDate: %s\r\n"
+
+    def _str_http_response(self):
+       if hasattr(self, 'request'):
+           apply(self.request.log_request, self.response)
+           return self.http_response_str \
+                  % (self.request.request_version,
+                     self.response[0],
+                     self.response[1],
+                     self.request.server_version,
+                     self.request.sys_version,
+                     self.date)
+       else:
+           return self.http_response_str \
+                  % ('HTTP/1.0',
+                     self.response[0],
+                     self.response[1],
+                     "Dunno/0.0",
+                     "BeatzMe/0.0",
+                     self.date)
+
+    def __str__(self, indent=0, perlevel=2):
+       return join([self._str_http_response(),
+                    CGIMixIn.__str__(self, indent, perlevel)], '')
+
+    def writeto(self, fp=sys.stdout, indent=0, perlevel=2):
+       fp.write(self._str_http_response())
+       CGIMixIn.writeto(self, fp, indent, perlevel)
+
+
+
+
+