So che questo è al di fuori dell’ambito della maggior parte delle community, ma noi siamo una community scientifica, utilizziamo Python e molti grafici (Matplotlib) che condividiamo tra noi su Discourse.
Sarebbe fantastico poter condividere un grafico interattivo invece di un jpg/png statico
Considera questo esempio:
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()
Sarebbe possibile aprire il file index.html e mostrerebbe quello (solo che sarà INTERATTIVO…)
Il metodo che hai descritto sarebbe possibile tramite un plugin personalizzato, combinando sia un plugin in stile markdown-it che possibilmente un buon object storage per gli HTML. Tuttavia, sarei cauto riguardo alla sicurezza, lasciando che il codice inserito dall’utente venga eseguito ovunque sul server. Discourse fa già molto lavoro solo per sanificare un post per HTML e JS affinché vengano analizzati in modo sicuro nel backend.
Potresti avere più fortuna cercando invece di incorporare un interprete Python nel browser e lasciarlo eseguire il codice lato client, saltando l’intera creazione di HTML. JupyterLite ti permetterebbe di eseguire JupyterLab nel browser con interfaccia utente. Dalla documentazione, sembra che tu possa farlo eseguire automaticamente il codice alla creazione dell’iframe. Puoi fornire il codice con un plugin HighlightJS personalizzato che creerà un pulsante azionabile su qualsiasi blocco di codice Python, o farlo eseguire automaticamente.
Quindi qualcosa come:
L’utente vede un post con un blocco di codice Python.
L’utente passa il mouse sopra il blocco di codice, dove appare un pulsante per eseguire il codice nel browser.
L’utente fa clic sul pulsante, che crea un iframe per JupyterLite sotto il codice, importando il codice dal blocco di codice.
Poiché questo sarebbe solo un plugin HighlightJS che crea un iframe per JupyterLite, puoi crearlo interamente all’interno di un Componente Tema, senza bisogno di codice lato server.
Una cosa da notare: JupyterLite è descritto come non completo di funzionalità rispetto a JupyterLab, e non sono sicuro di come gestisca le importazioni di pacchetti, quindi potresti doverlo ospitare tu stesso. JupyterLite utilizza Pyodide, che supporta qualsiasi wheel su PyPI, quindi dovrebbe andare bene.
Penso che il rischio per la sicurezza non sia così grande nel caso in cui index.html venga eseguito lato client (nel browser dell’utente, non sul server Discourse).
Inoltre, il vantaggio dell’approccio mpld3 è che è un singolo file senza dipendenze. Se esegui Python puro, devi anche essere in grado di caricare tutte le dipendenze come file CSV, file di dati, ecc. che sono la fonte di ciò che vuoi rappresentare graficamente.
Detto questo, poter eseguire script Python puri all’interno di un post di Discourse sarebbe semplicemente favoloso!
Oh! Ho frainteso completamente come verrebbe generato l’HTML. Se l’utente sta pre-generando l’HTML, potresti farlo fare loro tramite iframe da un sito esterno, con il dominio nella whitelist.
Ad esempio, codepen, che dovrebbe essere consentito per impostazione predefinita:
<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>
Pensi che funzionerà con ipympl (altrimenti le figure non sono interattive, il che invalida l’intero scopo)?
Pensi che possa funzionare con una cartella di progetto sottostante in cui possiamo impostare la variabile d’ambiente PYTHONPATH prima di avviare Jupyter in modo che gli utenti possano importare funzioni e dipendenze dal progetto unito?
E sì, ho un budget se questo è ragionevole e fattibile e può essere contribuito come open source per l’intera community di Discourse.
@Alteras Grazie, questa soluzione è davvero semplice e funziona se riesci a trovare un modo per caricare il file “index.heml” su Discourse (che è facile abilitare il caricamento di .html) e servirlo nel codice iframe. L’unico problema è che in realtà non funziona… quando ci provo, scarica semplicemente index.html invece di renderizzarlo nell’iframe. Forse c’è un meta tag per dire all’iframe di mostrare il file invece di scaricarlo?
Ah, capisco. Discourse per impostazione predefinita imposta qualsiasi allegato non immagine con Content-Disposition come “attachment”, che lo tratterà solo come un download.
Potresti essere in grado di fare qualcosa di simile alle Anteprime PDF inline, che sembra gestire questo stesso problema, ma per i caricamenti di PDF.