def midword_syllable_starts_without_onset(sy): onset = sy.elems[0] if is_vowel(onset): return False if not sy.starts_midword: return False return not onset.is_onset
def __init__(self, syllable, is_stressed=Unknown): self.base_syllable = syllable self.elems = [ make_long(elem) if is_vowel(elem) and syllable.is_open else elem for elem in syllable.elems ] self.is_stressed = is_stressed
def _make_str(self, f, tie, accent_f): result = '' prev_elem = None for elem in self.elems: if prev_elem is not None and elem.is_at_start_of_word: result += tie if self.is_stressed is True and is_vowel(elem): result += accent_f(f(elem)) else: result += f(elem) prev_elem = elem return result
def score_by_onsets_and_codas(self): score = 0 for sy in self.syllables: if is_vowel(sy.elems[0]): score += 1 elif is_onset(sy.elems[0]): score += 1 if len(sy.elems) == 1: continue if is_consonant(sy.elems[-1]): if is_midword_coda(sy.elems[-1]): score += 1 return score
def next_chunk(letters): result = [] while len(letters): letter = letters[0] if not is_consonant(letter): if len(result): return result, letters else: return [letter], letters[1:] else: result.append(letter) letters = letters[1:] return result, letters CC = TestVar('CC', lambda x: isinstance(x, ConsonantCluster)) V = TestVar('V', lambda x: is_vowel(x)) CC_at_start_of_word = TestVar('CC_at_start_of_word', lambda x: isinstance(x, ConsonantCluster) and x.is_at_start_of_word ) CC_at_end_of_word = TestVar('CC_at_end_of_word', lambda x: isinstance(x, ConsonantCluster) and x.is_at_end_of_word ) NONONSET_at_end_of_word = TestVar('NONONSET_at_end_of_word', lambda x: ( isinstance(x, ConsonantCluster) and x.is_at_end_of_word and x.text not in onsets ) )
def is_open(self): for i in range(len(self.elems)): if is_vowel(self.elems[i]): break return i + 1 >= len(self.elems)
class Weight: def __init__(self, name): self.name = name def __repr__(self): return self.name Heavy = Weight('Heavy') Light = Weight('Light') HeavyOrLight = Weight('HeavyOrLight') CC1 = TestVar('CC1', lambda x: isinstance(x, ConsonantCluster)) CC2 = TestVar('CC2', lambda x: isinstance(x, ConsonantCluster)) V1 = TestVar('V1', lambda x: is_vowel(x)) V2 = TestVar('V2', lambda x: is_vowel(x)) parse_syllables = CombinatoricMap(ignore_matched_input, (Var('SYLLABLE', Target(Optional(CC1), V1, Optional(CC2, NotFollowedBy(V2)))), ReplaceWith([Make(Syllable, Var('SYLLABLE'))])) ) def midword_syllable_starts_without_onset(sy): onset = sy.elems[0] if is_vowel(onset): return False if not sy.starts_midword: return False return not onset.is_onset