Serverseitige Einfügungen

CSS-Dateien auf dem Server zusammenzufügen wäre eigentlich nicht notwendig da es ja den @import-Befehl gibt... ABER man z.B. in allen Dateien die gleichen Konstanten verwenden will kann man sich so die widerholte Deklaration sparen (und man kann sogar komplette Dateien in einen Selektor-Scope setzten - aber dazu kommen wir später).

Syntax

Auch hier habe ich versucht so einfach, intuitiv und nahe am nativen CSS zu bleiben:

Code:@parser include(dateiname1) @parser include('datei\'name2')

Realisierung

Die Ersetzung erfögt über eine simples preg_replace_callback:

Code: $content = preg_replace_callback('/@parser\s+include\s*\(\s*(' . '[^\(\)\'"]+' . '|' . self::$strRegExp . ')\s*\)\s*;/', array($this, "parseFileRegExpWrapper"), $content);
Nun ist nur noch die Frage was $this->parseFileRegExpWrapper tut:
Code: private function parseFileRegExpWrapper($match){ // diese Variable brauchen wir um zu wissen wo wir uns in der include-Rekursion befinden $this->recursion++; $filename = preg_replace("/^['\"]|['\"]$/", "", $match[1]); $ret = $this->parseFile($filename); $this->recursion--; if ($this->displayParserActions) return $this->comment(" --- start parser-include from file " . $filename . " --- ") . $ret . $this->comment(" --- end parser-include --- "); return $ret; }
- $this->parseFile ist relativ einfach:
Code: public function parseFile($filename){ if (!is_file($filename)){ return $this->comment($filename . " not found!"); } $content = file_get_contents($filename); // für den richtigen Last-Modified-Header wichtig $this->lastModified = max($this->lastModified, fileMTime($filename)); return $this->parse($content); }
- und $this->parse ist unsere Hauptfunktion in der das CSS bearbeitet wird.