-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmidori.py
More file actions
161 lines (125 loc) · 5.63 KB
/
Copy pathmidori.py
File metadata and controls
161 lines (125 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sqlite3
import codecs
from midori_parseutils import parser, meanings, kun, on
PLACEHOLDER= '?' # For SQLite. See DBAPI paramstyle.
JLPT_DEFAULT = 2
ITEM_TYPE = 'compound'
LIMIT = 10
decode = lambda x: codecs.decode(x, 'utf8')
class Dictionary():
name = 'midori' # Backend identifier
def __init__(self, db_name):
conn = sqlite3.connect(db_name)
self.curs = conn.cursor()
self.db = db_name
def lookup(self, value):
value = '%' + value + '%'
compounds = self.compound_lookup(value)
kanjis = self.kanji_lookup(value)
return compounds, kanjis
def compound_lookup(self, value):
query = "SELECT id, meaning, word1, word2 FROM entry WHERE word1 LIKE ? OR word2 LIKE ? OR meaning LIKE ? LIMIT ?"
results = self.curs.execute(query, (value, value, value, LIMIT))
return [Compound(row) for row in results.fetchall()]
def kanji_lookup(self, value, by='literal', limit=LIMIT, recurse=False):
query = "SELECT literal, meaning, reading_on, reading_kun FROM kanji WHERE literal LIKE ? OR meaning LIKE ? LIMIT ?"
results = self.curs.execute(query, (value, value, LIMIT))
return [Kanji(row) for row in results.fetchall()]
def new(self, old, params, n = 1):
item_type = params.get('item_type', ITEM_TYPE)
level_type = params.get('jlpt_level', 'jlpt_level')
level = params.get('level', JLPT_DEFAULT)
assert level_type in ['jlpt_level', 'grade']
placeholders= ', '.join(PLACEHOLDER for unused in old)
query = "SELECT id, meaning, word1, word2 FROM entry \
WHERE jlpt_level >= ? AND id NOT IN (%s) ORDER BY RANDOM() LIMIT %i" % (placeholders, n)
if item_type == 'kanji':
query = "SELECT literal, meaning, reading_on, reading_kun FROM kanji \
WHERE grade <= ? AND literal NOT IN (%s) ORDER BY RANDOM() LIMIT %i" % (placeholders, n)
if level_type == 'jlpt_level':
query = "SELECT literal, meaning, reading_on, reading_kun FROM kanji \
WHERE jlpt_level >= ? AND literal NOT IN (%s) ORDER BY RANDOM() LIMIT %i" % (placeholders, n)
Entry = {"kanji":Kanji, "compound":Compound}[item_type]
results = self.curs.execute(query, tuple([level] + old)).fetchall()
entries = [Entry(*result) for result in results]
if len(entries) == 1:
return entries[0]
return entries
class Compound():
def __init__(self, row):
uid, meaning_str, kanji_str, kana_str = row
self.raw_meaning = meaning_str
self.raw_kanji = kanji_str
self.raw_kana = kana_str
self.meanings = parser.parseString(meaning_str) if meaning_str != '' else []
self.kanji = parser.parseString(kanji_str) if kanji_str != '' else []
self.kana = parser.parseString(kana_str) if kana_str != '' else []
def to_str(title, parsed):
mystr = title + ':\n'
for i, item in enumerate(parsed):
mystr += str(i) + ': ' + ','.join(item.words)
if item.pos != '':
mystr += ' [' + ','.join(item.pos) + ']'
if item.tags != '':
mystr += ' (' + ' | '.join(item.tags) + ')'
if item.comment != '':
mystr += ' [' + ','.join(item.comment) + ']'
mystr += '\n'
return mystr
self.meaning_str = to_str('Meanings', self.meanings)
self.kanji_str = to_str('Writings', self.kanji)
self.kana_str = to_str('Readings', self.kana)
self.valid_answers = {
"meaning2kanji" : [k for kl in self.kanji for k in kl.words],
"kanji2kana" : [k for kl in self.kana for k in kl.words]
}
self.cue = {
"meaning2kanji" : self.meaning_str + '\n' + self.kana_str,
"kanji2kana" : self.kanji_str
}
def __str__(self):
return self.__unicode__()
def __unicode__(self):
meanings_str = self.meaning_str
kanji_str = self.kanji_str
kana_str = self.kana_str
display = str(self.uid) + '\n' + \
meanings_str + '\n' + \
kanji_str + '\n' + \
kana_str + '\n'
return display.encode("utf8")
def __repr__(self):
return self.kanji_str.encode("utf8")
class Kanji():
def __init__(self, row):
uid, meaning_str, on_str, kun_str = row
self.uid = uid
self.raw_meaning = meaning_str
self.raw_on = on_str
self.raw_kun = kun_str
self.meanings = [] if meaning_str == '' else meanings.parseString(meaning_str)
self.on = [] if on_str == '' else on.parseString(on_str)
self.kun = [] if kun_str == '' else kun.parseString(kun_str)
self.meaning_str = 'Meanings: ' + ','.join(self.meanings)
self.on_str = u'音: ' + ','.join(self.on)
self.kun_str = u'訓: ' + ','.join(['.'.join(i) for i in self.kun])
self.valid_answers = {
"kanji2meaning" : list(self.meanings),
"meaning2kanji" : list(self.uid)
}
self.cue = {
"kanji2meaning" : self.uid,
"meaning2kanji" : self.meaning_str + '\n' + self.on_str + '\n' + self.kun_str
}
def __str__(self):
return self.__unicode__()
def __unicode__(self):
display = self.uid + '\n' + \
self.meaning_str + '\n' + \
self.on_str + '\n' + \
self.kun_str + '\n'
return display.encode("utf8")
def __repr__(self):
return self.uid.encode("utf8")