''') % (self.url_maker(page), text)
-
- def _get_pos(self, cur_page, max_page, items):
- edge = (items / 2) + 1
- if (cur_page <= edge):
- radius = max(items / 2, items - cur_page)
- elif (max_page - cur_page) < edge:
- radius = (items - 1) - (max_page - cur_page)
- else:
- radius = items / 2
-
- left = max(1, (cur_page - (radius)))
- right = min(max_page, cur_page + (radius))
- return left, cur_page, right
-
- def _range(self, regexp_match):
- """
- Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
-
- Arguments:
-
- regexp_match
- A "re" (regular expressions) match object containing the
- radius of linked pages around the current page in
- regexp_match.group(1) as a string
-
- This function is supposed to be called as a callable in
- re.sub.
-
- """
- radius = int(regexp_match.group(1))
-
- # Compute the first and last page number within the radius
- # e.g. '1 .. 5 6 [7] 8 9 .. 12'
- # -> leftmost_page = 5
- # -> rightmost_page = 9
- leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
- self.last_page,
- (radius * 2) + 1)
- nav_items = []
-
- # Create a link to the first page (unless we are on the first page
- # or there would be no need to insert '..' spacers)
- if self.page != self.first_page and self.first_page < leftmost_page:
- nav_items.append(HTML.li(self._pagerlink(self.first_page, self.first_page)))
-
- # Insert dots if there are pages between the first page
- # and the currently displayed page range
- if leftmost_page - self.first_page > 1:
- # Wrap in a SPAN tag if nolink_attr is set
- text_ = '..'
- if self.dotdot_attr:
- text_ = HTML.span(c=text_, **self.dotdot_attr)
- nav_items.append(HTML.li(text_))
+ def pager(self):
+ return literal(
+ paginate.Page.pager(self,
+ format='
$link_previous\n~4~$link_next
',
+ link_attr={'class': 'pager_link'},
+ dotdot_attr={'class': 'pager_dotdot'},
+ separator='\n',
+ ))
- for thispage in xrange(leftmost_page, rightmost_page + 1):
- # Highlight the current page number and do not use a link
- text_ = str(thispage)
- if thispage == self.page:
- # Wrap in a SPAN tag if nolink_attr is set
- if self.curpage_attr:
- text_ = HTML.li(HTML.span(c=text_), **self.curpage_attr)
- nav_items.append(text_)
- # Otherwise create just a link to that page
- else:
- nav_items.append(HTML.li(self._pagerlink(thispage, text_)))
-
- # Insert dots if there are pages between the displayed
- # page numbers and the end of the page range
- if self.last_page - rightmost_page > 1:
- text_ = '..'
- # Wrap in a SPAN tag if nolink_attr is set
- if self.dotdot_attr:
- text_ = HTML.span(c=text_, **self.dotdot_attr)
- nav_items.append(HTML.li(text_))
-
- # Create a link to the very last page (unless we are on the last
- # page or there would be no need to insert '..' spacers)
- if self.page != self.last_page and rightmost_page < self.last_page:
- nav_items.append(HTML.li(self._pagerlink(self.last_page, self.last_page)))
-
- #_page_link = url.current()
- #nav_items.append(literal('' % (_page_link, str(int(self.page)+1))))
- #nav_items.append(literal('' % (_page_link, str(int(self.page)+1))))
- return self.separator.join(nav_items)
+ @staticmethod
+ def default_link_tag(item):
+ # based on the base class implementation, but wrapping results in
, and with different handling of current_page
+ text = item['value']
+ if item['type'] == 'current_page': # we need active on the li and can thus not use curpage_attr
+ return '''
%s
''' % text
- def pager(self, format='
$link_previous ~2~ $link_next
', page_param='page', partial_param='partial',
- show_if_single_page=False, separator=' ', onclick=None,
- symbol_first='<<', symbol_last='>>',
- symbol_previous='<', symbol_next='>',
- link_attr=None,
- curpage_attr=None,
- dotdot_attr=None, **kwargs
- ):
- self.curpage_attr = curpage_attr or {'class': 'active'}
- self.separator = separator
- self.pager_kwargs = kwargs
- self.page_param = page_param
- self.partial_param = partial_param
- self.onclick = onclick
- self.link_attr = link_attr or {'class': 'pager_link', 'rel': 'prerender'}
- self.dotdot_attr = dotdot_attr or {'class': 'pager_dotdot'}
-
- # Don't show navigator if there is no more than one page
- if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
- return ''
-
- from string import Template
- # Replace ~...~ in token format by range of pages
- result = re.sub(r'~(\d+)~', self._range, format)
-
- # Interpolate '%' variables
- result = Template(result).safe_substitute({
- 'first_page': self.first_page,
- 'last_page': self.last_page,
- 'page': self.page,
- 'page_count': self.page_count,
- 'items_per_page': self.items_per_page,
- 'first_item': self.first_item,
- 'last_item': self.last_item,
- 'item_count': self.item_count,
- 'link_first': self.page > self.first_page and
- self._pagerlink(self.first_page, symbol_first) or '',
- 'link_last': self.page < self.last_page and
- self._pagerlink(self.last_page, symbol_last) or '',
- 'link_previous': HTML.li(self.previous_page and
- self._pagerlink(self.previous_page, symbol_previous)
- or HTML.a(symbol_previous)),
- 'link_next': HTML.li(self.next_page and
- self._pagerlink(self.next_page, symbol_next)
- or HTML.a(symbol_next)),
- })
-
- return literal(result)
+ if not item['href'] or item['type'] == 'span':
+ if item['attrs']:
+ text = paginate.make_html_tag('span', **item['attrs']) + text + ''
+ else:
+ target_url = item['href']
+ text = paginate.make_html_tag('a', text=text, href=target_url, **item['attrs'])
+ return '''