import sys, os, time def popen(*args): reader, writer = os.pipe() p = os.fork() if p == 0: os.close(reader) os.dup2(writer, 1) os.close(writer) os.execvp(args[0], args) os._exit(99) os.close(writer) return os.fdopen(reader) def swish(db, term): p = popen("/usr/local/bin/swish-e", "-x", "%p\n", "-f", db, "-w", term) result = [] for line in p: line = line.strip() if line.startswith("#"): continue if line == ".": continue result.append(line) return result def age(f): seconds = time.time() - os.stat(f).st_mtime if seconds < 60: return "less than a minute" if seconds < 120: return "1 minute" if seconds < 60 * 60: return "%d minutes" % ((seconds + 30)/60) if seconds < 7200: return "1 hour" if seconds < 24 * 60 * 60: return "%d hours" % ((seconds + 30*60)/60/60) if seconds < 2*86400: return "1 day" if seconds < 60 * 60: return "%d days" % ((seconds + 30*60*24)/60/60/24) handle_sitemap = handle_search def handle_search(name, query): search = search_text = query.get('search',u'') index = data_dir + u'/_swishindex' if not search: return handle_sitemap(name, query) result = [] for name in swish(index, search_text): if name.startswith("./"): name = name[2:] sys.stderr.write("load(%r)\n" % name) try: text = load(name) except Error: result.append(u'[line ' + quote_markup(name) + ']') else: result.append(u'[line [link ' + (quote_markup(name) or u'/') + u'[page '+quote_markup(name)+']]]') if not result: result.append('Search found nothing, sorry.') result.insert(0, u'[title Search results]\n\n') result.insert(1, u'Searching for: [bold ' + quote_markup(search) + u']\n\n') result.append(u'[line Search results from swish-e, index updated ' + age(index) + ' ago]') return make_http_page(string.join(result,u''))