Metadata-Version: 1.0
Name: lovely.tal
Version: 0.2.1
Summary: The lovely tal enables new tal expressions.
Home-page: http://launchpad.net/lovely.tal
Author: Lovely Systems GmbH
Author-email: office@lovelysystems.com
License: ZPL 2.1
Description: ==========
        lovely tal
        ==========
        
        the lovely tal package is meant to contain new tal:expressions
        
        
        
        TextFormatter
        -------------
        
        option replace: takes a list of tuples, which characters or strings should be
        replaced by what, e.g.
        "replace python:[(origChar, repChar), (origChar2, repChar2), ...]"
        
        option allow:   takes a list of html-tags which shall be allowed in the string
        e.g. "allow python:['a', 'br', 'ul', 'li']"
        if this option is not set, the string is restricted to
        contain no html-tags, therefor the < and > are replaced
        by &lt;, &gt;
        
        option allow-all: allow all html-tags in the string
        e. g. "allow-all: 'True'"
        
        option break-string: force the string to break after a given number of characters
        e.g. "break-string python:25" breaks the string after
        a sequence of 25 characters not containing a linebreak
        
        option cut: cuts a string to the given length
        option attach: works only together with option 'cut',
        attaches the given string to the expression, if this is longer than
        number of characters given in option 'cut'
        
        <span tal:define="replace python:[('\n', '<br />')];
        allow python:['a', 'br'];
        break-string python:25;
        cut python 25;
        attach '...'"
        tal:content="structure textFormatter: view/description">Description</span>
        
        
        
        Lets see if the TextFormatter does what we want him to.
        
        We have to fake a context object to call the textformatter
        
        >>> class Context(object):
        ...     vars = {}
        ...     def __init__(self, vars):
        ...         self.vars = vars
        
        >>> from lovely.tal.textformatter import TextFormatter
        >>> from zope.tales.expressions import simpleTraverse
        >>> from zope.app.pagetemplate.engine import TrustedZopeEngine
        >>> tf = TextFormatter('textFormatter', 'view/title', TrustedZopeEngine(), simpleTraverse)
        >>> context = Context({})
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a>', context)
        '&lt;a href="#" name="foolink"&gt;foolink&lt;/a&gt;'
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>', context)
        '&lt;a href="#" name="foolink"&gt;foolink&lt;/a&gt;&lt;br /&gt;&lt;form action="."&gt;&lt;input type="text" /&gt;&lt;/form&gt;'
        
        if we provide an empty context, the textformatter translates all html-tags to &lt; &gt;
        
        Option 'allow'
        ==============
        
        We can allow certain html-tags in the text
        
        >>> context = Context({'allow':['a']})
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>', context)
        '<a href="#" name="foolink">foolink</a>&lt;br /&gt;&lt;form action="."&gt;&lt;input type="text" /&gt;&lt;/form&gt;'
        
        >>> context = Context({'allow':['a', 'br']})
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>', context)
        '<a href="#" name="foolink">foolink</a><br />&lt;form action="."&gt;&lt;input type="text" /&gt;&lt;/form&gt;'
        
        >>> context = Context({'allow':['a', 'br', 'form']})
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>', context)
        '<a href="#" name="foolink">foolink</a><br /><form action=".">&lt;input type="text" /&gt;</form>'
        
        In the above example, still the content of the form tag is translated
        
        Lets try to write dirty html
        
        >>> context = Context({'allow':['a', 'br', 'form']})
        >>> tf._doFormat('< a href="#" name="foolink">foolink</ a><br/>< form action="."><input type="text" /></form >', context)
        '&lt; a href="#" name="foolink"&gt;foolink&lt;/ a&gt;<br/>&lt; form action="."&gt;&lt;input type="text" /&gt;&lt;/form &gt;'
        
        Since the a-tag and the form-tag are not valid html, they are translated, although we declared them to be allowed
        We get the same result if we do not allow them
        
        >>> context = Context({'allow':['br']})
        >>> tf._doFormat('< a href="#" name="foolink">foolink</ a><br/>< form action="."><input type="text" /></form >', context)
        '&lt; a href="#" name="foolink"&gt;foolink&lt;/ a&gt;<br/>&lt; form action="."&gt;&lt;input type="text" /&gt;&lt;/form &gt;'
        
        
        Option 'allow-all'
        ==================
        
        We can allow all html-tags
        
        >>> context = Context({'allow-all':True})
        >>> tf._doFormat('<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>', context)
        '<a href="#" name="foolink">foolink</a><br /><form action="."><input type="text" /></form>'
        
        
        Option 'replace'
        ================
        
        We can replace characters or strings, e.g. we would like to replace the '\n' character by '<br />'
        to display the text properly.
        
        >>> context = Context({'replace':[('\n', '<br />')]})
        >>> tf._doFormat('das Schwein, \n das aus der Wueste kam', context)
        'das Schwein, <br /> das aus der Wueste kam'
        
        we can also replace strings
        
        >>> context = Context({'replace':[('\n', '<br />'), ('Schwein', 'Kamel')]})
        >>> tf._doFormat('das Schwein, \n das aus der Wueste kam', context)
        'das Kamel, <br /> das aus der Wueste kam'
        
        
        Option 'break-string'
        =====================
        
        Another option is to break strings after a given number of characters n, in case there
        was no break or '\s' in the last n characters.
        
        >>> context = Context({'break-string':8})
        >>> tf._doFormat('das Schwein, das aus der Wueste kam', context)
        'das<br />Schwein,<br />das aus<br />der<br />Wueste<br />kam'
        
        >>> context = Context({'break-string':8})
        >>> tf._doFormat('ein superlangerstring mit ein paar kurzen strings', context)
        'ein<br />superlan<br />gerstrin<br />g mit<br />ein paar<br />kurzen<br />strings'
        
        Also multi line text works.
        
        >>> context = Context({'break-string':40})
        >>> res = tf._doFormat("""
        ... ein superlangerstring mit ein paar kurzen strings.
        ...
        ... - another line
        ...
        ... - another long string which needs to break
        ... and this needs to break twice because it is longer than 80 characters, hopefully it works
        ... """, context)
        >>> print res.replace('<br />', '\n')
        <BLANKLINE>
        ein superlangerstring mit ein paar
        kurzen strings.
        <BLANKLINE>
        - another line
        <BLANKLINE>
        - another long string which needs to
        break
        and this needs to break twice because it
        is longer than 80 characters, hopefully
        it works
        <BLANKLINE>
        
        >>> context = Context({'break-string':20, 'allow':['br']})
        >>> text = u'eins zwei drei vier fuenf sechs sieben,<br />'
        >>> text += u'in der Schule wird geschrieben,<br />'
        >>> text += u'in der Schule wird gelacht,<br />'
        >>> text += u'bis der Lehrer pitschpatsch macht!'
        >>> res = tf._doFormat(text, context)
        >>> print res.replace('<br />', '\n')
        eins zwei drei vier
        fuenf sechs sieben,
        in der Schule wird
        geschrieben,
        in der Schule wird
        gelacht,
        bis der Lehrer
        pitschpatsch macht!
        
        the formatter considers tags as not to be part of the text, that means that
        breaks aren't made inside tags (<...>)
        
        >>> context = Context({'break-string':8, 'allow':['a']})
        >>> tf._doFormat('working at <a href="www.lovelysystems.com" name="lovelysystems">lovelysystems</a> is great!', context)
        'working<br />at<br /><a href="www.lovelysystems.com" name="lovelysystems">lovelysy<br />stems</a> is<br />great!'
        
        
        Option 'cut'
        ============
        
        We can also cut strings to a given length
        
        >>> context = Context({'cut':20})
        >>> rendered = tf._doFormat('ein superlangerstring mit ein paar kurzen strings', context)
        >>> len(rendered) == 20
        True
        
        
        Option 'attach'
        ===============
        
        and attach a string to the expression
        
        >>> context = Context({'cut':20, 'attach':'...'})
        >>> tf._doFormat('ein superlangerstring mit ein paar kurzen strings', context)
        'ein superlangerstrin...'
        
        
        CHANGES
        =======
        
        2007/08/29 0.2.1:
        -----------------
        
        - prepare checkin on zope.org
        
        2007/08/29 0.2.0:
        -----------------
        
        - increased version number to get rid of "dev" revision
        - changed buildout evironment
        
        Download
        ========
        
Keywords: tal zope zope3
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Zope Public License
Classifier: Topic :: Software Development :: Libraries :: Python Modules
