Skip to content
2 changes: 2 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ Tag | Description
`remove-input` | Remove the code cell input/source from the rendered output.
`remove-output` | Remove the code cell output from the rendered output.
`remove-stderr` | Remove the code cell output stderr from the rendered output.
`scroll-output` or `output_scroll` | Make the cell output scrollable if it is too long.
Comment thread
jaladh-singhal marked this conversation as resolved.
Outdated
Comment thread
jaladh-singhal marked this conversation as resolved.
Outdated
`scroll-input` | Make the cell input scrollable if it is too long.

Additionally, for code execution, these tags are provided (via `nbclient`):

Expand Down
14 changes: 14 additions & 0 deletions myst_nb/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,20 @@ def __post_init__(self):
},
)

scroll_outputs: bool = dc.field(
default=False,
metadata={
"validator": instance_of(bool),
"help": "Make long cell outputs scrollable",
"sections": (
Section.global_lvl,
Section.file_lvl,
Section.cell_lvl,
Section.render,
),
},
)

code_prompt_show: str = dc.field(
default="Show code cell {type}",
metadata={
Expand Down
9 changes: 9 additions & 0 deletions myst_nb/core/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,15 @@ def render_nb_cell_code(self: SelfType, token: SyntaxTreeNode) -> None:
for tag in tags:
classes.append(f"tag_{tag.replace(' ', '_')}")

# set class for scrollable output
scroll_outputs = self.get_cell_level_config(
"scroll_outputs", token.meta["metadata"], line=cell_line
)
if scroll_outputs and not any( # don't override cell tags
tag in ["scroll-output", "output_scroll"] for tag in tags
):
classes.append("tag_output_scroll")

# TODO do we need this -/_ duplication of tag names, or can we deprecate one?
hide_cell = "hide-cell" in tags
remove_input = (
Expand Down
171 changes: 171 additions & 0 deletions tests/notebooks/scroll_outputs.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "356e9205",
"metadata": {},
"source": [
"# Scroll long outputs"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "cd1b32ee",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"short output\n",
"short output\n"
]
}
],
"source": [
"for i in range(2):\n",
" print(\"short output\")"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "91a31d3f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n",
"long output\n"
]
}
],
"source": [
"for i in range(100):\n",
" print(\"long output\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "myst-nb-py311",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
11 changes: 11 additions & 0 deletions tests/test_render_outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,14 @@ def test_hide_cell_content(sphinx_run, file_regression):
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("hide_cell_content")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")


@pytest.mark.sphinx_params(
"scroll_outputs.ipynb", conf={"nb_execution_mode": "off", "nb_scroll_outputs": True}
)
def test_scroll_outputs(sphinx_run, file_regression):
"""Test that scrollable outputs are rendered correctly."""
sphinx_run.build()
assert sphinx_run.warnings() == ""
doctree = sphinx_run.get_resolved_doctree("scroll_outputs")
file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8")
120 changes: 120 additions & 0 deletions tests/test_render_outputs/test_scroll_outputs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<document source="scroll_outputs">
<section ids="scroll-long-outputs" names="scroll\ long\ outputs">
<title>
Scroll long outputs
<container cell_index="1" cell_metadata="{}" classes="cell tag_output_scroll" exec_count="2" nb_element="cell_code">
<container classes="cell_input" nb_element="cell_code_source">
<literal_block language="ipython3" linenos="False" xml:space="preserve">
for i in range(2):
print("short output")
<container classes="cell_output" nb_element="cell_code_output">
<literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve">
short output
short output
<container cell_index="2" cell_metadata="{}" classes="cell tag_output_scroll" exec_count="1" nb_element="cell_code">
<container classes="cell_input" nb_element="cell_code_source">
<literal_block language="ipython3" linenos="False" xml:space="preserve">
for i in range(100):
print("long output")
<container classes="cell_output" nb_element="cell_code_output">
<literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve">
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output
long output