Example #1
0
def execute(pagename, request):
    _ = request.getText

    # Start content - IMPORTANT - without content div, there is no
    # direction support!
    if not hasattr(request, 'formatter'):
        formatter = HtmlFormatter(request)
    else:
        formatter = request.formatter
    request.page.formatter = formatter
    formatter.setPage(request.page)

    # This action generate data using the user language
    request.setContentLanguage(request.lang)

    request.theme.send_title(request.getText('Search by metadata'),
                             pagename=pagename)

    request.write(formatter.startContent("content"))

    q = ''
    mtabq = ''
    if request.values.has_key('q'):
        if request.values.has_key('mtab'):
            mtabq = ''.join(request.values.getlist('q'))
        else:
            q = ''.join(request.values.getlist('q'))

    request.write(u'<form method="GET" action="%s">\n' %
                  actionname(request, pagename))
    request.write(u'<input type=hidden name=action value="%s">' %
                  'MetaSearch')

    request.write(u'<input type="text" name="q" size=50 value="%s"> ' %
                  (form_escape(q)))
    request.write(u'<input type="submit" name="mtab" value="Search as MetaTable">')
    request.write(u'<input type="submit" value="' + _('Search') +
                  '">' + u'\n</form>\n')

    if q:
        if regexp_re.match(q):
            try:
                page_re = re.compile(q[1:-1])
                q = ''
            except re.error:
                request.write(render_error(_("Bad regexp!")))

        graphdata = request.graphdata
        graphdata.reverse_meta()
        keys_on_pages = graphdata.keys_on_pages
        vals_on_pages = graphdata.vals_on_pages

        keyhits = set([])
        keys = set([])
        for key in keys_on_pages:
            if q:
                if key == q:
                    keyhits.update(keys_on_pages[key])
                    keys.add(key)
            else:
                if page_re.match(key):
                    keyhits.update(keys_on_pages[key])
                    keys.add(key)

        valhits = set([])
        vals = set([])
        for val in vals_on_pages:
            if q:
                if val == q:
                    valhits.update(vals_on_pages[val])
                    vals.add(val)
            else:
                if page_re.match(val):
                    valhits.update(vals_on_pages[val])
                    vals.add(val)

        if not q:
            elemlist(request, formatter, keys, _('keys'))
            elemlist(request, formatter, vals, _('values'))

        request.write(formatter.paragraph(1))
        request.write(formatter.text(_("Found as key in following pages")))
        request.write(formatter.paragraph(0))

        request.write(formatter.bullet_list(1))
        for page in sorted(keyhits):
            # Do not include revisions etc so far, enabling this as per request
            if not graphdata[page].has_key(u'saved'):
                continue

            request.write(formatter.listitem(1))
            request.write(formatter.pagelink(1, page))
            request.write(formatter.text(page))
            request.write(formatter.pagelink(0))
            request.write(formatter.listitem(0))

        request.write(formatter.bullet_list(0))

        request.write(formatter.paragraph(1))
        request.write(formatter.text(_("Found as value in following pages")))
        request.write(formatter.paragraph(0))
        request.write(formatter.bullet_list(1))
        for page in sorted(valhits):
            # Do not include revisions etc so far, enabling this as per request
            if not graphdata[page].has_key(u'saved'):
                continue

            request.write(formatter.listitem(1))
            request.write(formatter.pagelink(1, page))
            request.write(formatter.text(page))
            request.write(formatter.pagelink(0))
            request.write(formatter.listitem(0))

        request.write(formatter.bullet_list(0))

    if mtabq:
        metatab = wikiutil.importPlugin(request.cfg, 'macro', 'MetaTable')
        request.write("<br>")
        # Poor but sufficient emulation of macro object
        mtabHTML = metatab(request.page, mtabq)
        request.write(mtabHTML)

    # End content
    request.write(formatter.endContent()) # end content div

    # Footer
    request.theme.send_footer(pagename)

    request.theme.send_closing_html()