Completed
Push — master ( 312538...9be7c4 )
by cam
01:44
created
ecrire/src/Sql/Sqlite/Requeteur.php 2 patches
Indentation   +105 added lines, -105 removed lines patch added patch discarded remove patch
@@ -13,109 +13,109 @@
 block discarded – undo
13 13
 
14 14
 class Requeteur
15 15
 {
16
-	/** @var string texte de la requête */
17
-	public $query = ''; // la requete
18
-	/** @var string Nom de la connexion */
19
-	public $serveur = '';
20
-	/** @var \PDO|null Identifiant de la connexion SQLite */
21
-	public $link = null;
22
-	/** @var string Prefixe des tables SPIP */
23
-	public $prefixe = '';
24
-	/** @var string Nom de la base de donnée */
25
-	public $db = '';
26
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
27
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
28
-
29
-	/** @var string Version de SQLite (2 ou 3) */
30
-	public $sqlite_version = '';
31
-
32
-	/**
33
-	 * Constructeur
34
-	 *
35
-	 * @param string $serveur
36
-	 */
37
-	public function __construct($serveur = '') {
38
-		_sqlite_init();
39
-		$this->serveur = strtolower($serveur);
40
-
41
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
42
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
43
-
44
-			return;
45
-		}
46
-
47
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
48
-
49
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ?: 0]['prefixe'];
50
-		$this->db = $GLOBALS['connexions'][$this->serveur ?: 0]['db'];
51
-
52
-		// tracage des requetes ?
53
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
54
-	}
55
-
56
-	/**
57
-	 * Lancer la requête transmise et faire le tracage si demandé
58
-	 *
59
-	 * @param string $query
60
-	 *     Requête à exécuter
61
-	 * @param bool|null $tracer
62
-	 *     true pour tracer la requête
63
-	 * @return bool|\PDOStatement|array
64
-	 */
65
-	public function executer_requete($query, $tracer = null) {
66
-		if (is_null($tracer)) {
67
-			$tracer = $this->tracer;
68
-		}
69
-		$err = '';
70
-		$t = 0;
71
-		if ($tracer || defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
72
-			include_spip('public/tracer');
73
-			$t = trace_query_start();
74
-		}
75
-
76
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
77
-		if ($this->link) {
78
-			// memoriser la derniere erreur PHP vue
79
-			$last_error = (function_exists('error_get_last') ? error_get_last() : '');
80
-			$e = null;
81
-			// sauver la derniere requete
82
-			$GLOBALS['connexions'][$this->serveur ?: 0]['last'] = $query;
83
-			$GLOBALS['connexions'][$this->serveur ?: 0]['total_requetes']++;
84
-
85
-			try {
86
-				$r = $this->link->query($query);
87
-			} catch (\PDOException $e) {
88
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
89
-				$r = false;
90
-			}
91
-
92
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
93
-			if ($e && $e instanceof \PDOException) {
94
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
95
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
96
-			} elseif (($err = (function_exists('error_get_last') ? error_get_last() : '')) && $err != $last_error) {
97
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
98
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
99
-			} else {
100
-				$err = '';
101
-			}
102
-		} else {
103
-			$r = false;
104
-		}
105
-
106
-		if (spip_sqlite_errno($this->serveur)) {
107
-			$err .= spip_sqlite_error($query, $this->serveur);
108
-		}
109
-
110
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
111
-	}
112
-
113
-	/**
114
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
115
-	 *
116
-	 * @return string|false
117
-	 **/
118
-	public function last_insert_id() {
119
-		return $this->link->lastInsertId();
120
-	}
16
+    /** @var string texte de la requête */
17
+    public $query = ''; // la requete
18
+    /** @var string Nom de la connexion */
19
+    public $serveur = '';
20
+    /** @var \PDO|null Identifiant de la connexion SQLite */
21
+    public $link = null;
22
+    /** @var string Prefixe des tables SPIP */
23
+    public $prefixe = '';
24
+    /** @var string Nom de la base de donnée */
25
+    public $db = '';
26
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
27
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
28
+
29
+    /** @var string Version de SQLite (2 ou 3) */
30
+    public $sqlite_version = '';
31
+
32
+    /**
33
+     * Constructeur
34
+     *
35
+     * @param string $serveur
36
+     */
37
+    public function __construct($serveur = '') {
38
+        _sqlite_init();
39
+        $this->serveur = strtolower($serveur);
40
+
41
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
42
+            spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
43
+
44
+            return;
45
+        }
46
+
47
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
48
+
49
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ?: 0]['prefixe'];
50
+        $this->db = $GLOBALS['connexions'][$this->serveur ?: 0]['db'];
51
+
52
+        // tracage des requetes ?
53
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
54
+    }
55
+
56
+    /**
57
+     * Lancer la requête transmise et faire le tracage si demandé
58
+     *
59
+     * @param string $query
60
+     *     Requête à exécuter
61
+     * @param bool|null $tracer
62
+     *     true pour tracer la requête
63
+     * @return bool|\PDOStatement|array
64
+     */
65
+    public function executer_requete($query, $tracer = null) {
66
+        if (is_null($tracer)) {
67
+            $tracer = $this->tracer;
68
+        }
69
+        $err = '';
70
+        $t = 0;
71
+        if ($tracer || defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
72
+            include_spip('public/tracer');
73
+            $t = trace_query_start();
74
+        }
75
+
76
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
77
+        if ($this->link) {
78
+            // memoriser la derniere erreur PHP vue
79
+            $last_error = (function_exists('error_get_last') ? error_get_last() : '');
80
+            $e = null;
81
+            // sauver la derniere requete
82
+            $GLOBALS['connexions'][$this->serveur ?: 0]['last'] = $query;
83
+            $GLOBALS['connexions'][$this->serveur ?: 0]['total_requetes']++;
84
+
85
+            try {
86
+                $r = $this->link->query($query);
87
+            } catch (\PDOException $e) {
88
+                spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
89
+                $r = false;
90
+            }
91
+
92
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
93
+            if ($e && $e instanceof \PDOException) {
94
+                $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
95
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
96
+            } elseif (($err = (function_exists('error_get_last') ? error_get_last() : '')) && $err != $last_error) {
97
+                $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
98
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
99
+            } else {
100
+                $err = '';
101
+            }
102
+        } else {
103
+            $r = false;
104
+        }
105
+
106
+        if (spip_sqlite_errno($this->serveur)) {
107
+            $err .= spip_sqlite_error($query, $this->serveur);
108
+        }
109
+
110
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
111
+    }
112
+
113
+    /**
114
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
115
+     *
116
+     * @return string|false
117
+     **/
118
+    public function last_insert_id() {
119
+        return $this->link->lastInsertId();
120
+    }
121 121
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
 		$this->serveur = strtolower($serveur);
40 40
 
41 41
 		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
42
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
42
+			spip_log('Aucune connexion sqlite (link)', 'sqlite.'._LOG_ERREUR);
43 43
 
44 44
 			return;
45 45
 		}
@@ -85,17 +85,17 @@  discard block
 block discarded – undo
85 85
 			try {
86 86
 				$r = $this->link->query($query);
87 87
 			} catch (\PDOException $e) {
88
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
88
+				spip_log('PDOException: '.$e->getMessage(), 'sqlite.'._LOG_DEBUG);
89 89
 				$r = false;
90 90
 			}
91 91
 
92 92
 			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
93 93
 			if ($e && $e instanceof \PDOException) {
94
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
95
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
94
+				$err = strip_tags($e->getMessage()).' in '.$e->getFile().' line '.$e->getLine();
95
+				spip_log("$err - ".$query, 'sqlite.'._LOG_ERREUR);
96 96
 			} elseif (($err = (function_exists('error_get_last') ? error_get_last() : '')) && $err != $last_error) {
97
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
98
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
97
+				$err = strip_tags($err['message']).' in '.$err['file'].' line '.$err['line'];
98
+				spip_log("$err - ".$query, 'sqlite.'._LOG_ERREUR);
99 99
 			} else {
100 100
 				$err = '';
101 101
 			}
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Idiome.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -7,85 +7,85 @@
 block discarded – undo
7 7
  **/
8 8
 class Idiome
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'idiome';
12
-
13
-	/** Clé de traduction demandée. Exemple 'item_oui' */
14
-	public string $nom_champ = '';
15
-
16
-	/** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
-	public string $module = '';
18
-
19
-	/** Arguments à passer à la chaîne */
20
-	public array $arg = [];
21
-
22
-	/**
23
-	 * Filtres à appliquer au résultat
24
-	 *
25
-	 *
26
-	 * * FIXME: type unique.
27
-	 * @var false|array
28
-	 *     - false: erreur de syntaxe
29
-	 */
30
-	public $param = [];
31
-
32
-	/** Source des filtres (compatibilité) (?) */
33
-	public array $fonctions = [];
34
-
35
-	/**
36
-	 * Inutilisé, propriété générique de l'AST
37
-	 *
38
-	 * @var string|array
39
-	 */
40
-	public $avant = '';
41
-
42
-	/**
43
-	 * Inutilisé, propriété générique de l'AST
44
-	 *
45
-	 * @var string|array
46
-	 */
47
-	public $apres = '';
48
-
49
-	/** Identifiant de la boucle */
50
-	public string $id_boucle = '';
51
-
52
-	/**
53
-	 * AST du squelette, liste de toutes les boucles
54
-	 *
55
-	 * @var Boucle[]
56
-	 */
57
-	public array $boucles;
58
-
59
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
60
-	public ?string $type_requete = null;
61
-
62
-	/** Résultat de la compilation: toujours une expression PHP */
63
-	public string $code = '';
64
-
65
-	/**
66
-	 * Interdire les scripts
67
-	 *
68
-	 * @see interdire_scripts()
69
-	 */
70
-	public bool $interdire_scripts = false;
71
-
72
-	/**
73
-	 * Description du squelette
74
-	 *
75
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
-	 *
77
-	 * Peut contenir les index :
78
-	 * - nom : Nom du fichier de cache
79
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
-	 * - sourcefile : Chemin du squelette
81
-	 * - squelette : Code du squelette
82
-	 * - id_mere : Identifiant de la boucle parente
83
-	 * - documents : Pour embed et img dans les textes
84
-	 * - session : Pour un cache sessionné par auteur
85
-	 * - niv : Niveau de tabulation
86
-	 */
87
-	public array $descr = [];
88
-
89
-	/** Numéro de ligne dans le code source du squelette */
90
-	public int $ligne = 0;
10
+    /** Type de noeud */
11
+    public string $type = 'idiome';
12
+
13
+    /** Clé de traduction demandée. Exemple 'item_oui' */
14
+    public string $nom_champ = '';
15
+
16
+    /** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
+    public string $module = '';
18
+
19
+    /** Arguments à passer à la chaîne */
20
+    public array $arg = [];
21
+
22
+    /**
23
+     * Filtres à appliquer au résultat
24
+     *
25
+     *
26
+     * * FIXME: type unique.
27
+     * @var false|array
28
+     *     - false: erreur de syntaxe
29
+     */
30
+    public $param = [];
31
+
32
+    /** Source des filtres (compatibilité) (?) */
33
+    public array $fonctions = [];
34
+
35
+    /**
36
+     * Inutilisé, propriété générique de l'AST
37
+     *
38
+     * @var string|array
39
+     */
40
+    public $avant = '';
41
+
42
+    /**
43
+     * Inutilisé, propriété générique de l'AST
44
+     *
45
+     * @var string|array
46
+     */
47
+    public $apres = '';
48
+
49
+    /** Identifiant de la boucle */
50
+    public string $id_boucle = '';
51
+
52
+    /**
53
+     * AST du squelette, liste de toutes les boucles
54
+     *
55
+     * @var Boucle[]
56
+     */
57
+    public array $boucles;
58
+
59
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
60
+    public ?string $type_requete = null;
61
+
62
+    /** Résultat de la compilation: toujours une expression PHP */
63
+    public string $code = '';
64
+
65
+    /**
66
+     * Interdire les scripts
67
+     *
68
+     * @see interdire_scripts()
69
+     */
70
+    public bool $interdire_scripts = false;
71
+
72
+    /**
73
+     * Description du squelette
74
+     *
75
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
+     *
77
+     * Peut contenir les index :
78
+     * - nom : Nom du fichier de cache
79
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
+     * - sourcefile : Chemin du squelette
81
+     * - squelette : Code du squelette
82
+     * - id_mere : Identifiant de la boucle parente
83
+     * - documents : Pour embed et img dans les textes
84
+     * - session : Pour un cache sessionné par auteur
85
+     * - niv : Niveau de tabulation
86
+     */
87
+    public array $descr = [];
88
+
89
+    /** Numéro de ligne dans le code source du squelette */
90
+    public int $ligne = 0;
91 91
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Champ.php 1 patch
Indentation   +100 added lines, -100 removed lines patch added patch discarded remove patch
@@ -7,104 +7,104 @@
 block discarded – undo
7 7
  */
8 8
 class Champ
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'champ';
12
-
13
-	/** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
-	public ?string $nom_champ = null;
15
-
16
-	/** Identifiant de la boucle parente si explicité */
17
-	public ?string $nom_boucle = '';
18
-
19
-	/**
20
-	 * Partie optionnelle avant
21
-	 *
22
-	 * @var null|string|array
23
-	 */
24
-	public $avant;
25
-
26
-	/**
27
-	 * Partie optionnelle après
28
-	 *
29
-	 * @var null|string|array
30
-	 */
31
-	public $apres;
32
-
33
-	/**
34
-	 * Étoiles : annuler des automatismes
35
-	 *
36
-	 * - '*' annule les filtres automatiques
37
-	 * - '**' annule en plus les protections de scripts
38
-	 *
39
-	 * FIXME: type unique.
40
-	 */
41
-	public ?string $etoile = '';
42
-
43
-	/**
44
-	 * Arguments et filtres explicites sur la balise
45
-	 *
46
-	 * - $param[0] contient les arguments de la balise
47
-	 * - $param[1..n] contient les filtres à appliquer à la balise
48
-	 *
49
-	 * FIXME: type unique.
50
-	 * @var false|array
51
-	 *     - false: erreur de syntaxe
52
-	 */
53
-	public $param = [];
54
-
55
-	/** Source des filtres (compatibilité) (?) */
56
-	public array $fonctions = [];
57
-
58
-	/**
59
-	 * Identifiant de la boucle
60
-	 *
61
-	 * @var string
62
-	 */
63
-	public $id_boucle = '';
64
-
65
-	/**
66
-	 * AST du squelette, liste de toutes les boucles
67
-	 *
68
-	 * @var Boucle[]
69
-	 */
70
-	public array $boucles;
71
-
72
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
73
-	public ?string $type_requete = null;
74
-
75
-	/** Résultat de la compilation: toujours une expression PHP */
76
-	public string $code = '';
77
-
78
-	/**
79
-	 * Interdire les scripts
80
-	 *
81
-	 * false si on est sûr de cette balise
82
-	 *
83
-	 * @see interdire_scripts()
84
-	 */
85
-	public bool $interdire_scripts = true;
86
-
87
-	/**
88
-	 * Description du squelette
89
-	 *
90
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
91
-	 *
92
-	 * Peut contenir les index :
93
-	 *
94
-	 * - nom : Nom du fichier de cache
95
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
96
-	 * - sourcefile : Chemin du squelette
97
-	 * - squelette : Code du squelette
98
-	 * - id_mere : Identifiant de la boucle parente
99
-	 * - documents : Pour embed et img dans les textes
100
-	 * - session : Pour un cache sessionné par auteur
101
-	 * - niv : Niveau de tabulation
102
-	 */
103
-	public array $descr = [];
104
-
105
-	/** Numéro de ligne dans le code source du squelette*/
106
-	public int $ligne = 0;
107
-
108
-	/** Drapeau pour reperer les balises calculées par une fonction explicite */
109
-	public bool $balise_calculee = false;
10
+    /** Type de noeud */
11
+    public string $type = 'champ';
12
+
13
+    /** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
+    public ?string $nom_champ = null;
15
+
16
+    /** Identifiant de la boucle parente si explicité */
17
+    public ?string $nom_boucle = '';
18
+
19
+    /**
20
+     * Partie optionnelle avant
21
+     *
22
+     * @var null|string|array
23
+     */
24
+    public $avant;
25
+
26
+    /**
27
+     * Partie optionnelle après
28
+     *
29
+     * @var null|string|array
30
+     */
31
+    public $apres;
32
+
33
+    /**
34
+     * Étoiles : annuler des automatismes
35
+     *
36
+     * - '*' annule les filtres automatiques
37
+     * - '**' annule en plus les protections de scripts
38
+     *
39
+     * FIXME: type unique.
40
+     */
41
+    public ?string $etoile = '';
42
+
43
+    /**
44
+     * Arguments et filtres explicites sur la balise
45
+     *
46
+     * - $param[0] contient les arguments de la balise
47
+     * - $param[1..n] contient les filtres à appliquer à la balise
48
+     *
49
+     * FIXME: type unique.
50
+     * @var false|array
51
+     *     - false: erreur de syntaxe
52
+     */
53
+    public $param = [];
54
+
55
+    /** Source des filtres (compatibilité) (?) */
56
+    public array $fonctions = [];
57
+
58
+    /**
59
+     * Identifiant de la boucle
60
+     *
61
+     * @var string
62
+     */
63
+    public $id_boucle = '';
64
+
65
+    /**
66
+     * AST du squelette, liste de toutes les boucles
67
+     *
68
+     * @var Boucle[]
69
+     */
70
+    public array $boucles;
71
+
72
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
73
+    public ?string $type_requete = null;
74
+
75
+    /** Résultat de la compilation: toujours une expression PHP */
76
+    public string $code = '';
77
+
78
+    /**
79
+     * Interdire les scripts
80
+     *
81
+     * false si on est sûr de cette balise
82
+     *
83
+     * @see interdire_scripts()
84
+     */
85
+    public bool $interdire_scripts = true;
86
+
87
+    /**
88
+     * Description du squelette
89
+     *
90
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
91
+     *
92
+     * Peut contenir les index :
93
+     *
94
+     * - nom : Nom du fichier de cache
95
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
96
+     * - sourcefile : Chemin du squelette
97
+     * - squelette : Code du squelette
98
+     * - id_mere : Identifiant de la boucle parente
99
+     * - documents : Pour embed et img dans les textes
100
+     * - session : Pour un cache sessionné par auteur
101
+     * - niv : Niveau de tabulation
102
+     */
103
+    public array $descr = [];
104
+
105
+    /** Numéro de ligne dans le code source du squelette*/
106
+    public int $ligne = 0;
107
+
108
+    /** Drapeau pour reperer les balises calculées par une fonction explicite */
109
+    public bool $balise_calculee = false;
110 110
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Critere.php 1 patch
Indentation   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -8,32 +8,32 @@
 block discarded – undo
8 8
  * Sous-noeud de Boucle
9 9
  **/
10 10
 class Critere {
11
-	/** Type de noeud */
12
-	public string $type = 'critere';
13
-
14
-	/** Opérateur (>, <, >=, IN, ...) */
15
-	public ?string $op = null;
16
-
17
-	/** Présence d'une négation (truc !op valeur) */
18
-	public bool $not = false;
19
-
20
-	/** Présence d'une exclusion (!truc op valeur) */
21
-	public string $exclus = '';
22
-
23
-	/** Présence d'une condition dans le critère (truc ?) */
24
-	public bool $cond = false;
25
-
26
-	/**
27
-	 * Paramètres du critère
28
-	 * - $param[0] : élément avant l'opérateur
29
-	 * - $param[1..n] : éléments après l'opérateur
30
-	 *
31
-	 * FIXME: type unique.
32
-	 * @var false|array
33
-	 *     - false: erreur de syntaxe
34
-	 */
35
-	public $param = [];
36
-
37
-	/** Numéro de ligne dans le code source du squelette */
38
-	public int $ligne = 0;
11
+    /** Type de noeud */
12
+    public string $type = 'critere';
13
+
14
+    /** Opérateur (>, <, >=, IN, ...) */
15
+    public ?string $op = null;
16
+
17
+    /** Présence d'une négation (truc !op valeur) */
18
+    public bool $not = false;
19
+
20
+    /** Présence d'une exclusion (!truc op valeur) */
21
+    public string $exclus = '';
22
+
23
+    /** Présence d'une condition dans le critère (truc ?) */
24
+    public bool $cond = false;
25
+
26
+    /**
27
+     * Paramètres du critère
28
+     * - $param[0] : élément avant l'opérateur
29
+     * - $param[1..n] : éléments après l'opérateur
30
+     *
31
+     * FIXME: type unique.
32
+     * @var false|array
33
+     *     - false: erreur de syntaxe
34
+     */
35
+    public $param = [];
36
+
37
+    /** Numéro de ligne dans le code source du squelette */
38
+    public int $ligne = 0;
39 39
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Iterateur/AbstractIterateur.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -4,21 +4,21 @@
 block discarded – undo
4 4
 
5 5
 abstract class AbstractIterateur
6 6
 {
7
-	protected string $type;
7
+    protected string $type;
8 8
 
9
-	/**
10
-	 * Calcul du total des elements
11
-	 *
12
-	 * @var int|null
13
-	 **/
14
-	public $total = null;
9
+    /**
10
+     * Calcul du total des elements
11
+     *
12
+     * @var int|null
13
+     **/
14
+    public $total = null;
15 15
 
16
-	/** Erreur presente ? **/
17
-	public bool $err = false;
16
+    /** Erreur presente ? **/
17
+    public bool $err = false;
18 18
 
19
-	public function __construct(
20
-		protected array $command,
21
-		protected array $info = []
22
-	) {
23
-	}
19
+    public function __construct(
20
+        protected array $command,
21
+        protected array $info = []
22
+    ) {
23
+    }
24 24
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Iterateur/Data.php 2 patches
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
 		// Si a ce stade on n'a pas de table, il y a un bug
164 164
 		if (!is_array($this->tableau)) {
165 165
 			$this->err = true;
166
-			spip_log('erreur datasource ' . var_export($command, true));
166
+			spip_log('erreur datasource '.var_export($command, true));
167 167
 		}
168 168
 
169 169
 		// {datapath query.results}
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
 			isset($this->command['sourcemode'])
206 206
 			&& !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207 207
 		) {
208
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
208
+			charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true);
209 209
 		}
210 210
 
211 211
 		# le premier argument peut etre un array, une URL etc.
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
 		# avons-nous un cache dispo ?
215 215
 		$cle = null;
216 216
 		if (is_string($src)) {
217
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
217
+			$cle = 'datasource_'.md5($this->command['sourcemode'].':'.var_export($this->command['source'], true));
218 218
 		}
219 219
 
220 220
 		$cache = $this->cache_get($cle);
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
 					}
267 267
 					if (
268 268
 						!$this->err
269
-						&& ($data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true))
269
+						&& ($data_to_array = charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true))
270 270
 					) {
271 271
 						$args = $this->command['source'];
272 272
 						$args[0] = $data;
@@ -401,12 +401,12 @@  discard block
 block discarded – undo
401 401
 						$this->tableau = $v;
402 402
 					} else {
403 403
 						# {par valeur} ou {par valeur/xx/yy}
404
-						$tv = $r[1] == 'valeur' ? '%s' : 'table_valeur(%s, ' . var_export($r[1], true) . ')';
404
+						$tv = $r[1] == 'valeur' ? '%s' : 'table_valeur(%s, '.var_export($r[1], true).')';
405 405
 						$sortfunc .= '
406
-					$a = ' . sprintf($tv, '$aa') . ';
407
-					$b = ' . sprintf($tv, '$bb') . ';
406
+					$a = ' . sprintf($tv, '$aa').';
407
+					$b = ' . sprintf($tv, '$bb').';
408 408
 					if ($a <> $b)
409
-						return ($a ' . (empty($r[2]) ? '<' : '>') . ' $b) ? -1 : 1;';
409
+						return ($a ' . (empty($r[2]) ? '<' : '>').' $b) ? -1 : 1;';
410 410
 					}
411 411
 				}
412 412
 			}
Please login to merge, or discard this patch.
Indentation   +465 added lines, -465 removed lines patch added patch discarded remove patch
@@ -12,473 +12,473 @@
 block discarded – undo
12 12
  */
13 13
 class Data extends AbstractIterateur implements Iterator
14 14
 {
15
-	/** Tableau de données */
16
-	protected array $tableau = [];
17
-
18
-	/**
19
-	 * Conditions de filtrage
20
-	 * ie criteres de selection
21
-	 */
22
-	protected array $filtre = [];
23
-
24
-	/**
25
-	 * Cle courante
26
-	 *
27
-	 * @var scalar
28
-	 */
29
-	protected $cle = null;
30
-
31
-	/**
32
-	 * Valeur courante
33
-	 *
34
-	 * @var mixed
35
-	 */
36
-	protected $valeur = null;
37
-
38
-	/**
39
-	 * Constructeur
40
-	 *
41
-	 * @param  $command
42
-	 * @param array $info
43
-	 */
44
-	public function __construct(array $command, array $info = []) {
45
-		include_spip('iterateur/data');
46
-		$this->type = 'DATA';
47
-		$this->command = $command;
48
-		$this->info = $info;
49
-		$this->select($command);
50
-	}
51
-
52
-	/**
53
-	 * Revenir au depart
54
-	 *
55
-	 * @return void
56
-	 */
57
-	public function rewind(): void {
58
-		reset($this->tableau);
59
-		$this->cle = array_key_first($this->tableau);
60
-		$this->valeur = current($this->tableau);
61
-		next($this->tableau);
62
-	}
63
-
64
-	/**
65
-	 * Déclarer les critères exceptions
66
-	 *
67
-	 * @return array
68
-	 */
69
-	public function exception_des_criteres() {
70
-		return ['tableau'];
71
-	}
72
-
73
-	/**
74
-	 * Récupérer depuis le cache si possible
75
-	 *
76
-	 * @param string $cle
77
-	 * @return mixed
78
-	 */
79
-	protected function cache_get($cle) {
80
-		if (!$cle) {
81
-			return;
82
-		}
83
-		# utiliser memoization si dispo
84
-		if (!function_exists('cache_get')) {
85
-			return;
86
-		}
87
-
88
-		return cache_get($cle);
89
-	}
90
-
91
-	/**
92
-	 * Stocker en cache si possible
93
-	 *
94
-	 * @param string $cle
95
-	 * @param int $ttl
96
-	 * @param null|mixed $valeur
97
-	 * @return bool
98
-	 */
99
-	protected function cache_set($cle, $ttl, $valeur = null) {
100
-		if (!$cle) {
101
-			return;
102
-		}
103
-		if (is_null($valeur)) {
104
-			$valeur = $this->tableau;
105
-		}
106
-		# utiliser memoization si dispo
107
-		if (!function_exists('cache_set')) {
108
-			return;
109
-		}
110
-
111
-		return cache_set(
112
-			$cle,
113
-			[
114
-				'data' => $valeur,
115
-				'time' => time(),
116
-				'ttl' => $ttl
117
-			],
118
-			3600 + $ttl
119
-		);
120
-		# conserver le cache 1h de plus que la validite demandee,
121
-		# pour le cas ou le serveur distant ne reponde plus
122
-	}
123
-
124
-	/**
125
-	 * Aller chercher les données de la boucle DATA
126
-	 *
127
-	 * @throws Exception
128
-	 * @param array $command
129
-	 * @return void
130
-	 */
131
-	protected function select($command) {
132
-
133
-		// l'iterateur DATA peut etre appele en passant (data:type)
134
-		// le type se retrouve dans la commande 'from'
135
-		// dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
136
-		if (isset($this->command['from'][0])) {
137
-			if (isset($this->command['source']) && is_array($this->command['source'])) {
138
-				array_unshift($this->command['source'], $this->command['sourcemode']);
139
-			}
140
-			$this->command['sourcemode'] = $this->command['from'][0];
141
-		}
142
-
143
-		// cherchons differents moyens de creer le tableau de donnees
144
-		// les commandes connues pour l'iterateur DATA
145
-		// sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
146
-
147
-		// {source format, [URL], [arg2]...}
148
-		if (
149
-			isset($this->command['source'])
150
-			&& isset($this->command['sourcemode'])
151
-		) {
152
-			$this->select_source();
153
-		}
154
-
155
-		// Critere {liste X1, X2, X3}
156
-		if (isset($this->command['liste'])) {
157
-			$this->select_liste();
158
-		}
159
-		if (isset($this->command['enum'])) {
160
-			$this->select_enum();
161
-		}
162
-
163
-		// Si a ce stade on n'a pas de table, il y a un bug
164
-		if (!is_array($this->tableau)) {
165
-			$this->err = true;
166
-			spip_log('erreur datasource ' . var_export($command, true));
167
-		}
168
-
169
-		// {datapath query.results}
170
-		// extraire le chemin "query.results" du tableau de donnees
171
-		if (
172
-			!$this->err
173
-			&& isset($this->command['datapath'])
174
-			&& is_array($this->command['datapath'])
175
-		) {
176
-			$this->select_datapath();
177
-		}
178
-
179
-		// tri {par x}
180
-		if ($this->command['orderby']) {
181
-			$this->select_orderby();
182
-		}
183
-
184
-		// grouper les resultats {fusion /x/y/z} ;
185
-		if ($this->command['groupby']) {
186
-			$this->select_groupby();
187
-		}
188
-
189
-		$this->rewind();
190
-		#var_dump($this->tableau);
191
-	}
192
-
193
-
194
-	/**
195
-	 * Aller chercher les donnees de la boucle DATA
196
-	 * depuis une source
197
-	 * {source format, [URL], [arg2]...}
198
-	 */
199
-	protected function select_source() {
200
-		# un peu crado : avant de charger le cache il faut charger
201
-		# les class indispensables, sinon PHP ne saura pas gerer
202
-		# l'objet en cache ; cf plugins/icalendar
203
-		# perf : pas de fonction table_to_array ! (table est deja un array)
204
-		if (
205
-			isset($this->command['sourcemode'])
206
-			&& !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207
-		) {
208
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
209
-		}
210
-
211
-		# le premier argument peut etre un array, une URL etc.
212
-		$src = $this->command['source'][0] ?? null;
213
-
214
-		# avons-nous un cache dispo ?
215
-		$cle = null;
216
-		if (is_string($src)) {
217
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
218
-		}
219
-
220
-		$cache = $this->cache_get($cle);
221
-		if (isset($this->command['datacache'])) {
222
-			$ttl = (int) $this->command['datacache'];
223
-		}
224
-		if (
225
-			$cache
226
-			&& $cache['time'] + ($ttl ?? $cache['ttl']) > time()
227
-			&& !(_request('var_mode') === 'recalcul' && include_spip('inc/autoriser') && autoriser('recalcul'))
228
-		) {
229
-			$this->tableau = $cache['data'];
230
-		} else {
231
-			try {
232
-				if (
233
-					isset($this->command['sourcemode'])
234
-					&& in_array(
235
-						$this->command['sourcemode'],
236
-						['table', 'array', 'tableau']
237
-					)
238
-				) {
239
-					if (
240
-						is_array($a = $src)
241
-						|| is_string($a) && ($a = str_replace('&quot;', '"', $a)) && is_array($a = @unserialize($a))
242
-					) {
243
-						$this->tableau = $a;
244
-					}
245
-				} else {
246
-					$data = $src;
247
-					if (is_string($src)) {
248
-						if (tester_url_absolue($src)) {
249
-							include_spip('inc/distant');
250
-							$data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
251
-							$data = $data['page'] ?? '';
252
-							if (!$data) {
253
-								throw new Exception('404');
254
-							}
255
-							if (!isset($ttl)) {
256
-								$ttl = 24 * 3600;
257
-							}
258
-						} elseif (@is_dir($src)) {
259
-							$data = $src;
260
-						} elseif (@is_readable($src) && @is_file($src)) {
261
-							$data = spip_file_get_contents($src);
262
-						}
263
-						if (!isset($ttl)) {
264
-							$ttl = 10;
265
-						}
266
-					}
267
-					if (
268
-						!$this->err
269
-						&& ($data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true))
270
-					) {
271
-						$args = $this->command['source'];
272
-						$args[0] = $data;
273
-						if (is_array($a = $data_to_array(...$args))) {
274
-							$this->tableau = $a;
275
-						}
276
-					}
277
-				}
278
-
279
-				if (!is_array($this->tableau)) {
280
-					$this->err = true;
281
-				}
282
-
283
-				if (!$this->err && isset($ttl) && $ttl > 0) {
284
-					$this->cache_set($cle, $ttl);
285
-				}
286
-			} catch (Exception $e) {
287
-				$e = $e->getMessage();
288
-				$err = sprintf(
289
-					"[%s, %s] $e",
290
-					$src,
291
-					$this->command['sourcemode']
292
-				);
293
-				erreur_squelette([$err, []]);
294
-				$this->err = true;
295
-			}
296
-		}
297
-
298
-		# en cas d'erreur, utiliser le cache si encore dispo
299
-		if ($this->err && $cache) {
300
-			$this->tableau = $cache['data'];
301
-			$this->err = false;
302
-		}
303
-	}
304
-
305
-
306
-	/**
307
-	 * Retourne un tableau donne depuis un critère liste
308
-	 *
309
-	 * Critère `{liste X1, X2, X3}`
310
-	 *
311
-	 * @see critere_DATA_liste_dist()
312
-	 *
313
-	 **/
314
-	protected function select_liste() {
315
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
316
-		if (!isset($this->command['liste'][1])) {
317
-			if (!is_array($this->command['liste'][0])) {
318
-				$this->command['liste'] = explode(',', (string) $this->command['liste'][0]);
319
-			} else {
320
-				$this->command['liste'] = $this->command['liste'][0];
321
-			}
322
-		}
323
-		$this->tableau = $this->command['liste'];
324
-	}
325
-
326
-	/**
327
-	 * Retourne un tableau donne depuis un critere liste
328
-	 * Critere {enum Xmin, Xmax}
329
-	 *
330
-	 **/
331
-	protected function select_enum() {
332
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
333
-		if (!isset($this->command['enum'][1])) {
334
-			if (!is_array($this->command['enum'][0])) {
335
-				$this->command['enum'] = explode(',', (string) $this->command['enum'][0]);
336
-			} else {
337
-				$this->command['enum'] = $this->command['enum'][0];
338
-			}
339
-		}
340
-		if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
341
-			$enum = range(
342
-				array_shift($this->command['enum']),
343
-				array_shift($this->command['enum']),
344
-				array_shift($this->command['enum'])
345
-			);
346
-		} else {
347
-			$enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
348
-		}
349
-		$this->tableau = $enum;
350
-	}
351
-
352
-
353
-	/**
354
-	 * extraire le chemin "query.results" du tableau de donnees
355
-	 * {datapath query.results}
356
-	 *
357
-	 **/
358
-	protected function select_datapath() {
359
-		$base = reset($this->command['datapath']);
360
-		if (strlen($base = ltrim(trim((string) $base), '/'))) {
361
-			$results = table_valeur($this->tableau, $base);
362
-			if (is_array($results)) {
363
-				$this->tableau = $results;
364
-			} else {
365
-				$this->tableau = [];
366
-				$this->err = true;
367
-				spip_log("datapath '$base' absent");
368
-			}
369
-		}
370
-	}
371
-
372
-	/**
373
-	 * Ordonner les resultats
374
-	 * {par x}
375
-	 *
376
-	 **/
377
-	protected function select_orderby() {
378
-		$sortfunc = '';
379
-		foreach ($this->command['orderby'] as $tri) {
380
-			// virer le / initial pour les criteres de la forme {par /xx}
381
-			if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim((string) $tri, '/'), $r)) {
382
-				$r = array_pad($r, 3, null);
383
-
384
-				// tri par cle
385
-				if ($r[1] == 'cle') {
386
-					if (isset($r[2]) && $r[2]) {
387
-						krsort($this->tableau);
388
-					} else {
389
-						ksort($this->tableau);
390
-					}
391
-				} # {par hasard}
392
-				else {
393
-					if ($r[1] == 'hasard') {
394
-						$k = array_keys($this->tableau);
395
-						shuffle($k);
396
-						$v = [];
397
-						foreach ($k as $cle) {
398
-							$v[$cle] = $this->tableau[$cle];
399
-						}
400
-						$this->tableau = $v;
401
-					} else {
402
-						# {par valeur} ou {par valeur/xx/yy}
403
-						$tv = $r[1] == 'valeur' ? '%s' : 'table_valeur(%s, ' . var_export($r[1], true) . ')';
404
-						$sortfunc .= '
15
+    /** Tableau de données */
16
+    protected array $tableau = [];
17
+
18
+    /**
19
+     * Conditions de filtrage
20
+     * ie criteres de selection
21
+     */
22
+    protected array $filtre = [];
23
+
24
+    /**
25
+     * Cle courante
26
+     *
27
+     * @var scalar
28
+     */
29
+    protected $cle = null;
30
+
31
+    /**
32
+     * Valeur courante
33
+     *
34
+     * @var mixed
35
+     */
36
+    protected $valeur = null;
37
+
38
+    /**
39
+     * Constructeur
40
+     *
41
+     * @param  $command
42
+     * @param array $info
43
+     */
44
+    public function __construct(array $command, array $info = []) {
45
+        include_spip('iterateur/data');
46
+        $this->type = 'DATA';
47
+        $this->command = $command;
48
+        $this->info = $info;
49
+        $this->select($command);
50
+    }
51
+
52
+    /**
53
+     * Revenir au depart
54
+     *
55
+     * @return void
56
+     */
57
+    public function rewind(): void {
58
+        reset($this->tableau);
59
+        $this->cle = array_key_first($this->tableau);
60
+        $this->valeur = current($this->tableau);
61
+        next($this->tableau);
62
+    }
63
+
64
+    /**
65
+     * Déclarer les critères exceptions
66
+     *
67
+     * @return array
68
+     */
69
+    public function exception_des_criteres() {
70
+        return ['tableau'];
71
+    }
72
+
73
+    /**
74
+     * Récupérer depuis le cache si possible
75
+     *
76
+     * @param string $cle
77
+     * @return mixed
78
+     */
79
+    protected function cache_get($cle) {
80
+        if (!$cle) {
81
+            return;
82
+        }
83
+        # utiliser memoization si dispo
84
+        if (!function_exists('cache_get')) {
85
+            return;
86
+        }
87
+
88
+        return cache_get($cle);
89
+    }
90
+
91
+    /**
92
+     * Stocker en cache si possible
93
+     *
94
+     * @param string $cle
95
+     * @param int $ttl
96
+     * @param null|mixed $valeur
97
+     * @return bool
98
+     */
99
+    protected function cache_set($cle, $ttl, $valeur = null) {
100
+        if (!$cle) {
101
+            return;
102
+        }
103
+        if (is_null($valeur)) {
104
+            $valeur = $this->tableau;
105
+        }
106
+        # utiliser memoization si dispo
107
+        if (!function_exists('cache_set')) {
108
+            return;
109
+        }
110
+
111
+        return cache_set(
112
+            $cle,
113
+            [
114
+                'data' => $valeur,
115
+                'time' => time(),
116
+                'ttl' => $ttl
117
+            ],
118
+            3600 + $ttl
119
+        );
120
+        # conserver le cache 1h de plus que la validite demandee,
121
+        # pour le cas ou le serveur distant ne reponde plus
122
+    }
123
+
124
+    /**
125
+     * Aller chercher les données de la boucle DATA
126
+     *
127
+     * @throws Exception
128
+     * @param array $command
129
+     * @return void
130
+     */
131
+    protected function select($command) {
132
+
133
+        // l'iterateur DATA peut etre appele en passant (data:type)
134
+        // le type se retrouve dans la commande 'from'
135
+        // dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
136
+        if (isset($this->command['from'][0])) {
137
+            if (isset($this->command['source']) && is_array($this->command['source'])) {
138
+                array_unshift($this->command['source'], $this->command['sourcemode']);
139
+            }
140
+            $this->command['sourcemode'] = $this->command['from'][0];
141
+        }
142
+
143
+        // cherchons differents moyens de creer le tableau de donnees
144
+        // les commandes connues pour l'iterateur DATA
145
+        // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
146
+
147
+        // {source format, [URL], [arg2]...}
148
+        if (
149
+            isset($this->command['source'])
150
+            && isset($this->command['sourcemode'])
151
+        ) {
152
+            $this->select_source();
153
+        }
154
+
155
+        // Critere {liste X1, X2, X3}
156
+        if (isset($this->command['liste'])) {
157
+            $this->select_liste();
158
+        }
159
+        if (isset($this->command['enum'])) {
160
+            $this->select_enum();
161
+        }
162
+
163
+        // Si a ce stade on n'a pas de table, il y a un bug
164
+        if (!is_array($this->tableau)) {
165
+            $this->err = true;
166
+            spip_log('erreur datasource ' . var_export($command, true));
167
+        }
168
+
169
+        // {datapath query.results}
170
+        // extraire le chemin "query.results" du tableau de donnees
171
+        if (
172
+            !$this->err
173
+            && isset($this->command['datapath'])
174
+            && is_array($this->command['datapath'])
175
+        ) {
176
+            $this->select_datapath();
177
+        }
178
+
179
+        // tri {par x}
180
+        if ($this->command['orderby']) {
181
+            $this->select_orderby();
182
+        }
183
+
184
+        // grouper les resultats {fusion /x/y/z} ;
185
+        if ($this->command['groupby']) {
186
+            $this->select_groupby();
187
+        }
188
+
189
+        $this->rewind();
190
+        #var_dump($this->tableau);
191
+    }
192
+
193
+
194
+    /**
195
+     * Aller chercher les donnees de la boucle DATA
196
+     * depuis une source
197
+     * {source format, [URL], [arg2]...}
198
+     */
199
+    protected function select_source() {
200
+        # un peu crado : avant de charger le cache il faut charger
201
+        # les class indispensables, sinon PHP ne saura pas gerer
202
+        # l'objet en cache ; cf plugins/icalendar
203
+        # perf : pas de fonction table_to_array ! (table est deja un array)
204
+        if (
205
+            isset($this->command['sourcemode'])
206
+            && !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
207
+        ) {
208
+            charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
209
+        }
210
+
211
+        # le premier argument peut etre un array, une URL etc.
212
+        $src = $this->command['source'][0] ?? null;
213
+
214
+        # avons-nous un cache dispo ?
215
+        $cle = null;
216
+        if (is_string($src)) {
217
+            $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
218
+        }
219
+
220
+        $cache = $this->cache_get($cle);
221
+        if (isset($this->command['datacache'])) {
222
+            $ttl = (int) $this->command['datacache'];
223
+        }
224
+        if (
225
+            $cache
226
+            && $cache['time'] + ($ttl ?? $cache['ttl']) > time()
227
+            && !(_request('var_mode') === 'recalcul' && include_spip('inc/autoriser') && autoriser('recalcul'))
228
+        ) {
229
+            $this->tableau = $cache['data'];
230
+        } else {
231
+            try {
232
+                if (
233
+                    isset($this->command['sourcemode'])
234
+                    && in_array(
235
+                        $this->command['sourcemode'],
236
+                        ['table', 'array', 'tableau']
237
+                    )
238
+                ) {
239
+                    if (
240
+                        is_array($a = $src)
241
+                        || is_string($a) && ($a = str_replace('&quot;', '"', $a)) && is_array($a = @unserialize($a))
242
+                    ) {
243
+                        $this->tableau = $a;
244
+                    }
245
+                } else {
246
+                    $data = $src;
247
+                    if (is_string($src)) {
248
+                        if (tester_url_absolue($src)) {
249
+                            include_spip('inc/distant');
250
+                            $data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
251
+                            $data = $data['page'] ?? '';
252
+                            if (!$data) {
253
+                                throw new Exception('404');
254
+                            }
255
+                            if (!isset($ttl)) {
256
+                                $ttl = 24 * 3600;
257
+                            }
258
+                        } elseif (@is_dir($src)) {
259
+                            $data = $src;
260
+                        } elseif (@is_readable($src) && @is_file($src)) {
261
+                            $data = spip_file_get_contents($src);
262
+                        }
263
+                        if (!isset($ttl)) {
264
+                            $ttl = 10;
265
+                        }
266
+                    }
267
+                    if (
268
+                        !$this->err
269
+                        && ($data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true))
270
+                    ) {
271
+                        $args = $this->command['source'];
272
+                        $args[0] = $data;
273
+                        if (is_array($a = $data_to_array(...$args))) {
274
+                            $this->tableau = $a;
275
+                        }
276
+                    }
277
+                }
278
+
279
+                if (!is_array($this->tableau)) {
280
+                    $this->err = true;
281
+                }
282
+
283
+                if (!$this->err && isset($ttl) && $ttl > 0) {
284
+                    $this->cache_set($cle, $ttl);
285
+                }
286
+            } catch (Exception $e) {
287
+                $e = $e->getMessage();
288
+                $err = sprintf(
289
+                    "[%s, %s] $e",
290
+                    $src,
291
+                    $this->command['sourcemode']
292
+                );
293
+                erreur_squelette([$err, []]);
294
+                $this->err = true;
295
+            }
296
+        }
297
+
298
+        # en cas d'erreur, utiliser le cache si encore dispo
299
+        if ($this->err && $cache) {
300
+            $this->tableau = $cache['data'];
301
+            $this->err = false;
302
+        }
303
+    }
304
+
305
+
306
+    /**
307
+     * Retourne un tableau donne depuis un critère liste
308
+     *
309
+     * Critère `{liste X1, X2, X3}`
310
+     *
311
+     * @see critere_DATA_liste_dist()
312
+     *
313
+     **/
314
+    protected function select_liste() {
315
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
316
+        if (!isset($this->command['liste'][1])) {
317
+            if (!is_array($this->command['liste'][0])) {
318
+                $this->command['liste'] = explode(',', (string) $this->command['liste'][0]);
319
+            } else {
320
+                $this->command['liste'] = $this->command['liste'][0];
321
+            }
322
+        }
323
+        $this->tableau = $this->command['liste'];
324
+    }
325
+
326
+    /**
327
+     * Retourne un tableau donne depuis un critere liste
328
+     * Critere {enum Xmin, Xmax}
329
+     *
330
+     **/
331
+    protected function select_enum() {
332
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
333
+        if (!isset($this->command['enum'][1])) {
334
+            if (!is_array($this->command['enum'][0])) {
335
+                $this->command['enum'] = explode(',', (string) $this->command['enum'][0]);
336
+            } else {
337
+                $this->command['enum'] = $this->command['enum'][0];
338
+            }
339
+        }
340
+        if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
341
+            $enum = range(
342
+                array_shift($this->command['enum']),
343
+                array_shift($this->command['enum']),
344
+                array_shift($this->command['enum'])
345
+            );
346
+        } else {
347
+            $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
348
+        }
349
+        $this->tableau = $enum;
350
+    }
351
+
352
+
353
+    /**
354
+     * extraire le chemin "query.results" du tableau de donnees
355
+     * {datapath query.results}
356
+     *
357
+     **/
358
+    protected function select_datapath() {
359
+        $base = reset($this->command['datapath']);
360
+        if (strlen($base = ltrim(trim((string) $base), '/'))) {
361
+            $results = table_valeur($this->tableau, $base);
362
+            if (is_array($results)) {
363
+                $this->tableau = $results;
364
+            } else {
365
+                $this->tableau = [];
366
+                $this->err = true;
367
+                spip_log("datapath '$base' absent");
368
+            }
369
+        }
370
+    }
371
+
372
+    /**
373
+     * Ordonner les resultats
374
+     * {par x}
375
+     *
376
+     **/
377
+    protected function select_orderby() {
378
+        $sortfunc = '';
379
+        foreach ($this->command['orderby'] as $tri) {
380
+            // virer le / initial pour les criteres de la forme {par /xx}
381
+            if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim((string) $tri, '/'), $r)) {
382
+                $r = array_pad($r, 3, null);
383
+
384
+                // tri par cle
385
+                if ($r[1] == 'cle') {
386
+                    if (isset($r[2]) && $r[2]) {
387
+                        krsort($this->tableau);
388
+                    } else {
389
+                        ksort($this->tableau);
390
+                    }
391
+                } # {par hasard}
392
+                else {
393
+                    if ($r[1] == 'hasard') {
394
+                        $k = array_keys($this->tableau);
395
+                        shuffle($k);
396
+                        $v = [];
397
+                        foreach ($k as $cle) {
398
+                            $v[$cle] = $this->tableau[$cle];
399
+                        }
400
+                        $this->tableau = $v;
401
+                    } else {
402
+                        # {par valeur} ou {par valeur/xx/yy}
403
+                        $tv = $r[1] == 'valeur' ? '%s' : 'table_valeur(%s, ' . var_export($r[1], true) . ')';
404
+                        $sortfunc .= '
405 405
 					$a = ' . sprintf($tv, '$aa') . ';
406 406
 					$b = ' . sprintf($tv, '$bb') . ';
407 407
 					if ($a <> $b)
408 408
 						return ($a ' . (empty($r[2]) ? '<' : '>') . ' $b) ? -1 : 1;';
409
-					}
410
-				}
411
-			}
412
-		}
413
-
414
-		if ($sortfunc) {
415
-			$sortfunc .= "\n return 0;";
416
-			uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
417
-		}
418
-	}
419
-
420
-
421
-	/**
422
-	 * Grouper les resultats
423
-	 * {fusion /x/y/z}
424
-	 *
425
-	 **/
426
-	protected function select_groupby() {
427
-		// virer le / initial pour les criteres de la forme {fusion /xx}
428
-		if (strlen($fusion = ltrim((string) $this->command['groupby'][0], '/'))) {
429
-			$vu = [];
430
-			foreach ($this->tableau as $k => $v) {
431
-				$val = table_valeur($v, $fusion);
432
-				if (isset($vu[$val])) {
433
-					unset($this->tableau[$k]);
434
-				} else {
435
-					$vu[$val] = true;
436
-				}
437
-			}
438
-		}
439
-	}
440
-
441
-
442
-	/**
443
-	 * L'iterateur est-il encore valide ?
444
-	 */
445
-	public function valid(): bool {
446
-		return !is_null($this->cle);
447
-	}
448
-
449
-	/**
450
-	 * Retourner la valeur
451
-	 */
452
-	public function current(): mixed {
453
-		return $this->valeur;
454
-	}
455
-
456
-	/**
457
-	 * Retourner la cle
458
-	 */
459
-	public function key(): mixed {
460
-		return $this->cle;
461
-	}
462
-
463
-	/**
464
-	 * Passer a la valeur suivante
465
-	 */
466
-	public function next(): void {
467
-		if ($this->valid()) {
468
-			$this->cle = key($this->tableau);
469
-			$this->valeur = current($this->tableau);
470
-			next($this->tableau);
471
-		}
472
-	}
473
-
474
-	/**
475
-	 * Compter le nombre total de resultats
476
-	 */
477
-	public function count(): int {
478
-		if (is_null($this->total)) {
479
-			$this->total = count($this->tableau);
480
-		}
481
-
482
-		return $this->total;
483
-	}
409
+                    }
410
+                }
411
+            }
412
+        }
413
+
414
+        if ($sortfunc) {
415
+            $sortfunc .= "\n return 0;";
416
+            uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
417
+        }
418
+    }
419
+
420
+
421
+    /**
422
+     * Grouper les resultats
423
+     * {fusion /x/y/z}
424
+     *
425
+     **/
426
+    protected function select_groupby() {
427
+        // virer le / initial pour les criteres de la forme {fusion /xx}
428
+        if (strlen($fusion = ltrim((string) $this->command['groupby'][0], '/'))) {
429
+            $vu = [];
430
+            foreach ($this->tableau as $k => $v) {
431
+                $val = table_valeur($v, $fusion);
432
+                if (isset($vu[$val])) {
433
+                    unset($this->tableau[$k]);
434
+                } else {
435
+                    $vu[$val] = true;
436
+                }
437
+            }
438
+        }
439
+    }
440
+
441
+
442
+    /**
443
+     * L'iterateur est-il encore valide ?
444
+     */
445
+    public function valid(): bool {
446
+        return !is_null($this->cle);
447
+    }
448
+
449
+    /**
450
+     * Retourner la valeur
451
+     */
452
+    public function current(): mixed {
453
+        return $this->valeur;
454
+    }
455
+
456
+    /**
457
+     * Retourner la cle
458
+     */
459
+    public function key(): mixed {
460
+        return $this->cle;
461
+    }
462
+
463
+    /**
464
+     * Passer a la valeur suivante
465
+     */
466
+    public function next(): void {
467
+        if ($this->valid()) {
468
+            $this->cle = key($this->tableau);
469
+            $this->valeur = current($this->tableau);
470
+            next($this->tableau);
471
+        }
472
+    }
473
+
474
+    /**
475
+     * Compter le nombre total de resultats
476
+     */
477
+    public function count(): int {
478
+        if (is_null($this->total)) {
479
+            $this->total = count($this->tableau);
480
+        }
481
+
482
+        return $this->total;
483
+    }
484 484
 }
Please login to merge, or discard this patch.
ecrire/src/Chiffrer/Chiffrement.php 2 patches
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -18,76 +18,76 @@
 block discarded – undo
18 18
  * @link https://www.php.net/manual/fr/book.sodium.php
19 19
  */
20 20
 class Chiffrement {
21
-	/** Chiffre un message en utilisant une clé ou un mot de passe */
22
-	public static function chiffrer(
23
-		string $message,
24
-		#[\SensitiveParameter]
25
-		string $key
26
-	): ?string {
27
-		// create a random salt for key derivation
28
-		$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
29
-		$key = self::deriveKeyFromPassword($key, $salt);
30
-		$nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
31
-		$padded_message = sodium_pad($message, 16);
32
-		$encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key);
33
-		$encoded = base64_encode($salt . $nonce . $encrypted);
34
-		sodium_memzero($key);
35
-		sodium_memzero($nonce);
36
-		sodium_memzero($salt);
37
-		#spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG);
38
-		return $encoded;
39
-	}
21
+    /** Chiffre un message en utilisant une clé ou un mot de passe */
22
+    public static function chiffrer(
23
+        string $message,
24
+        #[\SensitiveParameter]
25
+        string $key
26
+    ): ?string {
27
+        // create a random salt for key derivation
28
+        $salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
29
+        $key = self::deriveKeyFromPassword($key, $salt);
30
+        $nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
31
+        $padded_message = sodium_pad($message, 16);
32
+        $encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key);
33
+        $encoded = base64_encode($salt . $nonce . $encrypted);
34
+        sodium_memzero($key);
35
+        sodium_memzero($nonce);
36
+        sodium_memzero($salt);
37
+        #spip_log("chiffrer($message)=$encoded", 'chiffrer' . _LOG_DEBUG);
38
+        return $encoded;
39
+    }
40 40
 
41
-	/** Déchiffre un message en utilisant une clé ou un mot de passe */
42
-	public static function dechiffrer(
43
-		string $encoded,
44
-		#[\SensitiveParameter]
45
-		string $key
46
-	): ?string {
47
-		$decoded = base64_decode($encoded);
48
-		$salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES);
49
-		$nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
50
-		$encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
51
-		$key = self::deriveKeyFromPassword($key, $salt);
52
-		$padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
53
-		sodium_memzero($key);
54
-		sodium_memzero($nonce);
55
-		sodium_memzero($salt);
56
-		if ($padded_message === false) {
57
-			spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG);
58
-			return null;
59
-		}
60
-		return sodium_unpad($padded_message, 16);
61
-	}
41
+    /** Déchiffre un message en utilisant une clé ou un mot de passe */
42
+    public static function dechiffrer(
43
+        string $encoded,
44
+        #[\SensitiveParameter]
45
+        string $key
46
+    ): ?string {
47
+        $decoded = base64_decode($encoded);
48
+        $salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES);
49
+        $nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
50
+        $encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
51
+        $key = self::deriveKeyFromPassword($key, $salt);
52
+        $padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
53
+        sodium_memzero($key);
54
+        sodium_memzero($nonce);
55
+        sodium_memzero($salt);
56
+        if ($padded_message === false) {
57
+            spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG);
58
+            return null;
59
+        }
60
+        return sodium_unpad($padded_message, 16);
61
+    }
62 62
 
63
-	/** Génère une clé de la taille attendue pour le chiffrement */
64
-	public static function keygen(): string {
65
-		return sodium_crypto_secretbox_keygen();
66
-	}
63
+    /** Génère une clé de la taille attendue pour le chiffrement */
64
+    public static function keygen(): string {
65
+        return sodium_crypto_secretbox_keygen();
66
+    }
67 67
 
68
-	/**
69
-	 * Retourne une clé de la taille attendue pour le chiffrement
70
-	 *
71
-	 * Notamment si on utilise un mot de passe comme clé, il faut le hacher
72
-	 * pour servir de clé à la taille correspondante.
73
-	 */
74
-	private static function deriveKeyFromPassword(
75
-		#[\SensitiveParameter]
76
-		string $password,
77
-		string $salt
78
-	): string {
79
-		if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
80
-			return $password;
81
-		}
82
-		$key = sodium_crypto_pwhash(
83
-			\SODIUM_CRYPTO_SECRETBOX_KEYBYTES,
84
-			$password,
85
-			$salt,
86
-			\SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
87
-			\SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
88
-		);
89
-		sodium_memzero($password);
68
+    /**
69
+     * Retourne une clé de la taille attendue pour le chiffrement
70
+     *
71
+     * Notamment si on utilise un mot de passe comme clé, il faut le hacher
72
+     * pour servir de clé à la taille correspondante.
73
+     */
74
+    private static function deriveKeyFromPassword(
75
+        #[\SensitiveParameter]
76
+        string $password,
77
+        string $salt
78
+    ): string {
79
+        if (strlen($password) === \SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
80
+            return $password;
81
+        }
82
+        $key = sodium_crypto_pwhash(
83
+            \SODIUM_CRYPTO_SECRETBOX_KEYBYTES,
84
+            $password,
85
+            $salt,
86
+            \SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
87
+            \SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
88
+        );
89
+        sodium_memzero($password);
90 90
 
91
-		return $key;
92
-	}
91
+        return $key;
92
+    }
93 93
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@  discard block
 block discarded – undo
30 30
 		$nonce = random_bytes(\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
31 31
 		$padded_message = sodium_pad($message, 16);
32 32
 		$encrypted = sodium_crypto_secretbox($padded_message, $nonce, $key);
33
-		$encoded = base64_encode($salt . $nonce . $encrypted);
33
+		$encoded = base64_encode($salt.$nonce.$encrypted);
34 34
 		sodium_memzero($key);
35 35
 		sodium_memzero($nonce);
36 36
 		sodium_memzero($salt);
@@ -47,14 +47,14 @@  discard block
 block discarded – undo
47 47
 		$decoded = base64_decode($encoded);
48 48
 		$salt = substr($decoded, 0, \SODIUM_CRYPTO_PWHASH_SALTBYTES);
49 49
 		$nonce = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES, \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
50
-		$encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES + \SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
50
+		$encrypted = substr($decoded, \SODIUM_CRYPTO_PWHASH_SALTBYTES +\SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
51 51
 		$key = self::deriveKeyFromPassword($key, $salt);
52 52
 		$padded_message = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
53 53
 		sodium_memzero($key);
54 54
 		sodium_memzero($nonce);
55 55
 		sodium_memzero($salt);
56 56
 		if ($padded_message === false) {
57
-			spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer' . _LOG_DEBUG);
57
+			spip_log("dechiffrer() chiffre corrompu `$encoded`", 'chiffrer'._LOG_DEBUG);
58 58
 			return null;
59 59
 		}
60 60
 		return sodium_unpad($padded_message, 16);
Please login to merge, or discard this patch.
ecrire/src/Admin/Bouton.php 2 patches
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -7,32 +7,32 @@
 block discarded – undo
7 7
  * privée ou dans un de ses sous menus
8 8
  */
9 9
 class Bouton {
10
-	/** Sous-barre de boutons / onglets */
11
-	public array $sousmenu = [];
10
+    /** Sous-barre de boutons / onglets */
11
+    public array $sousmenu = [];
12 12
 
13
-	/** Position dans le menu */
14
-	public int $position = 0;
13
+    /** Position dans le menu */
14
+    public int $position = 0;
15 15
 
16
-	/** Entrée favorite (sa position dans les favoris) ? */
17
-	public int $favori = 0;
16
+    /** Entrée favorite (sa position dans les favoris) ? */
17
+    public int $favori = 0;
18 18
 
19 19
 
20
-	/**
21
-	 * Définit un bouton
22
-	 */
23
-	public function __construct(
24
-		/** L'icone à mettre dans le bouton */
25
-		public string $icone,
26
-		/** Le nom de l'entrée d'i18n associé */
27
-		public string $libelle,
28
-		/** L'URL de la page (null => ?exec=nom) */
29
-		public ?string $url = null,
30
-		/** Arguments supplémentaires de l'URL */
31
-		public string|array|null $urlArg = null,
32
-		/** URL du javascript */
33
-		public ?string $url2 = null,
34
-		/** Pour ouvrir une fenêtre à part */
35
-		public ?string $target = null
36
-	) {
37
-	}
20
+    /**
21
+     * Définit un bouton
22
+     */
23
+    public function __construct(
24
+        /** L'icone à mettre dans le bouton */
25
+        public string $icone,
26
+        /** Le nom de l'entrée d'i18n associé */
27
+        public string $libelle,
28
+        /** L'URL de la page (null => ?exec=nom) */
29
+        public ?string $url = null,
30
+        /** Arguments supplémentaires de l'URL */
31
+        public string|array|null $urlArg = null,
32
+        /** URL du javascript */
33
+        public ?string $url2 = null,
34
+        /** Pour ouvrir une fenêtre à part */
35
+        public ?string $target = null
36
+    ) {
37
+    }
38 38
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@
 block discarded – undo
28 28
 		/** L'URL de la page (null => ?exec=nom) */
29 29
 		public ?string $url = null,
30 30
 		/** Arguments supplémentaires de l'URL */
31
-		public string|array|null $urlArg = null,
31
+		public string | array | null $urlArg = null,
32 32
 		/** URL du javascript */
33 33
 		public ?string $url2 = null,
34 34
 		/** Pour ouvrir une fenêtre à part */
Please login to merge, or discard this patch.
ecrire/src/Css/Vars/Collection.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -7,21 +7,21 @@
 block discarded – undo
7 7
  * @internal
8 8
  */
9 9
 class Collection implements \Stringable {
10
-	private array $vars = [];
10
+    private array $vars = [];
11 11
 
12
-	public function add(string $var, string $value) {
13
-		$this->vars[$var] = $value;
14
-	}
12
+    public function add(string $var, string $value) {
13
+        $this->vars[$var] = $value;
14
+    }
15 15
 
16
-	public function getString(): string {
17
-		$string = '';
18
-		foreach ($this->vars as $key => $value) {
19
-			$string .= "$key: $value;\n";
20
-		}
21
-		return $string;
22
-	}
16
+    public function getString(): string {
17
+        $string = '';
18
+        foreach ($this->vars as $key => $value) {
19
+            $string .= "$key: $value;\n";
20
+        }
21
+        return $string;
22
+    }
23 23
 
24
-	public function __toString(): string {
25
-		return $this->getString();
26
-	}
24
+    public function __toString(): string {
25
+        return $this->getString();
26
+    }
27 27
 }
Please login to merge, or discard this patch.