Properly generates sort_name.
authorStéphane Jacob <sj@m4x.org>
Mon, 21 Nov 2011 10:52:01 +0000 (11:52 +0100)
committerStéphane Jacob <sj@m4x.org>
Mon, 28 Nov 2011 14:05:30 +0000 (15:05 +0100)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
include/name.func.inc.php

index 7dd3687..39b2bfe 100644 (file)
@@ -71,7 +71,7 @@ function build_display_names(array $public_names, array $private_names, $isFemal
     $display_names['private_name']   = $display_names['public_name'] . $private_last_name_end;
     $display_names['directory_name'] = build_directory_name($firstname, $full_last_name);
     $display_names['short_name']     = build_full_name($firstname, $short_last_name);
-    $display_names['sort_name']      = $short_last_name . ' ' . $firstname;
+    $display_names['sort_name']      = build_sort_name($firstname, $short_last_name);
 
     return $display_names;
 }
@@ -143,6 +143,22 @@ function build_full_name($firstname, $lastname)
     return $firstname . ' ' . $lastname;
 }
 
+// Returns the name on which the sort is performed, according to French
+// typographic rules.
+function build_sort_name($firstname, $lastname)
+{
+    // Remove uncapitalized particles.
+    $particles = "/^(d'|(" . implode($particles, '|') . ') )/';
+    $name = preg_replace($particles, '', $lastname);
+    // Mac must also be uniformized.
+    $lastname = preg_replace("/^(Mac|Mc)(| )/", 'Mac', $name);
+
+    if ($firstname == '') {
+        return $lastname;
+    }
+    return $lastname . ' ' . $firstname;
+}
+
 /** Splits a name into tokens, as used in search_name.
  * Used for search_name rebuilding and for queries.
  */