Example #1
0
    def __init__(self, parts, variable=None):
        if not isinstance(parts, types.parts):
            parts = types.parts((parts,))

        self.parts = parts
        self.variable = variable
Example #2
0
 def content(self):
     content = self._content
     if content is not None:
         if isinstance(content, types.escape):
             return types.escape((types.value(self.content_symbol), ))
         return types.parts((types.value(self.content_symbol), ))
Example #3
0
 def content(self):
     content = self._content
     if content is not None:
         if isinstance(content, types.escape):
             return types.escape((types.value(self.content_symbol),))
         return types.parts((types.value(self.content_symbol),))
Example #4
0
    def tales(self, string, escape=None):
        """We need to implement the ``validate`` and
        ``translate``-methods. Let's define that an expression is
        valid if it contains an odd number of characters.
        
        >>> class MockExpressionTranslator(ExpressionTranslator):
        ...     def translate(self, string, escape=None):
        ...         if string: return types.value(string)

        >>> tales = MockExpressionTranslator().tales
                
        >>> tales('a')
        value('a')

        >>> tales('a|b')
        parts(value('a'), value('b'))
        """

        string = string.replace('\n', '').strip()

        if not string:
            return types.parts()

        parts = []

        # default translator is ``self``
        translator = self

        i = j = 0
        while i < len(string):
            match = self.re_pragma.match(string[i:])
            if match is not None:
                pragma = match.group('pragma')
                new_translator = self.pragma(pragma)
                if new_translator is not None:
                    translator = new_translator
                    i += match.end()
                    if translator.recursive:
                        value = translator.tales(string[i:])
                        if parts:
                            if isinstance(value, types.parts):
                                parts.extend(value)
                            else:
                                parts.append(value)

                            return types.parts(parts)
                        return value
                    continue

            j = string.find('|', j + 1)
            if j == -1:
                j = len(string)

            expr = string[i:j]

            try:
                value = translator.translate(expr, escape)
            except SyntaxError:
                if j < len(string):
                    continue
                raise

            value.label = expr
            parts.append(value)
            translator = self
            
            i = j + 1

        value = translator.translate("", escape)
        if value is not None:
            value.label = ""
            parts.append(value)

        if len(parts) == 1:
            return parts[0]

        return types.parts(parts)
Example #5
0
    def __init__(self, parts, variable=None):
        if not isinstance(parts, types.parts):
            parts = types.parts((parts, ))

        self.parts = parts
        self.variable = variable