Kalman-and-Bayesian-Filters.../code/secnum.py
Roger Labbe 33c745d997 Edits for reorg
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.
2015-01-27 15:14:06 -08:00

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)