def default_cell(option): default = option.default if default is not None and default != '': return tag.td(tag.code(option.dumps(default)), class_='default') else: return tag.td(_("(no default)"), class_='nodefault')
def htmlSeq(self,s,insideTable): from genshi.builder import tag table=tag.table(frame='box',rules='all',width='100%',**self.padding) if hasattr(s[0],'__len__') and not isinstance(s[0],(str,unicode,bytes)): # 2d array # disregard insideTable in this case for r in range(len(s) if type(s)!=AlignedBox3 else 2): # len(s) is sufficient, but some version of minieigen report erroneously that AlignedBox3 has length of 3 tr=tag.tr() for c in range(len(s[0])): tr.append(tag.td(float2str(s[r][c]) if isinstance(s[r][c],float) else str(s[r][c]),align='right',width='%g%%'%(100./len(s[0])-1.))) table.append(tr) return table splitLen=0 if len(s)>1: if isinstance(s[0],int): splitLen=self.splitIntSeq elif isinstance(s[0],(str,unicode)): splitLen=self.splitStrSeq elif isinstance(s[0],float): splitLen=self.splitFloatSeq # 1d array if splitLen==0 or len(s)<splitLen: ret=table if not insideTable else [] for e in s: ret.append(tag.td(float2str(e) if isinstance(e,float) else str(e),align='right',width='%g%%'%(100./len(s)-1.))) # 1d array, but with lines broken else: ret=table for i,e in enumerate(s): if i%splitLen==0: tr=tag.tr() tr.append(tag.td(float2str(e) if isinstance(e,float) else str(e),align='right',width='%g%%'%(100./splitLen-1.))) # last in the line, or last overall if i%splitLen==(splitLen-1) or i==len(s)-1: table.append(tr) return ret
def fn(stream): for kind, data, pos in stream: if kind is END and data.localname == 'body': first_time = req._tracdeveloper_hdlr.buf \ and req._tracdeveloper_hdlr.buf[0].created elm = tag.div(tag.table( tag.thead( tag.tr( tag.th('Time'), tag.th('Module'), tag.th('Level'), tag.th('Message'), )), class_='listing')([ tag.tr( tag.td(int((r.created - first_time) * 1000)), tag.td(r.module), tag.td(r.levelname), tag.td(r.getMessage()), class_=(i % 2 and 'even' or 'odd'), ) for i, r in enumerate(req._tracdeveloper_hdlr.buf) ]), id='tracdeveloper-log') for evt in elm.generate(): yield evt del elm req._tracdeveloper_hdlr.formatter = None del req._tracdeveloper_hdlr.buf[:] self.log.removeHandler(req._tracdeveloper_hdlr) del req._tracdeveloper_hdlr yield kind, data, pos
def _get_row(self, ticket, columns): cells = [] for column in columns: label = ticket.values.get(column) td = tag.td(label, class_=column) cells.append(td) ticket_class = "" ticket_status = ticket.values.get("status") if ticket_status == "closed": ticket_class = "closed" ticket_number = "#{}".format(ticket.id) link_td = tag.td( tag.a( ticket_number, class_=ticket_class, href=self.req.href.ticket(ticket.id), title=ticket_number, ), class_="id", ) return tag.tr( link_td, cells, class_="trac-columns", )
def htmlSeq(self,s,insideTable): from genshi.builder import tag table=tag.table(frame='box',rules='all',width='100%',**self.padding) if hasattr(s[0],'__len__') and not isinstance(s[0],str): # 2d array # disregard insideTable in this case for r in range(len(s) if type(s)!=AlignedBox3 else 2): # len(s) is sufficient, but some version of minieigen report erroneously that AlignedBox3 has length of 3 tr=tag.tr() for c in range(len(s[0])): tr.append(tag.td(float2str(s[r][c]) if isinstance(s[r][c],float) else str(s[r][c]),align='right',width='%g%%'%(100./len(s[0])-1.))) table.append(tr) return table splitLen=0 if len(s)>1: if isinstance(s[0],int): splitLen=self.splitIntSeq elif isinstance(s[0],str): splitLen=self.splitStrSeq elif isinstance(s[0],float): splitLen=self.splitFloatSeq # 1d array if splitLen==0 or len(s)<splitLen: ret=table if not insideTable else [] for e in s: ret.append(tag.td(float2str(e) if isinstance(e,float) else str(e),align='right',width='%g%%'%(100./len(s)-1.))) # 1d array, but with lines broken else: ret=table for i,e in enumerate(s): if i%splitLen==0: tr=tag.tr() tr.append(tag.td(float2str(e) if isinstance(e,float) else str(e),align='right',width='%g%%'%(100./splitLen-1.))) # last in the line, or last overall if i%splitLen==(splitLen-1) or i==len(s)-1: table.append(tr) return ret
def expand_macro(self, formatter, name, args): from trac.config import Option section_filter = key_filter = '' args, kw = parse_args(args) if args: section_filter = args.pop(0).strip() if args: key_filter = args.pop(0).strip() registry = Option.get_registry(self.compmgr) sections = {} for (section, key), option in registry.iteritems(): if section.startswith(section_filter): sections.setdefault(section, {})[key] = option return tag.div(class_='tracini')( (tag.h3(tag.code('[%s]' % section), id='%s-section' % section), tag.table(class_='wiki')( tag.tbody(tag.tr(tag.td(tag.tt(option.name)), tag.td(format_to_oneliner( self.env, formatter.context, to_unicode(option.__doc__)))) for option in sorted(sections[section].itervalues(), key=lambda o: o.name) if option.name.startswith(key_filter)))) for section in sorted(sections))
def expand_macro(self, formatter, name, content): args, opts = parse_args(content) if len(args) != 1: raise TracError("Requied single table name") table = args[0] excludes = [e.strip() for e in opts.get('exclude', '').split('|')] ccount = int(opts.get('column_count', 3)) cdtsys = CustomDBTableSystem(self.env) try: items = cdtsys.sorted_column(table, 'name') except: raise TracError("Table not found: %s" % table) if excludes: items = [e for e in items if e not in excludes] ttable = tag.table(class_='wiki customdbtable') tr = td = None i = 0 for item in items: if i % ccount == 0: tr = tag.tr() ttable(tr) td = tag.td(item) tr(td) i += 1 while i % ccount != 0: tr(tag.td()) i += 1 return ttable
def _generate_html(self, relation, relation_type, relation_role, stream, ticket): config = self.config['ticket-custom'] try: if relation_type == 'one': if ticket[relation.name + '_' + relation_role] is not None: target_ticket = Ticket(self.env, int(ticket[relation.name + '_' + relation_role])) stream |= Transformer('//div[@id="ticket"]//td[@headers="h_%s"]/text()' % (relation.name + '_' + relation_role)) \ .replace(tag.a('#%s %s' % (target_ticket.id, target_ticket['summary']), href='/ticket/' + str(target_ticket.id))) else: if ticket[relation.name + '_' + relation_role] is not None: target_tickets = [Ticket(self.env, int(i)) for i in ticket[relation.name + '_' + relation_role].split(',')] format = map(unicode.strip, config.get(relation.name + '_' + relation_role + '.format').split(',')) tbody = tag.tbody() for target_ticket in target_tickets: columns = [tag.td(tag.a('#' + str(target_ticket.id), href='/ticket/' + str(target_ticket.id)))] columns.extend([tag.td(target_ticket[field]) for field in format]) tbody.append(tag.tr(*columns)) stream |= Transformer('//div[@id="ticket"]//td[@headers="h_%s"]/text()' % (relation.name + '_' + relation_role)) \ .replace(tag.table(tbody, class_='relation_table')) except Exception as e: self.log.error(e.message) return stream
def make_list(items): parts = [item.rsplit('.', 1) for item in items] return tag.table(tag.tbody( tag.tr(tag.td(c, class_='trac-name'), tag.td('(%s.*)' % m, class_='trac-name')) for m, c in parts), class_='trac-pluglist')
def expand_macro(self, formatter, name, content): interwikis = [] for k in sorted(self.keys()): prefix, url, title = self[k] interwikis.append({ 'prefix': prefix, 'url': url, 'title': title, 'rc_url': self._expand_or_append(url, ['RecentChanges']), 'description': url if title == prefix else title }) return tag.table( tag.tr(tag.th(tag.em(_("Prefix"))), tag.th(tag.em(_("Site")))), [ tag.tr( tag.td(tag.a(w['prefix'], href=w['rc_url'])), tag.td(tag.a(w['description'], href=w['url']))) for w in interwikis ], class_="wiki interwiki")
def fn(stream): for kind, data, pos in stream: if kind is END and data.localname == 'body': first_time = req._tracdeveloper_hdlr.buf \ and req._tracdeveloper_hdlr.buf[0].created elm = tag.div(tag.table(tag.thead(tag.tr( tag.th('Time'), tag.th('Module'), tag.th('Level'), tag.th('Message'), )), class_='listing')([ tag.tr( tag.td(int((r.created - first_time) * 1000)), tag.td(r.module), tag.td(r.levelname), tag.td(r.getMessage()), class_=(i%2 and 'even' or 'odd'), ) for i, r in enumerate(req._tracdeveloper_hdlr.buf) ]), id='tracdeveloper-log') for evt in elm.generate(): yield evt del elm req._tracdeveloper_hdlr.formatter = None del req._tracdeveloper_hdlr.buf[:] self.log.removeHandler(req._tracdeveloper_hdlr) del req._tracdeveloper_hdlr yield kind, data, pos
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, args): if not args: return Markup() config = None if name == self.CONFIG_KEY: lines = args.splitlines() if not lines or not lines[0].startswith('#!'): return Markup() config = self._parse_config([i.strip() for i in lines[0][2:].split(',')]) else: config = self.CONFIG[name] if not config: return Markup() def to_html(text): if not text: return '' return Markup('<br>'.join([format_to_oneliner(self.env, formatter.context, line) \ for line in text.splitlines()])) def has_keys(dict, keys): for key in keys: if dict.has_key(key): return True return False rows = self.parse_doc(args) if not rows: return Markup() seen = [] for desc, keys in config: if [row for row in rows if has_keys(row, keys)]: seen.append(desc) thead = tag.thead() for desc, keys in config: if not desc in seen: continue thead(tag.td(tag.b(desc))) tbody = tag.tbody() for row in rows: trow = tag.tr() for desc, keys in config: if not desc in seen: continue tcol = tag.td() for key in keys: if row.has_key(key): tcol(to_html(row[key])) trow(tcol) tbody(trow) return tag.table([thead, tbody], class_='wiki')
def trainsToday(graph, searchDate, station): """rendered template text""" #print repr(searchDate) #print "subjs", len(list(graph.subjects(None, searchDate))) #print "dates", len(list(graph.triples((None, TT['date'], None)))) # this was returning no rows in rdflib-2.4.x branch! #print list(graph.query('''SELECT ?d WHERE { ?x tt:date ?d }''', initNs=INITNS)) dataRows = [] for (searchDate2, trainNumber, trainName, tsa, taa, tsd, tad, status ) in graph.query( """SELECT ?searchDate ?trainNumber ?trainName ?tsa ?taa ?tsd ?tad ?status WHERE { ?train a tt:Train; rdfs:label ?trainNumber; tt:stop ?stop . ?stop tt:date ?searchDate; tt:station ?station . OPTIONAL { ?train tt:trainName ?trainName . } OPTIONAL { ?stop tt:status ?status . } OPTIONAL { ?stop tt:scheduledDepartureTime ?tsd . } OPTIONAL { ?stop tt:actualDepartureTime ?tad . } OPTIONAL { ?stop tt:scheduledArrivalTime ?tsa . } OPTIONAL { ?stop tt:actualArrivalTime ?taa . } }""", initNs=INITNS, initBindings={#'?searchDate' : searchDate, '?station' : station}): if repr(searchDate2) != repr(searchDate): # workaround for sparql err continue dataRows.append((tad, taa, tsd, tsa, trainNumber, trainName, status)) dataRows.sort(key=lambda r: [t for t in r[:4] if t]) # fancier ORDER BY rows = [] now = literalNow() shownNow = False nowRow = T.tr(T.td("now", colspan="4", align="center", bgcolor="#D88585")) for (tad, taa, tsd, tsa, trainNumber, trainName, status) in dataRows: scheduledTime = tsd or tsa actualTime = tad or taa # or 'estimated' if (actualTime or scheduledTime) > now and not shownNow: rows.append(nowRow) shownNow = True rows.append(T.tr(T.td(trainNumber, " ", trainName, class_="trainNumber"), T.td(scheduledTime), T.td(actualTime, bgcolor="#EDEAD0"), T.td(status))) if not shownNow: rows.append(nowRow) rows = T(*rows) tmpl = loader.load("okjtimes.html") return tmpl.generate(rows=rows, lastScan='?', today=searchDate).render('html')
def _render_mergeinfo(self, name, mode, context, props): rows = [] for row in props[name].splitlines(): try: (path, revs) = row.rsplit(":", 1) rows.append([tag.td(path), tag.td(revs.replace(",", u",\u200b"))]) except ValueError: rows.append(tag.td(row, colspan=2)) return tag.table(tag.tbody([tag.tr(row) for row in rows]), class_="props")
def generate_prefix(prefix): intertrac = intertracs[prefix] if isinstance(intertrac, basestring): yield tag.tr(tag.td(tag.b(prefix)), tag.td("Alias for ", tag.b(intertrac))) else: url = intertrac.get("url", "") if url: title = intertrac.get("title", url) yield tag.tr(tag.td(tag.a(tag.b(prefix), href=url + "/timeline")), tag.td(tag.a(title, href=url)))
def _table_row(self, req, ticket, columns): # Is the ticket closed? ticket_class = '' if ticket['status'] == 'closed': ticket_class = 'closed' return tag.tr( tag.td(tag.a("#%s" % ticket.id, href=req.href.ticket(ticket.id), title="Child ticket #%s" % ticket.id, class_=ticket_class), class_="id"), [ tag.td(ticket[s], class_=s) for s in columns ], )
def expand_macro(self, formatter, name, args): from trac.config import ConfigSection, Option section_filter = key_filter = '' args, kw = parse_args(args) if args: section_filter = args.pop(0).strip() if args: key_filter = args.pop(0).strip() def getdoc(option_or_section): doc = to_unicode(option_or_section.__doc__) if doc: doc = dgettext(option_or_section.doc_domain, doc) return doc registry = ConfigSection.get_registry(self.compmgr) sections = dict((name, getdoc(section)) for name, section in registry.iteritems() if name.startswith(section_filter)) registry = Option.get_registry(self.compmgr) options = {} for (section, key), option in registry.iteritems(): if section.startswith(section_filter): options.setdefault(section, {})[key] = option sections.setdefault(section, '') def default_cell(option): default = option.default if default is True: default = 'true' elif default is False: default = 'false' elif default == 0: default = '0.0' if isinstance(default, float) else '0' elif default: default = ', '.join(to_unicode(val) for val in default) \ if isinstance(default, (list, tuple)) \ else to_unicode(default) else: return tag.td(_("(no default)"), class_='nodefault') return tag.td(tag.code(default), class_='default') return tag.div(class_='tracini')( (tag.h3(tag.code('[%s]' % section), id='%s-section' % section), format_to_html(self.env, formatter.context, section_doc), tag.table(class_='wiki')(tag.tbody( tag.tr( tag.td(tag.tt(option.name)), tag.td( format_to_oneliner(self.env, formatter.context, getdoc(option))), default_cell(option)) for option in sorted(options.get(section, {}).itervalues(), key=lambda o: o.name) if option.name.startswith(key_filter)))) for section, section_doc in sorted(sections.iteritems()))
def render_refs_box(self, req, ids, order = 'year', desc = 1, headhref=False, path=[],args=[],page=None,max=None ): # Check parameters if not ids: return [] columns = self.env.config.get('zotero', 'columns','firstCreator, year, publicationTitle, title' ) columns = columns.split(',') columns = [c.strip() for c in columns] model = ZoteroModelProvider(self.env) if page: page = (page-1)*max data = model.get_item_columns_by_iids(ids,columns, order, desc = desc, offset=page,limit=max) apath = args_path(args) heads = [] for idx, column in enumerate(columns): label = column if zotero_fields_mapping_name.has_key(column): label = zotero_fields_mapping_name[column]['label'] if headhref and path: head = [] th_class = '' th_href = req.href(path, order=column)+apath if order == column: if desc: th_class = 'desc' else: th_class = 'asc' th_href = req.href(path, order=column, desc = str(1))+apath head = tag.th(tag.a(label, href = th_href),class_= th_class) heads.append(head) else: heads.append(tag.th(label)) body = [] for idx, item in enumerate(data): item_class = 'even' if idx % 2 == 1: item_class = 'odd' item_td = [] for idx, col in enumerate(columns): col_td = [] if not col or item[idx+1] == 'None': col_td = tag.td() elif col == 'title': col_td = tag.td(tag.a(item[idx+1], href = req.href.zotero('item',str(item[0])))) else: col_td = tag.td(item[idx+1]) item_td.append(col_td) item_tr = tag.tr( item_td,class_=item_class) body.append(item_tr) return tag.table( tag.thead( heads ), tag.tbody(body), class_="listing dirlist", id="dirlist")
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 _body_rows(): for idx, line in enumerate(_group_lines(stream)): row = tag.tr() for annotator, data in annotator_datas: if annotator: annotator.annotate_row(context, row, idx + 1, line, data) else: row.append(tag.td()) row.append(tag.td(line)) yield row
def expand_macro(self, formatter, name, content, args): title = 'Color Scheme' classes = 'colormacro' if args and 'title' in args: title = args['title'] if args and 'class' in args: classes += ' ' + args['class'] tbody = [] have_comment = False colors = self._parse_arguments(content) for color in colors: if len(color['title']) > 0: have_comment = True ## Create row tbody.append( [ tag.td()(tag.strong(color['title'])), tag.td( style='background-color:' + color['orig'] )( tag.div(style='color: black')(color['hex']), tag.div(style='color: white')(color['hex']) ), tag.td( style='background-color:' + color['orig'] )( tag.div(style='color: black')(color['rgbp']), tag.div(style='color: white')(color['rgbp']) ), ] ) ## end for loop if len(tbody) > 0: colcount = len(tbody[0]) if not have_comment: colcount -= 1 table = tag.table(class_=classes) table()(tag.thead()(tag.th(colspan='%d' % colcount)(title))) ## Attach row in table. if have_comment: table()(tag.tbody(class_='colorlist')([tag.tr(row) for row in tbody])) else: table()(tag.tbody(class_='colorlist')([tag.tr(row[1:]) for row in tbody])) return table; else: return tag.div(class_='colormacro')('Nothing to display')
def expand_macro(self, formatter, name, args): from trac.config import ConfigSection, Option section_filter = key_filter = '' args, kw = parse_args(args) if args: section_filter = args.pop(0).strip() if args: key_filter = args.pop(0).strip() def getdoc(option_or_section): doc = to_unicode(option_or_section.__doc__) if doc: doc = dgettext(option_or_section.doc_domain, doc) return doc registry = ConfigSection.get_registry(self.compmgr) sections = dict((name, getdoc(section)) for name, section in registry.iteritems() if name.startswith(section_filter)) registry = Option.get_registry(self.compmgr) options = {} for (section, key), option in registry.iteritems(): if section.startswith(section_filter): options.setdefault(section, {})[key] = option sections.setdefault(section, '') def default_cell(option): default = option.default if default is True: default = 'true' elif default is False: default = 'false' elif default == 0: default = '0.0' if isinstance(default, float) else '0' elif default: default = ', '.join(to_unicode(val) for val in default) \ if isinstance(default, (list, tuple)) \ else to_unicode(default) else: return tag.td(_("(no default)"), class_='nodefault') return tag.td(tag.code(default), class_='default') return tag.div(class_='tracini')( (tag.h3(tag.code('[%s]' % section), id='%s-section' % section), format_to_html(self.env, formatter.context, section_doc), tag.table(class_='wiki')(tag.tbody( tag.tr(tag.td(tag.tt(option.name)), tag.td(format_to_oneliner( self.env, formatter.context, getdoc(option))), default_cell(option)) for option in sorted(options.get(section, {}).itervalues(), key=lambda o: o.name) if option.name.startswith(key_filter)))) for section, section_doc in sorted(sections.iteritems()))
def _render_mergeinfo(self, name, mode, context, props): rows = [] for row in props[name].splitlines(): try: (path, revs) = row.rsplit(':', 1) rows.append([tag.td(path), tag.td(revs.replace(',', u',\u200b'))]) except ValueError: rows.append(tag.td(row, colspan=2)) return tag.table(tag.tbody([tag.tr(row) for row in rows]), class_='props')
def _show_extra(self, name, val): return tag.tr(tag.td('%s' % name), tag.td('%s' % val), tag.td('%s %s' % self.mc.option_qualified_name(name)), tag.td('%s' % self.mc.option_is_default(name)), tag.td('%s' % self.mc.option_is_macroarg(name)), tag.td('%s' % self.mc.option_is_extra(name)), tag.td('%s' % self.mc.option_is_known(name)), tag.td(''), tag.td(''))
def generate_prefix(prefix): intertrac = intertracs[prefix] if isinstance(intertrac, basestring): yield tag.tr(tag.td(tag.b(prefix)), tag.td('Alias for ', tag.b(intertrac))) else: url = intertrac.get('url', '') if url: title = intertrac.get('title', url) yield tag.tr(tag.td(tag.a(tag.b(prefix), href=url + '/timeline')), tag.td(tag.a(title, href=url)))
def generate_prefix(prefix): intertrac = intertracs[prefix] if isinstance(intertrac, basestring): yield tag.tr(tag.td(tag.b(prefix)), tag.td('Alias for ', tag.b(intertrac))) else: url = intertrac.get('url', '') if url: title = intertrac.get('title', url) yield tag.tr( tag.td(tag.a(tag.b(prefix), href=url + '/timeline')), tag.td(tag.a(title, href=url)))
def _func(children, depth=0): def _sort(children): for sort in reversed(literal_eval(self.sort_children)): transform_key = lambda x: x if isinstance(sort, str): sort_by = sort else: assert(isinstance(sort, list)) assert(isinstance(sort[0], str)) sort_by = sort[0] if isinstance(sort[1], str): if sort[1] == "int": transform_key = int else: assert(sort[1] == "float") transform_key = float else: assert(isinstance(sort[1], list)) lookup_dict = {v: k for (k, v) in enumerate(sort[1])} def _lookup(value): try: return lookup_dict[value] except KeyError: return len(lookup_dict) transform_key = _lookup if sort_by == 'id': children = sorted(children, key=lambda x: transform_key(Ticket(self.env, int(x)).id)) else: children = sorted(children, key=lambda x: transform_key(Ticket(self.env, int(x))[sort_by])) return children for id in _sort(children): ticket = Ticket(self.env, id) properties_to_show = [] # 1st column attrs = {'href': req.href.ticket(id)} if ticket['status'] == 'closed': attrs['class_'] = 'closed' link = tag.a('#%s' % id, **attrs) properties_to_show.append(tag.td(link, ': %s' % ticket['summary'], style='padding-left: %dpx;' % (depth * 15))) for property in literal_eval(self.show_fields): properties_to_show.append(tag.td(ticket[property])) tbody.append(apply(tag.tr, properties_to_show)) _func(children[id], depth + 1)
def _show_option(self, name, val, spec): return tag.tr(tag.td('%s' % name), tag.td('%s' % val), tag.td('%s %s' % self.mc.option_qualified_name(name)), tag.td('%s' % self.mc.option_is_default(name)), tag.td('%s' % self.mc.option_is_macroarg(name)), tag.td('%s' % self.mc.option_is_extra(name)), tag.td('%s' % self.mc.option_is_known(name)), tag.td('%s' % str(spec.default)), tag.td('%s' % spec.__doc__))
def pygmentize_to_tag(code, language, linenos=False, **kwargs): """ Rebuild a raw pygmentize highlighting as tag elements, avoiding Genshi to delete blank lines. See http://genshi.edgewall.org/wiki/GenshiFaq#WhatisGenshidoingwiththewhitespaceinmymarkuptemplate """ codeblock = pygmentize(code, language, linenos, **kwargs) pre = re.findall("<pre>(.*?)\n*</pre>", codeblock, re.DOTALL) if len(pre) == 1: return tag.pre(Markup(pre[0]), data_language=language) return tag.table( tag.tr(tag.td(tag.pre(pre[0])), tag.td(tag.pre(Markup(pre[1])))), data_language=language # line numbers # code )
def expand_macro(self, formatter, name, content): from trac.config import ConfigSection, Option section_filter = key_filter = '' args, kw = parse_args(content) if args: section_filter = args.pop(0).strip() if args: key_filter = args.pop(0).strip() def getdoc(option_or_section): doc = to_unicode(option_or_section.__doc__) if doc: doc = dgettext(option_or_section.doc_domain, doc) return doc registry = ConfigSection.get_registry(self.compmgr) sections = dict((name, getdoc(section)) for name, section in registry.iteritems() if name.startswith(section_filter)) registry = Option.get_registry(self.compmgr) options = {} for (section, key), option in registry.iteritems(): if section.startswith(section_filter): options.setdefault(section, {})[key] = option sections.setdefault(section, '') def default_cell(option): default = option.default if default is not None and default != '': return tag.td(tag.code(option.dumps(default)), class_='default') else: return tag.td(_("(no default)"), class_='nodefault') return tag.div(class_='tracini')( (tag.h3(tag.code('[%s]' % section), id='%s-section' % section), format_to_html(self.env, formatter.context, section_doc), tag.table(class_='wiki')(tag.tbody( tag.tr(tag.td(tag.code(option.name)), tag.td( format_to_oneliner(self.env, formatter.context, getdoc(option))), default_cell(option), class_='odd' if idx % 2 else 'even') for idx, option in enumerate( sorted(options.get(section, {}).itervalues(), key=lambda o: o.name)) if option.name.startswith(key_filter)))) for section, section_doc in sorted(sections.iteritems()))
def expand_macro(self, formatter, name, content): from trac.config import ConfigSection, Option section_filter = key_filter = '' args, kw = parse_args(content) if args: section_filter = args.pop(0).strip() if args: key_filter = args.pop(0).strip() def getdoc(option_or_section): doc = to_unicode(option_or_section.__doc__) if doc: doc = dgettext(option_or_section.doc_domain, doc) return doc registry = ConfigSection.get_registry(self.compmgr) sections = dict((name, getdoc(section)) for name, section in registry.iteritems() if name.startswith(section_filter)) registry = Option.get_registry(self.compmgr) options = {} for (section, key), option in registry.iteritems(): if section.startswith(section_filter): options.setdefault(section, {})[key] = option sections.setdefault(section, '') def default_cell(option): default = option.default if default is not None and default != '': return tag.td(tag.code(option.dumps(default)), class_='default') else: return tag.td(_("(no default)"), class_='nodefault') return tag.div(class_='tracini')( (tag.h3(tag.code('[%s]' % section), id='%s-section' % section), format_to_html(self.env, formatter.context, section_doc), tag.table(class_='wiki')(tag.tbody( tag.tr(tag.td(tag.tt(option.name)), tag.td(format_to_oneliner( self.env, formatter.context, getdoc(option))), default_cell(option), class_='odd' if idx % 2 else 'even') for idx, option in enumerate(sorted(options.get(section, {}).itervalues(), key=lambda o: o.name)) if option.name.startswith(key_filter)))) for section, section_doc in sorted(sections.iteritems()))
def default_cell(option): default = option.default if default is True: default = 'true' elif default is False: default = 'false' elif default == 0: default = '0.0' if isinstance(default, float) else '0' elif default: default = ', '.join(to_unicode(val) for val in default) \ if isinstance(default, (list, tuple)) \ else to_unicode(default) else: return tag.td(_("(no default)"), class_='nodefault') return tag.td(tag.code(default), class_='default')
def options_table(section, options): if options: return tag.table(class_='wiki')( tag.tbody( tag.tr( tag.td(tag.a(tag.code(option.name), class_='tracini-option', href='#%s-%s-option' % (section, option.name))), tag.td(format_to_html(self.env, formatter.context, option.doc)), default_cell(option), id='%s-%s-option' % (section, option.name), class_='odd' if idx % 2 else 'even') for idx, option in enumerate(options)))
def _show_extra(self, name, val): return tag.tr( tag.td('%s' % name), tag.td('%s' % val), tag.td('%s %s' % self.mc.option_qualified_name(name)), tag.td('%s' % self.mc.option_is_default(name)), tag.td('%s' % self.mc.option_is_macroarg(name)), tag.td('%s' % self.mc.option_is_extra(name)), tag.td('%s' % self.mc.option_is_known(name)), tag.td(''), tag.td('') )
def _show_option(self, name, val, spec): return tag.tr( tag.td('%s' % name), tag.td('%s' % val), tag.td('%s %s' % self.mc.option_qualified_name(name)), tag.td('%s' % self.mc.option_is_default(name)), tag.td('%s' % self.mc.option_is_macroarg(name)), tag.td('%s' % self.mc.option_is_extra(name)), tag.td('%s' % self.mc.option_is_known(name)), tag.td('%s' % str(spec.default)), tag.td('%s' % spec.__doc__) )
def expand_macro(self, formatter, name, content, args): title = 'Color Gradient' classes = 'colorgradient'; if args and 'title' in args: title = args['title'] if args and 'class' in args: classes += ' ' + args['class'] colors = self._parse_arguments(content) lastcolor = {} tbody = [] for color in colors: if 'orig' in lastcolor: tbody.append(self._create_gradient(lastcolor, color)) tbody.append([ tag.td( style='background-color:' + color['orig'] )( tag.div(style='color: black')(color['hex']), tag.div(style='color: white')(color['hex']) ), tag.td( style='background-color:' + color['orig'] )( tag.div(style='color: black')(color['rgbp']), tag.div(style='color: white')(color['rgbp']) ) ]) lastcolor = color ## end for loop if len(tbody) > 0: table = tag.table(class_=classes) table()(tag.thead()(tag.th(colspan="2")(title))) table()(tag.tbody(class_='colorgradient')([tag.tr()(td) for td in tbody])) return table; else: return tag.div(class_='colorgradient')('Nothing to display')
def expand_macro(self, formatter, name, content): interwikis = [] for k in sorted(self.keys()): prefix, url, title = self[k] interwikis.append({ 'prefix': prefix, 'url': url, 'title': title, 'rc_url': self._expand_or_append(url, ['RecentChanges']), 'description': url if title == prefix else title}) return tag.table(tag.tr(tag.th(tag.em(_("Prefix"))), tag.th(tag.em(_("Site")))), [tag.tr(tag.td(tag.a(w['prefix'], href=w['rc_url'])), tag.td(tag.a(w['description'], href=w['url']))) for w in interwikis ], class_="wiki interwiki")
def _make_graph(self, req, repos, info): # Generate graph data graph = {} threads, vertices, columns = \ make_log_graph(repos, (item['rev'] for item in info)) graph.update(threads=threads, vertices=vertices, columns=columns, colors=self.graph_colors, line_width=0.04, dot_radius=0.1) add_script(req, 'revisiongraph/js/excanvas.js') add_script(req, 'revisiongraph/js/log_graph.js') add_script_data(req, {'graph': graph}) script = Markup("//<![CDATA[") + """ jQuery(document).ready(function($) { $('th.trac-graph, td.trac-graph').show(); var canvas = $('""" + Markup("<canvas>") + """').css({width: '%dem', height: '%dem'}) .appendTo('td.trac-graph')[0]; canvas.width = $(canvas).width(); canvas.height = $(canvas).height(); if (typeof(G_vmlCanvasManager) != 'undefined') canvas = G_vmlCanvasManager.initElement(canvas); $.paintLogGraph(graph, canvas); }); """ % (graph['columns'] * 2, len(info) * 2) + Markup("//]]>") th = tag.th('Graph', class_='trac-graph') td = tag.td(class_='trac-graph', rowspan='%d' % len(info)) script_filter = Transformer('//head').append(tag.script(script, type="text/javascript")) table_filter = Transformer('//table[@class="listing chglist"]').attr('class', 'listing chglist trac-graph') th_filter = Transformer('//table/thead/tr/th[@class="diff"]').before(th) td_filter = Transformer('//table/tbody/tr[1]/td[@class="diff"]').before(td) return [script_filter, table_filter, th_filter, td_filter]
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')
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 value_style += ';width:%dem' % (width*2/3) if width else '' # empirical... 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')
def test_genshi_builder(): """Genshi template + tag builder""" stream = tag.TABLE([ tag.tr([tag.td(c) for c in row.values()]) for row in table ]).generate() stream = genshi_tmpl2.generate(table=stream) stream.render('html', strip_whitespace=False)
def render(self, context, mimetype, content, filename=None, url=None): content = content.read() content = re.split('\r[\n]', content) if not content: return None head = content[0] if not head: return None head = re.split(',', head) if not head: return None thead = tag.thead(tag.tr([tag.th(h) for h in head])) content = content[1:] if not content: return None tbody = [] for r in content: if r: r = re.split(',', r) if r: tbody.append(tag.tr([tag.td(c) for c in r ])) return tag.table(thead,tag.tbody(tbody), class_="wiki")
def expand_macro(self, formatter, name, content): from trac.mimeview.api import Mimeview mime_map = Mimeview(self.env).mime_map mime_type_filter = '' args, kw = parse_args(content) if args: mime_type_filter = args.pop(0).strip().rstrip('*') mime_types = {} for key, mime_type in mime_map.iteritems(): if (not mime_type_filter or mime_type.startswith(mime_type_filter)) and key != mime_type: mime_types.setdefault(mime_type, []).append(key) return tag.div(class_='mimetypes')( tag.table(class_='wiki')( tag.thead(tag.tr( tag.th(_("MIME Types")), # always use plural tag.th(tag.a("WikiProcessors", href=formatter.context.href.wiki( 'WikiProcessors'))))), tag.tbody( tag.tr(tag.th(tag.tt(mime_type), style="text-align: left"), tag.td(tag.code( ' '.join(sorted(mime_types[mime_type]))))) for mime_type in sorted(mime_types.keys()))))
def filter_stream(self, req, method, filename, stream, data): """ Adds project total count information in project summary block:: Downloads: 288 """ # TODO: Make interface for the project summary box and implement it here # Filter only the summary table wiki macro if filename != 'multiproject_summary.html': return stream # Load project and followers info project = Project.get(self.env) count = ProjectDownloadEntry.total_download_count(project.id) if count == 0: return stream # Add following information into project summary block trans = Transformer('//div[@class="summary"]/table').append( tag.tr( tag.th('Downloads:'), tag.td(count) ) ) return stream | trans
def expand_macro(self, formatter, name, content): from trac.mimeview.api import Mimeview mime_map = Mimeview(self.env).mime_map mime_type_filter = '' args, kw = parse_args(content) if args: mime_type_filter = args.pop(0).strip().rstrip('*') mime_types = {} for key, mime_type in mime_map.iteritems(): if (not mime_type_filter or mime_type.startswith(mime_type_filter)) and key != mime_type: mime_types.setdefault(mime_type, []).append(key) return tag.div(class_='mimetypes')( tag.table(class_='wiki')( tag.thead(tag.tr( tag.th(_("MIME Types")), # always use plural tag.th(tag.a("WikiProcessors", href=formatter.context.href.wiki( 'WikiProcessors'))))), tag.tbody( tag.tr(tag.th(tag.code(mime_type), style="text-align: left"), tag.td(tag.code( ' '.join(sorted(mime_types[mime_type]))))) for mime_type in sorted(mime_types.keys()))))
def expand_macro(self, formatter, name, content): args, opts = parse_args(content) if len(args) != 1: raise TracError("Requied single table name") table = args[0] excludes = [e.strip() for e in opts.get('exclude', '').split('|')] cdtsys = CustomDBTableSystem(self.env) try: columns = cdtsys.column_names(table) except: raise TracError("Table not found: %s" % table) _columns = opts.get('column', '') if _columns: _columns = [c.strip() for c in _columns.split('|')] if len(_columns) == 0: raise TracError("No column specified") for c in _columns: if c not in columns: raise TracError("Column not found: %s" % c) else: _columns = columns ttable = tag.table(class_='wiki customdbtable') for row in cdtsys.sorted_dicts(table): if row['name'] in excludes: continue tr = tag.tr() for c in _columns: tr(tag.td(row[c])) ttable(tr) return ttable
def filter_stream(self, req, method, filename, stream, data): """ Returns changed stream for `prefs_general.html` template with notification opt-out preference option. `req` is the current request object, `method` is the Genshi render method (xml, xhtml or text), `filename` is the filename of the template to be rendered, `stream` is the event stream and `data` is the data for the current template. """ if filename == 'prefs_general.html' and req.authname != 'anonymous': stream |= Transformer('.//table').append( tag.tr( tag.th( tag.label('Ticket notifications opt-out:', **{'for': 'ticket-notification-optout'}), ), tag.td( tag.input(type="hidden", name="ticket-notification-optout_cb", value=""), tag.input(type="checkbox", id="ticket-notification-optout", name="ticket-notification-optout", checked=req.session.get('ticket-notification-optout') or None), ), **{'class': 'field'} ), ) return stream
def generate_home(self, req): model = ZoteroModelProvider(self.env) title = tag.h1( 'Tops' ) authors_top = model.count_by_author_top() authors = [] for creatorID, firstName, lastName in authors_top: authors.append(tag.a( lastName + ' ' + firstName, href = req.href.zotero('qjump', author = creatorID) ) ) authors.append(tag.span(' | ')) authors = tag.tr(tag.th( tag.b('Authors:'), tag.td( authors, tag.a('more...', href = req.href.zotero('cloud', t = 'author' ) ) ), valign="top", style="text-align: right; width: 15%;")) publisher_top = model.count_by_publisher_top() publisher = [] for p in publisher_top: publisher.append(tag.a( p, href = req.href.zotero('qjump', publisher = p) ) ) publisher.append(tag.br()) publisher = tag.tr(tag.th( tag.b('Publishers:'), tag.td(publisher, tag.a('more...', href = req.href.zotero('cloud', t = 'publisher' ))), valign="top", style="text-align: right; width: 15%;")) year_top = model.count_by_year_top() years = [] for y in year_top: years.append(tag.a( y, href = req.href.zotero('qjump', year = y) ) ) years.append(tag.span(' | ')) years = tag.tr(tag.th( tag.b('Years:'), tag.td(years, tag.a('more...', href = req.href.zotero('cloud', t = 'year' ))), valign="top", style="text-align: right; width: 15%;")) # For recently add recent_ids = model.get_recents() recents_title = tag.div( tag.br(), tag.br(),tag.h1('Recent Changes')) recents = render_refs_box(self, req, recent_ids ) home = tag.div( title, tag.table(authors, years, publisher, border="0", cellpadding="2", cellspacing="2"), recents_title, recents) return home
def expand_macro(self, formatter, name, content): content = content.strip() if content else '' name_filter = content.strip('*') items = {} for subscriber in NotificationSystem(self.env).subscribers: name = subscriber.__class__.__name__ if not name_filter or name.startswith(name_filter): items[name] = subscriber.description() return tag.div(class_='trac-subscriberlist')(tag.table(class_='wiki')( tag.thead(tag.tr(tag.th(_("Subscriber")), tag.th(_("Description")))), tag.tbody( tag.tr(tag.td(tag.code(name)), tag.td(items[name]), class_='odd' if idx % 2 else 'even') for idx, name in enumerate(sorted(items.keys())))))
def __iter__(self): link = self.buffer.events[0][1][1].get('href').split( self.browser_link)[-1] link = self.svn_base_url + link.rsplit('?', 1)[0] return iter( tag.td( tag.a(self.link_text, href=link, title=SVNURLs.link_title)))