|
1 | 1 | from __future__ import print_function |
2 | | -import argparse, contextlib, logging, os, shutil, sys |
| 2 | +import argparse, contextlib, logging, os, re, shutil, sys |
| 3 | +from collections import defaultdict |
3 | 4 | from six import raise_from, text_type |
4 | 5 | from jinja2 import Environment, FileSystemLoader |
5 | 6 | from jinja2.defaults import DEFAULT_NAMESPACE |
@@ -29,7 +30,7 @@ def main(argv=None): |
29 | 30 | parser.add_argument('-lll', action='store_const', dest='stack_size', const=32768, |
30 | 31 | help='run on larger files: sets Java stack size to 32768k') |
31 | 32 | parser.add_argument('--remove-mustaches', action='store_true', default=False) |
32 | | - parser.add_argument('--mustache-remover', choices=('pybar', 'jinja2'), default='pybar') |
| 33 | + parser.add_argument('--mustache-remover', choices=('jinja2', 'pybar', 'regex'), default='regex') |
33 | 34 | parser.add_argument('--mustache-remover-env', action='append', nargs=2, help='Predefined KEY VALUE pair to substitute in the template') |
34 | 35 | parser.add_argument('--mustache-remover-copy-ext', default='~~') |
35 | 36 | parser.add_argument('--mustache-remover-default-value', default='DUMMY') |
@@ -75,7 +76,12 @@ def __init__(self, mustache_remover_name, mustache_remover_copy_ext, mustache_re |
75 | 76 | Validator.__init__(self, *args, **kwargs) |
76 | 77 | self.mustache_remover_copy_ext = mustache_remover_copy_ext |
77 | 78 | self.mustache_remover_placeholder = mustache_remover_placeholder |
78 | | - self.mustache_remover = Jinja2MustacheRemover(templates_include_dir) if mustache_remover_name == 'jinja2' else PybarMustacheRemover() |
| 79 | + if mustache_remover_name == 'jinja2': |
| 80 | + self.mustache_remover = Jinja2MustacheRemover(templates_include_dir) |
| 81 | + elif mustache_remover_name == 'pybar': |
| 82 | + self.mustache_remover = PybarMustacheRemover() |
| 83 | + else: |
| 84 | + self.mustache_remover = RegexMustacheRemover() |
79 | 85 |
|
80 | 86 | def validate(self, files=None, remove_mustaches=False): |
81 | 87 | if not files: |
@@ -108,6 +114,13 @@ def generate_mustachefree_tmpfiles(filepaths, mustache_remover, copy_ext, placeh |
108 | 114 | os.remove(tmpfile) |
109 | 115 |
|
110 | 116 |
|
| 117 | +class RegexMustacheRemover: |
| 118 | + @staticmethod |
| 119 | + def clean_template(filepath, placeholder): |
| 120 | + with open(filepath) as file: |
| 121 | + return re.sub('{{.+?}}', placeholder.default_value, file.read()) |
| 122 | + |
| 123 | + |
111 | 124 | class PybarMustacheRemover: |
112 | 125 | def __init__(self): |
113 | 126 | self.tmplt_compiler = PybarCompiler() |
@@ -142,6 +155,10 @@ class Jinja2PlaceholderEnvironment(Environment): |
142 | 155 | def __init__(self, placeholder, *args, **kwargs): |
143 | 156 | Environment.__init__(self, *args, **kwargs) |
144 | 157 | self.placeholder = placeholder |
| 158 | + filters = DefaultDict(lambda: (lambda _: '')) |
| 159 | + # pylint: disable=access-member-before-definition |
| 160 | + filters.update(self.filters) |
| 161 | + self.filters = filters |
145 | 162 | def getattr(self, *_, **__): |
146 | 163 | return RecursiveDefaultPlaceholder(self.placeholder.default_value) |
147 | 164 |
|
@@ -171,6 +188,10 @@ def __getslice__(self, *_): |
171 | 188 | return self |
172 | 189 |
|
173 | 190 |
|
| 191 | +class DefaultDict(defaultdict): |
| 192 | + get = defaultdict.__getitem__ # so that d.get(foo) is the same as d[foo] |
| 193 | + |
| 194 | + |
174 | 195 | class MustacheSubstitutionFail(Exception): |
175 | 196 | pass |
176 | 197 |
|
|
0 commit comments