Mercurial > piecrust2
annotate piecrust/templating/jinja/environment.py @ 1188:a7c43131d871
bake: Fix file write flushing problem with Python 3.8+
Writing the cache files fails in Python 3.8 because it looks like flushing
behaviour has changed. We need to explicitly flush. And even then, in very
rare occurrences, it looks like it can still run into racing conditions,
so we do a very hacky and ugly "retry" loop when fetching cached data :(
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 15 Jun 2021 22:36:23 -0700 |
parents | 3e69f18912f5 |
children |
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. |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
869
diff
changeset
|
23 # |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 # 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
|
25 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
|
26 kwargs.setdefault('auto_reload', False) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
869
diff
changeset
|
28 # Don't unload templates from the cache. |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
869
diff
changeset
|
29 kwargs.setdefault('cache_size', -1) |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
869
diff
changeset
|
30 |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 # 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
|
32 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
|
33 'variable_start_string', 'variable_end_string', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 'comment_start_string', 'comment_end_string', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 'line_statement_prefix', 'line_comment_prefix', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 'trim_blocks', 'lstrip_blocks', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 'newline_sequence', 'keep_trailing_newline']: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 val = app.config.get('jinja/' + name) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 if val is not None: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 kwargs.setdefault(name, val) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
42 # Undefined behaviour. |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
43 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
|
44 if undef == 'logging': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
45 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
|
46 kwargs.setdefault('undefined', |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
47 make_logging_undefined(logger)) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
48 elif undef == 'strict': |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
49 from jinja2 import StrictUndefined |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
50 kwargs.setdefault('undefined', StrictUndefined) |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
51 |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 # All good! Create the Environment. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 super(PieCrustEnvironment, self).__init__(*args, **kwargs) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 # Now add globals and filters. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 self.globals.update({ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 'now': get_now_date(), |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 'fail': raise_exception, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 'highlight_css': get_highlight_css}) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 self.filters.update({ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 'keys': get_dict_keys, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 'values': get_dict_values, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 'paginate': self._paginate, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 'formatwith': self._formatWith, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 '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
|
67 '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
|
68 'nocache': add_no_cache_parameter, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 'wordcount': get_word_count, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 'stripoutertag': strip_outer_tag, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 'stripslash': strip_slash, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 'titlecase': title_case, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 'md5': make_md5, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 'atomdate': get_xml_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 'xmldate': get_xml_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 'emaildate': get_email_date, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 'date': get_date}) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
869
diff
changeset
|
79 self.filters['raw'] = self.filters['safe'] |
851
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 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
|
82 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
|
83 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
|
84 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
|
85 "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
|
86 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
|
87 items_per_page=items_per_page) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 def _formatWith(self, value, format_name): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 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
|
91 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 def raise_exception(msg): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 raise Exception(msg) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 |
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 def get_dict_keys(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 if isinstance(value, list): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 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
|
100 return value.keys() |
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 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 def get_dict_values(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 if isinstance(value, list): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 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
|
106 return value.values() |
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 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 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
|
110 if not param_value: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 param_value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 if '?' in value: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 value += '&' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 else: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 value += '?' |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 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
|
117 return value |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 def get_word_count(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 return len(value.split()) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 |
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 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
|
125 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
|
126 if tag is not None: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 tag_pattern = re.escape(tag) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 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
|
129 m = re.match(pat, value) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 if m: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 return m.group(1) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 return value |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 def strip_slash(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 return value.rstrip('/') |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 |
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 def title_case(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 return value.title() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 |
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 def make_md5(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 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
|
145 |
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 def get_xml_date(value): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 """ 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
|
149 """ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 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
|
153 |
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 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
|
156 """ 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
|
157 """ |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 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
|
161 |
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 def get_now_date(): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 return time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 |
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 def get_date(value, fmt): |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 if value == 'now': |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 value = time.time() |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 if '%' not in fmt: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 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
|
172 if suggest != fmt: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 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
|
174 "like: '%s'." % suggest) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 else: |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 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
|
177 "for you right now, though.") |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 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
|
179 "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
|
180 "%s\n" |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 "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
|
182 "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
|
183 "#strftime-and-strptime-behavior" % |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 (fmt, suggest_message)) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 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
|
186 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 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
|
189 replacements = { |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 'd': '%d', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 'D': '%a', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 'j': '%d', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 'l': '%A', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 'w': '%w', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 'z': '%j', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 'W': '%W', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 'F': '%B', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 'm': '%m', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 'M': '%b', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 'n': '%m', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 'y': '%Y', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 'Y': '%y', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 'g': '%I', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 'G': '%H', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 'h': '%I', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 'H': '%H', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 'i': '%M', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 's': '%S', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 'e': '%Z', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 'O': '%z', |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 '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
|
212 return multi_replace(fmt, replacements) |