# -*- coding: utf-8 -*- import re from MoinMoin.parser import text_csv as data from MoinMoin.Page import Page from MoinMoin.widget.browser import DataBrowserWidget from MoinMoin.util.dataset import TupleDataset, Column _devpage_re = re.compile('^en/users/Drivers/.*devices') _devlist_re = re.compile('^({{{)?#!devtable (?P.*)') _devlist_end = re.compile('}}}') Dependencies = ['time'] def _find_col(name, dataset): for idx in range(len(dataset.columns)): col = dataset.columns[idx] if col.name == name: return idx return -1 def execute(macro, args, **kw): request = macro.request if args == 'PCI': filtercols = ['Driver', 'Vendor', 'PCI Vendor', 'PCI Product', 'form factor'] cols = ['Driver', 'Vendor', 'Product', 'form factor', 'PCI Vendor', 'PCI Product', 'PCI Subvendor', 'PCI Subsystem'] required_col = 'PCI Vendor' elif args == 'USB': filtercols = ['Driver', 'Vendor', 'USB Vendor', 'USB Product'] cols = ['Driver', 'Vendor', 'Product', 'USB Vendor', 'USB Product'] required_col = 'USB Vendor' elif args == 'PCMCIA': filtercols = ['Driver', 'Vendor', 'PCMCIA Vendor', 'PCMCIA Device'] cols = ['Driver', 'Vendor', 'Product', 'PCMCIA Vendor', 'PCMCIA Device'] required_col = 'PCMCIA Vendor' else: return request.formatter.text('Invalid argument') pagelist = request.rootpage.getPageList(filter=_devpage_re.match) datasets = [] pages = [] for pagename in pagelist: page = Page(request, pagename) txt = page.get_raw_body().split('\n') cur = [] started = False for line in txt: m = _devlist_re.match(line) if m: args = m.group('args') started = True continue m = _devlist_end.match(line) if m: started = False raw = '\n'.join(cur) dset = data.Parser(raw, request, format_args=args).data found = False for col in dset.columns: if col.name == required_col: found = True break if found: datasets.append(dset) pname = '/'.join(pagename.split('/')[:-1]) pages.append(Page(request, pname)) cur = [] continue if started: cur.append(line) newdata = TupleDataset('devices') for col in cols: newdata.columns.append(Column(col, autofilter=(col in filtercols))) if len(datasets) == 0: return request.formatter.text('No data found') dsetidx = 0 for dataset in datasets: indizes = [_find_col(col, dataset) for col in cols] row = dataset.next() while row: nrow = [''] * len(cols) for idx in range(len(cols)): oidx = indizes[idx] if oidx != -1: nrow[idx] = row[oidx] if cols[idx] == 'Driver': url = pages[dsetidx].link_to(request, text=nrow[idx][1]) nrow[idx] = (url, nrow[idx][1]) newdata.addRow(tuple(nrow)) row = dataset.next() dsetidx += 1 dbw = DataBrowserWidget(request) dbw.setData(newdata) return ''.join([request.formatter.div(1, css_class="devtable"), dbw.format(), request.formatter.div(0)])