def __call__(self, stream): for event in stream: mark, (kind, data, pos) = event if self._value: yield event # Yield the event so the column is closed # Depending on the stream data may be # '{http://www.w3.org/1999/xhtml}td' or just 'td' if mark == 'INSIDE' and kind == 'END' and data.endswith('td'): # The end of a table column, tag: </td> self._td += 1 if self._td == 3: try: self.content = \ html.td(self._all_comp[self._value], class_='parent') except KeyError: self.content = html.td(class_='parent') self._value = None self._td = 0 for n, ev in self._inject(): yield 'INSIDE', ev else: if mark == 'INSIDE' and kind == 'START' and \ data[0].localname == 'input': if data[1].get('type') == u'checkbox': self._value = data[1].get('value') or \ data[1].get('name') self._td = 0 yield event
def render_def(s): rendered = s and render_item(s) or None if isinstance(s, str): s = Markup(s.replace('&', '&')) return [ tag.td(rendered, nbsp, style='border:none'), tag.td(tag.kbd(s), style=value_style) ]
def expand_macro(self, formatter, name, content, args=None): t = [render_table(p, '1', lambda s: self._format_phrase(formatter, s, None)) for p in [self.fixme_phrases, self.todo_phrases, self.done_phrases]] style = 'border:none;text-align:center;vertical-align:top' spacer = tag.td(style='width:2em;border:none') return tag.table(tag.tr(tag.td(t[0], style=style), spacer, tag.td(t[1], style=style), spacer, tag.td(t[2], style=style)))
def _create_subtickets_table(self, req, children, tbody, depth=0): """Recursively create list table of subtickets """ if not children: return for id in sorted(children, key=lambda x: int(x)): ticket = Ticket(self.env, id) # the row r = [] # Always show ID and summary attrs = {'href': req.href.ticket(id)} if ticket['status'] == 'closed': attrs['class_'] = 'closed' link = tag.a('#%s' % id, **attrs) summary = tag.td(link, ': %s' % ticket['summary'], style='padding-left: %dpx;' % (depth * 15)) r.append(summary) # Add other columns as configured. for column in \ self.env.config.getlist('subtickets', 'type.%(type)s.table_columns' % ticket): if column == 'owner': if self.opt_owner_url: href = req.href(self.opt_owner_url % ticket['owner']) else: href = req.href.query(status='!closed', owner=ticket['owner']) e = tag.td(tag.a(ticket['owner'], href=href)) elif column == 'milestone': href = req.href.query(status='!closed', milestone=ticket['milestone']) e = tag.td(tag.a(ticket['milestone'], href=href)) else: e = tag.td(ticket[column]) r.append(e) tbody.append(tag.tr(*r)) self._create_subtickets_table(req, children[id], tbody, depth + 1)
def render_table(items, colspec, render_item, colspace=1): try: columns = max(int(colspec), 1) except Exception: columns = 3 nbsp = Markup(' ') # hdr = [tag.th(nbsp, 'Display'), tag.th('Markup', nbsp)] spacer_style = 'width:%dem;border:none' % colspace # Find max width to make value cols equally wide width = 0 for i in items: if (isinstance(i, str) or isinstance(i, unicode)) and len(i) > width: width = len(i) value_style = 'border:none' #noinspection PyUnusedLocal if width: # empirical... value_style = '%s;width:%dem' % (value_style, width * 2 / 3) def render_def(s): rendered = s and render_item(s) or None if isinstance(s, str): s = Markup(s.replace('&', '&')) return [ tag.td(rendered, nbsp, style='border:none'), tag.td(tag.kbd(s), style=value_style) ] return tag.table( #tag.tr((hdr + [tag.td(style=spacer_style)]) * # (columns-1) + hdr), [ tag.tr([ render_def(s) + [tag.td(style=spacer_style)] for s in row[:-1] ] + render_def(row[-1])) for row in group_over(sorted(items), columns) ], class_='wiki', style='border:none')
class MultiLangTitleIndex(WikiMacroBase): """Inserts an alphabetic list of all wiki pages cosidering suffixes. This macro is similar to TitleIndex macro but differ in two points. * All the variants are displayed in one line. * Displayed in two columns. One is for the pages made for the project. One is for the pages provided by Trac. `WikiStart` and `SandBox` are grouped in project pages as default. This is configurable via `_explicit_user_pages` option. One entry displayed by this macro has a format like this: {{{ WikiStart (en, fr, ja, default) }}} Left most page name is for usual access with negotiation. Items in paren are existing language variants for the page. System pages are decided by listing files in wiki-default directory. As described before, you can exclude some pages as user page by spcifying `_explicit_user_pages`. Likewise, you can specify the system pages via `_explicit_system_pages` option. These two options are list of page names separated by comma. If the page name ends with '*' character, it works as prefix for matching. For exmaple, 'Trac*' means "page names staring with 'Trac'". """ _explicit_user_pages = ListOption('multi-lang-title-index', 'explicit_user_pages', 'WikiStart, SandBox', doc="List of page names to be grouped" " in user page. If the name ends" " with '*', it works as prefix.") _explicit_system_pages = ListOption('multi-lang-title-index', 'explicit_system_pages', '', #'GraphViz*', doc="List of page names to be grouped" " in system page. If the name ends" " with '*', it works as prefix.") _wiki_default_pages = _list_wiki_default_pages() SPLIT_RE = re.compile(r"( |/|[0-9])") PAGE_SPLIT_RE = re.compile(r"([a-z])([A-Z])(?=[a-z])") # macro entry point for Trac 0.11 def expand_macro(self, formatter, name, content): args, kw = util.parse_args(content) prefix = args and args[0] or None format = kw.get('format', '') minsize = max(int(kw.get('min', 2)), 2) depth = int(kw.get('depth', -1)) start = prefix and prefix.count('/') or 0 wiki = formatter.wiki pages = sorted([page for page in wiki.get_pages(prefix) \ if 'WIKI_VIEW' in formatter.perm('wiki', page)]) pagelangs = {} for page in pages: name, lang = util.split_lang(page, '') langs = pagelangs.get(name, []) if lang not in langs: langs.append(lang) pagelangs[name] = langs pages = sorted(pagelangs.keys()) # collection of default pages upages, spages = self.split_pages(pages) def format_page_name(page, split=False): try: # for trac 0.11 return wiki.format_page_name(page, split=split) except: # for trac 0.10 if split: return self.PAGE_SPLIT_RE.sub(r"\1 \2", page) return page def split(page): if format != 'group': return [format_page_name(page)] else: return self.SPLIT_RE.split(format_page_name(page, split=True)) # Group by Wiki word and/or Wiki hierarchy upages, spages = [[(split(page), page) for page in pages if depth < 0 or depth >= page.count('/') - start] for pages in (upages, spages)] def split_in_groups(group): """Return list of pagename or (key, sublist) elements""" groups = [] for key, subgrp in groupby(group, lambda (k,p): k and k[0] or ''): subgrp = [(k[1:],p) for k,p in subgrp] if key and len(subgrp) >= minsize: sublist = split_in_groups(sorted(subgrp)) if len(sublist) == 1: elt = (key+sublist[0][0], sublist[0][1]) else: elt = (key, sublist) groups.append(elt) else: for elt in subgrp: groups.append(elt[1]) return groups def render_one(page, langs): result = [tag.a(wiki.format_page_name(page), href=formatter.href.wiki(page))] if langs: for lang in sorted(langs): result.append(', ') p = '%s.%s' % (page, lang) result.append(tag.a(lang or 'default', style='color:#833', href=formatter.href.wiki(p))) result[1] = ' (' result.append(')') return result def render_groups(groups): return tag.ul( [tag.li(isinstance(elt, tuple) and tag(tag.strong(elt[0]), render_groups(elt[1])) or render_one(elt, pagelangs.get(elt))) for elt in groups]) #return render_groups(split_in_groups(pages)) return tag.table(tag.tr([tag.td([tag.b(title + ' pages:'), render_groups(split_in_groups(pages))]) for title, pages in [('User', upages), ('System', spages)]], valign='top'))