|
| 1 | +from __future__ import absolute_import, unicode_literals |
| 2 | +from fluent.syntax import ast as FTL |
| 3 | +from . import resolver |
| 4 | + |
| 5 | + |
| 6 | +class Compiler(object): |
| 7 | + def __init__(self, bundle=None): |
| 8 | + self.bundle = None |
| 9 | + |
| 10 | + def __call__(self, item): |
| 11 | + if isinstance(item, FTL.BaseNode): |
| 12 | + return self.compile(item) |
| 13 | + if isinstance(item, (tuple, list)): |
| 14 | + return [self(elem) for elem in item] |
| 15 | + return item |
| 16 | + |
| 17 | + def compile(self, node): |
| 18 | + nodename = type(node).__name__ |
| 19 | + if not hasattr(resolver, nodename): |
| 20 | + return node |
| 21 | + kwargs = vars(node).copy() |
| 22 | + for propname, propvalue in kwargs.items(): |
| 23 | + kwargs[propname] = self(propvalue) |
| 24 | + handler = getattr(self, 'compile_' + nodename, self.compile_generic) |
| 25 | + return handler(nodename, **kwargs) |
| 26 | + |
| 27 | + def compile_generic(self, nodename, **kwargs): |
| 28 | + return getattr(resolver, nodename)(**kwargs) |
| 29 | + |
| 30 | + def compile_Placeable(self, _, expression, **kwargs): |
| 31 | + if isinstance(expression, resolver.Literal): |
| 32 | + return expression |
| 33 | + return resolver.Placeable(expression=expression, **kwargs) |
| 34 | + |
| 35 | + def compile_Pattern(self, _, elements, **kwargs): |
| 36 | + if any( |
| 37 | + not isinstance(child, resolver.Literal) |
| 38 | + for child in elements |
| 39 | + ): |
| 40 | + return resolver.Pattern(elements=elements, **kwargs) |
| 41 | + if len(elements) == 1: |
| 42 | + return elements[0] |
| 43 | + return resolver.TextElement( |
| 44 | + ''.join(child(None) for child in elements) |
| 45 | + ) |
0 commit comments