def query(query): db = database.root query = query.replace('+', ' ') results = db.query(query) if not results['entry'] and len(results['matches']) == 1: return redirect(url_for('query', query=results['matches'].pop())) sourcemetaphor = [] unknownaffixes = None similar = None if not results['matches']: sourcemetaphor = [ e for a in compound2affixes(query) if len(a) != 1 for e in db.entries.itervalues() if a in e.searchaffixes ] unknownaffixes = len(sourcemetaphor) != \ len([a for a in compound2affixes(query) if len(a) != 1]) similar = [ e.word for e in db.entries.itervalues() if dameraulevenshtein(query, e.word) == 1 ] similar += [ g.gloss for g in db.glosses if g.gloss not in similar and dameraulevenshtein(query, g.gloss) == 1 ] results.update(locals()) return render_response('query.html', results)
def query(query): db = database.root query = query.replace('+', ' ') results = db.query(query) if not results['entry'] and len(results['matches']) == 1: return redirect(url_for('query', query=results['matches'].pop())) sourcemetaphor = [] unknownaffixes = None similar = None if not results['matches']: sourcemetaphor = [e for a in compound2affixes(query) if len(a) != 1 for e in db.entries.itervalues() if a in e.searchaffixes] unknownaffixes = len(sourcemetaphor) != \ len([a for a in compound2affixes(query) if len(a) != 1]) similar = [e.word for e in db.entries.itervalues() if dameraulevenshtein(query, e.word) == 1] similar += [g.gloss for g in db.glosses if g.gloss not in similar and dameraulevenshtein(query, g.gloss) == 1] results.update(locals()) return render_response('query.html', results)
def compound2affixes_splits_compounds(): """The compound2affixes util splits compounds into affixes""" same(compound2affixes('jbobau'), ['jbo', 'bau']) same(compound2affixes('lobybau'), ['lob', 'y', 'bau']) same(compound2affixes('jbobangu'), ['jbo', 'bangu']) same(compound2affixes('lojbybau'), ['lojb', 'y', 'bau']) same(compound2affixes('lobybangu'), ['lob', 'y', 'bangu']) same(compound2affixes('lojbybangu'), ['lojb', 'y', 'bangu']) same(compound2affixes("ro'inre'o"), ["ro'i", 'n', "re'o"])
def query(self, target, query): fields = 'affix|class|type|notes|cll|url|components' if query == 'help!': self.msg(target, '<query http://tiny.cc/query-format > ' '[(%s)]' % fields) return field = 'definition' match = re.search(r'\s\((?P<field>%s)\)$' % fields, query) if match: field = match.group('field') query = re.sub(r'\s\(.+?\)$', '', query) url = 'http://vlasisku.lojban.org/%s' % url_quote_plus(query) results = database.root.query(query) entry = results['entry'] if not entry and len(results['matches']) == 1: entry = results['matches'].pop() if entry or field == 'components': case = lambda x: field == x if case('definition'): data = entry.textdefinition.encode('utf-8') elif case('affix'): data = ', '.join('-%s-' % i for i in entry.affixes) elif case('class'): data = entry.grammarclass elif case('type'): data = entry.type elif case('notes'): data = entry.textnotes.encode('utf-8') elif case('cll'): data = ' '.join(link for (chap, link) in entry.cll) elif case('url'): data = url elif case('components'): entry = query data = ' '.join(e.word for a in compound2affixes(query) if len(a) != 1 for e in database.root.entries.itervalues() if a in e.searchaffixes) data = data or '(none)' if field == 'definition': format = '%s = %s' self.msg(target, format % (entry, data)) else: format = '%s (%s) = %s' self.msg(target, format % (entry, field, data))
class WordBot(BotBase): nickname = 'valsi' def query(self, target, query): fields = 'affix|class|type|notes|cll|url|components|lujvo' if query == 'help!': self.msg(target, '<query http://tiny.cc/query-format > ' '[(%s)]' % fields) return elif query == 'update!': def do_update(): from contextlib import closing import urllib2 import xml.etree.cElementTree as etree import os self.msg(target, 'downloading...') opener = urllib2.build_opener() opener.addheaders.append(('Cookie', 'jbovlastesessionid=%s' % self.factory.app.config['BOT_KEY'])) url = 'http://jbovlaste.lojban.org/export/xml-export.html?lang=en' with closing(opener.open(url)) as data: xml = etree.parse(data) assert xml.getroot().tag == 'dictionary' with open('vlasisku/data/jbovlaste.xml', 'w') as file: xml.write(file, 'utf-8') self.msg(target, 'updating...') database.init_app(database.app, True) self.msg(target, 'done!') import threading threading.Thread(target=do_update).start() return field = 'definition' match = re.search(r'\s\((?P<field>%s)\)$' % fields, query) if match: field = match.group('field') query = re.sub(r'\s\(.+?\)$', '', query) if field == 'lujvo': try: lujvos = jvocuhadju(query) tanru = query query = lujvos[0] except ValueError, e: self.msg(target, 'error: %s' % e) return url = 'http://%s/%s' % (self.factory.app.config['WEBSITE'], url_quote_plus(query)) results = database.root.query(query) entry = results['entry'] if not entry and len(results['matches']) == 1: entry = results['matches'].pop() if entry or field in ['components', 'lujvo']: case = lambda x: field == x if case('definition'): data = entry.textdefinition.encode('utf-8') elif case('affix'): data = ', '.join('-%s-' % i for i in entry.affixes) elif case('class'): data = entry.grammarclass elif case('type'): data = entry.type elif case('notes'): data = entry.textnotes.encode('utf-8') elif case('cll'): data = ' '.join(link for (chap, link) in entry.cll) elif case('url'): data = url elif case('components'): entry = query data = ' '.join(e.word for a in compound2affixes(query) if len(a) != 1 for e in database.root.entries.itervalues() if a in e.searchaffixes) elif case('lujvo'): data = ', '.join(lujvos) if entry: data += ' (defined as %s = %s)' % (query, entry.textdefinition.encode('utf-8')) entry = tanru data = data or '(none)' if field == 'definition': format = '%s = %s' self.msg(target, format % (entry, data)) else: format = '%s (%s) = %s' self.msg(target, format % (entry, field, data))
+results['glosses'] +results['affix'] +results['classes'] +results['types'] +results['definitions'] +results['notes']) data = ', '.join(map(str, matches[:10])) if len(results['matches']) > 10: data += '…' self.msg(target, format % (len(results['matches']), 's' if len(results['matches']) != 1 else '', data)) else: if field not in ['components', 'lujvo']: rafsi = compound2affixes(query) try: if len(rafsi) > 0: tanru = [e.word for a in rafsi if len(a) != 1 for e in database.root.entries.itervalues() if a in e.searchaffixes] lujvo = jvocuhadju(' '.join(tanru))[0] if lujvo != query: if field != 'definition': return self.query(target, '%s (%s)' % (lujvo, field)) else: return self.query(target, lujvo) except: pass self.msg(target, 'no results. %s' % url)
def query(self, target, query): fields = 'affix|class|type|notes|cll|url|components' if query == 'help!': self.msg(target, '<query http://tiny.cc/query-format > ' '[(%s)]' % fields) return field = 'definition' match = re.search(r'\s\((?P<field>%s)\)$' % fields, query) if match: field = match.group('field') query = re.sub(r'\s\(.+?\)$', '', query) url = 'http://vlasisku.lojban.org/%s' % url_quote_plus(query) results = database.root.query(query) entry = results['entry'] if not entry and len(results['matches']) == 1: entry = results['matches'].pop() if entry or field == 'components': case = lambda x: field == x if case('definition'): data = entry.textdefinition.encode('utf-8') elif case('affix'): data = ', '.join('-%s-' % i for i in entry.affixes) elif case('class'): data = entry.grammarclass elif case('type'): data = entry.type elif case('notes'): data = entry.textnotes.encode('utf-8') elif case('cll'): data = ' '.join(link for (chap, link) in entry.cll) elif case('url'): data = url elif case('components'): entry = query data = ' '.join(e.word for a in compound2affixes(query) if len(a) != 1 for e in database.root.entries.itervalues() if a in e.searchaffixes) data = data or '(none)' if field == 'definition': format = '%s = %s' self.msg(target, format % (entry, data)) else: format = '%s (%s) = %s' self.msg(target, format % (entry, field, data)) elif results['matches']: format = '%d result%s: %s' matches = (results['words'] +results['glosses'] +results['affix'] +results['classes'] +results['types'] +results['definitions'] +results['notes']) data = ', '.join(map(str, matches[:10])) if len(results['matches']) > 10: data += '…' self.msg(target, format % (len(results['matches']), 's' if len(results['matches']) != 1 else '', data)) else: self.msg(target, 'no results. %s' % url)