Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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"])
Пример #4
0
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"])
Пример #5
0
    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))
Пример #6
0
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))
Пример #7
0
               +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)
Пример #8
0
    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)