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]
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