XSLT : XML -> XHTML5

This commit is contained in:
Georges Dupéron 2010-10-15 09:50:40 +02:00
parent bdc1fc7016
commit d4d827118c
6 changed files with 99 additions and 22 deletions

View File

@ -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 ?

View File

@ -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 .= "$indent</" . $this->type . ">\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 ?

View File

@ -7,7 +7,6 @@ function verifications() {
verifications();
function main() {
echo "<pre>";
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 "<pre>";
$rendu->erreurs()->litteral(Debug::afficher());
$rendu = $rendu->to_XHTML_5();
echo $rendu;
echo "</pre>";
// echo "<pre>" . htmlspecialchars($rendu) . "</pre>";
}
?>

View File

@ -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);
}

View File

@ -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/

62
cms2/code/xslt/xhtml5.xsl Normal file
View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="no" encoding="utf-8"/>
<xsl:template match="document">
<html>
<head>
<title>
<xsl:value-of select="header/title/text/@text"/>
</title>
</head>
<body>
<xsl:apply-templates select="erreurs"/>
<xsl:apply-templates select="article"/>
</body>
</html>
</xsl:template>
<xsl:template match="article">
<article>
<xsl:apply-templates select="*"/>
</article>
</xsl:template>
<xsl:template match="hX">
<h1>
<xsl:apply-templates select="*"/>
</h1>
</xsl:template>
<xsl:template match="a">
<a href="{@href}">
<xsl:apply-templates select="*"/>
</a>
</xsl:template>
<xsl:template match="span">
<!-- TODO : mettre le class="?" ssi c'est non vide. -->
<span class="{@class}">
<xsl:apply-templates select="*"/>
</span>
</xsl:template>
<xsl:template match="p|ul|li">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="*"/>
</xsl:element>
</xsl:template>
<xsl:template match="text">
<xsl:value-of select="@text"/>
</xsl:template>
<xsl:template match="erreurs">
<xsl:apply-templates select="*" mode="copy"/>
</xsl:template>
<xsl:template match="@*|*|text()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|*|text()" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>