Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

No changes between revisions

Ignore whitespace Rev 3 → Rev 11

/trunk/scripts/modules/coste/CreationCol.php
New file
0,0 → 1,348
<?php
/**
* declare(encoding='UTF-8');
* Exemple de lancement du script : :
* /opt/lampp/bin/php cli.php coste/creationcol -a nomSciHtml -v 3
* Classe permettant de créer le nom scientifique au format HTML.
*
* @category php 5.2
* @package eflore/scripts/coste
* @author Jennifer DHÉ <jennifer@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class Creationcol extends Script {
protected $bdd = null;
protected $table = null;
protected $num = null;
protected $compo_nom = array();
protected $abbr = array (
'infra-gen.' => 'Infra-Genre',
'sect.' => 'Section',
'subsect.' => 'Sous-Section',
'ser.' => 'Série',
'subser.' => 'Sous-Série',
'gr.' => 'Groupe',
'agg.' => 'Agrégat',
'sp.' => 'Espèce',
'subsp.' => 'Sous-Espèce',
'infra-sp.' => 'Infra-Espèce',
'var.' => 'Variété',
'subvar.' => 'Sous-Variété',
'fa' => 'Forme',
'subf.' => 'Sous-Forme',
'f. sp.' => 'Forma species',
'proles' => 'Race prole'
);
private $nomSciTpl = '<span class=sci>%s</span>';
private $nomSupraGenTpl = '<span class="supra_gen">%s</span>';
private $genTpl = '<span class="gen">%s</span>';
private $infraGenTpl = '<span class="infra-gen">%s</span>';
private $spFHTpl = '<span class="gen">%s</span> <span class="sp">%s</span>';
private $typeEpitheteTpl = '<abbr class="type_epithete" title="%s">%s</abbr>';
private $infraSpFHTpl = '<span class="gen">%s</span> <span class="sp">%s</span> <abbr class="type-epithete" title="%s">%s</abbr> <span class="infra-sp">%s</span>';
private $formuleHybTpl = '<span class="formule-hyb">%s</span>';
protected $table_requete;
protected $limite_req_tuples = 10000;
protected $depart_req_tuples = 0;
 
protected $parametres_autorises = array(
'-t' => array(true, true, 'Nom de la table qui doit être traitée'));
 
public function executer() {
// Lancement de l'action demandée
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'nomSciHtml' :
$this->genererNomSciHtml();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
private function genererNomSciHtml() {
$this->initialiser();
 
$nbtot = $this->recupererNbTotalTuples();
while ($this->depart_req_tuples < $nbtot) {
$resultat = $this->recupererTuples();
$nb_tot_res = count($resultat);
$compteur = 1;
foreach ($resultat as $tuples => $infos) { //pour chaque tuple
$this->initialiserVariables($infos);
 
$nomSciHtml = '';
$nomSciHtml .= $this->ajouterBaliseNomSupraGen();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['genre'], 'gen');
$nomSciHtml .= $this->ajouterBaliseInfraGen();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['epithete_sp'], 'sp');
$nomSciHtml .= $this->ajouterBaliseTypeInfraSp();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['epithete_infra_sp'], 'infra-sp');
$nomSciHtml .= $this->ajouterCultivarGpComm();
 
if ($nomSciHtml != '') {
$this->table_requete[$this->num] = sprintf($this->nomSciTpl, trim($nomSciHtml));
}
if (count($this->table_requete) == 1000) {
$this->lancerRequeteModification();
array_splice($this->table_requete, 0);
} elseif ($compteur == $nb_tot_res) {
$this->lancerRequeteModification();
}
$compteur++;
$this->afficherAvancement('Génération des noms scientifique au format HTML en cours');
}
}
echo "\n";
}
 
private function initialiser() {
$this->bdd = new Bdd();
$this->table = $this->getParametre('t');
$this->preparerTable();
}
 
private function preparerTable() {
$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
$resultat = $this->bdd->recuperer($requete);
if ($resultat === false) {
$requete = "ALTER TABLE {$this->table} ".
'ADD nom_sci_html VARCHAR( 500 ) '.
'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
$this->bdd->requeter($requete);
}
}
 
private function recupererNbTotalTuples(){
$req = "SELECT count(*) AS nb FROM {$this->table} ";
$res = $this->bdd->recuperer($req);
return $res['nb'];
}
 
private function recupererTuples() {
$requete = 'SELECT num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
' epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
' nom_commercial, cultivar '.
"FROM {$this->table} ".
"LIMIT {$this->depart_req_tuples},{$this->limite_req_tuples} ";
 
$resultat = $this->bdd->recupererTous($requete);
$this->depart_req_tuples += 10000;
return $resultat;
}
 
private function initialiserVariables($infos) {
$this->num = $infos['num_nom'];
$this->compo_nom = $infos;
}
 
private function ajouterBaliseNomSupraGen() {
$html = '';
if ($this->compo_nom['nom_supra_generique'] != '') {
$html = sprintf($this->nomSupraGenTpl, $this->compo_nom['nom_supra_generique']);
}
return $html;
}
 
private function ajouterTypeEpithete($type) {
if (!array_key_exists($type, $this->abbr)) {
$this->abbr[$type] = $type;
}
}
 
private function ajouterBaliseInfraGen() {
$html = '';
if ($this->verifierTypeInfraGen()) {
$html .= $this->ajouterBaliseTypeInfraGen();
} else {
if ($this->avoirInfo('epithete_infra_generique')) {
$html .= sprintf($this->infraGenTpl, $this->compo_nom['epithete_infra_generique']);
}
}
return $html;
}
 
private function verifierTypeInfraGen() {
$ok = false;
if ($this->compo_nom['type_epithete'] != '' && $this->compo_nom['epithete_infra_generique'] != '') {
$this->ajouterTypeEpithete($this->compo_nom['type_epithete']);
$ok = true;
}
return $ok;
}
 
private function ajouterBaliseTypeInfraGen() {
$html = '';
$type = $this->compo_nom['type_epithete'];
 
if ($type == 'agg.') { // Ajout de l'infra gen avant le type s'il est égal à agg.
$html .= ' '.$this->ajouterBaliseInfraGen().
' '.sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type);
} else {
$html .= ' '.sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type).
' '.$this->ajouterBaliseInfraGen();
}
return $html;
}
 
private function ajouterBaliseTypeInfraSp() {
$html = '';
$type = $this->compo_nom['type_epithete'];
$infraSp = $this->compo_nom['epithete_infra_sp'];
 
if ($infraSp != '') {
if ($type != '') {
$this->ajouterTypeEpithete($type);
$html = sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type);
} else {
$message = "Nom #%s contient un épithète infra-spécifique mais son type n'est pas renseigné.";
$this->traiterErreur($message, array($this->num));
}
}
return $html;
}
 
private function ajouterCultivarGpComm() {
$html = '';
if ($this->avoirInfo('cultivar_groupe')) {
$html .= ' '.$this->ajouterCultivarGroupe();
}
if ($this->avoirInfo('nom_commercial')) {
$html .= ' <span class="commercial">'.$this->compo_nom['nom_commercial'].'</span>';
}
if ($this->avoirInfo('cultivar')) {
$html .= ' <span class="cultivar">\''.$this->compo_nom['cultivar'].'\'</span>';
}
return $html;
}
 
private function avoirInfo($valeur) {
return (isset($this->compo_nom[$valeur]) && $this->compo_nom[$valeur] != '') ? true : false;
}
 
/**
* Permet d'ajouter les groupes de cultivar en fonction de la présence d'un cultivar et de la présence d'un grex
*
* L'ensemble des individus obtenu par une fécondation particulière s'appelle un le Grex (que pour les orchidées).
* Au sein du grex, certains individus peuvent se distinguer par des formes, des coloris ou autres qui font que
* l'obtenteur du grex va les sélectionner.
* les noms de groupes de cultivars sont suivis de l'abréviation « Gp » et placés entre parenthèses
* les noms de grex, s'ils sont utilisés devant une épithète de cultivar, ne se mettent pas entre parenthèses
* ex : Cymbidium Alexanderi gx 'Westonbirt' (cultivar_groupe = Alexanderi gx) ;
* les noms de groupe se mettent entre parenthèses s'ils sont devant une épithète de cultivar
* ex : Dracaena fragrans (Deremenis Gp) 'Christianne' (cultivar_groupe = Deremenis)
* Un grex peut contenir des groupes (rédaction d'un exemple de l'ICNCP)
* ex : × Rhyncosophrocattleya Marie Lemon Stick grex Francis Suzuki Group
* ou : × Rhyncosophrocattleya Marie Lemon Stick gx Francis Suzuki Gp
* @param unknown_type $val
*
*/
private function ajouterCultivarGroupe() {
$html = '';
if ($this->avoirInfo('cultivar_groupe')) { //si le champ cultivar_groupe n'est pas vide
if ($this->compo_nom['cultivar']) { //si il y a un cultivar, on ajoute des parenthèses au group (mais pas au grex)
if (strrpos($this->compo_nom['cultivar_groupe'], ' gx ') !== false) { //si le grex est composé de groupe
$tab_gp = explode(' gx ', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].
' <abbr title="grex">gx </abbr>('.$tab_gp[1].
' <abbr title="groupe">Gp</abbr>)</span>';
} elseif (strrpos($this->compo_nom['cultivar_groupe'], ' gx') !== false) { //si il y a un grex et pas de groupe
$tab_gp = explode(' gx', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].' <abbr title="grex">gx</abbr></span>';
} else { //si il n'y a pas de grex mais un groupe
$html = ' <span class="gp">'.$this->compo_nom['cultivar_groupe'].' <abbr title="groupe">Gp</abbr>)</span>';
}
} else { //s'il n'y a pas de cultivar
if (strrpos($this->compo_nom['cultivar_groupe'], ' gx ') !== false) { //si le grex est composé de groupe
$tab_gp = explode(' gx ', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].
' <abbr title="grex">gx</abbr>'.$tab_gp[1].
' <abbr title="groupe">Gp</abbr></span>';
} elseif (strrpos($this->compo_nom['cultivar_groupe'], ' gx') !== false) { //si il y a un grex et pas de groupe
$tab_gp = explode(' gx', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].' <abbr title="grex">gx</abbr></span>';
} else { //si il n'y a pas de grex mais un groupe
$html = ' <span class="gp">'.$this->compo_nom['cultivar_groupe'].' <abbr title="groupe">Gp</abbr></span>';
}
}
}
return $html;
}
 
/**
*
* Permet de repérer s'il s'agit d'un hybride (infra-sp, genre, sp) ou d'une chimère.
* @param unknown_type $val
* @param unknown_type $type
*/
private function verifierHybridite($epithete, $type) {
$html = '';
if ($epithete != '') {
if (substr($epithete, 0, 2) == 'x ') {
$html = ' <span class=hyb>x <span class="'.$type.'">'.str_replace('x ', '', $epithete).'</span></span>';
} elseif (substr($epithete, 0, 2) == '+ ') {
$html = ' <span class=chimere>+ <span class="'.$type.'">'.str_replace('+ ', '', $epithete).'</span></span>';
} else if (substr_count($epithete, ' x ') > 1) {// Cas d'une formule d'hybridité comprenant des parents hybrides
$html = ' '.$this->insererBaliseFormuleHyb($epithete);
} elseif (substr_count($epithete, ' x ') == 1) {// Cas d'une formule d'hybridité simple
$html = ' '.$this->ajouterFomuleHybridite($epithete, $type);
} else {
$html = ' <span class="'.$type.'">'.$epithete.'</span>';
}
}
return $html;
}
 
private function ajouterFomuleHybridite($formule, $type) {
$tab_x = explode(' x ', $formule);
$formule_hyb = array();
switch ($type) {
case 'gen' :
foreach ($tab_x as $hyb) {
$formule_hyb[] = sprintf($this->genTpl, $hyb);
}
break;
case 'sp' :
foreach ($tab_x as $hyb) {
if (substr_count($hyb, ' ') >= 1) {
list($gen, $sp) = explode(' ', $hyb);
$formule_hyb[] = sprintf($this->spFHTpl, $gen, $sp);
} else {
$avertissement = "Nom #%s : la valeur d'hybride '%s' ne contenait pas d'espace .";
$this->traiterAvertissement($avertissement, array($this->num, $hyb));
}
}
break;
case 'infra-sp' :
foreach ($tab_x as $hyb) {
list($gen, $sp, $typeEpithete, $infraSp) = explode (' ', $hyb);
$formule_hyb[] = sprintf($this->infraSpFHTpl, $gen, $sp, $this->abbr[$typeEpithete], $typeEpithete, $infraSp);
}
break;
default : break;
}
return $this->insererBaliseFormuleHyb(implode(' x ', $formule_hyb));
}
 
private function insererBaliseFormuleHyb($formule) {
return sprintf($this->formuleHybTpl, $formule);
}
 
private function lancerRequeteModification() {
foreach ($this->table_requete as $id => $html) {
$html = $this->bdd->proteger($html);
$requete = "UPDATE {$this->table} ".
"SET nom_sci_html = $html ".
"WHERE num_nom = $id ";
$res = $this->bdd->requeter($requete);
if ($res === false) {
$this->traiterErreur("erreur d'insertion pour le tuple %s", array($id));
}
}
}
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/scripts/modules/coste/A_LIRE.txt
New file
0,0 → 1,15
Les scripts DescriptionSp.php et Cles.php, lancés dans cet ordre permettent respectivement :
- La récupération des descriptions des espèces.
- Insertions des textes dans la table coste_pages,
- Insertions des titres des espèces dans la table coste_triples
- Création de la table correspondance BDNFF
- La génération des num_nom du projet coste
- L'insertion des num_nom dans coste_triples
- La création de la table coste_v0_1
- La recupération des clés et des descriptions des groupes, familles et genre.
- Insertion dans la table coste_pages des textes
- Insertion dans la table coste_triples des num_nom et des titres
Un script permettant de lancer ces deux derniers a été créé : CreationProjetCoste.php.
Le dernier script est celui d'ajout du nom_sci_html (creationCol.php) à la table coste.
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:eol-style
+native
\ No newline at end of property
/trunk/scripts/modules/coste/Cles.php
New file
0,0 → 1,651
<?php
/**
* Exemple de lancement :
* /opt/lampp/bin/php cli.php coste/cles -a parser -d /home/jpm/eflore/donnees/coste/cles/html -v 3
* Classe analysant les clés de Coste en HTML.
*
* @category php 5.2
* @package eflore/scripts/coste
* @author Jennifer DHÉ <jennifer@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class Cles extends Script {
 
private $bdd = null;
private $fichier = null;
private $ligneNumero = null;
private $contenu = null;
private $pages = array();
private $stats = array('nbreDsc' => 0, 'nbreCle' => 0, 'nbreGenre' => 0, 'nbreFamille' => 0, 'nbreDscClasse' => 0, 'nbrCleClasse' => 0);
protected $parametres_autorises = array(
'-d' => array(false, null, 'nom du dossier à analyser'),
'-f' => array(false, null, 'nom du fichier à analyser'));
 
private $table_triples = array(); //permet de stocker
private $famille = ''; //permet de stocker le nom de la famille surlaquelle on travaille
protected $indexGpFG = array();
protected $table_espece = array();
protected $table_num_nom = array();
protected $projet_coste = array();
protected $nb_fichier = 0;
protected $nb_pages = 0;
protected $table_coste;
 
 
public function initialiser() {
$this->bdd = new Bdd();
}
 
public function executer() {
 
$this->initialiser();
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'tester' :
$this->test();
break;
case 'parser' :
$this->recupererTableCoste();
$this->chargerIndexGpFG();
$this->parserFichiers();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
 
private function test() {
//on recupère les textes
$this->fichier = $this->getParametre('f');
$this->parserFichier();
$fichier_test = str_replace('.html', '-test.html', $this->getParametre('f'));
file_put_contents($fichier_test, $this->contenu);
 
 
 
}
 
 
private function parserFichiers() {
 
$nomDossier = $this->getParametre('d');
$tableaux = null;
if (file_exists($nomDossier) === true) {
if (is_dir($nomDossier)) {
if ($dossierOuvert = opendir($nomDossier) ) {
while ( ($nomFichier = readdir($dossierOuvert)) !== false) {
if (!is_dir($nomFichier) ) {
$this->fichier = $nomDossier.DS.$nomFichier;
$this->parserFichier();
}
}
$this->traiterInfo('Nb de fichier : '.$this->nb_fichier);
$this->traiterInfo('Nb de pages : '.$this->nb_pages);
closedir($dossierOuvert);
} else {
$this->traiterErreur("Le dossier $nomDossier n'a pas pu être ouvert.");
}
} else {
$this->traiterErreur("$nomDossier n'est pas un dossier.");
}
} else {
$this->traiterErreur("Le dossier $nomDossier est introuvable.");
}
$this->afficherStats();
}
 
 
private function parserFichier() {
$this->nb_fichier++;
$contenu = $this->recupererContenuFichier($this->fichier);
$contenu = $this->nettoyerHtml($contenu);
$contenu = $this->supprimerDescriptionSp($contenu);
$contenu = $this->nettoyerTexte($contenu);
$this->contenu = $contenu;
$this->analyserCle($contenu);
$this->nettoyerParType();
$this->insererDansWikini();
$this->nb_pages += count($this->pages);
$this->pages = array();
$this->table_triples = array();
}
 
 
private function recupererContenuFichier($nomFichier) {
 
$contenu = null;
if (file_exists($nomFichier)) {
if (!$contenu = file_get_contents($nomFichier)) {
$this->traiterErreur("Le fichier $nomFichier n'a pas pu être ouvert.");
}
} else {
$this->traiterErreur("Le fichier $nomFichier est introuvable.");
}
return $contenu;
}
 
 
private function chargerIndexGpFG() {
 
$requete = 'SELECT * '.
'FROM coste_index_general ';
$resultat = $this->bdd->recupererTous($requete);
 
foreach ($resultat as $nom) {
$nom_coste = ($nom['nom_coste'] == '') ? $this->transliterer($nom['nom_sci']) : $this->transliterer($nom['nom_coste']);
$nom_sci = $this->transliterer($nom['nom_sci']);
$tome = $nom['tome'];
$page = $nom['page'];
$num_tax_sup_coste = $nom['num_tax_sup_coste'];
$num_nom_coste = $nom['num_nom_coste'];
$rang = $nom['rang'];
 
$this->indexGpFG[$nom_coste] = array( 'nom_sci' => $nom_sci,
'rang' => $rang,
'tome' => $tome,
'page' => $page,
'nom_coste' => $nom_coste,
'num_nom_coste' => $num_nom_coste,
'num_tax_sup_coste' => $num_tax_sup_coste
);
}
}
 
 
private function transliterer($txt) {
 
$txt = ucwords(strtolower(Chaine::supprimerAccents($txt)));
return trim($txt);
}
 
 
private function nettoyerHtml($contenu) {
 
$contenu = strip_tags($contenu, '<b><i><table><title>');
$expressions = array('/<b>\s*<\/b>/',
'/<i>\s*<\/i>/',
'/<title>[^<]+<\/title>/',
'/&shy;/');
$remplacements = '';
$contenu = preg_replace($expressions, $remplacements, $contenu);
return $contenu;
}
 
 
private function supprimerDescriptionSp($contenu) {
 
//on supprime les tables contenant les images et les descriptions des espèces
$contenu = preg_replace('/<table.+?<\/table>/uis', '', $contenu);
return $contenu;
}
 
private function nettoyerTexte($contenu) {
 
$remplacement = array('F\MILLE' => 'FAMILLE');
$contenu = strtr($contenu, $remplacement);
$expressions = array('/(?:\s*(?:\n|\r\n|\r))+/uis',
'/\n\s+<b>/uis',
'/^[ ]+/u',
'/[ ]{2,}/',
'/[.]\n[.]/us');
$remplacements = array("\n",
"\t<b>",
'',
' ',
".\n");
$contenu = preg_replace($expressions, $remplacements, $contenu);
return $contenu;
}
 
private function analyserCle($contenu) {
 
//creation des tags et des pages pour la table coste_page
$lignes = preg_split('/[\n]+/', $contenu);
$nom = '';
$texte = '';
$tag_wiki = '';
$nbre_lignes = count($lignes);
$num_famille = '';
 
foreach ($lignes as $this->ligneNumero => $ligne) {
$ligne = $ligne."\n";
 
if (preg_match('/^FAMILLE ([0-9]+)(?:[.]| ) (?:- |)([^ .$]+)/iu', strip_tags($ligne), $match)) {
//Description de la famille
$this->ajouterPage($tag_wiki, $texte);
$nom = $match[2];
 
$this->stats['nbreFamille']++;
$num_famille = $match[1];
$this->famille = $this->transliterer($match[2]);
$this->famille = $this->corrigerNom($this->famille);
 
$tag_wiki = $this->creerTagWiki($nom, 'Dsc');
$texte = $ligne;
 
 
} else if (preg_match('/^TABLEAU DES GENRES$/u', strip_tags($ligne))) {
//Clé de la famille
$this->ajouterPage($tag_wiki, $texte);
$tag_wiki = $this->creerTagWiki($nom, 'Cle');
$texte = $ligne;
 
} else if (preg_match('/^\s*(?:Genre|Cenre)\s*([0-9]+)(?:[.;]|)\s+(?:--|-|_|)\s*([^ ]+)\s+/ui', strip_tags($ligne), $match)) {
//Description des genres
$this->ajouterPage($tag_wiki, $texte);
$nom = $match[2];
$this->stats['nbreGenre']++;
$tag_wiki = $this->creerTagWiki($nom, 'Dsc');
$texte = $ligne;
$this->recupererDonneesGenre($ligne, $nom);
 
 
} else if (preg_match('/^TABLEAU DES ESP[ÈÉE]CES$/u', strip_tags($ligne))) {
//Clé du genre
$this->ajouterPage($tag_wiki, $texte);
$tag_wiki = $this->creerTagWiki($nom, 'Cle');
$texte = $ligne;
 
} else if (preg_match('/^<b>TABLE ANALYTIQUE DES FAMILLES<\/b>$/u', $ligne)) {
//recuperation des Groupes
$nom = 'Plantae';
$tag_wiki = $this->creerTagWiki($nom, 'Cle');
$texte = $ligne;
 
} else if (preg_match('/^<b>(?:1|[IV]+).\s+(?:-\s+){0,1}([A-ZÉÈ]+)[.]<\/b>$/u', $ligne, $match)) {
//recuperation pour chaque groupe la clé des familles
$this->ajouterPage($tag_wiki, $texte);
$nom = $match[1];
$tag_wiki = $this->creerTagWiki($nom, 'Cle');
$texte = $ligne;
 
} else if (preg_match('/^<b>ORDRE DES FAMILLES<\/b>$/u', $ligne)) {
//récupère les ordres des familles par groupe
$this->ajouterPage($tag_wiki, $texte);
$tag_wiki = 'OrdreFamilles';
$texte = $ligne;
//rajout des descriptions des classes (il y en a trois au total)
} else if (strrpos($ligne, 'Classe') !== false || strrpos($ligne, 'CRYPTOGAMES-VASCULAIRES') !== false || strrpos($ligne, 'MONOCOTYLÉDONES') !== false) {
if (strrpos($ligne, 'CRYPTOGAME') !== false) {
$this->ajouterPage($tag_wiki, $texte);
$nom = 'cryptogames';
$this->stats['nbreDscClasse']++;
$tag_wiki = $this->creerTagWiki($nom, 'Dsc');;
$texte = $ligne;
 
} elseif (strrpos($ligne, 'MONOCOTYLÉDONES') !== false) {
$this->ajouterPage($tag_wiki, $texte);
$nom = 'monocotylédones';
$this->stats['nbreDscClasse']++;
$tag_wiki = $this->creerTagWiki($nom, 'Dsc');
$texte = $ligne;
 
} else {
preg_match('/^(?:<i>){0,1}(?:Première|Deuxième)? Classe[.][-\s]*[^b]*b>([A-Z]+)<\/b>[.]?/ui', $ligne, $match);
$this->ajouterPage($tag_wiki, $texte);
 
if (isset($match[1])) {
$nom = $match[1];
$tag_wiki = $this->creerTagWiki($nom, 'Dsc');
$this->stats['nbreDscClasse']++;
$texte = $ligne;
} else {
$this->traiterErreur("Classe non repérée dans la ligne \"$ligne\" du fichier $this->fichier ! Modifier l'expression regulière");
}
}
 
} else if ($nbre_lignes == ($this->ligneNumero + 1)) {
$texte .= $ligne;
$this->ajouterPage($tag_wiki, $texte);
} else {
$texte .= $ligne;
}
}
}
 
 
private function recupererDonneesGenre($ligne, $nom) {
 
if (preg_match('/^\s*(?:Genre|Cenre)\s*(?:<i>)?[0-9]+(?:[.;]|)\s+(?:--|-|_|)\s*[^ ]+(.*)?$\s+/ui', strip_tags($ligne, '<i>'), $donnees)) {
$donnees_genre = array('nom_coste' => $nom, 'auteur' => '', 'nom_verna' => '');
if (isset($donnees[1]) && !empty($donnees[1])) {
// cas possible : <i>L. - Passerage.</i>
if (preg_match('/^(?:(?:^\s*<i>([^-]+)-([^-]+)))/ui', $donnees[1], $don)) {
if (isset($don[1])) {
$auteur = $don[1];
$donnees_genre['auteur'] = $auteur;
}
if (isset($don[2])) {
$nom_verna = $don[2];
$donnees_genre['nom_verna'] = $nom_verna;
}
} elseif (preg_match('/^(?:(^\s*[^-<>]*)(?:[-\s]*)(?:<i>(?:[-\s]*)([^<>]*))?)/ui', $donnees[1], $don)) {
if (isset($don[1])) {
$auteur = $don[1];
$donnees_genre['auteur'] = $auteur;
}
if (isset($don[2])) {
$nom_verna = $don[2];
$donnees_genre['nom_verna'] = $nom_verna;
}
} else{
$this->traiterErreur("Les donnees : $donnees[1] ne sont pas reconnues par l'expression régulière");
}
}
} else {
$this->traiterErreur("Le genre $ligne n'est pas reconnu par l'expression régulière");
}
//print_r($donnees_genre);
$this->insererDonneesGenre($donnees_genre);
}
 
 
private function insererDonneesGenre($donnees_genre) {
$nom_coste = $this->bdd->proteger($donnees_genre['nom_coste']);
$auteur = $this->bdd->proteger($donnees_genre['auteur']);
$nom_francais = $this->bdd->proteger($donnees_genre['nom_verna']);
$requete = 'UPDATE coste_v0_1 SET '.
'auteur = '.$auteur.
', nom_francais = '.$nom_francais
.' WHERE nom_coste = '.$nom_coste;
$res = $this->bdd->requeter($requete);
if (!$res) {
$e = 'Les données du genre '.$nom_coste.' n\'ont pas été insérée via la requete '.$requete;
$this->traiterErreur($e);
}
}
 
 
private function ajouterPage($tag, $txt) {
 
if ($txt != '' && $tag != '') {
$txt = $this->formaterSyntaxeWikini($txt);
$this->pages[$tag] = $txt;
}
}
 
 
private function formaterSyntaxeWikini($txt) {
 
$remplacements = array('<b>' => '**', '</b>' => '**',
'<i>' => '//', '</i>' => '//');
$txt = strtr($txt, $remplacements);
return $txt;
}
 
 
private function creerTagWiki($nom, $type) {
 
$tag = '';
$page = null;
$tome = null;
$nom_sci = '';
$groupe = array('Thalamiflores', 'Caliciflores', 'Monopetales', 'Monochlamydees', 'Gymnospermes', 'Monocotyledones', 'Cryptogames');
$nom = $this->transliterer($nom);
$nom = $this->corrigerNom($nom);
 
if (in_array($nom, $groupe) && $type == 'Cle') {
$pages = array('1', '4', '5', '9', '12', '12', '14');
$page = str_replace($groupe, $pages, $nom);
$page = sprintf('%04d', $page);
$tome = 1;
$tag = "{$type}Coste1937T{$tome}P{$page}$nom";
$this->stats['nbreCle']++;
$this->stats['nbrCleClasse']++;
} else {
if ($type == 'Dsc') {
$this->stats['nbreDsc']++;
} else if ($type == 'Cle') {
$this->stats['nbreCle']++;
}
if (array_key_exists($nom, $this->indexGpFG)) {
$tome = $this->indexGpFG[$nom]['tome'];
$page = $this->indexGpFG[$nom]['page'];
$nom_sci = $this->indexGpFG[$nom]['nom_sci'];
 
} else {
$this->traiterErreur("Impossible de trouver le nom $nom dans l'index pour le fichier $this->fichier à la ligne $this->ligneNumero.");
}
if (!is_null($page) && !is_null($tome)) {
$page = sprintf('%04d', $page);
$tome = strtr($tome, array('I' => 1, 'II' => 2, 'III' => 3, ));
$tag = "{$type}Coste1937T{$tome}P{$page}$nom_sci";
 
}
}
$this->creerTriples($tag, $nom, $tome, $page);
return $tag;
}
 
 
public function creerTriples($tag, $nom, $tome, $page) {
 
if (array_key_exists($nom, $this->indexGpFG)) {
$this->table_triples[] = array ('resource' => $tag,
'property' => 'titre',
'value' => $this->creerTitre($nom, $tag));
if (isset($this->table_coste[$nom])) {
$num_nom = $this->table_coste[$nom];
$this->table_triples[] = array ('resource' => $tag,
'property' => 'num_nom',
'value' => $num_nom);
} else {
$this->traiterErreur("Impossible de trouver le nom $nom dans la table coste");
}
} else {
$this->traiterErreur("Impossible de trouver le nom $nom dans l'index ");
}
}
 
 
private function recupererTableCoste() {
$table_coste = array();
$req = 'SELECT num_nom, nom_coste FROM coste_v0_1 WHERE rang != "290" ';
$res = $this->bdd->recupererTous($req);
if ($res) {
foreach ($res as $donnees) {
$this->table_coste[$donnees['nom_coste']] = $donnees['num_nom'];
}
} else {
$this->traiterErreur('Erreur dans la requete '.$req);
}
}
 
 
private function creerTitre($nom, $tag) {
$titre = '';
if (array_key_exists($nom, $this->indexGpFG)) {
$num_nom_coste = $this->indexGpFG[$nom]['num_nom_coste'];
$tome = $this->indexGpFG[$nom]['tome'];
if (preg_match('/^(?:Cle|Dsc)Coste1937T[1-3]{1}P[0]*([1-9]*).+$/', $tag, $match_page)) { //on recherche dans le tag puisque les clés et les descriprtions ont des pages différentes pour les classes par ex
$page = $match_page[1];
} else {
$this->traiterErreur('La page n\'est pas reconnu dans le tag '.$tag);
}
if ($num_nom_coste == 'R') {
$titre = "Coste $num_nom_coste - $nom - T$tome.p$page";
} else {
$num_tax_sup = $this->indexGpFG[$nom]['num_tax_sup_coste'];
$nom_tax_sup = $this->recupererNom($num_tax_sup);
$titre = "Coste $num_nom_coste - $nom - $num_tax_sup, $nom_tax_sup - T$tome.p$page";
}
} else {
$this->traiterErreur("Impossible de trouver le nom $nom dans l'index pour créer le titre");
}
return $titre;
}
 
 
private function recupererNom($id_coste) {
foreach ($this->indexGpFG as $donnees) {
if ($donnees['num_nom_coste'] == $id_coste) {
$nom = $donnees['nom_sci'];
break;
}
}
return $nom;
}
 
 
private function corrigerNom($nom) {
$remplacements = array('Ceraniacees' => 'Geraniacees',
'Sucowia' => 'Succowia',
'Tilla' => 'Tilia');
$nom = strtr($nom, $remplacements);
$nom = trim($nom);
return $nom;
}
 
 
private function nettoyerParType() {
foreach ($this->pages as $tag => $txt) {
if (preg_match('/^Cle/', $tag)) {
$txt = $this->nettoyerCle($txt);
}
$this->pages[$tag] = $txt;
}
}
 
 
private function nettoyerCle($txt) {
$txt = preg_replace('/([*]{2})(\s+)([A-Z])/u', '$2$1$3', $txt);
$txt = preg_replace('/(\w)\t(\w)/ui', '$1 $2', $txt);
$txt = preg_replace('/(\w)\s+([.])/ui', '$1$2', $txt);
$txt = preg_replace('/\n\s+(\(|[\*]{2}|[[:alpha:]éèàê]+|[0-9]+-[0-9]+ )/Uuis', ' $1', $txt);
$txt = preg_replace('/([.])\s+([\*]{2}|\(part.\))/ui', "$1\t$2", $txt);
$txt = preg_replace('/(n)oe(ud[s]?)/ui', "$1œ$2", $txt);
return $txt;
}
 
private function insererDansWikini() {
// Mise à jour éventuelle des pages existantes
/*$requete = 'DELETE FROM coste_pages '.
'WHERE tag LIKE '.$tag;
// ' OR tag LIKE "Cle%" '.
// ' OR tag LIKE "OrdreFamilles" ';
$this->bdd->requeter($requete);*/
 
 
//--------------insertion des pages-----------------------
 
$this->supprimerPagesExistantes();
$this->reinitialiserAutoIncrement('coste_pages');
$this->reinitialiserAutoIncrement('coste_triples');
 
foreach ($this->pages as $tag => $txt) {
 
$tag = $this->bdd->proteger($tag);
$time = 'NOW()';
$txt = $this->bdd->proteger($txt);
$latest = $this->bdd->proteger('Y');
$perimee = $this->bdd->proteger('N');
 
// Mise à jour éventuelle des pages existantes
/*$requete = 'UPDATE coste_pages '.
"SET latest = $perimee ".
"WHERE tag = $tag ";
$this->bdd->requeter($requete);*/
 
// Insertion du nouveau contenu
$requete = 'INSERT INTO coste_pages '.
'(tag, time, body, latest) '.
"VALUES ($tag, $time, $txt, $latest)";
$res = $this->bdd->requeter($requete);
if ($res) {
//$this->afficherAvancement('Insertion des pages du fichier '.$this->fichier);
} else {
$this->afficherAvancement('Erreur d\'insertion des pages du fichier '.$this->fichier);
}
}
//-----------insertions des triples-----------------------
foreach ($this->table_triples as $triple) {
$resource = $this->bdd->proteger($triple['resource']);
$property = $this->bdd->proteger($triple['property']);
$value = $this->bdd->proteger($triple['value']);
 
$requete_triple = "INSERT INTO coste_triples (resource, property, value) VALUES ($resource,$property ,$value)";
$res_triple = $this->bdd->requeter($requete_triple);
if ($res_triple) {
//$this->afficherAvancement('Insertion des triples du fichier '.$this->fichier);
} else {
$this->afficherAvancement('Erreur d\'insertion des triples du fichier '.$this->fichier);
}
}
 
}
 
 
public function supprimerPagesExistantes() {
foreach ($this->pages as $tag => $txt) {
 
$tag = $this->bdd->proteger($tag);
//suppression des tuples déjà existants
$requete = 'DELETE FROM coste_pages '.
'WHERE tag = '.$tag;
// ' OR tag LIKE "Cle%" '.
// ' OR tag LIKE "OrdreFamilles" ';
$this->bdd->requeter($requete);
 
$requete = 'DELETE FROM coste_triples '.
'WHERE resource LIKE '.$tag;
// ' OR tag LIKE "Cle%" '.
// ' OR tag LIKE "OrdreFamilles" ';
$this->bdd->requeter($requete);
 
}
}
 
 
private function reinitialiserAutoIncrement($table) {
 
$requete_max_id = 'SELECT max(id) from '.$table;
$id_max = $this->bdd->recuperer($requete_max_id);
$id_max = $id_max['max(id)'];
$id_max = $id_max+1;
 
$requete_pages = 'ALTER TABLE '.$table.' AUTO_INCREMENT = '.$id_max;
$this->bdd->requeter($requete_pages);
 
}
 
 
private function afficherStats() {
print_r($this->stats);
}
 
 
private function creerFichier($fichier, $tab, $chemin = null) {
 
if (!$chemin) {
$chemin = Config::get('chemin_test');
}
$intitule = '';
$nom_fichier = fopen($chemin.$fichier, 'w+');
foreach ($tab as $key => $val) {
if (is_array($val)) {
foreach ($val as $k => $v) {
$intitule .= $k."\t";
}
fwrite($nom_fichier, trim($intitule)."\n");
break;
}
}
 
foreach ($tab as $key => $val) {
if (is_array($val)) {
fwrite($nom_fichier, implode("\t", $val)."\n");
} else {
fwrite($nom_fichier, "\t$val\n");
}
}
fclose($nom_fichier);
}
 
 
}
?>
/trunk/scripts/modules/coste/CreationProjetCoste.php
New file
0,0 → 1,64
<?php
/**
* Classe permettant de lancer plusieurs scripts consécutivement.
* Exemple :
* /opt/lampp/bin/php cli.php description_sp -a coste/creation_projet_coste -a creer
* -d /home/jpm/eflore/donnees/coste/descriptions/html
* -c /home/jpm/eflore/donnees/coste/cles/html
*
* @category php 5.2
* @package eflore/scripts/coste
* @author Jennifer DHÉ <jennifer@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class CreationProjetCoste extends Script {
 
// commande : /opt/lampp/bin/php cli.php creation_projet_coste -a creer -v 3
 
protected $cle;
protected $dsc;
protected $creationTable;
protected $parametres_autorises = array(
'-d' => array(false, null, 'nom du dossier contenant les descriptions à analyser'),
'-c' => array(false, null, 'nom du fichier contenant les clés à analyser'));
 
public function initialiser() {
$this->bdd = new Bdd();
require_once './Cles.php';
require_once './DescriptionSp.php';
}
 
public function executer() {
 
$this->initialiser();
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'creer' :
$nomDuScript = 'description_sp';
$parametresCli = array('-a' => 'integrer',
'-n' => $this->getParametre('d'),
'-v' => '3');
$this->dsc = new DescriptionSp($nomDuScript, $parametresCli);
$this->traiterInfo('RECUPERATION DES DESCRIPTIONS');
$this->dsc->executer();
 
$nomDuScript = 'cles';
$parametresCli = array('-a' => 'parser',
'-d' => $this->getParametre('c'),
'-v' => '3');
$this->cle = new Cles($nomDuScript, $parametresCli);
$this->traiterInfo('RECUPERATION DES CLES');
$this->cle->executer();
break;
 
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
}
 
?>
/trunk/scripts/modules/coste/DescriptionSp.php
New file
0,0 → 1,736
<?php
 
// commande : /opt/lampp/bin/php cli.php description_sp -a tester -n /home/jennifer/Tela-botanica_projets/Coste/descriptions/html
 
class DescriptionSp extends Script {
 
protected $donnees = array();
protected $nb_espece = 0;
protected $donnees_espece = array();
protected $fichier;
protected $table_espece = array();
 
protected $parametres_autorises = array(
'-n' => array(true, null, 'nom du dossier à analyser'));
 
public function executer() {
$this->bdd = new Bdd();
 
// Lancement de l'action demandée
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'integrer' :
$this->ouvrirDossier();
$this->chargerIndexGpFG();
$this->integrerSynonyme();
ksort($this->table_espece);
$this->recupererDonneesBdnff();
$this->genererNumNom();
$this->insererNumNomDansTriples();
$this->creerTableCoste();
$this->insererTableProjetCoste();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
//---------------------------------FONCTION DE RECUPERATION DES DONNEES SUR LES ESPECES---------------------------------
 
private function ouvrirDossier() {
$this->supprimerPagesExistantes();
$this->reinitialiserAutoIncrement('coste_pages');
$this->reinitialiserAutoIncrement('coste_triples');
$nomDossier = $this->getParametre('n');
$tableaux = null;
if (file_exists($nomDossier) === true) {
if (is_dir($nomDossier)) {
if ($dossierOuvert = opendir($nomDossier) ) {
while ( ($nomFichier = readdir($dossierOuvert)) !== false) {
if ( !is_dir($nomFichier) && preg_match('/e[0-9]{4}\.htm/', $nomFichier)) {
$nomFichier = $nomDossier.'/'.$nomFichier;
$this->traiterFichier($nomFichier);
}
}
closedir($dossierOuvert);
} else {
$this->traiterErreur("Le dossier $nomDossier n'a pas pu être ouvert.");
}
} else {
$tableaux[$nomDossier] = $this->ouvrirFichier($nomDossier);
}
} else {
$this->traiterErreur("Le dossier $nomDossier est introuvable.");
}
$this->traiterInfo('Nombre d\'espèce : '.$this->nb_espece);
//$this->creerFichier('donneesEspeces.tsv', $this->donnees_espece, '/home/jennifer/Tela-botanica_projets/Coste/descriptions/');
return $tableaux;
}
 
private function supprimerPagesExistantes() {
//suppression des tuples déjà existants
$requete = 'DELETE FROM coste_pages WHERE id > 35';
$this->bdd->requeter($requete);
$requete = 'DELETE FROM coste_triples WHERE id > 1';
$this->bdd->requeter($requete);
$requete = 'DELETE FROM coste_correspondance_bdnff ';
$this->bdd->requeter($requete);
$this->traiterInfo('Table coste_pages, coste_triple et coste_correspondance_bdnff ont été vidés :)');
}
 
 
private function reinitialiserAutoIncrement($table) {
$requete_max_id = 'SELECT max(id) from '.$table;
$id_max = $this->bdd->recuperer($requete_max_id);
$id_max = $id_max['max(id)'];
$id_max = $id_max+1;
$requete_pages = 'ALTER TABLE '.$table.' AUTO_INCREMENT = '.$id_max;
$this->bdd->requeter($requete_pages);
}
 
 
private function traiterFichier($nomFichier) {
$donnees = $this->ouvrirFichier($nomFichier);
if ($donnees['ouvert'] == "oui") {
$donneesTag = $this->creerNomPage($donnees['tag']);
//on insère le triple titre dans coste_triples
$this->donnees_espece[] = $donneesTag;
$requetePage = 'INSERT INTO coste_pages (tag, time, body, latest) VALUES ("'
.$donneesTag['nomPage'].'", NOW(), "'.$donnees['texte'].'", "Y");';
$requeteTriple = 'INSERT INTO coste_triples(resource, property, value) VALUES '
.'("'.$donneesTag['nomPage'].'", "titre", "'.$donneesTag['titre'].'"),';
//on insère les correspondances avec bdnff
$donneesCorr = $this->creerCorrespondance($donnees['correspondance']);
$requeteCorr = 'INSERT INTO coste_correspondance_bdnff VALUES ("'
.$donneesTag['id'].'", "'.$donneesCorr['num_nom'].'", "'
.$donneesCorr['num_tax'].'", "'.$donneesCorr['famille'].'", "'.$donneesCorr['nom_sci'].'");';
$requete = $requetePage." ".rtrim($requeteTriple, ',')."; ".$requeteCorr;
$this->bdd->requeter($requete);
 
$this->nb_espece++;
$this->afficherAvancement("insertion espece");
}
}
 
private function ouvrirFichier($nomFichier) {
$this->fichier = $nomFichier;
$donnees = null;
if (file_exists($nomFichier) === true && preg_match('/e[0-9]{4}.htm$/', $nomFichier)) {
if ( $fichierOuvert = fopen($nomFichier, 'r') ) {
$donnees['ouvert'] = "oui";
$i = 1;
while ($ligne = fgets($fichierOuvert)) {
if ($i == 24) {
$donnees['tag'] = $this->traiterHtml($ligne);
} elseif ($i == 45) {
$donnees['texte'] = $this->traiterHtml($ligne, $au = true);
$this->donnees['texte'] = $this->traiterHtml($ligne);
} elseif ($i == 46 || $i == 47) {
$donnees['texte'] .= $this->traiterHtml($ligne);
} elseif ($i == 63 || preg_match('/Bdnff /ui', $ligne)) {
$donnees['correspondance'] = $this->traiterHtml($ligne);
}
$i++;
}
fclose($fichierOuvert);
} else {
$this->traiterErreur("Le fichier $nomFichier n'a pas pu être ouvert.");
}
} else {
$this->traiterErreur("Le fichier $nomFichier est introuvable.");
}
return $donnees;
}
 
 
private function traiterHtml($donnees, $au = null) {
$donnees_traitees = strip_tags($donnees,'<B>,<I>');
$donnees_traitees = html_entity_decode($donnees_traitees, ENT_NOQUOTES, 'UTF-8');
$donnees_traitees = str_replace('<B>', '**', $donnees_traitees);
$donnees_traitees = str_replace('</B>', '**', $donnees_traitees);
$donnees_traitees = str_replace('<I>', '//', $donnees_traitees);
$donnees_traitees = str_replace('</I>', '//', $donnees_traitees);
$donnees_traitees = trim($donnees_traitees);
if ($au) {
$donnees_traitees = str_replace('&#173;', '', $donnees_traitees);
}
return $donnees_traitees;
}
 
 
private function creerNomPage($tag) {
$partiesTag = explode(' - ', $tag);
preg_match('/(C.*)/', $tag, $titre);
$donnees['titre'] = $titre[0];
 
list($num, $donnees['id']) = explode(' ', trim($partiesTag[0]));
list($num, $donnees['num_nom_coste'] ) = explode(' ', trim($partiesTag[0]));
$donnees['nom_sci'] = trim($partiesTag[1]);
$partiesNomSci = explode(' ', $donnees['nom_sci']);
 
list($numFamille, $donnees['famille']) = explode(', ', trim($partiesTag[2]));
list($num, $tomePage) = explode(',', trim($partiesTag[3]));
 
if (preg_match('/T(\d*)\.p(\d*)/', $tomePage, $match)){
$donnees['tome'] = $match[1];
$donnees['page'] = sprintf("%04d",$match[2]);
}
$donnees['nomPage'] = 'DscCoste1937T'.$donnees['tome'].'P'.$donnees['page'].implode(array_map('ucfirst',$partiesNomSci));
if ($donnees['nomPage'] == 'DscCoste1937TP') echo 'MERDE!!!!!!!!!!!! à la page '.$this->fichier;
$partieNumTaxSupFamille = explode(',', $partiesTag[2]);
$partieNumTaxSupGenre = explode(',', $partiesTag[3]);
$donnees['num_tax_sup_genre'] = trim($partieNumTaxSupGenre[0]);
//on recupère les auteurs, synonymes et nom_vernaculaires
$this->recupererInfosComplementaires($donnees);
return $donnees;
}
 
 
private function recupererInfosComplementaires(&$donnees) {
$this->donnees['texte'] = str_replace('­', '', $this->donnees['texte']); //on enlève un petit tiret présent entre la plupart des mots (non visible ici)
preg_match('/^ {0,1}[*]{2}([^*]+)[*]{2} ([^–(\/]+\.?)?\s*(?:[(]([^)]+)[)])?[ –.]*(?:[\/]{2}([^\/]+)\s*–\s*[\/]{2})?/', $this->donnees['texte'], $match2);
 
$annee = '';
if ($match2 == array()) echo "donnees du fichier : $this->fichier";
if (isset($match2[1]) && strrpos($match2[1], ' subsp. ') !== false) {
$donnees['nom_sci'] = preg_replace(array('/ All./', '/ L./','/^\s*[0-9]{4}[ –.]*/'), '', $match2[1]);
}
$auteur = (isset($match2[2])) ? $match2[2] : '';
$synonyme = (isset($match2[3])) ? $match2[3] : '';
$nom_verna = (isset($match2[4])) ? $match2[4] : '';
if (preg_match('/^\s*[1-9]{4}\s*$/', $synonyme)) {
$annee = $synonyme;
$synonyme = '';
} elseif (preg_match('/.*?([0-9]{4})/', $auteur, $annee_match) && !preg_match('/ in /', $annee_match[1])) {
$annee = $annee_match[1];
$auteur = preg_replace('/ [0-9]{4}/', '', $auteur);
}
$donnees['annee'] = $annee;
$donnees['auteur'] = $auteur;
$donnees['synonyme'] = $synonyme;
$donnees['nom_vernaculaire'] = $nom_verna;
$this->insererDansTableEspece($donnees);
}
 
 
private function insererDansTableEspece($donnees) {
$this->table_espece[$donnees['num_nom_coste']] = array(
'tag' => $donnees['nomPage'],
'num_nom_retenu_coste' => $donnees['num_nom_coste'],
'num_nom_coste' => $donnees['num_nom_coste'],
'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
'rang' => 290,
'nom_sci' => $donnees['nom_sci'],
'auteur' => $donnees['auteur'],
'nom_vernaculaire' => $donnees['nom_vernaculaire'],
'nom_coste' => $donnees['nom_sci'],
'tome' => $donnees['tome'],
'annee' => $donnees['annee'],
'synonyme' => $donnees['synonyme']);
}
 
 
private function creerCorrespondance($correspondance) {
$parties = explode('-', $correspondance);
if (isset($parties[1])) {
list($num, $donnees['num_nom']) = explode(' ', trim($parties[0]));
$donnees['nom_sci'] = trim($parties[1]);
$donnees['famille'] = trim($parties[2]);
list($num, $num_tax) = explode('=', trim($parties[3]));
$donnees['num_tax'] = ($num_tax == "") ? 'NULL' : $num_tax;
} else {
$donnees['num_nom'] = 'NULL';
$donnees['nom_sci'] = 'NULL';
$donnees['famille'] = 'NULL';
$donnees['num_tax'] = 'NULL';
}
return $donnees;
}
 
//---------------------------------------FONCTION DE CREATION DE LA TABLE COSTE------------------------------------------
 
private function chargerIndexGpFG() {
$requete = 'SELECT * FROM coste_index_general ';
$resultat = $this->bdd->recupererTous($requete);
foreach ($resultat as $nom) {
$nom_coste = ($nom['nom_coste'] == '') ? $this->transliterer($nom['nom_sci']) : $this->transliterer($nom['nom_coste']);
$nom_sci = $this->transliterer($nom['nom_sci']);
$tome = $nom['tome'];
$page = $nom['page'];
$num_tax_sup_coste = $nom['num_tax_sup_coste'];
$num_nom_coste = $nom['num_nom_coste'];
$rang = $nom['rang'];
$this->indexGpFG[$num_nom_coste] = array('nom_sci' => $nom_sci,
'rang' => $rang,
'nom_coste' => $nom_coste,
'num_nom_coste' => $num_nom_coste,
'num_tax_sup_coste' => $num_tax_sup_coste,
'tome' => $tome,
'page' => $page);
}
}
 
 
private function transliterer($txt) {
$txt = ucwords(strtolower(Chaine::supprimerAccents($txt)));
return trim($txt);
}
 
 
private function integrerSynonyme() {
foreach ($this->table_espece as $num_nom_coste => $donnees) {
$et = false; //cas où on a "syno et syno L."
$auteur = '';
$genre_syn = '';
if ($donnees['synonyme'] != '') {
$donnees['synonyme'] = preg_replace(array('/^t\s{1}/','/^et\s{1}/', '/^avec /', '/, etc\.$/', '/\//', '/­/'), '', $donnees['synonyme']);
if (strrpos($donnees['synonyme'], ';') === false
&& preg_match('/^[A-Z][^ ]+ [^ ]+(?: ([^,;]+))?\s*[.]?(et|,)[ ]?[A-Z]{1}[^ on,]+ [^., ]+[ ]+(?:.*)?$/', $donnees['synonyme'], $ponctu)) {
if ($ponctu[2] == 'et') {
$synonymes = array_reverse(explode($ponctu[2], $donnees['synonyme']));
$et = true;
} else {
$synonymes = explode($ponctu[2], $donnees['synonyme']);
}
} else {
$synonymes = explode(';', $donnees['synonyme']);
}
$num_syn = 0; //on numerote les synonyme avec comme num_nom_coste : num_nom_coste du retenu + ".1", ".2" , ...
foreach ($synonymes as $nom_syn) {
$annee = '';
$notes = $this->recupererLesNotesDesSynonymes($nom_syn);
$this->recupererAnneeSynonyme($nom_syn, $annee);
if (preg_match('/^\s*([^ ]*) ([^ ]*)( (?:VAR\.|v\.) [^ ]+)?(?: (.*))?$/', $nom_syn, $match)) {
$num_syn++;
$nom_sci = $this->recupererNomSciComplet($match, $donnees, $num_syn, $genre_syn);
$auteur_syn = $this->recupererAuteurSyn($match, $auteur, $et);
$this->ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn);
} else {
$this->traiterErreur('Synonyme '.$nom_syn.' non reconnu par l\'expression régulière ');
}
}
}
}
}
 
 
private function recupererNomSciComplet(&$match, &$donnees, &$num_syn, &$genre_syn) {
//on récupère le nom complet du genre dans les cas ou le genre est noté : A.
//Attention à l'ex suivant : D. THUILLIERI G. G. ; AIRA SETACEA Huds.; A. DISCOLOR Thuil.; A. ULIGINOSA Weihe
if ($num_syn == 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
preg_match('/\s*([^ ]+) .+$/', $donnees['nom_sci'], $nom_genre);
$match[1] = $nom_genre[1];
$genre_syn = $nom_genre[1];
} elseif (!preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
$genre_syn = $match[1];
} elseif ($num_syn != 1 && preg_match('/^\s*[A-Z]{1}[.]\s*$/', $match[1])) {
$match[1] = $genre_syn;
}
if (isset($match[3])) {
$nom_sci = ucfirst(strtolower($match[1].' '.$match[2].str_replace('v. ', 'var. ', $match[3])));
} else {
$nom_sci = ucfirst(strtolower($match[1].' '.$match[2]));
}
return $nom_sci;
}
 
 
private function recupererAnneeSynonyme(&$nom_syn, &$annee) {
if (preg_match('/ ([0-9]{4})\s*/', $nom_syn, $annee_match)) {
$annee = $annee_match[1];
}
}
 
 
private function recupererAuteurSyn(&$match, &$auteur, &$et) {
//on recupere l'auteur ds une variable ds le cas ou : R. machin et R. truc auteur.
if (isset($match[4]) && $match[4] != '' && $et) {
$auteur = $match[4];
}
$auteur_syn = $auteur;
if (isset($match[3]) && !$et) {
$auteur_syn = preg_replace('/ [0-9]{4}/', '', $match[4]);
} elseif ($auteur != '' && $et) {
$auteur_syn = preg_replace('/ [0-9]{4}/', '', $auteur);
}
return $auteur_syn;
}
 
public function recupererLesNotesDesSynonymes(&$nom_syn) {
// on recupère les notes
if (preg_match('/^(ompr.|incl.) (.*)/i', $nom_syn, $note_abbr)) {
$notes = ($note_abbr[1] == 'ompr.') ? 'compr.' : 'incl.';
$nom_syn = $note_abbr[2];
} else {
$notes = '';
}
return $notes;
}
 
public function ajouterSynonymeALaTableEspece($donnees, $nom_sci, $auteur_syn, $annee, $notes, $num_syn) {
$num_nom_coste_syn = $donnees['num_nom_coste'].'.'.$num_syn;
$this->table_espece[$num_nom_coste_syn] = array(
'num_nom_coste' => $donnees['num_nom_coste'].'.'.$num_syn,
'num_nom_retenu_coste' => $donnees['num_nom_coste'],
'num_tax_sup_genre' => $donnees['num_tax_sup_genre'],
'rang' => 290,
'nom_sci' => $nom_sci,
'auteur' => $auteur_syn,
'nom_vernaculaire' => '',
'nom_coste' => $nom_sci,
'tome' => $donnees['tome'],
'annee' => $annee,
'flore_bdnff_num' => '',
'flore_bdnff_nom_sci' => '',
'notes' => $notes);
}
 
private function recupererDonneesBdnff() {
$req = "SELECT * FROM coste_correspondance_bdnff";
$res = $this->bdd->recupererTous($req);
$total = 0;
if ($res) {
foreach ($res as $espece_bdnff) {
$num_nom_coste = $espece_bdnff['id'];
if (isset($this->table_espece[$num_nom_coste])) {
$this->table_espece[$num_nom_coste]['flore_bdnff_num'] = $espece_bdnff['num_nom'];
$this->table_espece[$num_nom_coste]['flore_bdnff_num_tax'] = $espece_bdnff['num_tax'];
$this->table_espece[$num_nom_coste]['flore_bdnff_nom_sci'] = $espece_bdnff['nom_sci'];
$total++;
} else {
$e = "Le num_nom_coste $num_nom_coste de la table de correspondance bdnff n'exsite pas dans la table donneesEspece ";
$this->traiterErreur($e);
}
}
} else {
$this->traiterErreur('recupererDonneesBdnff() : mauvaise requete');
}
if ($total != 0) {
$this->traiterInfo('Donnees de la bdnff recuperées pour les especes. Total bdnff = '.$total.'\n');
}
}
 
 
private function genererNumNom() {
$this->table_num_nom = array();
$num_nom = 1;
foreach($this->indexGpFG as $donneesCle) {
$this->table_num_nom[$num_nom] = $donneesCle['num_nom_coste'];
$this->indexGpFG[$donneesCle['num_nom_coste']]['num_nom'] = $num_nom;
$num_nom++;
if (preg_match('/^G[0-9]+/',$donneesCle['num_nom_coste'])) {
foreach ($this->table_espece as $donneesEspece) {
if ($donneesEspece['num_tax_sup_genre'] == $donneesCle['num_nom_coste']) {
$this->table_num_nom[$num_nom] = $donneesEspece['num_nom_coste'];
$this->table_espece[$donneesEspece['num_nom_coste']]['num_nom'] = $num_nom;
$num_nom++;
}
}
}
}
if ($this->table_num_nom != array()) $this->traiterInfo('Num_nom generer. Total num_nom = '.count($this->table_num_nom));
else $this->traiterErreur( 'erreur dans la génération des num_nom\n');
}
 
 
private function insererNumNomDansTriples() {
$table_triples = array();
foreach ($this->table_espece as $num_nom_coste => $donnees) {
if (isset($donnees['synonyme'])) {
$table_triples[] = array('resource' => $donnees['tag'], 'property' => 'num_nom', 'value' => $donnees['num_nom']);
}
}
$this->suppressionTriplesExistants();
$this->reinitialiserAutoIncrement('coste_triples');
//insertion des triples num_nom en une seule requete
foreach ($table_triples as $triple) {
$resource = $this->bdd->proteger($triple['resource']);
$property = $this->bdd->proteger($triple['property']);
$value = $this->bdd->proteger($triple['value']);
$requete = "INSERT INTO coste_triples (resource, property, value) VALUES ($resource,$property ,$value)";
$res = $this->bdd->requeter($requete);
if ($res) {
$this->afficherAvancement('Insertion des triples existants');
} else {
$this->afficherAvancement('Erreur de insertion des triples existants');
}
}
}
 
private function suppressionTriplesExistants() {
$requete = 'DELETE FROM coste_triples '.
'WHERE property = "num_nom"'.
'AND resource IN ("'.implode(array_keys($this->table_espece), '","').'")';
$res = $this->bdd->requeter($requete);
if ($res == '') {
$this->traiterErreur('Suppression des triples existants : aucun existant');
} elseif ($res) {
$this->traiterInfo('Suppression des triples existants');
} else {
$this->traiterErreur('Erreur de suppression des triples existants');
}
}
 
private function creerTableCoste() {
$this->insererGpFG();
$this->insererEspeces();
ksort($this->table_projet);
}
 
private function insererGpFG() {
$total = 0;
foreach ($this->indexGpFG as $donneesGpFG) {
$num_nom = $donneesGpFG['num_nom'];
$num_nom_retenu = $donneesGpFG['num_nom'];
$num_tax_sup = array_search($donneesGpFG['num_tax_sup_coste'], $this->table_num_nom);
$annee = '';
$nom_sci = $donneesGpFG['nom_sci'];
$rang = $donneesGpFG['rang'];
$nom_coste = $donneesGpFG['nom_coste'];
$num_nom_coste = $donneesGpFG['num_nom_coste'];
$tome = $donneesGpFG['tome'];
$page = $donneesGpFG['page'];
$genre = '';
$nom_supra_generique = '';
if ($rang != '220') {
$nom_supra_generique = $nom_sci;
} else {
$genre = $nom_sci;
}
 
$this->table_projet[$num_nom] = array(
'num_nom_retenu' => $num_nom_retenu,
'num_tax_sup' => $num_tax_sup,
'rang' => $rang,
'nom_sci' => $nom_sci,
'nom_supra_generique' => $nom_supra_generique,
'genre' => $genre,
'epithete_infra_generique' => '',
'epithete_sp' => '',
'type_epithete' => '',
'epithete_infra_sp' => '',
'cultivar_groupe' => '',
'cultivar' => '',
'nom_commercial' => '',
'auteur' => '',
'annee' => '',
'biblio_origine' => '',
'notes' => '',
'nom_adenddum' => '',
'basionyme' => '',
'nom_francais' => '',
'nom_coste' => $nom_coste,
'num_nom_coste' => $num_nom_coste,
'tome' => $tome,
'page' => $page,
'flore_bdnff_num' => '',
'flore_bdnff_nom_sci' => '',
'nom_sci_html' => ''
);
$total++;
}
$this->traiterInfo('Donnees ajoutées à la table pour les groupes, familles et genres. Total donnees = '.$total.'\n');
}
 
 
private function insererEspeces() {
$total = 0;
foreach ($this->table_espece as $donnees) {
$num_nom = $donnees['num_nom'];
if (isset($donnees['num_nom_retenu_coste'])) {
$num_nom_retenu = array_search($donnees['num_nom_retenu_coste'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
} else {
$num_nom_retenu = $donnees['num_nom'];
}
$num_tax_sup = array_search($donnees['num_tax_sup_genre'], $this->table_num_nom); //on recupere le num_nom à partir du num_nom_coste
$nom_sci = $donnees['nom_sci'];
$rang = $donnees['rang'];
$nom_coste = $donnees['nom_coste'];
$num_nom_coste = (preg_match('/^([0-9]+)(?:\.[0-9]{1})?$/', $donnees['num_nom_coste'], $match)) ? $match[1] : $donnees['num_nom_coste'];
$tome = $donnees['tome'];
$auteur = $donnees['auteur'];
$annee = $donnees['annee'];
//$synonyme = $donnees['synonyme'];
$nom_verna = $donnees['nom_vernaculaire'];
$flore_bdnff_num = $donnees['flore_bdnff_num'];
$flore_bdnff_nom_sci = $donnees['flore_bdnff_nom_sci'];
$notes = (isset($donnees['notes'])) ? $donnees['notes'] : '';
$genre = '';
$epithete_sp = '';
$type_epithete = '';
$epithete_infra_sp = '';
$biblio_origine = '';
if ($num_nom_coste == '1988') $auteur = 'Coste';
$this->traiterTypeEpithete($type_epithete, $nom_sci, $genre, $epithete_sp, $epithete_infra_sp);
$this->traiterRefBiblio($auteur, $biblio_origine, $num_nom_coste);
 
$this->table_projet[$num_nom] = array(
'num_nom_retenu' => $num_nom_retenu,
'num_tax_sup' => $num_tax_sup,
'rang' => $rang,
'nom_sci' => $nom_sci,
'nom_supra_generique' => '',
'genre' => $genre,
'epithete_infra_generique' => '',
'epithete_sp' => $epithete_sp,
'type_epithete' => $type_epithete,
'epithete_infra_sp' => $epithete_infra_sp,
'cultivar_groupe' => '',
'cultivar' => '',
'nom_commercial' => '',
'auteur' => $auteur,
'annee' => $annee,
'biblio_origine' => $biblio_origine,
'notes' => $notes,
'nom_adenddum' => '',
'basionyme' => '',
'nom_francais' => $nom_verna,
'nom_coste' => $nom_coste,
'num_nom_coste' => $num_nom_coste,
'tome' => $tome,
'page' => null,
'flore_bdnff_num' => $flore_bdnff_num,
'flore_bdnff_nom_sci' => $flore_bdnff_nom_sci,
'nom_sci_html' => ''
);
$total++;
}
$this->traiterInfo('Donnees ajoutées à la table pour les especes. Total donnees = '.$total.'\n');
}
 
 
private function traiterRefBiblio(&$auteur, &$biblio_origine, $num_nom_coste) {
if (preg_match('/^(.+)\s*(in .+)$/i', $auteur, $match)) {
if (isset($match[2]) && !empty($match[2]) && isset($match[1]) && !empty($match[1])) {
$auteur = rtrim($match[1], ' ,');
$biblio_origine = $match[2];
}
} elseif (preg_match('/^[^,]+\s*,\s*(.+)$/', $auteur, $match2)) {
if (!preg_match('/^\s*non /i', $match2[1]) && !preg_match('/\s*et /i', $match2[1])) {
if (isset($match2) && !empty($match2)) {
//affichage pour vérfier qu"aucun n'a été oublié
//echo $num_nom_coste;
//print_r($match2);
}
}
} elseif (preg_match('/^(.+) (Sp[.].*)$/', $auteur, $match3)) {
if (isset($match3) && !empty($match3)) {
$auteur = rtrim($match3[1], ', ');
$biblio_origine = $match3[2];
}
}
}
 
 
private function traiterTypeEpithete(&$type_epithete, &$nom_sci, &$genre, &$epithete_sp, &$epithete_infra_sp) {
if (preg_match('/^([^ ]+) ([^ ]+)(?: ([^ ]+\.) ([^ ]+))?$/', $nom_sci, $match)) {
$genre = $match[1];
$epithete_sp = $match[2];
if (isset($match[3])) {
$type_epithete = $match[3];
//$this->traiterErreur('Nom : '.$nom_sci);
}
if (isset($match[4])) $epithete_infra_sp = $match[4];
} else {
$this->traiterErreur('Erreur pr récupérer la nomenclature pr le nom_sci : '.$nom_sci);
}
}
 
 
private function insererTableProjetCoste() {
$this->supprimerTableExistante();
$this->creerTableCosteSQL();
$total = 0;
foreach ($this->table_projet as $num_nom => $donnees) {
 
foreach ($donnees as $key => $donn) {
if (!in_array($key, array('rang', 'annee', 'tome', 'page'))) {
if ($donn == 'NULL') $donn = '';
$donnees_2[$key] = $this->bdd->proteger($donn);
} else {
if ($donn == '') $donn = 'null';
$donnees_2[$key] = $donn;
}
}
$req = 'INSERT INTO coste_v0_2 values ('.$num_nom.', '.implode(', ', $donnees_2).')';
$res = $this->bdd->requeter($req);
 
if ($res) {
$this->afficherAvancement('Insertion des noms dans Coste');
} else {
$this->afficherAvancement('Erreur d\'insertion des noms dans coste');
}
}
}
 
private function supprimerTableExistante() {
$req = 'DROP TABLE coste_v0_2';
$res = $this->bdd->requeter($req);
if ($res) {
$this->traiterInfo('La table coste a été supprimer');
}
}
 
private function creerTableCosteSQL() {
$requete = 'CREATE TABLE IF NOT EXISTS coste_v0_2 (
num_nom int(9) NOT NULL DEFAULT 0,
num_nom_retenu varchar(9) DEFAULT NULL,
num_tax_sup varchar(9) DEFAULT NULL,
rang int(3),
nom_sci varchar(500) CHARACTER SET utf8 DEFAULT "",
nom_supra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
genre varchar(500) CHARACTER SET utf8 DEFAULT "",
epithete_infra_generique varchar(500) CHARACTER SET utf8 DEFAULT "",
epithete_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
type_epithete varchar(500) CHARACTER SET utf8 DEFAULT "",
epithete_infra_sp varchar(500) CHARACTER SET utf8 DEFAULT "",
cultivar_groupe varchar(500) CHARACTER SET utf8 DEFAULT "",
cultivar varchar(500) CHARACTER SET utf8 DEFAULT "",
nom_commercial varchar(500) CHARACTER SET utf8 DEFAULT "",
auteur varchar(100) CHARACTER SET utf8 DEFAULT "",
annee int(4) DEFAULT NULL,
biblio_origine varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
notes varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
nom_addendum varchar(500) CHARACTER SET utf8 NOT NULL DEFAULT "",
basionyme varchar(9) CHARACTER SET utf8 NOT NULL DEFAULT "",
nom_francais text CHARACTER SET utf8 DEFAULT "",
nom_coste varchar(500) CHARACTER SET utf8 DEFAULT "",
num_nom_coste varchar(9) CHARACTER SET utf8 DEFAULT "",
tome int(1) DEFAULT NULL,
page int(4) DEFAULT NULL,
flore_bdnff_num varchar(9) DEFAULT NULL,
flore_bdnff_nom_sci varchar(500) CHARACTER SET utf8 DEFAULT NULL,
nom_sci_html varchar(500) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (num_nom)
) ENGINE=MyISAM DEFAULT CHARSET=utf8';
$res = $this->bdd->requeter($requete);
if ($res) {
$this->traiterInfo('La table coste a été crée');
} else {
$this->traiterErreur('Probleme : la table coste n\'a pas été créée');
}
}
 
 
private function creerFichier($fichier, $tab, $chemin = null) {
if (!$chemin) {
$chemin = Config::get('chemin_test');
}
$intitule = '';
$nom_fichier = fopen($chemin.$fichier, 'w+');
foreach ($tab as $key => $val) {
foreach ($val as $k => $v) {
$intitule .= $k."\t";
}
fwrite($nom_fichier, trim($intitule)."\n");
break;
}
foreach ($tab as $key => $val) {
fwrite($nom_fichier, implode("\t", $val)."\n");
}
fclose($nom_fichier);
}
 
 
}
?>
/trunk/scripts/modules/nvjfl/Nvjfl.php
New file
0,0 → 1,52
<?php
/** Exemple lancement:
* /opt/lampp/bin/php -d memory_limit=3500M ~/web/nripts/cli.php nvjfl -a indexer -f /home/delphine/Documents/nvjfl_version_2007-10-29/NomsVernaculaires-2007-10-29/NomsVernaculaires-2007-10-29.csv
* Options :
* -f : indiquer le chemin du fichier à analyser
*/
class Nvjfl extends Script {
 
protected $parametres_autorises = array(
'-f' => array(true, null, 'Chemin du fichier à analyser'));
 
public function executer() {
// Lancement de l'action demandée
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'indexer' :
$this->indexer();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
private function indexer() {
// créer un index pour un nom identique la clé primaire est composée de cet index + num_taxon + langue
$nomFichier = $this->getParametre('f');
if ($nomFichier) {
if (file_exists($nomFichier) === true) {
if ( $fichierOuvert = fopen($nomFichier, 'r') ) {
$this->bdd = new Bdd();
$nom_precedent = '';
$index = 0;
while ($ligne = fgets($fichierOuvert)) {
$champs = explode(';', $ligne);
if ($champs[3] != $nom_precedent) {
$index ++;
$nom_precedent = $champs[3];
}
$champs[0] = $index;
$this->bdd->requeter('INSERT INTO '.Config::get('bdd_table').' VALUES ('.implode(', ',$champs).');');
}
fclose($fichierOuvert);
} else {
$this->traiterErreur("Le fichier $nomFichier n'a pas pu être ouvert.");
}
} else {
$this->traiterErreur("Le fichier $nomFichier est introuvable.");
}
}
}
}
?>
/trunk/scripts/modules/chorodep/Chorodep.php
New file
0,0 → 1,471
<?php
class Chorodep extends Script {
protected $nbre_dep = 0;
private $type_donnee = '';
protected $aso_num_nomenc = array();
protected $nbre_ligne = 0;
protected $nbre_plte_presente = 0;
protected $nbre_plte_a_confirmer = 0;
protected $nbre_plte_douteux = 0;
protected $nbre_plte_erreur = 0;
protected $nbre_plte_disparue = 0;
protected $nc_autres_valeur_champ = 0;
protected $aso_totaux_dep = array();
 
 
public function __construct($cmd, $parametres = array()) {
parent::__construct($cmd, $parametres);
$this->fichier_verif = './chorodep_verif.html';
}
 
public function executer() {
$this->bdd = new Bdd();
$cmd = $this->getParametre('a');
switch ($cmd) {
 
case 'verifier-donnees' :
$this->initialiserTraitement();
$this->verifierDonnees();
break;
 
default :
echo 'Erreur : la commande "'.$cmd.'" n\'existe pas!'."\n";
}
}
 
private function initialiserTableaux($dep) {
//$departements = new ZgFrDepartements();
//$dep = $departements->get();
//$a = array();
foreach ($dep as $code_dep) {
if ( preg_match('/^\d{2}$/', $code_dep) ) {
$this->aso_totaux_dep[$code_dep]['plte_presente'] = 0;
$this->aso_totaux_dep[$code_dep]['plte_a_confirmer'] = 0;
$this->aso_totaux_dep[$code_dep]['plte_douteux'] = 0;
$this->aso_totaux_dep[$code_dep]['plte_erreur'] = 0;
$this->aso_totaux_dep[$code_dep]['plte_disparue'] = 0;
$this->aso_totaux_dep[$code_dep]['autres_valeur_champ'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_plte_presente'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_plte_a_confirmer'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_plte_douteux'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_plte_erreur'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_plte_disparue'] = 0;
$this->aso_totaux_dep[$code_dep]['nc_autres_valeur_champ'] = 0;
}
}
}
private function initialiserTraitement() {
//------------------------------------------------------------------------------------------------------------//
// Récupération des informations à vérifier
$requete = 'SELECT * '.
'FROM chorodep ';
$taxons = $this->bdd->recupererTous($requete);
$tax_col = $taxons[1];
$col = array_keys($tax_col);
$this->initialiserTableaux($col);
//------------------------------------------------------------------------------------------------------------//
// Analyse des données
echo 'Traitement de la ligne n° :';
$i = 0;
$j = 0;
$aso_departements_analyses = array();
$this->nbre_ligne_avec_guillemet = 0;
foreach ($taxons as $aso_champs) {
$nom = $aso_champs['nom_sci'];
$num_taxo = $aso_champs['num_tax'];
$num_nomenc = $aso_champs['num_nom'];
if ($num_nomenc == 'nc') {
$this->nc_nbre_nom++;
} else if ($num_nomenc != 'nc') {
$this->nbre_nom++;
// Vérification de la nom duplication des numéros nomenclaturaux
if ( !array_key_exists($num_nomenc, (array) $this->aso_num_nomenc) ) {
$this->aso_num_nomenc[$num_nomenc]['compteur'] = 1;
$this->aso_num_nomenc[$num_nomenc]['ligne'] = ($this->nbre_ligne+1);
} else {
$this->aso_num_nomenc[$num_nomenc]['compteur']++;
$this->aso_num_nomenc[$num_nomenc]['ligne'] .= ' - '.($this->nbre_ligne+1);
}
}
foreach ($aso_champs as $cle => $val ) {# Pour chaque département du taxon, on regarde la valeur
$this->nbre_ligne_avec_guillemet += preg_match('/"/', $val);
if ( preg_match('/^\d{2}$/', $cle) ) {# Nous vérifions que le nom du champs comprend bien le numéro du département entre ()
$nd = $cle;# Numéro du département
// Nous comptons le nombre de département en base de données
if (!isset($aso_departements_analyses[$nd])) {
$this->nbre_dep_analyse++;
$aso_departements_analyses[$nd] = $nd;
}
if ( $num_nomenc != 'nc' && isset($val) && $val != '') {# Si le taxon n'est pas abscent du département
if ($val == '1') {# Présent
// Calcul du nombre de plante ayant un statut "Présent"
$this->nbre_plte_presente++;
// Stockage par département du nombre de plante ayant un statut "Présent"
$this->aso_totaux_dep[$nd]['plte_presente']++;
// Stockage des informations
$this->tab_choro_dep[$j] = array(ZgFrDepartements::getIdChaine($nd), $num_taxo, $num_nomenc, 3, $this->id_donnee_choro++);
} else if ($val == '1?') {# Présence à confirmer
// Calcul du nombre de plante ayant un statut "Présence à confirmer"
$this->nbre_plte_a_confirmer++;
// Stockage par département du nombre de plante ayant un statut "Présence à confirmer"
$this->aso_totaux_dep[$nd]['plte_a_confirmer']++;
// Stockage des informations
$this->tab_choro_dep[$j] = array(ZgFrDepartements::getIdChaine($nd), $num_taxo, $num_nomenc, 4, $this->id_donnee_choro++);
} else if (preg_match('/^\s*(?:\?)\s*$/', $val)) {# Douteux
// Calcul du nombre de plante ayant un statut "Disparu ou douteux"
$this->nbre_plte_douteux++;
// Stockage par département du nombre de plante ayant un statut "Douteux"
$this->aso_totaux_dep[$nd]['plte_douteux']++;
// Stockage des informations
$this->tab_choro_dep[$j] = array(ZgFrDepartements::getIdChaine($nd), $num_taxo, $num_nomenc, 5, $this->id_donnee_choro++);
if (preg_match('/(?: \?|\? | \? )/', $val)) {# Douteux
// Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "?".
$this->autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} elseif (preg_match('/^\s*(?:#)\s*$/', $val)) {# Erreur
# Calcul du nombre de plante ayant un statut "Erreur"
$this->nbre_plte_erreur++;
# Stockage par département du nombre de plante ayant un statut "Erreur"
$this->aso_totaux_dep[$nd]['plte_erreur']++;
# Stockage des informations
$this->tab_choro_dep[$j] = array(ZgFrDepartements::getIdChaine($nd), $num_taxo, $num_nomenc, 6, $this->id_donnee_choro++);
if (preg_match('/(?: #|# | # )/', $val)) {# Erreur avec espace
# Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "#".
$autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} elseif (preg_match('/^\s*(?:-\|-)\s*$/', $val)) {# Disparu
# Calcul du nombre de plante ayant un statut "Disparu"
$this->nbre_plte_disparue++;
# Stockage par département du nombre de plante ayant un statut "Disparu"
$this->aso_totaux_dep[$nd]['plte_disparue']++;
# Stockage des informations
$this->tab_choro_dep[$j] = array(ZgFrDepartements::getIdChaine($nd), $num_taxo, $num_nomenc, 6, $this->id_donnee_choro++);
if (preg_match('/(?: -\|-|-\|- | -\|- )/', $val)) {# Disparu avec espace
# Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "-|-".
$autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} else {
// Ajout de la valeur dans une variable car elle n'est pas conforme.
$this->autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
$j++;
} else if (isset($val) && $val != '') {
if ($val == '1') {# Présent
// Calcul du nombre de plante 'nc' ayant un statut "Présent"
$this->nc_nbre_plte_presente++;
// Stockage par département du nombre de plante 'nc' ayant un statut "Présent"
$this->aso_totaux_dep[$nd]['nc_plte_presente']++;
} elseif ($val == '1?') {# Présence à confirmer
// Calcul du nombre de plante 'nc' ayant un statut "Présence à confirmer"
$this->nc_nbre_plte_a_confirmer++;
// Stockage par département du nombre de plante 'nc' ayant un statut "Présence à confirmer"
$this->aso_totaux_dep[$nd]['nc_plte_a_confirmer']++;
} elseif (preg_match('/^(?:\?| \?|\? | \?)$/', $val)) {# Douteux
// Calcul du nombre de plante 'nc' ayant un statut "Douteux"
$this->nc_nbre_plte_douteux++;
// Stockage par département du nombre de plante 'nc' ayant un statut "Douteux"
$this->aso_totaux_dep[$nd]['nc_plte_douteux']++;
if (preg_match('/(?: \?|\? | \? )/', $val)) {# Douteux
// Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "?".
$this->nc_autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} elseif (preg_match('/^(?:#| #|# | # )$/', $val)) {# Erreur
# Calcul du nombre de plante 'nc' ayant un statut "Erreur"
$this->nc_nbre_plte_erreur++;
# Stockage par département du nombre de plante 'nc' ayant un statut "Erreur"
$this->aso_totaux_dep[$nd]['nc_plte_erreur']++;
if (preg_match('/(?: #|# | # )/', $val)) {# Erreur avec espace
# Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "#".
$nc_autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} elseif (preg_match('/^\s*(?:-\|-)\s*$/', $val)) {# Disparu
# Calcul du nombre de plante 'nc' ayant un statut "Disparu"
$this->nc_nbre_plte_disparue++;
# Stockage par département du nombre de plante 'nc' ayant un statut "Disparu"
$this->aso_totaux_dep[$nd]['nc_plte_disparue']++;
if (preg_match('/(?: -\|-|-\|- | -\|- )/', $val)) {# Disparu avec espace
# Ajout de la valeur dans une variable car elle n'est pas tout à fait conforme à "-|-".
$nc_autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
} else {
// Ajout de la valeur dans une variable car elle n'est pas conforme.
$this->nc_autres_valeur_champ .= '<'.$val.'> '.'(Ligne n°: '.($this->nbre_ligne+2).
' - N° nomenclatural: '.$num_nomenc.' - N° département: '.$nd.')<br />';
}
}
// Affichage dans la console du numéro de l'enregistrement analysé.
//echo str_repeat(chr(8), ( strlen( $i ) + 1 ))."\t".$i++;
}
}// fin du foreach
// Affichage dans la console du numéro de l'enregistrement analysé.
echo str_repeat(chr(8), ( strlen( $this->nbre_ligne ) + 1 ))."\t".$this->nbre_ligne++;
}
echo "\n";
}
 
private function verifierDonnees()
{
// Ouverture du fichier contenant les résultats (sortie)
if (!$handle = fopen($this->fichier_verif, 'w')) {
echo "Impossible d'ouvrir le fichier ($this->fichier_verif)";
exit;
}
 
// Création de la page
$page = '<html>'."\n";
$page .= '<head>'."\n";
$page .= '<title>RESULTAT DE LA VERIFICATION DU FICHIER TABULE DE LA CHOROLOGIE</title>'."\n";
$page .= '</head>'."\n";
$page .= '<body>'."\n";
$page .= '<h1>RESULTAT DE LA VERIFICATION DU FICHIER TABULE DE LA CHOROLOGIE</h1>'."\n";
$page .= '<hr/>'."\n";
$page .= '<p>'.
'Adresse fichier analysé : '.'<br />'."\n".
'</p>'."\n";
$page .= '<hr/>'."\n";
$page .= '<h2>RESULTATS PROGRAMME DE VERIFICATION</h2>'."\n";
$page .= '<p>'.
'Nom du programme générant ce fichier : '.__FILE__.'<br />'."\n".
'Nombre de lignes analysées : '.$this->nbre_ligne.'<br />'."\n".
'Nbre de départements analysés : '.$this->nbre_dep_analyse.'<br />'."\n".
'Date d\'exécution du programme : '.date('m.d.Y').'<br />'."\n".
'</p>'."\n";
$page .= '<hr/>'."\n";
$page .= '<h2>RESULTATS ANALYSE CHOROLOGIE</h2>'."\n";
$page .= '<p>'.
'Nombre de nom "nc" : '.$this->nc_nbre_nom.'<br />'."\n".
'Nombre de nom : '.$this->nbre_nom.'<br />'."\n".
'Valeurs autres que 1, 1?, ?, # et -|- : '.$this->autres_valeur_champ.'<br />'."\n".
'Valeurs autres que 1, 1?, ?, # et -|- pour les plantes nc : <br />'."\n".$this->nc_autres_valeur_champ.'</br>'."\n".
'</p>'."\n";
$page .= '<hr/>'."\n";
$page .= '<h2>RESULTATS ANALYSE des CHAMPS</h2>'."\n";
$page .= '<p>'.
'Nombre de guillemets antislashés: '.$this->nbre_ligne_avec_guillemet.'<br />'."\n".
'</p>'."\n";
$page .= '<hr/>'."\n";
$page .= '<h2>TABLEAUX</h2>'."\n";
 
// Tableau des numéros nomenclaturaux dupliqués
$table = '<table><thead><tr><th colspan="3">Tableau des numéros nomenclaturaux dupliqués </th></tr>';
$table .= '<tr><th>Numéro nomenclatural</th><th>Nbre d\'itération</th><th>Lignes</th></tr></thead>';
$afficher_tab_num_duplique = 0;
ksort($this->aso_num_nomenc);
$table .= '<tbody style="text-align: center;">';
foreach ($this->aso_num_nomenc as $cle_nomenc => $val ) {
$ligne = '<tr><td>'.$cle_nomenc.'</td><td>'.$val['compteur'].'</td><td>'.$val['ligne'].'</td></tr>';
if ($val['compteur'] > 1) {
$table .= $ligne;
$afficher_tab_num_duplique = 1;
}
}
if ( $afficher_tab_num_duplique == 1 ) {
$page .= $table.'</tbody></table>';
}
 
// Tableau des résultats par départements
$table = '<table><thead><tr><th colspan="12">Tableau des résulats par départements</th></tr>';
$table .= '<tr><th>Département</th><th>Nbre pltes présentes</th><th>Nbre pltes à confirmer</th>'.
'<th>Nbre pltes douteuses</th><th>Nbre pltes disparues</th><th>Nbre pltes erreur</th>'.
'<th>Total</th><th>Nbre pltes nc présentes</th><th>Nbre pltes nc à confirmer</th>'.
'<th>Nbre nc pltes douteuses</th><th>Nbre nc pltes disparues</th><th>Nbre nc pltes erreur</th></tr></thead>';
$table .= '<tbody style="text-align: center;">';
ksort($this->aso_totaux_dep);
foreach ($this->aso_totaux_dep as $cle_dep => $val ) {
$plt_total = $val{'plte_presente'} + $val{'plte_a_confirmer'} + $val{'plte_douteux'} + $val{'plte_disparue'} + $val{'plte_erreur'};
$table .= '<tr><td>'.ZgFrDepartements::getNom($cle_dep).' ('.ZgFrDepartements::getIdChaine($cle_dep).') </td>'.
'<td>'.$val{'plte_presente'}.'</td><td>'.$val{'plte_a_confirmer'}.'</td><td>'.$val{'plte_douteux'}.'</td>'.
'<td>'.$val{'plte_disparue'}.'</td><td>'.$val{'plte_erreur'}.'</td><td>'.$plt_total.'</td>'.
'<td>'.$val{'nc_plte_presente'}.'</td><td>'.$val{'nc_plte_a_confirmer'}.'</td><td>'.$val{'nc_plte_douteux'}.'</td>'.
'<td>'.$val{'nc_plte_disparue'}.'</td><td>'.$val{'nc_plte_erreur'}.'</td></tr>';
}
 
$table .= '<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
'<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>';
$plt_total = $this->nbre_plte_presente + $this->nbre_plte_a_confirmer + $this->nbre_plte_douteux + $this->nbre_plte_disparue + $this->nbre_plte_erreur;
$table .= '<tr><td>Totaux : '.$this->nbre_dep_analyse.' départements</td><td>'.$this->nbre_plte_presente.'</td>'.
'<td>'.$this->nbre_plte_a_confirmer.'</td><td>'.$this->nbre_plte_douteux.'</td><td>'.$this->nbre_plte_disparue.'</td>'.
'<td>'.$this->nbre_plte_erreur.'</td><td>'.$plt_total.'</td>'.
'<td>'.$this->nc_nbre_plte_presente.'</td>'.'<td>'.$this->nc_nbre_plte_a_confirmer.'</td>'.
'<td>'.$this->nc_nbre_plte_douteux.'</td><td>'.$this->nc_nbre_plte_disparue.'</td><td>'.$this->nc_nbre_plte_erreur.'</td></tr>';
 
$table .= '<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
'<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>';
$total_nbre_plte = ($this->nbre_plte_presente + $this->nbre_plte_a_confirmer + $this->nbre_plte_douteux + $this->nbre_plte_disparue + $this->nbre_plte_erreur);
$total_nbre_plte_nc = ($this->nc_nbre_plte_presente + $this->nc_nbre_plte_a_confirmer + $this->nc_nbre_plte_douteux + $this->nc_nbre_plte_disparue + $this->nc_nbre_plte_erreur);
$table .= '<tr><td>Totaux plante / plante nc</td><td colspan="6">'.$total_nbre_plte.'</td>'.
'<td colspan="5">'.$total_nbre_plte_nc.'</td></tr>';
 
$table .= '<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
'<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>';
$plt_total = $this->nbre_plte_presente + $this->nc_nbre_plte_presente + $this->nc_nbre_plte_a_confirmer + $this->nbre_plte_a_confirmer;
$table .= '<tr><td>Total plantes présentes et à confirmer</td><td colspan="11">'.$plt_total.'</td></tr>';
 
$table .= '<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
'<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>';
$plt_total = $this->nbre_plte_presente + $this->nc_nbre_plte_presente;
$table .= '<tr><td>Total plantes présentes</td><td colspan="11">'.$plt_total.'</td></tr>';
 
$table .= '<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
'<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>';
$plt_total = $total_nbre_plte + $total_nbre_plte_nc;
$table .= '<tr><td>Total données chorologiques</td><td colspan="11">'.$plt_total.'</td></tr>';
 
$table .= '</tbody></table>';
$page .= $table;
 
$page .= '<hr/>'."\n";
$page .= '<h2>NOTES</h2>'."\n";
$page .= '<p>'.
'1.- Chaque champ précédé par "ATTENTION" doit être vide.'."\n".
'S\'il ne l\'est pas, il y a une erreur'."\n".
'</p>'."\n";
$page .= '</body>'."\n";
$page .= '</html>'."\n";
// Fermeture de la poignée sur le fichier de sortie
if (fwrite($handle, $page) === FALSE) {
echo "Impossible d'écrire dans le fichier ($this->fichier_verif)";
exit;
}
echo 'Ecriture du fichier de vérification de la chorologie réalisée!'."\n";
fclose($handle);
}
 
}
 
class ZgFrDepartements {
static private $departements =
array(
"01" => array("Ain", "01", 1),
"02" => array("Aisne", "02", 2),
"03" => array("Allier", "03", 3),
"04" => array("Alpes-de-Haute-Provence", "04", 4),
"05" => array("Hautes-Alpes", "05", 5),
"06" => array("Alpes-Maritimes", "06", 6),
"07" => array("Ardèche", "07", 7),
"08" => array("Ardennes", "08", 8),
"09" => array("Ariège", "09", 9),
"10" => array("Aube", "10", 10),
"11" => array("Aude", "11", 11),
"12" => array("Aveyron", "12", 12),
"13" => array("Bouches-du-Rhône", "13", 13),
"14" => array("Calvados", "14", 14),
"15" => array("Cantal", "15", 15),
"16" => array("Charente", "16", 16),
"17" => array("Charente-Maritime", "17", 17),
"18" => array("Cher", "18", 18),
"19" => array("Corrèze", "19", 19),
"20" => array("Corse", "20", 20),
"2A" => array("Haute-Corse", "2A", 20),
"2B" => array("Corse-du-Sud", "2B", 20),
"21" => array("Côte-d'Or", "21", 21),
"22" => array("Côtes-d'Armor", "22", 22),
"23" => array("Creuse", "23", 23),
"24" => array("Dordogne", "24", 24),
"25" => array("Doubs","25", 25),
"26" => array("Drôme", "26", 26),
"27" => array("Eure", "27", 27),
"28" => array("Eure-et-Loir", "28", 28),
"29" => array("Finistère", "29", 29),
"30" => array("Gard", "30", 30),
"31" => array("Haute-Garonne", "31", 31),
"32" => array("Gers", "32", 32),
"33" => array("Gironde", "33", 33),
"34" => array("Hérault", "34", 34),
"35" => array("Ille-et-Vilaine", "35", 35),
"36" => array("Indre", "36", 36),
"37" => array("Indre-et-Loire", "37", 37),
"38" => array("Isère", "38", 38),
"39" => array("Jura", "39", 39),
"40" => array("Landes", "40", 40),
"41" => array("Loir-et-Cher", "41", 41),
"42" => array("Loire", "42", 42),
"43" => array("Haute-Loire", "43", 43),
"44" => array("Loire-Atlantique", "44", 44),
"45" => array("Loiret", "45", 45),
"46" => array("Lot", "46", 46),
"47" => array("Lot-et-Garonne", "47", 47),
"48" => array("Lozére ", "48", 48),
"49" => array("Maine-et-Loire", "49", 49),
"50" => array("Manche", "50", 50),
"51" => array("Marne", "51", 51),
"52" => array("Haute-Marne", "52", 52),
"53" => array("Mayenne", "53", 53),
"54" => array("Meurthe-et-Moselle", "54", 54),
"55" => array("Meuse", "55", 55),
"56" => array("Morbihan", "56", 56),
"57" => array("Moselle", "57", 57),
"58" => array("Nièvre", "58", 58),
"59" => array("Nord", "59", 59),
"60" => array("Oise", "60", 60),
"61" => array("Orne", "61", 61),
"62" => array("Pas-de-Calais", "62", 62),
"63" => array("Puy-de-Dôme", "63", 63),
"64" => array("Pyrénées-Atlantiques", "64", 64),
"65" => array("Hautes-Pyrénées", "65", 65),
"66" => array("Pyrénées-Orientales", "66", 66),
"67" => array("Bas-Rhin", "67", 67),
"68" => array("Haut-Rhin", "68", 68),
"69" => array("Rhône", "69", 69),
"70" => array("Haute-Saône", "70", 70),
"71" => array("Saône-et-Loire", "71", 71),
"72" => array("Sarthe", "72", 72),
"73" => array("Savoie", "73", 73),
"74" => array("Haute-Savoie", "74", 74),
"75" => array("Paris", "75", 75),
"76" => array("Seine-Maritime", "76", 76),
"77" => array("Seine-et-Marne", "77", 77),
"78" => array("Yvelines", "78", 78),
"79" => array("Deux-Sèvres", "79", 79),
"80" => array("Somme", "80", 80),
"81" => array("Tarn", "81", 81),
"82" => array("Tarn-et-Garonne", "82", 82),
"83" => array("Var", "83", 83),
"84" => array("Vaucluse", "84", 84),
"85" => array("Vendée", "85", 85),
"86" => array("Vienne", "86", 86),
"87" => array("Haute-Vienne", "87", 87),
"88" => array("Vosges", "88", 88),
"89" => array("Yonne", "89", 89),
"90" => array("Territoire-de-Belfort", "90", 90),
"91" => array("Essonne", "91", 91),
"92" => array("Hauts-de-Seine", "92", 92),
"93" => array("Seine-Saint-Denis", "93", 93),
"94" => array("Val-de-Marne", "94", 94),
"95" => array("Val-d'Oise", "95", 95),
"96" => array("aaa", "96", 96),
"971" => array("Guadeloupe", "971", 971),
"972" => array("Martinique", "972", 972),
"973" => array("Guyane", "973", 973),
"974" => array("Réunion", "974", 974),
"99" => array("Etranger", "99", 99),
);
 
static public function get() {
return self::$departements;
}
 
static public function getNom($n) {
return self::$departements[$n][0];
}
 
static public function getIdChaine($n) {
return self::$departements[$n][1];
}
 
static public function getIdNumerique($n) {
return (int)self::$departements[$n][2];
}
 
static public function getIdEflore($n) {
return (int)self::$departements[$n][3];
}
}
?>
/trunk/scripts/modules/bdtfx/Bdtfx.php
New file
0,0 → 1,347
<?php
/**
* declare(encoding='UTF-8');
* Exemple de lancement du script : :
* /opt/lampp/bin/php cli.php bdtfx -a nomSciHtml -t bdtfx_v1_01
* Classe permettant de créer le nom scientifique au format HTML.
* @category php 5.2
* @package bdtfx
* @author Jennifer DHÉ <jennifer@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class Bdtfx extends Script {
protected $bdd = null;
protected $table = null;
protected $num = null;
protected $compo_nom = array();
protected $abbr = array (
'infra-gen.' => 'Infra-Genre',
'sect.' => 'Section',
'subsect.' => 'Sous-Section',
'ser.' => 'Série',
'subser.' => 'Sous-Série',
'gr.' => 'Groupe',
'agg.' => 'Agrégat',
'sp.' => 'Espèce',
'subsp.' => 'Sous-Espèce',
'infra-sp.' => 'Infra-Espèce',
'var.' => 'Variété',
'subvar.' => 'Sous-Variété',
'fa' => 'Forme',
'subf.' => 'Sous-Forme',
'f. sp.' => 'Forma species',
'proles' => 'Race prole'
);
private $nomSciTpl = '<span class=sci>%s</span>';
private $nomSupraGenTpl = '<span class="supra_gen">%s</span>';
private $genTpl = '<span class="gen">%s</span>';
private $infraGenTpl = '<span class="infra-gen">%s</span>';
private $spFHTpl = '<span class="gen">%s</span> <span class="sp">%s</span>';
private $typeEpitheteTpl = '<abbr class="type_epithete" title="%s">%s</abbr>';
private $infraSpFHTpl = '<span class="gen">%s</span> <span class="sp">%s</span> <abbr class="type-epithete" title="%s">%s</abbr> <span class="infra-sp">%s</span>';
private $formuleHybTpl = '<span class="formule-hyb">%s</span>';
protected $table_requete;
protected $limite_req_tuples = 10000;
protected $depart_req_tuples = 0;
 
protected $parametres_autorises = array(
'-t' => array(true, true, 'Nom de la table qui doit être traitée'));
 
public function executer() {
// Lancement de l'action demandée
$cmd = $this->getParametre('a');
switch ($cmd) {
case 'nomSciHtml' :
$this->genererNomSciHtml();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
private function genererNomSciHtml() {
$this->initialiser();
 
$nbtot = $this->recupererNbTotalTuples();
while ($this->depart_req_tuples < $nbtot) {
$resultat = $this->recupererTuples();
$nb_tot_res = count($resultat);
$compteur = 1;
foreach ($resultat as $tuples => $infos) { //pour chaque tuple
$this->initialiserVariables($infos);
 
$nomSciHtml = '';
$nomSciHtml .= $this->ajouterBaliseNomSupraGen();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['genre'], 'gen');
$nomSciHtml .= $this->ajouterBaliseInfraGen();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['epithete_sp'], 'sp');
$nomSciHtml .= $this->ajouterBaliseTypeInfraSp();
$nomSciHtml .= $this->verifierHybridite($this->compo_nom['epithete_infra_sp'], 'infra-sp');
$nomSciHtml .= $this->ajouterCultivarGpComm();
 
if ($nomSciHtml != '') {
$this->table_requete[$this->num] = sprintf($this->nomSciTpl, trim($nomSciHtml));
}
if (count($this->table_requete) == 1000) {
$this->lancerRequeteModification();
array_splice($this->table_requete, 0);
} elseif ($compteur == $nb_tot_res) {
$this->lancerRequeteModification();
}
$compteur++;
$this->afficherAvancement('Génération des noms scientifique au format HTML en cours');
}
}
echo "\n";
}
 
private function initialiser() {
$this->bdd = new Bdd();
$this->table = $this->getParametre('t');
$this->preparerTable();
}
 
private function preparerTable() {
$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
$resultat = $this->bdd->recuperer($requete);
if ($resultat === false) {
$requete = "ALTER TABLE {$this->table} ".
'ADD nom_sci_html VARCHAR( 500 ) '.
'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
$this->bdd->requeter($requete);
}
}
 
private function recupererNbTotalTuples(){
$req = "SELECT count(*) AS nb FROM {$this->table} ";
$res = $this->bdd->recuperer($req);
return $res['nb'];
}
 
private function recupererTuples() {
$requete = 'SELECT num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
' epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
' nom_commercial, cultivar '.
"FROM {$this->table} ".
"LIMIT {$this->depart_req_tuples},{$this->limite_req_tuples} ";
 
$resultat = $this->bdd->recupererTous($requete);
$this->depart_req_tuples += 10000;
return $resultat;
}
 
private function initialiserVariables($infos) {
$this->num = $infos['num_nom'];
$this->compo_nom = $infos;
}
 
private function ajouterBaliseNomSupraGen() {
$html = '';
if ($this->compo_nom['nom_supra_generique'] != '') {
$html = sprintf($this->nomSupraGenTpl, $this->compo_nom['nom_supra_generique']);
}
return $html;
}
 
private function ajouterTypeEpithete($type) {
if (!array_key_exists($type, $this->abbr)) {
$this->abbr[$type] = $type;
}
}
 
private function ajouterBaliseInfraGen() {
$html = '';
if ($this->verifierTypeInfraGen()) {
$html .= $this->ajouterBaliseTypeInfraGen();
} else {
if ($this->avoirInfo('epithete_infra_generique')) {
$html .= sprintf($this->infraGenTpl, $this->compo_nom['epithete_infra_generique']);
}
}
return $html;
}
 
private function verifierTypeInfraGen() {
$ok = false;
if ($this->compo_nom['type_epithete'] != '' && $this->compo_nom['epithete_infra_generique'] != '') {
$this->ajouterTypeEpithete($this->compo_nom['type_epithete']);
$ok = true;
}
return $ok;
}
 
private function ajouterBaliseTypeInfraGen() {
$html = '';
$type = $this->compo_nom['type_epithete'];
 
if ($type == 'agg.') { // Ajout de l'infra gen avant le type s'il est égal à agg.
$html .= ' '.$this->ajouterBaliseInfraGen().
' '.sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type);
} else {
$html .= ' '.sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type).
' '.$this->ajouterBaliseInfraGen();
}
return $html;
}
 
private function ajouterBaliseTypeInfraSp() {
$html = '';
$type = $this->compo_nom['type_epithete'];
$infraSp = $this->compo_nom['epithete_infra_sp'];
 
if ($infraSp != '') {
if ($type != '') {
$this->ajouterTypeEpithete($type);
$html = ' '.sprintf($this->typeEpitheteTpl, $this->abbr[$type], $type);
} else {
$message = "Nom #%s contient un épithète infra-spécifique mais son type n'est pas renseigné.";
$this->traiterErreur($message, array($this->num));
}
}
return $html;
}
 
private function ajouterCultivarGpComm() {
$html = '';
if ($this->avoirInfo('cultivar_groupe')) {
$html .= ' '.$this->ajouterCultivarGroupe();
}
if ($this->avoirInfo('nom_commercial')) {
$html .= ' <span class="commercial">'.$this->compo_nom['nom_commercial'].'</span>';
}
if ($this->avoirInfo('cultivar')) {
$html .= ' <span class="cultivar">\''.$this->compo_nom['cultivar'].'\'</span>';
}
return $html;
}
 
private function avoirInfo($valeur) {
return (isset($this->compo_nom[$valeur]) && $this->compo_nom[$valeur] != '') ? true : false;
}
 
/**
* Permet d'ajouter les groupes de cultivar en fonction de la présence d'un cultivar et de la présence d'un grex
*
* L'ensemble des individus obtenu par une fécondation particulière s'appelle un le Grex (que pour les orchidées).
* Au sein du grex, certains individus peuvent se distinguer par des formes, des coloris ou autres qui font que
* l'obtenteur du grex va les sélectionner.
* les noms de groupes de cultivars sont suivis de l'abréviation « Gp » et placés entre parenthèses
* les noms de grex, s'ils sont utilisés devant une épithète de cultivar, ne se mettent pas entre parenthèses
* ex : Cymbidium Alexanderi gx 'Westonbirt' (cultivar_groupe = Alexanderi gx) ;
* les noms de groupe se mettent entre parenthèses s'ils sont devant une épithète de cultivar
* ex : Dracaena fragrans (Deremenis Gp) 'Christianne' (cultivar_groupe = Deremenis)
* Un grex peut contenir des groupes (rédaction d'un exemple de l'ICNCP)
* ex : × Rhyncosophrocattleya Marie Lemon Stick grex Francis Suzuki Group
* ou : × Rhyncosophrocattleya Marie Lemon Stick gx Francis Suzuki Gp
* @param unknown_type $val
*
*/
private function ajouterCultivarGroupe() {
$html = '';
if ($this->avoirInfo('cultivar_groupe')) { //si le champ cultivar_groupe n'est pas vide
if ($this->compo_nom['cultivar']) { //si il y a un cultivar, on ajoute des parenthèses au group (mais pas au grex)
if (strrpos($this->compo_nom['cultivar_groupe'], ' gx ') !== false) { //si le grex est composé de groupe
$tab_gp = explode(' gx ', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].
' <abbr title="grex">gx </abbr>('.$tab_gp[1].
' <abbr title="groupe">Gp</abbr>)</span>';
} elseif (strrpos($this->compo_nom['cultivar_groupe'], ' gx') !== false) { //si il y a un grex et pas de groupe
$tab_gp = explode(' gx', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].' <abbr title="grex">gx</abbr></span>';
} else { //si il n'y a pas de grex mais un groupe
$html = ' <span class="gp">'.$this->compo_nom['cultivar_groupe'].' <abbr title="groupe">Gp</abbr>)</span>';
}
} else { //s'il n'y a pas de cultivar
if (strrpos($this->compo_nom['cultivar_groupe'], ' gx ') !== false) { //si le grex est composé de groupe
$tab_gp = explode(' gx ', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].
' <abbr title="grex">gx</abbr>'.$tab_gp[1].
' <abbr title="groupe">Gp</abbr></span>';
} elseif (strrpos($this->compo_nom['cultivar_groupe'], ' gx') !== false) { //si il y a un grex et pas de groupe
$tab_gp = explode(' gx', $this->compo_nom['cultivar_groupe']);
$html = ' <span class="gp">'.$tab_gp[0].' <abbr title="grex">gx</abbr></span>';
} else { //si il n'y a pas de grex mais un groupe
$html = ' <span class="gp">'.$this->compo_nom['cultivar_groupe'].' <abbr title="groupe">Gp</abbr></span>';
}
}
}
return $html;
}
 
/**
*
* Permet de repérer s'il s'agit d'un hybride (infra-sp, genre, sp) ou d'une chimère.
* @param unknown_type $val
* @param unknown_type $type
*/
private function verifierHybridite($epithete, $type) {
$html = '';
if ($epithete != '') {
if (substr($epithete, 0, 2) == 'x ') {
$html = ' <span class=hyb>x <span class="'.$type.'">'.str_replace('x ', '', $epithete).'</span></span>';
} elseif (substr($epithete, 0, 2) == '+ ') {
$html = ' <span class=chimere>+ <span class="'.$type.'">'.str_replace('+ ', '', $epithete).'</span></span>';
} else if (substr_count($epithete, ' x ') > 1) {// Cas d'une formule d'hybridité comprenant des parents hybrides
$html = ' '.$this->insererBaliseFormuleHyb($epithete);
} elseif (substr_count($epithete, ' x ') == 1) {// Cas d'une formule d'hybridité simple
$html = ' '.$this->ajouterFomuleHybridite($epithete, $type);
} else {
$html = ' <span class="'.$type.'">'.$epithete.'</span>';
}
}
return $html;
}
 
private function ajouterFomuleHybridite($formule, $type) {
$tab_x = explode(' x ', $formule);
$formule_hyb = array();
switch ($type) {
case 'gen' :
foreach ($tab_x as $hyb) {
$formule_hyb[] = sprintf($this->genTpl, $hyb);
}
break;
case 'sp' :
foreach ($tab_x as $hyb) {
if (substr_count($hyb, ' ') >= 1) {
list($gen, $sp) = explode(' ', $hyb);
$formule_hyb[] = sprintf($this->spFHTpl, $gen, $sp);
} else {
$avertissement = "Nom #%s : la valeur d'hybride '%s' ne contenait pas d'espace .";
$this->traiterAvertissement($avertissement, array($this->num, $hyb));
}
}
break;
case 'infra-sp' :
foreach ($tab_x as $hyb) {
list($gen, $sp, $typeEpithete, $infraSp) = explode (' ', $hyb);
$formule_hyb[] = sprintf($this->infraSpFHTpl, $gen, $sp, $this->abbr[$typeEpithete], $typeEpithete, $infraSp);
}
break;
default : break;
}
return $this->insererBaliseFormuleHyb(implode(' x ', $formule_hyb));
}
 
private function insererBaliseFormuleHyb($formule) {
return sprintf($this->formuleHybTpl, $formule);
}
 
private function lancerRequeteModification() {
foreach ($this->table_requete as $id => $html) {
$html = $this->bdd->proteger($html);
$requete = "UPDATE {$this->table} ".
"SET nom_sci_html = $html ".
"WHERE num_nom = $id ";
$res = $this->bdd->requeter($requete);
if ($res === false) {
$this->traiterErreur("erreur d'insertion pour le tuple %s", array($id));
}
}
}
}
?>
/trunk/scripts/modules/iso-639-1/Iso6391.php
New file
0,0 → 1,0
<?php
/trunk/scripts/configurations/config.defaut.ini
New file
0,0 → 1,39
; Encodage : UTF-8
; +------------------------------------------------------------------------------------------------------+
; Info sur l'application
info.nom = Scripts de tests
; Abréviation de l'application
info.abr = SCRIPTS
; Version du Framework nécessaire au fonctionnement de cette application
info.framework.version = 0.3
; Encodage de l'application
encodage_appli = "UTF-8"
; Chemin de l'application (pour l'utiliser dans ce fichier)
chemin_scripts = "php:Framework::getCheminAppli()"
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
debogage = true
; Indique si oui ou non on veut lancer le chronométrage
chronometrage = false
 
+------------------------------------------------------------------------------------------------------+
; Paramètrage de la base de données.
; bdd_abstraction : abstraction de la base de données.
; bdd_protocole : Protocole de la base de données.
; bdd_serveur : Nom du serveur de bases de données.
; bdd_utilisateur : Nom de l'utilisateur de la base de données.
; bdd_mot_de_passe : Mot de passe de l'utilisateur de la base de données.
; bdd_nom : Nom de la base de données principale.
; bdd_encodage : Encodage de la base de données principale. Normalement le même que l'application mais au format base de
; données : voir ici : http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html
; et là: http://www.postgresql.org/docs/8.1/static/multibyte.html pour les correspondances
bdd_abstraction = pdo
bdd_protocole = mysql
bdd_serveur = localhost
bdd_utilisateur = "root"
bdd_mot_de_passe = ""
bdd_nom = ""
bdd_encodage = "utf8"
bdd_table = ""
/trunk/scripts/framework.defaut.php
New file
0,0 → 1,6
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework
require_once '/home/www/commun/framework/0.3/Framework.php';
?>
/trunk/scripts/cli.php
New file
0,0 → 1,37
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Initialise le chargement et l'exécution des scripts
*
* Lancer ce fichier en ligne de commande avec :
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code>
*
//Auteur original :
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
 
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
// Chemin du fichier chargeant le framework requis
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php';
if (!file_exists($framework)) {
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
 
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));
 
// Initialisation et lancement du script appelé en ligne de commande
Cli::executer();
}
?>