Konstanten/Variablen
Dieses Problem habe ich früher ganz einfach gelöst: aus der .css-Datei eine .css.php machen und an den entsprechenden Stellen mit
<?php echo MEINE_CONSTANTE;?>Nachdem ich diesen und diesen Artikel gelesen hatte war ich leider von der angebotenen Technik ein wenig enttäuscht - ABER die Syntax hat mir sehr gefallen, da sie sehr stark am "echten" CSS orientiert ist. Ich habe sie nur ein wenig angepasst.
Deklaration
Bei der Deklaration der Konstanten bin ich einen zweigleisigen Ansatz gefahren. Entweder man schreibt die Konstantendeklaration in die CSS-Datei mit diesem Schema:
@parser constants{
contantenName1: wert1;
contantenName2: wert2;
}
$p = new CSSParser(array("constantenName1" => "wert1", "constantenName2" => "wert2"));
Abruf
Den Abruf der Constanten im CSS habe ich so einfach wie möglich gehalten:
#selector {
eigenschaft: constantenName;
}Realisierung
Deklaration
Die Deklaration im Konstruktur ist natürlich einfach: einer Instanzvariablen einfach das übergebene Array zuweisen:
public function __construct(array $const = array()){
$this->constants = $const;
}Bei den Deklarationen im CSS ist das etwas komplizierter - aber nicht zu sehr:
private function parseConstants($content){
// self::$strRegExp = '\'(?:\\\\.|[^\'])+\'|"(?:\\\\.|[^\"])+"'
return preg_replace_callback('/@parser\s+constants{((?:[^{}"\']|' . self::$strRegExp . ')+)}\s*/', array($this, "parseConstantsRegExpWrapper"), $content);
}
private function parseConstantsRegExpWrapper($match){
switch(count($match)){
// erster Aufruf
case 2:
// $this->comment erzeugt aus dem übergebenen String einen CSS-Kommentar
return $this->comment(
preg_replace_callback("/[\n\r\s]*" .
"(\w+)" .
"\s*:\s*" .
"(" .
"(?:" .
"[^;'\"]" . "|" .
self::$strRegExp .
")+" .
")" .
";[\n\r\s]*/", array($this, __METHOD__), $match[1])
);
break;
// Aufruf über sich selbst
case 3:
if (!array_key_exists($match[1], $this->constants)){
$this->constants[$match[1]] = $match[2];
}
else {
return "cannot redeclare constant '" . $match[1] . "' (try to set it to '" . $match[2] . "')\n";
}
break;
}
return "";
}Abruf
Die Ersetzung der Konstanten im normalen CSS ist leider noch nicht optimal - aber bis jetzt reicht dieser Ansatz:
foreach ($this->constants as $name => $value){
$content = preg_replace("/(?<!\\.|#|')\\b" . preg_quote($name, "/") . "\\b/", $value, $content);
}