X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=4ae17b2996fa0da6f7a0b336c7a1df8a69f81e7d;hb=d27457c46810dade7c3fdbc38c1e0e8e8be424c6;hp=ca62bed3fc53d8d5a354a5e4b120c8cfcd32f926;hpb=537829f7f5332bc5867b826312132290d5de8d14;p=geekigeeki.git diff --git a/geekigeeki.py b/geekigeeki.py index ca62bed..4ae17b2 100755 --- a/geekigeeki.py +++ b/geekigeeki.py @@ -8,19 +8,13 @@ # 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 3 of the License, or -# (at your option) any later version. -# -# 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. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# (at your option) any later version. You should have received a copy +# of the GNU General Public License along with this program. +# If not, see . __version__ = '4.0-' + '$Id$'[4:11] -from time import clock +from time import clock, localtime, gmtime, strftime start_time = clock() title_done = False @@ -108,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): @@ -122,12 +118,12 @@ def send_guru(msg_text, msg_type): print('' \ % 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('') print('') @@ -231,13 +227,13 @@ def link_inline(name, descr=None, kvargs={}): elif image_re.match(name): return '%s' % (url, url + url_args(kvargs), descr) elif file_re.match(name) and not ext_re.search(name): # FIXME: this guesses a wiki page - return Page(name).send_naked(kvargs) + Page(name).send_naked(kvargs) # FIXME: we should return the page as a string rather than print it + return '' else: return '' \ % (url, url, name) def link_inline_glob(pattern, descr=None, kvargs={}): - os.chdir(config_get('data_dir', 'data')) s = '' for name in glob.glob(pattern): s += link_inline(name, descr, kvargs) @@ -332,7 +328,7 @@ def handle_get(pagename, form): else: send_httperror("403 Forbidden", pagename) -# Used by macros/WordIndex and macros/TitleIndex +# Used by sys/macros/WordIndex and sys/macros/TitleIndex def make_index_key(): links = ['%s' % (ch, ch) for ch in 'abcdefghijklmnopqrstuvwxyz'] return '

' + ' | '.join(links) + '

' @@ -341,14 +337,16 @@ def page_list(dirname=None, search_re=None): if search_re is None: # FIXME: WikiWord is too restrictive now! 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 config_get('data_dir', 'data')))) + 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("") def _macro_ELAPSED_TIME(*args, **kvargs): @@ -416,7 +414,7 @@ class WikiFormatter: return self.kvargs[args[0]] macro = globals().get('_macro_' + args[0]) if not macro: - exec(open("macros/" + args[0] + ".py").read(), globals()) + exec(open("sys/macros/" + args[0] + ".py").read(), globals()) macro = globals().get('_macro_' + args[0]) return macro(*args, **kvargs) except Exception, e: @@ -633,20 +631,24 @@ class Page: return re.sub('([a-z])([A-Z])', r'\1 \2', self.page_name) def _filename(self): - return os.path.join(config_get('data_dir', 'data'), self.page_name) + return self.page_name def _tmp_filename(self): - return os.path.join(config_get('data_dir', 'data'), ('#' + self.page_name.replace('/','_') + '.' + str(os.getpid()) + '#')) + 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() @@ -669,7 +671,7 @@ class Page: for filename in page_list(self._filename(), file_re): if image_re.match(filename): - maxwidth = config_get(image_maxwidth, '') + maxwidth = config_get('image_maxwidth', '400') if maxwidth: maxwidth = ' | maxwidth=' + str(maxwidth) out += '{{' + self.page_name + '/' + filename + ' | ' + humanlink(filename) + maxwidth + ' | class=thumbleft}}\n' @@ -732,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) @@ -768,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): @@ -809,7 +800,7 @@ class Page: import subprocess cmd = [ config_get('post_edit_hook'), - os.path.join(config_get('data_dir', 'data'), self.page_name), remote_user(), + self.page_name, remote_user(), remote_host(), changelog ] child = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True) output = child.stdout.read() @@ -824,6 +815,7 @@ class Page: try: exec(open("geekigeeki.conf.py").read()) + os.chdir(config_get('data_dir', 'data')) form = cgi.FieldStorage() action = form.getvalue('a', 'get') handler = globals().get('handle_' + action)