https://github.com/annotation/text-fabric
Tip revision: 70a184b40d7c2bab9ab5736214dbb314df1fc073 authored by Dirk Roorda on 14 November 2018, 15:48:32 UTC
major update - sharing data
major update - sharing data
Tip revision: 70a184b
text.py
from .data import WARP
from .helpers import itemize, compileFormats
DEFAULT_FORMAT = 'text-orig-full'
DEFAULT_FORMAT_TYPE = '{}-default'
class Text(object):
def __init__(self, api):
self.api = api
self.languages = {}
self.nameFromNode = {}
self.nodeFromName = {}
config = api.TF.features[WARP[2]].metaData if WARP[2] in api.TF.features else {}
self.sectionTypes = itemize(config.get('sectionTypes', ''), ',')
sectionFeats = itemize(config.get('sectionFeatures', ''), ',')
self.sectionFeatures = []
self.sectionFeatureTypes = []
self.config = config
self.defaultFormat = DEFAULT_FORMAT
good = True
if len(sectionFeats) != 0 and len(self.sectionTypes) != 0:
for (fName, fObj) in sorted(
f for f in api.TF.features.items()
if f[0] == sectionFeats[0] or f[0].startswith('{}@'.format(sectionFeats[0]))
):
if not fObj.load(silent=True):
good = False
continue
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()))
for fName in (sectionFeats):
if not api.TF.features[fName].load(silent=True):
good = False
continue
sectionFeature = api.TF.features[fName]
self.sectionFeatures.append(sectionFeature.data)
self.sectionFeatureTypes.append(sectionFeature.dataType)
sec0 = self.sectionTypes[0]
setattr(self, '{}Name'.format(sec0), self._sec0Name)
setattr(self, '{}Node'.format(sec0), self._sec0Node)
self._xformats = compileFormats(api.TF._cformats, api.TF.features)
self.formats = set(self._xformats.keys())
self.good = good
def _sec0Name(self, n, lang='en'):
sec0T = self.sectionTypes[0]
return self.nameFromNode['' if lang not in self.languages else lang].get(
n if self.api.F.otype.v(n) == sec0T else self.api.L.u(n, sec0T)[0],
'not a {} node'.format(sec0T),
)
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=False, lang='en'):
sTypes = self.sectionTypes
if len(sTypes) == 0:
return ()
sFs = self.sectionFeatures
F = self.api.F
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
n0s = L.u(r, sTypes[0])
n0 = n0s[0] if n0s else None
n1s = L.u(r, sTypes[1])
n1 = n1s[0] if n1s else None
n2s = L.u(r, sTypes[2])
n2 = n2s[0] if n2s else None
return (
self._sec0Name(n0, lang=lang),
sFs[1].get(n1, None),
sFs[2].get(n2, None),
)
def nodeFromSection(self, section, lang='en'):
sTypes = self.sectionTypes
if len(sTypes) == 0:
return None
(sec1, sec2) = self.api.C.sections.data
sec0node = self._sec0Node(section[0], lang=lang)
if len(section) == 1:
return sec0node
elif len(section) == 2:
return sec1.get(sec0node, {}).get(section[1], None)
else:
return sec2.get(sec0node, {}).get(section[1], {}).get(section[2], None)
def text(self, nodes, fmt=None, descend=False):
F = self.api.F
L = self.api.L
slotType = F.otype.slotType
if type(nodes) is int:
nType = F.otype.v(nodes)
if fmt is None:
fmt = DEFAULT_FORMAT_TYPE.format(nType)
repf = self._xformats.get(fmt, None)
if repf is None or descend:
if repf is None:
fmt = DEFAULT_FORMAT
nodes = [nodes] if nType == slotType else L.d(nodes, otype=slotType)
else:
return repf(nodes)
else:
if fmt is None:
fmt = DEFAULT_FORMAT
repf = self._xformats.get(fmt, None)
if repf is None:
return ' '.join(f'{F.otype.v(n)}_{n}' for n in nodes)
return ''.join(repf(n) for n in nodes)
'''
else:
if fmt is None:
fmt = DEFAULT_FORMAT
repf = self._xformats.get(fmt, None)
if repf is None:
return ' '.join(str(s) for s in slots)
return ''.join(repf(s) for s in slots)
'''