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:
Nun ist nur noch die Frage was $this->parseFileRegExpWrapper tut:
$content = preg_replace_callback('/@parser\s+include\s*\(\s*(' .
'[^\(\)\'"]+' . '|' .
self::$strRegExp .
')\s*\)\s*;/', array($this, "parseFileRegExpWrapper"), $content);Code:
- $this->parseFile ist relativ einfach: 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;
}Code:
- und $this->parse ist unsere Hauptfunktion in der das CSS bearbeitet wird.
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);
}