util.py 1.79 KB
# -*- coding: utf-8 -*-

from dictionary.models import BaseFormLabel


def expand_tag(tag):
    if '+' in tag:
        tags = tag.split('+')
        expanded = []
        for tag in tags:
            expanded += expand_tag(tag)
        return expanded
    parts = tag.split(':')
    variants_list = []
    for part in parts:
        variants_list.append(part.split('.'))
        # return [':'.join(parts) for parts in expand_variants(variants_list)]
    return expand_variants(variants_list)


def expand_variants(variants_list):
    if not variants_list:
        return [()]
    expanded = []
    tails = expand_variants(variants_list[1:])
    for variant in variants_list[0]:
        expanded += [(variant,) + tail for tail in tails]
    return expanded


def compare_patterns(patterns):
    pattern0, root0 = patterns[0]
    bfl_pks0 = set(pattern0.endings.values_list('base_form_label', flat=True))
    differing_bfls = set()
    forms = dict((p, dict(
        (bfl, root + e)
        for bfl, e in p.endings.values_list('base_form_label', 'string')))
        for p, root in patterns)
    for pattern, root in patterns[1:]:
        bfl_pks = set(pattern.endings.values_list('base_form_label', flat=True))
        for pk in bfl_pks ^ bfl_pks0:  # różnica symetryczna
            differing_bfls.add(pk)
        for ending in pattern.endings.all():
            if ending.base_form_label.pk not in differing_bfls:
                if root + ending.string != forms[pattern0][
                        ending.base_form_label.pk]:
                    differing_bfls.add(ending.base_form_label.pk)
    differing_bfls = list(BaseFormLabel.objects.filter(pk__in=differing_bfls))
    diffs = dict((pattern, [
        (bfl, forms[pattern].get(bfl.pk))
        for bfl in differing_bfls])
        for pattern, root in patterns)
    return diffs