Merge branch 'master' of ssh://trinity.codewiz.org/~/public_html/wiki/git/geekigeeki
[geekigeeki.git] / geekigeeki.py
index 07365fdef0e0c1ffdf6aaa3d2c3660cbc4c569cc..4569894255a653ab73d6312e6a7f62354808ed0d 100755 (executable)
@@ -14,7 +14,7 @@
 
 __version__ = '4.0-' + '$Id$'[4:11]
 
-from time import clock
+from time import clock, localtime, gmtime, strftime
 start_time = clock()
 title_done = False
 
@@ -102,7 +102,9 @@ def url_args(kvargs):
     return ''
 
 # Formatting stuff --------------------------------------------------
-def emit_header(mime_type="text/html"):
+def emit_header(mtime=None, mime_type="text/html"):
+    if mtime:
+        print("Last-Modified: " + strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime(mtime)))
     print("Content-type: " + mime_type + "; charset=utf-8\n")
 
 def send_guru(msg_text, msg_type):
@@ -116,12 +118,12 @@ def send_guru(msg_text, msg_type):
     print('</pre><script language="JavaScript" type="text/javascript" src="%s" defer="defer"></script>' \
         % relative_url('sys/GuruMeditation.js'))
 
-def send_title(name, text="Limbo", msg_text=None, msg_type='error', writable=False):
+def send_title(name, text="Limbo", msg_text=None, msg_type='error', writable=False, mtime=None):
     global title_done
     if title_done: return
 
     # Head
-    emit_header()
+    emit_header(mtime)
     print('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"')
     print('  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">')
     print('<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">')
@@ -337,12 +339,14 @@ def page_list(dirname=None, search_re=None):
         search_re = re.compile(r"^\b((([A-Z][a-z0-9]+){2,}/)*([A-Z][a-z0-9]+){2,})\b$")
     return sorted(filter(search_re.match, os.listdir(dirname or '.')))
 
-def send_footer(mod_string=None):
+def send_footer(mtime=None):
     if config_get('debug_cgi', False):
         cgi.print_arguments()
         cgi.print_form(form)
         cgi.print_environ()
-    link_inline("sys/footer", kvargs = { 'LAST_MODIFIED': mod_string })
+    link_inline("sys/footer", kvargs = {
+        'LAST_MODIFIED': strftime(config_get(datetime_fmt, '%a %d %b %Y %I:%M %p'), localtime(mtime))
+    })
     print("</body></html>")
 
 def _macro_ELAPSED_TIME(*args, **kvargs):
@@ -632,15 +636,19 @@ class Page:
     def _tmp_filename(self):
         return self.page_name + '.tmp' + str(os.getpid()) + '#'
 
-    def exists(self):
+    def _mtime(self):
         try:
-            os.stat(self._filename())
-            return True
+            return os.stat(self._filename()).st_mtime
         except OSError, err:
             if err.errno == errno.ENOENT:
-                return False
+                return None
             raise err
 
+    def exists(self):
+        if self._mtime():
+            return True
+        return False
+
     def get_raw_body(self, default=None):
         try:
             return open(self._filename(), 'rb').read()
@@ -726,19 +734,9 @@ class Page:
             link_urls += [ [ "stylesheet", value ] ]
 
         send_title(self.page_name, self.split_title(),
-            msg_text=self.msg_text, msg_type=self.msg_type, writable=self.can_write())
+            msg_text=self.msg_text, msg_type=self.msg_type, writable=self.can_write(), mtime=self._mtime())
         self.send_naked()
-        send_footer(self._last_modified())
-
-    def _last_modified(self):
-        try:
-            from time import localtime, strftime
-            modtime = localtime(os.stat(self._filename())[stat.ST_MTIME])
-        except OSError, err:
-            if err.errno != errno.ENOENT:
-                raise err
-            return None
-        return strftime(config_get(datetime_fmt, '%a %d %b %Y %I:%M %p'), modtime)
+        send_footer(mtime=self._mtime())
 
     def send_editor(self, preview=None):
         send_title(None, 'Edit ' + self.split_title(), msg_text=self.msg_text, msg_type=self.msg_type)
@@ -762,18 +760,17 @@ class Page:
 
     def send_raw(self, mimetype='text/plain', args=[]):
         if not self.can_read():
-            send_title(None, msg_text='Read access denied by ACLs', msg_type='notice')
+            send_title(None, msg_text='Read access denied by ACLs', msg_type='notice', mtime=self._mtime())
             return
 
+        emit_header(self._mtime(), mimetype)
         if 'maxwidth' in args:
             import subprocess
-            emit_header(mimetype)
             sys.stdout.flush()
             subprocess.check_call(['gm', 'convert', self._filename(),
                 '-scale', args['maxwidth'].value + ' >', '-'])
         else:
             body = self.get_raw_body()
-            emit_header(mimetype)
             print(body)
 
     def _write_file(self, data):