def block_compact(element): import intermediate from modules import compact test = lambda x,y: isinstance(x, intermediate.Text) and isinstance(y, intermediate.Text) element.children = compact(element.children, test) def test(x,y): if not isinstance(x, intermediate.Special): return False if not isinstance(y, intermediate.Special): return False if x.modifiers.symmetric_difference(y.modifiers): return False return True element.children = compact(element.children, test) return element
def __add__(self, x): if not isinstance(x, Special): raise TypeError('Expected argument of type Special') from modules import compact self.children = self.children + x.children self.children = compact(self.children, lambda x,y: isinstance(x, Text) and isinstance(y, Text)) self.modifiers = list(set(x.modifiers).union(self.modifiers)) return self
def get_zombie_run(element, files): """ Get run text containers """ import intermediate from modules import compact #A run is a list of text elements, treat as such run = list() for child in element.childNodes: run.append(get_zombie(child, files)) run = compact(run, lambda x,y: isinstance(x, intermediate.Text) and isinstance(y, intermediate.Text)) return run
def get_zombie_specialrun(element, files): """ Special runs are set apart in some way from neighboring runs. """ import intermediate from modules import compact styles = get_styles(element) modifiers = get_modifiers(element) special = intermediate.Special() special.modifiers = modifiers.union(styles) for child in element.childNodes: child = get_zombie(child, files) special.append(child) special.children = compact(special.children, lambda x,y: isinstance(x, intermediate.Text) and isinstance(y, intermediate.Text)) return special