| | 8 | class PageList(object): |
|---|
| | 9 | def __init__(self, paginator): |
|---|
| | 10 | self.curpage = paginator.page(paginator.curpage) |
|---|
| | 11 | self.adjacent_count = paginator.adjacent_count |
|---|
| | 12 | |
|---|
| | 13 | def __repr__(self): |
|---|
| | 14 | return '<PageList current: %d - total:%d>' % \ |
|---|
| | 15 | (self.curpage.paginator.curpage, self.curpage.paginator.num_pages) |
|---|
| | 16 | |
|---|
| | 17 | def _add_range_as_element(self, open, close, start, end): |
|---|
| | 18 | markup = '' |
|---|
| | 19 | for i in range(start, end + 1): |
|---|
| | 20 | page = self.curpage.paginator.page(i) |
|---|
| | 21 | if self.curpage.number == i: |
|---|
| | 22 | markup += '%s<a class="curpage">%d</a>%s' % \ |
|---|
| | 23 | (open, i, close) |
|---|
| | 24 | else: |
|---|
| | 25 | markup += '%s<a href="%s">%d</a>%s' % \ |
|---|
| | 26 | (open, page.url(), i, close) |
|---|
| | 27 | return markup |
|---|
| | 28 | |
|---|
| | 29 | def _as_html(self, el, subel_open, subel_close): |
|---|
| | 30 | markup = '<%s class="pagelist">' % el |
|---|
| | 31 | if self.curpage.has_previous() or self.curpage.has_next(): |
|---|
| | 32 | markup += '%s<%s class="prev-next">' % (subel_open, el) |
|---|
| | 33 | if self.curpage.has_previous(): |
|---|
| | 34 | markup += '%s<a href="%s">« %s</a>%s' % \ |
|---|
| | 35 | (subel_open, self.curpage.previous_page_url(), |
|---|
| | 36 | _('Previous'), subel_close) |
|---|
| | 37 | if self.curpage.has_next(): |
|---|
| | 38 | markup += '%s<a href="%s">%s »</a>%s' % \ |
|---|
| | 39 | (subel_open, self.curpage.next_page_url(), |
|---|
| | 40 | _('Next'), subel_close) |
|---|
| | 41 | markup += '</%s>%s' % (el, subel_close) |
|---|
| | 42 | else: |
|---|
| | 43 | return u'' |
|---|
| | 44 | |
|---|
| | 45 | markup += '%s<%s class="start">' % (subel_open, el) |
|---|
| | 46 | end = self.adjacent_count + 1 |
|---|
| | 47 | if end > self.curpage.paginator.num_pages: |
|---|
| | 48 | end = self.curpage.paginator.num_pages |
|---|
| | 49 | if end == self.curpage.number: |
|---|
| | 50 | end -= 1 |
|---|
| | 51 | markup += self._add_range_as_element(subel_open, subel_close, 1, end) |
|---|
| | 52 | markup += '</%s>%s' % (el, subel_close) |
|---|
| | 53 | |
|---|
| | 54 | if self.curpage.number > self.adjacent_count: |
|---|
| | 55 | midstart = self.curpage.number - self.adjacent_count |
|---|
| | 56 | if midstart <= self.adjacent_count: |
|---|
| | 57 | midstart = self.adjacent_count + 1 |
|---|
| | 58 | midend = self.curpage.number + self.adjacent_count |
|---|
| | 59 | if midend > self.curpage.paginator.num_pages: |
|---|
| | 60 | midend = self.curpage.paginator.num_pages |
|---|
| | 61 | markup += '%s<%s class="middle">' % (subel_open, el) |
|---|
| | 62 | markup += self._add_range_as_element(subel_open, subel_close, |
|---|
| | 63 | midstart, midend) |
|---|
| | 64 | markup += '</%s>%s' % (el, subel_close) |
|---|
| | 65 | |
|---|
| | 66 | |
|---|
| | 67 | start = self.curpage.paginator.num_pages - self.adjacent_count |
|---|
| | 68 | if start > self.adjacent_count and start > self.curpage.number + self.adjacent_count: |
|---|
| | 69 | markup += '%s<%s class="end">' % (subel_open, el) |
|---|
| | 70 | markup += self._add_range_as_element(subel_open, subel_close, |
|---|
| | 71 | start, self.curpage.paginator.num_pages) |
|---|
| | 72 | markup += '</%s>%s' % (el, subel_close) |
|---|
| | 73 | markup += '</%s>' % el |
|---|
| | 74 | |
|---|
| | 75 | return mark_safe(markup) |
|---|
| | 76 | |
|---|
| | 77 | def as_ul(self): |
|---|
| | 78 | return self._as_html('ul', '<li>', '</li>') |
|---|
| | 79 | |
|---|
| | 80 | def as_div(self): |
|---|
| | 81 | return self._as_html('div', '', '') |
|---|
| | 82 | |
|---|
| | 83 | |
|---|