-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmake_cards.py
149 lines (124 loc) · 5.72 KB
/
make_cards.py
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
import argparse
from PyDictionary import PyDictionary
import csv
import random
class Anki(object):
def __init__(self, vocab_file, output_file, error_file):
self.vocab_file = vocab_file
self.output_file = output_file
self.error_file = error_file
def read_vocab_file(self):
vocab_list = [word.rstrip() for word in open(self.vocab_file).readlines()]
return vocab_list
def define_vocab(self,vocab_list,verbose):
dictionary = PyDictionary()
defs_list = list()
error_list= list()
for word in vocab_list:
if dictionary.meaning(word) != "":
if verbose:
print([word, dictionary.meaning(word)])
defs_list.append(dictionary.meaning(word))
else:
if verbose:
print("%s has been added to the error list"%word)
error_list.append(word)
return defs_list, error_list
def make_deck(self,vocab_list,defs_list,verbose):
with open(self.output_file,"w") as csvfile:
writer = csv.writer(csvfile, delimiter='\t')
for word, definition in zip(vocab_list,defs_list):
writer.writerow([word, definition])
if verbose:
print("anki deck has been created.")
return self.output_file
def write_errors(self,error_list,verbose):
with open(self.error_file,"w") as csvfile:
writer = csv.writer(csvfile, delimiter = '\t')
for err in error_list:
writer.writerow(err)
if verbose:
print("error log has been written.")
return self.error_file
def edit_cards(self):
word_edits=list()
words=list()
defs=list()
with open(self.output_file,"r") as csvfile:
reader = csv.reader(csvfile, delimiter='\t')
for row in reader:
if len(row) == 2:
words.append(row[0])
defs.append(row[1])
else:
word_edits.append(row[0])
for edit in word_edits:
print("\n")
defin = input("definition for %s: "%edit)
words.append(edit)
defs.append(defin)
return self
def sentence_mode(self):
import tkinter
from tkinter import simpledialog
tk_window = tkinter.Tk()
tk_window.withdraw()
tk_window.deiconify()
word_list=list()
with open(self.output_file,"r") as csvfile:
reader = csv.reader(csvfile, delimiter='\t')
for row in reader:
word_list.append(row)
test_idxs = list(range(len(word_list)))
random.shuffle(test_idxs)
for idx in test_idxs:
sentence = simpledialog.askstring("Input","Write a sentence for the word: \n \n %s \n %s"%(word_list[idx][0],word_list[idx][1]), parent = tk_window)
return self
def sentence_no_gui_mode(self):
word_list=list()
with open(self.output_file,"r") as csvfile:
reader = csv.reader(csvfile, delimiter='\t')
for row in reader:
word_list.append(row)
test_idxs = list(range(len(word_list)))
random.shuffle(test_idxs)
for idx in test_idxs:
print("***********************************************************")
print("Write a sentence for the word:")
print(" ")
print(word_list[idx][0])
print(word_list[idx][1])
print(" ")
test = input("sentence: ")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='This script makes anki flash cards from a text file of vocab words.')
parser.add_argument('vocab_file', metavar='vocab_file', action="store",
help='txt file full of vocab words')
parser.add_argument('-o', '--output_file', metavar='output_file',
default='anki_gre_vocab.txt', action="store",
help='output anki deck txt file')
parser.add_argument('-e', '--error_file',metavar='error_file',
default='error_words.txt',action="store",
help='error file for the words that there were no definitions')
parser.add_argument('-m','--edit_mode', dest='edit_mode',default=False,
action="store_true", help='manually edit mode allows for the editing of an existing deck file to manually edit definitions')
parser.add_argument('-v','--verbose', dest='verbose',default=False,
action="store_true", help='verbose mode')
parser.add_argument('--sentence', dest='sentence_mode', default = False, action="store_true", help="sentence mode for learning words, dependency: tkinter required.")
parser.add_argument('--sentence_no_gui', dest='sentence_no_gui_mode', default = False, action = "store_true", help = "no gui sentence mode for learning words")
args = parser.parse_args()
if args.edit_mode == True:
anki = Anki(args.vocab_file, args.output_file,args.error_file)
defs_list = anki.edit_cards()
elif args.sentence_mode == True:
anki = Anki(args.vocab_file, args.output_file,args.error_file)
sentences = anki.sentence_mode()
elif args.sentence_no_gui_mode == True:
anki = Anki(args.vocab_file, args.output_file, args.error_file)
sentences = anki.sentence_no_gui_mode()
else:
anki = Anki(args.vocab_file, args.output_file,args.error_file)
vocab_list = anki.read_vocab_file()
defs_list, error_list = anki.define_vocab(vocab_list, args.verbose)
anki_deck = anki.make_deck(vocab_list,defs_list,args.verbose)
error_log = anki.write_errors(error_list,args.verbose)