diff --git a/.gitignore b/.gitignore index b455e33..45370ce 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ _build docs/man/*.gz docs/source/api/generated docs/gh-pages +IPython/frontend/html/notebook/static/mathjax *.py[co] build *.egg-info diff --git a/IPython/external/mathjax.py b/IPython/external/mathjax.py new file mode 100644 index 0000000..0cdf132 --- /dev/null +++ b/IPython/external/mathjax.py @@ -0,0 +1,82 @@ +"""Utility function for installing MathJax javascript library into +the notebook's 'static' directory, for offline use. + +Authors: + +* Min RK +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008-2011 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +import os +import shutil +import urllib2 +import tempfile +import tarfile + +from IPython.frontend.html import notebook as nbmod + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +def install_mathjax(tag='v1.1', replace=False): + """Download and install MathJax for offline use. + + This will install mathjax to the 'static' dir in the IPython notebook + package, so it will fail if the caller does not have write access + to that location. + + MathJax is a ~15MB download, and ~150MB installed. + + Parameters + ---------- + + replace : bool [False] + Whether to remove and replace an existing install. + tag : str ['v1.1'] + Which tag to download. Default is 'v1.1', the current stable release, + but alternatives include 'v1.1a' and 'master'. + """ + mathjax_url = "https://github.com/mathjax/MathJax/tarball/%s"%tag + + nbdir = os.path.dirname(os.path.abspath(nbmod.__file__)) + static = os.path.join(nbdir, 'static') + dest = os.path.join(static, 'mathjax') + + # check for existence and permissions + if not os.access(static, os.W_OK): + raise IOError("Need have write access to %s"%static) + if os.path.exists(dest): + if replace: + if not os.access(dest, os.W_OK): + raise IOError("Need have write access to %s"%dest) + print "removing previous MathJax install" + shutil.rmtree(dest) + else: + print "offline MathJax apparently already installed" + return + + # download mathjax + print "Downloading mathjax source..." + response = urllib2.urlopen(mathjax_url) + print "done" + # use 'r|gz' stream mode, because socket file-like objects can't seek: + tar = tarfile.open(fileobj=response.fp, mode='r|gz') + topdir = tar.firstmember.path + print "Extracting to %s"%dest + tar.extractall(static) + # it will be mathjax-MathJax-, rename to just mathjax + os.rename(os.path.join(static, topdir), dest) + + +__all__ = ['install_mathjax']