Bonjour,

Il y a un problème avec Osmose qui m'embêtait depuis pas mal de temps, j'ai enfin pris mon clavier pour proposer une correction. :) Dans le test de toponymie, Osmose vérifie que les noms commencent par une majuscule. Pour cela une découpe est d'abord effectuée aux espaces, apostrophes et quelques autres caractères. Mais du coup les mots en breton comportant « c'h » (assez nombreux dans les toponymes) se retrouvent coupés au milieu, la seconde partie ne commence évidemment pas par une majuscule et une erreur est reportée.

Dans le patch je regarde si l'on est dans un cas où il ne faut pas découper et le cas échéant, l'apostrophe est remplacée (temporairement) par un caractère à usage privé d'Unicode (histoire qu'on soit sûr de ne pas causer de problèmes avec des caractères existants et légitimes), ce qui évite le découpage. En bonus, ça supprime le cas particulier de « prud'homme » qui était présent dans le code.

Je suis ouvert à toute suggestion si jamais le procédé ne convenait pas. :)

Thomas.

--- Name_Toponymie.py.orig      2011-03-27 15:01:50.000000000 +0200
+++ Name_Toponymie.py   2011-03-27 17:08:07.363333732 +0200
@@ -86,6 +86,29 @@
         self.special = set(special2)
         
         self.minus = u"abcdefghijklmnopqrstuvwxyzàäâéèëêïîöôüûÿ"
+        
+        # Les apostrophes sont replacées par des caractères à usage privé 
d'Unicode
+        aposSubst = {u"'" : u"\ue000", u"’" : u"\ue001", u"'" : 
u"\ue002"}
+        apos = [u"c'h", u"C'h", u"Prud'homme"]
+        
+        self.aposSubst = dict()
+        for x in apos:
+           for y in aposSubst.keys():
+               before = x.replace(u"'", y)
+               after  = x.replace(u"'", aposSubst[y])
+               self.aposSubst[before] = after
+           
+        self.aposUnSubst = {u"\ue000" : u"'", u"\ue001" : u"’", u"\ue002" : 
u"'"}
+    
+    def unapos(self, name):
+       for x in self.aposSubst.keys():
+           name = name.replace(x, self.aposSubst[x])
+       return name
+       
+    def reapos(self, name):
+       for x in self.aposUnSubst.keys():
+           name = name.replace(x, self.aposUnSubst[x]);
+       return name;
                             
     def _split(self, name):
         for x in [u"’", u"\xa0", u"°", u"'", u"&", u"'", 
u""", u"/", u")", u"-", u"\"", u";", u".", u":", u"+", u"?", u"!", u",", 
u"|", u"*", u"°", u"_", u"="]:
@@ -99,7 +122,10 @@
         if (u"highway" not in tags) and (u"waterway" not in tags) and 
(u"place" not in tags):
             return
         words = []
-        split = self._split(tags[u"name"])
+        unapos = self.unapos(tags[u"name"])
+        split = self._split(unapos)
+        for i in range(len(split)):
+           split[i] = self.reapos(split[i])
         if split and split[0] and split[0][0] in self.minus:
             words.append(split[0])
         for word in split:
@@ -107,8 +133,6 @@
                 continue
             if word[0] in self.minus:
                 words.append(word)
-        if words and (u"homme" in words) and ("Prud'homme" in tags[u"name"]):
-            words.remove(u"homme")
         if words:
             return [(906, abs(hash(str(words))), {"fr": u"majuscule manquante 
à : %s"%u", ".join(set(words)),"en": u"missing caps letter for: %s"%u", 
".join(set(words))})]
         return

_______________________________________________
dev-fr mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/dev-fr

Répondre à