67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
VOWELS: list = [
|
|
"a",
|
|
"A",
|
|
"e",
|
|
"E",
|
|
"i",
|
|
"I",
|
|
"o",
|
|
"O",
|
|
"u",
|
|
"U",
|
|
]
|
|
# commenting out this list since its not being used
|
|
# CONSONANTS: list = [
|
|
# letter for letter in range(ord("A"), ord("Z") + 1) if letter not in VOWELS
|
|
# ]
|
|
|
|
XR_YT: tuple = (
|
|
"xr",
|
|
"Xr",
|
|
"XR",
|
|
"xR",
|
|
"yt",
|
|
"Yt",
|
|
"YT",
|
|
"yT",
|
|
)
|
|
|
|
# NOTE: this could be easier if used with match pattern (re module) but for
|
|
# now lets leave this way. can be used later for refactoring
|
|
|
|
|
|
def translate(text):
|
|
# list with words translated
|
|
pig_latin_text: list = []
|
|
for word in text.split():
|
|
# rule one - starts with vowel or xt/yt
|
|
if word.startswith(tuple(VOWELS)) or word.startswith(XR_YT):
|
|
pig_latin_text.append(word + "ay")
|
|
else:
|
|
# rules 2, 3 and 4 starts with consonant, so lets treat them here
|
|
consonants_at_start: str = "" # string with grabbed consonants
|
|
for index, letter in enumerate(word):
|
|
# letter is not a vowel, lets find if rules 3 or 4 applies
|
|
if letter not in VOWELS:
|
|
# check rule 4
|
|
if letter == "y" and index != 0:
|
|
pig_latin_text.append(word[index:] + word[:index] + "ay")
|
|
break
|
|
# special case of rule 3, when word starts with 'qu'
|
|
if word.startswith("qu"):
|
|
pig_latin_text.append(word[2:] + word[:2] + "ay")
|
|
break
|
|
# general case of rule 3, where 'qu' its precessed with only consonants
|
|
if word[index + 1 : index + 3] == "qu":
|
|
pig_latin_text.append(
|
|
word[index + 3 :] + word[: index + 3] + "ay"
|
|
)
|
|
break
|
|
consonants_at_start += letter
|
|
else:
|
|
# letter is a vowel, so lets apply rule 2
|
|
pig_latin_text.append(word[index:] + consonants_at_start + "ay")
|
|
break
|
|
|
|
return " ".join(pig_latin_text)
|