Neues event in HtmlOutputNodeProcessor

  • Hallo,


    in der Klasse HtmlOutputNodeProcessor gibt es bereits ein Event ehe der Prozess startet.

    https://github.com/WoltLab/WCF…deProcessor.class.php#L90


    Ich wünsche mir ein weiteres Event nach dem Prozess, damit man im Nachgang die Elemente verändern kann ohne bestehende BBCode-Klassen durch eigene Klassen ersetzen zu müssen.

    • Official Post

    Es gibt bewusst kein Event an dieser Stelle, weil das Resultat der BBCodes und sonstigen Output-Klassen erst zum Zeitpunkt des Aufrufs von getHtml() deterministisch ist. Die aktuell vorliegende Implementierung gewährleistet konzeptionell eine Unveränderlichkeit des relevanten DOM vom Zeitpunkt des Aufrufes von process() bis zum Aufruf im Rahmen von getHtml(), insbesondere im Hinblick auf renameTag() und Konsorten.


    Was möchtest du im Detail mit dem Event erreichen?

    • Official Post

    Das ist praktisch nicht möglich. Der Grund dafür ist, dass das HTML erst zum Zeitpunkt von getHtml() finalisiert ist. Einige Plugins, zum Beispiel die Bilder-Whitelist von SoftCreatR, fängt die Bilder ab und ersetzt diese mit einem eigenen Tag. Erst beim endgültigen Aufruf von getHtml() werden diese in native img-Elemente umgewandelt.


    Das Problem ist: Die Rückgabe von getHtml() und die Ersetzungen von Elementen basiert auf String-Ersetzung. Das resultierende HTML ist per Definition nicht wohlgeformt, das per \DOMDocument zu verarbeiten ist zum Scheitern verurteilt.

  • Wenn man in getHtml() etwas hätte, dann könnte man das dann mit mit preg_replace austauschen.


    Ich bräuchte etwas, was am ende greift, damit ich nicht den gleichen Weg wie SoftCreatR einschlagen muss. (Bei 2..3 Plugins mache ich das gleiche)


    Nebenfrage zu dem ersetzen der Elemente mit eigenem Tag. Was passiert, wenn man 2 ähnliche Sachen im Einsatz hätte. Greift dann dass, was als erstes installiert wurde = kleinste Event-ID?


    Leider gibt es keine Möglichkeit die einzelnen Elemente/BBCodes zu erweitern.....

    • Official Post

    Greift dann dass, was als erstes installiert wurde = kleinste Event-ID?

    Es gibt bei Event-Listener den Nice-Value, mit dem du dich spezifisch davorsetzen kannst: https://docs.woltlab.com/package_pip_event-listener.html


    Leider gibt es keine Möglichkeit die einzelnen Elemente/BBCodes zu erweitern.....

    Wenn du eine Idee hast, wie man das System sinnvoll erweitern kann, dann immer her damit, gerne auch als Konzept in Form eines Issues bei GitHub. Letztlich wird es immer schwierig sein, wenn verschiedene Erweiterungen unabhängig auf dieselben Elemente zugreifen wollen, das liegt einfach in der Natur der Sache.


    --


    Gegenwärtig sehe ich keine ausreichende Grundlage für ein neues Event, da dies meiner Ansicht nach potentiell mehr Schaden als Nutzen bringt. Und HTML mit RegEx zu verarbeiten ist schon seit immer ein ideales Werkzeug, um sich selbst in den Fuß zu schießen.

  • Danke für den Tip mit Nice-Value


    SoftCreatR: Soweit ich das gesehen habe, greift das Plugin Bilder-Whitelist nicht, wenn Bilder im Rahmen von BBCodes entstehen. Oder, wenn wenn ich Lazyload via script und placeholdern umsetzen würde und ebenfalls renameTag() verwende.


    ....ich grübel mal weiter :) Danke erstmal

  • Soweit ich das gesehen habe, greift das Plugin Bilder-Whitelist nicht, wenn Bilder im Rahmen von BBCodes entstehen.


    Naja, könnte es, jedoch ist die Verarbeitung anderer BBCodes als dem IMG-BBCode nicht vorgesehen. Und Lazyload arbeitet vollkommen anders, greift bewusst bei jedem Bild.