Mercurial > piecrust2
annotate piecrust/templating/jinja/environment.py @ 869:41b0c94f9833
refactor: Fix some last instance of using the old API.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 12 Jun 2017 22:22:42 -0700 |
parents | 08e02c2a2a1a |
children | 3e69f18912f5 |
rev | line source |
---|---|
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import time |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import email.utils |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import hashlib |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
5 import logging |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import strict_rfc3339 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 from jinja2 import Environment |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from .extensions import get_highlight_css |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from piecrust.data.paginator import Paginator |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 from piecrust.rendering import format_text |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 from piecrust.uriutil import multi_replace |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
14 logger = logging.getLogger(__name__) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
15 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
16 |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 class PieCrustEnvironment(Environment): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 def __init__(self, app, *args, **kwargs): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 self.app = app |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 # Before we create the base Environement, let's figure out the options |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 # we want to pass to it. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 twig_compatibility_mode = app.config.get('jinja/twig_compatibility') |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 # Disable auto-reload when we're baking. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 if app.config.get('baker/is_baking'): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 kwargs.setdefault('auto_reload', False) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 # Let the user override most Jinja options via the site config. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 for name in ['block_start_string', 'block_end_string', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 'variable_start_string', 'variable_end_string', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 'comment_start_string', 'comment_end_string', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 'line_statement_prefix', 'line_comment_prefix', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 'trim_blocks', 'lstrip_blocks', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 'newline_sequence', 'keep_trailing_newline']: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 val = app.config.get('jinja/' + name) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 if val is not None: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 kwargs.setdefault(name, val) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
40 # Undefined behaviour. |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
41 undef = app.config.get('jinja/undefined') |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
42 if undef == 'logging': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
43 from jinja2 import make_logging_undefined |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
44 kwargs.setdefault('undefined', |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
45 make_logging_undefined(logger)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
46 elif undef == 'strict': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
47 from jinja2 import StrictUndefined |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
48 kwargs.setdefault('undefined', StrictUndefined) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
49 |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 # Twig trims blocks. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 if twig_compatibility_mode is True: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 kwargs['trim_blocks'] = True |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 # All good! Create the Environment. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 super(PieCrustEnvironment, self).__init__(*args, **kwargs) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 # Now add globals and filters. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self.globals.update({ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 'now': get_now_date(), |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 'fail': raise_exception, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 'highlight_css': get_highlight_css}) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 self.filters.update({ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 'keys': get_dict_keys, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 'values': get_dict_values, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 'paginate': self._paginate, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 'formatwith': self._formatWith, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 'markdown': lambda v: self._formatWith(v, 'markdown'), |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 'textile': lambda v: self._formatWith(v, 'textile'), |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 'nocache': add_no_cache_parameter, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 'wordcount': get_word_count, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 'stripoutertag': strip_outer_tag, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 'stripslash': strip_slash, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 'titlecase': title_case, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 'md5': make_md5, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 'atomdate': get_xml_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 'xmldate': get_xml_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 'emaildate': get_email_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 'date': get_date}) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 # Backwards compatibility with Twig. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 if twig_compatibility_mode is True: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 self.filters['raw'] = self.filters['safe'] |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 self.globals['pcfail'] = raise_exception |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 def _paginate(self, value, items_per_page=5): |
869
41b0c94f9833
refactor: Fix some last instance of using the old API.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
87 ctx = self.app.env.render_ctx_stack.current_ctx |
41b0c94f9833
refactor: Fix some last instance of using the old API.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
88 if ctx is None or ctx.page is None: |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 raise Exception("Can't paginate when no page has been pushed " |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 "on the execution stack.") |
869
41b0c94f9833
refactor: Fix some last instance of using the old API.
Ludovic Chabant <ludovic@chabant.com>
parents:
854
diff
changeset
|
91 return Paginator(value, ctx.page, ctx.sub_num, |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 items_per_page=items_per_page) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 def _formatWith(self, value, format_name): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 return format_text(self.app, format_name, value) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 def raise_exception(msg): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 raise Exception(msg) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 def get_dict_keys(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 if isinstance(value, list): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 return [i[0] for i in value] |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 return value.keys() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 def get_dict_values(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 if isinstance(value, list): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 return [i[1] for i in value] |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 return value.values() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 def add_no_cache_parameter(value, param_name='t', param_value=None): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 if not param_value: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 param_value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 if '?' in value: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 value += '&' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 else: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 value += '?' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 value += '%s=%s' % (param_name, param_value) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 return value |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 def get_word_count(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 return len(value.split()) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 def strip_outer_tag(value, tag=None): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 tag_pattern = '[a-z]+[a-z0-9]*' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 if tag is not None: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 tag_pattern = re.escape(tag) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 pat = r'^\<' + tag_pattern + r'\>(.*)\</' + tag_pattern + '>$' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 m = re.match(pat, value) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 if m: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 return m.group(1) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 return value |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 def strip_slash(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 return value.rstrip('/') |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 def title_case(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 return value.title() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 def make_md5(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 return hashlib.md5(value.lower().encode('utf8')).hexdigest() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 def get_xml_date(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 """ Formats timestamps like 1985-04-12T23:20:50.52Z |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 """ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 return strict_rfc3339.timestamp_to_rfc3339_localoffset(int(value)) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 def get_email_date(value, localtime=False): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 """ Formats timestamps like Fri, 09 Nov 2001 01:08:47 -0000 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 """ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 return email.utils.formatdate(value, localtime=localtime) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 def get_now_date(): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 return time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 def get_date(value, fmt): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 if '%' not in fmt: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 suggest = php_format_to_strftime_format(fmt) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 if suggest != fmt: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 suggest_message = ("You probably want a format that looks " |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 "like: '%s'." % suggest) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 else: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 suggest_message = ("We can't suggest a proper date format " |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 "for you right now, though.") |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 raise Exception("Got incorrect date format: '%s\n" |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 "PieCrust 1 date formats won't work in PieCrust 2. " |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 "%s\n" |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 "Please check the `strftime` formatting page here: " |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 "https://docs.python.org/3/library/datetime.html" |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 "#strftime-and-strptime-behavior" % |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 (fmt, suggest_message)) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 return time.strftime(fmt, time.localtime(value)) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 def php_format_to_strftime_format(fmt): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 replacements = { |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 'd': '%d', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 'D': '%a', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 'j': '%d', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 'l': '%A', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 'w': '%w', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 'z': '%j', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 'W': '%W', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 'F': '%B', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 'm': '%m', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 'M': '%b', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 'n': '%m', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 'y': '%Y', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 'Y': '%y', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 'g': '%I', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 'G': '%H', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 'h': '%I', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 'H': '%H', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 'i': '%M', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 's': '%S', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 'e': '%Z', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 'O': '%z', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 'c': '%Y-%m-%dT%H:%M:%SZ'} |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 return multi_replace(fmt, replacements) |