Cleanup in preparation for release. Add docstrings, remove basically empty _constants...
[python-collate.git] / collate / _abcollator.py
index bc43dc3..622766d 100644 (file)
@@ -1,24 +1,57 @@
-import collate._strings
+"""Abstract base collator."""
+
+import collate.strings
 
 class Collator(object):
+    """Abstract base class for Collators.
+
+    Attributes:
+    locale - the collator follows rules for this locale
+    encoding - assumed string encoding
+    """
+
+    locale = "C"
+    encoding = "ascii"
+
+    def __init__(self, locale=None, encoding=None):
+        pass
+
     def cmp(self, string1, string2):
         """Return negative if a < b, zero if a == b, positive if a > b."""
         return cmp(self.key(string1), self.key(string2))
 
+    def key(self, string):
+        """Return a good sorting key for the string.
+        
+        The sort key should be considered an opaque value which is
+        only meaningful when compared to other sort keys from the same
+        collator.
+        """
+        if isinstance(string, str):
+            string = string.decode(self.encoding, 'replace')
+        return string
+
     def words(self, string):
-        """Split the string into separate words.
+        """Split the string along word boundries."""
+        if isinstance(string, str):
+            string = string.decode(self.encoding, 'replace')
+        return string.split()
+
+    def sortemekey(self, string):
+        """Return a key based on sortemes of a string.
 
-        This split is done using Unicode's definition of whitespace.
+        A sorteme, by analogy with grapheme/morpheme/etc. is an atom
+        of sort information. This is larger than a word boundry but
+        smaller than a sentence boundry; roughly, a sorteme boundry
+        occurs between letters and numbers, between numbers and
+        numbers if 'too much' punctuation exists in between, between
+        lines.
         """
-        return string.split()
+        if isinstance(string, str):
+            string = string.decode(self.encoding, 'replace')
 
-    def sortemes(self, string):
-        words = []
-        for word in self.words(string):
-            words.extend(collate._strings.alnumsplit(word))
-        return filter(collate._strings.wordlike, words)
+        # Shove the sortkeyed original string on the end to resolve
+        # ties intelligently.
+        return (collate.strings.sortemes(string, self.key),
+                self.key(string))
 
-    def sortemekey(self, string):
-        words = map(collate._strings.numeric, self.sortemes(string))
-        words = [(i, self.key(word)) for (i, word) in words]
-        return words