コード例 #1
0
def double(token):
    """Convert a single token into multiple (two) parsers."""
    trait1 = Trait(start=token.start, end=token.end)
    token1 = Token(DOUBLE_CROSS, group=copy(token.group))
    token1.group["units"] = token.group.get("units_1")
    token1.group["value"] = token.group.get("value_1")
    side1 = token.group.get("side_1")

    trait2 = Trait(start=token.start, end=token.end)
    token2 = Token(DOUBLE_CROSS, group=copy(token.group))
    token2.group["units"] = token.group.get("units_2")
    token2.group["value"] = token.group.get("value_2")
    side2 = token.group.get("side_2")

    if token1.group["units"] and not token2.group["units"]:
        token2.group["units"] = token1.group["units"]
    elif token2.group["units"] and not token1.group["units"]:
        token1.group["units"] = token2.group["units"]

    flag1 = as_value(token1, trait1, value_field="value")
    flag2 = as_value(token2, trait2, value_field="value")
    if not flag1 or not flag2:
        return None

    side1 = side1.lower().strip(punctuation) if side1 else None
    side2 = side2.lower().strip(punctuation) if side2 else None
    side1 = SIDES.get(side2) if not side1 else side1
    side2 = SIDES.get(side1) if not side2 else side2

    if side1:
        trait1.side = side1
    if side2:
        trait2.side = side2

    return [trait1, trait2]
コード例 #2
0
def convert(token):
    """Convert parsed tokens into a result."""
    trait = Trait(start=token.start, end=token.end)

    if token.group.get("total"):
        trait.value = to_positive_int(token.group["total"])

    if token.group.get("subcount"):
        trait.value = sum(
            to_positive_int(c) for c in as_list(token.group["subcount"]))

    if token.group.get("subcount") and token.group.get("sub"):
        for count, sub in zip(as_list(token.group["subcount"]),
                              as_list(token.group.get("sub"))):
            count = "1" if count == "!" else count
            sub = SUB.get(sub[0].lower(), sub)
            setattr(trait, sub, to_positive_int(count))

    elif token.group.get("side"):
        side = token.group["side"].lower()
        trait.side = SUB.get(side, side)

    return trait if all(x < 1000 for x in as_list(trait.value)) else None