Fixed #3184 -- Changed the `unordered_list` template filter to use a more simple format, while maintaining backwards compatibility with the old format. `unordered_list` now works with a simple list of items. Thanks for the patch, SmileyChris.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6019 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
32c729be10
commit
1a1a58c9f8
|
@ -355,8 +355,8 @@ def unordered_list(value):
|
||||||
Recursively takes a self-nested list and returns an HTML unordered list --
|
Recursively takes a self-nested list and returns an HTML unordered list --
|
||||||
WITHOUT opening and closing <ul> tags.
|
WITHOUT opening and closing <ul> tags.
|
||||||
|
|
||||||
The list is assumed to be in the proper format. For example, if ``var`` contains
|
The list is assumed to be in the proper format. For example, if ``var``
|
||||||
``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``,
|
contains: ``['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]``,
|
||||||
then ``{{ var|unordered_list }}`` would return::
|
then ``{{ var|unordered_list }}`` would return::
|
||||||
|
|
||||||
<li>States
|
<li>States
|
||||||
|
@ -371,14 +371,61 @@ def unordered_list(value):
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
"""
|
"""
|
||||||
def _helper(value, tabs):
|
def convert_old_style_list(list_):
|
||||||
|
"""
|
||||||
|
Converts old style lists to the new easier to understand format.
|
||||||
|
|
||||||
|
The old list format looked like:
|
||||||
|
['Item 1', [['Item 1.1', []], ['Item 1.2', []]]
|
||||||
|
|
||||||
|
And it is converted to:
|
||||||
|
['Item 1', ['Item 1.1', 'Item 1.2]]
|
||||||
|
"""
|
||||||
|
if not isinstance(list_, (tuple, list)) or len(list_) != 2:
|
||||||
|
return list_, False
|
||||||
|
first_item, second_item = list_
|
||||||
|
if second_item == []:
|
||||||
|
return [first_item], True
|
||||||
|
old_style_list = True
|
||||||
|
new_second_item = []
|
||||||
|
for sublist in second_item:
|
||||||
|
item, old_style_list = convert_old_style_list(sublist)
|
||||||
|
if not old_style_list:
|
||||||
|
break
|
||||||
|
new_second_item.extend(item)
|
||||||
|
if old_style_list:
|
||||||
|
second_item = new_second_item
|
||||||
|
return [first_item, second_item], old_style_list
|
||||||
|
def _helper(list_, tabs=1):
|
||||||
indent = u'\t' * tabs
|
indent = u'\t' * tabs
|
||||||
if value[1]:
|
output = []
|
||||||
return u'%s<li>%s\n%s<ul>\n%s\n%s</ul>\n%s</li>' % (indent, force_unicode(value[0]), indent,
|
|
||||||
u'\n'.join([_helper(v, tabs+1) for v in value[1]]), indent, indent)
|
list_length = len(list_)
|
||||||
else:
|
i = 0
|
||||||
return u'%s<li>%s</li>' % (indent, force_unicode(value[0]))
|
while i < list_length:
|
||||||
return _helper(value, 1)
|
title = list_[i]
|
||||||
|
sublist = ''
|
||||||
|
sublist_item = None
|
||||||
|
if isinstance(title, (list, tuple)):
|
||||||
|
sublist_item = title
|
||||||
|
title = ''
|
||||||
|
elif i < list_length - 1:
|
||||||
|
next_item = list_[i+1]
|
||||||
|
if next_item and isinstance(next_item, (list, tuple)):
|
||||||
|
# The next item is a sub-list.
|
||||||
|
sublist_item = next_item
|
||||||
|
# We've processed the next item now too.
|
||||||
|
i += 1
|
||||||
|
if sublist_item:
|
||||||
|
sublist = _helper(sublist_item, tabs+1)
|
||||||
|
sublist = '\n%s<ul>\n%s\n%s</ul>\n%s' % (indent, sublist,
|
||||||
|
indent, indent)
|
||||||
|
output.append('%s<li>%s%s</li>' % (indent, force_unicode(title),
|
||||||
|
sublist))
|
||||||
|
i += 1
|
||||||
|
return '\n'.join(output)
|
||||||
|
value, converted = convert_old_style_list(value)
|
||||||
|
return _helper(value)
|
||||||
|
|
||||||
###################
|
###################
|
||||||
# INTEGERS #
|
# INTEGERS #
|
||||||
|
|
|
@ -1301,9 +1301,14 @@ unordered_list
|
||||||
Recursively takes a self-nested list and returns an HTML unordered list --
|
Recursively takes a self-nested list and returns an HTML unordered list --
|
||||||
WITHOUT opening and closing <ul> tags.
|
WITHOUT opening and closing <ul> tags.
|
||||||
|
|
||||||
|
**Changed in Django development version**
|
||||||
|
|
||||||
|
The format accepted by ``unordered_list`` has changed to an easier to
|
||||||
|
understand format.
|
||||||
|
|
||||||
The list is assumed to be in the proper format. For example, if ``var`` contains
|
The list is assumed to be in the proper format. For example, if ``var`` contains
|
||||||
``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``,
|
``['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]``, then
|
||||||
then ``{{ var|unordered_list }}`` would return::
|
``{{ var|unordered_list }}`` would return::
|
||||||
|
|
||||||
<li>States
|
<li>States
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -1317,6 +1322,9 @@ then ``{{ var|unordered_list }}`` would return::
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
Note: the previous more restrictive and verbose format is still supported:
|
||||||
|
``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``,
|
||||||
|
|
||||||
upper
|
upper
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
|
|
|
@ -266,6 +266,22 @@ u'bc'
|
||||||
>>> slice_(u'abcdefg', u'0::2')
|
>>> slice_(u'abcdefg', u'0::2')
|
||||||
u'aceg'
|
u'aceg'
|
||||||
|
|
||||||
|
>>> unordered_list([u'item 1', u'item 2'])
|
||||||
|
u'\t<li>item 1</li>\n\t<li>item 2</li>'
|
||||||
|
|
||||||
|
>>> unordered_list([u'item 1', [u'item 1.1']])
|
||||||
|
u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t</ul>\n\t</li>'
|
||||||
|
|
||||||
|
>>> unordered_list([u'item 1', [u'item 1.1', u'item1.2'], u'item 2'])
|
||||||
|
u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t\t<li>item1.2</li>\n\t</ul>\n\t</li>\n\t<li>item 2</li>'
|
||||||
|
|
||||||
|
>>> unordered_list([u'item 1', [u'item 1.1', [u'item 1.1.1', [u'item 1.1.1.1']]]])
|
||||||
|
u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1\n\t\t<ul>\n\t\t\t<li>item 1.1.1\n\t\t\t<ul>\n\t\t\t\t<li>item 1.1.1.1</li>\n\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\t\t</li>\n\t</ul>\n\t</li>'
|
||||||
|
|
||||||
|
>>> unordered_list(['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']])
|
||||||
|
u'\t<li>States\n\t<ul>\n\t\t<li>Kansas\n\t\t<ul>\n\t\t\t<li>Lawrence</li>\n\t\t\t<li>Topeka</li>\n\t\t</ul>\n\t\t</li>\n\t\t<li>Illinois</li>\n\t</ul>\n\t</li>'
|
||||||
|
|
||||||
|
# Old format for unordered lists should still work
|
||||||
>>> unordered_list([u'item 1', []])
|
>>> unordered_list([u'item 1', []])
|
||||||
u'\t<li>item 1</li>'
|
u'\t<li>item 1</li>'
|
||||||
|
|
||||||
|
@ -275,6 +291,9 @@ u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t</ul>\n\t</li>'
|
||||||
>>> unordered_list([u'item 1', [[u'item 1.1', []], [u'item 1.2', []]]])
|
>>> unordered_list([u'item 1', [[u'item 1.1', []], [u'item 1.2', []]]])
|
||||||
u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t\t<li>item 1.2</li>\n\t</ul>\n\t</li>'
|
u'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t\t<li>item 1.2</li>\n\t</ul>\n\t</li>'
|
||||||
|
|
||||||
|
>>> unordered_list(['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]])
|
||||||
|
u'\t<li>States\n\t<ul>\n\t\t<li>Kansas\n\t\t<ul>\n\t\t\t<li>Lawrence</li>\n\t\t\t<li>Topeka</li>\n\t\t</ul>\n\t\t</li>\n\t\t<li>Illinois</li>\n\t</ul>\n\t</li>'
|
||||||
|
|
||||||
>>> add(u'1', u'2')
|
>>> add(u'1', u'2')
|
||||||
3
|
3
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue