Browse Source

Correction du bug #16 - OPML exporté non valide

Fixes #16
Supprime les entités non nécessaires des urls.

1/ retrait de toutes les entités.
2/ échappements des entités XML.
3/ remplacement des espaces non-signifiants par une seule espace.

L'export de l'OPML a été testé :
* sur le validateur de http://validator.opml.org
* sur "xmllint --format", qui ne modifie pas le fichier (c'est bien).
* sur Akregator, un lecteur de flux
* sur Leed lui-même et un ré-export de Leed après un import d'un export OPML
Christophe HENRY 7 years ago
parent
commit
48c94a1190
1 changed files with 21 additions and 1 deletions
  1. 21 1
      Opml.class.php

+ 21 - 1
Opml.class.php

@@ -26,7 +26,27 @@ class Opml  {
 	 * Convertit les caractères qui interfèrent avec le XML
 	 */
 	protected function escapeXml($string) {
-		return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
+		/** Les entités sont utiles pour deux raisons : encodage et
+		échappement. L'encodage n'est pas un problème, l'application travaille
+		nativement avec Unicode. L'échappement dans XML impose d'échapper les
+		esperluettes (&) et les guillemets. Ces derniers sont utilisés comme
+		séparateur de chaine. Les simples cotes restent intactes.
+		* On retire toutes les entités de sorte à obtenir une chaîne totalement
+		  en UTF-8. Elle peut alors contenir des & et des ", nocifs pour XML.
+		* On échappe les caractères & et " de sorte à ce que le contenu dans le
+		  XML soit correct. On suppose qu'à la lecture, cet échappement est
+		  annulé.
+		* Accessoirement, on remplace les espaces non signifiants par une seule
+		  espace. C'est le cas des retours chariots physiques, non
+		  interprétables.
+		*/		
+		// Retire toutes les entités, & é etc.
+		$string = html_entity_decode($string, ENT_COMPAT, 'UTF-8' );
+		// Remet les entités HTML comme & mais ne touche pas aux accents.
+ 		$string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
+ 		// Supprime les blancs non signifiants comme les sauts de ligne.
+ 		$string = preg_replace('/\s+/', ' ', $string);
+		return $string;
 	}
 
 	/**