Subversion Repositories Applications.wikini

Compare Revisions

Ignore whitespace Rev 63 → Rev 64

/trunk/api/bibliotheque/ManipulationPage.php
New file
0,0 → 1,194
<?php
// declare(encoding='UTF-8');
/**
* Librairie de consultation d'une page wiki
*
* @category php 5.2
* @package wapi
* @author Aurélien Peronnet < aurelien@tela-botanica.org>
* @copyright Copyright (c) 2015, 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 ManipulationPage {
private $wiki = null;
private $pageNom = null;
private $section = null;
private $creerPage = false;
private $templateDefaut = null;
public function __construct($wiki, $pageNom) {
// Cette construction bizarre sert à éviter des bugs issus du comportement de wikini
$this->wiki = $wiki;
global $wiki;
$wiki = $this->wiki;
$this->pageNom = $pageNom;
$this->wiki->setPageCourante($this->pageNom);
}
public function consulterPage($page, $section = null) {
$this->wiki->setPageCourante($page);
$page = $this->wiki->LoadPage($page);
if ($page != null) {
$this->consulterPageSectionsFormatees($page, $section);
}
return $page;
}
public function consulterPageSectionsFormatees(&$page, $section) {
// attention les wikis sont souvent en ISO !
$page["body"] = $this->convertirTexteWikiVersEncodageAppli($page['body']);
if($section != null) {
$sections_tab = explode(',', $section);
if(count($sections_tab) > 1) {
foreach($sections_tab as $section_t) {
$page["sections"][$section_t] = $this->decouperPageSection($page["body"], $section_t);
}
} else {
$page["body"] = $this->decouperPageSection($page["body"], $section);
}
}
}
public function decouperPageSection($contenu_page, $section) {
$section_retour = '';
if (is_numeric($section)) {
$section_retour = $this->getSectionParNumero($contenu_page, $section);
} else {
$section_retour = $this->getSectionParTitre($contenu_page, $section, false);
}
return $section_retour;
}
public function getSectionParNumero($page, $num) {
preg_match_all('/(=[=]+[ ]*)(.[.^=]*)+[ ]*=[=]+[.]*/i', $page, $sections, PREG_OFFSET_CAPTURE);
$sectionTxt = '';
$debut_section = 0;
$lg_page = strlen($page);
$fin_section = $lg_page;
if ($num <= count($sections[1]) && $num > 0) {
$debut_section = $sections[1][$num - 1][1];
$separateur = trim($sections[1][$num - 1][0]);
$separateur_trouve = false;
for ($i = $num; $i < count($sections[1]); $i++) {
$fin_section = $sections[1][$i][1];
if($separateur == trim($sections[1][$i][0])) {
$separateur_trouve = true;
break;
}
}
$fin_section = $separateur_trouve ? $fin_section : $lg_page;
$sectionTxt = substr($page, $debut_section, $fin_section - $debut_section);
} else {
$sectionTxt = '';
}
 
return $sectionTxt;
}
public function getSectionParTitre($page, $titre, $inclure_titre = false) {
$section = '';
$reg_exp = '/((=[=]+)[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+)[.]*/i';
$match = preg_split($reg_exp, $page, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
if (count($match) > 3) {
$section = explode(trim($match[2]), $match[3], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[1].$section : $section;
} elseif (count($match) == 3) {
$section = explode(trim($match[1]), $match[2], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[0].$section : $section;
} else {
$section = "";
}
return $section;
}
public function creerPageAPartirTemplate($tag_page_a_creer, $tag_template) {
$page_template = $this->consulterPage($tag_template);
$corps_nouvelle_page = ($page_template != null) ? $page_template['body'] : '';
// si le template n'existe pas, la page créée sera vide
$ecriture = $this->ecrirePage($tag_page_a_creer, $corps_nouvelle_page);
return $ecriture;
}
/**
*
* Si la section demandée existe dans la page, renvoie un tableau contenant le numéro de caractère de
* début de la section, après son titre, ainsi que la longeur du titre
* @param string $titre de la section
* @param string $page contenu de la page wiki
* @return tableau associatif tel que décrit ici
*/
public function getInformationsPositionSection($titre, $page) {
preg_match_all('/(=[=]+[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+[.]*)/i', $page, $sections, PREG_OFFSET_CAPTURE);
$longueur_titre = 0;
$debut_section_apres_titre = 0;
if (count($sections) > 0 && is_array($sections[0]) && count($sections[0][0]) >= 2) {
$longueur_titre = mb_strlen($sections[0][0][0]);
$debut_section_apres_titre = $sections[0][0][1] + $longueur_titre;
}
// ATTENTION : début contient le numéro du caractere de début de la section, après le titre
$infos = array('debut' => $debut_section_apres_titre,
'longueur_titre' => $longueur_titre
);
return $infos;
}
public function remplacerSection($titre_section, $section_remplacement, $corps) {
// insertion d'un saut de ligne pour empêcher de casser le titre, lorsque le titre
// suivant vient directement après la section, sans saut de ligne ni espace
$section_remplacement = "\n".$section_remplacement."\n";
$section_page_originale = $this->getSectionParTitre($corps, $titre_section, true);
$infos_section = $this->getInformationsPositionSection($titre_section, $corps);
$nb_caracteres_a_remplacer = mb_strlen($section_page_originale) - $infos_section['longueur_titre'];
$nouveau_contenu = substr_replace($corps, $section_remplacement, $infos_section['debut'], $nb_caracteres_a_remplacer);
return $nouveau_contenu;
}
public function ecrirePage($nom_page, $contenu) {
$texte_encode = $this->convertirTexteAppliVersEncodageWiki($contenu);
$ecriture = $this->wiki->SavePage($nom_page, $texte_encode, "", true);
// 0 signifie écriture réussie et 1 pas autorisé (donc échec)
// on ramène donc ça à une valeur de true/false
$ecriture = ($ecriture == 0) ? true : false;
return $ecriture;
}
public static function convertirTexteWikiVersEncodageAppli($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_appli'),Config::get('encodage_wiki'));
}
return $texte;
}
public static function convertirTexteAppliVersEncodageWiki($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_wiki'),Config::get('encodage_appli'));
}
return $texte;
}
}
?>
/trunk/api/bibliotheque/WikiApi.php
New file
0,0 → 1,54
<?php
class WikiApi {
private $page = null;
private $wikiObjet = null;
private $cheminWiki = null;
private $cheminApi = null;
public function __construct($cheminWiki, $cheminApi) {
$this->cheminWiki = $cheminWiki;
$this->cheminApi = $cheminApi;
$this->initialiser();
}
private function initialiser() {
if ($this->page != null) {
$_REQUEST['wiki'] = $this->page;
}
ini_set('include_path',ini_get('include_path').':'.$this->cheminWiki.':');
chdir($this->cheminWiki);
include 'api.php';
$this->wikiObjet = $wiki;
chdir($this->cheminApi);
}
public function setPageCourante($page) {
$this->page = $page;
}
public function chargerClasseWiki($classe) {
$chemins = array($this->cheminWiki.'/tools/', $this->cheminWiki.'/formatters/');
foreach ($chemins as $chemin) {
$chemin = $chemin.$classe.'.php';
if (file_exists($chemin)) {
require_once $chemin;
$classeTrouvee = true;
}
}
}
public function __call($methodeNom, $arguments) {
 
if ($this->wikiObjet == null) {
$this->initialiser();
}
chdir($this->cheminWiki);
$retour = call_user_func_array(array($this->wikiObjet, $methodeNom), $arguments);
chdir($this->cheminApi);
return $retour;
}
}
?>
/trunk/api/rest/modules/0.5/Exemple.php
New file
0,0 → 1,53
<?php
// declare(encoding='UTF-8');
/**
* Classe d'exemple de service web du projet eFlore
* Source des données : {NOM_DU_PROJET} {ADRESSE_WEB_DONNEES_DU_PROJET}
* Paramètres du service :
* - param1 : explication de l'utilisation du param1
* - param2 : explication de l'utilisation du param2
* Exemple :
* http://localhost/{CODE_DU_PROJET}/services/0.1/Exemple?param1=val1&param2=val2
*
* @category php 5.2
* @package lion1906
* @author {PRENOM} {NOM}<{PRENOM}@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 Exemple extends Service {
public function consulter($ressources, $parametres) {
$verifOk = $this->verifierParametres($parametres);
if ($verifOk) {
// Débuter ici le code du service
$wiki = Registre::get('wikiApi');
$wiki->setPageCourrante($ressources[0]);
$page = $wiki->LoadPage($ressources[0]);
$retour = $wiki->Format($page["body"], "wakka");
return $retour;
} else {
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
}
}
private function verifierParametres($parametres) {
$ok = true;
extract($parametres);
if (isset($param1) && !preg_match('/^val1$/', $param1)) {
$message = "La valeur du param1 n'est pas bonne. Seul 'val1' est accepté.";
$this->ajouterMessage($message);
$ok = false;
}
if (isset($param1) && !preg_match('/^val1$/', $param2)) {
$message = "La valeur du param2 n'est pas bonne Seul 'val2' est accepté.";
$this->ajouterMessage($message);
$ok = false;
}
return $ok;
}
}
?>
/trunk/api/rest/modules/0.5/Pages.php
20,6 → 20,8
private $creerPage = false;
private $templateDefaut = null;
private $manipulationPage = null;
private $retour = 'txt';
private $formats_retour = array('text/plain','text/html');
private $format_texte;
28,6 → 30,19
const MIME_HTML = 'text/html';
const MIME_TEXT = 'text/plain';
public function __construct($config) {
parent::__construct($config);
$this->wiki = Registre::get('wikiApi');
// La variable globale wiki est déclarée par les wiki et leurs plugins
// un bug lié à certains plugin impose de la redéclarer et la réaffecter
global $wiki;
$wiki = $this->wiki;
require_once realpath(dirname(__FILE__).'/../../../bibliotheque/ManipulationPage.php');
$this->manipulationPage = new ManipulationPage($this->wiki, $this->pageNom);
}
public function consulter($ressources, $parametres) {
try {
35,11 → 50,11
$this->verifierParametres($parametres);
$this->analyserParametres($ressources, $parametres);
$page = $this->consulterPage($this->pageNom, $this->section);
$page = $this->manipulationPage->consulterPage($this->pageNom, $this->section);
 
if($page == null && $this->creerPage) {
$this->creerPageAPartirTemplate($this->pageNom, $this->templateDefaut);
$page = $this->consulterPage($this->pageNom, $this->section);
$this->manipulationPage->creerPageAPartirTemplate($this->pageNom, $this->templateDefaut);
$page = $this->manipulationPage->consulterPage($this->pageNom, $this->section);
}
$retour = $this->formaterRetour($page);
110,95 → 125,6
}
}
private function consulterPage($page, $section = null) {
$this->wiki = Registre::get('wikiApi');
// La variable globale wiki est déclarée par les wiki et leurs plugins
// un bug lié à certains plugin impose de la redéclarer et la réaffecter
global $wiki;
$wiki = $this->wiki;
$this->wiki->setPageCourante($this->pageNom);
$page = $this->wiki->LoadPage($page);
if ($page != null) {
// attention les wikis sont souvent en ISO !
$page["body"] = $this->convertirTexteWikiVersEncodageAppli($page['body']);
if($section != null) {
$sections_tab = explode(',', $section);
if(count($sections_tab) > 1) {
foreach($sections_tab as $section_t) {
$page["sections"][$section_t] = $this->decouperPageSection($page["body"], $section_t);
}
} else {
$page["body"] = $this->decouperPageSection($page["body"], $section);
}
}
}
return $page;
}
private function decouperPageSection($contenu_page, $section) {
$section_retour = '';
if (is_numeric($section)) {
$section_retour = $this->getSectionParNumero($contenu_page, $section);
} else {
$section_retour = $this->getSectionParTitre($contenu_page, $section, false);
}
return $section_retour;
}
public function getSectionParNumero($page, $num) {
preg_match_all('/(=[=]+[ ]*)(.[.^=]*)+[ ]*=[=]+[.]*/i', $page, $sections, PREG_OFFSET_CAPTURE);
$sectionTxt = '';
$debut_section = 0;
$lg_page = strlen($page);
$fin_section = $lg_page;
if ($num <= count($sections[1]) && $num > 0) {
$debut_section = $sections[1][$num - 1][1];
$separateur = trim($sections[1][$num - 1][0]);
$separateur_trouve = false;
for ($i = $num; $i < count($sections[1]); $i++) {
$fin_section = $sections[1][$i][1];
if($separateur == trim($sections[1][$i][0])) {
$separateur_trouve = true;
break;
}
}
$fin_section = $separateur_trouve ? $fin_section : $lg_page;
$sectionTxt = substr($page, $debut_section, $fin_section - $debut_section);
} else {
$sectionTxt = '';
}
 
return $sectionTxt;
}
public function getSectionParTitre($page, $titre, $inclure_titre = false) {
$section = '';
$reg_exp = '/((=[=]+)[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+)[.]*/i';
$match = preg_split($reg_exp, $page, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
if (count($match) > 3) {
$section = explode(trim($match[2]), $match[3], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[1].$section : $section;
} elseif (count($match) == 3) {
$section = explode(trim($match[1]), $match[2], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[0].$section : $section;
} else {
$section = "";
}
return $section;
}
private function formaterRetour($page) {
 
$mime = null;
231,15 → 157,6
return $retour;
}
private function creerPageAPartirTemplate($tag_page_a_creer, $tag_template) {
$page_template = $this->consulterPage($tag_template);
$corps_nouvelle_page = ($page_template != null) ? $page_template['body'] : '';
// si le template n'existe pas, la page créée sera vide
$ecriture = $this->ecrirePage($tag_page_a_creer, $corps_nouvelle_page);
return $ecriture;
}
public function ajouter($ressources, $requeteDonnees) {
return $this->modifier($ressources, $requeteDonnees);
}
253,18 → 170,19
$this->wiki->setPageCourante($this->pageNom);
$texte = $requeteDonnees['pageContenu'];
$page = $this->consulterPage($this->pageNom);
$page = $this->manipulationPage->consulterPage($this->pageNom);
if ($page != null) {
$corps = ($this->section != null) ? $this->remplacerSection($this->section, $texte, $page['body']) : $texte;
$corps = ($this->section != null) ? $this->manipulationPage->remplacerSection($this->section, $texte, $page['body']) : $texte;
} else {
$corps = $texte;
}
$ecriture = $this->ecrirePage($this->pageNom, $corps);
$ecriture = $this->manipulationPage->ecrirePage($this->pageNom, $corps);
if ($ecriture) {
$this->envoyerCreationEffectuee();
exit;
} else {
$message = 'Impossible de créer ou modifier la page';
$code = RestServeur::HTTP_CODE_ERREUR;
274,55 → 192,6
return $ecriture;
}
/**
*
* Si la section demandée existe dans la page, renvoie un tableau contenant le numéro de caractère de
* début de la section, après son titre, ainsi que la longeur du titre
* @param string $titre de la section
* @param string $page contenu de la page wiki
* @return tableau associatif tel que décrit ici
*/
private function getInformationsPositionSection($titre, $page) {
preg_match_all('/(=[=]+[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+[.]*)/i', $page, $sections, PREG_OFFSET_CAPTURE);
$longueur_titre = 0;
$debut_section_apres_titre = 0;
if (count($sections) > 0 && is_array($sections[0]) && count($sections[0][0]) >= 2) {
$longueur_titre = mb_strlen($sections[0][0][0]);
$debut_section_apres_titre = $sections[0][0][1] + $longueur_titre;
}
// ATTENTION : début contient le numéro du caractere de début de la section, après le titre
$infos = array('debut' => $debut_section_apres_titre,
'longueur_titre' => $longueur_titre
);
return $infos;
}
private function remplacerSection($titre_section, $section_remplacement, $corps) {
// insertion d'un saut de ligne pour empêcher de casser le titre, lorsque le titre
// suivant vient directement après la section, sans saut de ligne ni espace
$section_remplacement = "\n".$section_remplacement."\n";
$section_page_originale = $this->getSectionParTitre($corps, $titre_section, true);
$infos_section = $this->getInformationsPositionSection($titre_section, $corps);
$nb_caracteres_a_remplacer = mb_strlen($section_page_originale) - $infos_section['longueur_titre'];
$nouveau_contenu = substr_replace($corps, $section_remplacement, $infos_section['debut'], $nb_caracteres_a_remplacer);
return $nouveau_contenu;
}
private function ecrirePage($nom_page, $contenu) {
$texte_encode = $this->convertirTexteAppliVersEncodageWiki($contenu);
$ecriture = $this->wiki->SavePage($nom_page, $texte_encode, "", true);
return $ecriture;
}
private function analyserParametresEcriture($parametres) {
$this->pageNom = $parametres['pageTag'];
$this->section = isset($parametres['pageSectionTitre']) ? $parametres['pageSectionTitre'] : null;
353,19 → 222,5
throw new Exception($message, $code);
}
}
private function convertirTexteWikiVersEncodageAppli($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_appli'),Config::get('encodage_wiki'));
}
return $texte;
}
private function convertirTexteAppliVersEncodageWiki($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_wiki'),Config::get('encodage_appli'));
}
return $texte;
}
}
?>
/trunk/api/rest/index.php
36,6 → 36,8
// Création de l'objet Wiki qui sera transmis au service via le Registre
Registre::set('cheminApi', getcwd());
Registre::set('cheminWiki', realpath(dirname(__FILE__).DS.'..'.DS.'..'.DS).DS);
require_once(getcwd().DS.'..'.DS.'bibliotheque'.DS.'WikiApi.php');
$wikiApi = new WikiApi(Registre::get('cheminWiki'), Registre::get('cheminApi'));
Registre::set('wikiApi', $wikiApi);
 
/trunk/api/scripts/bibliotheque/ManipulationPage.php
File deleted
\ No newline at end of file
/trunk/api/scripts/bibliotheque/WikiApi.php
File deleted
\ No newline at end of file
/trunk/api/scripts/cli.php
35,7 → 35,8
// Création de l'objet Wiki qui sera transmis au service via le Registre
Registre::set('cheminApi', getcwd());
Registre::set('cheminWiki', realpath(dirname(__FILE__).DS.'..'.DS.'..'.DS).DS);
//require_once(getcwd().DS.'bibliotheque'.DS.'WikiApi.php');
require_once(getcwd().DS.'..'.DS.'bibliotheque'.DS.'WikiApi.php');
$wikiApi = new WikiApi(Registre::get('cheminWiki'), Registre::get('cheminApi'));
Registre::set('wikiApi', $wikiApi);
 
/trunk/api/scripts/modules/migration_smart_flore/MigrationSmartFlore.php
14,34 → 14,122
 
protected $mode_verbeux = false;
// Paramêtres autorisées lors de l'appel au script en ligne de commande
protected $parametres_autorises = array(
'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
public function executer() {
// L'obligation de mettre un paramètre -a donnée par le framework
// n'a pas de sens, ça ne doit pas être obligatoire !!!
$cmd = $this->getParametre('a');
$this->mode_verbeux = $this->getParametre('v');
switch($cmd) {
case 'tous' :
case 'migrerFormatSmartFlore' :
$this->migrerFormatSmartFlore();
break;
case 'migrerSentiersSmartFlore' :
$this->migrerSentiersSmartFlore();
break;
default:
}
}
protected function migrerSentiersSmartFlore() {
$this->wiki = Registre::get('wikiApi');
$requete = 'SELECT * FROM '.$this->wiki->GetConfigValue('table_prefix').'pages WHERE latest = "Y" '.
'AND tag = "AccesProjet" ';
$page_sentiers = $this->wiki->LoadSingle($requete);
preg_match_all("|\[\[([^\]\]]*)\]\]|", $page_sentiers['body'], $sentiers, PREG_PATTERN_ORDER);
$sentiers = $sentiers[1];
echo "Nombre de sentiers à migrer : ".count($sentiers)."\n";
$sentiers_a_inserer = array();
$valeurs_sentiers_a_inserer = array();
$fiches_a_associer = array();
$proprietaires_sentiers = array();
// Chargement du fichier contenant les propriétaires à associer aux sentiers
$fichier = file(realpath(dirname(__FILE__)).'proprietaires_sentiers.csv');
foreach ($fichier as $ligne) {
$data = str_getcsv($ligne);
if($data[2] != "") {
$proprietaires_sentiers[trim($data[0])] = trim($data[2]);
}
}
$courriel_proprietaires = array_values(array_unique($proprietaires_sentiers));
$url_infos_courriels = Config::get('annuaire_infos_courriels_url').implode(',', $courriel_proprietaires);
 
$infos_proprietaires = json_decode(file_get_contents($url_infos_courriels), true);
$infos_proprietaires_a_sentier = array();
foreach($proprietaires_sentiers as $nom_sentier => $proprietaire_sentier) {
if(isset($infos_proprietaires[$proprietaire_sentier])) {
$infos_proprietaires_a_sentier[$nom_sentier] = $infos_proprietaires[$proprietaire_sentier]['nomWiki'];
} else {
// les sentiers sans propriétaires sont affectés au compte accueil
$infos_proprietaires_a_sentier[$nom_sentier] = "AssociationTelaBotanica";
}
}
$requete_insertion = 'INSERT INTO '.$this->wiki->GetConfigValue('table_prefix').'triples '.
'(resource, property, value) VALUES ';
foreach($sentiers as $sentier) {
list($tag, $titre) = explode(' ', $sentier, 2);
$requete = 'SELECT * FROM '.$this->wiki->GetConfigValue('table_prefix').'pages WHERE latest = "Y" '.
'AND tag = "'.$tag.'" ';
$infos_sentier = $this->wiki->LoadSingle($requete);
$titre = trim($titre);
$proprietaire = !empty($infos_proprietaires_a_sentier[$titre]) ? $infos_proprietaires_a_sentier[$titre] : "AssociationTelaBotanica";
$sentiers_a_inserer[] = array(
'resource' => $titre,
'property' => 'smartFlore.sentiers',
'value' => $proprietaire
);
$valeurs_sentiers_a_inserer[] = "('".addslashes(trim($titre))."', 'smartFlore.sentiers', '".$proprietaire."')";
preg_match_all("|\[\[(SmartFlore[^(?:nt)]*nt[0-9]*)|", $infos_sentier['body'], $fiches_du_sentier, PREG_PATTERN_ORDER);
if(!empty($fiches_du_sentier[0])) {
foreach($fiches_du_sentier[1] as $fiche_du_sentier) {
$fiches_a_associer[] = array(
'resource' => $fiche_du_sentier,
'property' => 'smartFlore.sentiers.fiche',
'value' => $titre
);
$valeurs_fiches_a_associer[] = "('".$fiche_du_sentier."', 'smartFlore.sentiers.fiche', '".addslashes(trim($titre))."')";
}
}
}
$valeurs_a_inserer = $valeurs_sentiers_a_inserer + $valeurs_fiches_a_associer;
$requete_insertion .= implode(', '."\n", $valeurs_a_inserer);
// Tout est contenu dans la table triple du wiki, donc une seule requête suffit pour tout insérer
$this->wiki->Query($requete_insertion);
echo 'Migration des sentiers effectuée'."\n";
exit;
}
protected function migrerFormatSmartFlore() {
 
// sections "souples" - attention, ne seront pas "quotées" mais interprétées comme morceaux de regexp directement !
$sections = array("Fiche simplifi.+e Smart.+flore", "Introduction","Comment la reconna.+tre.+","Son histoire","Ses usages",".+(?:cologie|habitat).+","Ce qu.+il faut savoir.+","Sources");
$nouvelles_sections = array(
"Description" => array("Introduction","Comment la reconna.+tre.+","Son histoire"),
"Usages" => array("Ses usages", "Ce qu.+il faut savoir.+"),
"Description" => array("Introduction","Comment la reconna.+tre.+","Son histoire"),
"Usages" => array("Ses usages", "Ce qu.+il faut savoir.+"),
"Écologie & habitat" => array(".+(?:cologie|habitat).+"), // groupe non-capturant avec (?:a|b)
"Sources" => array("Sources")
"Sources" => array("Sources")
);
$where_section = 'body NOT LIKE "';
/trunk/api/scripts/modules/migration_smart_flore/proprietaires_sentiers.csv
New file
0,0 → 1,30
Sentier de Bavay par le CPIE Bocage de l'Avesnois,Jean-Baptiste Lefevre,jb.lefevre@hotmail.fr
Sentier du parc du Banco à Abidjan,François Malan,
Sentier atelier bleu cap,Clélia eychenne,c.eychenne@atelierbleu.fr
Sentier DAL Jean Moulin,?,
Sentier Parc du CNRST,Paulin Koura,pkoura@hotmail.com
Sentier Afrique Tropicale,Tela ,accueil@tela-botanica.org
Jardin Botanique de Montpellier,Didier Morisot ,dmorisot@yahoo.fr
Arbres Remarquables,Tela ,accueil@tela-botanica.org
Familles Botaniques,Tela ,accueil@tela-botanica.org
Jardin Botanique Alpin,Tela ,accueil@tela-botanica.org
Sentier d'interprétation de Lirac,"Wiki modifié par Adeline, Thibaut et c23394f1.fsp.oleane.fr",
Sauvage de ma rue,Tela ,accueil@tela-botanica.org
Observatoire des Saisons,Tela ,accueil@tela-botanica.org
Sentier botanique Fête de la Nature,Tela ,accueil@tela-botanica.org
Parcours CFA Montpellier,Tela ,accueil@tela-botanica.org
Opération libre à Gerardmer,Tela ,accueil@tela-botanica.org
Sentier temporaire au Domaine du Soucy,Adeline Tonnin,a.tonnin@cc-paysdelimours.fr
Sentier du LEGTA de Vendôme,Alexis Villeneuve,alexis.villeneuve@gmail.com
Sentier du Gîte de La Biolette,Danielle Daurelle,gite@biolette.com
Sentier Les restanques Le Loup,Virginie Bueil,
Sentier botanique du Vieux Sahune,Vincent Aubert,vaubert@baronnies-provencales.fr
Chemin de Béost à Bagès : Cami Vielh,Dany Roussel,dany.roussel4@orange.fr
Le Grand Mas sentier botanique du Grand Mas,Olivier Lemaire,
Sentier Botanique de Teyran,Monique Mirès,moniquemires@free.fr
Exposition de Tela,Tela ,accueil@tela-botanica.org
Sentier de Clavary-Valcluse,Louis Amandier,louis.amandier@gmail.com
Sentier de la Formation Sauvages au CNFPT Montpellier,Tela ,accueil@tela-botanica.org
Sentier Festi'Seounes,François Marsick,francois.marsick@free.fr
Sauvages et ODS complétées,Tela ,accueil@tela-botanica.org
Espèces des Mission Flore,Tela ,accueil@tela-botanica.org