Initial commit

This commit is contained in:
2020-01-27 08:56:08 +01:00
commit b7525048d6
27129 changed files with 3409855 additions and 0 deletions

View File

@@ -0,0 +1,201 @@
PLUGIN DE RECHERCHE AVANCEE
---------------------------
Ce plugin permet une recherche dans vos produits, rubriques ou contenus. Les
mots saisis par votre client sont normalisés suivant l'algorithme Paice/Husk, ce
qui permet d'obtenir de meilleurs résultats de recherche:
Exemple: "rouges", "rouge", "rougeatre", "rougeaud" sont normalisés en "roug",
ce qui permet de remonter tous les produits en rapport au rouge.
Contact et support: Franck Allimant (thelia@allimant.org).
Version PHP du stemmer Paice/Husk par Alexis Ulrich (http://alx2002.free.fr).
MISE EN PLACE
-------------
Dans votre form de recherche, proposer les options supplémentaires de recherche:
<form action="#URLRECHERCHE" method="post" name="recherche" id="recherche">
<input name="motcle" type="text" value='Recherche' onclick="this.value='';" />
<p><button type="submit" class="bouton"><span><span>OK</span></span></button></p>
<input style="width: auto;" type="radio" name="recherche_mode" value="et" checked="checked"/>Tous les mots<br />
<input style="width: auto;" type="radio" name="recherche_mode" value="ou" />Au moins un des mots<br />
<input style="width: auto;" type="checkbox" name="recherche_exacte" value="1" />Rechercher exactement
</form>
Dans la page de recherche (recherche.html), utiliser la boucle de recherche de produit du plugin.
Pour ce faire, remplacer:
<THELIA_PROD type="PRODUIT" rubrique="#RUBRIQUE_ID" classement="inverse" motcle="#PRODUIT_MOTCLE" num="12">
par:
<THELIA_PROD type="recherche" mode="#RECHERCHE_MODE" exact="#RECHERCHE_EXACTE" boucle="produit" rubrique="#RUBRIQUE_ID" classement="inverse" motcle="#PRODUIT_MOTCLE" num="12">
Il est aussi possible de fixer le mode de recherche (et / ou) dans la page de
recherche, sans modifier le formulaire de recherche:
<THELIA_PROD type="recherche" mode="et" boucle="produit" ... >
<THELIA_PROD type="recherche" mode="ou" boucle="produit" ... >
Adapter enfin les boucles de pagination dans la page de recherche (Thelia 1.5.1) :
<THELIA_PAGEPREC type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" typeaff="0" motcle="#PRODUIT_MOTCLE" avance="precedente">
<a href="#URLFOND(recherche,rechpage=#PAGE_PREC&motcle=#MOTCLE)" class="LIEN_pages">Page pr&eacute;c&eacute;dente</a>
</THELIA_PAGEPREC>
<THELIA_CPAGE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="1">
|
<THELIA_PAGECONT_PASCOUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="0" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
<a href="#URLFOND(recherche,rechpage=#PAGE_NUM&motcle=#MOTCLE)" class="LIEN_pages">#PAGE_NUM</a>
</THELIA_PAGECONT_PASCOUR>
<THELIA_PAGECONT_COUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="1" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
#PAGE_NUM
</THELIA_PAGECONT_COUR>
</THELIA_CPAGE>
<THELIA_PAGE_SUIVANTE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="0" avance="suivante">
|
<a href="#URLFOND(recherche,rechpage=#PAGE_SUIV&motcle=#MOTCLE)" class="LIEN_pages">Page suivante</a>
</THELIA_PAGE_SUIVANTE>
C'est tout. Un exemple de page de recherche figure dans le repertoire 'template' du plugin.
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
BOUCLES
-------
Le plugin propose quatre boucles, pour chercher dans les produits, les rubriques
ou les contenus, et pour paginer les résultats
Il étend les boucles produit, rubrique et contenu originales de Thélia. Il est
donc possible d'utiliser les paramètres de ces boucles en plus des paramètres
spécifiques, qui sont:
mode: valeurs possibles: "et", "ou". Si le paramètre vaut "et", le plugin
rechercher les éléments qui contiennent tous les mots à rechercher
Si le paramètre vaut "ou", le plugin rechercher les éléments qui
contiennent au moins un des mots à rechercher
exact: valeurs possibles 0 ou 1. Si le paramètre vaut 1, la recherche est
effectuée exactement sur les mots entrés, sans normalisation.
Rechercher des produits:
<THELIA_PROD type="recherche" mode="et" boucle="produit" motcle="#PRODUIT_MOTCLE">
...
</THELIA_PROD>
Rechercher des rubriques:
<THELIA_RUB type="recherche" mode="et" boucle="rubrique" motcle="#PRODUIT_MOTCLE">
...
</THELIA_RUB>
Rechercher du contenu:
<THELIA_CNT type="recherche" mode="et" boucle="contenu" motcle="#PRODUIT_MOTCLE">
...
</THELIA_CNT>
Exemple: Dans la page recherche.html du template de base, pour utiliser ce plugin
au lieu de la recherche de base de Thélia, remplacer:
<THELIA_PROD type="PRODUIT" rubrique="#RUBRIQUE_ID" classement="inverse" motcle="#PRODUIT_MOTCLE" num="12">
par:
<THELIA_PROD type="recherche" mode="et" boucle="produit" rubrique="#RUBRIQUE_ID" classement="inverse" motcle="#PRODUIT_MOTCLE" num="12">
BOUCLE 'page'
-------------
Cette boucle permet de paginer les résultats. Les paramètres d'entrée sont les
mêmes que la boucle PAGE de Thélia, mis à part type="RECHERCHE" et boucle="PAGE".
type_page permet de spé"cifier quel type de pagination effectuer, et peut prendre les
valeurs produit, rubrique, ou contenu
Les variables sont elles aussi identiques à celles de la boucle PAGE de Thélia,
plus:
#MOTCLE: les paramètres de recherche, qui doivent être placés dans les
URLs de changement de page. Par exemple:
recherche.php?rechpage=#PAGE_NUM&#MOTCLE
ATTENTION: le paramètre désignat la pge dans l'URL est 'rechpage'. Ce paramètre, ainsi que le
paramètre 'motcle' doivent être passés dans les URLs de pagination.
Exemple basé sur la pagination des résultats du template de base de Thélia:
Pour Thelia 1.5.1 et suivant :
<THELIA_PAGEPREC type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" typeaff="0" motcle="#PRODUIT_MOTCLE" avance="precedente">
<a href="#URLFOND(recherche,rechpage=#PAGE_PREC&motcle=#MOTCLE)" class="LIEN_pages">Page pr&eacute;c&eacute;dente</a>
</THELIA_PAGEPREC>
<THELIA_CPAGE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="1">
|
<THELIA_PAGECONT_PASCOUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="0" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
<a href="#URLFOND(recherche,rechpage=#PAGE_NUM&motcle=#MOTCLE)" class="LIEN_pages">#PAGE_NUM</a>
</THELIA_PAGECONT_PASCOUR>
<THELIA_PAGECONT_COUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="1" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
#PAGE_NUM
</THELIA_PAGECONT_COUR>
</THELIA_CPAGE>
<THELIA_PAGE_SUIVANTE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="0" avance="suivante">
|
<a href="#URLFOND(recherche,rechpage=#PAGE_SUIV&motcle=#MOTCLE)" class="LIEN_pages">Page suivante</a>
</THELIA_PAGE_SUIVANTE>
Pour Thelia 1.4.x :
<THELIA_PAGEPREC type="RECHERCHE" boucle="PAGE" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" typeaff="0" motcle="#PRODUIT_MOTCLE" avance="precedente">
<a href="recherche.php?rechpage=#PAGE_PREC&motcle=#MOTCLE" class="LIEN_pages">Page pr&eacute;c&eacute;dente</a>
</THELIA_PAGEPREC>
<THELIA_CPAGE type="RECHERCHE" boucle="PAGE" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="1">
|
<THELIA_PAGECONT_PASCOUR type="RECHERCHE" boucle="PAGE" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="0" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
<a href="recherche.php?rechpage=#PAGE_NUM&motcle=#MOTCLE" class="LIEN_pages">#PAGE_NUM</a>
</THELIA_PAGECONT_PASCOUR>
<THELIA_PAGECONT_COUR type="RECHERCHE" boucle="PAGE" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="1" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
#PAGE_NUM
</THELIA_PAGECONT_COUR>
</THELIA_CPAGE>
<THELIA_PAGE_SUIVANTE type="RECHERCHE" boucle="PAGE" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="0" avance="suivante">
|
<a href="recherche.php?rechpage=#PAGE_SUIV&motcle=#MOTCLE" class="LIEN_pages">Page suivante</a>
</THELIA_PAGE_SUIVANTE>
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
SUBSTITUTIONS
-------------
La valeur du paramètre de form "recherche_mode" (et / ou) est disponible dans la
variable #RECHERCHE_MODE.
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
HISTORIQUE
----------
30-03-2010: 1.0.0 : Version initiale
31-03-2010: 1.1.0 : Ajout de la recherche dans les rubriques
31-03-2010: 1.2.0 : Ajout de la pagination des résultats
31-03-2010: 1.2.1 : Correction de quelques bugs
08-06-2010: 1.2.2 : Ajout du paramètre 'exact' a la boucle
Correction d'un problème sur les accents (UTF-8 dans le stemmer)
08-06-2010: 1.2.3 : Correction des bugs de recherche sur contenu et rubrique
22-12-2011: 1.2.4 : La recherche par reéférence produit est possible.
--
Fin du fichier LISEZMOI.txt

View File

@@ -0,0 +1,345 @@
<?php
/*************************************************************************************/
/* */
/* Plugin Recherche */
/* */
/* Copyright (c) 2010, Franck Allimant */
/* email : thelia@allimant.org */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or */
/* (at your option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program; if not, write to the Free Software */
/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* */
/*************************************************************************************/
?>
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
require_once(realpath(dirname(__FILE__)) . '/stemmer/StemmingToolKit.php');
class Recherche extends PluginsClassiques {
const VERSION = '1.2.3';
function Recherche()
{
$this->PluginsClassiques("recherche");
}
function init()
{
$this->ajout_desc(
"Recherche améliorée",
"Plugin de recherche amélioré",
"Ce plugin améliore la recherchede Thélia, en normalisant les mots recherchés, anfin de remonter des résultats plus pertinents.",
1);
}
function destroy()
{
// Rien
}
function action()
{
global $res;
$mode == 'et';
$exact = 0;
if (isset($_REQUEST['recherche_mode']))
{
$mode = strtolower($_REQUEST['recherche_mode']);
if ($mode == 'et' || $mode == 'ou')
{
$res = str_replace('#RECHERCHE_MODE', $mode, $res);
}
}
if (isset($_REQUEST['recherche_exacte']))
{
$exact = intval($_REQUEST['recherche_exacte']) > 0 ? 1 : 0;
}
if (strstr($res, '#RECHERCHE_') !== false)
{
$res = str_replace('#RECHERCHE_MODE', $mode, $res);
$res = str_replace('#RECHERCHE_EXACTE', $exact, $res);
}
}
function boucle($texte, $args)
{
$boucle = lireTag($args, 'boucle');
if ($boucle == '') $boucle="produit";
switch(strtolower($boucle))
{
case 'produit':
return $this->boucleProduit($texte, $args);
break;
case 'rubrique':
return $this->boucleRubrique($texte, $args);
break;
case 'contenu':
return $this->boucleContenu($texte, $args);
break;
case 'page':
return $this->bouclePage($texte, $args);
break;
}
}
function chercher($query, $boucle, $texte, $args, $nombre = false, $pour_comptage = false)
{
$motcle = trim(lireTag($args, "motcle"));
$mode = trim(lireTag($args, "mode"));
$exact = intval(trim(lireTag($args, "exact")));
$nombre = lireTag($args, "num");
$nombre = $nombre == '' ? false : intval($nombre);
if ($mode == '') $mode = 'et';
if ($motcle == '') return '';
$res = '';
$tk = new StemmingToolkit();
$words = $tk->indexText($motcle, 'fr', $exact ? false : true);
$where = array();
foreach($words['index'] as $index)
{
$word = $index['stem'];
if ($exact)
$exp = "REGEXP '[[:<:]]${word}[[:>:]]'";
else
$exp = "like '%$word%'";
$where[] = "(".($boucle == 'boucleProduit' ? "ref $exp OR" : "")." titre $exp OR chapo $exp OR description $exp OR postscriptum $exp)";
}
if (count($where) > 0)
{
$query = "$query WHERE ".implode($mode == 'et' ? ' AND ' : ' OR ', $where);
if ($nombre)
{
$page = $this->get_current_page();
if ($page <= 0) $page = 1;
$offset = $nombre * ($page - 1);
$query .= " LIMIT $offset, $nombre";
$this->rechparams = '';
}
$ids = array();
$result = mysql_query($query);
if ($result)
{
if ($pour_comptage) return mysql_num_rows($result);
while ($row = mysql_fetch_object($result))
{
if (intval($row->id != 0)) $ids[] = $row->id;
}
}
if (count($ids) > 0)
{
$pargs = preg_replace('/motcle="([^"]+)"/i', 'id="'.implode(',', $ids).'"', $args);
$res = $boucle($texte, $pargs);
}
}
return $res;
}
function boucleProduit($texte, $args, $nombre = false, $pour_comptage = false)
{
return $this->chercher(
"select distinct p.id
from produitdesc pd
LEFT JOIN produit p ON p.id=pd.produit",
'boucleProduit',
$texte,
$args,
$nombre,
$pour_comptage
);
}
function boucleRubrique($texte, $args, $nombre = false, $pour_comptage = false)
{
return $this->chercher(
"select distinct r.id
from rubriquedesc rd
LEFT JOIN rubrique r ON r.id=rd.rubrique",
'boucleRubrique',
$texte,
$args,
$nombre,
$pour_comptage
);
}
function boucleContenu($texte, $args, $nombre = false, $pour_comptage = false)
{
return $this->chercher(
"select distinct c.id
from contenudesc cd
LEFT JOIN contenu c ON c.id=cd.contenu",
'boucleContenu',
$texte,
$args,
$nombre,
$pour_comptage
);
}
// Ceci est un quasi copier-coller de la boucle 'page' de Thélia,
// vu qu'on ne peut pas l'utiliser pour faire notre pagination
// on est obligés de la recopier. C'est nul :-(
private function bouclePage($texte, $args)
{
$num = lireTag($args, "num");
$courante = lireTag($args, "courante");
$pagecourante = lireTag($args, "pagecourante");
$typeaff = lireTag($args, "typeaff");
$max = lireTag($args, "max");
$affmin = lireTag($args, "affmin");
$avance = lireTag($args, "avance");
$type_page = lireTag($args, "type_page");
$motcle = urlencode(lireTag($args, "motcle"));
$i=0;
$args = str_replace('num=', '__num__=', $args);
switch(strtolower($type_page))
{
case 'produit':
$nbres = $this->boucleProduit($texte, $args, false, true);
break;
case 'rubrique':
$nbres = $this->boucleRubrique($texte, $args, false, true);
break;
case 'contenu':
$nbres = $this->boucleContenu($texte, $args, false, true);
break;
default:
return '';
}
$page = $this->get_current_page();
if ($page<=0) $page=1;
$bpage=$page;
$res="";
$page = $bpage;
$nbpage = ceil($nbres/$num);
if($page+1>$nbpage) $pagesuiv=$page;
else $pagesuiv=$page+1;
if($page-1<=0) $pageprec=1;
else $pageprec=$page-1;
if($nbpage<$affmin) return;
if($nbpage == 1) return;
if($typeaff == 1)
{
if(!$max) $max=$nbpage+1;
if($page && $max && $page>$max) $i=ceil(($page)/$max)*$max-$max+1;
if($i == 0) $i=1;
$fin = $i+$max;
for (; $i<$nbpage+1 && $i<$fin; $i++ )
{
$temp = str_replace("#PAGE_NUM", "$i", $texte);
$temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp);
$temp = str_replace("#PAGE_PREC", "$pageprec", $temp);
$temp = str_replace("#MOTCLE", $motcle, $temp);
if($pagecourante && $pagecourante == $i)
{
if($courante =="1" && $page == $i ) $res .= $temp;
else if($courante == "0" && $page != $i ) $res .= $temp;
else if($courante == "") $res .= $temp;
}
else if(!$pagecourante) $res .= $temp;
}
}
else if($typeaff == "0" && ($avance == "precedente" && $pageprec != $page))
{
$temp = str_replace("#PAGE_NUM", "$page", $texte);
$temp = str_replace("#PAGE_PREC", "$pageprec", $temp);
$temp = str_replace("#MOTCLE", $motcle, $temp);
$res .= $temp;
}
else if($typeaff == "0" && ($avance == "suivante" && $pagesuiv != $page))
{
$temp = str_replace("#PAGE_NUM", "$page", $texte);
$temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp);
$temp = str_replace("#MOTCLE", $motcle, $temp);
$res .= $temp;
}
else if($typeaff == "0" && $avance == "")
{
$temp = str_replace("#PAGE_NUM", "$page", $texte);
$temp = str_replace("#PAGE_SUIV", "$pagesuiv", $temp);
$temp = str_replace("#PAGE_PREC", "$pageprec", $temp);
$temp = str_replace("#MOTCLE", $motcle, $temp);
$res .= $temp;
}
return $res;
}
private function get_current_page()
{
return isset($_REQUEST['rechpage']) ? intval($_REQUEST['rechpage']) : 0;
}
}
?>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Migration automatique depuis le fichier original, sauvegardé dans plugin.xml.save-->
<plugin>
<descriptif lang="fr">
<titre>Recherche améliorée</titre>
<chapo></chapo>
<description>Ce plugin permet une recherche dans vos produits, rubriques ou contenus. Les mots saisis par votre client sont normalisés, ce qui permet d'obtenir de meilleurs résultats de recherche</description>
<postscriptum></postscriptum>
</descriptif>
<version>1.2.4</version>
<auteur>
<nom>Franck Allimant - thelia@allimant.org</nom>
<societe></societe>
<email></email>
<web></web>
</auteur>
<type>classique</type>
<prerequis/>
<thelia>1.4.0</thelia>
<etat>production</etat>
<documentation>LISEZMOI.txt</documentation>
<urlmiseajour></urlmiseajour>
</plugin>

View File

@@ -0,0 +1,261 @@
<?php
/*
*
* implements a Paice/Husk Stemmer written in PHP by Alexis Ulrich (http://alx2002.free.fr)
*
* rewriting rules to extract a stem from an English word
*
* This code is in the public domain.
*
*/
$PaiceHuskStemmerRules_en = array(
'ai*2.', # { -ia > - if intact }
'a*1.', # { -a > - if intact }
'bb1.', # { -bb > -b }
'city3s.', # { -ytic > -ys }
'ci2>', # { -ic > - }
'cn1t>', # { -nc > -nt }
'dd1.', # { -dd > -d }
'dei3y>', # { -ied > -y }
'deec2ss.', # { -ceed > -cess }
'dee1.', # { -eed > -ee }
'de2>', # { -ed > - }
'dooh4>', # { -hood > - }
'e1>', # { -e > - }
'feil1v.', # { -lief > -liev }
'fi2>', # { -if > - }
'gni3>', # { -ing > - }
'gai3y.', # { -iag > -y }
'ga2>', # { -ag > - }
'gg1.', # { -gg > -g }
'ht*2.', # { -th > - if intact }
'hsiug5ct.', # { -guish > -ct }
'hsi3>', # { -ish > - }
'i*1.', # { -i > - if intact }
'i1y>', # { -i > -y }
'@i1d.', # { -i@ > -id -- see nois4@> & vis3@> }
'juf1s.', # { -fuj > -fus }
'ju1d.', # { -uj > -ud }
'jo1d.', # { -oj > -od }
'jeh1r.', # { -hej > -her }
'jrev1t.', # { -verj > -vert }
'jsim2t.', # { -misj > -mit }
'jn1d.', # { -nj > -nd }
'j1s.', # { -j > -s }
'lbaifi6.', # { -ifiabl > - }
'lbai4y.', # { -iabl > -y }
'lba3>', # { -abl > - }
'lbi3.', # { -ibl > - }
'lib2l>', # { -bil > -bl }
'lc1.', # { -cl > c }
'lufi4y.', # { -iful > -y }
'luf3>', # { -ful > - }
'lu2.', # { -ul > - }
'lai3>', # { -ial > - }
'lau3>', # { -ual > - }
'la2>', # { -al > - }
'll1.', # { -ll > -l }
'mui3.', # { -ium > - }
'mu*2.', # { -um > - if intact }
'msi3>', # { -ism > - }
'mm1.', # { -mm > -m }
'nois4@>', # { -sion > -@ }
'noix4ct.', # { -xion > -ct }
'noi3>', # { -ion > - }
'nai3>', # { -ian > - }
'na2>', # { -an > - }
'nee0.', # { protect -een }
'ne2>', # { -en > - }
'nn1.', # { -nn > -n }
'pihs4>', # { -ship > - }
'pp1.', # { -pp > -p }
're2>', # { -er > - }
'rae0.', # { protect -ear }
'ra2.', # { -ar > - }
'ro2>', # { -or > - }
'ru2>', # { -ur > - }
'rr1.', # { -rr > -r }
'rt1>', # { -tr > -t }
'rei3y>', # { -ier > -y }
'sei3y>', # { -ies > -y }
'sis2.', # { -sis > -s }
'si2>', # { -is > - }
'ssen4>', # { -ness > - }
'ss0.', # { protect -ss }
'suo3>', # { -ous > - }
'su*2.', # { -us > - if intact }
's*1>', # { -s > - if intact }
's0.', # { -s > -s }
'tacilp4y.', # { -plicat > -ply }
'ta2>', # { -at > - }
'tnem4>', # { -ment > - }
'tne3>', # { -ent > - }
'tna3>', # { -ant > - }
'tpir2b.', # { -ript > -rib }
'tpro2b.', # { -orpt > -orb }
'tcud1.', # { -duct > -duc }
'tpmus2.', # { -sumpt > -sum }
'tpec2iv.', # { -cept > -ceiv }
'tulo2v.', # { -olut > -olv }
'tsis0.', # { protect -sist }
'tsi3>', # { -ist > - }
'tt1.', # { -tt > -t }
'uqi3.', # { -iqu > - }
'ugo1.', # { -ogu > -og }
'vis3@>', # { -siv > -@ }
'vie0.', # { protect -eiv }
'vi2>', # { -iv > - }
'ylb1>', # { -bly > -bl }
'yli3y>', # { -ily > -y }
'ylp0.', # { protect -ply }
'yl2>', # { -ly > - }
'ygo1.', # { -ogy > -og }
'yhp1.', # { -phy > -ph }
'ymo1.', # { -omy > -om }
'ypo1.', # { -opy > -op }
'yti3>', # { -ity > - }
'yte3>', # { -ety > - }
'ytl2.', # { -lty > -l }
'yrtsi5.', # { -istry > - }
'yra3>', # { -ary > - }
'yro3>', # { -ory > - }
'yfi3.', # { -ify > - }
'ycn2t>', # { -ncy > -nt }
'yca3>', # { -acy > - }
'zi2>', # { -iz > - }
'zy1s.', # { -yz > -ys }
'end0.' # end rule: the stem has already been found
);
?>

View File

@@ -0,0 +1,407 @@
<?php
/*
*
* implements a Paice/Husk Stemmer written in PHP by Alexis Ulrich (http://alx2002.free.fr)
*
* rewriting rules to extract a stem from a French word
*
* This code is in the public domain.
*
*/
$PaiceHuskStemmerRules_fr = array(
'esre1>', # { -erse > -ers }
'esio1>', # { -oise > -ois }
'siol1.', # { -lois > -loi }
'siof0.', # { -fois > -fois }
'sioe0.', # { -eois > -eois }
'sio3>', # { -ois > - }
'st1>', # { -ts > -t }
'sf1>', # { -fs > -f }
'sle1>', # { -els > -el }
'slo1>', # { -ols > -ol }
'sé1>', # { -és > -é }
'étuae5.', # { -eauté > - }
'étuae2.', # { -eauté > -eau }
'tnia0.', # { -aint > -aint }
'tniv1.', # { -vint > -vin }
'tni3>', # { -int > - }
'suor1.', # { -rous > -ou }
'suo0.', # { -ous > -ous }
'sdrail5.', # { -liards > -l }
'sdrai4.', # { -iards > -i }
'erèi1>', # { -ière > -ier }
'sesue3x>', # { -euses > -euse }
'esuey5i.', # { -yeuse > -i }
'esue2x>', # { -euse > -eux }
'se1>', # { -es > -e }
'erèg3.', # { -gère > -g }
'eca1>', # { -ace > -ac }
'esiah0.', # { -haise > - }
'esi1>', # { -ise > -is }
'siss2.', # { -ssis > -ss }
'sir2>', # { -ris > -r }
'sit2>', # { -tis > -t }
'egané1.', # { -énage > -énag }
'egalli6>', # { -illage > - }
'egass1.', # { -ssage > -sag }
'egas0.', # { -sage > - }
'egat3.', # { -tage > - }
'ega3>', # { -age > - }
'ette4>', # { -ette > - }
'ett2>', # { -tte > -t }
'etio1.', # { -oite > -oit }
'tioç4c.', # { -çoit > -c }
'tio0.', # { -oit > -oit }
'et1>', # { -te > -t }
'eb1>', # { -be > -b }
'snia1>', # { -ains > -ain }
'eniatnau8>', # { -uantaine > - }
'eniatn4.', # { -ntaine > -nt }
'enia1>', # { -aine > -ain }
'niatnio3.', # { -ointain > -oint }
'niatg3.', # { -gtain > -gt }
'eé1>', # { -ée > -é }
'éhcat1.', # { -taché > -tach }
'éhca4.', # { -aché > - }
'étila5>', # { -alité > - }
'étici5.', # { -icité > - }
'étir1.', # { -rité > -rit }
'éti3>', # { -ité > - }
'égan1.', # { -nagé > -nag }
'éga3>', # { -agé > - }
'étehc1.', # { -cheté > -chet }
'éte3>', # { -eté > - }
'éit0.', # { -tié > -tié }
'é1>', # { -é > - }
'eire4.', # { -erie > - }
'eirue5.', # { -eurie > - }
'eio1.', # { -oie > -oi }
'eia1.', # { -aie > -ai }
'ei1>', # { -ie > -i }
'eng1.', # { -gne > -gn }
'xuaessi7.', # { -isseaux > - }
'xuae1>', # { -eaux > -eau }
'uaes0.', # { -seau > -seau }
'uae3.', # { -eau > - }
'xuave2l.', # { -evaux > -eval }
'xuav2li>', # { -vaux > -vail }
'xua3la>', # { -aux > -al }
'ela1>', # { -ale > -al }
'lart2.', # { -tral > -tr }
'lani2>', # { -inal > -in }
'laé2>', # { -éal > -é }
'siay4i.', # { -yais > -i }
'siassia7.', # { -aissais > - }
'siarv1*.', # { -vrais > -vrai if intact }
'sia1>', # { -ais > -ai }
'tneiayo6i.', # { -oyaient > -oi }
'tneiay6i.', # { -yaient > -i }
'tneiassia9.', # { -aissaient > - }
'tneiareio7.', # { -oieraient > -oi }
'tneia5>', # { -aient > - }
'tneia4>', # { -aient > -a }
'tiario4.', # { -oirait > -oi }
'tiarim3.', # { -mirait > -mir }
'tiaria3.', # { -airait > -air }
'tiaris3.', # { -sirait > -sir }
'tiari5.', # { -irait > - }
'tiarve6>', # { -evrait > - }
'tiare5>', # { -erait > - }
'iare4>', # { -erai > - }
'are3>', # { -era > - }
'tiay4i.', # { -yait > -i }
'tia3>', # { -ait > - }
'tnay4i.', # { -yant > -i }
'emèiu5>', # { -uième > - }
'emèi4>', # { -ième > - }
'tnaun3.', # { -nuant > -nu }
'tnauqo3.', # { -oquant > -oqu }
'tnau4>', # { -uant > - }
'tnaf0.', # { -fant > -fant }
'tnaté2>', # { -étant > -ét }
'tna3>', # { -ant > - }
'tno3>', # { -ont > - }
'zeiy4i.', # { -yiez > -i }
'zey3i.', # { -yez > -i }
'zeire5>', # { -eriez > - }
'zeird4.', # { -driez > -d }
'zeirio4.', # { -oiriez > -oi }
'ze2>', # { -ez > - }
'ssiab0.', # { -baiss > - }
'ssia4.', # { -aiss > - }
'ssi3.', # { -iss > - }
'tnemma6>', # { -amment > - }
'tnemesuey9i.', # { -yeusement > -i }
'tnemesue8>', # { -eusement > - }
'tnemevi7.', # { -ivement > - }
'tnemessia5.', # { -aissement > -aiss }
'tnemessi8.', # { -issement > - }
'tneme5>', # { -ement > - }
'tnemia4.', # { -aiment > -ai }
'tnemé5>', # { -ément > - }
'el2l>', # { -le > -l }
'lle3le>', # { -ell > -el }
'letô0.', # { -ôtel > -ôtel }
'lepp0.', # { -ppel > -ppel }
'le2>', # { -el > - }
'srei1>', # { -iers > -ier }
'reit3.', # { -tier > -t }
'reila2.', # { -alier > -ali }
'rei3>', # { -ier > - }
'ertâe5.', # { -eâtre > - }
'ertâé1.', # { -éâtre > -éâtr }
'ertâ4.', # { -âtre > - }
'drai4.', # { -iard > - }
'erdro0.', # { -ordre > -ordre }
'erute5.', # { -eture > - }
'ruta0.', # { -atur > -atur }
'eruta1.', # { -ature > -atur }
'erutiov1.', # { -voiture > -voitur }
'erub3.', # { -bure > -b }
'eruh3.', # { -hure > -h }
'erul3.', # { -lure > -l }
'er2r>', # { -re > -r }
'nn1>', # { -nn > -n }
'rèi3.', # { -ièr > - }
'srev0.', # { -vers > -vers }
'sr1>', # { -rs > -r }
'rid2>', # { -dir > -d }
're2>', # { -er > - }
'xuei4.', # { -ieux > - }
'esuei5.', # { -ieuse > - }
'lbati3.', # { -itabl > -it }
'lba3>', # { -abl > - }
'rueis0.', # { -sieur > - }
'ruehcn4.', # { -ncheur > -nc }
'ecirta6.', # { -atrice > - }
'ruetai6.', # { -iateur > - }
'rueta5.', # { -ateur > - }
'rueir0.', # { -rieur > - }
'rue3>', # { -eur > - }
'esseti6.', # { -itesse > - }
'essere6>', # { -eresse > - }
'esserd1.', # { -dresse > -dress }
'esse4>', # { -esse > - }
'essiab1.', # { -baisse > -baiss }
'essia5.', # { -aisse > - }
'essio1.', # { -oisse > -oiss }
'essi4.', # { -isse > - }
'essal4.', # { -lasse > -l }
'essa1>', # { -asse > -ass }
'ssab1.', # { -bass > -bas }
'essurp1.', # { -prusse > -uss }
'essu4.', # { -usse > - }
'essi1.', # { -isse > -ss }
'ssor1.', # { -ross > -ros }
'essor2.', # { -rosse > -ros }
'esso1>', # { -osse > -oss }
'ess2>', # { -sse > -s }
'tio3.', # { -oit > - }
'rès2re.', # { -sèr > -ser }
'rè0e.', # { -èr > -ère }
'esn1.', # { -nse > -èns }
'eu1>', # { -ue > -u }
'sua0.', # { -aus > -aus }
'su1>', # { -us > -u }
'utt1>', # { -utt > -tt }
'tuç3c.', # { -çut > -c }
'uç2c.', # { -çu > -c }
'ur1.', # { -ru > -r }
'ehcn2>', # { -nche > -nc }
'ehcu1>', # { -uche > -uch }
'snorr3.', # { -rrons > -rr }
'snoru3.', # { -urons > -ur }
'snorua3.', # { -aurons > -aur }
'snorv3.', # { -vrons > -vr }
'snorio4.', # { -oirons > -oi }
'snori5.', # { -irons > - }
'snore5>', # { -erons > - }
'snortt4>', # { -ttrons > -tt }
'snortîa7.', # { -aîtrons > - }
'snort3.', # { -trons > -tr }
'snor4.', # { -rons > - }
'snossi6.', # { -issons > - }
'snoire6.', # { -erions > - }
'snoird5.', # { -drions > -d }
'snoitai7.', # { -iations > - }
'snoita6.', # { -ations > - }
'snoits1>', # { -stions > -stion }
'noits0.', # { -stion > -stion }
'snoi4>', # { -ions > - }
'noitaci7>', # { -ication > - }
'noitai6.', # { -iation > - }
'noita5.', # { -ation > - }
'noitu4.', # { -ution > -u }
'noi3>', # { -ion > - }
'snoya0.', # { -ayons > -ayons }
'snoy4i.', # { -yons > -i }
'snoça1.', # { -açons > -açon }
'snoçr1.', # { -rçons > -rçon }
'snoe4.', # { -eons > - }
'snosiar1>', # { -raisons > - }
'snola1.', # { -alons > -alon }
'sno3>', # { -ons > - }
'sno1>', # { -ons > -on }
'noll2.', # { -llon > -ll }
'tnennei4.', # { -iennent > -ien }
'ennei2>', # { -ienne > -ien }
'snei1>', # { -iens > -ien }
'sneé1>', # { -éens > -éen }
'enneé5e.', # { -éenne > -e }
'neé3e.', # { -éen > -e }
'neic0.', # { -cien > -cien }
'neiv0.', # { -vien > -vien }
'nei3.', # { -ien > - }
'sc1.', # { -cs > -c }
'sd1.', # { -ds > -d }
'sg1.', # { -gs > -g }
'sni1.', # { -ins > -in }
'tiu0.', # { -uit > - }
'ti2.', # { -it > - }
'sp1>', # { -ps > -p }
'sna1>', # { -ans > -an }
'sue1.', # { -eus > -eu }
'enn2>', # { -nne > -n }
'nong2.', # { -gnon > -gn }
'noss2.', # { -sson > -ss }
'rioe4.', # { -eoir > - }
'riot0.', # { -toir > -toir }
'riorc1.', # { -croir > -croi }
'riovec5.', # { -cevoir > -c }
'rio3.', # { -oir > - }
'ric2.', # { -cir > -l }
'ril2.', # { -lir > -l }
'tnerim3.', # { -mirent > -mir }
'tneris3>', # { -sirent > -sir }
'tneri5.', # { -irent > - }
'tîa3.', # { -aît > - }
'riss2.', # { -ssir > -ss }
'tî2.', # { -ît > - }
'tâ2>', # { -ât > - }
'ario2.', # { -oira > -oi }
'arim1.', # { -mira > -m }
'ara1.', # { -ara > -ar }
'aris1.', # { -sira > -sir }
'ari3.', # { -ira > - }
'art1>', # { -tra > -tr }
'ardn2.', # { -ndra > -nd }
'arr1.', # { -rra > -rr }
'arua1.', # { -aura > -aur }
'aro1.', # { -ora > -or }
'arv1.', # { -vra > -vr }
'aru1.', # { -ura > -ur }
'ar2.', # { -ra > - }
'rd1.', # { -dr > -d }
'ud1.', # { -du > - }
'ul1.', # { -lu > -l }
'ini1.', # { -ini > -in }
'rin2.', # { -nir > - }
'tnessiab3.', # { -baissent > -baiss }
'tnessia7.', # { -aissent > - }
'tnessi6.', # { -issent > - }
'tnessni4.', # { -inssent > -ins }
'sini2.', # { -inis > -in }
'sl1.', # { -ls > -l }
'iard3.', # { -drai > -d }
'iario3.', # { -oirai > -oi }
'ia2>', # { -ai > - }
'io0.', # { -oi > -oi }
'iule2.', # { -elui > -el }
'i1>', # { -i > - }
'sid2.', # { -dis > -d }
'sic2.', # { -cis > -c }
'esoi4.', # { -iose > - }
'ed1.', # { -de > -d }
'ai2>', # { -ia > - }
'a1>', # { -a > - }
'adr1.', # { -rda > -rd }
'tnerè5>', # { -èrent > - }
'evir1.', # { -rive > -riv }
'evio4>', # { -oive > - }
'evi3.', # { -ive > - }
'fita4.', # { -atif > - }
'fi2>', # { -if > - }
'enie1.', # { -eine > -ein }
'sare4>', # { -eras > - }
'sari4>', # { -iras > - }
'sard3.', # { -dras > -d }
'sart2>', # { -tras > -tr }
'sa2.', # { -as > - }
'tnessa6>', # { -assent > - }
'tnessu6>', # { -ussent > - }
'tnegna3.', # { -angent > -ang }
'tnegi3.', # { -igent > -ig }
'tneg0.', # { -gent > -gent }
'tneru5>', # { -urent > - }
'tnemg0.', # { -gment > -gment }
'tnerni4.', # { -inrent > -in }
'tneiv1.', # { -vient > -vien }
'tne3>', # { -ent > - }
'une1.', # { -enu > -en }
'en1>', # { -ne > -n }
'nitn2.', # { -ntin > - }
'ecnay5i.', # { -yance > -i }
'ecnal1.', # { -lance > -lanc }
'ecna4.', # { -ance > - }
'ec1>', # { -ce > -c }
'nn1.', # { -nn > -n }
'rit2>', # { -tir > - }
'rut2>', # { -tur > -t }
'rud2.', # { -dur > -d }
'ugn1>', # { -ngu > -ng }
'eg1>', # { -ge > -g }
'tuo0.', # { -out > -out }
'tul2>', # { -lut > -l }
'tû2>', # { -ût > - }
'ev1>', # { -ve > -v }
'vè2ve>', # { -èv > -ev }
'rtt1>', # { -ttr > -tt }
'emissi6.', # { -issime > - }
'em1.', # { -me > -m }
'ehc1.', # { -che > -ch }
'céi2cè.', # { -iéc > -ièc }
'libi2l.', # { -ibil > -ibl }
'llie1.', # { -eill > -eil }
'liei4i.', # { -ieil > -i }
'xuev1.', # { -veux > -veu }
'xuey4i.', # { -yeux > -i }
'xueni5>', # { -ineux > - }
'xuell4.', # { -lleux > -l }
'xuere5.', # { -ereux > - }
'xue3>', # { -eux > - }
'rbé3rbè.', # { -ébr > -èbr }
'tur2.', # { -rut > -r }
'riré4re.', # { -érir > -er }
'rir2.', # { -rir > -r }
'câ2ca.', # { -âc > -ac }
'snu1.', # { -uns > -un }
'rtîa4.', # { -aîtr > - }
'long2.', # { -gnol > -gn }
'vec2.', # { -cev > -c }
'ç1c>', # { -ç > -c }
'ssilp3.', # { -pliss > -pl }
'silp2.', # { -plis > -pl }
'tèhc2te.', # { -chèt > -chet }
'nèm2ne.', # { -mèn > -men }
'llepp1.', # { -ppell > -ppel }
'tan2.', # { -nat > -n }
'rvè3rve.', # { -èvr > -evr }
'rvé3rve.', # { -évr > -evr }
'rè2re.', # { -èr > -er }
'ré2re.', # { -ér > -er }
'tè2te.', # { -èt > -et }
'té2te.', # { -ét > -et }
'epp1.', # { -ppe > -pp }
'eya2i.', # { -aye > -ai }
'ya1i.', # { -ay > -ai }
'yo1i.', # { -oy > -oi }
'esu1.', # { -use > -us }
'ugi1.', # { -igu > -g }
'tt1.', # { -tt > -t }
# end rule: the stem has already been found
'end0.'
);
?>

View File

@@ -0,0 +1,148 @@
<?php
/*
*
* implements a Paice/Husk Stemmer written in PHP by Alexis Ulrich (http://alx2002.free.fr)
*
* This code is in the public domain.
*
*/
class PaiceHuskStemmer
{
// the rule patterns include all accented forms for a given language
var $rule_pattern_en = "/^([a-z]*)(\*){0,1}(\d)([a-z]*)([.|>])/";
var $rule_pattern_fr = "/^([a-zàâèéêëîïôûùç]*)(\*){0,1}(\d)([a-zàâèéêëîïôûùç]*)([.|>])/";
// we include both languages to prevent I/O of files everywhere
function getIntlVars(&$PaiceHuskStemmerRules, &$rule_pattern, $language)
{
if ($language == 'fr')
{
require(realpath(dirname(__FILE__)) . '/PaiceHuskStemRules_fr.php');
$PaiceHuskStemmerRules = $PaiceHuskStemmerRules_fr;
$rule_pattern = $this->rule_pattern_fr;
}
else if ($language == 'en')
{
require(realpath(dirname(__FILE__)) . '/PaiceHuskStemRules_en.php');
$PaiceHuskStemmerRules = $PaiceHuskStemmerRules_en;
$rule_pattern = $this->rule_pattern_en;
}
}
// returns the number of the first rule from the rule number $rule_number
// that can be applied to the given reversed form
// returns -1 if no rule can be applied, ie the stem has been found
function getFirstRule($reversed_form, $rule_number, $language='en') {
$this->getIntlVars($PaiceHuskStemmerRules, $rule_pattern, $language);
$nb_rules = sizeOf($PaiceHuskStemmerRules);
for ($i=$rule_number; $i<$nb_rules; $i++) {
// gets the letters from the current rule
$rule = $PaiceHuskStemmerRules[$i];
$rule = preg_replace($rule_pattern, "\\1", $rule);
if (strncasecmp($rule,$reversed_form,strlen($rule)) == 0) return $i;
}
return -1;
}
/*
* Check the acceptability of a stem for a given language
*
* $reversed_stem: the stem to check in reverse form
* $language: text language (default: French)
*/
function checkAcceptability($reversed_stem, $language='en') {
switch ($language) {
case 'en': # English
if (preg_match("/[aeiouy]$/",$reversed_stem)) {
// if the form starts with a vowel then at least two letters must remain after stemming (e.g., "owed"/"owing" --> "ow", but not "ear" --> "e")
return (strlen($reversed_stem) >= 2);
}
else {
// if the form starts with a consonant then at least three letters must remain after stemming
if (strlen($reversed_stem) < 3) return False;
// and at least one of these must be a vowel or "y" (e.g., "saying" --> "say" and "crying" --> "cry", but not "string" --> "str", "meant" --> "me" or "cement" --> "ce")
return (preg_match("/[aeiouy]/",$reversed_stem));
}
break;
case 'fr': # French
if (preg_match("/[aàâeèéêëiîïoôuûùy]$/",$reversed_stem)) {
// if the form starts with a vowel then at least two letters must remain after stemming (e.g.: "étaient" --> "ét")
return (strlen($reversed_stem) > 2);
}
else {
// if the form starts with a consonant then at least two letters must remain after stemming
if (strlen($reversed_stem) <= 2) {
return False;
}
// and at least one of these must be a vowel or "y"
return (preg_match("/[aàâeèéêëiîïoôuûùy]/",$reversed_stem));
}
break;
break;
default:
die("Error in checkAcceptability function: the language <i>$language</i> is not supported.");
}
}
/*
* the actual Paice/Husk stemmer
* which returns a stem for the given form
*
* $form: the word for which we want the stem
* $language: the word language (default: French)
*/
function Stem($form, $language='en') {
$this->getIntlVars($PaiceHuskStemmerRules, $rule_pattern, $language);
$intact = True;
$stem_found = False;
$reversed_form = strrev($form);
$rule_number = 0;
// that loop goes through the rules' array until it finds an ending one (ending by '.') or the last one ('end0.')
while (True) {
$rule_number = $this->getFirstRule($reversed_form, $rule_number, $language);
if ($rule_number == -1) {
// no other rule can be applied => the stem has been found
break;
}
$rule = $PaiceHuskStemmerRules[$rule_number];
preg_match($rule_pattern, $rule, $matches);
if (($matches[2] != '*') || ($intact)) {
$reversed_stem = $matches[4] . substr($reversed_form,$matches[3],strlen($reversed_form)-$matches[3]);
if ($this->checkAcceptability($reversed_stem,$language)) {
$reversed_form = $reversed_stem;
if ($matches[5] == '.') break;
}
else {
// go to another rule
$rule_number++;
}
}
else {
// go to another rule
$rule_number++;
}
}
return strrev($reversed_form);
}
}
?>

View File

@@ -0,0 +1,82 @@
<?php
/*
*
* implements a Paice/Husk Stemmer written in PHP by Alexis Ulrich (http://alx2002.free.fr)
*
* Tool kit
*
* This code is in the public domain.
*
*/
require_once(realpath(dirname(__FILE__)) . '/PaiceHuskStemmer.php');
class StemmingToolkit
{
// punctuation characters
var $punctuation = array('.', ',', ';', ':', '!', '?', '"', '\'', '(', ')', '--');
/*
* standardized punctuation: each punctuation mark has a space before and after it
*
* $text: string, the text to be processed
* $lang: language of the text (default: English)
*/
function standardizePunctuation($text, $lang='en') {
// puts a space before and after a punctuation mark,
// whatever the number of spaces there were before and after it
$text = preg_replace('/( )*(["\'\.,;:\(\)\?!])( )*/', ' \\2 ', $text);
// whitespace
$text = preg_replace('/\s/', ' ', $text);
if ($lang == 'en') {
// handles the didn't, couldn't...
$text = str_replace('n \' t', 'n\'t', $text);
// handles the o'clock
$text = str_replace('o \' clock', 'o\'clock', $text);
}
return $text;
}
/*
* indexes the given text and returns an array of three arrays:
* - 'original': the original text
* - 'modified': the modified text, ie the standardized-punctuation form
* - 'index': an array of three-element arrays:
* - 'form': the form of the word in the original text
* - 'index': the index of the form in the modified text
* - 'stem': the stem of the form
*
* $text: string, the text to be processed
* $lang: language of the text (default: English)
*/
function indexText($text, $lang='en', $stem = true) {
global $punctuation;
require_once(realpath(dirname(__FILE__)) . '/stoplist_'.$lang.'.inc.php');
$indexArray = array();
$thisText = $this->standardizePunctuation($text, $lang);
$thisTextWords = explode(' ',$thisText);
$thisTextIndex = array();
$wordIndex = 0;
$stemmer = new PaiceHuskStemmer();
for ($i=0; $i<sizeOf($thisTextWords); $i++)
{
$form = $thisTextWords[$i];
$word = strtolower($form);
// words which length is 1 or 0 are not processed.
if ((!@in_array($word, $punctuation)) && (strlen($word) > 1) && (!@in_array($word, $stoplist))) {
$thisTextIndex[] = array('form'=>$form, 'stem'=>($stem ? $stemmer->Stem($word,$lang) : $word), 'index'=>$wordIndex);
}
$wordIndex = $wordIndex + strlen($word) + 1; // the last space
}
return array('original'=>$text, 'modified'=>$thisText, 'index'=>$thisTextIndex);
}
}
?>

View File

@@ -0,0 +1,632 @@
<?php
// English stoplist
$stoplist = array(
'a',
'able',
'about',
'above',
'according',
'accordingly',
'across',
'actually',
'after',
'afterwards',
'again',
'against',
'ago',
'ain\'t',
'all',
'allow',
'allows',
'almost',
'alone',
'along',
'already',
'also',
'although',
'always',
'am',
'among',
'amongst',
'amoungst',
'amount',
'an',
'and',
'another',
'any',
'anybody',
'anyhow',
'anyone',
'anything',
'anyway',
'anyways',
'anywhere',
'apart',
'appear',
'appreciate',
'appropriate',
'are',
'aren\'t',
'around',
'as',
'aside',
'ask',
'asking',
'associated',
'at',
'available',
'away',
'awfully',
'b',
'back',
'be',
'became',
'because',
'become',
'becomes',
'becoming',
'been',
'before',
'beforehand',
'behind',
'being',
'believe',
'below',
'beside',
'besides',
'best',
'better',
'between',
'beyond',
'bill',
'both',
'bottom',
'brief',
'but',
'by',
'c',
'c\'mon',
'c\'s',
'call',
'came',
'can',
'can\'t',
'cannot',
'cant',
'cause',
'causes',
'certain',
'certainly',
'changes',
'clearly',
'co',
'com',
'come',
'comes',
'computer',
'con',
'concerning',
'consequently',
'consider',
'considering',
'contain',
'containing',
'contains',
'corresponding',
'could',
'couldn\'t',
'couldnt',
'course',
'cry',
'currently',
'd',
'de',
'definitely',
'describe',
'described',
'despite',
'detail',
'did',
'didn\'t',
'different',
'do',
'does',
'doesn\'t',
'doing',
'don\'t',
'done',
'down',
'downwards',
'due',
'during',
'e',
'each',
'early',
'edu',
'eg',
'eight',
'either',
'eleven',
'else',
'elsewhere',
'empty',
'enough',
'entirely',
'especially',
'et',
'etc',
'even',
'ever',
'every',
'everybody',
'everyone',
'everything',
'everywhere',
'ex',
'exactly',
'example',
'except',
'f',
'far',
'few',
'fifteen',
'fifth',
'fify',
'fill',
'find',
'fire',
'first',
'five',
'followed',
'following',
'follows',
'for',
'former',
'formerly',
'forth',
'forty',
'found',
'four',
'from',
'front',
'full',
'further',
'furthermore',
'g',
'get',
'gets',
'getting',
'give',
'given',
'gives',
'go',
'goes',
'going',
'gone',
'got',
'gotten',
'greetings',
'h',
'had',
'hadn\'t',
'happens',
'hardly',
'has',
'hasn\'t',
'hasnt',
'have',
'haven\'t',
'having',
'he',
'he\'s',
'hello',
'help',
'hence',
'her',
'here',
'here\'s',
'hereafter',
'hereby',
'herein',
'hereupon',
'hers',
'herself',
'hi',
'high',
'him',
'himself',
'his',
'hither',
'hopefully',
'how',
'howbeit',
'however',
'hundred',
'i',
'i\'d',
'i\'ll',
'i\'m',
'i\'ve',
'ie',
'if',
'ignored',
'immediate',
'in',
'inasmuch',
'inc',
'indeed',
'indicate',
'indicated',
'indicates',
'inner',
'insofar',
'instead',
'interest',
'into',
'inward',
'is',
'isn\'t',
'it',
'it\'d',
'it\'ll',
'it\'s',
'its',
'itself',
'j',
'just',
'k',
'keep',
'keeps',
'kept',
'know',
'known',
'knows',
'l',
'last',
'late',
'lately',
'later',
'latter',
'latterly',
'least',
'less',
'lest',
'let',
'let\'s',
'like',
'liked',
'likely',
'little',
'long',
'look',
'looking',
'looks',
'ltd',
'm',
'made',
'mainly',
'make',
'many',
'may',
'maybe',
'me',
'mean',
'meanwhile',
'merely',
'might',
'mill',
'mine',
'more',
'moreover',
'most',
'mostly',
'move',
'much',
'must',
'my',
'myself',
'n',
'name',
'namely',
'nd',
'near',
'nearly',
'necessary',
'need',
'needs',
'neither',
'never',
'nevertheless',
'new',
'next',
'nine',
'no',
'nobody',
'non',
'none',
'noone',
'nor',
'normally',
'not',
'nothing',
'novel',
'now',
'nowhere',
'o',
'obviously',
'of',
'off',
'often',
'oh',
'ok',
'okay',
'old',
'on',
'once',
'one',
'ones',
'only',
'onto',
'or',
'other',
'others',
'otherwise',
'ought',
'our',
'ours',
'ourselves',
'out',
'outside',
'over',
'overall',
'own',
'p',
'part',
'particular',
'particularly',
'per',
'perhaps',
'placed',
'please',
'plus',
'possible',
'presumably',
'probably',
'provides',
'put',
'puts',
'q',
'que',
'quite',
'qv',
'r',
'rather',
'rd',
're',
'really',
'reasonably',
'regarding',
'regardless',
'regards',
'relatively',
'respectively',
'right',
's',
'said',
'same',
'saw',
'say',
'saying',
'says',
'second',
'secondly',
'see',
'seeing',
'seem',
'seemed',
'seeming',
'seems',
'seen',
'self',
'selves',
'sensible',
'sent',
'serious',
'seriously',
'seven',
'several',
'shall',
'she',
'should',
'shouldn\'t',
'show',
'side',
'since',
'sincere',
'six',
'sixty',
'so',
'some',
'somebody',
'somehow',
'someone',
'something',
'sometime',
'sometimes',
'somewhat',
'somewhere',
'soon',
'sorry',
'specified',
'specify',
'specifying',
'spite',
'still',
'sub',
'such',
'sup',
'sure',
'system',
't',
't\'s',
'take',
'taken',
'tell',
'ten',
'tends',
'th',
'than',
'thank',
'thanks',
'thanx',
'that',
'that\'s',
'thats',
'the',
'their',
'theirs',
'them',
'themselves',
'then',
'thence',
'there',
'there\'s',
'thereafter',
'thereby',
'therefore',
'therein',
'theres',
'thereupon',
'therewith',
'these',
'they',
'they\'d',
'they\'ll',
'they\'re',
'they\'ve',
'thick',
'thin',
'think',
'third',
'this',
'thorough',
'thoroughly',
'those',
'though',
'three',
'through',
'throughout',
'thru',
'thus',
'to',
'together',
'too',
'took',
'top',
'toward',
'towards',
'tried',
'tries',
'truly',
'try',
'trying',
'twelve',
'twenty',
'twice',
'two',
'u',
'un',
'under',
'unfortunately',
'unless',
'unlikely',
'until',
'unto',
'up',
'upon',
'us',
'use',
'used',
'useful',
'uses',
'using',
'usually',
'uucp',
'v',
'value',
'various',
'very',
'via',
'viz',
'vs',
'w',
'want',
'wants',
'was',
'wasn\'t',
'way',
'we',
'we\'d',
'we\'ll',
'we\'re',
'we\'ve',
'welcome',
'well',
'went',
'were',
'weren\'t',
'what',
'what\'s',
'whatever',
'when',
'whence',
'whenever',
'where',
'where\'s',
'whereafter',
'whereas',
'whereby',
'wherein',
'whereupon',
'wherever',
'whether',
'which',
'while',
'whither',
'who',
'who\'s',
'whoever',
'whole',
'whom',
'whose',
'why',
'will',
'willing',
'wish',
'with',
'within',
'without',
'won\'t',
'wonder',
'would',
'wouldn\'t',
'x',
'y',
'yes',
'yet',
'you',
'you\'d',
'you\'ll',
'you\'re',
'you\'ve',
'your',
'yours',
'yourself',
'yourselves',
'z',
'zero'
);
?>

View File

@@ -0,0 +1,921 @@
<?php
// French stoplist
$stoplist = array(
'$',
'\'en',
'-ce',
'-ci',
'-elle',
'-elles',
'-en',
'-il',
'-ils',
'-je',
'-la',
'-le',
'-les',
'-leur',
'-lui',
'-là',
'-moi',
'-nous',
'-on',
'-t',
'-toi',
'-tu',
'-vous',
'-y',
'A',
'Ap.',
'Apr.',
'B',
'C',
'Ca',
'D',
'E',
'F',
'G',
'GHz',
'H',
'I',
'J',
'K',
'L',
'M',
'MHz',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'USD',
'V',
'W',
'X',
'Z',
'a',
'afin',
'afin d\'',
'afin de',
'afin qu\'',
'afin que',
'ah',
'ai',
'aie',
'aient',
'aies',
'ailleurs',
'ainsi',
'ainsi qu\'',
'ainsi que',
'ait',
'alentour',
'alias',
'allaient',
'allais',
'allait',
'allez',
'allons',
'alors',
'alors qu\'',
'alors que',
'après',
'après qu\'',
'après que',
'après-demain',
'arrière',
'as',
'assez',
'attendu',
'au',
'au cours d\'',
'au cours de',
'au cours des',
'au cours du',
'au regard d\'',
'au regard de',
'au regard des',
'au regard du',
'au sein d\'',
'au sein de',
'au sein des',
'au sein du',
'au sujet d\'',
'au sujet de',
'au sujet des',
'au sujet du',
'au travers d\'',
'au travers de',
'au travers des',
'au travers du',
'au-dedans',
'au-dehors',
'au-delà',
'au-delà d\'',
'au-delà de',
'au-delà des',
'au-delà du',
'au-dessous',
'au-dessus',
'au-devant',
'au-devant d\'',
'au-devant de',
'au-devant des',
'au-devant du',
'aucun',
'aucune',
'audit',
'aujourd\'',
'aujourd\'hui',
'auparavant',
'auprès',
'auprès d\'',
'auprès de',
'auprès des',
'auprès du',
'auquel',
'aura',
'aurai',
'auraient',
'aurais',
'aurait',
'auras',
'aurez',
'auriez',
'aurions',
'aurons',
'auront',
'aussi',
'aussi bien qu\'',
'aussi bien que',
'aussitôt',
'autant',
'autour',
'autour d\'',
'autour de',
'autour des',
'autour du',
'autre',
'autrefois',
'autres',
'autrui',
'aux',
'auxdites',
'auxdits',
'auxquelles',
'auxquels',
'avaient',
'avais',
'avait',
'avant',
'avant qu\'',
'avant que',
'avant-hier',
'avec',
'avez',
'aviez',
'avions',
'avoir',
'avons',
'ayant',
'ayez',
'ayons',
'bah',
'banco',
'beaucoup',
'ben',
'bien',
'bientôt',
'bis',
'bon',
'bé',
'c\'',
'c\'est-à-dire',
'c.-à-d.',
'cahin-caha',
'car',
'ce',
'ceci',
'cela',
'celle',
'celle-ci',
'celle-là',
'celles',
'celles-ci',
'celles-là',
'celui',
'celui-ci',
'celui-là',
'cent',
'cents',
'cependant',
'certain',
'certaine',
'certaines',
'certains',
'certes',
'ces',
'cet',
'cette',
'ceux',
'ceux-ci',
'ceux-là',
'cf.',
'cg',
'cgr',
'chacun',
'chacune',
'chaque',
'cher',
'chez',
'ci',
'ci-après',
'ci-dessous',
'ci-dessus',
'cinq',
'cinquante',
'cinquante et un',
'cinquante et une',
'cinquante-cinq',
'cinquante-deux',
'cinquante-et-un',
'cinquante-huit',
'cinquante-neuf',
'cinquante-quatre',
'cinquante-sept',
'cinquante-six',
'cinquante-trois',
'cl',
'cm',
'combien',
'comme',
'comment',
'contrario',
'contre',
'crescendo',
'céans',
'd\'',
'd\'abord',
'd\'accord',
'd\'affilée',
'd\'ailleurs',
'd\'après',
'd\'arrache-pied',
'd\'emblée',
'dans',
'davantage',
'de',
'de la part d\'',
'de la part de',
'de la part des',
'de la part du',
'de ladite',
'de laquelle',
'de même qu\'',
'de même que',
'de peur qu\'',
'de peur que',
'debout',
'dedans',
'dehors',
'delà',
'demain',
'depuis',
'derechef',
'derrière',
'des',
'desdites',
'desdits',
'desquelles',
'desquels',
'dessous',
'dessus',
'deux',
'devant',
'devers',
'dg',
'die',
'différentes',
'différents',
'dire',
'dis',
'disent',
'dit',
'dito',
'divers',
'diverses',
'dix',
'dix-huit',
'dix-neuf',
'dix-sept',
'dl',
'dm',
'donc',
'dont',
'dorénavant',
'douze',
'du',
'dudit',
'duquel',
'durant',
'dès',
'dès lors qu\'',
'dès lors que',
'dès qu\'',
'dès que',
'déjà',
'désormais',
'dû',
'eh',
'elle',
'elles',
'en',
'en cours d\'',
'en cours de',
'en deçà',
'en dépit d\'',
'en dépit de',
'en dépit des',
'en dépit du',
'en faveur d\'',
'en faveur de',
'en faveur des',
'en faveur du',
'en marge d\'',
'en marge de',
'en marge des',
'en marge du',
'en matière d\'',
'en matière de',
'en raison d\'',
'en raison de',
'en raison des',
'en raison du',
'en vertu d\'',
'en vertu de',
'en vertu du',
'en vue d\'',
'en vue de',
'en vue des',
'en vue du',
'en-dehors d\'',
'en-dehors de',
'en-dehors des',
'en-dehors du',
'encore',
'enfin',
'ensemble',
'ensuite',
'entre',
'entre-temps',
'envers',
'environ',
'es',
'est',
'et',
'et/ou',
'etc',
'eu',
'eu égard au',
'eu égard aux',
'eu égard à',
'eue',
'eues',
'euh',
'eurent',
'eus',
'eusse',
'eussent',
'eusses',
'eussiez',
'eussions',
'eut',
'eux',
'exprès',
'extenso',
'extremis',
'eûmes',
'eût',
'eûtes',
'facto',
'faire',
'fais',
'faisaient',
'faisais',
'faisait',
'faisons',
'fait',
'faites',
'fallait',
'faudrait',
'faut',
'fi',
'flac',
'fors',
'fort',
'forte',
'fortiori',
'frais',
'fur',
'furent',
'fus',
'fusse',
'fussent',
'fusses',
'fussiez',
'fussions',
'fut',
'fûmes',
'fût',
'fûtes',
'gr',
'grosso',
'grâce au',
'grâce aux',
'grâce à',
'guère',
'ha',
'han',
'haut',
'hein',
'hem',
'heu',
'hg',
'hier',
'hl',
'hm',
'holà',
'hop',
'hormis',
'hors',
'hui',
'huit',
'hum',
'hé',
'ibidem',
'ici',
'ici-bas',
'idem',
'il',
'illico',
'ils',
'ipso',
'item',
'j\'',
'jadis',
'jamais',
'je',
'jusqu\'',
'jusqu\'au',
'jusqu\'aux',
'jusqu\'à',
'jusque',
'juste',
'kg',
'km',
'l\'',
'l\'autre',
'l\'on',
'l\'un',
'l\'une',
'la',
'la leur',
'la mienne',
'la nôtre',
'la sienne',
'la tienne',
'la vôtre',
'laquelle',
'le',
'le leur',
'le mien',
'le nôtre',
'le sien',
'le tien',
'le vôtre',
'lequel',
'les',
'les autres',
'les leurs',
'les miennes',
'les miens',
'les nôtres',
'les siennes',
'les siens',
'les tiennes',
'les tiens',
'les vôtres',
'lesquelles',
'lesquels',
'leur',
'leurs',
'lez',
'loin',
'longtemps',
'lors',
'lors d\'',
'lors de',
'lors des',
'lors du',
'lors même qu\'',
'lors même que',
'lorsqu\'',
'lorsque',
'lui',
'là',
'là-bas',
'là-dedans',
'là-dehors',
'là-derrière',
'là-dessous',
'là-dessus',
'là-devant',
'là-haut',
'lès',
'm\'',
'ma',
'maint',
'mainte',
'maintenant',
'maintes',
'maints',
'mais',
'mal',
'malgré',
'me',
'mes',
'mg',
'mgr',
'mieux',
'mil',
'mille',
'milliards',
'millions',
'minima',
'ml',
'mm',
'modo',
'moi',
'moins',
'mon',
'moult',
'moyennant',
'mt',
'même',
'mêmes',
'n\'',
'naguère',
'ne',
'neuf',
'ni',
'non',
'nonante',
'nonobstant',
'nos',
'notre',
'nous',
'nul',
'nulle',
'néanmoins',
'octante',
'oh',
'on',
'ont',
'onze',
'or',
'ou',
'ouais',
'oui',
'outre',
'où',
'par',
'par rapport au',
'par rapport aux',
'par rapport à',
'par-ci',
'par-delà',
'par-derrière',
'par-dessous',
'par-dessus',
'par-devant',
'par-là',
'parbleu',
'parce',
'parce qu\'',
'parce que',
'parfois',
'parmi',
'partout',
'pas',
'pas grand-chose',
'passim',
'passé',
'pendant',
'personne',
'petto',
'peu',
'peut',
'peut-être',
'peuvent',
'peux',
'pis',
'plus',
'plus d\'un',
'plus d\'une',
'plusieurs',
'plutôt',
'point',
'posteriori',
'pour',
'pour qu\'',
'pour que',
'pourquoi',
'pourtant',
'pourvu qu\'',
'pourvu que',
'presqu\'',
'presque',
'primo',
'priori',
'prou',
'près',
'préalable',
'pu',
'puis',
'puisqu\'',
'puisque',
'qu\'',
'qua',
'quand',
'quant au',
'quant aux',
'quant à',
'quarante',
'quarante et un',
'quarante et une',
'quarante-cinq',
'quarante-deux',
'quarante-et-un',
'quarante-huit',
'quarante-neuf',
'quarante-quatre',
'quarante-sept',
'quarante-six',
'quarante-trois',
'quasi',
'quatorze',
'quatre',
'quatre-vingt',
'quatre-vingt-cinq',
'quatre-vingt-deux',
'quatre-vingt-dix',
'quatre-vingt-dix-huit',
'quatre-vingt-dix-neuf',
'quatre-vingt-dix-sept',
'quatre-vingt-douze',
'quatre-vingt-huit',
'quatre-vingt-neuf',
'quatre-vingt-onze',
'quatre-vingt-quatorze',
'quatre-vingt-quatre',
'quatre-vingt-quinze',
'quatre-vingt-seize',
'quatre-vingt-sept',
'quatre-vingt-six',
'quatre-vingt-treize',
'quatre-vingt-trois',
'quatre-vingt-un',
'quatre-vingt-une',
'quatre-vingts',
'que',
'quel',
'quelle',
'quelles',
'quelqu\'',
'quelqu\'un',
'quelqu\'une',
'quelque',
'quelque chose',
'quelquefois',
'quelques',
'quelques-unes',
'quelques-uns',
'quels',
'qui',
'quiconque',
'quinze',
'quoi',
'quoiqu\'',
'quoique',
'revoici',
'revoilà',
'rien',
's\'',
'sa',
'sans',
'sauf',
'se',
'secundo',
'seize',
'selon',
'sensu',
'sept',
'septante',
'sera',
'serai',
'seraient',
'serais',
'serait',
'seras',
'serez',
'seriez',
'serions',
'serons',
'seront',
'ses',
'si',
'sic',
'sine',
'sinon',
'situ',
'sitôt',
'six',
'soi',
'soient',
'sois',
'soit',
'soixante',
'soixante et onze',
'soixante et un',
'soixante-cinq',
'soixante-deux',
'soixante-dix',
'soixante-dix-huit',
'soixante-dix-neuf',
'soixante-dix-sept',
'soixante-douze',
'soixante-et-onze',
'soixante-et-un',
'soixante-et-une',
'soixante-huit',
'soixante-neuf',
'soixante-quatorze',
'soixante-quatre',
'soixante-quinze',
'soixante-seize',
'soixante-sept',
'soixante-six',
'soixante-treize',
'soixante-trois',
'sommes',
'son',
'sont',
'soudain',
'sous',
'souvent',
'soyez',
'soyons',
'stricto',
'suis',
'suite à',
'sur',
'sur-le-champ',
'surtout',
'sus',
't\'',
'ta',
'tacatac',
'tandis qu\'',
'tandis que',
'tant',
'tantôt',
'tard',
'te',
'tel',
'telle',
'telles',
'tels',
'ter',
'tes',
'toi',
'ton',
'toujours',
'tous',
'tout',
'toute',
'toutefois',
'toutes',
'treize',
'trente',
'trente et un',
'trente et une',
'trente-cinq',
'trente-deux',
'trente-et-un',
'trente-huit',
'trente-neuf',
'trente-quatre',
'trente-sept',
'trente-six',
'trente-trois',
'trois',
'trop',
'très',
'tu',
'tôt',
'un',
'une',
'unes',
'uns',
'va',
'vais',
'vas',
'vers',
'veut',
'veux',
'via',
'vice-versa',
'vingt',
'vingt et un',
'vingt et une',
'vingt-cinq',
'vingt-deux',
'vingt-huit',
'vingt-neuf',
'vingt-quatre',
'vingt-sept',
'vingt-six',
'vingt-trois',
'vis-à-vis',
'vite',
'vitro',
'vivo',
'voici',
'voilà',
'voire',
'volontiers',
'vos',
'votre',
'vous',
'y',
'zéro',
'à',
'à l\'encontre d\'',
'à l\'encontre de',
'à l\'encontre des',
'à l\'encontre du',
'à l\'instar d\'',
'à l\'instar de',
'à l\'instar des',
'à l\'instar du',
'à l\'insu d\'',
'à l\'insu de',
'à l\'insu des',
'à l\'insu du',
'à l\'issue d\'',
'à l\'issue de',
'à l\'issue des',
'à l\'issue du',
'à l\'occasion d\'',
'à l\'occasion de',
'à l\'occasion des',
'à l\'occasion du',
'à l\'égard d\'',
'à l\'égard de',
'à l\'égard des',
'à l\'égard du',
'à la suite d\'',
'à la suite de',
'à la suite des',
'à la suite du',
'à ladite',
'à laquelle',
'à même d\'',
'à même de',
'à partir d\'',
'à partir de',
'à partir des',
'à partir du',
'à travers',
'ç\'',
'ça',
'çà',
'ès',
'étaient',
'étais',
'était',
'étant',
'étiez',
'étions',
'été',
'êtes',
'être',
'ô',
);
?>

View File

@@ -0,0 +1,75 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
#INCLURE "meta.html"
</head>
<body>
<div id="wrapper">
<div id="subwrapper">
#INCLURE "entete.html"
<div id="chemin">
Vous &ecirc;tes ici :<a href="#URLSOMMAIRE">Accueil boutique</a> / <THELIA_chemrub type="CHEMIN" rubrique="#RUBRIQUE_ID"><THELIA_rubdetchem type="RUBRIQUE" id="#ID"><a href="#URL">#TITRE</a> /</THELIA_rubdetchem></THELIA_chemrub>Recherche : #PRODUIT_MOTCLE
</div>
#INCLURE"menu.html"
<div id="contenuPageRubrique">
<h2>Votre recherche : "#PRODUIT_MOTCLE"</h2>
<T_PROD>
<!--
Utilisez le param<61>tre exact="1" pour rechercher exactement les mots indiqu<71>s
Les param<61>tres mode et exact doivent <20>tre report<72>s dans les boucles de pagination
-->
<THELIA_PROD type="RECHERCHE" mode="et" exact="0" boucle="produit" rubrique="#RUBRIQUE_ID" classement="inverse" motcle="#PRODUIT_MOTCLE" num="12">
<div class="petitBlocProduit">
<h3><a href="#URL">#TITRE</a></h3>
<div class="contenu">
<a href="#URL" class="image"><THELIA_IMAGE type="IMAGE" num="1" produit="#ID" largeur="140" >
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="middle">
<img src="#IMAGE" alt="#PRODTITRE" title="#PRODTITRE"/>
</td>
</tr>
</table>
</THELIA_IMAGE></a>
<div class="description">
<span class="chapo">#CHAPO</span>
<span class="prixProduit">#PROMO[#PRIX2 &euro; <span class="chapo">au lieu de #PRIX &euro;</span>][#PRIX]</span>
<p><a class="acheter" href="#PANIER"><span><span>Ajouter au panier</span></span></a></p>
<p><a class="acheter" href="#URL"><span><span>En savoir +</span></span></a></p>
</div>
</div>
</div>
#FILTRE_modulo(#COMPT||2||<div class="separation"></div>)
</THELIA_PROD>
<div id="pages">
<!--
Les param<61>tres mode et exact doivent avoir la m<>me valeur que dans la boucle produit
-->
<THELIA_PAGEPREC type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" typeaff="0" motcle="#PRODUIT_MOTCLE" avance="precedente">
<a href="#URLFOND(recherche,rechpage=#PAGE_PREC&motcle=#MOTCLE)" class="LIEN_pages">Page pr&eacute;c&eacute;dente</a>
</THELIA_PAGEPREC>
<THELIA_CPAGE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="1">
|
<THELIA_PAGECONT_PASCOUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="0" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
<a href="#URLFOND(recherche,rechpage=#PAGE_NUM&motcle=#MOTCLE)" class="LIEN_pages">#PAGE_NUM</a>
</THELIA_PAGECONT_PASCOUR>
<THELIA_PAGECONT_COUR type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" courante="1" motcle="#PRODUIT_MOTCLE" pagecourante="#PAGE_NUM" max="10" typeaff="1">
#PAGE_NUM
</THELIA_PAGECONT_COUR>
</THELIA_CPAGE>
<THELIA_PAGE_SUIVANTE type="RECHERCHE" boucle="PAGE" mode="et" exact="0" type_page="PRODUIT" rubrique="#RUBRIQUE_ID" num="12" max="10" motcle="#PRODUIT_MOTCLE" typeaff="0" avance="suivante">
|
<a href="#URLFOND(recherche,rechpage=#PAGE_SUIV&motcle=#MOTCLE)" class="LIEN_pages">Page suivante</a>
</THELIA_PAGE_SUIVANTE>
</div>
</T_PROD>
<p><strong>Nous sommes d&eacute;sol&eacute;s, aucun r&eacute;sultat ne correspond &agrave; votre recherche.</strong></p>
<//T_PROD>
</div>
#INCLURE "pied.html"
#INCLURE "signature.html"
</div>
</div>
</body>
</html>