from xml.etree.ElementTree import Element
from collections import Counter as Indexer
from typing import Union, List, Any, Tuple, Counter, Generator
from gemma import Compass, Item, Call
from ._xelm_bearing import XElm
[docs]class XCompass(Compass):
def __init__(self, elms: Union[bool, List[str]] = True):
super().__init__(target_types=(Element,), attrs=["text", "attrib"])
self._elms: Union[bool, List[str]] = elms
def item_iter(self, target: Any) -> Generator[Tuple[Item, Any], None, None]:
"""
Now Implemented. No :class:`Item` bearings returned.
"""
raise NotImplementedError
def call_iter(self, target: Any) -> Generator[Tuple[Call, Any], None, None]:
"""
Not Implemented. No :class:`Call` bearings returned.
"""
raise NotImplementedError
def elm_iter(self, target: Element) -> Generator[Tuple[XElm, Element], None, None]:
"""
Yields :class:`XElm` bearing for each element on ``target``
:param target:
:return:
"""
if self._elms is False:
return
elif isinstance(self._elms, list):
allowed_elms = self._elms
else:
allowed_elms = list()
node: Element
count: Counter[str] = Indexer()
for node in target:
name = node.tag
if allowed_elms and name not in allowed_elms:
continue
yield XElm((name, count[name])), node
count[name] += 1