~johannes.baiter/mnemosyne-proj/mnemodroid

« back to all changes in this revision

Viewing changes to src/com/mnemodroid/mnemosyne/mnemosyne/libmnemosyne/file_formats/memaid.py

  • Committer: Johannes Baiter
  • Date: 2011-02-15 00:30:59 UTC
  • Revision ID: johannes.baiter@gmail.com-20110215003059-83fn5ebmjs89jl2d
Relocated python scripts, added README and shellscript for tarball-creation, some bugfixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
from xml.sax import saxutils, make_parser
3
 
from xml.sax.handler import feature_namespaces, ContentHandler
4
 
 
5
 
 
6
 
 
7
 
##############################################################################
8
 
#
9
 
# memaid_XML_Importer
10
 
#
11
 
##############################################################################
12
 
 
13
 
class memaid_XML_Importer(ContentHandler):
14
 
    
15
 
    def __init__(self, default_cat=None, reset_learning_data=False):
16
 
        self.reading, self.text = {}, {}
17
 
        
18
 
        self.reading["cat"] = False
19
 
        self.reading["Q"]   = False
20
 
        self.reading["A"]   = False
21
 
 
22
 
        self.default_cat = default_cat
23
 
        self.reset_learning_data = reset_learning_data
24
 
 
25
 
        self.imported_cards = []
26
 
 
27
 
    def to_bool(self, string):
28
 
        if string == '0':
29
 
            return False
30
 
        else:
31
 
            return True
32
 
    
33
 
    def startElement(self, name, attrs):
34
 
        global import_time_of_start
35
 
        
36
 
        if name == "memaid":
37
 
            if attrs.get("time_of_start"):
38
 
                import_time_of_start \
39
 
                  = StartTime(long(attrs.get("time_of_start")))
40
 
            else:
41
 
                import_time_of_start = time_of_start
42
 
                
43
 
        elif name == "item":
44
 
            self.card = Card()
45
 
 
46
 
            self.card.id        = long(attrs.get("id"))
47
 
            self.card.grade     =  int(attrs.get("gr"))
48
 
            self.card.next_rep  =  int(attrs.get("tm_t_rpt"))
49
 
            self.card.ret_reps  =  int(attrs.get("rp"))
50
 
            interval            =  int(attrs.get("ivl"))
51
 
            self.card.last_rep  = self.card.next_rep - interval
52
 
            self.card.easiness  = average_easiness()
53
 
 
54
 
        elif name == "category":
55
 
            self.active = self.to_bool(attrs.get("scheduled"))
56
 
        else:
57
 
            self.reading[name] = True
58
 
            self.text[name] = ""
59
 
 
60
 
    def characters(self, ch):
61
 
        for name in self.reading.keys():
62
 
            if self.reading[name] == True:
63
 
                self.text[name] += ch
64
 
 
65
 
    def endElement(self, name):
66
 
 
67
 
        self.reading[name] = False
68
 
 
69
 
        if name == "cat":
70
 
 
71
 
            cat_name = self.text["cat"]
72
 
            self.card.cat = get_category_by_name(cat_name)
73
 
 
74
 
        elif name == "Q":
75
 
 
76
 
            self.card.q = self.text["Q"]
77
 
 
78
 
        elif name == "A":
79
 
 
80
 
            self.card.a = self.text["A"]
81
 
 
82
 
        elif name == "item":
83
 
 
84
 
            if self.card.id == 0:
85
 
                self.card.new_id()
86
 
 
87
 
            if self.card.cat == None:
88
 
                self.card.cat = self.default_cat
89
 
 
90
 
            if self.reset_learning_data == True:
91
 
                self.card.reset_learning_data()
92
 
                self.card.easiness = average_easiness()
93
 
 
94
 
            self.imported_cards.append(self.card)
95
 
 
96
 
        elif name == "category":
97
 
 
98
 
            name = self.text["name"]
99
 
            if (name != None):
100
 
                ensure_category_exists(name)
101
 
            get_category_by_name(name).active = self.active
102
 
 
103
 
            
104
 
 
105
 
# TODO: remove duplication over different XML formats
106
 
 
107
 
##############################################################################
108
 
#
109
 
# import_XML
110
 
#
111
 
#   Note that we do not register separate file formats for Mnemosyne and
112
 
#   Memaid XML. We're able to figure out the difference on our own and do not
113
 
#   need to put this burden on the user.
114
 
#
115
 
##############################################################################
116
 
 
117
 
def import_XML(filename, default_cat, reset_learning_data=False):
118
 
    global cards
119
 
 
120
 
    # Determine if we import a Mnemosyne or a Memaid file.
121
 
 
122
 
    handler = None
123
 
 
124
 
    f = None
125
 
    try:
126
 
        f = file(filename)
127
 
    except:
128
 
        try:
129
 
            f = file(unicode(filename).encode("latin"))
130
 
        except:
131
 
            raise LoadError()
132
 
    
133
 
    l = f.readline()
134
 
    l += f.readline();    
135
 
    if "mnemosyne" in l:
136
 
        handler = XML_Importer(default_cat, reset_learning_data)
137
 
    elif "smconv_pl" in l:
138
 
        handler = smconv_XML_Importer(default_cat, reset_learning_data)
139
 
    else:
140
 
        handler = memaid_XML_Importer(default_cat, reset_learning_data)
141
 
        
142
 
    f.close()
143
 
 
144
 
    # Parse XML file.
145
 
    
146
 
    parser = make_parser()
147
 
    parser.setFeature(feature_namespaces, 0)
148
 
    parser.setContentHandler(handler)
149
 
 
150
 
    try:
151
 
        # Use cStringIo to avoid a crash in sax when filename has unicode
152
 
        # characters.
153
 
        s = file(filename).read()
154
 
        f = cStringIO.StringIO(s)
155
 
        parser.parse(f)
156
 
    except Exception, e:
157
 
        raise XMLError(stack_trace=True)
158
 
 
159
 
    # Calculate offset with current start date.
160
 
    
161
 
    cur_start_date =        time_of_start.time
162
 
    imp_start_date = import_time_of_start.time
163
 
    
164
 
    offset = long(round((cur_start_date - imp_start_date) / 60. / 60. / 24.))
165
 
        
166
 
    # Adjust timings.
167
 
 
168
 
    if reset_learning_data == False:
169
 
        if cur_start_date <= imp_start_date :
170
 
            for card in handler.imported_cards:
171
 
                card.last_rep += abs(offset)
172
 
                card.next_rep += abs(offset)
173
 
        else:
174
 
            time_of_start = StartTime(imp_start_date)
175
 
            for card in cards:
176
 
                card.last_rep += abs(offset)
177
 
                card.next_rep += abs(offset)
178
 
 
179
 
    return handler.imported_cards