This repository has been archived on 2023-12-05. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ae75/www/backup/classes/parseur/VariablesTemplate.class.php
2020-11-02 15:46:52 +01:00

297 lines
8.1 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) 2005-2013 OpenStudio */
/* email : info@thelia.fr */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program.  If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
// ------------------------------------------------------------------
// Traitement de variables de template, avec la syntaxe:
// #SET{var, valeur}, #GET{var [, defaut]} et #ENV{var [, defaut]}
// ------------------------------------------------------------------
require_once __DIR__ . "/../../fonctions/autoload.php";
class VariablesTemplate
{
private static $instance = null;
private static $symboles = array();
private static $modules = false;
// Trouver tous les plugins avec une fonction post() et #FILTRE dans leur code
private function trouver_modules_filtre()
{
if (self::$modules !== false) return;
self::$modules = array();
// Trouver tous les modules ayant '#FILTRE' dans leur code (hack pour la perf)
$liste = ActionsModules::instance()->lister(false, true);
foreach($liste as $module) {
try {
$class_name = ucfirst($module->nom);
$class_file = ActionsModules::instance()->lire_chemin_module . "/" . $class_name. ".class.php";
if (file_exists($class_file))
{
$code = file_get_contents($class_file);
if (strpos($code, '#FILTRE') !== false)
{
$instance = ActionsModules::instance()->instancier($module->nom);
if (method_exists($instance, 'post'))
{
self::$modules[] = $clazz;
}
}
}
} catch (Exception $e) {}
}
}
public static function analyser($texte)
{
if (self::$instance == null) self::$instance = new VariablesTemplate();
return self::$instance->demarrer($texte);
}
private function syntax_error($text)
{
die("Erreur de syntaxe: $text");
}
// Appliquer les filtres de base et les filtres utilisateur
private function appliquer_filtres($texte)
{
global $res;
if (strpos($texte, '#FILTRE') !== false)
{
$this->trouver_modules_filtre();
$tmp_res = $res;
// Filtres standard
// $res = filtres($texte);
Filtres::exec($texte);
$res = $texte;
// Filtres utilisateur
foreach(self::$modules as $module)
{
$module->post();
}
$res = $tmp_res;
}
return $texte;
}
// Récupérer une valeur de variable, avec filtrage éventuel, et valeur par defaut
// si la variable ne peut être valuée.
private function filtrer_var($type, $var, $defaut = '')
{
if ($type == 'ENV' && isset($_REQUEST[$var]))
{
$var = is_array($_REQUEST[$var]) ? implode(',', $_REQUEST[$var]) : $_REQUEST[$var];
return strip_tags($var);
}
else if ($type == 'GET' && isset(self::$symboles[$var]) && self::$symboles[$var] != '')
{
return self::$symboles[$var];
}
else if ($type == 'SESSION' && isset($_SESSION["thelia_$var"]) && $_SESSION["thelia_$var"] != '')
{
return $_SESSION["thelia_$var"];
}
return $defaut;
}
private function analyser_nom_var()
{
$var = trim(next($this->tokens));
if (! preg_match('/^[\w\:]+$/', $var)) $this->syntax_error("Nom de variable invalide: '$var'");
return $var;
}
private function analyser_set($directive)
{
//Parser::echo_debug("get_set()");
$tok = next($this->tokens);
if ($tok == '{')
{
$var = $this->analyser_nom_var();
if (next($this->tokens) == ',')
{
// Lire jusqu'<27> la fermeture
$val = $this->analyser_contenu('}');
if (current($this->tokens) == '}')
{
$val = $this->appliquer_filtres(trim($val));
if ($directive == 'SET')
{
// Evaluer les filtres THELIA sur la valeur
self::$symboles[$var] = $val;
}
else if ($directive == 'SESSION_SET')
{
$_SESSION["thelia_$var"] = $val;
}
// Parser::echo_debug("FIN $directive $var = $val");
return '';
}
else
{
$this->syntax_error("$directive $var: } attendu, $tok trouv<75>.");
}
}
else if (current($this->tokens) == '}')
{
if ($directive == 'SET')
{
unset(self::$symboles[$var]);
}
else if ($directive == 'SESSION_SET')
{
unset($_SESSION["thelia_$var"]);
}
return '';
}
else
{
$this->syntax_error("$directive $var: ',' attendu $tok trouv<75>.");
}
}
else
{
return $tok;
}
}
private function analyser_get($type)
{
//Parser::echo_debug( "analyser_get()");
// Lire jusqu'<27> la fermeture
if (($tok = next($this->tokens)) == '{')
{
$var = $this->analyser_nom_var();
if (($tok = next($this->tokens)) == ',')
{
// Une valeur par defaut - appliquer les filtres Thelia à cette valeur
$defaut = $this->appliquer_filtres(trim($this->analyser_contenu('}')));
return $this->filtrer_var($type, $var, $defaut);
}
else if ($tok == '}')
{
// Pas de valeur par defaut
return $this->filtrer_var($type, $var);
}
else
{
$this->syntax_error("$type $var: ',' ou '}' attendu, $tok trouv<75>.");
}
}
else
{
return $tok;
}
}
private function analyser_contenu($stopchar = '')
{
// Parser::echo_debug( "analyser_contenu($stopchar)");
$content = '';
while (($tok = next($this->tokens)) !== false)
{
if ($tok == '#')
{
$tok = next($this->tokens);
if ($tok == 'SET' || $tok == 'SESSION_SET')
{
$this->analyser_set($tok);
}
else if ($tok == 'GET' || $tok == 'ENV' || $tok == 'SESSION')
{
$content .= $this->analyser_get($tok);
}
else
{
$content .= '#'.$tok;
}
}
else if ($stopchar != '' && $tok == $stopchar)
{
break;
}
else
{
$content .= $tok;
}
}
// Parser::echo_debug( "parsing done.");
return $content;
}
private function demarrer($chaine)
{
$this->tokens = preg_split('/(\#|\{|\}|,)/', $chaine, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
// Comme on fait un next() dans parse content, insérer une valeur non significative en début de tableau
array_unshift($this->tokens, '');
//Parser::echo_debug("Tokens:", $this->tokens);
$content = $this->analyser_contenu();
//Parser::echo_debug("Content:", $content);
return $content;
}
}
?>