Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Compactor zerstört Inline-CSS unter bestimmten Umständen

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.729
    • Geschlecht:
    Hallo Community.

    Voraussetzung: HTML-Komprimierung ist aktiviert.

    Wenn man aufgrund hier nicht näher zu erläuternder Gründe Inline-CSS benutzt und in einem Wert einer Eigenschaft Minus-Zeichen benötigt wird der CSS-Befehl zerstört.
    Beispiel:

    Aus diesem:

    Code: CSS  [Auswählen]
    #IRGENDWAS {background:#89362C; box-shadow:2px 2px 2px #89362C, -2px -2px 2px #89362C;}

    wird das:

    Code: CSS  [Auswählen]
    #IRGENDWAS{background:#89362C;box-shadow:2px 2px 2px #89362C,-2px-2px 2px #89362C;}

    (Leerzeichen vor dem zweiten -2 wurde entfernt.)

    Das liegt an der Regex in folgendem Code in der Funktion _simpleCodeCompress() in
    /includes/external/compactor/compactor.php:

    Code: PHP  [Auswählen]
    return preg_replace('/\s?([\{\};\=\(\)\/\+\*-])\s?/', "\\1", $code);

    Alle Leerzeichen vor und nach einem Bindestrich (welcher leider auch ein Minus-Zeichen ist) werden entfernt.
    Beim ersten vorkommenden -2 hat das keine Folgen weil es eine Angabe nach einem Komma ist. Beim zweiten -2 allerdings ist es nicht mehr valides CSS da dies entsteht -2-2 .

    Es stellt sich die Frage warum überhaupt der Bidestrich, bzw. das Minus-Zeichen, in der Regex enthalten ist.
    Ich kann mir gerade keinen Fall vorstellen wo im HTML, im Javascript oder im CSS ein Bindestrich vorkommen könnte welcher Leerzeichen davor oder dahinter hat die entfernt werden müssten.
    HTML-Kommentare, welche ja Bindestriche enthalten, werden in der Funktion extra behandelt.

    Sollte der Bindestrich in der Regex Sinn machen, weil es mir gerade nicht präsente Fälle gibt wo Leerzeichen entfernt werden sollten um zu komprimieren, muß man sich etwas überlegen um die Fälle von negativen Werten nach einem wert ausschließen:
    Evtl. mittels getrennter Behandlung und einem negativen Lookbehind, so ?

    Code: PHP  [Auswählen]
    $code = preg_replace('/(?<!px)\s?(-)\s?/', "\\1", $code);
    return preg_replace('/\s?([\{\};\=\(\)\/\+\*])\s?/', "\\1", $code);

    Damit würden keine Leerzeichen vor - entfernt wenn vor dem Leerzeichen px steht und man bekäme das:

    Code: CSS  [Auswählen]
    #IRGENDWAS{background:#89362C;box-shadow:2px 2px 2px #89362C,-2px -2px 2px #89362C;}

    Wer kann dazu etwas beitragen und/oder hatte das Problem auch schon einmal ?

    Gruß,
    noRiddle

    Linkback: https://www.modified-shop.org/forum/index.php?topic=40184.0

    Schreinermeister

    • Fördermitglied
    • Beiträge: 425
    • Geschlecht:
    Re: Compactor zerstört Inline-CSS unter bestimmten Umständen
    Antwort #1 am: 16. April 2019, 12:32:39
    Hallo zusammen,

    ich denke nicht das es im direkten Zusammenhang steht, allerdings habe ich seit kurzem beim "compaktieren" des CSS die Fehlermeldung:

    Code: PHP  [Auswählen]
    Fatal error: Cannot declare class Compactor, because the name is already in use in /homepages/28/d252186847/htdocs/includes/external/compactor/compactor.php on line 44

    was diese Codestelle ist:

    Code: PHP  [Auswählen]
            class Compactor
            {

    an der compactor.php wurde allerdings nichts geändert.

    In der Shopdarstellung ist mir bisher nichts aufgefallen.

    ( Inline-CSS verwende ich natürlich nur wenn ich mir nicht anders helfen kann ) :whistle:

    Gruß Chris

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.729
    • Geschlecht:
    Re: Compactor zerstört Inline-CSS unter bestimmten Umständen
    Antwort #2 am: 16. April 2019, 12:55:07
    Kurze Klarstellung:
    Den Begriff "Inline-CSS" habe ich mißverständlich benutzt.
    Das Browser-Tool von Firefox nennt es auch "Inline" wenn auf einer Seite CSS explizit innerhalb von style-tags eingebunden ist, also nicht als Link zu einer CSS-Datei.
    Diese Bedeutung von "Inline" meine ich.

    Ich habe mal vor längerer Zeit leuten hören, daß man evtl. eine andere (neuere) Komprimier-Klasse zu nutzen gedenkt. Es ist also nicht klar ob man das von mir hier Beschriebene noch fixen muß. Mal sehen...

    Jedenfalls habe ich das Problem dieses Threads in diesem Ticket verlinkt (#930), wo es darum geht, daß einzeilige Kommentare in Javascript mittels // die Komprimierung zerstören.

    Gruß,
    noRiddle
    0 Antworten
    1744 Aufrufe
    24. September 2012, 20:09:17 von Imion
    3 Antworten
    1769 Aufrufe
    29. Januar 2016, 17:18:06 von Bonsai
    4 Antworten
    1880 Aufrufe
    20. März 2017, 20:09:58 von web28
    6 Antworten
    2362 Aufrufe
    07. März 2017, 09:34:28 von lohkaes1
               
    anything