diff -r 30ba63d28b1b python/src/html5lib/filters/validator.py
--- a/python/src/html5lib/filters/validator.py Fri Jul 03 17:47:34 2009 +0300
+++ b/python/src/html5lib/filters/validator.py Sun Jul 05 21:10:06 2009 +0200
@@ -18,6 +18,7 @@
# Import from the sets module for python 2.3
from sets import Set as set
from sets import ImmutableSet as frozenset
+import re
import _base
import iso639codes
import rfc3987
@@ -265,19 +266,45 @@
self.thingsThatDefineAnID = []
self.thingsThatPointToAnID = []
self.IDsWeHaveKnownAndLoved = []
+ self.validate_type = {}
+ self.validate_type_name = {}
+ r = re.compile("^validate([A-Z][^A-Z]+)([A-Z][^A-Z]+)?$")
+ for name in dir(self):
+ m = r.match(name)
+ if not m: continue
+ method = getattr(self, name)
+ if m.group(2):
+ d = self.validate_type_name.setdefault(m.group(1), {})
+ d[m.group(2)] = method
+ else:
+ self.validate_type[m.group(1)] = method
def __iter__(self):
- types = dict((v,k) for k,v in tokenTypes.iteritems())
for token in _base.Filter.__iter__(self):
- fakeToken = {"type": types.get(token.get("type", "-"), "-"),
- "name": token.get("name", "-").capitalize()}
- method = getattr(self, "validate%(type)s%(name)s" % fakeToken, None)
+ t = token.get("type", "-")
+ n = token.get("name", "-")
+ try:
+ # try original name spelling
+ method = self.validate_type_name[t][n]
+ except KeyError:
+ # try capitalization
+ cn = n.capitalize()
+ try:
+ method = self.validate_type_name[t][cn]
+ # also cache original spelling
+ self.validate_type_name[t][n] = method
+ except KeyError:
+ # No name-specific validateion, try type-specific one
+ try:
+ method = self.validate_type[t]
+ # cache as name-specific as well
+ self.validate_type_name[t][cn] = method
+ self.validate_type_name[t][n] = method
+ except KeyError:
+ # no validation available
+ method = None
if method:
for t in method(token) or []: yield t
- else:
- method = getattr(self, "validate%(type)s" % fakeToken, None)
- if method:
- for t in method(token) or []: yield t
yield token
for t in self.eof() or []: yield t