840 x = parse(tmpl) |
840 x = parse(tmpl) |
841 if self._aliasmap: |
841 if self._aliasmap: |
842 x = _aliasrules.expand(self._aliasmap, x) |
842 x = _aliasrules.expand(self._aliasmap, x) |
843 return x |
843 return x |
844 |
844 |
|
845 def _findsymbolsused(self, tree, syms): |
|
846 if not tree: |
|
847 return |
|
848 op = tree[0] |
|
849 if op == 'symbol': |
|
850 s = tree[1] |
|
851 if s in syms[0]: |
|
852 return # avoid recursion: s -> cache[s] -> s |
|
853 syms[0].add(s) |
|
854 if s in self.cache or s in self._map: |
|
855 # s may be a reference for named template |
|
856 self._findsymbolsused(self.load(s), syms) |
|
857 return |
|
858 if op in {'integer', 'string'}: |
|
859 return |
|
860 # '{arg|func}' == '{func(arg)}' |
|
861 if op == '|': |
|
862 syms[1].add(getsymbol(tree[2])) |
|
863 self._findsymbolsused(tree[1], syms) |
|
864 return |
|
865 if op == 'func': |
|
866 syms[1].add(getsymbol(tree[1])) |
|
867 self._findsymbolsused(tree[2], syms) |
|
868 return |
|
869 for x in tree[1:]: |
|
870 self._findsymbolsused(x, syms) |
|
871 |
|
872 def symbolsuseddefault(self): |
|
873 """Look up (keywords, filters/functions) referenced from the default |
|
874 unnamed template |
|
875 |
|
876 This may load additional templates from the map file. |
|
877 """ |
|
878 return self.symbolsused('') |
|
879 |
|
880 def symbolsused(self, t): |
|
881 """Look up (keywords, filters/functions) referenced from the name |
|
882 template 't' |
|
883 |
|
884 This may load additional templates from the map file. |
|
885 """ |
|
886 syms = (set(), set()) |
|
887 self._findsymbolsused(self.load(t), syms) |
|
888 return syms |
|
889 |
845 def renderdefault(self, mapping): |
890 def renderdefault(self, mapping): |
846 """Render the default unnamed template and return result as string""" |
891 """Render the default unnamed template and return result as string""" |
847 return self.render('', mapping) |
892 return self.render('', mapping) |
848 |
893 |
849 def render(self, t, mapping): |
894 def render(self, t, mapping): |