AutoList Macro

This macro automatically generates an HTML unordered list from a Python list. Nested lists are also supported.

macro ( 'AutoList', lambda data, level=0:
    data and (
        T.ul ( class_='autolist level-%s' % level ) [
            [ T.li [
                  [ lambda _i, _j: _i, AutoList ]
                  [ isinstance ( _i, list ) ]( _i, level + 1 )
              ]
            for _i in data ]
        ]
    ) or ''
)

then given the following data:

sublist1 = [ "List 1:%s" % _i for _i in range ( 3 ) ]
sublist2 = [ "List 2:%s" % _i for _i in range ( 3, 6 ) ]
sublist3 = [ "List 3:%s" % _i for _i in range ( 6, 9 ) ]
sublist3.append ( sublist2 )

data = [
    'Item A', 'Item B', 'Item C',
    sublist1,
    'Item D', 'Item E', 'Item F',
    sublist3,
]

and the following template:

html [
    head [ title [ 'AutoList Demo' ] ],
    body [ AutoList ( data ) ]
]

you'd get the following:

<html>
  <head><title>AutoList Demo</title></head>
  <body>
    <ul class="autolist level-0">
      <li>Item A</li>
      <li>Item B</li>
      <li>Item C</li>
      <li>
        <ul class="autolist level-1">
          <li>List 1:0</li>
          <li>List 1:1</li>
          <li>List 1:2</li>
        </ul>
      </li>
      <li>Item D</li>
      <li>Item E</li>
      <li>Item F</li>
      <li>
        <ul class="autolist level-1">
          <li>List 3:6</li>
          <li>List 3:7</li>
          <li>List 3:8</li>
          <li>
            <ul class="autolist level-2">
              <li>List 2:3</li>
              <li>List 2:4</li>
              <li>List 2:5</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </body>
</html>
edit page
Back to top
Rendered using Brevé 1.3.0Copyright © 2007, Cliff Wells