Neues event in HtmlOutputNodeProcessor

  • App
    WoltLab Suite Core

    Hallo,

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

    https://github.com/WoltLab/WCF/bl…r.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.

    • Offizieller Beitrag

    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?

    • Offizieller Beitrag

    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.....

    • Offizieller Beitrag

    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

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!