33c745d997
I moved book_format.py to the root directory so that all of the notebooks do not need to modify the system path to import it. It modifies the path on import so that all of the code in ./code can then be accessed. Altered links to nbviewer to account for no longer using subdirectories.
80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
"""
|
|
IPython Notebook magic command for automatically numbering sections of a notebook "interactively"
|
|
|
|
Use:
|
|
%install_ext https://raw.github.com/dpsanders/ipython_extensions/master/section_numbering/secnum.py
|
|
|
|
once to install, and then
|
|
|
|
%load_ext secnum
|
|
%secnum
|
|
|
|
to get automatic section numbering, which is updated when any cell changes type.
|
|
(This could, of course, be more efficient.)
|
|
|
|
This is based, completely and shamelessly, on MinRK's `nbtoc` magic
|
|
<https://github.com/minrk/ipython_extensions>
|
|
|
|
Thanks also to:
|
|
- Clayton Davis, for a great explanation of HTML, CSS and JavaScript
|
|
- Brian Granger, for a crucial hint about extracting a JQuery object from a notebook cell object
|
|
- Fernando Perez, for an inspiring talk at SciPy 2013 (and, of course, for creating IPython)
|
|
|
|
"""
|
|
|
|
import io
|
|
import os
|
|
import urllib2
|
|
|
|
from IPython.display import display_html, display_javascript
|
|
|
|
here = os.path.abspath(os.path.dirname(__file__))
|
|
secnum_js = ""
|
|
|
|
def download(fname, redownload=False):
|
|
"""download a file
|
|
|
|
if redownload=False, the file will not be downloaded if it already exists.
|
|
"""
|
|
dest = os.path.join(here, fname)
|
|
if os.path.exists(dest) and not redownload:
|
|
return
|
|
url = 'https://raw.github.com/dpsanders/ipython_extensions/master/section_numbering/' + fname
|
|
print("Downloading %s to %s" % (url, dest))
|
|
|
|
filein = urllib2.urlopen(url)
|
|
fileout = open(dest, "wb")
|
|
chunk = filein.read(1024)
|
|
while chunk:
|
|
fileout.write(chunk)
|
|
chunk = filein.read(1024)
|
|
filein.close()
|
|
fileout.close()
|
|
|
|
def load_file(fname, redownload=False):
|
|
"""load global variable from a file"""
|
|
download(fname, redownload)
|
|
with io.open(os.path.join(here, fname)) as f:
|
|
globals()[fname.replace('.', '_')] = f.read()
|
|
|
|
|
|
load_file('secnum.js')
|
|
|
|
|
|
|
|
def secnum(line):
|
|
"""add a table of contents to an IPython Notebook"""
|
|
display_javascript(secnum_js, raw=True)
|
|
|
|
|
|
def update_secnum(line):
|
|
"""download the latest version of the nbtoc extension from GitHub"""
|
|
download('secnum.py', True)
|
|
download('secnum.js', True)
|
|
get_ipython().extension_manager.reload_extension("secnum")
|
|
|
|
def load_ipython_extension(ip):
|
|
ip.magics_manager.register_function(secnum)
|
|
ip.magics_manager.register_function(update_secnum)
|
|
|