XSLT : XML -> XHTML5
This commit is contained in:
parent
bdc1fc7016
commit
d4d827118c
|
@ -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.
|
- Debug : grouper les erreurs, améliorer l'affichage.
|
||||||
|
|
||||||
- Valeur de retour des res_t_xxx ?
|
- Valeur de retour des res_t_xxx ?
|
||||||
|
|
|
@ -49,7 +49,14 @@ class ElementDocument {
|
||||||
$this->attr[$nom] = $valeur;
|
$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 = "";
|
||||||
$ret .= "$indent<" . $this->type;
|
$ret .= "$indent<" . $this->type;
|
||||||
foreach ($this->attr as $k => $v) {
|
foreach ($this->attr as $k => $v) {
|
||||||
|
@ -60,7 +67,7 @@ class ElementDocument {
|
||||||
} else {
|
} else {
|
||||||
$ret .= ">\n";
|
$ret .= ">\n";
|
||||||
foreach ($this->enfants as $k => $v) {
|
foreach ($this->enfants as $k => $v) {
|
||||||
$ret .= $v->to_XHTML_5($indent . " ");
|
$ret .= $v->to_XML($indent . " ");
|
||||||
}
|
}
|
||||||
$ret .= "$indent</" . $this->type . ">\n";
|
$ret .= "$indent</" . $this->type . ">\n";
|
||||||
}
|
}
|
||||||
|
@ -105,7 +112,7 @@ class ElementDocument {
|
||||||
$max = 0;
|
$max = 0;
|
||||||
foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) {
|
foreach (self::$types[$type]["attributs_oblig"] as $i => $nom) {
|
||||||
if (!isset($args[$i])) {
|
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]);
|
$elem->attr($nom, $args[$i]);
|
||||||
$max = $i;
|
$max = $i;
|
||||||
|
@ -135,7 +142,7 @@ class ElementDocument {
|
||||||
} elseif (self::has_widget($fn)) {
|
} elseif (self::has_widget($fn)) {
|
||||||
return $this->créer_widget($fn, $args);
|
return $this->créer_widget($fn, $args);
|
||||||
} else {
|
} 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;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,6 +152,7 @@ class Document extends ElementDocument {
|
||||||
protected $singletons = array();
|
protected $singletons = array();
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
parent::__construct("document", $this);
|
parent::__construct("document", $this);
|
||||||
|
$this->erreurs();
|
||||||
$this->header();
|
$this->header();
|
||||||
$this->nav();
|
$this->nav();
|
||||||
$this->article();
|
$this->article();
|
||||||
|
@ -153,9 +161,11 @@ class Document extends ElementDocument {
|
||||||
}
|
}
|
||||||
|
|
||||||
$inline_elems = "span text a strong em img";
|
$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, "header", "title");
|
||||||
|
ElementDocument::add_type(true, "erreurs", "litteral");
|
||||||
ElementDocument::add_type("title", "text");
|
ElementDocument::add_type("title", "text");
|
||||||
|
ElementDocument::add_type("litteral", "", "valeur");
|
||||||
ElementDocument::add_type(true, "footer", "");
|
ElementDocument::add_type(true, "footer", "");
|
||||||
ElementDocument::add_type(true, "nav", "ul");
|
ElementDocument::add_type(true, "nav", "ul");
|
||||||
ElementDocument::add_type(true, "article", "ul hX table p form span"); // span ?
|
ElementDocument::add_type(true, "article", "ul hX table p form span"); // span ?
|
||||||
|
|
|
@ -7,7 +7,6 @@ function verifications() {
|
||||||
verifications();
|
verifications();
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
echo "<pre>";
|
|
||||||
initModules();
|
initModules();
|
||||||
|
|
||||||
// Attention ! ne pas garder BDD::reset() en production !
|
// Attention ! ne pas garder BDD::reset() en production !
|
||||||
|
@ -21,14 +20,13 @@ function main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
$rendu = $page->rendu($res);
|
$rendu = $page->rendu($res);
|
||||||
$rendu = htmlspecialchars($rendu->to_XHTML_5());
|
|
||||||
|
|
||||||
BDD::close();
|
BDD::close();
|
||||||
|
|
||||||
echo Debug::afficher();
|
$rendu->erreurs()->litteral(Debug::afficher());
|
||||||
echo "<pre>";
|
$rendu = $rendu->to_XHTML_5();
|
||||||
|
|
||||||
echo $rendu;
|
echo $rendu;
|
||||||
echo "</pre>";
|
// echo "<pre>" . htmlspecialchars($rendu) . "</pre>";
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
|
@ -70,7 +70,7 @@ function type_liens($groupe, $type = null) {
|
||||||
mPage::$limitation_infos_module = $lim;
|
mPage::$limitation_infos_module = $lim;
|
||||||
} else {
|
} else {
|
||||||
if ($type === null) {
|
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)).
|
// TODO : ... jusqu'ici (mPage::$modules[$m]['types_enfants'] peut être factorisé aussi (pas pour attribut)).
|
||||||
mPage::$modules[$m]['type_liens'][$groupe] = $type;
|
mPage::$modules[$m]['type_liens'][$groupe] = $type;
|
||||||
|
@ -90,10 +90,10 @@ function attribut($nom, $type = null, $defaut = null) {
|
||||||
mPage::$limitation_infos_module = $lim;
|
mPage::$limitation_infos_module = $lim;
|
||||||
} else {
|
} else {
|
||||||
if ($type === null || $defaut === null) {
|
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)) {
|
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);
|
mPage::$modules[$m]['attributs'][$nom] = array("global" => false, "type" => $type, "defaut" => $defaut);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,20 @@ function str_contains($str, $small) {
|
||||||
return strpos($str, $small) !== false;
|
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 ****/
|
/**** Début PATH ****/
|
||||||
|
|
||||||
// http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/
|
// http://www.liranuna.com/php-path-resolution-class-relative-paths-made-easy/
|
||||||
|
|
62
cms2/code/xslt/xhtml5.xsl
Normal file
62
cms2/code/xslt/xhtml5.xsl
Normal 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>
|
Loading…
Reference in New Issue
Block a user