docs: def recurse(parser, token):
      """
      Iterate recurse data structure.
      <ul>
          {% recurse items %}
              <li>
                  {{ item.name }}
                  {% if item.children %}
                      <ul>
                          {{ subitems }}
                      </ul>
                  {% endif %}
              </li>
          {% endrecurse %}
      </ul>
      If subelements found in other key/attribute/method then need set its name (default is 'children'):
          {% recurse items 'subitems' %}
      Also available depth level in variable {{ recurse_level }} (starting of 1)
      """
      params = token.contents.split()
      if not 2 <= len(params) <= 3:
          raise template.TemplateSyntaxError('%s parameters error' % params[0])
      template_nodes = parser.parse(('endrecurse',))
      parser.delete_first_token()
      return RecurseNode(template_nodes,
                         template.Variable(params[1]),
                         (params[2][1:-1] if len(params) == 3 else 'children'))