Was wäre nötig, um eine aktive Matplotlib-Grafik in einem Beitrag einzufügen?

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…)

Ich habe also das Gefühl, dass wir auf halbem Weg sind, oder?
Vielleicht nur die HTML-Datei hochladen, damit sie in einem iFrame läuft?

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:

  1. Der Benutzer sieht einen Beitrag mit einem Python-Codeblock.
  2. 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.
  3. 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.

3 „Gefällt mir“

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!

2 „Gefällt mir“

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>
3 „Gefällt mir“

Das ist absolut machbar:

Wenn Sie viele Benutzer haben, benötigen Sie möglicherweise Hilfe bei der Automatisierung einiger Einrichtungsschritte.

Ich kann helfen, wenn Sie Budget haben.

5 „Gefällt mir“

Das ist wirklich großartig!
Ich habe ein paar Fragen:

  1. Glauben Sie, dass es mit ipympl funktionieren wird (andernfalls sind die Abbildungen nicht interaktiv, was den ganzen Sinn zunichte macht)?
  2. 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.

2 „Gefällt mir“

Sehr wahrscheinlich

Ich kann mir vorstellen, wie Sie eine kollaborative Umgebung schaffen könnten.

Schreiben Sie mir eine DM, wir können uns gerne per Anruf unterhalten.

2 „Gefällt mir“

@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?

Ahh, ich verstehe. Discourse setzt standardmäßig alle Nicht-Bild-Anhänge mit Content-Disposition als „attachment“, was sie nur als Download behandelt.

Sie könnten möglicherweise etwas Ähnliches wie die Inline-PDF-Vorschauen tun, die dasselbe Problem zu lösen scheinen, jedoch für PDF-Uploads.

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.