Skip to content

Instantly share code, notes, and snippets.

@minrk
Created October 4, 2012 22:32
Show Gist options
  • Select an option

  • Save minrk/3836889 to your computer and use it in GitHub Desktop.

Select an option

Save minrk/3836889 to your computer and use it in GitHub Desktop.

Revisions

  1. minrk created this gist Oct 4, 2012.
    172 changes: 172 additions & 0 deletions SWCDemo.ipynb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,172 @@
    {
    "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": {}
    }
    ]
    }
    152 changes: 152 additions & 0 deletions SWCDemo_scrub.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,152 @@
    {
    "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": {}
    }
    ]
    }
    44 changes: 44 additions & 0 deletions scrub_code.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    #!/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