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

Code:<?php echo MEINE_CONSTANTE;?>
das Richtige eingefügt - nur ist das leider weder besondern schön noch besonders handlich.

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:

Code:@parser constants{ contantenName1: wert1; contantenName2: wert2; }
oder man gibt dem CSSParser-Objekt die Variablen im PHP mit:
Code: $p = new CSSParser(array("constantenName1" => "wert1", "constantenName2" => "wert2"));

Abruf

Den Abruf der Constanten im CSS habe ich so einfach wie möglich gehalten:

Code:#selector { eigenschaft: constantenName; }
- somit ist es sehr den CSS-internen Konstanten (wie z.B. black, white, solid...) ähnlich.

Realisierung

Deklaration

Die Deklaration im Konstruktur ist natürlich einfach: einer Instanzvariablen einfach das übergebene Array zuweisen:

Code: public function __construct(array $const = array()){ $this->constants = $const; }

Bei den Deklarationen im CSS ist das etwas komplizierter - aber nicht zu sehr:
Code: 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:

Code: foreach ($this->constants as $name => $value){ $content = preg_replace("/(?<!\\.|#|')\\b" . preg_quote($name, "/") . "\\b/", $value, $content); }