From d4d827118c464b8a657a8c8085345d0ee6d73603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Fri, 15 Oct 2010 09:50:40 +0200 Subject: [PATCH] XSLT : XML -> XHTML5 --- cms2/code/TODO | 7 ----- cms2/code/document.php | 20 +++++++++---- cms2/code/main.php | 12 ++++---- cms2/code/page.php | 6 ++-- cms2/code/util.php | 14 +++++++++ cms2/code/xslt/xhtml5.xsl | 62 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 cms2/code/xslt/xhtml5.xsl diff --git a/cms2/code/TODO b/cms2/code/TODO index 90bad70..9dae6fe 100644 --- a/cms2/code/TODO +++ b/cms2/code/TODO @@ -1,10 +1,3 @@ -- get() renvoie la valeur par défaut quand null dans la BDD (mais comment faire les tris ?). - Donc, quand on crée une page, on met les valeurs par défaut. Et s'il y a besoin de pouvoir modifier les valeurs par défaut et que ça - suive dans la BDD, on fait pour chaque table une table nom_table__defaut (ou pour chaque colonne une colonne nom_colonne__defaut), qui - indique pour chaque cellule si elle est à la valeur par défaut (et en cas de changement de la valeur par défaut, on update les cellules - correspondantes dans la table avec la nouvelle valeur par défaut). -- reset : set avec la valeur par défaut. - - Debug : grouper les erreurs, améliorer l'affichage. - Valeur de retour des res_t_xxx ? diff --git a/cms2/code/document.php b/cms2/code/document.php index 0243c1e..dfb930b 100644 --- a/cms2/code/document.php +++ b/cms2/code/document.php @@ -49,7 +49,14 @@ class ElementDocument { $this->attr[$nom] = $valeur; } - public function to_XHTML_5($indent = "") { + public function to_XHTML_5() { + return applyXSLT($this->to_XML(), dirname(__FILE__) . "/xslt/xhtml5.xsl"); + } + + public function to_XML($indent = "") { + if ($this->type == "litteral") { + return $this->attr['valeur']; + } $ret = ""; $ret .= "$indent<" . $this->type; foreach ($this->attr as $k => $v) { @@ -60,7 +67,7 @@ class ElementDocument { } else { $ret .= ">\n"; foreach ($this->enfants as $k => $v) { - $ret .= $v->to_XHTML_5($indent . " "); + $ret .= $v->to_XML($indent . " "); } $ret .= "$indenttype . ">\n"; } @@ -105,7 +112,7 @@ class ElementDocument { $max = 0; foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) { if (!isset($args[$i])) { - Debug::error("Argument manquant : $nom pour " . $elem->type); + Debug::erreur("Argument manquant : $nom pour " . $elem->type); } $elem->attr($nom, $args[$i]); $max = $i; @@ -135,7 +142,7 @@ class ElementDocument { } elseif (self::has_widget($fn)) { return $this->créer_widget($fn, $args); } else { - Debug::error("Impossible d'ajouter un élément $fn à " . $this->type); + Debug::erreur("Impossible d'ajouter un élément $fn à " . $this->type); return null; } } @@ -145,6 +152,7 @@ class Document extends ElementDocument { protected $singletons = array(); public function __construct() { parent::__construct("document", $this); + $this->erreurs(); $this->header(); $this->nav(); $this->article(); @@ -153,9 +161,11 @@ class Document extends ElementDocument { } $inline_elems = "span text a strong em img"; -ElementDocument::add_type("document", "header footer nav article script style"); +ElementDocument::add_type("document", "erreurs header footer nav article script style"); ElementDocument::add_type(true, "header", "title"); +ElementDocument::add_type(true, "erreurs", "litteral"); ElementDocument::add_type("title", "text"); +ElementDocument::add_type("litteral", "", "valeur"); ElementDocument::add_type(true, "footer", ""); ElementDocument::add_type(true, "nav", "ul"); ElementDocument::add_type(true, "article", "ul hX table p form span"); // span ? diff --git a/cms2/code/main.php b/cms2/code/main.php index 4334f51..ecb4cbf 100644 --- a/cms2/code/main.php +++ b/cms2/code/main.php @@ -7,7 +7,6 @@ function verifications() { verifications(); function main() { - echo "
";
 	initModules();
 	
 	// Attention ! ne pas garder BDD::reset() en production !
@@ -21,14 +20,13 @@ function main() {
 	}
 	
 	$rendu = $page->rendu($res);
-	$rendu = htmlspecialchars($rendu->to_XHTML_5());
-	
 	BDD::close();
-	
-	echo Debug::afficher();
-	echo "
";
+
+	$rendu->erreurs()->litteral(Debug::afficher());
+	$rendu = $rendu->to_XHTML_5();
+
 	echo $rendu;
-	echo "
"; + // echo "
" . htmlspecialchars($rendu) . "
"; } ?> \ No newline at end of file diff --git a/cms2/code/page.php b/cms2/code/page.php index 3f93193..83bb290 100644 --- a/cms2/code/page.php +++ b/cms2/code/page.php @@ -70,7 +70,7 @@ function type_liens($groupe, $type = null) { mPage::$limitation_infos_module = $lim; } else { if ($type === null) { - Debug::error('fonction type_liens() : le paramètres $type est obligatoire.'); + Debug::erreur('fonction type_liens() : le paramètres $type est obligatoire.'); } // TODO : ... jusqu'ici (mPage::$modules[$m]['types_enfants'] peut être factorisé aussi (pas pour attribut)). mPage::$modules[$m]['type_liens'][$groupe] = $type; @@ -90,10 +90,10 @@ function attribut($nom, $type = null, $defaut = null) { mPage::$limitation_infos_module = $lim; } else { if ($type === null || $defaut === null) { - Debug::error('fonction attribut() : les paramètres $type et $defaut est obligatoire.'); + Debug::erreur('fonction attribut() : les paramètres $type et $defaut est obligatoire.'); } if (!Document::has_widget("w_" . $type)) { - Debug::error("L'attribut $nom a le type $type, mais aucun widget w_$type n'existe."); + Debug::erreur("L'attribut $nom a le type $type, mais aucun widget w_$type n'existe."); } mPage::$modules[$m]['attributs'][$nom] = array("global" => false, "type" => $type, "defaut" => $defaut); } diff --git a/cms2/code/util.php b/cms2/code/util.php index 33d9d43..3998ed8 100644 --- a/cms2/code/util.php +++ b/cms2/code/util.php @@ -23,6 +23,20 @@ function str_contains($str, $small) { return strpos($str, $small) !== false; } +function applyXSLT($xml, $xslt_file) { + $dom = new DOMDocument(); + $dom->preserveWhiteSpace = false; + $dom->loadXML($xml); + + $xsl = new DOMDocument(); + $xsl->load($xslt_file); // LIBXML_NOCDATA ? + + $xslt = new XSLTProcessor(); + $xslt->importStylesheet($xsl); + + return $xslt->transformToXML($dom); +} + /**** Début PATH ****/ // http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/ diff --git a/cms2/code/xslt/xhtml5.xsl b/cms2/code/xslt/xhtml5.xsl new file mode 100644 index 0000000..557a4e8 --- /dev/null +++ b/cms2/code/xslt/xhtml5.xsl @@ -0,0 +1,62 @@ + + + + + + + + <xsl:value-of select="header/title/text/@text"/> + + + + + + + + + + +
+ +
+
+ + +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +