#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2011-2014, 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 TeachmasterLoaderModule:
def __init__(self, moduleManager, *args, **kwargs):
super().__init__(*args, **kwargs)
self._mm = moduleManager
self.type = "load"
self.priorities = {
"default": 756,
}
self.requires = (
self._mm.mods(type="wordsStringParser"),
)
self.uses = (
self._mm.mods(type="translator"),
)
self.filesWithTranslations = ("teachmaster.py",)
@property
def _parse(self):
return self._modules.default("active", type="wordsStringParser").parse
def _retranslate(self):
try:
translator = self._modules.default("active", type="translator")
except IndexError:
_, ngettext = str, lambda a, b, n: a if n == 1 else b
else:
_, ngettext = translator.gettextFunctions(
self._mm.resourcePath("translations")
)
#TRANSLATORS: This is the name of a file type OpenTeacher can
#TRANSLATORS: read. It's named after the program with the same
#TRANSLATORS: name. For more info on the program, see:
#TRANSLATORS: http://www.teachmaster.de/cms/1-1-Home.html
self.name = _("Teachmaster")
def enable(self):
self._modules = set(self._mm.mods(type="modules")).pop()
try:
translator = self._modules.default("active", type="translator")
except IndexError:
pass
else:
translator.languageChanged.handle(self._retranslate)
self._retranslate()
self.mimetype = "application/x-teachmaster"
self.loads = {"vok2": ["words"]}
self.active = True
def disable(self):
self.active = False
del self._modules
del self.name
del self.loads
del self.mimetype
def getFileTypeOf(self, path):
if path.endswith(".vok2"):
return "words"
def load(self, path):
"""Loads Teachmaster's .vok2 files. Lesson info is stored in
additional files, but that's not loaded. It might not map to
the OT result system either (not sure). For documentation on
the file format in German (translations are available, but
those aren't all complete/up-to-date):
http://www.teachmaster.de/wikka/DocumentationDEDateiformate
"""
with open(path, "rb") as f:
root = ElementTree.parse(f).getroot()
list = {
"items": [],
"title": root.findtext("header/titel") or u"",
"questionLanguage": root.findtext("header/spreins") or u"",
"answerLanguage": root.findtext("header/sprzwei"),
}
for i, itemTree in enumerate(root.findall("vokabelsatz")):
word = self._loadWordFromItemTree(itemTree)
word["id"] = i
list["items"].append(word)
return {
"resources": {},
"list": list,
}
def _loadWordFromItemTree(self, itemTree):
word = {
"questions": self._parse(itemTree.findtext("spreins") or u""),
"answers": [],
"comment": itemTree.findtext("bemerkung") or u"",
}
answer = itemTree.findtext("sprzwei")
synonym = itemTree.findtext("synonym")
if answer:
word["answers"].append((answer,))
if synonym:
word["answers"].append((synonym,))
return word
def init(moduleManager):
return TeachmasterLoaderModule(moduleManager)