-# -*- coding: utf-8 -*-
# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
continue
-class SortedMultiQuerySet(MultiQuerySet):
- def __init__(self, *args, **kwargs):
- self.order_by = kwargs.pop('order_by', None)
- self.sortfn = kwargs.pop('sortfn', None)
- if self.order_by is not None:
- self.sortfn = lambda a, b: cmp((getattr(a, f) for f in self.order_by),
- (getattr(b, f) for f in self.order_by))
- super(SortedMultiQuerySet, self).__init__(*args, **kwargs)
-
- def __getitem__(self, item):
- sort_heads = [0] * len(self.querysets)
- try:
- (offset, stop, step) = item.indices(self.count())
- except AttributeError:
- # it's not a slice - make it one
- return self[item:item + 1][0]
- items = []
- total_len = stop - offset
- skipped = 0
- i_s = range(len(sort_heads))
-
- while len(items) < total_len:
- candidate = None
- candidate_i = None
- for i in i_s:
- def get_next():
- return self.querysets[i][sort_heads[i]]
- try:
- if candidate is None:
- candidate = get_next()
- candidate_i = i
- else:
- competitor = get_next()
- if self.sortfn(candidate, competitor) > 0:
- candidate = competitor
- candidate_i = i
- except IndexError:
- continue # continue next sort_head
- # we have no more elements:
- if candidate is None:
- break
- sort_heads[candidate_i] += 1
- if skipped < offset:
- skipped += 1
- continue # continue next item
- items.append(candidate)
-
- return items
-
-
def truncate_html_words(s, num, end_text='...'):
"""Truncates HTML to a certain number of words (not counting tags and
comments). Closes opened tags if they were correctly closed in the given
s = force_text(s)
length = int(num)
if length <= 0:
- return u''
+ return ''
html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
# Set up regular expressions
re_words = re.compile(r'&.*?;|<.*?>|(\w[\w-]*)', re.U)