Ich weiß, dass dies außerhalb des Rahmens der meisten Communities liegt, aber wir sind eine wissenschaftliche Community, die Python und viele Graphen (Matplotlib) verwendet, die wir über Discourse miteinander teilen.
Es wäre fantastisch, einen interaktiven Graphen anstelle eines statischen jpg/png teilen zu können.
Betrachten Sie dieses Beispiel:
import matplotlib.pyplot as plt
import mpld3
import numpy as np
Fs = 4000
f = 100
sample = 200
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
fig, ax = plt.subplots(1,1)
ax.plot(x, y, marker=".")
html_str = mpld3.fig_to_html(fig)
Html_file= open("index.html","w")
Html_file.write(html_str)
Html_file.close()
Sie könnten die Datei index.html öffnen und sie würde das anzeigen (nur dass sie INTERAKTIV sein wird…)
Die von Ihnen beschriebene Methode wäre über ein benutzerdefiniertes Plugin möglich, das sowohl ein Markdown-It-Plugin als auch möglicherweise einen guten Objektspeicher für die HTMLs kombiniert. Ich wäre jedoch vorsichtig hinsichtlich der Sicherheit, da Benutzereingaben überall auf dem Server ausgeführt werden könnten. Discourse leistet bereits viel Arbeit, um einen Beitrag für HTML und JS zu bereinigen, damit er sicher im Backend geparst werden kann.
Sie hätten stattdessen vielleicht mehr Erfolg, wenn Sie versuchen würden, einen Python-Interpreter im Browser einzubetten und den Code auf dem Client auszuführen, wodurch die gesamte HTML-Erstellung entfällt. JupyterLite würde es Ihnen ermöglichen, JupyterLab im Browser mit Benutzeroberfläche auszuführen. Aus der Dokumentation geht hervor, dass Sie Code beim Erstellen des iframes automatisch ausführen lassen können. Sie können den Code mit einem benutzerdefinierten HighlightJS-Plugin einspeisen, das auf jedem Python-Codeblock eine ausführbare Schaltfläche erstellt oder ihn automatisch ausführt.
Also etwas wie:
Der Benutzer sieht einen Beitrag mit einem Python-Codeblock.
Der Benutzer fährt mit der Maus über den Codeblock, wo eine Schaltfläche erscheint, mit der er den Code im Browser ausführen kann.
Der Benutzer klickt auf die Schaltfläche, die unter dem Code einen iframe zu JupyterLite erstellt und den Code aus dem Codeblock importiert.
Da dies nur ein HighlightJS-Plugin wäre, das lediglich einen iframe zu JupyterLite erstellt, können Sie alles innerhalb einer Theme Component erstellen, ohne Servercode zu benötigen.
Eine Sache ist zu beachten: JupyterLite wird als nicht funktionsvollständig im Vergleich zu JupyterLab beschrieben, und ich bin mir nicht sicher, wie es mit Paketimporten umgeht, sodass Sie es möglicherweise selbst hosten müssen. JupyterLite verwendet Pyodide, das jedes Wheel auf PyPI unterstützt, sodass es gut sein sollte.
Ich denke, das Sicherheitsrisiko ist nicht so groß, wenn index.html auf der Client-Seite (im Browser des Benutzers, nicht auf dem Discourse-Server) ausgeführt wird.
Außerdem liegt der Vorteil des mpld3-Ansatzes darin, dass es sich um eine einzelne Datei ohne Abhängigkeiten handelt. Wenn Sie reines Python ausführen, müssen Sie auch alle Abhängigkeiten wie CSV-Dateien, Datendateien usw. hochladen, die die Quelle dessen sind, was Sie darstellen möchten.
Nichtsdestotrotz wäre es einfach fabelhaft, reine Python-Skripte innerhalb eines Discourse-Posts ausführen zu können!
Oh! Ich habe völlig missverstanden, wie die HTML generiert werden würde. Wenn der Benutzer das HTML im Voraus generiert, könnten Sie es von einer externen Website per iframe einbetten lassen, wobei die Domain auf der Whitelist steht.
Zum Beispiel Codepen, was standardmäßig erlaubt sein sollte:
<iframe height="300" width="800" style="width: 100%;" scrolling="no" title="mplD3 example, actually working" src="https://codepen.io/gully/embed/BawMGr?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/gully/pen/BawMGr">
mplD3 example, actually working</a> by gully (<a href="https://codepen.io/gully">@gully</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
Das ist wirklich großartig!
Ich habe ein paar Fragen:
Glauben Sie, dass es mit ipympl funktionieren wird (andernfalls sind die Abbildungen nicht interaktiv, was den ganzen Sinn zunichte macht)?
Glauben Sie, dass es mit einem zugrunde liegenden Projektordner funktionieren kann, in dem wir die Umgebungsvariable PYTHONPATH festlegen können, bevor wir Jupyter starten, damit Benutzer Funktionen und Abhängigkeiten aus dem gemeinsamen Projekt importieren können?
Und ja, ich habe ein Budget, wenn dies vernünftig und machbar ist und als Open Source für die gesamte Discourse-Community beigetragen werden kann.
@Alteras Danke, diese Lösung ist wirklich unkompliziert und funktioniert, wenn Sie einen Weg finden, die Datei “index.heml” auf Discourse hochzuladen (was das Hochladen von .html-Dateien einfach ermöglicht) und sie im iframe-Code bereitzustellen. Das einzige Problem ist, dass es tatsächlich nicht funktioniert. Wenn ich das versuche, wird die index.html heruntergeladen, anstatt sie im iframe zu rendern. Vielleicht gibt es ein Meta-Tag, das dem iframe sagt, dass er die Datei anzeigen und nicht herunterladen soll?