Valider 763b2370 rédigé par Fil's avatar Fil
Parcourir les fichiers

* indexer les OGM (ce n'est pas une option)

* translitterer le vietnamien complexe SI LA LANGUE DU SITE EST 'vi'

* indexer le vietnamien en codant les accents par des chiffres (hie65n)

* recherche vietnamien avec hien, hie^.n, hie65n ou la version
  composée du même mot
parent cdaae506
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+34 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -10,12 +10,15 @@ define("_ECRIRE_INC_CHARSETS", "1");
	iso-8859-1 ; utf-8 ;
	windows-1251  = CP1251 ;
*/
function load_charset ($charset = 'AUTO') {
function load_charset ($charset = 'AUTO', $langue_site = 'AUTO') {
	if ($charset == 'AUTO')
		$charset = lire_meta('charset');
	if (is_array($GLOBALS['CHARSET'][$charset]))
		return $charset;

	if ($langue_site == 'AUTO')
		$langue_site = lire_meta('langue_site');

	switch($charset) {
		case 'utf-8':
			$GLOBALS['CHARSET'][$charset] = array();
@@ -171,6 +174,33 @@ function load_charset ($charset = 'AUTO') {
			1096=>'sh', 1097=>'sch',  1098=>'"', 1099=>'y', 1100=>'\'', 1101=>'`e',
			1102=>'yu', 1103=>'ya'
			);

			// translitteration specifique du vietnamien
			// (necessaire pour le moteur de recherche car les mots sont tous tres courts)
			if ($langue_site == 'vi') {
				$translit_vi = array (225=>"a'", 224=>"a`",7843=>"a?",227=>"a~",7841=>"a.",
				226=>"a^",7845=>"a^'",7847=>"a^`",7849=>"a^?",7851=>"a^~",7853=>"a^.",259=>"a(",
				7855=>"a('",7857=>"a(`",7859=>"a(?",7861=>"a(~",7863=>"a(.",193=>"A'",192=>"A`",
				7842=>"A?",195=>"A~",7840=>"A.",194=>"A^",7844=>"A^'",7846=>"A^`",7848=>"A^?",
				7850=>"A^~",7852=>"A^.",258=>"A(",7854=>"A('",7856=>"A(`",7858=>"A(?",7860=>"A(~",
				7862=>"A(.",233=>"e'",232=>"e`",7867=>"e?",7869=>"e~",7865=>"e.",234=>"e^",
				7871=>"e^'",7873=>"e^`",7875=>"e^?",7877=>"e^~",7879=>"e^.",201=>"E'",200=>"E`",
				7866=>"E?",7868=>"E~",7864=>"E.",202=>"E^",7870=>"E^'",7872=>"E^`",7874=>"E^?",
				7876=>"E^~",7878=>"E^.",237=>"i'",236=>"i`",7881=>"i?",297=>"i~",7883=>"i.",
				205=>"I'",204=>"I`",7880=>"I?",296=>"I~",7882=>"I.",243=>"o'",242=>"o`",
				7887=>"o?",245=>"o~",7885=>"o.",244=>"o^",7889=>"o^'",7891=>"o^`",7893=>"o^?",
				7895=>"o^~",7897=>"o^.",417=>"o+",7899=>"o+'",7901=>"o+`",7903=>"o+?",7905=>"o+~",
				7907=>"o+.",211=>"O'",210=>"O`",7886=>"O?",213=>"O~",7884=>"O.",212=>"O^",
				7888=>"O^'",7890=>"O^`",7892=>"O^?",7894=>"O^~",7896=>"O^.",416=>"O+",7898=>"O+'",
				7900=>"O+`",7902=>"O+?",7904=>"O+~",7906=>"O+.",250=>"u'",249=>"u`",7911=>"u?",
				361=>"u~",7909=>"u.",432=>"u+",7913=>"u+'",7915=>"u+`",7917=>"u+?",7919=>"u+~",
				7921=>"u+.",218=>"U'",217=>"U`",7910=>"U?",360=>"U~",7908=>"U.",431=>"U+",
				7912=>"U+'",7914=>"U+`",7916=>"U+?",7918=>"U+~",7920=>"U+.",253=>"y'",7923=>"y`",
				7927=>"y?",7929=>"y~",7925=>"y.",221=>"Y'",7922=>"Y`",7926=>"Y?",7928=>"Y~",
				7924=>"Y.",273=>"d-",208=>"D-");
				while (list($u,$t) = each($translit_vi))
					$GLOBALS['CHARSET'][$charset][$u] = $t;
			}
			return $charset;

		default:
@@ -378,16 +408,16 @@ function translitteration ($texte, $charset='AUTO') {
	while (ereg('&#0*([0-9]+);', $texte, $regs) AND !$vu[$j = $regs[0]]) {
		$vu[$j] = true;
		if ($s = $GLOBALS['CHARSET'][$trans][$regs[1]])
			$texte = ereg_replace($j, $s, $texte);
			$texte = str_replace($j, $s, $texte);
		// on va tenter de trouver la translitteration ailleurs
		// - dans iconv par exemple
		else if ($GLOBALS['flag_iconv'] AND ($iconv = @iconv('UTF-8', 'ASCII//TRANSLIT', unicode_to_utf_8($j))) AND !ereg('^\?+$',$iconv)) {
			$GLOBALS['CHARSET']['translit'][$regs[1]] = $iconv;
			$texte = ereg_replace($j, $iconv, $texte);
			$texte = str_replace($j, $iconv, $texte);
			spip_debug("translitteration $j => '$iconv'");
		} // supprimer les caracteres inconnus
		else
			$texte = ereg_replace($j, '.', $texte);
			$texte = str_replace($j, '.', $texte);
	}
	return $texte;
}
+62 −19
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -5,15 +5,21 @@
if (defined("_ECRIRE_INC_INDEX")) return;
define("_ECRIRE_INC_INDEX", "1");

function nettoyer_chaine_indexation($texte) {
	include_ecrire("inc_charsets.php3");
	return eregi_replace("[^A-Z0-9_-]","",strtolower(translitteration($texte)));
}

function separateurs_indexation($requete=false) {
	// Merci a Herve Lefebvre pour son apport sur cette fonction
function separateurs_indexation() {
	return "].,`:*'\"?!\r\n\t\\/\~(){}[|@<>$%".
		chr(187).chr(171).chr(133).chr(145).chr(146).chr(180).chr(147).chr(148);
	$liste = "],:*\"!\r\n\t\\/){}[|@<>$%";

	// en vietnamien ne pas eliminer les accents de translitteration
	if (! (lire_meta('langue_site') == 'vi' AND $requete))
		$liste .= "'`?\~.^+(-";

	// windowzeries iso-8859-1
	$charset = lire_meta('charset');
	if ($charset == 'iso-8859-1')
		$liste .= chr(187).chr(171).chr(133).chr(145).chr(146).chr(180).chr(147).chr(148);

	return $liste;
}

function spip_split($reg, $texte) {
@@ -26,7 +32,6 @@ function spip_split($reg, $texte) {

function indexer_chaine($texte, $val = 1, $min_long = 3) {
	global $index, $mots;
	global $indexer_ogm;

	$texte = ' '.ereg_replace("<[^>]*>"," ",$texte).' ';	// supprimer_tags()
	$regs = separateurs_indexation();
@@ -36,7 +41,7 @@ function indexer_chaine($texte, $val = 1, $min_long = 3) {
	while (list(, $mot) = each($table)) {
		if ($mot2 = nettoyer_chaine_indexation($mot)) {
			if ((strlen($mot2) > $min_long)
			|| ($indexer_ogm && ereg("[A-Z][A-Z][A-Z]",$mot) && $mot2=strtolower($mot).'_'))
			|| (ereg("[A-Z][A-Z][A-Z]",$mot) && $mot2=strtolower($mot).'_')) // indexer les mots comme 'OGM', 'CGI'...
			{
				$h = substr(md5($mot2), 0, 16);
				$index[$h] += $val;
@@ -277,18 +282,56 @@ function requete_txt_integral($objet, $hash_recherche) {
		LIMIT 0,10";
}

// decode la chaine recherchee et la traduit en hash
function requete_hash ($rech) {
function nettoyer_chaine_indexation($texte) {
	include_ecrire("inc_charsets.php3");
	$texte = strtolower(translitteration($texte));

	if (lire_meta('langue_site') == 'vi')
		$texte = strtr($texte, "'`?~.^+(-","123456789");

	return eregi_replace("[^A-Z0-9_-]","",$texte);
}

// rechercher un mot dans le dico
function requete_dico ($val) {
	$min_long = 3;
	$s = nettoyer_chaine_indexation(urldecode($rech)); 
	$regs = separateurs_indexation()." "; 
	$s = split("[$regs]+", $s); 
	while (list(, $val) = each($s))

	// cas particulier translitteration vietnamien
	if (lire_meta('langue_site') == 'vi') {
		// 1. recuperer des accents passes sous la forme a`
		$val = strtr($val, "'`?~.^+(-","123456789");
		// 2. translitterer les accents passes en unicode
		$val = nettoyer_chaine_indexation($val);
		// 3. composer la regexp pour les caracteres accentuables mais non accentues
		while (ereg("([aeiouyd])([a-z])", $val.' ', $match))
			$val = str_replace ($match[0], $match[1].'[-1-9]?[-1-9]?'.$match[2], $val);
		return "dico REGEXP '^$val'";
	}

	// cas normal
	$val = nettoyer_chaine_indexation($val);
	if (strlen($val) > $min_long)
			$dico[] = "dico LIKE '$val%'"; 
		return "dico LIKE '$val%'"; 
	else if (strlen($val) == $min_long) {
		$dico[] = "dico = '".$val."_'";
	}
}


// decode la chaine recherchee et la traduit en hash
function requete_hash ($rech) {
	// recupere les mots de la recherche
	$regs = separateurs_indexation(true)." "; 
	$s = split("[$regs]+", supprimer_tags($rech)); 
	unset($dico);
	unset($h);

	// cherche les mots dans le dico
	while (list(, $val) = each($s))
		if ($rq = requete_dico ($val))
			$dico[] = $rq;

	// compose la recherche dans l'index
	if ($dico) {
		$query2 = "SELECT HEX(hash) AS hx FROM spip_index_dico WHERE ".join(" OR ", $dico);
		$result2 = spip_query($query2);
+0 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -105,9 +105,6 @@ $cookie_prefix = "spip";
// navigateur l'accepte (valable pour apache 1.3 seulement) ?
$auto_compress = true;

// faut-il indexer les mots de 3 lettres en capitales ('OGM') ?
$indexer_ogm = true;

// faut-il loger les infos de debug dans data/spip.log ?  (peu utilise)
$debug = false;

+4 −26
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1722,32 +1722,10 @@ function calculer_boucle($id_boucle, $prefix_boucle)
	if (strpos($boucle->requete, '$hash_recherche')) {
		$texte .= '
		global $recherche, $hash_recherche;
		if (!$hash_recherche) {
			$s = nettoyer_chaine_indexation(supprimer_tags(urldecode($recherche)));
			$regs = separateurs_indexation()." ";
			$s = split("[$regs]+", $s);

			unset($dico);
			unset($h);
			while (list(, $val) = each($s)) {
				if (strlen($val) > 3) {
					$dico[] = "dico LIKE \"$val%\"";
				} else if (strlen($val) == 3) {
					$dico[] = "dico = \"".$val."_\"";
				}
			}
			if ($dico) {
				// le hex est indispensable : apparemment bug de mysql
				// sur output decimal 64 bits (a cause du unsigned ?)
				$query2 = "SELECT HEX(hash) AS hx FROM spip_index_dico WHERE ".join(" OR ", $dico);
				$result2 = spip_query($query2);
				while ($row2 = spip_fetch_array($result2)) {
					$h[] = "0x".$row2["hx"];
				}
			}
			if ($h) $hash_recherche = join(",", $h);
			else $hash_recherche = "0";
		}
		if (!$hash_recherche)
			$hash_recherche = requete_hash($recherche);
		else
			$hash_recherche = "0";
		';
	}