Switch to 4-space indentation

This commit is contained in:
Aaron 2020-12-21 20:14:32 +01:00
parent 94e1fdfbff
commit 5e07c6130f
No known key found for this signature in database
GPG Key ID: 17BE4B316645673C

View File

@ -2,130 +2,130 @@ import unicodedata
import string import string
def parse_fraction(x): def parse_fraction(x):
if len(x) == 1 and "fraction" in unicodedata.decomposition(x): if len(x) == 1 and "fraction" in unicodedata.decomposition(x):
frac_split = unicodedata.decomposition(x[-1:]).split() frac_split = unicodedata.decomposition(x[-1:]).split()
return float((frac_split[1]).replace("003", "")) / float((frac_split[3]).replace("003", "")) return float((frac_split[1]).replace("003", "")) / float((frac_split[3]).replace("003", ""))
else: else:
frac_split = x.split("/") frac_split = x.split("/")
if not len(frac_split) == 2: if not len(frac_split) == 2:
raise ValueError raise ValueError
try: try:
return int(frac_split[0]) / int(frac_split[1]) return int(frac_split[0]) / int(frac_split[1])
except ZeroDivisionError: except ZeroDivisionError:
raise ValueError raise ValueError
def parse_amount(x): def parse_amount(x):
amount = 0 amount = 0
unit = "" unit = ""
did_check_frac = False did_check_frac = False
end = 0 end = 0
while end < len(x) and (x[end] in string.digits or ((x[end] == "." or x[end] == ",") and end + 1 < len(x) and x[end+1] in string.digits)): while end < len(x) and (x[end] in string.digits or ((x[end] == "." or x[end] == ",") and end + 1 < len(x) and x[end+1] in string.digits)):
end += 1 end += 1
if end > 0: if end > 0:
amount = float(x[:end].replace(",", ".")) amount = float(x[:end].replace(",", "."))
else: else:
amount = parse_fraction(x[0]) amount = parse_fraction(x[0])
end += 1 end += 1
did_check_frac = True did_check_frac = True
if end < len(x): if end < len(x):
if did_check_frac: if did_check_frac:
unit = x[end:] unit = x[end:]
else: else:
try: try:
amount += parse_fraction(x[end]) amount += parse_fraction(x[end])
unit = x[end+1:] unit = x[end+1:]
except ValueError: except ValueError:
unit = x[end:] unit = x[end:]
return amount, unit return amount, unit
def parse_ingredient_with_comma(tokens): def parse_ingredient_with_comma(tokens):
ingredient = "" ingredient = ""
note = "" note = ""
start = 0 start = 0
# search for first occurence of an argument ending in a comma # search for first occurence of an argument ending in a comma
while start < len(tokens) and not tokens[start].endswith(","): while start < len(tokens) and not tokens[start].endswith(","):
start += 1 start += 1
if start == len(tokens): if start == len(tokens):
# no token ending in a comma found -> use everything as ingredient # no token ending in a comma found -> use everything as ingredient
ingredient = " ".join(tokens) ingredient = " ".join(tokens)
else: else:
ingredient = " ".join(tokens[:start+1])[:-1] ingredient = " ".join(tokens[:start+1])[:-1]
note = " ".join(tokens[start+1:]) note = " ".join(tokens[start+1:])
return ingredient, note return ingredient, note
def parse_ingredient(tokens): def parse_ingredient(tokens):
ingredient = "" ingredient = ""
note = "" note = ""
if tokens[-1].endswith(")"): if tokens[-1].endswith(")"):
# last argument ends with closing bracket -> look for opening bracket # last argument ends with closing bracket -> look for opening bracket
start = len(tokens) - 1 start = len(tokens) - 1
while not tokens[start].startswith("(") and not start == 0: while not tokens[start].startswith("(") and not start == 0:
start -= 1 start -= 1
if start == 0: if start == 0:
# the whole list is wrapped in brackets -> assume it is an error (e.g. assumed first argument was the unit) # the whole list is wrapped in brackets -> assume it is an error (e.g. assumed first argument was the unit)
raise ValueError raise ValueError
elif start < 0: elif start < 0:
# no opening bracket anywhere -> just ignore the last bracket # no opening bracket anywhere -> just ignore the last bracket
ingredient, note = parse_ingredient_with_comma(tokens) ingredient, note = parse_ingredient_with_comma(tokens)
else: else:
# opening bracket found -> split in ingredient and note, remove brackets from note # opening bracket found -> split in ingredient and note, remove brackets from note
note = " ".join(tokens[start:])[1:-1] note = " ".join(tokens[start:])[1:-1]
ingredient = " ".join(tokens[:start]) ingredient = " ".join(tokens[:start])
else: else:
ingredient, note = parse_ingredient_with_comma(tokens) ingredient, note = parse_ingredient_with_comma(tokens)
return ingredient, note return ingredient, note
def parse(x): def parse(x):
# initialize default values # initialize default values
amount = 0 amount = 0
unit = "" unit = ""
ingredient = "" ingredient = ""
note = "" note = ""
tokens = x.split() tokens = x.split()
if len(tokens) == 1: if len(tokens) == 1:
# there only is one argument, that must be the ingredient # there only is one argument, that must be the ingredient
ingredient = tokens[0] ingredient = tokens[0]
else: else:
try: try:
# try to parse first argument as amount # try to parse first argument as amount
amount, unit = parse_amount(tokens[0]) amount, unit = parse_amount(tokens[0])
# only try to parse second argument as amount if there are at least three arguments # only try to parse second argument as amount if there are at least three arguments
# if it already has a unit there can't be a fraction for the amount # if it already has a unit there can't be a fraction for the amount
if len(tokens) > 2: if len(tokens) > 2:
try: try:
if not unit == "": if not unit == "":
# a unit is already found, no need to try the second argument for a fraction # a unit is already found, no need to try the second argument for a fraction
# probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except # probably not the best method to do it, but I didn't want to make an if check and paste the exact same thing in the else as already is in the except
raise ValueError raise ValueError
# try to parse second argument as amount and add that, in case of "2 1/2" or "2 ½" # try to parse second argument as amount and add that, in case of "2 1/2" or "2 ½"
amount += parse_fraction(tokens[1]) amount += parse_fraction(tokens[1])
# assume that units can't end with a comma # assume that units can't end with a comma
if len(tokens) > 3 and not tokens[2].endswith(","): if len(tokens) > 3 and not tokens[2].endswith(","):
# try to use third argument as unit and everything else as ingredient, use everything as ingredient if it fails # try to use third argument as unit and everything else as ingredient, use everything as ingredient if it fails
try: try:
ingredient, note = parse_ingredient(tokens[3:]) ingredient, note = parse_ingredient(tokens[3:])
unit = tokens[2] unit = tokens[2]
except ValueError: except ValueError:
ingredient, note = parse_ingredient(tokens[2:]) ingredient, note = parse_ingredient(tokens[2:])
else: else:
ingredient, note = parse_ingredient(tokens[2:]) ingredient, note = parse_ingredient(tokens[2:])
except ValueError: except ValueError:
# assume that units can't end with a comma # assume that units can't end with a comma
if not tokens[1].endswith(","): if not tokens[1].endswith(","):
# try to use second argument as unit and everything else as ingredient, use everything as ingredient if it fails # try to use second argument as unit and everything else as ingredient, use everything as ingredient if it fails
try: try:
ingredient, note = parse_ingredient(tokens[2:]) ingredient, note = parse_ingredient(tokens[2:])
unit = tokens[1] unit = tokens[1]
except ValueError: except ValueError:
ingredient, note = parse_ingredient(tokens[1:]) ingredient, note = parse_ingredient(tokens[1:])
else: else:
ingredient, note = parse_ingredient(tokens[1:]) ingredient, note = parse_ingredient(tokens[1:])
else: else:
# only two arguments, first one is the amount which means this is the ingredient # only two arguments, first one is the amount which means this is the ingredient
ingredient = tokens[1] ingredient = tokens[1]
except ValueError: except ValueError:
# can't parse first argument as amount -> no unit -> parse everything as ingredient # can't parse first argument as amount -> no unit -> parse everything as ingredient
ingredient, note = parse_ingredient(tokens) ingredient, note = parse_ingredient(tokens)
return amount, unit.strip(), ingredient.strip(), note.strip() return amount, unit.strip(), ingredient.strip(), note.strip()