def compute_para_ops_replace_phrase(phrase):
    """ Returns the required para operations for given substitute phrase. """

    sm = Counter()
    break_before = is_break_before_actual(phrase=phrase)
    break_after = is_break_after_actual(phrase=phrase)
    sm["num_para_splits"] += (not break_before)
    sm["num_para_splits"] += (not break_after)
    sm["num_para_merges"] += (not break_before and not break_after)
    phrase.num_para_ops_split_merge = sm

    phrase.num_para_ops = Counter({
        "num_para_deletes": 1,
        "num_para_inserts": 1
    })
    phrase.num_para_ops_abs = Counter({
        "num_para_deletes": len(phrase.words_actual),
        "num_para_inserts": len(phrase.words_target)
    })

    # Compute visualization.
    sm_str = "(#S:%s,#M:%s)" % (sm["num_para_splits"], sm["num_para_merges"])
    sm_vis = vis.gray(sm_str)
    vis2_str = "%s%s" % (get_text(phrase.words_actual).strip(), sm_vis)
    vis2_str += phrase.last_word_actual.whitespaces

    vis1_str = get_text(phrase.words_target).strip()
    vis1_str += phrase.last_word_target.whitespaces

    phrase.vis_para_ops = vis.red_bg(vis2_str) + vis.green_bg(vis1_str)

    return break_before and break_after
def compute_para_ops_rearrange_phrase(phrase):
    """ Returns the required para operations for given insert phrase. """

    sm = phrase.num_para_ops_split_merge = Counter()

    # break_before = is_break_before(phrase.first_word_target)
    # break_after = is_break_after(phrase.last_word_target)
    # sm["num_para_splits"] += (not break_before and not break_after)
    # sm["num_para_merges"] += (not break_before)
    # sm["num_para_merges"] += (not break_after)

    break_before = is_break_before_actual(phrase=phrase)
    break_after = is_break_after_actual(phrase=phrase)
    sm["num_para_splits"] += (not break_before)
    sm["num_para_splits"] += (not break_after)
    sm["num_para_merges"] += (not break_before and not break_after)

    sub_num_ops = phrase.sub_diff_result.num_ops
    phrase.num_para_ops = sub_num_ops + Counter({
        "num_para_rearranges": 1
    })
    phrase.num_para_ops_abs = Counter({
        "num_para_rearranges": len(phrase.words_actual)
    })

    # Create visualization.
    sm_str = "(#S:%s,#M:%s)" % (sm["num_para_splits"], sm["num_para_merges"])
    sm_vis = vis.gray(sm_str)
    vis_str = "%s%s" % (phrase.sub_diff_result.vis, sm_vis)
    phrase.vis_para_ops = vis.blue_bg(vis_str)

    return break_before and break_after
def compute_word_ops_replace_phrase(phrase):
    """ Returns the required word operations for given substitute phrase. """

    num_words_target = len(phrase.words_target)

    phrase.num_word_ops = Counter({
        "num_word_replaces": num_words_target
    })
    phrase.num_word_ops_abs = Counter(phrase.num_word_ops)

    vis_word_ops = []
    vis_word_ops.append(vis.gray("["))
    vis_word_ops.append(vis.red(get_text(phrase.words_actual).strip()))
    vis_word_ops.append(vis.gray("/"))
    vis_word_ops.append(vis.green(get_text(phrase.words_target).strip()))
    vis_word_ops.append(vis.gray("]"))
    vis_word_ops.append(phrase.last_word_target.whitespaces)
    phrase.vis_word_ops = "".join(vis_word_ops)
def compute_word_ops_ignore_phrase(phrase):
    phrase.num_word_ops = Counter()
    phrase.num_word_ops_abs = Counter()
    phrase.vis_word_ops = vis.gray(get_text(phrase.words_target))