/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 |
/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/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¶m2=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); |