[jinja] rekursiv Daten (Sitemap)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ein Frage die ich mich schon lange Frage...

Wie kann man mit jinja rekursive Daten darstellen, wie z.B. eine Sitemap in Baumansicht??? (Wie z.B. http://pylucid.org/index.py/SiteMap/ )

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

So:

Code: Alles auswählen

<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
  <li><a href="{{ item.href }}">{{ item.title|escape }}</a>{%
   if item.subtitems %}<ul>{% recurse item.subtitems %}</ul>{% endif %}
{% endfor %}
</ul>
Und hier der context:

Code: Alles auswählen

sitemap = [
  {'href': '', 'title': 'blub', 'subitems': [
    {'href': 'asdfsadf', 'title': 'sadfsadfd'},
    {'href': 'asdfasdff', 'title': 'sasdfasdfsadffd'}
  ]},
  {'href': 'asdasdfasdfadf', 'title': 'sasdfasdfasdfsadfdffd'}
]
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Aha! "recurse" ??? Was heißt das? Oder meinst du reuse?

In der Docu konnte ich darüber nicht's finden...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Aha! "recurse" ??? Was heißt das?
Ich denke es heißt rekursiere, also von Rekursion.

Alternativ kann es auch "wiederfluchen" heißen, "curse" von fluchen und "re" von etwas wiederholt tun ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:Aha! "recurse" ??? Was heißt das? Oder meinst du reuse?

In der Docu konnte ich darüber nicht's finden...
Weil wir es zwar implementiert haben, aber noch nicht sicher waren ob wir es wirklich so verwenden wollen. Mittlerweile isses aber fix, mit dem nächsten release wirds dokumentiert.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich hab es nun mal Probiert, aber es will nicht so ganz...

Mein context:

Code: Alles auswählen

{'sitemap': [{'deep': 0,
              'href': u'/Index/',
              'id': 1L,
              'name': u'index',
              'subitems': [{'deep': 1,
                            'href': u'/Index/PhpBBadmin/',
                            'id': 9L,
                            'name': u'phpBBadmin',
                            'title': u'phpBBadmin'}],
              'title': u'index'},
             {'deep': 0,
              'href': u'/ExamplePages/',
              'id': 2L,
              'name': u'example pages',
              'subitems': [{'deep': 1,
                            'href': u'/ExamplePages/TinyTextileExample/',
                            'id': 3L,
                            'name': u'tinyTextile example',
                            'title': u'complete tinyTextile Formating examples'},
                           {'deep': 1,
                            'href': u'/ExamplePages/Testpage/',
                            'id': 6L,
                            'name': u'testpage',
                            'title': u'a testpage ;)'},
                           {'deep': 1,
                            'href': u'/ExamplePages/SourceCode/',
                            'id': 7L,
                            'name': u'SourceCode',
                            'title': u'SourceCode'},
                           {'deep': 1,
                            'href': u'/ExamplePages/Contact/',
                            'id': 5L,
                            'name': u'contact',
                            'title': u'contact'},
                           {'deep': 1,
                            'href': u'/ExamplePages/SiteMap/',
                            'id': 4L,
                            'name': u'SiteMap',
                            'title': u'SiteMap'}],
              'title': u'example pages'},
             {'deep': 0,
              'href': u'/Test/',
              'id': 8L,
              'name': u'test',
              'title': u'test'}]}
Das Template:

Code: Alles auswählen

<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
  <li>
    <a href="{{ item.href }}">{{ item.title|escape }}</a>
    {% if item.subtitems %}<ul>{% recurse item.subtitems %}</ul>{% endif %}
{% endfor %}
</ul>
Der Fehler:

Code: Alles auswählen

Traceback (most recent call last):
...
  File "W:\testing_Server\PyLucid07branch\jinja\tags.py", line 153, in __init__
    self._body_loop, self._body_else = parser.forkparse('elsefor', 'endfor')
  File "W:\testing_Server\PyLucid07branch\jinja\base.py", line 224, in forkparse
    result_one = self.parse([shift, endtag])
  File "W:\testing_Server\PyLucid07branch\jinja\base.py", line 194, in parse
    nodelist.append(self.library.parse(self, 'print %s' % token.contents))
  File "W:\testing_Server\PyLucid07branch\jinja\lib.py", line 64, in parse
    parser.finish()
  File "W:\testing_Server\PyLucid07branch\jinja\tagparser.py", line 362, in finish
    self._process_feed()
  File "W:\testing_Server\PyLucid07branch\jinja\tagparser.py", line 544, in _process_feed
    raise RuntimeError('Expected one of %s, found %s' %
RuntimeError: Expected one of [((<function do_cut at 0x00B58C30>, None), <KeywordNode: 'cut'>), ((<function do_autolinktrunc at 0x00B587B0>, None), <KeywordNode: 'autolinktrunc'>), ((<function do_join at 0x00B58470>, None), <KeywordNode: 'join'>), ((<function do_int at 0x00B58F30>, None), <KeywordNode: 'int'>), ((<function do_str at 0x00B58EF0>, None), <KeywordNode: 'str'>), ((<function do_striphtml at 0x00B585B0>, None), <KeywordNode: 'striphtml'>), ((<function do_escapexml at 0x00B58270>, None), <KeywordNode: 'escapexml'>), ((<function do_strip at 0x00B58DF0>, None), <KeywordNode: 'strip'>), ((<function do_addslashes at 0x00B582F0>, None), <KeywordNode: 'addslashes'>), ((<function do_filesizeformat at 0x00B58CF0>, None), <KeywordNode: 'filesizeformat'>), ((<function alias::do_escapexml at 0x00B5A070>, None), <KeywordNode: 'e'>), ((<function do_rst at 0x00B58BF0>, None), <KeywordNode: 'rst'>), ((<function do_decode at 0x00B58EB0>, None), <KeywordNode: 'decode'>), ((<function do_capitalize at 0x00B58370>, None), <KeywordNode: 'capitalize'>), ((<function do_nl2pbr at 0x00B58630>, None), <KeywordNode: 'nl2pbr'>), ((<function do_sort at 0x00B58830>, None), <KeywordNode: 'sort'>), ((<function do_regexreplace at 0x00B58E70>, None), <KeywordNode: 'regexreplace'>), ((<function do_truncate at 0x00B589F0>, None), <KeywordNode: 'truncate'>), ((<function do_cleanup at 0x00B58CB0>, None), <KeywordNode: 'cleanup'>), ((<function do_upper at 0x00B58170>, None), <KeywordNode: 'upper'>), ((<function do_default at 0x00B58430>, None), <KeywordNode: 'default'>), ((<function do_format at 0x00B588F0>, None), <KeywordNode: 'format'>), ((<function do_bool at 0x00B58FB0>, None), <KeywordNode: 'bool'>), ((<function do_autolink at 0x00B58730>, None), <KeywordNode: 'autolink'>), ((<function do_reverse at 0x00B587F0>, None), <KeywordNode: 'reverse'>), ((<function do_float at 0x00B58F70>, None), <KeywordNode: 'float'>), ((<function do_textile at 0x00B58AF0>, None), <KeywordNode: 'textile'>), ((<function do_wordwrap at 0x00B58A70>, None), <KeywordNode: 'wordwrap'>), ((<function do_urlencode at 0x00B58530>, None), <KeywordNode: 'urlencode'>), ((<function do_deletedouble at 0x00B588B0>, None), <KeywordNode: 'deletedouble'>), ((<function do_wordcount at 0x00B58D70>, None), <KeywordNode: 'wordcount'>), ((<function do_makebool at 0x00B5A030>, None), <KeywordNode: 'makebool'>), ((<function do_slice at 0x00B58870>, None), <KeywordNode: 'slice'>), ((<function do_title at 0x00B583F0>, None), <KeywordNode: 'title'>), ((<function do_nl2br at 0x00B586B0>, None), <KeywordNode: 'nl2br'>), ((<function do_markdown at 0x00B58B70>, None), <KeywordNode: 'markdown'>), ((<function do_replace at 0x00B580F0>, None), <KeywordNode: 'replace'>), ((<function do_lower at 0x00B581F0>, None), <KeywordNode: 'lower'>), ((<function do_count at 0x00B584B0>, None), <KeywordNode: 'count'>), ((<function do_indent at 0x00B58970>, None), <KeywordNode: 'indent'>)], found <NameVal: u'escape'>
Wo könnte der Fehler liegen???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
beewee
User
Beiträge: 35
Registriert: Mittwoch 18. Januar 2006, 22:16

probier vieleicht mal statt "|escape" "|e" zu verwenden ;-)

BeeWee

P.S.: @mitsuhiko: Zeit, mal wieder die doku zu aktualisieren ;-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

beewee hat geschrieben:probier vieleicht mal statt "|escape" "|e" zu verwenden ;-)
Jep, mit |e geht's... Warum geht's nicht mit |escape ???

Wobei das erzeugte Sitemap leider nicht richtig ist. Ich sehe nur die erste Ebene... Nix von "recurse"...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

beewee hat geschrieben:P.S.: @mitsuhiko: Zeit, mal wieder die doku zu aktualisieren ;-)
Schon getan :D
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:Wobei das erzeugte Sitemap leider nicht richtig ist. Ich sehe nur die erste Ebene... Nix von "recurse"...
Ich hab mal einen bug geschrieben: http://trac.pocoo.org/ticket/46

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Und es geht doch und es war mein Fehler, denn subtitems!=subitems :oops:

Hier der testcode:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from jinja import Template, Context, StringLoader

context = {'sitemap': [{'href': u'/Index/',
              'subitems': [{'href': u'/Index/PhpBBadmin/',
                            'title': u'phpBBadmin'}],
              'title': u'index'},
             {'href': u'/ExamplePages/',
              'subitems': [{'href': u'/ExamplePages/TinyTextileExample/',
                            'title': u'complete tinyTextile Formating examples'},
                           {'href': u'/ExamplePages/Testpage/',
                            'title': u'a testpage ;)'},
                           {'href': u'/ExamplePages/SourceCode/',
                            'title': u'SourceCode'},
                           {'href': u'/ExamplePages/Contact/',
                            'title': u'contact'},
                           {'href': u'/ExamplePages/SiteMap/',
                            'title': u'SiteMap'}],
              'title': u'example pages'},
             {'href': u'/Test/', 'title': u'test'}]}

template = """
<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
  <li>
    <a href="{{ item.href }}">{{ item.title|escapexml }}</a>
    {% if item.subitems %}
        <ul>{% recurse item.subitems %}</ul>
    {% endif %}
  </li>
{% endfor %}
</ul>
"""

t = Template(template, StringLoader())
c = Context(context)

print t.render(c)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
beewee
User
Beiträge: 35
Registriert: Mittwoch 18. Januar 2006, 22:16

Jep, mit |e geht's... Warum geht's nicht mit |escape ???
Weil blackbird zu faul war, bei Pocoo immer |escape zu schreiben, |e geht einfach schneller ;-)
Sonst hat es afaik keinen tieferen Sinn.

BeeWee
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Naja, ich hab vergessen |escapexml zu schreiben, wie es eigentlicht richtig ist :)

Dumm ist jedenfalls das die Fehlermeldung nicht so toll ist... Zumindest ist es ungewöhnlich das man so eine lange Fehlermeldung bekommt. Außerdem wäre ich nicht auf die Idee gekommen, auf den letzten Teil der Fehlermeldung zu achten ;)

Aber naja, ich denke das liegt am "komplexen" Context...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten