Source code for penman.surface

# -*- coding: utf-8 -*-

"""
Surface strings, tokens, and alignments.
"""

from typing import Type, Mapping, Tuple

from penman.types import BasicTriple
from penman.graph import Graph
from penman.epigraph import Epidatum
# from penman.exceptions import SurfaceError  # currently unused?


[docs]class AlignmentMarker(Epidatum): __slots__ = 'indices', 'prefix', def __init__(self, indices: Tuple[int, ...], prefix: str = None): super().__init__() self.indices = indices self.prefix = prefix def __repr__(self): args = repr(self.indices) if self.prefix: args += ', prefix={}'.format(repr(self.prefix)) return '{}({})'.format(type(self).__name__, args) def __str__(self): return '~{}{}'.format(self.prefix or '', ','.join(map(str, self.indices))) def __eq__(self, other): if not isinstance(other, AlignmentMarker): return False return (self.prefix == other.prefix and self.indices == other.indices)
[docs]class Alignment(AlignmentMarker): __slots__ = () mode = 2
[docs]class RoleAlignment(AlignmentMarker): __slots__ = () mode = 1
_Alignments = Mapping[BasicTriple, AlignmentMarker]
[docs]def alignments(g: Graph) -> _Alignments: """ Return a mapping of triples to alignments in graph *g*. Args: g: a :class:`Graph` containing alignment data Returns: A :class:`dict` mapping :class:`Triple` objects to their corresponding :class:`Alignment` objects, if any. """ return _get_alignments(g, Alignment)
[docs]def role_alignments(g: Graph) -> _Alignments: """ Return a mapping of triples to role alignments in graph *g*. Args: g: a :class:`Graph` containing role alignment data Returns: A :class:`dict` mapping :class:`Triple` objects to their corresponding :class:`RoleAlignment` objects, if any. """ return _get_alignments(g, RoleAlignment)
def _get_alignments(g: Graph, alignment_type: Type[AlignmentMarker]) -> _Alignments: alns = {} triple = None for triple, epidata in g.epidata.items(): for epidatum in epidata: if isinstance(epidatum, alignment_type): alns[triple] = epidatum return alns