Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

162

163

164

165

#! /usr/bin/env python3 

# -*- coding: utf-8 -*- 

 

#       Copyright 2011-2012, Marten de Vries 

# 

#       This file is part of OpenTeacher. 

# 

#       OpenTeacher is free software: you can redistribute it and/or modify 

#       it under the terms of the GNU General Public License as published by 

#       the Free Software Foundation, either version 3 of the License, or 

#       (at your option) any later version. 

# 

#       OpenTeacher is distributed in the hope that it will be useful, 

#       but WITHOUT ANY WARRANTY; without even the implied warranty of 

#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

#       GNU General Public License for more details. 

# 

#       You should have received a copy of the GNU General Public License 

#       along with OpenTeacher.  If not, see <http://www.gnu.org/licenses/>. 

 

from etree import ElementTree 

 

class OpenTeacherLoaderModule: 

        def __init__(self, moduleManager, *args, **kwargs): 

                super().__init__(*args, **kwargs) 

 

                self.type = "load" 

                self.priorities = { 

                        "default": 540, 

                } 

 

                self._mm = moduleManager 

                self.requires = ( 

                        self._mm.mods(type="wordsStringParser"), 

                ) 

                self.uses = ( 

                        self._mm.mods(type="translator"), 

                ) 

                self.filesWithTranslations = ("ot.py",) 

 

        def enable(self): 

                self._modules = set(self._mm.mods(type="modules")).pop() 

                self.loads = {"ot": ["words"]} 

                self.mimetype = "application/x-openteacher" 

                try: 

                        translator = self._modules.default("active", type="translator") 

                except IndexError: 

                        pass 

                else: 

                        translator.languageChanged.handle(self._retranslate) 

                self._retranslate() 

 

                self.active = True 

 

        def _retranslate(self): 

                try: 

                        translator = self._modules.default("active", type="translator") 

                except IndexError: 

exit                        _, ngettext = str, lambda a, b, n: a if n == 1 else b 

                else: 

                        _, ngettext = translator.gettextFunctions( 

                                self._mm.resourcePath("translations") 

                        ) 

 

                #TRANSLATORS: Please don't translate 'OpenTeacher' unless you've 

                #TRANSLATORS: a good reason for doing so in your language, of 

                #TRANSLATORS: course. This is used to describe the file format 

                #TRANSLATORS: of the OpenTeacher 2.x series in a file dialog. 

                self.name = _("OpenTeacher 2.x") 

 

        def disable(self): 

                self.active = False 

 

                del self._modules 

                del self.name 

                del self.loads 

                del self.mimetype 

 

        def getFileTypeOf(self, path): 

exit                if path.endswith(".ot"): 

                        return "words" 

 

        def load(self, path): 

                #Create the new word list 

                wordList = { 

                        "items": [], 

                        "tests": [], 

                } 

                #Feed the xml parser 

                with open(path, 'rb') as f: 

                        root = ElementTree.parse(f).getroot() 

 

                #Stores the title, question language and answer language 

                wordList["title"] = root.findtext("title") or u"" 

                wordList["questionLanguage"] = root.findtext("question_language") or u"" 

                wordList["answerLanguage"] = root.findtext("answer_language") or u"" 

 

                #create one test, which is used for all results, because .ot 

                #doesn't support multiple tests. 

                test = {"results": []} 

 

                #because .ot doesn't give words an id, we use a counter. 

                counter = 0 

                for treeWord in root.findall("word"): 

                        #Creates the word and sets its id (which is the current 

                        #value of the counter) 

                        listWord = { 

                                "id": counter, 

                                "comment": u"" 

                        } 

 

                        #Parses the question 

                        known = treeWord.findtext("known") or u"" 

                        listWord["questions"] = self._modules.default( 

                                "active", 

                                type="wordsStringParser" 

                        ).parse(known) 

 

                        #Parses the answers 

                        second = treeWord.findtext("second") 

                        if second is not None: 

                                foreign = (treeWord.findtext("foreign") or u"") + ", " + second 

                        else: 

                                foreign = treeWord.findtext("foreign") or u"" 

                        #remove so the test is also reliable the next time 

                        del second 

                        listWord["answers"] = self._modules.default( 

                                "active", 

                                type="wordsStringParser" 

                        ).parse(foreign) 

 

                        #Parses the results, all are saved in the test made above. 

                        wrong, total = (treeWord.findtext("results") or "0/0").split("/") 

                        wrong = int(wrong) 

                        total = int(total) 

                        right = total - wrong 

                        for i in range(right): 

                                result = { 

                                        "result": "right", 

                                        "itemId": listWord["id"] 

                                } 

                                test["results"].append(result) 

                        for i in range(wrong): 

                                result = { 

                                        "result": "wrong", 

                                        "itemId": listWord["id"] 

                                } 

                                test["results"].append(result) 

 

                        #Adds the generated word to the list 

                        wordList["items"].append(listWord) 

                        #Increment the counter (= the next word id) 

                        counter += 1 

 

                #Adds all results to the list 

                if test["results"]: 

                        wordList["tests"].append(test) 

 

                return { 

                        "list": wordList, 

                        "resources": {}, 

                } 

 

def init(moduleManager): 

        return OpenTeacherLoaderModule(moduleManager)