Construire dynamiquement plusieurs niveaux

Générer du SASS/SCSS depuis du CSS

Le problème exposé dans ce sujet a été résolu.

Bonsoir à tous !

Suite à quelques projets menés tambours battants, il va me falloir nettoyer du code SCSS qui en a pâti. Comme les sites s’affichent correctement, l’idée serait donc de reprendre le fichier CSS "utile" proposé par les outils du navigateur et de l’analyser pour en refaire l’arbre proche du SCSS souhaité. Au pire, une analyse au niveau des paires propriété ⇔ valeur, si je les utilise sous forme clé ⇔ valeur dans un tableau, je ne conserve que la dernière utilisée — ah, il me faudra regarder s’il n’y a pas un !important qui passe dans le coin, j’y pense maintenant.

Récupérer les propriétés et leurs valeurs, c’est pas difficile, au final. Le souci est de recréer les éléments de l’arbre à partir d’une chaîne de type #General .toto a #tagada.tsointsoin:hover pour mettre les paires nécessaires dans $finalSelectors['#General']['.toto']['a']['#tagada']['&.tsointsoin']['&:hover']. Certes, un bon preg_split() devrait permettre de récupérer les différents index à utiliser, mais ce que je me pose comme question, c’est comment faire pour passer de cette suite linéaire crachée par preg_split() à un élément qui "a plusieurs dimensions" ? Si j’étais fou, je ferais quelque chose comme eval("$selectors['" . implode("']['", $arraySelectors) . "']");, mais justement…

Le souci est donc que — l’heure n’aidant probablement pas trop —, je ne vois pas d’autre manière de faire qui soit rapide, sachant que j’ai déjà deux boucles imbriquées à ce stade de l’algorithme, la première fonctionnant sur l’entier de la source, et la seconde sur les sélecteurs séparés par des virgules1.

Est-ce que quelqu’un verrait une manière de faire ?

Merci d’avance  :)


  1. Cas pas très courant si on part d’un CSS générés depuis du SCSS/SASS, mais si on voulait faire de la rétroingénierie "correcte", comme on combine plusieurs sélecteurs en un, on doit dupliquer les règles. 

+0 -0

En gardant une référence sur la dernière dimension créée ? Genre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$dimensions = range('a', 'f');
$array = [];
$current = &$array;
foreach ($dimensions as $dim) {
    //if (!array_key_exists($dim, $current)) {
        $current[$dim] = [];
    //}
    $current = &$current[$dim];
}
unset($current);
var_dump($array);
+1 -0

@unidan : la question est comment passer d'un élément "linéaire" récupéré depuis un sélecteur à une structure "dimensionnelle" de manière efficace.

@vibrice : merci ! Il me semblait qu'il devait y avoir moyen d'utiliser les "pointeurs", mais hier soir, c'était trop tard pour que je voie comment faire. C'est pourtant logique…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte