MB: Gibt es frei verfügbare PHP Preprocessor Tutorials?

moin,

Gibt es frei verfügbare PHP Preprocessor Tutorials? Bespielsweise die aus SASS oder SCSS validen CSS Code formen.

Ich möchte mir einen simplen Preprocessor schreiben und werde unter anderem ohnehin bei MarkUP, Twig nach gucken wie man das am besten lösen kann. Da wollte ich gucken ob's da n eingfaches Tutorial gibt.

lgmb

  1. Hallo MB,

    es gibt eine PHP Extension für SASS, namens sassphp, aber die ist 8 Jahre alt und dürfte zu heutigen PHPs nicht mehr passen. Und sie ist zum selbercompilieren... Findest Du bei github.

    Ansonsten ist das Parsen von Texten - also das finden der Bedeutung hinter den Zeichen - eine nichttriviale Übung und auch ein simpler Parser fällt einem schnell auf die Füße.

    Die Lösung, die ich einmal gewählt habe, bestand aus einem PHP Script, das in etwa so aussieht. Die Caching-Header kannst Du an deine eigenen Bedürfnisse anpassen.

    <?php
    header("Content-type: text/css");
    // Ganz wichtig: Caching ermöglichen, sonst macht das hier nicht viel Sinn.
    header("Cache-Control: max-age=86400, must-revalidate");
    header("Expires: " . date('r', time() + 86400));
    
    // Definiere Variablen, die im unten inkludierten CSS aufgelöst werden. 
    // Dass CSS wird inkludiert, damit eine IDE ".css" sieht und CSS Hilfe anbietet.
    $color1 = "#f00";
    $color2 = "#00f";
    // etc etc etc
    
    $css = \filter_input(INPUT_GET, 'css', FILTER_UNSAFE_RAW);
    $css = \preg_replace("/[\?\*\\\:]/", "", $css);
    if (empty($css))
    {
      $css = "default";
    }
    
    // gewünschte CSS Datei includen
    include $_SERVER['DOCUMENT_ROOT'].'templates/styles/'.$css.'.css';
    

    Und im HTML lade ich das stylesheet dann über die URL loadcss.php?css=stylesheet.css

    Im CSS kann man dann jederzeit PHP Variablen verwenden, so wie im HTML auch, also mit <?= $color1 ?>.

    a {
       color: <?= $linktext_color ?>;
    }
    

    Das ist dann ein LESS oder SASS für Arme. Aber wenn Du Mixins haben willst oder sowas, dann installiere Dir lieber less.js, das läuft unter node, ohne dass Du Dir die libsass selbst compilieren musst. Wenn Du die libsass schon hast, und Dir das zusammenstecken zutraust, dann gibt's auch node-sass auf github, das ein node.js Frontend für die libsass darstellt. SASS via node.js wird von einigen IDEs unterstützt.

    Aber einen CSS Parser selbst schreiben, um SASS-artige Dinge zu tun - uiuiui, das ist ein mutiges Unterfangen. Ich würde da vermutlich als erstes in Richtung ANTLR schielen, für den es tatsächlich sein einiger Zeit eine PHP Runtime gibt... Allerdings ist man mit eigenen Sprachgrammatiken immer recht schnell in Gefahr, sobald es relevante Updates der Sprache gibt.

    Rolf

    --
    sumpsi - posui - clusi
    1. moin,

      schau ich mir morgen an. Danke Dir 😀. Bis dann

      lgmb

      1. Hallo MB,

        ich sehe gerade, dass ich von einer Version meines Scripts ausgegangen bin, die in einem veralteten Entwicklungszweig lag und etwas buggy ist.

        Diese folgende Zeile muss so geändert werden, dass sie auch das Zeichen / entfernt, es sei denn, du willst unbedingt Pfade akzeptieren können. Zur Zeit entfernt sie nur die Wildcardzeichen "?" und "*" sowie die Windows-Pfadsymbole "" und ":". Das bedingt dann auch ein anderes REGEX-Delimiterzeichen.

        $css = \preg_replace("/[\?\*\\\:]/", "", $css);
        
        $css = \preg_replace("#[/\?\*\\\:]#", "", $css);
        

        Die folgende Zeile legt die CSS Quelle auf den Ordner templates/styles fest, das musst Du für dich sicherlich anpassen. Für einen Moment dachte ich auch „Rolf, was für einen Scheiß hast Du da denn gemacht, dass Du das DOCUMENT_ROOT verwendest“, aber sie ist richtig, weil das ja keine URL ist sondern ein serverinterner Dateizugriff. Und man könnte auch PHP Stringersetzung nutzen...

        include $_SERVER['DOCUMENT_ROOT']."templates/styles/$css.css";
        

        DOCUMENT_ROOT endet (zumindest bei mir) auf ein "/", deshalb steht vor meinem ergänzten Pfadteil kein weiterer Verzeichnistrenner. Man könnte höchstens einwenden, dass ich ein fest codiertes / verwende, statt DIRECTORY_SEPARATOR, aber da Windows ein / genauso verdaut wie ein , ist das wohl nicht wirklich nötig.a

        Rolf

        --
        sumpsi - posui - clusi