From e2351924cbb42f30ab4e366548b0d68988c87ed6 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 10 Oct 2005 22:08:58 +0000
Subject: [PATCH] syndication "full-html"

---
 dist/site.html             |  2 +-
 ecrire/inc_filtres.php3    |  5 +++
 ecrire/inc_majbase.php3    |  9 +++++
 ecrire/inc_serialbase.php3 |  6 ++--
 ecrire/inc_sites.php3      | 69 ++++++++++++++++++++++++--------------
 ecrire/inc_version.php3    |  2 +-
 ecrire/sites.php3          | 29 +++++++++++++++-
 7 files changed, 92 insertions(+), 30 deletions(-)

diff --git a/dist/site.html b/dist/site.html
index 97a03aab45..a6f3fc84d9 100644
--- a/dist/site.html
+++ b/dist/site.html
@@ -70,7 +70,7 @@
 <div class="liste-articles">
 
 <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{0,10}>
-	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></h2>
+	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|couper{400}|textebrut|entites_html)"]>#TITRE</a></h2>
 	<div class="detail">
 	[(#DATE|nom_jour)] [(#DATE|affdate)]
 	</div>
diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index 0c42832090..dc79218ed9 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -127,6 +127,11 @@ function texte_backend($texte) {
 	return $texte;
 }
 
+// Encode du HTML pour transmission XML
+function html_backend($texte) {
+	return texte_backend(str_replace('&', '&amp;', 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);
diff --git a/ecrire/inc_majbase.php3 b/ecrire/inc_majbase.php3
index afb5133b5c..47e43f6b6b 100644
--- a/ecrire/inc_majbase.php3
+++ b/ecrire/inc_majbase.php3
@@ -1054,6 +1054,15 @@ function maj_base() {
 		maj_version(1.826);
 	}
 
+	// Syndication : ajout de l'option resume=oui/non et de la langue
+	if ($version_installee < 1.901) {
+		spip_query("ALTER TABLE spip_syndic
+			ADD resume VARCHAR(3) DEFAULT 'oui'");
+		spip_query("ALTER TABLE spip_syndic_articles
+			ADD lang VARCHAR(10) DEFAULT '' NOT NULL");
+		maj_version(1.901);
+	}
+
 	return true;
 }
 
diff --git a/ecrire/inc_serialbase.php3 b/ecrire/inc_serialbase.php3
index 553eb37dc0..cdf3dea878 100644
--- a/ecrire/inc_serialbase.php3
+++ b/ecrire/inc_serialbase.php3
@@ -253,7 +253,8 @@ $spip_syndic = array(
 		"extra"			=> "longblob NULL",
 		"moderation"	=> "VARCHAR(3) DEFAULT 'non'",
 		"miroir"	=> "VARCHAR(3) DEFAULT 'non'",
-		"oubli"	=> "VARCHAR(3) DEFAULT 'non'"
+		"oubli"	=> "VARCHAR(3) DEFAULT 'non'",
+		"resume"	=> "VARCHAR(3) DEFAULT 'oui'"
 );
 
 $spip_syndic_key = array(
@@ -272,7 +273,8 @@ $spip_syndic_articles = array(
 		"lesauteurs"	=> "text NOT NULL",
 		"maj"	=> "TIMESTAMP",
 		"statut"	=> "VARCHAR(10) NOT NULL",
-		"descriptif"	=> "blob NOT NULL");
+		"descriptif"	=> "blob NOT NULL",
+		"lang"	=> "VARCHAR(10) DEFAULT '' NOT NULL");
 
 $spip_syndic_articles_key = array(
 		"PRIMARY KEY"	=> "id_syndic_article",
diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3
index 6143865d14..71a3a7a9c0 100644
--- a/ecrire/inc_sites.php3
+++ b/ecrire/inc_sites.php3
@@ -338,11 +338,11 @@ function analyser_site($url) {
 }
 
 // Inserer les references aux fichiers joints
-function traiter_les_enclosures_rss($enclosures,$id_syndic,$lelien) {
+function traiter_les_enclosures_rss($enclosures,$id_syndic,$le_lien) {
 
 	list($id_syndic_article) = spip_fetch_array(spip_query(
 	"SELECT id_syndic_article FROM spip_syndic_articles
-	WHERE id_syndic=$id_syndic AND url='$lelien'"));
+	WHERE id_syndic=$id_syndic AND url='".addslashes($le_lien)."'"));
 
 	// Attention si cet article est deja vu, ne pas doubler les references
 	spip_query("DELETE FROM spip_documents_syndic
@@ -357,7 +357,7 @@ function traiter_les_enclosures_rss($enclosures,$id_syndic,$lelien) {
 		$enclosure, $enc_regs_type)) {
 
 			$url = substr(urldecode($enc_regs_url[1]), 0,255);
-			$url = addslashes(abs_url($url, $lelien));
+			$url = addslashes(abs_url($url, $le_lien));
 			$type = $enc_regs_type[1];
 
 			// Verifier que le content-type nous convient
@@ -550,21 +550,19 @@ function analyser_backend($rss) {
 			$data['lesauteurs'] = $match[1];
 		else
 			$data['lesauteurs'] = $les_auteurs_du_site;
+
 		// Description
 		if (preg_match($syndic_regexp['description'],$item,$match)) {
 			$data['descriptif'] = $match[1];
 		}
-		else if (preg_match($syndic_regexp['descriptionbis'],$item,$match))
-			$data['descriptif'] = $match[1];
-		else
-			$data['descriptif'] = "";
+		if (preg_match($syndic_regexp['descriptionbis'],$item,$match))
+			$data['content'] = $match[1];
 
 		// Nettoyer les donnees et remettre les CDATA en place
 		foreach ($data as $var => $val) {
 			$data[$var] = filtrer_entites($data[$var]);
 			foreach ($echappe_cdata as $n => $e)
 				$data[$var] = str_replace("@@@SPIP_CDATA$n@@@",$e, $data[$var]);
-			$data[$var] = trim(textebrut($data[$var]));
 		}
 
 		// Honorer le <lastbuilddate> en forcant la date
@@ -594,44 +592,55 @@ function analyser_backend($rss) {
 //
 // Insere un article syndique (renvoie true si l'article est nouveau)
 //
-function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site) {
+function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $resume) {
 
 	// Creer le lien s'il est nouveau - cle=(id_syndic,url)
-	$le_lien = addslashes(substr($data['url'], 0,255));
+	$le_lien = substr($data['url'], 0,255);
 	if (spip_num_rows(spip_query(
 		"SELECT * FROM spip_syndic_articles
-		WHERE url='$le_lien'
+		WHERE url='".addslashes($le_lien)."'
 		AND id_syndic=$now_id_syndic"
 	)) == 0 and !spip_sql_error()) {
 		spip_query("INSERT INTO spip_syndic_articles
 		(id_syndic, url, date, statut) VALUES
-		('$now_id_syndic', '$le_lien',
+		('$now_id_syndic', '".addslashes($le_lien)."',
 		FROM_UNIXTIME(".$data['date']."), '$statut')");
 		$ajout = true;
 	}
 
-	// Nettoyer le descriptif par une fonction personnalisee ?
-	if (function_exists('nettoyer_descriptif_syndication')) {
-		$data['descriptif'] = nettoyer_descriptif_syndication(
-			$data['descriptif'], $now_id_syndic, $url_site
-		);
+	// Descriptif, en mode resume ou mode 'full text'
+	// on prend en priorite data['descriptif'] si on est en mode resume,
+	// et data['content'] si on est en mode "full syndication"
+	if ($resume != 'non') {
+		// mode "resume"
+		$desc = strlen($data['descriptif']) ?
+			$data['descriptif'] : $data['content'];
+		$desc = couper(trim(textebrut($desc)), 300);
 	} else {
-		// fonction standard
-		$data['descriptif'] = couper($data['descriptif'], 300);
+		// mode "full syndication"
+		// 1. choisir le contenu pertinent
+		$desc = strlen($data['content']) ?
+			$data['content'] : $data['descriptif'];
+		// 2. refaire les liens relatifs
+		$desc = liens_absolus($desc, $le_lien);
+		// 3. securiser (XSS et XHTML)
+		$desc = safehtml($desc);
+		// 4. eviter propre()
+		if (strlen($desc)) $desc = "<html>$desc</html>";
 	}
 
 	// Mise a jour du contenu (titre,auteurs,description)
 	spip_query ("UPDATE spip_syndic_articles SET
 	titre='".addslashes($data['titre'])."',
 	lesauteurs='".addslashes($data['lesauteurs'])."',
-	descriptif='".addslashes($data['descriptif'])."'
-	WHERE id_syndic='$now_id_syndic' AND url='$le_lien'");
+	descriptif='".addslashes($desc)."'
+	WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'");
 
 	// Mettre a jour la date si lastbuilddate
 	if ($data['lastbuilddate'])
 		spip_query("UPDATE spip_syndic_articles
 		SET date = FROM_UNIXTIME(".$data['lastbuilddate'].")
-		WHERE id_syndic='$now_id_syndic' AND url='$le_lien'");
+		WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'");
 
 	// Inserer les enclosures
 	if ($data['enclosures']) {
@@ -683,7 +692,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);
+				inserer_article_syndique ($data, $now_id_syndic, $moderation, $url_site, $row['resume']);
 				$urls[] = $data['url'];
 			}
 		}
@@ -1033,13 +1042,23 @@ function executer_une_syndication() {
 
 	// On va tenter un site 'sus' ou 'off' de plus de 24h, et le passer en 'off'
 	// s'il echoue
-	if ($row = spip_fetch_array(spip_query("SELECT * FROM spip_syndic WHERE syndication IN ('sus','off') AND statut='publie' AND date_syndic < DATE_SUB(NOW(), INTERVAL 24 HOUR) ORDER BY date_syndic LIMIT 1"))) {
+	$s = spip_query("SELECT * FROM spip_syndic
+	WHERE syndication IN ('sus','off')
+	AND statut='publie'
+	AND date_syndic < DATE_SUB(NOW(), INTERVAL 24 HOUR)
+	ORDER BY date_syndic LIMIT 1");
+	if ($row = spip_fetch_array($s)) {
 		$id_syndic = $row["id_syndic"];
 		syndic_a_jour($id_syndic, 'off');
 	}
 
 	// Et un site 'oui' de plus de 2 heures, qui passe en 'sus' s'il echoue
-	if ($row = spip_fetch_array(spip_query("SELECT * FROM spip_syndic WHERE syndication='oui' AND statut='publie' AND date_syndic < DATE_SUB(NOW(), INTERVAL 2 HOUR) ORDER BY date_syndic LIMIT 1"))) {
+	$s = spip_query("SELECT * FROM spip_syndic
+	WHERE syndication='oui'
+	AND statut='publie'
+	AND date_syndic < DATE_SUB(NOW(), INTERVAL 2 HOUR)
+	ORDER BY date_syndic LIMIT 1");
+	if ($row = spip_fetch_array($s)) {
 		$id_syndic = $row["id_syndic"];
 		syndic_a_jour($id_syndic, 'sus');
 	}
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index 93916a508d..0d33a4cec1 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -379,7 +379,7 @@ define_once('_AUTH_USER_FILE', '.htpasswd');
 // (utilise pour les modifs de la base de donnees)
 
 // version de la base
-$spip_version = 1.826;
+$spip_version = 1.901;
 
 // version de spip
 $spip_version_affichee = "1.9 alpha";
diff --git a/ecrire/sites.php3 b/ecrire/sites.php3
index 4d056ce127..f8c83b31a3 100644
--- a/ecrire/sites.php3
+++ b/ecrire/sites.php3
@@ -139,7 +139,8 @@ if (strval($nom_site)!='' AND $modifier_site == 'oui' AND $flag_editable) {
 	descriptif='$descriptif', syndication='$syndication', statut='$statut'
 	$add_extra WHERE id_syndic=$id_syndic");
 
-	if ($syndication_old != $syndication OR $url_syndic != $old_syndic)
+	if ($syndication_old != $syndication
+	OR $url_syndic != $old_syndic)
 		$reload = "oui";
 
 	if ($syndication_old != $syndication AND $syndication == "non")
@@ -182,6 +183,15 @@ if ($redirect AND $redirect_ok == 'oui') {
 	redirige_par_entete($redirect);
 }
 
+// Appliquer le choix resume/fulltexte (necessite un reload)
+if ($flag_editable AND ($resume == 'oui' OR $resume == 'non')) {
+	list($old_resume) = spip_fetch_array(spip_query(
+		"SELECT resume FROM spip_syndic WHERE id_syndic=$id_syndic"));
+	if ($old_resume <> $resume) $reload = 'oui';
+	spip_query("UPDATE spip_syndic SET resume='$resume'
+		WHERE id_syndic=$id_syndic");
+}
+
 
 //
 // reload
@@ -449,6 +459,23 @@ if ($syndication == "oui" OR $syndication == "off" OR $syndication == "sus") {
 
 		echo "</ul>\n";
 
+
+		// Prendre les resumes ou le texte integral ?
+		# appliquer les choix
+		if ($resume == 'oui' OR $resume == 'non')
+			spip_query("UPDATE spip_syndic SET resume='$resume'
+			WHERE id_syndic=$id_syndic");
+		if (!$resume AND !$resume = $row['resume']) $resume = 'oui';
+		echo "<p><div align='$spip_lang_left'>"
+			. _T('syndic_choix_resume') . "<br />\n";
+		afficher_choix('resume', $resume,
+			array(
+				'oui' => _T('syndic_option_resume_oui'),
+				'non' => _T('syndic_option_resume_non')
+			));
+		echo "</li>\n";
+
+
 		// Bouton "Valider"
 		echo "<div style='text-align:$spip_lang_right'><INPUT TYPE='submit' NAME='Valider' VALUE='"._T('bouton_valider')."' CLASS='fondo'></div>";
 
-- 
GitLab