swh:1:snp:7ce5f1105410d5ee1ad6abfdc873986c25b579e5
Raw File
Tip revision: cefc363944096520d5880f5e6a005e8b49fbb416 authored by Dirk Roorda on 30 November 2016, 19:49:50 UTC
New minor release 0.0.7
Tip revision: cefc363
text.py
from .data import SKELETON

class Text(object):
    def __init__(self, api, tf):
        self.api = api
        self.languages = {}
        self.nameFromNode = {}
        self.nodeFromName = {}
        config = tf.features[SKELETON[2]].metaData
        sections = config.get('sections', '').strip().split(',')
        sectionFeatureNames = [config.get('{}Feature'.format(s), '') for s in sections]
        sectionTypes = [config.get('{}Otype'.format(s), '') for s in sections]
        good = True
        for i in range(len(sections)):
            if sectionFeatureNames[i] == '':
                tf.tm.error('No feature name associated with section level {} = {}'.format(i+1, sections[i]))
                good = False
            if sectionTypes[i] == '':
                tf.tm.error('No node type associated with section level {} = {}'.format(i+1, sections[i]))
                good = False

        tf.loadExtra(sectionFeatureNames)
        if not good or not tf.good:
            tf.tm.error('Failed to load the Text API')
            return

        sectionFeatures = tuple(tf.features[sectionFeatureNames[i]] for i in range(len(sections)))

        for (fName, fObj) in [('', sectionFeatures[0])] + sorted(f for f in tf.features.items() if f[0].startswith(
            '{}@'.format(sectionFeatureNames[0])
        )):
            if fName != '': fObj.load(silent=True)
            meta = fObj.metaData
            code = meta.get('languageCode', '')
            self.languages[code] = dict(((k, meta.get(k, 'default')) for k in ('language', 'languageEnglish')))
            self.nameFromNode[code] = fObj.data
            self.nodeFromName[code] = dict(((name, node) for (node, name) in fObj.data.items()))

        self.sectionTypes = sectionTypes
        self.sectionFeatureNames = sectionFeatureNames
        self.sectionFeatures = sectionFeatures
        setattr(self, '{}Name'.format(sections[0]), self._sec0Name)
        setattr(self, '{}Node'.format(sections[0]), self._sec0Node)

    def _sec0Name(self, n, lang='en'):
        stp = self.sectionTypes[0]
        return self.nameFromNode['' if lang not in self.languages else lang].get(
            n if self.api.F.otype.v(n) == stp else self.api.L.u(n, stp)[0], 'not a {} node'.format(stp),
        )

    def _sec0Node(self, name, lang='en'):
        return self.nodeFromName['' if lang not in self.languages else lang].get(name, None)

    def sectionFromNode(self, n, lastSlot=True, lang='en'):
        F = self.api.F
        Fs = self.api.Fs
        L = self.api.L
        slotType = F.otype.slotType
        nType = F.otype.v(n)
        r = L.d(n, slotType)[-1] if lastSlot and nType != slotType else L.d(n, slotType)[0] if nType != slotType else n
        n0 = L.u(r, self.sectionTypes[0])[0]
        n1 = L.u(r, self.sectionTypes[1])[0]
        n2 = L.u(r, self.sectionTypes[2])[0]
        return (
            self._sec0Name(n0, lang=lang),
            self.sectionFeatures[1].data.get(n1, None),
            self.sectionFeatures[2].data.get(n2, None),
        )

back to top