Author: ianb
Date: 2004-12-07 01:35:14 -0700 (Tue, 07 Dec 2004)
New Revision: 182
Added:
Wiki/lib/format_date.py
Modified:
Wiki/Context/Main.py
Wiki/Context/SitePage.py
Wiki/lib/common.py
Wiki/lib/wiki.py
Wiki/lib/wikiconfig.py
Wiki/lib/wikipage.py
Log:
* Pages can have URL names that don't match the canonical name (i.e.,
they have dashes to separate words).
* Configuration can be per-page-type.
* Display dates on pages, if configured to do so.
Modified: Wiki/Context/Main.py
===================================================================
--- Wiki/Context/Main.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/Context/Main.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -11,6 +11,7 @@
import os
import mimetypes
import datetime
+from lib.format_date import format_date_relative
def test(val, a, b=''):
if val:
@@ -43,13 +44,13 @@
# have, so we'll redirect
self.sendRedirectAndEnd(self.servletLink(name))
return
- if name != wikipage.canonicalName(name):
- self.sendRedirectAndEnd(self.wiki.linkTo(wikipage.canonicalName(name)))
- return
version = req.field('version', None) or None
if isinstance(version, (list, tuple)):
version = version[0]
self.page = self.wiki.page(name, version=version)
+ if name != self.page.urlName:
+ print "Name is: %s; urlName: %r" % (name, self.page.urlName)
+ self.sendRedirectAndEnd(self.page.link)
self.titlePrefix = ''
if ext == '.thumb.jpg':
req.setField('_action_', 'thumbnail')
@@ -325,6 +326,24 @@
def writeContent(self):
self.write(self.page.html)
+ dprint(dict(self.page.config.items()))
+ creation = self.page.config.getbool('displaycreationdate', False)
+ modified = self.page.config.getbool('displaymodifieddate', False)
+ if creation or modified:
+ self.write('<div class="dates" align="right">\n')
+ if creation and self.page.creationDate:
+ self.write('Created ')
+ self.write(format_date_relative(
+ self.page.creationDate))
+ if (modified
+ and self.page.modifiedDate
+ and (self.page.creationDate != self.page.modifiedDate
+ or not creation)):
+ if creation and self.page.creationDate:
+ self.write('\n<br>\nModified ')
+ self.write(format_date_relative(
+ self.page.modifiedDate))
+ self.write('</div>\n')
def menus(self):
menu = ['Page']
Modified: Wiki/Context/SitePage.py
===================================================================
--- Wiki/Context/SitePage.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/Context/SitePage.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -18,8 +18,9 @@
from TaskKit.Scheduler import Scheduler
import time
from lib import menubar
+from lib.common import pprint, dprint
-__all__ = ['SitePage']
+__all__ = ['SitePage', 'pprint', 'dprint']
class SitePage(CPage):
@@ -245,3 +246,4 @@
scheduler.start()
scheduler.addPeriodicAction(time.time(), 10, PublishTask(TheGlobalWiki),
'PublishTask')
+
Modified: Wiki/lib/common.py
===================================================================
--- Wiki/lib/common.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/lib/common.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -6,8 +6,13 @@
import cgi
import re
+import inspect
+import pprint as pprint_module
+pprint = pprint_module.pprint
+import os
-__all__ = ['canonicalName', 'htmlEncode']
+__all__ = ['canonicalName', 'htmlEncode', 'guessURLName', 'dprint',
+ 'pprint', 'guessTitle']
_canonicalNameRE = re.compile(r'[^a-z0-9]')
def canonicalName(name):
@@ -23,5 +28,28 @@
name = str(_urlNameRE.sub('', name.lower()))
return _whitespaceRE.sub('-', name)
+def guessTitle(name):
+ return ' '.join([w.capitalize() for w in name.split('-')])
+
def htmlEncode(val, cgiEscape=cgi.escape):
return cgiEscape(val, 1)
+
+
+def dprint(*args, **kw):
+ caller_frame = inspect.stack()[1]
+ caller_name = caller_frame[3]
+ caller_line = caller_frame[2]
+ caller_filename = caller_frame[1]
+ caller_module = os.path.splitext(os.path.basename(caller_filename))[0]
+ del caller_frame
+ print "%s from %s.%s:%s %s" % (
+ '-'*10, caller_module, caller_name, caller_line, '-'*10)
+ for arg in args:
+ if isinstance(arg, (str, unicode)):
+ print arg,
+ else:
+ print pprint_module.pformat(arg)
+ items = kw.items()
+ items.sort()
+ for name, value in items:
+ print name, pprint_module.pformat(value)
Added: Wiki/lib/format_date.py
===================================================================
--- Wiki/lib/format_date.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/lib/format_date.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -0,0 +1,77 @@
+import time
+try:
+ from mx import DateTime
+except ImportError:
+ DateTime = None
+try:
+ from datetime import datetime
+except ImportError:
+ datetime = None
+
+def _days(d):
+ if isinstance(d, datetime):
+ return time.mktime(d.timetuple()) / 60 / 60 / 24
+ elif isinstance(d, DateTime.DateTimeType):
+ return d.day_of_year
+ elif isinstance(d, time.struct_time):
+ return time.mktime(d) / 60 / 60 / 24
+ else:
+ return d.dayOfYear()
+
+def format_date_relative(date):
+ """
+ Formats a date relative to the current time. The result
+ will be dates like 'Yesterday', 'Wednesday 10:00am',
+ '12 May 2003', etc.
+
+ Specifically:
+
+ * If in the last 24 hours, just give the time.
+ * If yesterday, give 'yesterday TIME'
+ * If in the last 7 days, give 'DAY_OF_WEEK TIME'
+ * If in the same calendar year, give 'DAY_OF_MONTH MONTH'
+ * Otherwise gives 'DAY_OF_MONTH MONTH YEAR'
+
+ It uses english names when appropriate (e.g., Apr or Thu).
+ """
+ if date is None:
+ return ''
+ now = DateTime.now()
+ year = date.year
+ if callable(year):
+ year = year()
+ month = date.month
+ if callable(month):
+ month = month()
+ day = date.day
+ if callable(day):
+ day = day()
+ day_of_year = _days(date)
+ if now.year == year:
+ if now.month == month:
+ if _days(now) - 7 < day_of_year:
+ if now.day == day:
+ return format_time(date)
+ elif now.day - 1 == day:
+ return 'Yesterday %s' % format_time(date)
+ else:
+ return date.strftime('%a ') + format_time(date)
+ elif _days(now) - 21 < day_of_year:
+ return date.strftime('%a %d %b')
+ else:
+ return date.strftime('%d %b')
+ else:
+ return date.strftime('%d %b')
+ else:
+ return date.strftime('%d %b \'%y')
+
+def format_time(date):
+ """
+ Formats the time, like 4:20pm; unlike strftime, it lower-cases
+ the am/pm, and doesn't create hours with leading zeros.
+ """
+ text = date.strftime('%I:%M%p')
+ text = text[:-2] + text[-2:].lower()
+ if text.startswith('0'):
+ text = text[1:]
+ return text
Modified: Wiki/lib/wiki.py
===================================================================
--- Wiki/lib/wiki.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/lib/wiki.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -155,8 +155,10 @@
Returns a page by the given name, with the given version
(None == current version)
"""
+ urlName = name
+ name = canonicalName(name)
return wikipage.WikiPage(self, self.basepath,
- canonicalName(name), version=version)
+ name, urlName=urlName, version=version)
def filenameForName(self, filename):
return os.path.join(self.basepath, filename + '.txt')
Modified: Wiki/lib/wikiconfig.py
===================================================================
--- Wiki/lib/wikiconfig.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/lib/wikiconfig.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -7,6 +7,10 @@
class WikiConfig(LazyLoader):
+ def __init__(self, *args, **kw):
+ self._merged_page_classes = {}
+ LazyLoader.__init__(self, *args, **kw)
+
def getbool(self, key, default=NoDefault):
try:
return self.convert(key, converter=self.convertbool)
@@ -24,3 +28,26 @@
else:
raise ValueError(
"Boolean expected (true/false)")
+
+ def merge_page_class(self, page_class):
+ try:
+ return self._merged_page_classes[page_class] or self
+ except KeyError:
+ pass
+ values = self.getlist('pageclass')
+ to_add = []
+ for value in values:
+ print "Check:", [value, values, page_class]
+ if value.has_key(page_class):
+ to_add.append(value[page_class])
+ print "Merge:", to_add
+ if to_add:
+ new = self.clone()
+ for item in to_add:
+ new.merge(item)
+ self._merged_page_classes[page_class] = new
+ return new
+ else:
+ self._merged_page_classes[page_class] = None
+ return self
+
Modified: Wiki/lib/wikipage.py
===================================================================
--- Wiki/lib/wikipage.py 2004-12-07 02:33:51 UTC (rev 181)
+++ Wiki/lib/wikipage.py 2004-12-07 08:35:14 UTC (rev 182)
@@ -17,7 +17,7 @@
Image = None
import converter_registry
from html_abstracts import find_abstract
-from common import canonicalName, htmlEncode, guessURLName
+from common import *
# Just make sure these are loaded:
import convert_rest
@@ -52,7 +52,8 @@
__metaclass__ = propertymeta.MakeProperties
- def __init__(self, wiki, dir, pageName, version=None):
+ def __init__(self, wiki, dir, pageName,
+ urlName=None, version=None):
"""
Each page has a name, which is a unique identifier, for example
``"FrontPage"``, which identifies the page in the URL and
@@ -68,7 +69,11 @@
self._thumbnail = None
self._distributionOriginal = False
self._connectionsDirty = False
-
+ self._config = None
+ if not self.exists() and urlName is not None:
+ self.urlName = urlName
+ self.title = guessTitle(urlName)
+
def __repr__(self):
text = '<WikiPage:%s ' % self.name
if self.version:
@@ -143,8 +148,20 @@
relatedEntryLimit = metaprop('relatedentrylimit', 0,
converter=int)
relatedSortField = metaprop('relatedsortfield', 'creationDate')
- pageClass = metaprop('pageclass', 'page')
+ def pageClass__get(self):
+ return self.metadata.get('pageclass', 'page')
+
+ def pageClass__set(self, value):
+ self.metadata['pageclass'] = value
+ self._config = None
+
+ def config__get(self):
+ if self._config is None:
+ self._config = self.wiki.config.merge_page_class(self.pageClass)
+ #pprint(dict(self._config.items()))
+ return self._config
+
def _create_atom_id(self):
link = self.link
if link.startswith('http://'):
|