#!/usr/bin/env python3 # http://inamidst.com/saxo/ # Created by Sean B. Palmer import os import re import saxo def search_by_name(db, search): regex_metachar = re.compile("[%s]" % re.escape(r"$()*+.?[\]^{|}")) if regex_metachar.search(search): pattern = search else: pattern = ".*".join(r"\b" + word for word in search.split(" ")) pattern = "(?i)" + pattern results = [] query = "SELECT * FROM saxo_unicode WHERE name REGEXP ?" try: rows = list(db.query(query, pattern)) except: # OperationalError, if e.g. regexp is "??" rows = list(db.query(query, "(?i)" + re.escape(search))) for row in rows: codepoint = row[1] name = row[2] length = len(name) / 60 length = length if (length <= .5) else .5 position = codepoint / 0xFFFF position = position if (position <= 1) else 1 weight = length + position # DerivedAge might make a good weight results.append((weight, row)) if not results: return "No characters found" displays = [row[7] for (weight, row) in sorted(results)] return "".join(displays) @saxo.pipe def chars(arg): if not arg: return "Search for Unicode characters" with saxo.database(dotdir=True) as db: if not "saxo_unicode" in db: return "The unicode database needs to be updated" return search_by_name(db, arg)