This repository has been archived by the owner on Apr 28, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
page-styleguide.php
103 lines (84 loc) · 3.02 KB
/
page-styleguide.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
/*
Template Name: Styleguide template
*/
use Doublefou\Core\Debug;
//Config
$styleguidePath = __DIR__.'/styleguide/styleguide.html';
$componentsPath = __DIR__.'/styleguide/components/';
//On désactive les erreurs DomDocument pour le chargement HTML 5
$internalErrors = libxml_use_internal_errors(true);
//Si on veut afficher des composants
if(get_query_var('components', false) != false)
{
//On récupère un tableau qui les listes
$queryComponents = explode(',',get_query_var('components', false));
$domComponents = array();
$i = 1;
$l = count($queryComponents);
//On parcoure les composants à afficher
foreach($queryComponents as $queryComponent)
{
$componentPath = $componentsPath.$queryComponent.'.html';
if(is_file($componentPath)){
$file = file_get_contents($componentPath);
}else{
throw new Exception("Impossible de trouver le fichier du composant ".$queryComponent, 1);
}
//On le charge
$dom = new DOMDocument();
$dom->loadHTML($file);
//On utilise DomXPath
$finder = new DomXPath($dom);
//Pour trouver et récupérer le composant dans la DOM
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $queryComponent ')]");
$componentDom = $nodes->item(0)->ownerDocument->saveHTML( $nodes->item(0));
array_push($domComponents, $componentDom);
//Si c'est le dernier composant chargé
if($i == $l)
{
//On supprime le contenu du body
$body = $dom->getElementsByTagName('body')->item(0);
$body->nodeValue = '';
//Si on veut ajouter des class sur le body
$queryBodyClass = explode(',',get_query_var('bodyclass'));
if(!empty($queryBodyClass))
{
foreach($queryBodyClass as $bodyclass)
{
$body->setAttribute('class', $body->getAttribute('class').' '.$bodyclass);
}
}
//On ajoute aussi une class pour dire que c'est un composant
$body->setAttribute('class', $body->getAttribute('class').' '.'dfwp_styleguide-iscomposant');
//On parcoure les composants que l'on a stocké
foreach($domComponents as $component)
{
//Et on la ajoute au body
$fragment = $dom->createDocumentFragment();
//On ajoute notre html au fragment
//en convertissant les caractères spéciaux en entités HTML, sinon ça plante
$result = $fragment->appendXML(htmlspecialchars($component));
//Si tout c'est bien passé on ajoute le framgent au body
if($result){
$body->appendChild($fragment);
}else{
throw new Exception("Impossible d'ajouter le composant au fragment", 1);
}
}
}
$i++;
}
}
else{
//Le chemin vers le fichier du styleguide généré
$dom = new DOMDocument();
$html = file_get_contents($styleguidePath);
$dom->loadHTML($html);
$body= $dom->getElementsByTagName('body')->item(0);
}
//On réactive les erreurs
libxml_use_internal_errors($internalErrors);
//Et on output en convertissant les entités HTML spéciales en caractères
echo htmlspecialchars_decode($dom->saveHTML());
?>