X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fmots.php;fp=www%2Fecrire%2Finc%2Fmots.php;h=e1571b09e38c5f58db192cacc29c7fbab3220106;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/inc/mots.php b/www/ecrire/inc/mots.php new file mode 100644 index 0000000..e1571b0 --- /dev/null +++ b/www/ecrire/inc/mots.php @@ -0,0 +1,138 @@ + 254 caracteres +// http://doc.spip.org/@levenshtein255 +function levenshtein255 ($a, $b) { + $a = substr($a, 0, 254); + $b = substr($b, 0, 254); + return @levenshtein($a,$b); +} + +// reduit un mot a sa valeur translitteree et en minuscules +// http://doc.spip.org/@reduire_mot +function reduire_mot($mot) { + return strtr( + translitteration(trim($mot)), + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'abcdefghijklmnopqrstuvwxyz' + ); +} + +// http://doc.spip.org/@mots_ressemblants +function mots_ressemblants($mot, $table_mots, $table_ids='') { + + $result = array(); + + if (!$table_mots) return $result; + + $lim = 2; + $nb = 0; + $opt = 1000000; + $mot_opt = ''; + $mot = reduire_mot($mot); + $len = strlen($mot); + + while (!$nb AND $lim < 10) { + reset($table_mots); + if ($table_ids) reset($table_ids); + while (list(, $val) = each($table_mots)) { + if ($table_ids) list(, $id) = each($table_ids); + else $id = $val; + $val2 = trim($val); + if ($val2) { + if (!isset($distance[$id])) { + $val2 = reduire_mot($val2); + $len2 = strlen($val2); + if ($val2 == $mot) + $m = -2; # resultat exact + else if (substr($val2, 0, $len) == $mot) + $m = -1; # sous-chaine + else { + # distance + $m = levenshtein255($val2, $mot); + # ne pas compter la distance due a la longueur + $m -= max(0, $len2 - $len); + } + $distance[$id] = $m; + } else $m = 0; + if ($m <= $lim) { + $selection[$id] = $m; + if ($m < $opt) { + $opt = $m; + $mot_opt = $val; + } + $nb++; + } + } + } + $lim += 2; + } + + if (!$nb) return $result; + reset($selection); + if ($opt > -1) { + $moy = 1; + while(list(, $val) = each($selection)) $moy *= $val; + if($moy) $moy = pow($moy, 1.0/$nb); + $lim = ($opt + $moy) / 2; + } + else $lim = -1; + + reset($selection); + while (list($key, $val) = each($selection)) { + if ($val <= $lim) { + $result[] = $key; + } + } + return $result; +} + + +/* + * Affiche la liste des mots-cles associes a l'objet specifie + * plus le formulaire d'ajout de mot-cle + */ + +// http://doc.spip.org/@affiche_mots_ressemblant +function affiche_mots_ressemblant($cherche_mot, $objet, $id_objet, $resultat, $table, $table_id, $url_base) +{ + $les_mots = sql_in('id_mot', $resultat); + $res = sql_allfetsel("*", "spip_mots", $les_mots, "", "titre", "17"); + + foreach ($res as $k => $row) { + $id_mot = $row['id_mot']; + $titre = $row['titre']; + $type = typo($row['type']); + $descriptif = $row['descriptif']; + + $res[$k]= ajax_action_auteur('editer_mots', "$id_objet,,$table,$table_id,$objet,$id_mot", $url_base, "$table_id=$id_objet", array(typo($titre),' title="' . _T('info_ajouter_mot') .'"'),"&id_objet=$id_objet&objet=$objet") . + (!$descriptif ? '' : ("\n(".supprimer_tags(couper(propre($descriptif), 100)).")
\n")); + + } + + $res2 = ($type + ? "$type : " + : '' ) + . _T('info_plusieurs_mots_trouves', array('cherche_mot' => $cherche_mot)) + ."
"; + + if (count($resultat) > 17) + $res2 .= "
" ._T('info_trop_resultat', array('cherche_mot' => $cherche_mot)) ."
\n"; + + return $res2 . ''; +} + +?>