أعلم أن هذا خارج نطاق معظم المجتمعات، لكننا مجتمع علمي، نستخدم بايثون والكثير من الرسوم البيانية (Matplotlib) التي نشاركها مع بعضنا البعض عبر Discourse.
سيكون من المذهل أن نتمكن من مشاركة رسم بياني تفاعلي بدلاً من صورة jpg/png ثابتة.
ضع في اعتبارك هذا المثال:
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()
ستتمكن من فتح ملف index.html وسيعرض ذلك (فقط أنه سيكون تفاعليًا…)
قد تكون الطريقة التي وصفتها ممكنة عبر إضافة مخصصة، تجمع بين إضافة بأسلوب markdown-it وتخزين كائنات جيد لملفات HTML. ومع ذلك، سأكون حذرًا بشأن أمانها، والسماح بتشغيل التعليمات البرمجية التي أدخلها المستخدم في أي مكان على الخادم. يقوم Discourse بالفعل بالكثير من العمل لمجرد تنقية منشور لـ HTML و JS ليتم تحليله بأمان في الواجهة الخلفية.
قد يكون لديك حظ أفضل بدلاً من ذلك في محاولة تضمين مترجم Python في المتصفح والسماح له بتشغيل التعليمات البرمجية على العميل، وتخطي إنشاء HTML بالكامل. سيسمح لك JupyterLite بتشغيل JupyterLab في المتصفح مع واجهة مستخدم. من الوثائق، يبدو أنه يمكنك تشغيل التعليمات البرمجية تلقائيًا عند إنشاء الإطار المضمن. يمكنك تغذية التعليمات البرمجية باستخدام إضافة HighlightJS مخصصة ستنشئ زرًا قابلاً للتنفيذ على أي كتلة تعليمات برمجية Python، أو تجعلها تعمل تلقائيًا.
لذا شيء مثل:
يرى المستخدم منشورًا يحتوي على كتلة تعليمات برمجية Python.
يقوم المستخدم بتمرير مؤشر الماوس فوق كتلة التعليمات البرمجية، حيث يظهر زر للسماح لهم بتشغيل التعليمات البرمجية في المتصفح.
ينقر المستخدم على الزر، والذي ينشئ إطارًا مضمنًا لـ JupyterLite أسفل التعليمات البرمجية، ويستورد التعليمات البرمجية من كتلة التعليمات البرمجية.
نظرًا لأن هذا سيكون مجرد إضافة HighlightJS تنشئ إطارًا مضمنًا لـ JupyterLite، يمكنك إنشاء كل شيء داخل مكون سمة، ولا يلزم وجود تعليمات برمجية للخادم.
شيء واحد يجب ملاحظته: يوصف JupyterLite بأنه ليس مكتمل الميزات مثل JupyterLab، ولا أعرف كيف يتعامل مع استيراد الحزم، لذلك قد تضطر إلى استضافته بنفسك. يستخدم JupyterLite Pyodide، والذي يدعم أي عجلة على PyPI، لذلك يجب أن يكون جيدًا.
أعتقد أن المخاطر الأمنية ليست كبيرة في حال تشغيل index.html على جانب العميل (في متصفح المستخدم، وليس على خادم Discourse).
أيضًا، الميزة في نهج mpld3 هي أنه ملف واحد بدون تبعيات. إذا كنت تشغل Python خام، فيجب عليك أيضًا أن تكون قادرًا على تحميل جميع التبعيات مثل ملفات csv، وملفات البيانات، وما إلى ذلك، والتي هي مصدر ما تريد رسمه.
ومع ذلك، فإن القدرة على تشغيل نصوص Python خام داخل منشور Discourse ستكون رائعة!
أوه! لقد أسأت فهم كيفية إنشاء HTML تمامًا. إذا كان المستخدم يقوم بإنشاء HTML مسبقًا، فيمكنك جعله يقوم بتضمينه (iframe) من موقع خارجي، مع إدراج النطاق في القائمة البيضاء.
على سبيل المثال، codepen، والذي يجب السماح به افتراضيًا:
<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>
هل تعتقد أنه سيعمل مع ipympl (وإلا فإن الأشكال ليست تفاعلية، مما يبطل الغرض بأكمله)
هل تعتقد أنه يمكن أن يعمل مع مجلد مشروع أساسي حيث يمكننا تعيين متغير البيئة PYTHONPATH قبل تشغيل Jupyter حتى يتمكن المستخدمون من استيراد الوظائف والتبعيات من المشروع المشترك؟
ونعم، لدي ميزانية إذا كان هذا معقولاً وعمليًا ويمكن المساهمة به كمصدر مفتوح لمجتمع Discourse بأكمله.
@Alteras شكراً لك، هذا الحل بسيط للغاية ويعمل إذا تمكنت من إيجاد طريقة لتحميل ملف “index.heml” إلى Discourse (والذي يسهل تمكين تحميل .html) وتقديمه في كود iframe. المشكلة الوحيدة هي أنه لا يعمل فعليًا.. عندما أحاول ذلك، يقوم فقط بتنزيل index.html بدلاً من عرضه في iframe. ربما هناك علامة meta لإخبار iframe بعرض الملف بدلاً من تنزيله؟