annotate piecrust/templating/jinjaengine.py @ 111:208c652551a3

Quick fix for making the server correctly update referenced pages. Disable the file-system cache for rendered segments when in server mode. We can bring this optimization back when we're actually using the baking record in the server too in order to know dependencies.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 16 Oct 2014 17:03:42 -0700
parents e771c202583a
children 28444014ce7d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import re
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import time
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import logging
89
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
4 import threading
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 import strict_rfc3339
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 from jinja2 import Environment, FileSystemLoader, TemplateNotFound
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 from jinja2.exceptions import TemplateSyntaxError
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 from jinja2.ext import Extension, Markup
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
9 from jinja2.lexer import Token, describe_token
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 from jinja2.nodes import CallBlock, Const
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
11 from compressinja.html import HtmlCompressor, StreamProcessContext
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 from pygments import highlight
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 from pygments.formatters import HtmlFormatter
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 from pygments.lexers import get_lexer_by_name, guess_lexer
19
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
15 from piecrust.data.paginator import Paginator
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 from piecrust.rendering import format_text
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 from piecrust.routing import CompositeRouteFunction
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 from piecrust.templating.base import TemplateEngine, TemplateNotFoundError
48
002fa58f54dc Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
19 from piecrust.uriutil import multi_replace, get_first_sub_uri
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 logger = logging.getLogger(__name__)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 class JinjaTemplateEngine(TemplateEngine):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 # Name `twig` is for backwards compatibility with PieCrust 1.x.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 ENGINE_NAMES = ['jinja', 'jinja2', 'twig']
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 EXTENSIONS = ['jinja', 'jinja2', 'twig']
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 self.env = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def renderString(self, txt, data, filename=None, line_offset=0):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 self._ensureLoaded()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 tpl = self.env.from_string(txt)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 return tpl.render(data)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 except TemplateSyntaxError as tse:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 tse.lineno += line_offset
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 if filename:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 tse.filename = filename
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 import sys
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 _, __, traceback = sys.exc_info()
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
44 raise tse.with_traceback(traceback)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 def renderFile(self, paths, data):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 self._ensureLoaded()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 tpl = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 logger.debug("Looking for template: %s" % paths)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 for p in paths:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 tpl = self.env.get_template(p)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 break
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 except TemplateNotFound:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 pass
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 if tpl is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 raise TemplateNotFoundError()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 return tpl.render(data)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 def _ensureLoaded(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 if self.env:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 return
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
63
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
64 autoescape = self.app.config.get('jinja/auto_escape')
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
65 if autoescape is None:
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
66 autoescape = self.app.config.get('twig/auto_escape')
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
67 if autoescape is None:
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
68 autoescape = True
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
69
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
70 logger.debug("Creating Jinja environment with folders: %s" %
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
71 self.app.templates_dirs)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 loader = FileSystemLoader(self.app.templates_dirs)
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
73 extensions = [
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
74 PieCrustHighlightExtension,
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
75 PieCrustCacheExtension,
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
76 PieCrustSpacelessExtension]
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
77 if autoescape:
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
78 extensions.append('jinja2.ext.autoescape')
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 self.env = PieCrustEnvironment(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 self.app,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 loader=loader,
59
e3e3de44377c Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents: 48
diff changeset
82 extensions=extensions)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 class PieCrustEnvironment(Environment):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 def __init__(self, app, *args, **kwargs):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 super(PieCrustEnvironment, self).__init__(*args, **kwargs)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 self.app = app
19
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
89 self.auto_reload = True
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 self.globals.update({
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 'fail': raise_exception})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 self.filters.update({
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
93 'keys': get_dict_keys,
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
94 'values': get_dict_values,
19
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
95 'paginate': self._paginate,
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 'formatwith': self._formatWith,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 'markdown': lambda v: self._formatWith(v, 'markdown'),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 'textile': lambda v: self._formatWith(v, 'textile'),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 'nocache': add_no_cache_parameter,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 'wordcount': get_word_count,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 'stripoutertag': strip_outer_tag,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 'stripslash': strip_slash,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 'titlecase': title_case,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 'atomdate': get_atom_date,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 'date': get_date})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 # Backwards compatibility with PieCrust 1.x.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 self.globals.update({
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 'pcfail': raise_exception})
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 # Backwards compatibility with Twig.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 twig_compatibility_mode = app.config.get('jinja/twig_compatibility')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 if twig_compatibility_mode is None or twig_compatibility_mode is True:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 self.trim_blocks = True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 self.filters['raw'] = self.filters['safe']
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 # Add route functions.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 for route in app.routes:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 name = route.template_func_name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 func = self.globals.get(name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 if func is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 func = CompositeRouteFunction()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 func.addFunc(route)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 self.globals[name] = func
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 elif isinstance(func, CompositeRouteFunction):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 self.globals[name].addFunc(route)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 raise Exception("Route function '%s' collides with an "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 "existing function or template data." %
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 name)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130
19
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
131 def _paginate(self, value, items_per_page=5):
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
132 cpi = self.app.env.exec_info_stack.current_page_info
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
133 if cpi is None or cpi.page is None or cpi.render_ctx is None:
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
134 raise Exception("Can't paginate when no page has been pushed "
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
135 "on the execution stack.")
48
002fa58f54dc Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
136 first_uri = get_first_sub_uri(self.app, cpi.render_ctx.uri)
002fa58f54dc Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents: 41
diff changeset
137 return Paginator(cpi.page, value, first_uri,
19
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
138 page_num=cpi.render_ctx.page_num,
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
139 items_per_page=items_per_page)
dc72a288921f Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents: 7
diff changeset
140
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 def _formatWith(self, value, format_name):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 return format_text(self.app, format_name, value)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 def raise_exception(msg):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 raise Exception(msg)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
147
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
148
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
149 def get_dict_keys(value):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
150 if isinstance(value, list):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
151 return [i[0] for i in value]
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
152 return value.keys()
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
153
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
154
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
155 def get_dict_values(value):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
156 if isinstance(value, list):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
157 return [i[1] for i in value]
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
158 return value.values()
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
159
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
160
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161 def add_no_cache_parameter(value, param_name='t', param_value=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
162 if not param_value:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
163 param_value = time.time()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
164 if '?' in value:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
165 value += '&'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
166 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
167 value += '?'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
168 value += '%s=%s' % (param_name, param_value)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
169 return value
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
170
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
171
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
172 def get_word_count(value):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
173 return len(value.split())
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
174
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
175
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
176 def strip_outer_tag(value, tag=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
177 tag_pattern = '[a-z]+[a-z0-9]*'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
178 if tag is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
179 tag_pattern = re.escape(tag)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
180 pat = r'^\<' + tag_pattern + r'\>(.*)\</' + tag_pattern + '>$'
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
181 m = re.match(pat, value)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
182 if m:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
183 return m.group(1)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
184 return value
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
185
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
187 def strip_slash(value):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
188 return value.rstrip('/')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
189
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
190
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
191 def title_case(value):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
192 return value.title()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
193
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
195 def get_atom_date(value):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
196 return strict_rfc3339.timestamp_to_rfc3339_localoffset(int(value))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
197
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
198
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
199 def get_date(value, fmt):
28
19f3ac27c3d5 The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
200 if value == 'now':
19f3ac27c3d5 The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents: 19
diff changeset
201 value = time.time()
41
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
202 if '%' not in fmt:
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
203 suggest = php_format_to_strftime_format(fmt)
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
204 raise Exception("PieCrust 1 date formats won't work in PieCrust 2. "
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
205 "You probably want a format that look like '%s'. "
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
206 "Please check the `strftime` formatting page here: "
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
207 "https://docs.python.org/3/library/datetime.html"
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
208 "#strftime-and-strptime-behavior" %
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
209 suggest)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 return time.strftime(fmt, time.localtime(value))
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
213 class PieCrustHighlightExtension(Extension):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 tags = set(['highlight', 'geshi'])
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
216 def __init__(self, environment):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 super(PieCrustHighlightExtension, self).__init__(environment)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 def parse(self, parser):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 lineno = next(parser.stream).lineno
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
222 # Extract the language name.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
223 args = [parser.parse_expression()]
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 # Extract optional arguments.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 kwarg_names = {'line_numbers': 0, 'use_classes': 0, 'class': 1, 'id': 1}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227 kwargs = {}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 while not parser.stream.current.test('block_end'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
229 name = parser.stream.expect('name')
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
230 if name.value not in kwarg_names:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 raise Exception("'%s' is not a valid argument for the code "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 "highlighting tag." % name.value)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 if kwarg_names[name.value] == 0:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234 kwargs[name.value] = Const(True)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 elif parser.stream.skip_if('assign'):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 kwargs[name.value] = parser.parse_expression()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 # body of the block
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 body = parser.parse_statements(['name:endhighlight', 'name:endgeshi'],
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 drop_needle=True)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 return CallBlock(self.call_method('_highlight', args, kwargs),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 [], [], body).set_lineno(lineno)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
245 def _highlight(self, lang, line_numbers=False, use_classes=False,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
246 css_class=None, css_id=None, caller=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
247 # Try to be mostly compatible with Jinja2-highlight's settings.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
248 body = caller()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
249
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
250 if lang is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
251 lexer = guess_lexer(body)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
252 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
253 lexer = get_lexer_by_name(lang, stripall=False)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
254
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
255 if css_class is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 try:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
257 css_class = self.environment.jinja2_highlight_cssclass
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 except AttributeError:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 pass
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
260
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
261 if css_class is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
262 formatter = HtmlFormatter(cssclass=css_class,
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
263 linenos=line_numbers)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
264 else:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
265 formatter = HtmlFormatter(linenos=line_numbers)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
266
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
267 code = highlight(Markup(body.rstrip()).unescape(), lexer, formatter)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
268 return code
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
269
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
270
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
271 class PieCrustCacheExtension(Extension):
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
272 tags = set(['pccache', 'cache'])
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
273
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
274 def __init__(self, environment):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
275 super(PieCrustCacheExtension, self).__init__(environment)
89
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
276 self._lock = threading.RLock()
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
278 environment.extend(
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
279 piecrust_cache_prefix='',
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
280 piecrust_cache={}
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
281 )
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
282
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
283 def parse(self, parser):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
284 # the first token is the token that started the tag. In our case
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
285 # we only listen to ``'pccache'`` so this will be a name token with
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
286 # `pccache` as value. We get the line number so that we can give
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
287 # that line number to the nodes we create by hand.
7
343d08ef5668 More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
288 lineno = next(parser.stream).lineno
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
289
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
290 # now we parse a single expression that is used as cache key.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
291 args = [parser.parse_expression()]
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
292
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
293 # now we parse the body of the cache block up to `endpccache` and
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
294 # drop the needle (which would always be `endpccache` in that case)
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
295 body = parser.parse_statements(['name:endpccache', 'name:endcache'],
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
296 drop_needle=True)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
297
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
298 # now return a `CallBlock` node that calls our _cache_support
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
299 # helper method on this extension.
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
300 return CallBlock(self.call_method('_cache_support', args),
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
301 [], [], body).set_lineno(lineno)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
302
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
303 def _cache_support(self, name, caller):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
304 key = self.environment.piecrust_cache_prefix + name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
305
89
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
306 exc_stack = self.environment.app.env.exec_info_stack
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
307 render_ctx = exc_stack.current_page_info.render_ctx
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
308
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
309 # try to load the block from the cache
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
310 # if there is no fragment in the cache, render it and store
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
311 # it in the cache.
89
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
312 pair = self.environment.piecrust_cache.get(key)
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
313 if pair is not None:
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
314 render_ctx.used_source_names.update(pair[1])
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
315 return pair[0]
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
316
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
317 with self._lock:
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
318 pair = self.environment.piecrust_cache.get(key)
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
319 if pair is not None:
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
320 render_ctx.used_source_names.update(pair[1])
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
321 return pair[0]
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
322
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
323 prev_used = render_ctx.used_source_names.copy()
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
324 rv = caller()
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
325 after_used = render_ctx.used_source_names.copy()
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
326 used_delta = after_used.difference(prev_used)
e771c202583a Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents: 65
diff changeset
327 self.environment.piecrust_cache[key] = (rv, used_delta)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328 return rv
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
329
41
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
330
65
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
331 class PieCrustSpacelessExtension(HtmlCompressor):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
332 """ A re-implementation of `SelectiveHtmlCompressor` so that we can
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
333 both use `strip` or `spaceless` in templates.
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
334 """
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
335 def filter_stream(self, stream):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
336 ctx = StreamProcessContext(stream)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
337 strip_depth = 0
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
338 while 1:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
339 if stream.current.type == 'block_begin':
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
340 for tk in ['strip', 'spaceless']:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
341 change = self._processToken(ctx, stream, tk)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
342 if change != 0:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
343 strip_depth += change
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
344 if strip_depth < 0:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
345 ctx.fail('Unexpected tag end%s' % tk)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
346 break
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
347 if strip_depth > 0 and stream.current.type == 'data':
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
348 ctx.token = stream.current
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
349 value = self.normalize(ctx)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
350 yield Token(stream.current.lineno, 'data', value)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
351 else:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
352 yield stream.current
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
353 next(stream)
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
354
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
355 def _processToken(self, ctx, stream, test_token):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
356 change = 0
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
357 if (stream.look().test('name:%s' % test_token) or
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
358 stream.look().test('name:end%s' % test_token)):
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
359 stream.skip()
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
360 if stream.current.value == test_token:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
361 change = 1
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
362 else:
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
363 change = -1
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
364 stream.skip()
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
365 if stream.current.type != 'block_end':
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
366 ctx.fail('expected end of block, got %s' %
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
367 describe_token(stream.current))
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
368 stream.skip()
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
369 return change
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
370
071cc99b1779 Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents: 59
diff changeset
371
41
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
372 def php_format_to_strftime_format(fmt):
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
373 replacements = {
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
374 'd': '%d',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
375 'D': '%a',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
376 'j': '%d',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
377 'l': '%A',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
378 'w': '%w',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
379 'z': '%j',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
380 'W': '%W',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
381 'F': '%B',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
382 'm': '%m',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
383 'M': '%b',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
384 'n': '%m',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
385 'y': '%Y',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
386 'Y': '%y',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
387 'g': '%I',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
388 'G': '%H',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
389 'h': '%I',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
390 'H': '%H',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
391 'i': '%M',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
392 's': '%S',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
393 'e': '%Z',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
394 'O': '%z',
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
395 'c': '%Y-%m-%dT%H:%M:%SZ'}
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
396 return multi_replace(fmt, replacements)
1a30e3d7ee47 Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents: 28
diff changeset
397