From 801be153986290e0730897ea05f3f89074ea1e0c Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Sun, 16 Oct 2005 22:19:37 +0000 Subject: [PATCH] - meilleure gestion des caracteres dans les backend RSS - gestion des <enclosure> sans squatter la table spip_documents (cela reste possible si on veut en activant une globale) - fonctions variees d'affichage des tags --- dist/backend.html | 8 ++--- dist/site.html | 5 ++- ecrire/inc_filtres.php3 | 45 ++++++++++++++++++++++---- ecrire/inc_sites.php3 | 71 ++++++++++++++++++++++++++++------------- ecrire/inc_version.php3 | 6 ++++ ecrire/sites.php3 | 1 + 6 files changed, 103 insertions(+), 33 deletions(-) diff --git a/dist/backend.html b/dist/backend.html index 4f30e4ddc0..3f90901998 100644 --- a/dist/backend.html +++ b/dist/backend.html @@ -51,11 +51,11 @@ syndication plus riche. ][(#ENV{full}|?{' ',''}) - <content:encoded>[(#LOGO_ARTICLE|right||html_backend) - ][<div class='rss_chapo'>(#CHAPO|html_backend)</div> - ][<div class='rss_texte'>(#TEXTE|html_backend)</div> + <content:encoded>[(#LOGO_ARTICLE|right||texte_backend) + ][<div class='rss_chapo'>(#CHAPO|texte_backend)</div> + ][<div class='rss_texte'>(#TEXTE|texte_backend)</div> ][<hr /> - <div class='rss_notes'>(#NOTES|html_backend)</div> + <div class='rss_notes'>(#NOTES|texte_backend)</div> ]</content:encoded> ] diff --git a/dist/site.html b/dist/site.html index 7b4077df03..440c3fe0ee 100644 --- a/dist/site.html +++ b/dist/site.html @@ -72,8 +72,11 @@ <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{0,10}> <h2><a href="#URL_ARTICLE">#TITRE</a></h2> <div class="detail"> + [<div style='float:#LANG_RIGHT;'>(#TAGS|afficher_enclosures)</div>] [(#DATE|nom_jour)] [(#DATE|affdate)] - [: (#DESCRIPTIF)] [— <em>(#TAGS)</em>] + [: (#DESCRIPTIF)] + [— <em>(#TAGS|afficher_tags{'category'})</em>] + [— <em>(#TAGS|afficher_tags{'tag'})</em>] </div> <br /> diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3 index dc79218ed9..bae957dcc7 100644 --- a/ecrire/inc_filtres.php3 +++ b/ecrire/inc_filtres.php3 @@ -98,9 +98,15 @@ function corriger_caracteres ($texte) { } -// Nettoyer les backend +// Encode du HTML pour transmission XML function texte_backend($texte) { + // si on a des liens ou des images, les passer en absolu + $texte = liens_absolus($texte); + + // echapper les tags > < et & + $texte = preg_replace(',&(gt|lt|amp);,', '&\1;', $texte); + // importer les é $texte = filtrer_entites($texte); @@ -127,11 +133,6 @@ function texte_backend($texte) { return $texte; } -// Encode du HTML pour transmission XML -function html_backend($texte) { - return texte_backend(str_replace('&', '&', liens_absolus($texte))); -} - // Enleve le numero des titres numerotes ("1. Titre" -> "Titre") function supprimer_numero($texte) { $texte = preg_replace(",^[[:space:]]*[0-9]+[.)".chr(176)."][[:space:]]+,", "", $texte); @@ -1443,4 +1444,36 @@ function email_valide($adresses) { return $adresse; } +// Pour un champ de microformats : +// afficher les tags +// ou afficher les enclosures +function extraire_tags($tags) { + if (preg_match_all(',<a([[:space:]][^>]*)?[[:space:]][^>]*>.*</a>,Uims', + $tags, $regs, PREG_PATTERN_ORDER)) + return $regs[0]; + else + return array(); +} +function afficher_enclosures($tags) { + $s = array(); + foreach (extraire_tags($tags) as $tag) { + if (extraire_attribut($tag, 'rel') == 'enclosure' + AND $t = urldecode(extraire_attribut($tag, 'href'))) { + $s[] = http_href_img($t, + 'attachment.gif', + 'height="15" width="15" border="0"', + entites_html($t)); + } + } + return join(' ', $s); +} +function afficher_tags($tags, $rels='tag,category') { + $s = array(); + foreach (extraire_tags($tags) as $tag) { + $rel = extraire_attribut($tag, 'rel'); + if (strstr(",$rels,", ",$rel,")) + $s[] = $tag; + } + return join(', ', $s); +} ?> diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3 index 45e8523a42..f6ab932da6 100644 --- a/ecrire/inc_sites.php3 +++ b/ecrire/inc_sites.php3 @@ -291,7 +291,15 @@ function analyser_site($url) { } // Inserer les references aux fichiers joints +// presentes sous la forme microformat <a rel="enclosure"> function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) { + if (!preg_match_all( + ',<a([[:space:]][^>]*)?[[:space:]]rel=[\'"]enclosure[^>]*>,', + $enclosures, $regs, PREG_PATTERN_ORDER)) + return false; + $enclosures = $regs[0]; + + include_ecrire('inc_filtres.php3'); # pour extraire_attribut list($id_syndic_article) = spip_fetch_array(spip_query( "SELECT id_syndic_article FROM spip_syndic_articles @@ -303,15 +311,13 @@ function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) { // Integrer les enclosures foreach ($enclosures as $enclosure) { - // url et type sont obligatoires - if (preg_match(',[[:space:]]url=[\'"]?([^\'">]*),i', - $enclosure, $enc_regs_url) - AND preg_match(',[[:space:]]type=[\'"]?([^\'">]*),i', - $enclosure, $enc_regs_type)) { + // href et type sont obligatoires + if ($enc_regs_url = extraire_attribut($enclosure,'href') + AND $enc_regs_type = extraire_attribut($enclosure,'type')) { - $url = substr(urldecode($enc_regs_url[1]), 0,255); + $url = substr(urldecode($enc_regs_url), 0,255); $url = addslashes(abs_url($url, $le_lien)); - $type = $enc_regs_type[1]; + $type = $enc_regs_type; // Verifier que le content-type nous convient list($id_type) = spip_fetch_array(spip_query("SELECT id_type @@ -325,12 +331,7 @@ function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) { } // length : optionnel (non bloquant) - if (preg_match(',[[:space:]]length=[\'"]?([^\'"]*),i', - $enclosure, $enc_regs_length)) { - $taille = intval($enc_regs_length[1]); - } else { - $taille = 0; - } + $taille = intval(extraire_attribut($enclosure, 'length')); // Inserer l'enclosure dans la table spip_documents if ($t = spip_fetch_array(spip_query("SELECT id_document FROM @@ -568,7 +569,8 @@ function analyser_backend($rss) { // Trouver les pieces jointes <enclosure> (RSS) if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i', $item, $matches, PREG_PATTERN_ORDER)) - $data['enclosures'] = $matches[0]; + $data['enclosures'] = join(', ', + array_map('enclosure2microformat', $matches[0])); $articles[] = $data; } @@ -576,10 +578,24 @@ function analyser_backend($rss) { return $articles; } +// Passe un <enclosure url="fichier" length="5588242" type="audio/mpeg"/> +// au format microformat <a rel="enclosure" href="fichier" ...>fichier</a> +function enclosure2microformat($e) { + include_ecrire('inc_filtres.php3'); + $url = extraire_attribut($e, 'url'); + $fichier = basename($url) OR $fichier; + $e = preg_replace(',<enclosure[[:space:]],i','<a rel="enclosure" ', $e) + . $fichier.'</a>'; + $e = inserer_attribut($e, 'url', ''); + $e = inserer_attribut($e, 'href', filtrer_entites($url)); + $e = str_replace('/>', '>', $e); + return $e; +} + // // Insere un article syndique (renvoie true si l'article est nouveau) // -function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume) { +function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $url_syndic, $resume, $documents) { // Creer le lien s'il est nouveau - cle=(id_syndic,url) $le_lien = substr($data['url'], 0,255); @@ -616,6 +632,12 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $u $update_date = $data['lastbuilddate'] ? "date = FROM_UNIXTIME(".$data['lastbuilddate'].")," : ''; + // tags & enclosures + if ($data['tags'] AND $data['enclosures']) + $tags = $data['tags'].', '.$data['enclosures']; + else + $tags = $data['tags'].$data['enclosures']; + // Mise a jour du contenu (titre,auteurs,description,date?,source...) spip_query ("UPDATE spip_syndic_articles SET titre='".addslashes($data['titre'])."', @@ -625,11 +647,12 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $u lang='".addslashes(substr($data['lang'],0,10))."', source='".addslashes(substr($data['source'],0,255))."', url_source='".addslashes(substr($data['url_source'],0,255))."', - tags='".addslashes($data['tags'])."' + tags='".addslashes($tags)."' WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'"); // Inserer les enclosures - if ($data['enclosures']) { + if ($GLOBALS['integrer_enclosures'] + AND $data['enclosures']) { traiter_les_enclosures_rss($data['enclosures'], $now_id_syndic, $le_lien); } @@ -678,7 +701,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') { $urls = array(); foreach ($articles as $data) { if ($data['url']) { - inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume']); + inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $url_syndic, $row['resume'], $row['documents']); $urls[] = $data['url']; } } @@ -904,7 +927,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false $id_syndic_article=$row["id_syndic_article"]; $id_syndic=$row["id_syndic"]; - $titre=typo($row["titre"]); + $titre=safehtml($row["titre"]); $url=$row["url"]; $date=$row["date"]; $lesauteurs=typo($row["lesauteurs"]); @@ -940,7 +963,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false $s.= " ($date)"; // S'il y a des fichiers joints (enclosures), on les affiche ici - if (spip_num_rows($q = spip_query("SELECT docs.* FROM spip_documents AS docs, spip_documents_syndic AS lien WHERE lien.id_syndic_article = $id_syndic_article AND lien.id_document = docs.id_document"))) { +/* if (spip_num_rows($q = spip_query("SELECT docs.* FROM spip_documents AS docs, spip_documents_syndic AS lien WHERE lien.id_syndic_article = $id_syndic_article AND lien.id_document = docs.id_document"))) { include_ecrire('inc_documents.php3'); while ($t = spip_fetch_array($q)) { $t = $t['fichier']; @@ -951,15 +974,19 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false entites_html($t)); } } +*/ + // Tags : d'un cote les enclosures, de l'autre les liens + if($e = afficher_enclosures($row['tags'])) + $s .= ' '.$e; // descriptif if (strlen($descriptif) > 0) $s .= "<div class='arial1'>".safehtml($descriptif)."</div>"; // tags - if (strlen($row['tags'])) + if ($tags = afficher_tags($row['tags'])) $s .= "<div style='float:$spip_lang_right;'><em>" - . $row['tags'] . '</em></div>'; + . $tags . '</em></div>'; // source if (strlen($row['url_source'])) diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3 index e936d8f375..b3ad7b7a65 100644 --- a/ecrire/inc_version.php3 +++ b/ecrire/inc_version.php3 @@ -240,6 +240,12 @@ $test_i18n = false; // faut-il souligner en gris, dans articles.php3, les espaces insecables ? $activer_revision_nbsp = false; +// Syndication : faut-il integrer les <enclosure> des flux RSS sous +// forme de documents distants dans la table spip_documents ? +// (par defaut, on se contente de conserver une trace de ces documents +// dans le champ #TAGS de l'article syndique). +$integrer_enclosures = false; + // gestion des extras (voir inc_extra.php3 pour plus d'informations) $champs_extra = false; $champs_extra_proposes = false; diff --git a/ecrire/sites.php3 b/ecrire/sites.php3 index bf8d61e0d3..eb43403880 100644 --- a/ecrire/sites.php3 +++ b/ecrire/sites.php3 @@ -429,6 +429,7 @@ if ($syndication == "oui" OR $syndication == "off" OR $syndication == "sus") { )); // Oublier les vieux liens ? + // Depublier les liens qui ne figurent plus ? # appliquer les choix if ($miroir == 'oui' OR $miroir == 'non') spip_query("UPDATE spip_syndic SET miroir='$miroir' -- GitLab