Пример #1
0
    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
Пример #2
0
 def render_def(s):
     rendered = s and render_item(s) or None
     if isinstance(s, str):
         s = Markup(s.replace('&', '&amp;'))
     return [
         tag.td(rendered, nbsp, style='border:none'),
         tag.td(tag.kbd(s), style=value_style)
     ]
Пример #3
0
 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)))
Пример #4
0
    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)
Пример #5
0
def render_table(items, colspec, render_item, colspace=1):
    try:
        columns = max(int(colspec), 1)
    except Exception:
        columns = 3

    nbsp = Markup('&nbsp;')
    # 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('&', '&amp;'))
        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')
Пример #6
0
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'))