commit 9a2696bfebf5df2b3afb376435ff12bc4efb127d
parent 5d9e2db6598a5b2dace0dc57d563def00764e14d
Author: Antoine Amarilli <a3nm@a3nm.net>
Date: Fri, 27 Apr 2012 19:23:06 +0200
check that all characters are known
Diffstat:
4 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/TODO b/TODO
@@ -1,5 +1,3 @@
-standalone numbers
-
check that there are no more repetitions of the same word for a rhyme than there
are different functions for it
diff --git a/common.py b/common.py
@@ -6,6 +6,7 @@ import re
vowels = 'aeiouyϾ'
consonants = "bcçdfghjklmnpqrstvwxz"
+legal = vowels + consonants + ' -'
# a variant of x-sampa such that all french phonemes are one-character
SUBSTS = [
diff --git a/error.py b/error.py
@@ -34,6 +34,14 @@ class Error:
l.append(self.say(x))
return '\n'.join(l)
+class ErrorBadCharacters(Error):
+ def __init__(self, characters):
+ self.characters = characters
+
+ def report(self):
+ return Error.report(self, "Illegal character: %s"
+ % ', '.join(["'" + a + "'" for a in self.characters]))
+
class ErrorBadRhyme(Error):
def __init__(self, expected, inferred):
Error.__init__(self)
diff --git a/template.py b/template.py
@@ -3,7 +3,7 @@ from metric import parse
from hemistiches import check_hemistiches
import copy
import rhyme
-from common import normalize
+from common import normalize, legal, strip_accents_one
class Pattern:
def __init__(self, metric, myid, femid, constraint):
@@ -63,6 +63,8 @@ class Template:
def match(self, line):
"""Check a line against current pattern, return errors"""
+
+ line = normalize(line)
pattern = self.get()
# compute alignments, check hemistiches, sort by score
possible = parse(line, pattern.length + 2)
@@ -73,6 +75,14 @@ class Template:
errors = []
+ # check characters
+ illegal = set()
+ for x in line:
+ if not strip_accents_one(x)[0] in legal:
+ illegal.add(x)
+ if len(illegal) > 0:
+ errors.append(error.ErrorBadCharacters(illegal))
+
# check metric
if len(possible) == 0 or possible[0][0] != 0:
errors.append(error.ErrorBadMetric(possible))
@@ -85,13 +95,12 @@ class Template:
# rhymes
if pattern.myid not in self.env.keys():
# initialize the rhyme
- self.env[pattern.myid] = rhyme.Rhyme(normalize(line),
- pattern.constraint)
+ self.env[pattern.myid] = rhyme.Rhyme(line, pattern.constraint)
else:
# update the rhyme
old_p = self.env[pattern.myid].phon
old_e = self.env[pattern.myid].eye
- self.env[pattern.myid].feed(normalize(line), pattern.constraint)
+ self.env[pattern.myid].feed(line, pattern.constraint)
# no more possible rhymes, something went wrong
if not self.env[pattern.myid].satisfied():
self.env[pattern.myid].phon = old_p