def test_it_detects_simple_interpolations():

    assert parse_interpolations('chips $fish') == [
        'chips ', Interpolation('$fish', 'fish')
    ]

    assert parse_interpolations('chips $fish[0]') == [
        'chips ', Interpolation('$fish[0]', 'fish[0]')
    ]

    assert parse_interpolations('chips $fish[::-1]') == [
        'chips ', Interpolation('$fish[::-1]', 'fish[::-1]')
    ]

    assert parse_interpolations('chips $fish[1:-1]') == [
        'chips ', Interpolation('$fish[1:-1]', 'fish[1:-1]')
    ]

    assert parse_interpolations('chips $eggs[0].sausages mash') == [
        'chips ',
        Interpolation('$eggs[0].sausages', 'eggs[0].sausages'), ' mash'
    ]
def _interpolated_str_to_ast_value(source):
    items = List(
        [(Str(item)
          if isinstance(item, (str, ustr))
          else parse_and_strip(u'x = ({})'.format(item.value))[0].value)
         for item in interpolate.parse_interpolations(source)],
        Load()
    )
    return Call(func=Attribute(Str(''), 'join', Load()),
                args=[items],
                starargs=None,
                kwargs=None,
                keywords=[])
def _compile_attr(a, container):
    """
    Compile a single parse.Attribute
    """
    intro_text = im.TextNode.factory(
        '{0.name}{0.space1}={0.space2}{0.quote}'.format(a), pos=a.pos)
    outro_text = im.TextNode.factory('{0.quote}{0.space3}'.format(a),
                                     pos=a.value_pos.advance(a.value))

    items = interpolate.parse_interpolations(a.value)

    if a.name in HTML_EMPTY_ATTRS and \
       len(items) == 1 and \
       isinstance(items[0], interpolate.Interpolation):
        interp = items[0]
        container.append(
            im.WithNode(vars=[('__piglet_tmp', interp.value)],
                        pos=a.pos,
                        children=[
                            im.IfNode(test='__piglet_tmp is not None',
                                      pos=a.pos,
                                      children=[
                                          intro_text,
                                          im.InterpolateNode(
                                              value='__piglet_tmp',
                                              pos=a.value_pos), outro_text
                                      ])
                        ]))
    else:
        container.append(intro_text)
        pos = a.value_pos
        for i in items:
            if isinstance(i, (str, ustr)):
                container.append(im.TextNode.factory(i, pos))
                pos = pos.advance(i)
            else:
                container.append(
                    im.InterpolateNode(value=unescape(i.value), pos=pos))
                pos = pos.advance(i.source)
        outro_text.pos = pos
        container.append(outro_text)
def _compile_text(node):
    """
    Compile :class:`piglet.parse.Text` object ``node`` into intermediate Text
    and Interpolation nodes.

    :param node: the :class:`piglet.parse.Text` object
    """
    items = interpolate.parse_interpolations(node.content)
    container = im.ContainerNode()
    pos = node.pos
    for i in items:
        if isinstance(i, (str, ustr)):
            container.append(im.TextNode(i, pos=pos))
            pos = pos.advance(i)
        elif isinstance(i, interpolate.Interpolation):
            container.append(
                im.InterpolateNode.factory(value=unescape(i.value),
                                           pos=pos,
                                           autoescape=i.autoescape
                                           and (not node.cdata)))
            pos = pos.advance(i.source)
    return container
def test_it_detects_delimited_interpolations():
    assert parse_interpolations('fish ${{"foo": "bar"}[item]} chips') == [
        'fish ',
        Interpolation('${{"foo": "bar"}[item]}', '{"foo": "bar"}[item]'),
        ' chips'
    ]
def test_it_handles_escaped_dollars():
    assert parse_interpolations('$${') == ['$', '{']
def test_it_handles_dollars_in_other_contexts():
    assert parse_interpolations('$11') == ['$', '11']
    assert parse_interpolations('1$') == ['1', '$']
    assert parse_interpolations('$$$') == ['$', '$']
    assert parse_interpolations('$$el') == ['$', 'el']
def test_it_parses_text():
    assert parse_interpolations('xyzzy') == ['xyzzy']