Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions src/markdown_exec/_internal/formatters/pyodide.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@

from typing import TYPE_CHECKING, Any

import markdown_exec

if TYPE_CHECKING:
from markdown import Markdown

# All Ace.js themes listed here:
# https://github.com/ajaxorg/ace/tree/master/src/theme

_play_emoji = (
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8 5.14v14l11-7-11-7Z"></path></svg>'
)
_clear_emoji = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.14 3c-.51 0-1.02.2-1.41.59L2.59 14.73c-.78.77-.78 2.04 0 2.83L5.03 20h7.66l8.72-8.73c.79-.77.79-2.04 0-2.83l-4.85-4.85c-.39-.39-.91-.59-1.42-.59M17 18l-2 2h7v-2"></path></svg>'
_play_emoji = '<span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8 5.14v14l11-7-11-7Z"></path></svg></span> '
_clear_emoji = '<span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.14 3c-.51 0-1.02.2-1.41.59L2.59 14.73c-.78.77-.78 2.04 0 2.83L5.03 20h7.66l8.72-8.73c.79-.77.79-2.04 0-2.83l-4.85-4.85c-.39-.39-.91-.59-1.42-.59M17 18l-2 2h7v-2"></path></svg></span> '

_assets = """
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.16.0/ace.js"></script>
Expand All @@ -26,15 +26,17 @@
_template = """
<div class="pyodide">
<div class="pyodide-editor-bar">
<span class="pyodide-bar-item">Editor (session: %(session)s)</span><span id="%(id_prefix)srun" title="Run: press Ctrl-Enter" class="pyodide-bar-item pyodide-clickable"><span class="twemoji">%(play_emoji)s</span> Run</span>
<span class="pyodide-bar-item">Editor (session: %(session)s)</span><span id="%(id_prefix)srun" title="Run: press Ctrl-Enter" class="pyodide-bar-item pyodide-clickable">%(play_emoji)sRun</span>
</div>
<div><pre id="%(id_prefix)seditor" class="pyodide-editor">%(initial_code)s</pre></div>
<div class="pyodide-editor-bar">
<span class="pyodide-bar-item">Output</span><span id="%(id_prefix)sclear" class="pyodide-bar-item pyodide-clickable"><span class="twemoji">%(clear_emoji)s</span> Clear</span>
<span class="pyodide-bar-item">Output</span><span id="%(id_prefix)sclear" class="pyodide-bar-item pyodide-clickable">%(clear_emoji)sClear</span>
</div>
<pre><code id="%(id_prefix)soutput" class="pyodide-output"></code></pre>
</div>
"""

_script = """
<script>
document.addEventListener('DOMContentLoaded', (event) => {
setupPyodide(
Expand Down Expand Up @@ -83,19 +85,23 @@ def _format_pyodide(code: str, md: Markdown, session: str, extra: dict, **option
theme_light, theme_dark = theme.split(",")
min_lines, max_lines = _calculate_height(code, extra)

zensical = getattr(markdown_exec, "_caller", "") == "zensical"
data = {
"id_prefix": f"exec-{_counter}--",
"initial_code": code,
"install": install,
"theme_light": theme_light.strip(),
"theme_dark": theme_dark.strip(),
"session": session or "default",
"play_emoji": _play_emoji,
"clear_emoji": _clear_emoji,
"play_emoji": "" if zensical else _play_emoji,
"clear_emoji": "" if zensical else _clear_emoji,
"min_lines": min_lines,
"max_lines": max_lines,
}
rendered = _template % data
if exclude_assets:
rendered = _template
if not zensical:
rendered += _script
rendered %= data
if zensical or exclude_assets:
return rendered
return _assets.format(version=version) + rendered
Loading