Skip to content

Instantly share code, notes, and snippets.

@minrk
Created October 4, 2012 22:32
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save minrk/3836889 to your computer and use it in GitHub Desktop.
Save minrk/3836889 to your computer and use it in GitHub Desktop.
Demo of hideable hints and scrubbing solutions from IPython notebooks
#!/usr/bin/env python
"""
simple example script for scrubping solution code cells from IPython notebooks
Usage: `scrub_code.py foo.ipynb [bar.ipynb [...]]`
Marked code cells are scrubbed from the notebook
"""
import io
import os
import sys
from IPython.nbformat.current import read, write
def scrub_code_cells(nb):
scrubbed = 0
cells = 0
for ws in nb.worksheets:
for cell in ws.cells:
if cell.cell_type != 'code':
continue
cells += 1
# scrub cells marked with initial '# Solution' comment
# any other marker will do, or it could be unconditional
if cell.input.startswith("# Solution"):
cell.input = u'# Solution goes here'
scrubbed += 1
cell.outputs = []
print
print "scrubbed %i/%i code cells from notebook %s" % (scrubbed, cells, nb.metadata.name)
if __name__ == '__main__':
for ipynb in sys.argv[1:]:
print "scrubbing %s" % ipynb
with io.open(ipynb, encoding='utf8') as f:
nb = read(f, 'json')
scrub_code_cells(nb)
base, ext = os.path.splitext(ipynb)
new_ipynb = "%s_scrub%s" % (base, ext)
with io.open(new_ipynb, 'w', encoding='utf8') as f:
write(nb, f, 'json')
print "wrote %s" % new_ipynb
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "SWCDemo"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Initial cell has buttons to show/hide all hint cells"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<script>\n",
" toggle_md_cell = function(divid) {\n",
" $(\"#\" + divid).parent().parent().toggle();\n",
" };\n",
" hide_all_hints = function() {\n",
" $(\"div.hint\").parent().parent().hide();\n",
" };\n",
" show_all_hints = function() {\n",
" $(\"div.hint\").parent().parent().show();\n",
" };\n",
"</script>\n",
"\n",
"<button onclick=\"show_all_hints();\">show hints</button> <button onclick=\"hide_all_hints();\">hide hints</button>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# this code cell isn't marked, so it survives\n",
"print \"Welcome to Software Carpentry!\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Welcome to Software Carpentry!\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Problem 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Click this button to reveal a hint: <button onclick=\"toggle_md_cell('hint1');\">hint</button>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## This is Hint # 1\n",
"\n",
"We mark each hint cell with an empty div:\n",
"\n",
" <div id=\"hint2\" class=\"hint\"></div>\n",
"\n",
"<div id=\"hint1\" class=\"hint\"></div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Solution 1\n",
"def solution_one():\n",
" print 'hi'\n",
"solution_one()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"hi\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Problem 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Click this button to reveal the next hint: <button onclick=\"toggle_md_cell('hint2');\">hint</button>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### This is Hint #2\n",
"\n",
"Here is how we are toggling hints:\n",
"\n",
" <button onclick=\"toggle_md_cell('hint2');\">toggle hint</button>\n",
"\n",
"<div id=\"hint2\" class=\"hint\"></div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Solution 2\n",
"print \"hello\", \"world\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"hello world\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*footer that hides all hints on load*\n",
"\n",
"Alternatively, one could add individual hides inside each hint cell,\n",
"but this is the simplest way to hide all of them on page load.\n",
"\n",
"<script>\n",
" hide_all_hints();\n",
"</script>"
]
}
],
"metadata": {}
}
]
}
{
"metadata": {
"name": "SWCDemo"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Initial cell has buttons to show/hide all hint cells"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<script>\n",
" toggle_md_cell = function(divid) {\n",
" $(\"#\" + divid).parent().parent().toggle();\n",
" };\n",
" hide_all_hints = function() {\n",
" $(\"div.hint\").parent().parent().hide();\n",
" };\n",
" show_all_hints = function() {\n",
" $(\"div.hint\").parent().parent().show();\n",
" };\n",
"</script>\n",
"\n",
"<button onclick=\"show_all_hints();\">show hints</button> <button onclick=\"hide_all_hints();\">hide hints</button>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# this code cell isn't marked, so it survives\n",
"print \"Welcome to Software Carpentry!\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Welcome to Software Carpentry!\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Problem 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Click this button to reveal a hint: <button onclick=\"toggle_md_cell('hint1');\">hint</button>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## This is Hint # 1\n",
"\n",
"We mark each hint cell with an empty div:\n",
"\n",
" <div id=\"hint2\" class=\"hint\"></div>\n",
"\n",
"<div id=\"hint1\" class=\"hint\"></div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Solution goes here"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Problem 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Click this button to reveal the next hint: <button onclick=\"toggle_md_cell('hint2');\">hint</button>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### This is Hint #2\n",
"\n",
"Here is how we are toggling hints:\n",
"\n",
" <button onclick=\"toggle_md_cell('hint2');\">toggle hint</button>\n",
"\n",
"<div id=\"hint2\" class=\"hint\"></div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Solution goes here"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*footer that hides all hints on load*\n",
"\n",
"Alternatively, one could add individual hides inside each hint cell,\n",
"but this is the simplest way to hide all of them on page load.\n",
"\n",
"<script>\n",
" hide_all_hints();\n",
"</script>"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment