Browse Source

Déplacements de fichiers dans le plugin sites

spip-3.0
marcimat@rezo.net 12 years ago
parent
commit
2138170687
  1. 6
      .gitattributes
  2. 287
      action/editer_site.php
  3. 33
      action/instituer_site.php
  4. 28
      action/instituer_syndic.php
  5. 48
      inc/instituer_site.php
  6. 116
      inc/site.php
  7. 412
      inc/syndic.php

6
.gitattributes vendored

@ -1,4 +1,7 @@
* text=auto !eol
action/editer_site.php -text
action/instituer_site.php -text
action/instituer_syndic.php -text
action/instituer_syndic_article.php -text
balise/formulaire_site.php -text
exec/sites.php -text
@ -12,6 +15,9 @@ images/syndic-bg-item.png -text
images/syndic-statut-dispo-24.png -text
images/syndic-statut-off-24.png -text
images/syndic-statut-publie-24.png -text
inc/instituer_site.php -text
inc/site.php -text
inc/syndic.php -text
lang/sites_fr.php -text
/plugin.xml -text
prive/exec/controler_syndication.html -text

287
action/editer_site.php

@ -0,0 +1,287 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_editer_site_dist
function action_editer_site_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$resyndiquer = false;
include_spip('inc/filtres'); // pour vider_url()
if (preg_match(',options/(\d+),',$arg, $r)) {
$id_syndic = $r[1];
$resyndiquer = editer_site_options($id_syndic);
// Envoi depuis le formulaire d'edition d'un site existant
} else if ($id_syndic = intval($arg)) {
// reload si on change une des valeurs de syndication
if (
(_request('url_syndic') OR _request('resume') OR _request('syndication'))
AND $t = sql_fetsel('url_syndic,syndication,resume', 'spip_syndic', "id_syndic=".sql_quote($id_syndic))
AND (
(_request('url_syndic') AND _request('url_syndic') != $t['url_syndic'])
OR
(_request('syndication') AND _request('syndication') != $t['syndication'])
OR
(_request('resume') AND _request('resume') != $t['resume'])
)
)
set_request('reload', 'oui');
revisions_sites($id_syndic);
// Envoi normal depuis le formulaire de creation d'un site
}
elseif (strlen(vider_url(_request('url_site')))
AND strlen(_request('nom_site'))) {
set_request('reload', 'oui');
$id_syndic = insert_syndic(_request('id_parent'));
revisions_sites($id_syndic);
if ($logo = _request('logo')
AND $format_logo = _request('format_logo'))
@rename($logo,
_DIR_IMG . 'siteon'.$id_syndic.'.'.$format_logo);
}
// Erreur
else {
include_spip('inc/headers');
redirige_url_ecrire();
}
// Re-syndiquer le site
if (_request('reload') == 'oui') {
// Effacer les messages si on supprime la syndication
if (_request('syndication') == 'non')
sql_delete("spip_syndic_articles", "id_syndic=".sql_quote($id_syndic));
$t = sql_getfetsel('descriptif', 'spip_syndic', "id_syndic=$id_syndic AND syndication IN ('oui', 'sus', 'off')", '','', 1);
if ($t !== NULL) {
// Si descriptif vide, chercher le logo si pas deja la
$chercher_logo = charger_fonction('chercher_logo', 'inc');
if (!$logo = $chercher_logo($id_syndic, 'id_syndic', 'on')
OR !$t) {
if ($auto = vider_url(_request('url_auto'))) {
$auto = analyser_site($auto);
if (!strlen($t) AND strlen($auto['descriptif']))
revisions_sites($id_syndic, array('descriptif' => $auto['descriptif']));
}
if (!$logo
AND $auto['logo'] AND $auto['format_logo'])
@rename($auto['logo'],
_DIR_IMG . 'siteon'.$id_syndic.'.'.$auto['format_logo']);
}
$resyndiquer = true;
}
}
if ($resyndiquer) {
// ah si PHP connaisait les fermetures...
// A la place, une constante utilisee exclusivement
// dans la fct suivante.
define('_GENIE_SYNDIC_NOW', $id_syndic);
// forcer l'execution immediate de cette tache
// (i.e. appeler la fct suivante avec gestion du verrou)
cron(0, array('syndic' => -91));
}
if (_request('redirect')) {
$redirect = parametre_url(urldecode(_request('redirect')),
'id_syndic', $id_syndic, '&');
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_syndic,'');
}
// Cette fonction redefinit la tache standard de syndication
// pour la forcer a syndiquer le site dans la globale genie_syndic_now
// http://doc.spip.org/@genie_syndic
function genie_syndic($t) {
include_spip('genie/syndic');
define('_GENIE_SYNDIC', 2); // Pas de faux message d'erreur
$t = syndic_a_jour(_GENIE_SYNDIC_NOW);
return $t ? 0 : _GENIE_SYNDIC_NOW;
}
// http://doc.spip.org/@insert_syndic
function insert_syndic($id_rubrique) {
include_spip('inc/rubriques');
// Si id_rubrique vaut 0 ou n'est pas definie, creer le site
// dans la premiere rubrique racine
if (!$id_rubrique = intval($id_rubrique)) {
$id_rubrique = sql_getfetsel("id_rubrique", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
}
// Le secteur a la creation : c'est le secteur de la rubrique
$id_secteur = sql_getfetsel("id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");
$champs = array(
'id_rubrique' => $id_rubrique,
'id_secteur' => $id_secteur,
'statut' => 'prop',
'date' => date('Y-m-d H:i:s'));
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_syndic',
),
'data' => $champs
)
);
$id_syndic = sql_insertq("spip_syndic", $champs);
pipeline('post_insertion',
array(
'args' => array(
'table' => 'spip_syndic',
'id_objet' => $id_syndic
),
'data' => $champs
)
);
return $id_syndic;
}
// Enregistre une revision de syndic
// $c est un contenu (par defaut on prend le contenu via _request())
// http://doc.spip.org/@revisions_sites
function revisions_sites ($id_syndic, $c=false) {
include_spip('inc/rubriques');
// champs normaux
if ($c === false) {
$c = array();
foreach (array(
'nom_site', 'url_site', 'descriptif', 'url_syndic', 'syndication', 'statut', 'id_parent'
) as $champ)
if (($a = _request($champ)) !== null)
$c[$champ] = $a;
}
// Si le site est publie, invalider les caches et demander sa reindexation
$t = sql_getfetsel("statut", "spip_syndic", "id_syndic=$id_syndic");
if ($t == 'publie') {
$invalideur = "id='id_syndic/$id_syndic'";
$indexation = true;
}
include_spip('inc/modifier');
modifier_contenu('syndic', $id_syndic,
array(
'nonvide' => array('nom_site' => _T('info_sans_titre')),
'invalideur' => $invalideur,
'indexation' => $indexation
),
$c);
$row = sql_fetsel("statut, id_rubrique, id_secteur", "spip_syndic", "id_syndic=$id_syndic");
$id_rubrique = $row['id_rubrique'];
$statut_ancien = $row['statut'];
$id_secteur_old = $row['id_secteur'];
$statut = $c['statut'];
if ($statut
AND $statut != $statut_ancien
AND autoriser('publierdans','rubrique',$id_rubrique)) {
$champs['statut'] = $statut;
if ($statut == 'publie') {
if ($d = _request('date', $c)) {
$champs['date'] = $d;
} else {
$champs['date'] = date('Y-m-d H:i:s');
}
}
} else
$statut = $statut_ancien;
// Changer de rubrique ?
// Verifier que la rubrique demandee est differente de l'actuelle,
// et qu'elle existe. Recuperer son secteur
if ($id_parent = intval(_request('id_parent', $c))
AND $id_parent != $id_rubrique
AND ($id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', "id_rubrique=$id_parent"))) {
$champs['id_rubrique'] = $id_parent;
if ($id_secteur_old != $id_secteur)
$champs['id_secteur'] = $id_secteur;
// si le site est publie
// et que le demandeur n'est pas admin de la rubrique
// repasser le site en statut 'prop'.
if ($statut == 'publie') {
if (!autoriser('publierdans','rubrique',$id_parent))
$champs['statut'] = $statut = 'prop';
}
}
if (!$champs) return;
// Enregistrer les modifications
sql_updateq('spip_syndic', $champs, "id_syndic=$id_syndic");
// Invalider les caches
if ($statut == 'publie') {
include_spip('inc/invalideur');
suivre_invalideur("id='id_syndic/$id_syndic'");
}
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituersite', $id_syndic,
array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>($champs['date']?$champs['date']:$row['date']))
);
}
include_spip('inc/rubriques');
calculer_rubriques_if($id_rubrique, $champs, $statut_ancien);
}
// Enregistrre les options et retourne True s'il faut syndiquer.
// http://doc.spip.org/@editer_site_options
function editer_site_options($id_syndic)
{
$moderation = _request('moderation');
$miroir = _request('miroir');
$oubli = _request('oubli');
$resume = _request('resume');
if ($moderation == 'oui' OR $moderation == 'non')
sql_updateq("spip_syndic", array("moderation" => $moderation), "id_syndic=$id_syndic");
if ($miroir == 'oui' OR $miroir == 'non')
sql_updateq("spip_syndic", array("miroir" => $miroir ), "id_syndic=$id_syndic");
if ($oubli == 'oui' OR $oubli == 'non')
sql_updateq("spip_syndic", array("oubli" => $oubli), "id_syndic=$id_syndic");
if (!($resume == 'oui' OR $resume == 'non')) return false;
sql_updateq("spip_syndic", array("resume" => $resume ), "id_syndic=$id_syndic");
return true;
}
?>

33
action/instituer_site.php

@ -0,0 +1,33 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_instituer_site_dist
function action_instituer_site_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_syndic, $statut) = preg_split('/\W/', $arg);
$cond = "id_syndic=" . intval($id_syndic);
$row = sql_fetsel("statut, id_rubrique", "spip_syndic", $cond);
if (!$row OR ($row['statut'] == $statut)) return;
sql_updateq("spip_syndic", array("statut" => $statut), $cond);
include_spip('inc/rubriques');
calculer_rubriques_if($row['id_rubrique'], array('statut' => $statut), $row['statut']);
}
?>

28
action/instituer_syndic.php

@ -0,0 +1,28 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_instituer_syndic_dist
function action_instituer_syndic_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_syndic_article, $statut) = preg_split('/\W/', $arg);
$id_syndic_article = intval($id_syndic_article);
sql_updateq("spip_syndic_articles", array("statut" => $statut), "id_syndic_article=$id_syndic_article");
}
?>

48
inc/instituer_site.php

@ -0,0 +1,48 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@inc_instituer_site_dist
function inc_instituer_site_dist($id_syndic, $statut=-1)
{
if ($statut == -1) return "";
$liste_statuts = array(
// statut => array(titre,image)
'prop' => array(_T('info_statut_site_3'),''),
'publie' => array(_T('info_statut_site_2'),''),
'refuse' => array(_T('info_statut_site_4'),'')
);
if (!in_array($statut, array_keys($liste_statuts)))
$liste_statuts[$statut] = array($statut,'');
$res =
"<ul id='instituer_site-$id_syndic' class='instituer_site instituer'>"
. "<li>" . _T('info_statut_site_1')
."<ul>";
$href = redirige_action_auteur('editer_site',$id_syndic,'sites', "id_syndic=$id_syndic" /*"&id_parent=$id_rubrique"*/);
foreach($liste_statuts as $s=>$affiche){
$href = parametre_url($href,'statut',$s);
if ($s==$statut)
$res .= "<li class='$s selected'>" . puce_statut($s) . $affiche[0] . '</li>';
else
$res .= "<li class='$s'><a href='$href' onclick='return confirm(confirm_changer_statut);'>" . puce_statut($s) . $affiche[0] . '</a></li>';
}
$res .= "</ul></li></ul>";
return $res;
}
?>

116
inc/site.php

@ -0,0 +1,116 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@analyser_site
function analyser_site($url) {
include_spip('inc/filtres');
include_spip('inc/distant');
// Accepter les URLs au format feed:// ou qui ont oublie le http://
$url = preg_replace(',^feed://,i', 'http://', $url);
if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
$texte = recuperer_page($url, true);
if (!$texte) return false;
if (preg_match(',<(channel|feed)([\:[:space:]][^>]*)?'
.'>(.*)</\1>,ims', $texte, $regs)) {
$result['syndication'] = 'oui';
$result['url_syndic'] = $url;
$channel = $regs[3];
// Pour recuperer l'entete, on supprime tous les items
$b = array_merge(
extraire_balises($channel, 'item'),
extraire_balises($channel, 'entry')
);
$header = str_replace($b,array(),$channel);
if ($t = extraire_balise($header, 'title'))
$result['nom_site'] = supprimer_tags($t);
if ($t = extraire_balises($header, 'link')) {
foreach ($t as $link) {
$u = supprimer_tags(filtrer_entites($link));
if (!strlen($u))
$u = extraire_attribut($link, 'href');
if (strlen($u)) {
// on installe l'url comme url du site
// si c'est non vide, en donnant la priorite a rel=alternate
if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel'))
OR !isset($result['url_site']))
$result['url_site'] = filtrer_entites($u);
}
}
}
$result['url_site'] = url_absolue($result['url_site'], $url);
if ($a = extraire_balise($header, 'description')
OR $a = extraire_balise($header, 'tagline')) {
$result['descriptif'] = supprimer_tags($a);
}
if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
$header, $r)
AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
AND $image = recuperer_infos_distantes($r[1])) {
if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
$result['format_logo'] = $image['extension'];
$result['logo'] = $image['fichier'];
}
else if ($image['fichier']) {
spip_unlink($image['fichier']);
}
}
}
else {
$result['syndication'] = 'non';
$result['url_site'] = $url;
if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) {
$head = filtrer_entites($regs[1]);
} else
$head = $texte;
if (preg_match(',<title[^>]*>(.*),i', $head, $regs))
$result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*,i', '', $regs[1])));
if ($a = array_merge(
extraire_balises($head, 'meta'),
extraire_balises($head, 'http-equiv')
)) {
foreach($a as $meta) {
if (extraire_attribut($meta, 'name') == 'description') {
$desc = trim(extraire_attribut($meta, 'content'));
if (!strlen($desc))
$desc = trim(extraire_attribut($meta, 'value'));
$result['descriptif'] = $desc;
}
}
}
// Cherchons quand meme un backend
include_spip('inc/distant');
include_spip('inc/feedfinder');
$feeds = get_feed_from_url($url, $texte);
// si on a a trouve un (ou plusieurs) on le note avec select:
// ce qui constitue un signal pour exec=sites qui proposera de choisir
// si on syndique, et quelle url.
if (count($feeds)>=1) {
spip_log("feedfinder.php :\n".join("\n", $feeds));
$result['url_syndic'] = "select: ".join(' ',$feeds);
}
}
return $result;
}
?>

412
inc/syndic.php

@ -0,0 +1,412 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// ATTENTION
// Cette inclusion charge executer_une_syndication pour compatibilite,
// mais cette fonction ne doit plus etre invoquee directement:
// il faut passer par cron() pour avoir un verrou portable
// Voir un exemple dans action/editer/site
include_spip('genie/syndic');
// prend un fichier backend et retourne un tableau des items lus,
// et une chaine en cas d'erreur
// http://doc.spip.org/@analyser_backend
function analyser_backend($rss, $url_syndic='') {
include_spip('inc/texte'); # pour couper()
$rss = pipeline('pre_syndication', $rss);
// si true, les URLs de type feedburner sont dereferencees
define('_SYNDICATION_DEREFERENCER_URL', false);
// Echapper les CDATA
$echappe_cdata = array();
if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss,
$regs, PREG_SET_ORDER)) {
foreach ($regs as $n => $reg) {
$echappe_cdata[$n] = $reg[1];
$rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
}
}
// supprimer les commentaires
$rss = preg_replace(',<!--.*-->,Ums', '', $rss);
// simplifier le backend, en supprimant les espaces de nommage type "dc:"
$rss = preg_replace(',<(/?)(dc):,i', '<\1', $rss);
// chercher auteur/lang dans le fil au cas ou les items n'en auraient pas
list($header) = preg_split(',<(item|entry)\b,', $rss, 2);
if (preg_match_all(
',<(author|creator)\b(.*)</\1>,Uims',
$header, $regs, PREG_SET_ORDER)) {
$les_auteurs_du_site = array();
foreach ($regs as $reg) {
$nom = $reg[2];
if (preg_match(',<name>(.*)</name>,Uims', $nom, $reg))
$nom = $reg[1];
$les_auteurs_du_site[] = trim(textebrut(filtrer_entites($nom)));
}
$les_auteurs_du_site = join(', ', array_unique($les_auteurs_du_site));
} else
$les_auteurs_du_site = '';
if ((preg_match(',<([^>]*xml:)?lang(uage)?'.'>([^<>]+)<,i',
$header, $match) AND $l = $match[3])
OR ($l = extraire_attribut(extraire_balise($header, 'feed'), 'xml:lang'))
)
$langue_du_site = $l;
// atom
elseif (preg_match(',<feed\s[^>]*xml:lang=[\'"]([^<>\'"]+)[\'"],i', $header, $match))
$langue_du_site = $match[1];
// Recuperer les blocs item et entry
$items = array_merge(extraire_balises($rss, 'item'), extraire_balises($rss, 'entry'));
//
// Analyser chaque <item>...</item> du backend et le transformer en tableau
//
if (!count($items)) return _T('avis_echec_syndication_01');
foreach ($items as $item) {
$data = array();
// URL (semi-obligatoire, sert de cle)
// guid n'est un URL que si marque de <guid ispermalink="true"> ;
// attention la valeur par defaut est 'true' ce qui oblige a quelque
// gymnastique
if (preg_match(',<guid.*>[[:space:]]*(https?:[^<]*)</guid>,Uims',
$item, $regs) AND preg_match(',^(true|1)?$,i',
extraire_attribut($regs[0], 'ispermalink')))
$data['url'] = $regs[1];
// contourner les redirections feedburner
else if (_SYNDICATION_DEREFERENCER_URL
AND preg_match(',<feedburner:origLink>(.*)<,Uims',
$item, $regs))
$data['url'] = $regs[1];
// <link>, plus classique
else if (preg_match(
',<link[^>]*[[:space:]]rel=["\']?alternate[^>]*>(.*)</link>,Uims',
$item, $regs))
$data['url'] = $regs[1];
else if (preg_match(',<link[^>]*[[:space:]]rel=.alternate[^>]*>,Uims',
$item, $regs))
$data['url'] = extraire_attribut($regs[0], 'href');
else if (preg_match(',<link[^>]*>(.*)</link>,Uims', $item, $regs))
$data['url'] = $regs[1];
else if (preg_match(',<link[^>]*>,Uims', $item, $regs))
$data['url'] = extraire_attribut($regs[0], 'href');
// Aucun link ni guid, mais une enclosure
else if (preg_match(',<enclosure[^>]*>,ims', $item, $regs)
AND $url = extraire_attribut($regs[0], 'url'))
$data['url'] = $url;
// pas d'url, c'est genre un compteur...
else
$data['url'] = '';
// Titre (semi-obligatoire)
if (preg_match(",<title[^>]*>(.*?)</title>,ims",$item,$match))
$data['titre'] = $match[1];
else if (preg_match(',<link[[:space:]][^>]*>,Uims',$item,$mat)
AND $title = extraire_attribut($mat[0], 'title'))
$data['titre'] = $title;
if (!strlen($data['titre'] = trim($data['titre'])))
$data['titre'] = _T('ecrire:info_sans_titre');
// Date
$la_date = '';
if (preg_match(',<(published|modified|issued)>([^<]*)<,Uims',
$item,$match)) {
cdata_echappe_retour($match, $echappe_cdata);
$la_date = my_strtotime($match[2]);
}
if (!$la_date AND
preg_match(',<(pubdate)>([^<]*)<,Uims',$item, $match)) {
cdata_echappe_retour($match, $echappe_cdata);
$la_date = my_strtotime($match[2]);
}
if (!$la_date AND
preg_match(',<([a-z]+:date)>([^<]*)<,Uims',$item,$match)) {
cdata_echappe_retour($match, $echappe_cdata);
$la_date = my_strtotime($match[2]);
}
if (!$la_date AND
preg_match(',<date>([^<]*)<,Uims',$item,$match)) {
cdata_echappe_retour($match, $echappe_cdata);
$la_date = my_strtotime($match[1]);
}
// controle de validite de la date
// pour eviter qu'un backend errone passe toujours devant
// (note: ca pourrait etre defini site par site, mais ca risque d'etre
// plus lourd que vraiment utile)
if ($GLOBALS['controler_dates_rss']) {
if ($la_date > time() + 48 * 3600)
$la_date = time();
}
$data['date'] = $la_date;
// Honorer le <lastbuilddate> en forcant la date
if (preg_match(',<(lastbuilddate|updated|modified)>([^<>]+)</\1>,i',
$item, $regs)
AND $lastbuilddate = my_strtotime(trim($regs[2]))
// pas dans le futur
AND $lastbuilddate < time())
$data['lastbuilddate'] = $lastbuilddate;
// Auteur(s)
if (preg_match_all(
',<(author|creator)\b[^>]*>(.*)</\1>,Uims',
$item, $regs, PREG_SET_ORDER)) {
$auteurs = array();
foreach ($regs as $reg) {
$nom = $reg[2];
if (preg_match(',<name\b[^>]*>(.*)</name>,Uims', $nom, $reg))
$nom = $reg[1];
// Cas particulier d'un auteur Flickr
if (preg_match(',nobody@flickr.com \((.*)\),Uims', $nom, $reg))
$nom = $reg[1];
$auteurs[] = trim(textebrut(filtrer_entites($nom)));
}
$data['lesauteurs'] = join(', ', array_unique($auteurs));
}
else
$data['lesauteurs'] = $les_auteurs_du_site;
// Description
if (preg_match(',<(description|summary)\b.*'
.'>(.*)</\1\b,Uims',$item,$match)) {
$data['descriptif'] = trim($match[2]);
}
if (preg_match(',<(content)\b.*'
.'>(.*)</\1\b,Uims',$item,$match)) {
$data['content'] = trim($match[2]);
}
// lang
if (preg_match(',<([^>]*xml:)?lang(uage)?'.'>([^<>]+)<,i',
$item, $match))
$data['lang'] = trim($match[3]);
else if ($lang = trim(extraire_attribut($item, 'xml:lang')))
$data['lang'] = $lang;
else
$data['lang'] = trim($langue_du_site);
// source et url_source (pas trouve d'exemple en ligne !!)
# <source url="http://www.truc.net/music/uatsap.mp3" length="19917" />
# <source url="http://www.truc.net/rss">Site source</source>
if (preg_match(',(<source[^>]*>)(([^<>]+)</source>)?,i',
$item, $match)) {
$data['source'] = trim($match[3]);
$data['url_source'] = str_replace('&amp;', '&',
trim(extraire_attribut($match[1], 'url')));
}
// tags
# a partir de "<dc:subject>", (del.icio.us)
# ou <media:category> (flickr)
# ou <itunes:category> (apple)
# on cree nos tags microformat <a rel="directory" href="url">titre</a>
# http://microformats.org/wiki/rel-directory-fr
$tags = array();
if (preg_match_all(
',<(([a-z]+:)?(subject|category|directory|keywords?|tags?|type))[^>]*>'
.'(.*?)</\1>,ims',
$item, $matches, PREG_SET_ORDER))
$tags = ajouter_tags($matches, $item); # array()
elseif (preg_match_all(
',<(([a-z]+:)?(subject|category|directory|keywords?|tags?|type))[^>]*/>'
.',ims',
$item, $matches, PREG_SET_ORDER))
$tags = ajouter_tags($matches, $item); # array()
// Pieces jointes :
// chercher <enclosure> au format RSS et les passer en microformat
// ou des microformats relEnclosure,
// ou encore les media:content
if (!afficher_enclosures(join(', ', $tags))) {
if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i',
$item, $matches, PREG_PATTERN_ORDER))
$data['enclosures'] = join(', ',
array_map('enclosure2microformat', $matches[0]));
else if (
preg_match_all(',<link\b[^<>]+rel=["\']?enclosure["\']?[^<>]+>,i',
$item, $matches, PREG_PATTERN_ORDER))
$data['enclosures'] = join(', ',
array_map('enclosure2microformat', $matches[0]));
else if (
preg_match_all(',<media:content\b[^<>]+>,i',
$item, $matches, PREG_PATTERN_ORDER))
$data['enclosures'] = join(', ',
array_map('enclosure2microformat', $matches[0]));
}
$data['item'] = $item;
// Nettoyer les donnees et remettre les CDATA en place
cdata_echappe_retour($data, $echappe_cdata);
cdata_echappe_retour($tags, $echappe_cdata);
// passer l'url en absolue
$data['url'] = url_absolue(filtrer_entites($data['url']), $url_syndic);
// Trouver les microformats (ecrase les <category> et <dc:subject>)
if (preg_match_all(
',<a[[:space:]]([^>]+[[:space:]])?rel=[^>]+>.*</a>,Uims',
$data['item'], $regs, PREG_PATTERN_ORDER)) {
$tags = $regs[0];
}
// Cas particulier : tags Connotea sous la forme <a class="postedtag">
if (preg_match_all(
',<a[[:space:]][^>]+ class="postedtag"[^>]*>.*</a>,Uims',
$data['item'], $regs, PREG_PATTERN_ORDER))
$tags = preg_replace(', class="postedtag",i',
' rel="tag"', $regs[0]);
$data['tags'] = $tags;
// enlever le html des titre pour etre homogene avec les autres objets spip
$data['titre'] = textebrut($data['titre']);
$articles[] = $data;
}
return $articles;
}
// helas strtotime ne reconnait pas le format W3C
// http://www.w3.org/TR/NOTE-datetime
// http://doc.spip.org/@my_strtotime
function my_strtotime($la_date) {
// format complet
if (preg_match(
',^(\d+-\d+-\d+[T ]\d+:\d+(:\d+)?)(\.\d+)?'
.'(Z|([-+]\d{2}):\d+)?$,',
$la_date, $match)) {
$la_date = str_replace("T", " ", $match[1])." GMT";
return strtotime($la_date) - intval($match[5]) * 3600;
}
// YYYY
if (preg_match(',^\d{4}$,', $la_date, $match))
return strtotime($match[0]."-01-01");
// YYYY-MM
if (preg_match(',^\d{4}-\d{2}$,', $la_date, $match))
return strtotime($match[0]."-01");
// utiliser strtotime en dernier ressort
$s = strtotime($la_date);
if ($s > 0)
return $s;
// YYYY-MM-DD hh:mm:ss
if (preg_match(',^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\b,', $la_date, $match))
return strtotime($match[0]);
// erreur
spip_log("Impossible de lire le format de date '$la_date'");
return false;
}
// A partir d'un <dc:subject> ou autre essayer de recuperer
// le mot et son url ; on cree <a href="url" rel="tag">mot</a>
// http://doc.spip.org/@creer_tag
function creer_tag($mot,$type,$url) {
if (!strlen($mot = trim($mot))) return '';
$mot = "<a rel=\"tag\">$mot</a>";
if ($url)
$mot = inserer_attribut($mot, 'href', $url);
if ($type)
$mot = inserer_attribut($mot, 'rel', $type);
return $mot;
}
// http://doc.spip.org/@ajouter_tags
function ajouter_tags($matches, $item) {
include_spip('inc/filtres');
$tags = array();
foreach ($matches as $match) {
$type = ($match[3] == 'category' OR $match[3] == 'directory')
? 'directory':'tag';
$mot = supprimer_tags($match[0]);
if (!strlen($mot)
AND !strlen($mot = extraire_attribut($match[0], 'label')))
break;
// rechercher un url
if ($url = extraire_attribut($match[0], 'domain')) {
// category@domain est la racine d'une url qui se prolonge
// avec le contenu text du tag <category> ; mais dans SPIP < 2.0
// on donnait category@domain = #URL_RUBRIQUE, et
// text = #TITRE_RUBRIQUE ; d'ou l'heuristique suivante sur le slash
if (substr($url, -1) == '/')
$url .= rawurlencode($mot);
}
else if ($url = extraire_attribut($match[0], 'resource')
OR $url = extraire_attribut($match[0], 'url')
)
{}
## cas particuliers
else if (extraire_attribut($match[0], 'scheme') == 'urn:flickr:tags') {
foreach(explode(' ', $mot) as $petit)
if ($t = creer_tag($petit, $type,
'http://www.flickr.com/photos/tags/'.rawurlencode($petit).'/'))
$tags[] = $t;
$mot = '';
}
else if (
// cas atom1, a faire apres flickr
$term = extraire_attribut($match[0], 'term')
) {
if ($scheme = extraire_attribut($match[0], 'scheme'))
$url = suivre_lien($scheme,$term);
else
$url = $term;
}
else {
# type delicious.com
foreach(explode(' ', $mot) as $petit)
if (preg_match(',<rdf\b[^>]*\bresource=["\']([^>]*/'
.preg_quote(rawurlencode($petit),',').')["\'],i',
$item, $m)) {
$mot = '';
if ($t = creer_tag($petit, $type, $m[1]))
$tags[] = $t;
}
}
if ($t = creer_tag($mot, $type, $url))
$tags[] = $t;
}
return $tags;
}
// Retablit le contenu des blocs [[CDATA]] dans un tableau
// http://doc.spip.org/@cdata_echappe_retour
function cdata_echappe_retour(&$table, &$echappe_cdata) {
foreach ($table as $var => $val) {
$table[$var] = filtrer_entites($table[$var]);
foreach ($echappe_cdata as $n => $e)
$table[$var] = str_replace("@@@SPIP_CDATA$n@@@",
$e, $table[$var]);
}
}
?>
Loading…
Cancel
Save