16
16
17
17
18
18
# Note: This class was adapted from the Real-Time_Import_for_use_with_the_Rikaisama_Firefox_Extension plug-in by [email protected]
19
- #.. itself adapted from Yomichan plugin by Alex Yatskov.
19
+ # .. itself adapted from Yomichan plugin by Alex Yatskov.
20
20
21
21
PATH = os .path .dirname (os .path .abspath (__file__ ))
22
22
ONLY_ADD_NEW = True
23
+ DO_UPDATE_NOTES = True
23
24
EVERNOTE_MODEL = "evernote_note"
24
25
TITLE_FIELD_NAME = "title"
25
26
CONTENT_FIELD_NAME = "content"
26
27
GUID_FIELD_NAME = "Evernote Guid"
27
28
28
29
29
30
class Anki :
31
+ def update_evernote_cards (self , evernote_cards , tag ):
32
+ count = 0
33
+ for card in evernote_cards :
34
+ anki_field_info = {TITLE_FIELD_NAME : card .front .decode ('utf-8' ),
35
+ CONTENT_FIELD_NAME : card .back .decode ('utf-8' ),
36
+ GUID_FIELD_NAME : card .guid }
37
+ card .tags .append (tag )
38
+ self .update_note (anki_field_info , card .tags )
39
+ count += 1
40
+ self .stop_editing ()
41
+ return count
42
+
30
43
def add_evernote_cards (self , evernote_cards , deck , tag ):
31
44
count = 0
32
45
model_name = EVERNOTE_MODEL
@@ -40,6 +53,20 @@ def add_evernote_cards(self, evernote_cards, deck, tag):
40
53
self .stop_editing ()
41
54
return count
42
55
56
+ def update_note (self , fields , tags = list ()):
57
+ col = self .collection ()
58
+ note_id = col .findNotes (fields [GUID_FIELD_NAME ])[0 ]
59
+ note = anki .notes .Note (col , None , note_id )
60
+ note .tags = tags
61
+ for fld in note ._model ['flds' ]:
62
+ if TITLE_FIELD_NAME in fld .get ('name' ):
63
+ note .fields [fld .get ('ord' )] = fields [TITLE_FIELD_NAME ]
64
+ elif CONTENT_FIELD_NAME in fld .get ('name' ):
65
+ note .fields [fld .get ('ord' )] = fields [CONTENT_FIELD_NAME ]
66
+ # we dont have to update the evernote guid because if it changes we wont find this note anyway
67
+ note .flush ()
68
+ return note .id
69
+
43
70
def add_note (self , deck_name , model_name , fields , tags = list ()):
44
71
note = self .create_note (deck_name , model_name , fields , tags )
45
72
if note is not None :
@@ -55,8 +82,8 @@ def create_note(self, deck_name, model_name, fields, tags=list()):
55
82
col = self .collection ()
56
83
note = anki .notes .Note (col , model )
57
84
note .model ()['did' ] = id_deck
58
- tags = [tags ]
59
85
note .tags = tags
86
+
60
87
for name , value in fields .items ():
61
88
note [name ] = value
62
89
return note
@@ -79,8 +106,8 @@ def add_evernote_model(self): # adapted from the IREAD plug-in from Frank
79
106
mm .addField (evernote_model , guid_field )
80
107
# Add template
81
108
t = mm .newTemplate ('EvernoteReview' )
82
- t ['qfmt' ] = "{{" + TITLE_FIELD_NAME + "}}"
83
- t ['afmt' ] = "{{" + CONTENT_FIELD_NAME + "}}"
109
+ t ['qfmt' ] = "{{" + TITLE_FIELD_NAME + "}}"
110
+ t ['afmt' ] = "{{" + CONTENT_FIELD_NAME + "}}"
84
111
mm .addTemplate (evernote_model , t )
85
112
mm .add (evernote_model )
86
113
return evernote_model
@@ -91,22 +118,21 @@ def add_evernote_model(self): # adapted from the IREAD plug-in from Frank
91
118
source_ord , source_field = fmap [GUID_FIELD_NAME ]
92
119
source_field ['sticky' ] = False
93
120
94
- def get_guids_from_anki_id (self ,ids ):
95
- guids = []
121
+ def get_guids_from_anki_id (self , ids ):
122
+ guids = {}
96
123
for a_id in ids :
97
124
card = self .collection ().getCard (a_id )
98
125
items = card .note ().items ()
99
126
if len (items ) == 3 :
100
- guids . append ( items [2 ][1 ]) # not a very smart access
127
+ guids [ str ( a_id )] = items [2 ][1 ] # not a very smart access
101
128
return guids
102
129
103
130
def can_add_note (self , deck_name , model_name , fields ):
104
131
return bool (self .create_note (deck_name , model_name , fields ))
105
132
106
133
def get_cards_id_from_tag (self , tag ):
107
- query = "tag:" + tag
134
+ query = "tag:" + tag
108
135
ids = self .collection ().findCards (query )
109
- #show_tooltip(ids)
110
136
return ids
111
137
112
138
def start_editing (self ):
@@ -142,7 +168,6 @@ def __init__(self, q, a, g, tags):
142
168
143
169
144
170
class Evernote :
145
-
146
171
def __init__ (self ):
147
172
if not mw .col .conf .get ('evernoteToken' , False ):
148
173
# First run of the Plugin we did not save the access key yet
@@ -214,9 +239,34 @@ def proceed(self):
214
239
anki_guids = self .anki .get_guids_from_anki_id (anki_ids )
215
240
evernote_guids = self .get_evernote_guids_from_tag (self .evernoteTags )
216
241
if ONLY_ADD_NEW :
217
- note_guids_to_import = set (evernote_guids )- set (anki_guids )
218
- n = self .import_into_anki (note_guids_to_import , self .deck , self .ankiTag )
219
- show_tooltip (str (n ) + " cards have been imported" )
242
+ cards_to_add_or_update = self .dict_remove_duplicates (evernote_guids , anki_guids )
243
+ n = self .import_into_anki (cards_to_add_or_update ['add' ], self .deck , self .ankiTag )
244
+ n2 = 0
245
+ if DO_UPDATE_NOTES :
246
+ self .anki .start_editing ()
247
+ self .update_in_anki (cards_to_add_or_update ['update' ], self .ankiTag )
248
+ n2 = len (cards_to_add_or_update ['update' ])
249
+
250
+ show_tooltip ("{} existing card(s) have been updated (deleted and re-added) and {} new card(s) have been imported." .format (str (n2 ), str (n )))
251
+ self .anki .stop_editing ()
252
+
253
+ def dict_remove_duplicates (self , evernote_guids , anki_guids ):
254
+ notes_to_add = []
255
+ notes_to_update = []
256
+ for evernote_guid in evernote_guids :
257
+ for anki_id , anki_guid in anki_guids .items ():
258
+ if anki_guid == evernote_guid :
259
+ notes_to_update .append (evernote_guid )
260
+ break
261
+ else :
262
+ notes_to_add .append (evernote_guid )
263
+ return {'add' : notes_to_add , 'update' : notes_to_update }
264
+
265
+ def update_in_anki (self , guid_set , tag ):
266
+
267
+ cards = self .evernote .create_evernote_cards (guid_set )
268
+ number = self .anki .update_evernote_cards (cards , tag )
269
+ return number
220
270
221
271
def import_into_anki (self , guid_set , deck , tag ):
222
272
cards = self .evernote .create_evernote_cards (guid_set )
@@ -228,7 +278,7 @@ def get_evernote_guids_from_tag(self, tags):
228
278
for tag in tags :
229
279
tag_guid = self .evernote .find_tag_guid (tag )
230
280
if tag_guid is not None :
231
- note_guids = note_guids + self .evernote .find_notes_filter_by_tag_guids ([tag_guid ])
281
+ note_guids = note_guids + self .evernote .find_notes_filter_by_tag_guids ([tag_guid ])
232
282
return note_guids
233
283
234
284
@@ -237,73 +287,75 @@ def show_tooltip(text, time_out=3000):
237
287
238
288
239
289
def main ():
240
- show_tooltip (str ())
290
+ # show_tooltip(str())
241
291
controller = Controller ()
242
292
controller .proceed ()
243
293
294
+
244
295
action = aqt .qt .QAction ("Import from Evernote" , aqt .mw )
245
296
aqt .mw .connect (action , aqt .qt .SIGNAL ("triggered()" ), main )
246
297
aqt .mw .form .menuTools .addAction (action )
247
298
248
299
249
300
def setup_evernote (self ):
250
- global evernote_default_deck
251
- global evernote_default_tag
252
- global evernote_tags_to_import
253
- global keep_evernote_tags
254
-
255
- layout_tab = self .form .tab_1 .layout ()
256
- group_box = QGroupBox ("Evernote Importer" )
257
- layout = QVBoxLayout ()
258
-
259
- # Default Deck
260
- evernote_default_deck_label = QLabel ("Default Deck:" )
261
- evernote_default_deck = QLineEdit ()
262
- evernote_default_deck .setText (mw .col .conf .get ('evernoteDefaultDeck' , "" ))
263
- layout .insertWidget (int (layout .count ())+ 1 , evernote_default_deck_label )
264
- layout .insertWidget (int (layout .count ())+ 2 , evernote_default_deck )
265
- evernote_default_deck .connect (evernote_default_deck , SIGNAL ("editingFinished()" ), update_evernote_default_deck )
266
-
267
- # Default Tag
268
- evernote_default_tag_label = QLabel ("Default Tag:" )
269
- evernote_default_tag = QLineEdit ()
270
- evernote_default_tag .setText (mw .col .conf .get ('evernoteDefaultTag' , "" ))
271
- layout .insertWidget (int (layout .count ())+ 1 , evernote_default_tag_label )
272
- layout .insertWidget (int (layout .count ())+ 2 , evernote_default_tag )
273
- evernote_default_tag .connect (evernote_default_tag , SIGNAL ("editingFinished()" ), update_evernote_default_tag )
274
-
275
- # Tags to import
276
- evernote_tags_to_import_label = QLabel ("Tags to import:" )
277
- evernote_tags_to_import = QLineEdit ()
278
- evernote_tags_to_import .setText (mw .col .conf .get ('evernoteTagsToImport' , "" ))
279
- layout .insertWidget (int (layout .count ())+ 1 , evernote_tags_to_import_label )
280
- layout .insertWidget (int (layout .count ())+ 2 , evernote_tags_to_import )
281
- evernote_tags_to_import .connect (evernote_tags_to_import ,
282
- SIGNAL ("editingFinished()" ),
283
- update_evernote_tags_to_import )
284
-
285
- # keep evernote tags
286
- keep_evernote_tags = QCheckBox ("Keep Evernote Tags" , self )
287
- keep_evernote_tags .setChecked (mw .col .conf .get ('evernoteKeepTags' , False ))
288
- keep_evernote_tags .stateChanged .connect (update_evernote_keep_tags )
289
- layout .insertWidget (int (layout .count ())+ 1 , keep_evernote_tags )
290
- group_box .setLayout (layout )
291
- layout_tab .insertWidget (int (layout .count ())+ 1 , group_box )
301
+ global evernote_default_deck
302
+ global evernote_default_tag
303
+ global evernote_tags_to_import
304
+ global keep_evernote_tags
305
+
306
+ layout_tab = self .form .tab_1 .layout ()
307
+ group_box = QGroupBox ("Evernote Importer" )
308
+ layout = QVBoxLayout ()
309
+
310
+ # Default Deck
311
+ evernote_default_deck_label = QLabel ("Default Deck:" )
312
+ evernote_default_deck = QLineEdit ()
313
+ evernote_default_deck .setText (mw .col .conf .get ('evernoteDefaultDeck' , "" ))
314
+ layout .insertWidget (int (layout .count ()) + 1 , evernote_default_deck_label )
315
+ layout .insertWidget (int (layout .count ()) + 2 , evernote_default_deck )
316
+ evernote_default_deck .connect (evernote_default_deck , SIGNAL ("editingFinished()" ), update_evernote_default_deck )
317
+
318
+ # Default Tag
319
+ evernote_default_tag_label = QLabel ("Default Tag:" )
320
+ evernote_default_tag = QLineEdit ()
321
+ evernote_default_tag .setText (mw .col .conf .get ('evernoteDefaultTag' , "" ))
322
+ layout .insertWidget (int (layout .count ()) + 1 , evernote_default_tag_label )
323
+ layout .insertWidget (int (layout .count ()) + 2 , evernote_default_tag )
324
+ evernote_default_tag .connect (evernote_default_tag , SIGNAL ("editingFinished()" ), update_evernote_default_tag )
325
+
326
+ # Tags to import
327
+ evernote_tags_to_import_label = QLabel ("Tags to import:" )
328
+ evernote_tags_to_import = QLineEdit ()
329
+ evernote_tags_to_import .setText (mw .col .conf .get ('evernoteTagsToImport' , "" ))
330
+ layout .insertWidget (int (layout .count ()) + 1 , evernote_tags_to_import_label )
331
+ layout .insertWidget (int (layout .count ()) + 2 , evernote_tags_to_import )
332
+ evernote_tags_to_import .connect (evernote_tags_to_import ,
333
+ SIGNAL ("editingFinished()" ),
334
+ update_evernote_tags_to_import )
335
+
336
+ # keep evernote tags
337
+ keep_evernote_tags = QCheckBox ("Keep Evernote Tags" , self )
338
+ keep_evernote_tags .setChecked (mw .col .conf .get ('evernoteKeepTags' , False ))
339
+ keep_evernote_tags .stateChanged .connect (update_evernote_keep_tags )
340
+ layout .insertWidget (int (layout .count ()) + 1 , keep_evernote_tags )
341
+ group_box .setLayout (layout )
342
+ layout_tab .insertWidget (int (layout .count ()) + 1 , group_box )
292
343
293
344
294
345
def update_evernote_default_deck ():
295
- mw .col .conf ['evernoteDefaultDeck' ] = evernote_default_deck .text ()
346
+ mw .col .conf ['evernoteDefaultDeck' ] = evernote_default_deck .text ()
296
347
297
348
298
349
def update_evernote_default_tag ():
299
- mw .col .conf ['evernoteDefaultTag' ] = evernote_default_tag .text ()
350
+ mw .col .conf ['evernoteDefaultTag' ] = evernote_default_tag .text ()
300
351
301
352
302
353
def update_evernote_tags_to_import ():
303
- mw .col .conf ['evernoteTagsToImport' ] = evernote_tags_to_import .text ()
354
+ mw .col .conf ['evernoteTagsToImport' ] = evernote_tags_to_import .text ()
304
355
305
356
306
357
def update_evernote_keep_tags ():
307
- mw .col .conf ['evernoteKeepTags' ] = keep_evernote_tags .isChecked ()
358
+ mw .col .conf ['evernoteKeepTags' ] = keep_evernote_tags .isChecked ()
359
+
308
360
309
361
Preferences .setupOptions = wrap (Preferences .setupOptions , setup_evernote )
0 commit comments