# HG changeset patch # User egj@socialplanning.org # Date 1265133842 0 # Node ID 89a72b2fd149bffcebd6c1fefb10e56c7ba3e34d # Parent 81607129a45e631a9c87caa19dc4ef5564ef6ab5# Parent ffd661a0f16911c8c0111750875bbd46a3419cfd merge from head diff -r 81607129a45e -r 89a72b2fd149 README.txt --- a/README.txt Tue Feb 02 18:02:27 2010 +0000 +++ b/README.txt Tue Feb 02 18:04:02 2010 +0000 @@ -63,16 +63,46 @@ at [decoupage.formatters]). For example: /include = site.html could include the site.html genshi template at the top of the body. +Formatters: + +sort: + determines how to sort the files in a directory; + right now only by case-insensitive alphabetically + * reverse : reverse the order of the sorting + all: only pass files of a certain pattern; the inverse of ignore calling all with no arguments means only files with descriptions are used -title: splits a description into a title and a description with a -separator -describe: substitute the description for the filename -ignore: ignore files of a certain pattern +title: + splits a description into a title and a description via a + separator in + the description. The template will now have an additional + variable, + 'title', per file + Arguments: + * separator: what separator to use (':' by default) + +describe: + obtain the description from the filename + the file extension (if any) will be dropped and + spaces will be substituted for underscores + +ignore: + ignore files of a glob patterns. + These files will not be linked to in the template. + e.g. /ignore = .* *.pdf # don't list dotfiles and PDFs + include: include a file at the top of the body -css: specify CSS +css: specify CSS used (whitespace separated list) + +Decoupage also makes use of other special intrinsic keywords: +formatters: ordered list of formatters to apply + +inherit: inherit configuration from a certain directory (instead of +the parent + +transform: a list of transformers for contenttransformer diff -r 81607129a45e -r 89a72b2fd149 decoupage/formatters.py --- a/decoupage/formatters.py Tue Feb 02 18:02:27 2010 +0000 +++ b/decoupage/formatters.py Tue Feb 02 18:04:02 2010 +0000 @@ -36,7 +36,11 @@ ### formatters class Ignore(object): - """ignore files of a certain pattern""" + """ + ignore files of a glob patterns. + These files will not be linked to in the template. + e.g. /ignore = .* *.pdf # don't list dotfiles and PDFs + """ def __init__(self, ignore): @@ -79,7 +83,11 @@ data['files'] = _files class Sort(object): - """ determines how to sort the files in a directory """ + """ + determines how to sort the files in a directory; + right now only by case-insensitive alphabetically + * reverse : reverse the order of the sorting + """ def __init__(self, pattern): self.args = [i.strip() for i in pattern.split(',')] @@ -92,13 +100,19 @@ class FilenameDescription(FormatterBase): - """substitute the description for the filename""" + """ + obtain the description from the filename + the file extension (if any) will be dropped and + spaces will be substituted for underscores + """ + # TODO : deal with CamelCaseFilenames def __call__(self, request, data): for f in data['files']: if f['description'] is None: description = f['name'] - description = description.rsplit('.', 1)[0] + if '.' in description: + description = description.rsplit('.', 1)[0] decription = description.strip('_') if '_' in description: description = ' '.join([i.title() for i in description.split('_')]) @@ -106,8 +120,14 @@ class TitleDescription(FormatterBase): - """splits a description into a title and a description with a separator""" - + """ + splits a description into a title and a description via a separator in + the description. The template will now have an additional variable, + 'title', per file + Arguments: + * separator: what separator to use (':' by default) + """ + # XXX what about setting the page title? defaults = { 'separator': ':' } @@ -122,12 +142,12 @@ f['description'] = None class CSS(object): - """specify CSS""" + """specify CSS used (whitespace separated list)""" def __init__(self, arg): self.css = arg.split() def __call__(self, request, data): - data['stylesheets'] = self.css + data['css'] = self.css class Include(object): """include a file at the top of the body""" diff -r 81607129a45e -r 89a72b2fd149 decoupage/web.py --- a/decoupage/web.py Tue Feb 02 18:02:27 2010 +0000 +++ b/decoupage/web.py Tue Feb 02 18:04:02 2010 +0000 @@ -4,6 +4,7 @@ import os +from contenttransformer.app import FileTypeTransformer from formatters import formatters from genshi.builder import Markup @@ -62,6 +63,8 @@ self.loader = TemplateLoader(self.template_directories, auto_reload=self.auto_reload) + + ### methods dealing with HTTP def __call__(self, environ, start_response): request = Request(environ) @@ -76,15 +79,18 @@ res = self.get(request) return res(environ, start_response) else: - fileserver = self.fileserver(path) + conf = self.conf(request.path_info.rsplit('/',1)[0]) + if '/transformer' in conf: + args = [i.split('=', 1) for i in conf['/transformer'].split(',') if '=' in i] + fileserver = FileTypeTransformer(*args) + else: + fileserver = FileApp + + fileserver = fileserver(path) return fileserver(environ, start_response) else: raise exc.HTTPNotFound() - def get_response(self, text, content_type='text/html'): - """construct a response to a GET request""" - res = Response(content_type=content_type, body=text) - return res def get(self, request): """ @@ -152,7 +158,8 @@ return self.fileserver(local_index) raise - return self.get_response(res) + return Response(content_type='text/html', body=res) + ### internal methods @@ -202,7 +209,7 @@ parent_configuration = self.conf(inherit_directory) for key, value in parent_configuration.items(): if key.startswith('/') and key not in conf: - conf[key] = value + conf[key] = value # cache configuration if not self.auto_reload: diff -r 81607129a45e -r 89a72b2fd149 setup.py --- a/setup.py Tue Feb 02 18:02:27 2010 +0000 +++ b/setup.py Tue Feb 02 18:04:02 2010 +0000 @@ -6,7 +6,7 @@ except IOError: description = '' -version = '0.4.2' +version = '0.5' setup(name='decoupage', version=version, @@ -27,6 +27,7 @@ 'PasteScript', 'genshi', 'martINI', + 'contenttransformer', ], entry_points=""" # -*- Entry points: -*-