diff --git a/.gitignore b/.gitignore index 1611f4e..276a34c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,16 @@ -custom.js -custom.css +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Sphinx documentation +docs/_build/ + +.idea diff --git a/COPYING.rst b/COPYING.rst index 8d27461..decd8bd 100644 --- a/COPYING.rst +++ b/COPYING.rst @@ -5,7 +5,7 @@ IPython-contrib is licensed under the terms of the Modified BSD License (also known as New or Revised or 3-Clause BSD), as follows: -- Copyright (c) 2013-2014, IPython-contrib Developers +- Copyright (c) 2013-2015, IPython-contrib Developers All rights reserved. diff --git a/README.md b/README.md index ed9fc64..a8833a2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -Jupyter notebook extensions master branch +Jupyter notebook extensions =========================== This repository contains a collection of extensions that add functionality to the Jupyter notebook. These extensions are mostly written in Javascript and will be loaded locally in your Browser. -The IPython-contrib repository is maintained independently by a group of users and developers and not officially related to the IPython development team. +The IPython-contrib repository is maintained independently by a group of users and developers and not officially related + to the IPython development team. The maturity of the provided extensions may vary, please create an issue if you encounter any problems. @@ -20,19 +21,20 @@ IPython/Jupyter version support There are different branches of the notebook extensions in this repository. Please make sure you use the branch corresponding to your IPython/Jupyter version. -Overview -=========================== -The repository is organized in different categories: - -| Name | Description | -|------------|-------------| -| [usability](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki#usability) | Additional functionality for the notebook | -| [publishing](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki#publishing) | Getting your notebooks out in the wild | -| [styling](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki#styling) | Styling schemes for different looks of the notebook | -| [slidemode](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki#slidemode) | Slideshow creation | -| [testing](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki#testing) | Extensions in a early stage | - Documentation ============= -The extensions are documented in the Wiki. Please take a look [here](https://github.com/ipython-contrib/IPython-notebook-extensions/wiki) +Some extensions are not documented. We encourage you to add documentation for them. + +All extensions that are maintained and active have a markdown readme file for documentation and a yaml file to + allow them being configured using the 'nbextensions' server extension. + +Installation +============ + +The simple case: You want to install the extensions as local user. Then, simply run `setup.py install` or install +the conda package. The conda package can also be built by running `conda build IPython-notebook-extensions`, +and then doing a `conda install nbextensions`. + +For more complex installation scenarios, please look up the documentation for installing notebook extensions, +server extensions, pre/postprocessors, and templates at the Jupyter homepage http://www.jupyter.org diff --git a/bld.bat b/bld.bat new file mode 100644 index 0000000..c40a9bb --- /dev/null +++ b/bld.bat @@ -0,0 +1,2 @@ +"%PYTHON%" setup.py install +if errorlevel 1 exit 1 diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..762d43b --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +python setup.py install diff --git a/config/ipython_notebook_config.py b/config/ipython_notebook_config.py deleted file mode 100644 index ad877e9..0000000 --- a/config/ipython_notebook_config.py +++ /dev/null @@ -1,18 +0,0 @@ -# Configuration file for ipython-notebook. - -from IPython.utils.path import get_ipython_dir -import os -import sys - -ipythondir = get_ipython_dir() -extensions = os.path.join(ipythondir,'extensions') -sys.path.append( extensions ) - -c = get_config() -c.NotebookApp.open_browser = False -#c.IPKernelApp.ip = '127.0.0.1' -#c.FileNotebookManager.notebook_dir = 'i:\\notebook' - -c.NotebookApp.server_extensions = [ 'nbextensions' ] -c.NotebookApp.extra_template_paths = [os.path.join(ipythondir,'templates') ] - diff --git a/custom.example.js b/custom.example.js deleted file mode 100644 index c0852f0..0000000 --- a/custom.example.js +++ /dev/null @@ -1,58 +0,0 @@ -// Example for custom.js - -// we want strict javascript that fails on ambiguous syntax -"use strict"; - -// activate extensions only after Notebook is initialized -require(["base/js/events"], function (events) { - events.on("app_initialized.NotebookApp", function () { - /* - * all exentensions from IPython-notebook-extensions, uncomment to activate - */ - - // PUBLISHING -// IPython.load_extensions('publishing/nbviewer_theme/main') -// IPython.load_extensions('publishing/gist_it') -// IPython.load_extensions('publishing/nbconvert_button') -// IPython.load_extensions('publishing/printview/main') -// IPython.load_extensions('publishing/printviewmenu_button') - - // SLIDEMODE -// IPython.load_extensions('slidemode/main') - - - // STYLING -// IPython.load_extensions('styling/css_selector/main') - - // TESTING -// IPython.load_extensions('testing/hierarchical_collapse/main') - - // USABILITY -// IPython.load_extensions('usability/aspell/ipy-aspell') -// IPython.load_extensions('usability/codefolding/main') -// IPython.load_extensions('usability/dragdrop/drag-and-drop') -// IPython.load_extensions('usability/runtools/main') -// IPython.load_extensions('usability/chrome_clipboard/main') -// IPython.load_extensions('usability/navigation-hotkeys/main') -// IPython.load_extensions('usability/toggle_all_line_number') -// IPython.load_extensions('usability/help_panel/help_panel') -// IPython.load_extensions('usability/hide_input/main') -// IPython.load_extensions('usability/split-combine') -// IPython.load_extensions('usability/read-only') -// IPython.load_extensions('usability/init_cell/main') -// IPython.load_extensions('usability/limit_output/main') -// IPython.load_extensions('usability/autosavetime') -// IPython.load_extensions('usability/autoscroll') -// IPython.load_extensions('usability/breakpoints') -// IPython.load_extensions('usability/clean_start') -// IPython.load_extensions('usability/comment-uncomment') -// IPython.load_extensions('usability/linenumbers') -// IPython.load_extensions('usability/no_exec_dunder') -// IPython.load_extensions('usability/noscroll') -// IPython.load_extensions('usability/hide_io_selected') -// IPython.load_extensions('usability/execute_time/ExecuteTime') -// IPython.load_extensions('usability/python-markdown/main') - - }); -}); - diff --git a/usability/aspell/ipy-aspell-server.py b/extensions/ipy-aspell-server.py similarity index 100% rename from usability/aspell/ipy-aspell-server.py rename to extensions/ipy-aspell-server.py diff --git a/config/nbextensions.py b/extensions/nbextensions.py similarity index 94% rename from config/nbextensions.py rename to extensions/nbextensions.py index a8176d9..a28e561 100644 --- a/config/nbextensions.py +++ b/extensions/nbextensions.py @@ -15,7 +15,7 @@ import json jupyterdir = jupyter_data_dir() nbextension_dirs = (get_nbext_dir(), os.path.join(jupyterdir, 'nbextensions')) -exclude = [ 'mathjax' ] +exclude = ['mathjax'] class NBExtensionHandler(IPythonHandler): @@ -83,8 +83,8 @@ class NBExtensionHandler(IPythonHandler): extension_list_json = json.dumps(extension_list) self.write(self.render_template( 'nbextensions.html', - base_url = self.base_url, - extension_list = extension_list_json, + base_url=self.base_url, + extension_list=extension_list_json, page_title="Notebook Extension Configuration" )) @@ -94,9 +94,9 @@ class RenderExtensionHandler(IPythonHandler): @web.authenticated def get(self, path): self.write(self.render_template('rendermd.html', - base_url = self.base_url, - render_url = path, - page_title = path, + base_url=self.base_url, + render_url=path, + page_title=path, ) ) diff --git a/extensions/post_htmlembed.py b/extensions/post_htmlembed.py new file mode 100644 index 0000000..c183eca --- /dev/null +++ b/extensions/post_htmlembed.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +"""PostProcessor for embedding markdown images in HTML files.""" +from __future__ import print_function + +import os +import re +import base64 +import requests + +from traitlets import Bool, Unicode, Int +from nbconvert.postprocessors.base import PostProcessorBase + + +class EmbedPostProcessor(PostProcessorBase): + """ Post processor designed to embed images in markdown cells as base64 encoded blob in HTML file """ + + def replfunc(self, match): + """ replace source url or file link with base64 encoded blob """ + url = match.group(1) + imgformat = url.split('.')[-1] + if url.startswith('http'): + data = request.get(url) + elif url.startswith('data'): + img = '' + return img + else: + with open(url, 'rb') as f: + data = f.read() + + self.log.info("embedding url: %s, format: %s" % (url, imgformat)) + b64_data=base64.b64encode(data).decode("utf-8") + if imgformat == "svg": + img = '' + elif imgformat == "pdf": + img = '' + else: + img = '' + return img + + def postprocess(self, input): + if self.config.export_format == "html": + regex = re.compile('') + ext = input.split('.')[-1] + output=input[0:-(len(ext)+1)] + '-embedded.' + ext + with open(input) as fin, open(output,'w') as fout: + for line in fin: + fout.write(regex.sub(self.replfunc,line)) + fin.close() + fout.close() diff --git a/usability/codefolding/codefolding.py b/extensions/pre_codefolding.py similarity index 100% rename from usability/codefolding/codefolding.py rename to extensions/pre_codefolding.py diff --git a/usability/python-markdown/pymdpreprocessor.py b/extensions/pre_pymarkdown.py similarity index 100% rename from usability/python-markdown/pymdpreprocessor.py rename to extensions/pre_pymarkdown.py diff --git a/jupyter_nbconvert_config.py b/jupyter_nbconvert_config.py new file mode 100644 index 0000000..69ac5cc --- /dev/null +++ b/jupyter_nbconvert_config.py @@ -0,0 +1,9 @@ +from jupyter_core.paths import jupyter_config_dir, jupyter_data_dir +import os +import sys + +sys.path.append(os.path.join(jupyter_data_dir(), 'extensions')) + +c = get_config() +c.Exporter.template_path = [os.path.join(jupyter_data_dir(), 'templates') ] + diff --git a/jupyter_notebook_config.py b/jupyter_notebook_config.py new file mode 100644 index 0000000..4eec9b1 --- /dev/null +++ b/jupyter_notebook_config.py @@ -0,0 +1,9 @@ +from jupyter_core.paths import jupyter_config_dir, jupyter_data_dir +import os +import sys + +sys.path.append(os.path.join(jupyter_data_dir(), 'extensions')) + +c = get_config() +c.NotebookApp.extra_template_paths = [os.path.join(jupyter_data_dir(),'templates') ] + diff --git a/meta.yaml b/meta.yaml new file mode 100644 index 0000000..d6d7583 --- /dev/null +++ b/meta.yaml @@ -0,0 +1,38 @@ +package: + name: nbextensions + version: "master" + +source: + git_url: https://github.com/ipython-contrib/IPython-notebook-extensions + git_tag: master + +build: + script: python setup.py install + +requirements: + build: + - ipython >=4 + - jupyter_client + - jupyter_core + - notebook + - nbconvert + - nbformat + - python + - traitlets + + run: + - ipython >=4 + - jupyter_client + - jupyter_core + - notebook + - nbconvert + - nbformat + - python + - traitlets + - yaml + +about: + home: https://github.com/ipython-contrib/IPython-notebook-extensions + license: Modified BSD License + summary: 'Notebook extensions for the Jupyter/IPython notebook' + diff --git a/config/config_menu/config_menu.yaml b/nbextensions/config/config_menu/config_menu.yaml similarity index 100% rename from config/config_menu/config_menu.yaml rename to nbextensions/config/config_menu/config_menu.yaml diff --git a/config/config_menu/icon.png b/nbextensions/config/config_menu/icon.png similarity index 100% rename from config/config_menu/icon.png rename to nbextensions/config/config_menu/icon.png diff --git a/config/config_menu/main.js b/nbextensions/config/config_menu/main.js similarity index 100% rename from config/config_menu/main.js rename to nbextensions/config/config_menu/main.js diff --git a/config/main.css b/nbextensions/config/main.css similarity index 100% rename from config/main.css rename to nbextensions/config/main.css diff --git a/config/main.js b/nbextensions/config/main.js similarity index 98% rename from config/main.js rename to nbextensions/config/main.js index 9545b43..5e5e85b 100644 --- a/config/main.js +++ b/nbextensions/config/main.js @@ -388,9 +388,11 @@ require([ // Activate/Deactivate buttons build_activate_buttons(ext_id).appendTo(col_left); var ext_url = get_ext_url(extension); + var active = false; + if (config.data.hasOwnProperty('load_extensions')) active = config.data.load_extensions[ext_url] === true set_buttons_active( ext_id, - config.data.load_extensions[ext_url] === true + active ); if (!extension.hasOwnProperty('Parameters')) continue; diff --git a/config/readme.md b/nbextensions/config/readme.md similarity index 62% rename from config/readme.md rename to nbextensions/config/readme.md index a47c332..4197ffe 100644 --- a/config/readme.md +++ b/nbextensions/config/readme.md @@ -7,6 +7,38 @@ Activating an extension means it is loaded automatically when working with a not If you encounter problems with this page, please create an issue at the [ipython-contrib](https://github.com/ipython-contrib/IPython-notebook-extensions) repository. +The documentation below is something you probably don't need to know, if you installed the conda package. +If not, good luck! + +## Now where in the world did everything go ? +Jupyter/IPython 4.x works differently than IPython 3.x. + +In short +---- +* The notebook was split from IPython. You need to install both to run the notebook with IPython now. The easiest way is to use Anaconda and do a `conda install jupyter` +* There are no profiles anymore. You can specify environment variables to change the default, see [Jupyter ML](https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/jupyter/7q02jjksvFU)]. +* The configuration has moved to a new place. To find out where, see below. +* There is a kind of automatic upgrade of the configuration files from IPython 3.x to Jupyter. + +## So where can I find things now? +To find where the configuration files are, start IPython +```Python +from __future__ import print_function +from jupyter_core.paths import jupyter_config_dir, jupyter_config_path +print(jupyter_config_dir()) +print(jupyter_config_path()) +``` +`jupyter_config_dir()` shows you where your *local* configuration files are, `jupyter_config_path` shows you where Jupyter will look for configuration files. For the notebook, there are two files that will be used: +`jupyter_notebook_config.py` and `jupyter_notebook_config.json`. + +The `nbextension` directory has moved to a different location and can be found in one of these directories: +```Python +from __future__ import print_function +from jupyter_core.paths import jupyter_data_dir, jupyter_path +print(jupyter_data_dir()) +print(jupyter_path()) +``` + ## Checking/loading notebook extension manually from IPython You can check if the directory or a file (or list of files) exists: ```Python diff --git a/config/render.js b/nbextensions/config/render.js similarity index 100% rename from config/render.js rename to nbextensions/config/render.js diff --git a/publishing/gist_it.js b/nbextensions/publishing/gist_it.js similarity index 100% rename from publishing/gist_it.js rename to nbextensions/publishing/gist_it.js diff --git a/publishing/htmltools/js_highlight.py b/nbextensions/publishing/htmltools/js_highlight.py similarity index 100% rename from publishing/htmltools/js_highlight.py rename to nbextensions/publishing/htmltools/js_highlight.py diff --git a/publishing/nbconvert_button.js b/nbextensions/publishing/nbconvert_button.js similarity index 100% rename from publishing/nbconvert_button.js rename to nbextensions/publishing/nbconvert_button.js diff --git a/publishing/nbviewer_theme/css/compact.css b/nbextensions/publishing/nbviewer_theme/css/compact.css similarity index 100% rename from publishing/nbviewer_theme/css/compact.css rename to nbextensions/publishing/nbviewer_theme/css/compact.css diff --git a/publishing/nbviewer_theme/css/dark.css b/nbextensions/publishing/nbviewer_theme/css/dark.css similarity index 100% rename from publishing/nbviewer_theme/css/dark.css rename to nbextensions/publishing/nbviewer_theme/css/dark.css diff --git a/publishing/nbviewer_theme/css/duck.css b/nbextensions/publishing/nbviewer_theme/css/duck.css similarity index 100% rename from publishing/nbviewer_theme/css/duck.css rename to nbextensions/publishing/nbviewer_theme/css/duck.css diff --git a/publishing/nbviewer_theme/main.js b/nbextensions/publishing/nbviewer_theme/main.js similarity index 100% rename from publishing/nbviewer_theme/main.js rename to nbextensions/publishing/nbviewer_theme/main.js diff --git a/publishing/printview/icon.png b/nbextensions/publishing/printview/icon.png similarity index 100% rename from publishing/printview/icon.png rename to nbextensions/publishing/printview/icon.png diff --git a/publishing/printview/main.js b/nbextensions/publishing/printview/main.js similarity index 100% rename from publishing/printview/main.js rename to nbextensions/publishing/printview/main.js diff --git a/publishing/printview/printview.yaml b/nbextensions/publishing/printview/printview.yaml similarity index 100% rename from publishing/printview/printview.yaml rename to nbextensions/publishing/printview/printview.yaml diff --git a/publishing/printviewmenu_button.js b/nbextensions/publishing/printviewmenu_button.js similarity index 100% rename from publishing/printviewmenu_button.js rename to nbextensions/publishing/printviewmenu_button.js diff --git a/slidemode/README.md b/nbextensions/slidemode/README.md similarity index 100% rename from slidemode/README.md rename to nbextensions/slidemode/README.md diff --git a/slidemode/main.css b/nbextensions/slidemode/main.css similarity index 100% rename from slidemode/main.css rename to nbextensions/slidemode/main.css diff --git a/slidemode/main.js b/nbextensions/slidemode/main.js similarity index 100% rename from slidemode/main.js rename to nbextensions/slidemode/main.js diff --git a/styling/css_selector/css/compact.css b/nbextensions/styling/css_selector/css/compact.css similarity index 100% rename from styling/css_selector/css/compact.css rename to nbextensions/styling/css_selector/css/compact.css diff --git a/styling/css_selector/css/dark.css b/nbextensions/styling/css_selector/css/dark.css similarity index 100% rename from styling/css_selector/css/dark.css rename to nbextensions/styling/css_selector/css/dark.css diff --git a/styling/css_selector/css/duck.css b/nbextensions/styling/css_selector/css/duck.css similarity index 100% rename from styling/css_selector/css/duck.css rename to nbextensions/styling/css_selector/css/duck.css diff --git a/styling/css_selector/css/xkcd.css b/nbextensions/styling/css_selector/css/xkcd.css similarity index 100% rename from styling/css_selector/css/xkcd.css rename to nbextensions/styling/css_selector/css/xkcd.css diff --git a/styling/css_selector/main.js b/nbextensions/styling/css_selector/main.js similarity index 100% rename from styling/css_selector/main.js rename to nbextensions/styling/css_selector/main.js diff --git a/styling/zenmode/images/back1.jpg b/nbextensions/styling/zenmode/images/back1.jpg similarity index 100% rename from styling/zenmode/images/back1.jpg rename to nbextensions/styling/zenmode/images/back1.jpg diff --git a/styling/zenmode/images/back11.jpg b/nbextensions/styling/zenmode/images/back11.jpg similarity index 100% rename from styling/zenmode/images/back11.jpg rename to nbextensions/styling/zenmode/images/back11.jpg diff --git a/styling/zenmode/images/back12.jpg b/nbextensions/styling/zenmode/images/back12.jpg similarity index 100% rename from styling/zenmode/images/back12.jpg rename to nbextensions/styling/zenmode/images/back12.jpg diff --git a/styling/zenmode/images/back2.jpg b/nbextensions/styling/zenmode/images/back2.jpg similarity index 100% rename from styling/zenmode/images/back2.jpg rename to nbextensions/styling/zenmode/images/back2.jpg diff --git a/styling/zenmode/images/back21.jpg b/nbextensions/styling/zenmode/images/back21.jpg similarity index 100% rename from styling/zenmode/images/back21.jpg rename to nbextensions/styling/zenmode/images/back21.jpg diff --git a/styling/zenmode/images/back22.jpg b/nbextensions/styling/zenmode/images/back22.jpg similarity index 100% rename from styling/zenmode/images/back22.jpg rename to nbextensions/styling/zenmode/images/back22.jpg diff --git a/styling/zenmode/images/back3.jpg b/nbextensions/styling/zenmode/images/back3.jpg similarity index 100% rename from styling/zenmode/images/back3.jpg rename to nbextensions/styling/zenmode/images/back3.jpg diff --git a/styling/zenmode/images/ipynblogo0.png b/nbextensions/styling/zenmode/images/ipynblogo0.png similarity index 100% rename from styling/zenmode/images/ipynblogo0.png rename to nbextensions/styling/zenmode/images/ipynblogo0.png diff --git a/styling/zenmode/images/ipynblogo1.png b/nbextensions/styling/zenmode/images/ipynblogo1.png similarity index 100% rename from styling/zenmode/images/ipynblogo1.png rename to nbextensions/styling/zenmode/images/ipynblogo1.png diff --git a/styling/zenmode/main.css b/nbextensions/styling/zenmode/main.css similarity index 100% rename from styling/zenmode/main.css rename to nbextensions/styling/zenmode/main.css diff --git a/styling/zenmode/main.js b/nbextensions/styling/zenmode/main.js similarity index 100% rename from styling/zenmode/main.js rename to nbextensions/styling/zenmode/main.js diff --git a/styling/zenmode/zenmode.yaml b/nbextensions/styling/zenmode/zenmode.yaml similarity index 100% rename from styling/zenmode/zenmode.yaml rename to nbextensions/styling/zenmode/zenmode.yaml diff --git a/testing/cellstate.js b/nbextensions/testing/cellstate.js similarity index 100% rename from testing/cellstate.js rename to nbextensions/testing/cellstate.js diff --git a/testing/hierarchical_collapse/hierarchical_collapse.tpl b/nbextensions/testing/hierarchical_collapse/hierarchical_collapse.tpl similarity index 100% rename from testing/hierarchical_collapse/hierarchical_collapse.tpl rename to nbextensions/testing/hierarchical_collapse/hierarchical_collapse.tpl diff --git a/testing/hierarchical_collapse/hierarchical_collapse_preprocessor.py b/nbextensions/testing/hierarchical_collapse/hierarchical_collapse_preprocessor.py similarity index 100% rename from testing/hierarchical_collapse/hierarchical_collapse_preprocessor.py rename to nbextensions/testing/hierarchical_collapse/hierarchical_collapse_preprocessor.py diff --git a/testing/hierarchical_collapse/ipython_nbconvert_config.py b/nbextensions/testing/hierarchical_collapse/ipython_nbconvert_config.py similarity index 100% rename from testing/hierarchical_collapse/ipython_nbconvert_config.py rename to nbextensions/testing/hierarchical_collapse/ipython_nbconvert_config.py diff --git a/testing/hierarchical_collapse/main.css b/nbextensions/testing/hierarchical_collapse/main.css similarity index 100% rename from testing/hierarchical_collapse/main.css rename to nbextensions/testing/hierarchical_collapse/main.css diff --git a/testing/hierarchical_collapse/main.js b/nbextensions/testing/hierarchical_collapse/main.js similarity index 100% rename from testing/hierarchical_collapse/main.js rename to nbextensions/testing/hierarchical_collapse/main.js diff --git a/testing/history/history.js b/nbextensions/testing/history/history.js similarity index 100% rename from testing/history/history.js rename to nbextensions/testing/history/history.js diff --git a/testing/history/ipy_nb_history_websocket.py b/nbextensions/testing/history/ipy_nb_history_websocket.py similarity index 100% rename from testing/history/ipy_nb_history_websocket.py rename to nbextensions/testing/history/ipy_nb_history_websocket.py diff --git a/testing/swc/main.js b/nbextensions/testing/swc/main.js similarity index 100% rename from testing/swc/main.js rename to nbextensions/testing/swc/main.js diff --git a/nbextensions/usability/aspell/ipy-aspell-server.py b/nbextensions/usability/aspell/ipy-aspell-server.py new file mode 100644 index 0000000..7bc3fd7 --- /dev/null +++ b/nbextensions/usability/aspell/ipy-aspell-server.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +# Copyright (C) 2013 + +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. + +@author: juhasch +""" + +""" +Tornado web server to + push value received from Pyzmq pull messages + to web browser using a webscocket connection +""" + +import time +import os.path + +import tornado.web +import tornado.websocket +import tornado.ioloop + +import random +import json +import aspell + +from zmq.eventloop import ioloop, zmqstream + +webport = 8989 # port address for web client + +s = aspell.Speller('lang', 'en') + +GLOBALS={ + 'sockets': [] +} + +class WebSocketHandler(tornado.websocket.WebSocketHandler): + def open(self): + print "open socket" + GLOBALS['sockets'].append(self) + + def on_close(self): + print "on_close" + GLOBALS['sockets'].remove(self) + + def on_message(self, message): + x=json.loads(message) + text = x['text'] + reply = s.check(text) + # reply to request: + # check 1 for OK, 0 for not a valid word + # id cell_id + # line codemirror line number + # start codemirror start position of word + # stop codemirror end position of word + reply = {"check": reply, "id" : x['id'], "line": x['line'], + "start" : x['start'], "end": x['end'] } + self.write_message(reply) + +application = tornado.web.Application([ + (r"/websocket", WebSocketHandler), +]) + +if __name__ == "__main__": + ioloop.install() + + application.listen(webport) + main_loop = tornado.ioloop.IOLoop.instance() + main_loop.start() + print "Running" diff --git a/usability/aspell/ipy-aspell.css b/nbextensions/usability/aspell/ipy-aspell.css similarity index 100% rename from usability/aspell/ipy-aspell.css rename to nbextensions/usability/aspell/ipy-aspell.css diff --git a/usability/aspell/ipy-aspell.js b/nbextensions/usability/aspell/ipy-aspell.js similarity index 100% rename from usability/aspell/ipy-aspell.js rename to nbextensions/usability/aspell/ipy-aspell.js diff --git a/usability/autosavetime.js b/nbextensions/usability/autosavetime.js similarity index 100% rename from usability/autosavetime.js rename to nbextensions/usability/autosavetime.js diff --git a/usability/autoscroll.js b/nbextensions/usability/autoscroll.js similarity index 100% rename from usability/autoscroll.js rename to nbextensions/usability/autoscroll.js diff --git a/usability/breakpoints.js b/nbextensions/usability/breakpoints.js similarity index 100% rename from usability/breakpoints.js rename to nbextensions/usability/breakpoints.js diff --git a/usability/chrome-clipboard/chrome-clipboard.yaml b/nbextensions/usability/chrome-clipboard/chrome-clipboard.yaml similarity index 100% rename from usability/chrome-clipboard/chrome-clipboard.yaml rename to nbextensions/usability/chrome-clipboard/chrome-clipboard.yaml diff --git a/usability/chrome-clipboard/chrome.png b/nbextensions/usability/chrome-clipboard/chrome.png similarity index 100% rename from usability/chrome-clipboard/chrome.png rename to nbextensions/usability/chrome-clipboard/chrome.png diff --git a/usability/chrome-clipboard/main.js b/nbextensions/usability/chrome-clipboard/main.js similarity index 100% rename from usability/chrome-clipboard/main.js rename to nbextensions/usability/chrome-clipboard/main.js diff --git a/usability/chrome-clipboard/readme.md b/nbextensions/usability/chrome-clipboard/readme.md similarity index 100% rename from usability/chrome-clipboard/readme.md rename to nbextensions/usability/chrome-clipboard/readme.md diff --git a/usability/clean_start.js b/nbextensions/usability/clean_start.js similarity index 100% rename from usability/clean_start.js rename to nbextensions/usability/clean_start.js diff --git a/usability/codefolding/codefolding.yaml b/nbextensions/usability/codefolding/codefolding.yaml similarity index 100% rename from usability/codefolding/codefolding.yaml rename to nbextensions/usability/codefolding/codefolding.yaml diff --git a/usability/codefolding/firstline-fold.js b/nbextensions/usability/codefolding/firstline-fold.js similarity index 100% rename from usability/codefolding/firstline-fold.js rename to nbextensions/usability/codefolding/firstline-fold.js diff --git a/usability/codefolding/foldgutter.css b/nbextensions/usability/codefolding/foldgutter.css similarity index 100% rename from usability/codefolding/foldgutter.css rename to nbextensions/usability/codefolding/foldgutter.css diff --git a/usability/codefolding/icon.png b/nbextensions/usability/codefolding/icon.png similarity index 100% rename from usability/codefolding/icon.png rename to nbextensions/usability/codefolding/icon.png diff --git a/usability/codefolding/magic-fold.js b/nbextensions/usability/codefolding/magic-fold.js similarity index 100% rename from usability/codefolding/magic-fold.js rename to nbextensions/usability/codefolding/magic-fold.js diff --git a/usability/codefolding/main.js b/nbextensions/usability/codefolding/main.js similarity index 81% rename from usability/codefolding/main.js rename to nbextensions/usability/codefolding/main.js index f4aa798..6f251a6 100644 --- a/usability/codefolding/main.js +++ b/nbextensions/usability/codefolding/main.js @@ -14,20 +14,31 @@ define([ 'jquery', 'require', 'base/js/events', + 'services/config', + 'base/js/utils', 'codemirror/lib/codemirror', 'codemirror/addon/fold/foldgutter', 'codemirror/addon/fold/foldcode', 'codemirror/addon/fold/brace-fold', 'codemirror/addon/fold/indent-fold' -], function(IPython, $, require, events, codemirror) { +], function(IPython, $, require, events, configmod, utils, codemirror) { "use strict"; - if (IPython.version[0] < 3) { - console.log("This extension requires IPython 3.x"); - return - } - var foldingKey = { "Alt-F" : toggleFolding }; - + var HOTKEY = 'Alt-F'; + var foldingKey = { HOTKEY : toggleFolding }; + + var base_url = utils.get_body_data("baseUrl"); + var config = new configmod.ConfigSection('notebook', {base_url: base_url}); + config.load(); + + config.loaded.then(function() { + if (config.data.hasOwnProperty('codefolding_hotkey') ){ + HOTKEY = config.data.codefolding_hotkey; + foldingKey = {}; + foldingKey[HOTKEY] = toggleFolding; + } + }); + /* * Toggle folding on/off at current line * @@ -77,7 +88,8 @@ define([ var cell = IPython.notebook.get_selected_cell(); if (cell.code_mirror != cm) { var cells = IPython.notebook.get_cells(); - for(var k in cells){ + var ncells = IPython.notebook.ncells(); + for(var k=0; k < ncells; k++){ var _cell = cells[k]; if (_cell.code_mirror == cm ) { break; } } @@ -93,13 +105,13 @@ define([ function cellFolding(cell) { if (CodeMirror.fold != undefined) { var keys = cell.code_mirror.getOption('extraKeys'); - cell.code_mirror.setOption('extraKeys', collect(keys, foldingKey )); + cell.code_mirror.setOption('extraKeys', collect(keys, foldingKey )); var mode = cell.code_mirror.getOption('mode'); /* use indent folding in Python */ if (mode.name == 'ipython' ) { - cell.code_mirror.setOption('foldGutter',{rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.firstline, CodeMirror.fold.magic, CodeMirror.fold.indent) }); + cell.code_mirror.setOption('foldGutter',{rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.firstline, CodeMirror.fold.indent) }); } else { - cell.code_mirror.setOption('foldGutter',{rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.firstline, CodeMirror.fold.magic, CodeMirror.fold.brace) }); + cell.code_mirror.setOption('foldGutter',{rangeFinder: new CodeMirror.fold.combine(CodeMirror.fold.firstline, CodeMirror.fold.brace) }); } var gutters = cell.code_mirror.getOption('gutters'); var found = jQuery.inArray("CodeMirror-foldgutter", gutters); @@ -131,16 +143,18 @@ define([ */ var initGutter = function() { var cells = IPython.notebook.get_cells(); - for(var i in cells){ + var ncells = IPython.notebook.ncells(); + for (var i=0; i64){ + // exclude all chars between : (58) and @ (64) + idstr+=String.fromCharCode(ascicode); + } + } while (idstr.length<32); + + return (idstr); + } + + var send_to_server = function(name,path,msg) { + if (name == '') { + name = uniqueid() + '.' + msg.match(/data:image\/(\S+);/)[1]; + } + path = path.substring(0, path.lastIndexOf('/')) + '/'; + if (path === '/') path = ''; + var url = '//' + location.host + '/api/contents/' + path + name; + var img = msg.replace(/(^\S+,)/, ''); // strip header + //console.log("send_to_server:", url, img); + var data = {'name': name, 'format':'base64', 'content': img, 'type': 'file'}; + var settings = { + processData : false, + cache : false, + type : "PUT", + dataType : "json", + data : JSON.stringify(data), + headers : {'Content-Type': 'text/plain'}, + async : false, + success : function (data, status, xhr) { + var new_cell = IPython.notebook.insert_cell_below('markdown'); + var str = ''; + new_cell.set_text(str); + new_cell.execute(); + }, + error : function() {console.log('Data transfer for drag-and-drop failed.'); } + }; + $.ajax(url, settings); + }; + + /* the dragover event needs to be canceled to allow firing the drop event */ + window.addEventListener('dragover', function(event){ + if (event.preventDefault) { + event.preventDefault(); + } + }); + + /* allow dropping an image in notebook */ + window.addEventListener('drop', function(event){ + var cell = IPython.notebook.get_selected_cell(); + event.preventDefault(); + if(event.stopPropagation) {event.stopPropagation();} + if (event.dataTransfer.items != undefined) { + /* Chrome here */ + var items = event.dataTransfer.items; + for (var i = 0; i < items.length; i++) { + /* data coming from local file system, must be an image to allow dropping*/ + if (items[i].kind == 'file' && items[i].type.indexOf('image/') !== -1) { + + var blob = items[i].getAsFile(); + var filename = blob.name; + var reader = new FileReader(); + reader.onload = ( function(evt) { + send_to_server(filename, IPython.notebook.notebook_path, evt.target.result); + if(event.stopPropagation) {event.stopPropagation();} + } ); + reader.readAsDataURL(blob); + } else { + console.log("Unsupported type:", items[i].kind); + } + } + } else { + /* Firefox here */ + var files = event.dataTransfer.files; + if (files.length == 0) { + var filename = event.dataTransfer.getData('application/x-moz-file-promise-dest-filename'); + var data = event.dataTransfer.getData('text/plain'); + if (filename.length == 0) { + url = ""; + filename = ''; + } else { + url = data; + data = ""; + } + /* data coming from browser: + * url - image is given as an url + * data - image is a base64 blob + */ + //console.log("type:",url," name:", filename," path:", IPython.notebook.notebook_path," url:", url); + send_to_server(filename, IPython.notebook.notebook_path, data); + return; + } + /* data coming from local file system, must be an image to allow dropping*/ + for (var i=0; i < files.length; i++) { + var blob = event.dataTransfer.files[0]; + if (blob.type.indexOf('image/') !== -1) { + var filename = blob.name; + var url = event.view.location.origin; + var reader = new FileReader(); + reader.onload = ( function(evt) { + //console.log("file"," name:", filename," path:", IPython.notebook.notebook_path," url:", url); + send_to_server(filename, IPython.notebook.notebook_path, evt.target.result); + event.preventDefault(); + } ); + reader.readAsDataURL(blob); + } else { + console.log("Unsupported type:", blob.type); + } + + } + } + }); + + /* + * make sure we do not drop images into a codemirror text field + */ + var checktype = function(cm,event) { + if (event.dataTransfer.items != undefined) + { + event.codemirrorIgnore = true; + } + var blob = event.dataTransfer.files[0]; + + if (event.dataTransfer.files.length > 0 && blob.type.indexOf('image/') !== -1) { + event.codemirrorIgnore = true; + } + }; + + var create_cell = function (event,nbcell,nbindex) { + var cell = nbcell.cell; + if ((cell instanceof IPython.CodeCell)) { + cell.code_mirror.on('drop', checktype); + } + }; + + var cells = IPython.notebook.get_cells(); + for(var i in cells){ + var cell = cells[i]; + if ((cell instanceof IPython.CodeCell)) { + cell.code_mirror.on('drop', checktype); + } + } + + var load_ipython_extension = function() { + events.on('create.Cell', create_cell); + }; + var extension = { + load_ipython_extension : load_ipython_extension + }; + return extension; +}); + diff --git a/nbextensions/usability/dragdrop/readme.md b/nbextensions/usability/dragdrop/readme.md new file mode 100644 index 0000000..32dc88b --- /dev/null +++ b/nbextensions/usability/dragdrop/readme.md @@ -0,0 +1,25 @@ +This IPython notebook extension allows dragging&dropping images from the desktop or other programs into a notebook. A new markdown cell is created below the currently selected cell and the image is embedded. +The notebook has been tested with Firefox and Chrome. + +A demo video showing drag&drop of images is here: +http://youtu.be/buAL1bTZ73c + +## Installation +From IPython simply call +```python +import IPython +IPython.html.nbextensions.install_nbextension('https://raw.githubusercontent.com/ipython-contrib/IPython-notebook-extensions/master/usability/dragdrop/main.js') +``` + +Then load the extension from within the IPyton notebook: +```javascript +%%javascript +IPython.load_extensions('drag-and-drop'); +``` +Alternatively, you can add the load command to your `custom.js`. + +## Internals +The image will be uploaded to the server into the directory where your notebook resides. This means, the image is not copied into the notebook itself, it will only be linked to. The markdown cell in the notebook will contain this tag: +`` + +If you run `nbconvert` to generate a HTML file, this image will remain outside of the html file. You can embedd all images by calling `nbconvert` with the option `--post=embed.EmbedPostProcessor`. The file `embed.py`, located in the same directory of this extension needs to be in `PYTHONPATH` to be found. \ No newline at end of file diff --git a/usability/execute_time/ExecuteTime.css b/nbextensions/usability/execute_time/ExecuteTime.css similarity index 100% rename from usability/execute_time/ExecuteTime.css rename to nbextensions/usability/execute_time/ExecuteTime.css diff --git a/usability/execute_time/ExecuteTime.js b/nbextensions/usability/execute_time/ExecuteTime.js similarity index 92% rename from usability/execute_time/ExecuteTime.js rename to nbextensions/usability/execute_time/ExecuteTime.js index 82fd407..20485a0 100755 --- a/usability/execute_time/ExecuteTime.js +++ b/nbextensions/usability/execute_time/ExecuteTime.js @@ -18,7 +18,7 @@ define(["require", "jquery", "base/js/namespace", "base/js/events"], function (r var patchCodecellExecute = function() { console.log('patching codecell to trigger ExecuteCell.ExecuteTime'); - IPython.CodeCell.prototype.old_execute = IPython.CodeCell.prototype.execute + IPython.CodeCell.prototype.old_execute = IPython.CodeCell.prototype.execute; IPython.CodeCell.prototype.execute = function () { this.old_execute(arguments); @@ -165,14 +165,18 @@ define(["require", "jquery", "base/js/namespace", "base/js/events"], function (r } }; + var load_ipython_extension = function() { + patchCodecellExecute(); - patchCodecellExecute(); + events.on('ExecuteCell.ExecuteTime', executionStartTime); + events.on('kernel_idle.Kernel', executionEndTime); - events.on('ExecuteCell.ExecuteTime',executionStartTime); - events.on('kernel_idle.Kernel', executionEndTime); + $("head").append($("")); + create_menu(); + }; - $("head").append($("")); - create_menu(); - - console.log('Execute Timings loaded'); + var extension = { + load_ipython_extension : load_ipython_extension + }; + return extension; }); diff --git a/usability/execute_time/ExecuteTime.yaml b/nbextensions/usability/execute_time/ExecuteTime.yaml similarity index 100% rename from usability/execute_time/ExecuteTime.yaml rename to nbextensions/usability/execute_time/ExecuteTime.yaml diff --git a/usability/execute_time/icon.png b/nbextensions/usability/execute_time/icon.png similarity index 100% rename from usability/execute_time/icon.png rename to nbextensions/usability/execute_time/icon.png diff --git a/usability/execute_time/readme.md b/nbextensions/usability/execute_time/readme.md similarity index 57% rename from usability/execute_time/readme.md rename to nbextensions/usability/execute_time/readme.md index c268567..7611119 100644 --- a/usability/execute_time/readme.md +++ b/nbextensions/usability/execute_time/readme.md @@ -2,21 +2,18 @@ This extension displays when the last execution of a cell occurred and how long ## Display -Every executed cell is extended with a new area, attached at the bottom of the input area, that displays when the user -started the last execution of this cell. When the kernel finishes to execute a cell, this area is update with the duration. +Every executed cell is extended with a new area, attached at the bottom of the input area, that displays when the user started the last execution of this cell. When the kernel finishes to execute a cell, this area is update with the duration. ![](https://github.com/ipython-contrib/IPython-notebook-extensions/raw/master/wiki-images/execution-timings-box.png) ## Toggling -The timings area can be hide by double clicking on it or using the option in the cell menu. The menu toggle -timings->All hides (resp. shows) all the possible timings area if the first cell is displayed (resp. hidden). +The timings area can be hide by double clicking on it or using the option in the cell menu. The menu toggle timings->All hides (resp. shows) all the possible timings area if the first cell is displayed (resp. hidden). ![](https://github.com/ipython-contrib/IPython-notebook-extensions/raw/master/wiki-images/execution-timings-menu.png) ## Internals -To be sure that the kernel is run intentionally by executing a codecell, codecell.prototype.execute() is overloaded -and a new event 'ExecuteCell.ExecuteTime' is fired, that this extension catches to display the start time. We use the event 'status_idle.Kernel' to know when the kernel finished the execution of the cell. +To be sure that the kernel is run intentionally by executing a codecell, codecell.prototype.execute() is overloaded and a new event 'ExecuteCell.ExecuteTime' is fired, that this extension catches to display the start time. We use the event 'status_idle.Kernel' to know when the kernel finished the execution of the cell. ## Installation Copy `ExecuteTime.{js,css}`, and add `require(['/static/custom/ExecuteTime.js'])` to `custom.js` in your profile's `/static/custom` directory, so it looks like this: @@ -28,5 +25,4 @@ $([IPython.events]).on('app_initialized.NotebookApp', function(){ ``` ## TODO -The timings information could be stored into the notebook and displayed when it is loaded. Where these information s -hould be stored is still to be decided (maybe in the metadata). +The timings information could be stored into the notebook and displayed when it is loaded. Where these information should be stored is still to be decided (maybe in the metadata). diff --git a/usability/search-replace/search-replace.yaml b/nbextensions/usability/exercise/exercise.yaml similarity index 69% rename from usability/search-replace/search-replace.yaml rename to nbextensions/usability/exercise/exercise.yaml index 9319e0b..e62ead7 100644 --- a/usability/search-replace/search-replace.yaml +++ b/nbextensions/usability/exercise/exercise.yaml @@ -1,7 +1,7 @@ Type: IPython Notebook Extension -Name: Search-Replace -Description: Search and replace -Link: https://github.com/ipython-contrib/IPython-notebook-extensions/wiki +Name: Exercise +Description: Exercise TEST +Link: https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/ Icon: icon.png Main: main.js Compatibility: 3.x diff --git a/nbextensions/usability/exercise/icon.png b/nbextensions/usability/exercise/icon.png new file mode 100644 index 0000000..4acc18f Binary files /dev/null and b/nbextensions/usability/exercise/icon.png differ diff --git a/usability/exercise/main.css b/nbextensions/usability/exercise/main.css similarity index 100% rename from usability/exercise/main.css rename to nbextensions/usability/exercise/main.css diff --git a/usability/exercise/main.js b/nbextensions/usability/exercise/main.js similarity index 67% rename from usability/exercise/main.js rename to nbextensions/usability/exercise/main.js index cf387d9..9862eab 100644 --- a/usability/exercise/main.js +++ b/nbextensions/usability/exercise/main.js @@ -1,14 +1,15 @@ -// Hide or diplay solutions in a notebook +// Copyright (c) IPython-Contrib Team. +// Distributed under the terms of the Modified BSD License. -// To define a solution, select all cells of a solution using shift button and mouse -// All cells will be hidden, except the first one -// A hide/unhide symbol will be displayed. Click on it and the solution will be displayed/hidden +// Hide or diplay solutions in a notebook define([ 'base/js/namespace', 'jquery', - "base/js/events", -], function(IPython, $, events) { + 'require', + 'base/js/events', + 'nbextensions/usability/rubberband/main' +], function(IPython, $, require, events, rubberband) { "use strict"; /** @@ -18,21 +19,21 @@ define([ * @param ev {Event} jquery event */ function click_solution_lock(ev) { - var cell=IPython.notebook.get_selected_cell() - var is_locked = cell.element.find('#lock').hasClass('fa-plus-square-o') + var cell=IPython.notebook.get_selected_cell(); + var is_locked = cell.element.find('#lock').hasClass('fa-plus-square-o'); if (is_locked == true) { - cell.element.find('#lock').removeClass('fa-plus-square-o') - cell.element.find('#lock').addClass('fa-minus-square-o') + cell.element.find('#lock').removeClass('fa-plus-square-o'); + cell.element.find('#lock').addClass('fa-minus-square-o'); while (cell.metadata.solution == true) { IPython.notebook.select_next(); cell.element.show(); cell = IPython.notebook.get_selected_cell() } } else { - cell.element.find('#lock').removeClass('fa-minus-square-o') - cell.element.find('#lock').addClass('fa-plus-square-o') + cell.element.find('#lock').removeClass('fa-minus-square-o'); + cell.element.find('#lock').addClass('fa-plus-square-o'); IPython.notebook.select_next(); - cell = IPython.notebook.get_selected_cell() + cell = IPython.notebook.get_selected_cell(); while (cell.metadata.solution == true) { cell.element.hide(); IPython.notebook.select_next(); @@ -49,48 +50,48 @@ define([ */ function hide_solutions() { // first check if lock symbol is already present in selected cell, if yes, remove it - var cell=IPython.notebook.get_selected_cell() - var has_lock = cell.element.find('#lock').is('div') + var cell=IPython.notebook.get_selected_cell(); + var has_lock = cell.element.find('#lock').is('div'); if (has_lock === true) { - cell.element.find('#lock').remove() + cell.element.find('#lock').remove(); while (cell.metadata.solution == true) { - delete cell.metadata.solution - cell.element.show() - IPython.notebook.select_next() + delete cell.metadata.solution; + cell.element.show(); + IPython.notebook.select_next(); cell = IPython.notebook.get_selected_cell() } } else { // find first cell with solution - var start_cell_i // = undefined - var cells = IPython.notebook.get_cells() + var start_cell_i; // = undefined + var cells = IPython.notebook.get_cells(); for(var i in cells){ - var cell = cells[i] + var cell = cells[i]; if (typeof cell.metadata.selected != undefined && cell.metadata.selected === true) { - start_cell_i = i - console.log("selected start cell:",i) + start_cell_i = i; + console.log("selected start cell:", i); break } } - IPython.notebook.select(start_cell_i) + IPython.notebook.select(start_cell_i); if (cell.metadata.selected == true) { - var el = $('
') - cell.element.prepend(el) - cell.metadata.solution = true + var el = $('
'); + cell.element.prepend(el); + cell.metadata.solution = true; cell.element.css({"background-color": "#ffffff"}); - delete cell.metadata.selected + delete cell.metadata.selected; - el.click(click_solution_lock) + el.click(click_solution_lock); IPython.notebook.select_next(); - cell = IPython.notebook.get_selected_cell() - console.log("new cell:", IPython.notebook.get_selected_index()) + cell = IPython.notebook.get_selected_cell(); + console.log("new cell:", IPython.notebook.get_selected_index()); while (cell.metadata.selected == true) { cell.element.css({"background-color": "#ffffff"}); - delete cell.metadata.selected + delete cell.metadata.selected; cell.element.hide(); - cell.metadata.solution = true + cell.metadata.solution = true; IPython.notebook.select_next(); - cell = IPython.notebook.get_selected_cell() + cell = IPython.notebook.get_selected_cell(); console.log("new cell(i):",IPython.notebook.get_selected_index()) } } @@ -105,7 +106,7 @@ define([ callback : function () { hide_solutions(); } - }, + } ]); /** @@ -120,22 +121,21 @@ define([ link.type = "text/css"; link.rel = "stylesheet"; link.href = require.toUrl(name); - console.log(link); document.getElementsByTagName("head")[0].appendChild(link); }; - load_css('/nbextensions/testing/exercise/main.css'); - var exercise_wrapper = $('
') - $("#header").append(exercise_wrapper) + load_css('./main.css'); + var exercise_wrapper = $('
'); + $("#header").append(exercise_wrapper); /** * Display existing solutions at startup * */ - var cells = IPython.notebook.get_cells() - var found_solution = false + var cells = IPython.notebook.get_cells(); + var found_solution = false; for(var i in cells){ - var cell = cells[i] + var cell = cells[i]; if (found_solution == true && typeof cell.metadata.solution != undefined && cell.metadata.solution === true) { cell.element.hide() } else { @@ -143,10 +143,11 @@ define([ } if (found_solution == false && typeof cell.metadata.solution != undefined && cell.metadata.solution === true) { // hide solution - var el = $('
') - cell.element.prepend(el) - el.click( click_solution_lock) + var el = $('
'); + cell.element.prepend(el); + el.click( click_solution_lock); found_solution = true } + rubberband.load_ipython_extension() } -}) +}); diff --git a/usability/help_panel/help_panel.css b/nbextensions/usability/help_panel/help_panel.css similarity index 100% rename from usability/help_panel/help_panel.css rename to nbextensions/usability/help_panel/help_panel.css diff --git a/usability/help_panel/help_panel.js b/nbextensions/usability/help_panel/help_panel.js similarity index 100% rename from usability/help_panel/help_panel.js rename to nbextensions/usability/help_panel/help_panel.js diff --git a/usability/hide_input.js b/nbextensions/usability/hide_input.js similarity index 100% rename from usability/hide_input.js rename to nbextensions/usability/hide_input.js diff --git a/usability/hide_input/hide_input.tpl b/nbextensions/usability/hide_input/hide_input.tpl similarity index 100% rename from usability/hide_input/hide_input.tpl rename to nbextensions/usability/hide_input/hide_input.tpl diff --git a/usability/hide_input/ipython_nbconvert_config.py b/nbextensions/usability/hide_input/ipython_nbconvert_config.py similarity index 100% rename from usability/hide_input/ipython_nbconvert_config.py rename to nbextensions/usability/hide_input/ipython_nbconvert_config.py diff --git a/usability/hide_input/main.js b/nbextensions/usability/hide_input/main.js similarity index 100% rename from usability/hide_input/main.js rename to nbextensions/usability/hide_input/main.js diff --git a/usability/hide_input/strip_output_prompt.py b/nbextensions/usability/hide_input/strip_output_prompt.py similarity index 100% rename from usability/hide_input/strip_output_prompt.py rename to nbextensions/usability/hide_input/strip_output_prompt.py diff --git a/usability/hide_input_all.js b/nbextensions/usability/hide_input_all.js similarity index 100% rename from usability/hide_input_all.js rename to nbextensions/usability/hide_input_all.js diff --git a/usability/init_cell/main.js b/nbextensions/usability/init_cell/main.js similarity index 100% rename from usability/init_cell/main.js rename to nbextensions/usability/init_cell/main.js diff --git a/usability/latex_envs/bibInNb4.js b/nbextensions/usability/latex_envs/bibInNb4.js similarity index 100% rename from usability/latex_envs/bibInNb4.js rename to nbextensions/usability/latex_envs/bibInNb4.js diff --git a/usability/latex_envs/bibtex2.js b/nbextensions/usability/latex_envs/bibtex2.js similarity index 100% rename from usability/latex_envs/bibtex2.js rename to nbextensions/usability/latex_envs/bibtex2.js diff --git a/usability/latex_envs/configuration_toolbar.png b/nbextensions/usability/latex_envs/configuration_toolbar.png similarity index 100% rename from usability/latex_envs/configuration_toolbar.png rename to nbextensions/usability/latex_envs/configuration_toolbar.png diff --git a/usability/latex_envs/conversion/header.tex b/nbextensions/usability/latex_envs/conversion/header.tex similarity index 100% rename from usability/latex_envs/conversion/header.tex rename to nbextensions/usability/latex_envs/conversion/header.tex diff --git a/usability/latex_envs/conversion/ipynb_thms_to_html b/nbextensions/usability/latex_envs/conversion/ipynb_thms_to_html similarity index 100% rename from usability/latex_envs/conversion/ipynb_thms_to_html rename to nbextensions/usability/latex_envs/conversion/ipynb_thms_to_html diff --git a/usability/latex_envs/conversion/ipynb_thms_to_latex b/nbextensions/usability/latex_envs/conversion/ipynb_thms_to_latex similarity index 100% rename from usability/latex_envs/conversion/ipynb_thms_to_latex rename to nbextensions/usability/latex_envs/conversion/ipynb_thms_to_latex diff --git a/usability/latex_envs/conversion/latex_envs.css b/nbextensions/usability/latex_envs/conversion/latex_envs.css similarity index 100% rename from usability/latex_envs/conversion/latex_envs.css rename to nbextensions/usability/latex_envs/conversion/latex_envs.css diff --git a/usability/latex_envs/conversion/post_html_thms.js b/nbextensions/usability/latex_envs/conversion/post_html_thms.js similarity index 100% rename from usability/latex_envs/conversion/post_html_thms.js rename to nbextensions/usability/latex_envs/conversion/post_html_thms.js diff --git a/usability/latex_envs/conversion/readme.md b/nbextensions/usability/latex_envs/conversion/readme.md similarity index 100% rename from usability/latex_envs/conversion/readme.md rename to nbextensions/usability/latex_envs/conversion/readme.md diff --git a/usability/latex_envs/conversion/texheaders_rm.py b/nbextensions/usability/latex_envs/conversion/texheaders_rm.py similarity index 100% rename from usability/latex_envs/conversion/texheaders_rm.py rename to nbextensions/usability/latex_envs/conversion/texheaders_rm.py diff --git a/usability/latex_envs/conversion/thmInNb_tolatex.py b/nbextensions/usability/latex_envs/conversion/thmInNb_tolatex.py similarity index 100% rename from usability/latex_envs/conversion/thmInNb_tolatex.py rename to nbextensions/usability/latex_envs/conversion/thmInNb_tolatex.py diff --git a/usability/latex_envs/conversion/thmsInNb.tpl b/nbextensions/usability/latex_envs/conversion/thmsInNb.tpl similarity index 100% rename from usability/latex_envs/conversion/thmsInNb.tpl rename to nbextensions/usability/latex_envs/conversion/thmsInNb.tpl diff --git a/usability/latex_envs/conversion/thmsInNb_article.tplx b/nbextensions/usability/latex_envs/conversion/thmsInNb_article.tplx similarity index 100% rename from usability/latex_envs/conversion/thmsInNb_article.tplx rename to nbextensions/usability/latex_envs/conversion/thmsInNb_article.tplx diff --git a/usability/latex_envs/conversion/thmsInNb_book.tplx b/nbextensions/usability/latex_envs/conversion/thmsInNb_book.tplx similarity index 100% rename from usability/latex_envs/conversion/thmsInNb_book.tplx rename to nbextensions/usability/latex_envs/conversion/thmsInNb_book.tplx diff --git a/usability/latex_envs/conversion/toc_and_cln.py b/nbextensions/usability/latex_envs/conversion/toc_and_cln.py similarity index 100% rename from usability/latex_envs/conversion/toc_and_cln.py rename to nbextensions/usability/latex_envs/conversion/toc_and_cln.py diff --git a/usability/latex_envs/creating_the_directory.txt b/nbextensions/usability/latex_envs/creating_the_directory.txt similarity index 100% rename from usability/latex_envs/creating_the_directory.txt rename to nbextensions/usability/latex_envs/creating_the_directory.txt diff --git a/usability/latex_envs/doc/configuration_toolbar.png b/nbextensions/usability/latex_envs/doc/configuration_toolbar.png similarity index 100% rename from usability/latex_envs/doc/configuration_toolbar.png rename to nbextensions/usability/latex_envs/doc/configuration_toolbar.png diff --git a/usability/latex_envs/doc/documentation.pdf b/nbextensions/usability/latex_envs/doc/documentation.pdf similarity index 100% rename from usability/latex_envs/doc/documentation.pdf rename to nbextensions/usability/latex_envs/doc/documentation.pdf diff --git a/usability/latex_envs/doc/example.png b/nbextensions/usability/latex_envs/doc/example.png similarity index 100% rename from usability/latex_envs/doc/example.png rename to nbextensions/usability/latex_envs/doc/example.png diff --git a/usability/latex_envs/doc/html/.ipynb_checkpoints/latex_env_doc-checkpoint.ipynb b/nbextensions/usability/latex_envs/doc/html/.ipynb_checkpoints/latex_env_doc-checkpoint.ipynb similarity index 100% rename from usability/latex_envs/doc/html/.ipynb_checkpoints/latex_env_doc-checkpoint.ipynb rename to nbextensions/usability/latex_envs/doc/html/.ipynb_checkpoints/latex_env_doc-checkpoint.ipynb diff --git a/usability/latex_envs/doc/html/biblio_ipython.bib b/nbextensions/usability/latex_envs/doc/html/biblio_ipython.bib similarity index 100% rename from usability/latex_envs/doc/html/biblio_ipython.bib rename to nbextensions/usability/latex_envs/doc/html/biblio_ipython.bib diff --git a/usability/latex_envs/doc/html/configuration_toolbar.png b/nbextensions/usability/latex_envs/doc/html/configuration_toolbar.png similarity index 100% rename from usability/latex_envs/doc/html/configuration_toolbar.png rename to nbextensions/usability/latex_envs/doc/html/configuration_toolbar.png diff --git a/usability/latex_envs/doc/html/example.png b/nbextensions/usability/latex_envs/doc/html/example.png similarity index 100% rename from usability/latex_envs/doc/html/example.png rename to nbextensions/usability/latex_envs/doc/html/example.png diff --git a/usability/latex_envs/doc/html/latex_env_doc.html b/nbextensions/usability/latex_envs/doc/html/latex_env_doc.html similarity index 100% rename from usability/latex_envs/doc/html/latex_env_doc.html rename to nbextensions/usability/latex_envs/doc/html/latex_env_doc.html diff --git a/usability/latex_envs/doc/html/latex_env_doc.ipynb b/nbextensions/usability/latex_envs/doc/html/latex_env_doc.ipynb similarity index 100% rename from usability/latex_envs/doc/html/latex_env_doc.ipynb rename to nbextensions/usability/latex_envs/doc/html/latex_env_doc.ipynb diff --git a/usability/latex_envs/doc/html/latex_envs.css b/nbextensions/usability/latex_envs/doc/html/latex_envs.css similarity index 100% rename from usability/latex_envs/doc/html/latex_envs.css rename to nbextensions/usability/latex_envs/doc/html/latex_envs.css diff --git a/usability/latex_envs/doc/html/main_toolbar.png b/nbextensions/usability/latex_envs/doc/html/main_toolbar.png similarity index 100% rename from usability/latex_envs/doc/html/main_toolbar.png rename to nbextensions/usability/latex_envs/doc/html/main_toolbar.png diff --git a/usability/latex_envs/doc/latex/.ipynb_checkpoints/latex_env_doc-ltx-checkpoint.ipynb b/nbextensions/usability/latex_envs/doc/latex/.ipynb_checkpoints/latex_env_doc-ltx-checkpoint.ipynb similarity index 100% rename from usability/latex_envs/doc/latex/.ipynb_checkpoints/latex_env_doc-ltx-checkpoint.ipynb rename to nbextensions/usability/latex_envs/doc/latex/.ipynb_checkpoints/latex_env_doc-ltx-checkpoint.ipynb diff --git a/usability/latex_envs/doc/latex/IEEEtran.bst b/nbextensions/usability/latex_envs/doc/latex/IEEEtran.bst similarity index 100% rename from usability/latex_envs/doc/latex/IEEEtran.bst rename to nbextensions/usability/latex_envs/doc/latex/IEEEtran.bst diff --git a/usability/latex_envs/doc/latex/biblio_ipython.bib b/nbextensions/usability/latex_envs/doc/latex/biblio_ipython.bib similarity index 100% rename from usability/latex_envs/doc/latex/biblio_ipython.bib rename to nbextensions/usability/latex_envs/doc/latex/biblio_ipython.bib diff --git a/usability/latex_envs/doc/latex/configuration_toolbar.png b/nbextensions/usability/latex_envs/doc/latex/configuration_toolbar.png similarity index 100% rename from usability/latex_envs/doc/latex/configuration_toolbar.png rename to nbextensions/usability/latex_envs/doc/latex/configuration_toolbar.png diff --git a/usability/latex_envs/doc/latex/documentation.aux b/nbextensions/usability/latex_envs/doc/latex/documentation.aux similarity index 100% rename from usability/latex_envs/doc/latex/documentation.aux rename to nbextensions/usability/latex_envs/doc/latex/documentation.aux diff --git a/usability/latex_envs/doc/latex/documentation.bbl b/nbextensions/usability/latex_envs/doc/latex/documentation.bbl similarity index 100% rename from usability/latex_envs/doc/latex/documentation.bbl rename to nbextensions/usability/latex_envs/doc/latex/documentation.bbl diff --git a/usability/latex_envs/doc/latex/documentation.blg b/nbextensions/usability/latex_envs/doc/latex/documentation.blg similarity index 100% rename from usability/latex_envs/doc/latex/documentation.blg rename to nbextensions/usability/latex_envs/doc/latex/documentation.blg diff --git a/usability/latex_envs/doc/latex/documentation.log b/nbextensions/usability/latex_envs/doc/latex/documentation.log similarity index 100% rename from usability/latex_envs/doc/latex/documentation.log rename to nbextensions/usability/latex_envs/doc/latex/documentation.log diff --git a/usability/latex_envs/doc/latex/documentation.out b/nbextensions/usability/latex_envs/doc/latex/documentation.out similarity index 100% rename from usability/latex_envs/doc/latex/documentation.out rename to nbextensions/usability/latex_envs/doc/latex/documentation.out diff --git a/usability/latex_envs/doc/latex/documentation.pdf b/nbextensions/usability/latex_envs/doc/latex/documentation.pdf similarity index 100% rename from usability/latex_envs/doc/latex/documentation.pdf rename to nbextensions/usability/latex_envs/doc/latex/documentation.pdf diff --git a/usability/latex_envs/doc/latex/documentation.tex b/nbextensions/usability/latex_envs/doc/latex/documentation.tex similarity index 100% rename from usability/latex_envs/doc/latex/documentation.tex rename to nbextensions/usability/latex_envs/doc/latex/documentation.tex diff --git a/usability/latex_envs/doc/latex/documentation.toc b/nbextensions/usability/latex_envs/doc/latex/documentation.toc similarity index 100% rename from usability/latex_envs/doc/latex/documentation.toc rename to nbextensions/usability/latex_envs/doc/latex/documentation.toc diff --git a/usability/latex_envs/doc/latex/example.png b/nbextensions/usability/latex_envs/doc/latex/example.png similarity index 100% rename from usability/latex_envs/doc/latex/example.png rename to nbextensions/usability/latex_envs/doc/latex/example.png diff --git a/usability/latex_envs/doc/latex/header.tex b/nbextensions/usability/latex_envs/doc/latex/header.tex similarity index 100% rename from usability/latex_envs/doc/latex/header.tex rename to nbextensions/usability/latex_envs/doc/latex/header.tex diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx.ipynb b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx.ipynb similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx.ipynb rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx.ipynb diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx.tex b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx.tex similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx.tex rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx.tex diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_46_0.png b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_46_0.png similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_46_0.png rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_46_0.png diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_48_0.png b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_48_0.png similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_48_0.png rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_48_0.png diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_52_0.png b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_52_0.png similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_52_0.png rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_52_0.png diff --git a/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_54_0.png b/nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_54_0.png similarity index 100% rename from usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_54_0.png rename to nbextensions/usability/latex_envs/doc/latex/latex_env_doc-ltx_tmp_files/latex_env_doc-ltx_tmp_54_0.png diff --git a/usability/latex_envs/doc/latex/main_toolbar.png b/nbextensions/usability/latex_envs/doc/latex/main_toolbar.png similarity index 100% rename from usability/latex_envs/doc/latex/main_toolbar.png rename to nbextensions/usability/latex_envs/doc/latex/main_toolbar.png diff --git a/usability/latex_envs/doc/latex_env_doc.html b/nbextensions/usability/latex_envs/doc/latex_env_doc.html similarity index 100% rename from usability/latex_envs/doc/latex_env_doc.html rename to nbextensions/usability/latex_envs/doc/latex_env_doc.html diff --git a/usability/latex_envs/doc/latex_envs.css b/nbextensions/usability/latex_envs/doc/latex_envs.css similarity index 100% rename from usability/latex_envs/doc/latex_envs.css rename to nbextensions/usability/latex_envs/doc/latex_envs.css diff --git a/usability/latex_envs/doc/main_toolbar.png b/nbextensions/usability/latex_envs/doc/main_toolbar.png similarity index 100% rename from usability/latex_envs/doc/main_toolbar.png rename to nbextensions/usability/latex_envs/doc/main_toolbar.png diff --git a/usability/latex_envs/example.png b/nbextensions/usability/latex_envs/example.png similarity index 100% rename from usability/latex_envs/example.png rename to nbextensions/usability/latex_envs/example.png diff --git a/usability/latex_envs/icon.png b/nbextensions/usability/latex_envs/icon.png similarity index 100% rename from usability/latex_envs/icon.png rename to nbextensions/usability/latex_envs/icon.png diff --git a/usability/latex_envs/initNb.js b/nbextensions/usability/latex_envs/initNb.js similarity index 100% rename from usability/latex_envs/initNb.js rename to nbextensions/usability/latex_envs/initNb.js diff --git a/usability/latex_envs/latex_envs.css b/nbextensions/usability/latex_envs/latex_envs.css similarity index 100% rename from usability/latex_envs/latex_envs.css rename to nbextensions/usability/latex_envs/latex_envs.css diff --git a/usability/latex_envs/latex_envs.js b/nbextensions/usability/latex_envs/latex_envs.js similarity index 100% rename from usability/latex_envs/latex_envs.js rename to nbextensions/usability/latex_envs/latex_envs.js diff --git a/usability/latex_envs/latex_envs.yaml b/nbextensions/usability/latex_envs/latex_envs.yaml similarity index 69% rename from usability/latex_envs/latex_envs.yaml rename to nbextensions/usability/latex_envs/latex_envs.yaml index e14afc2..5f876f0 100644 --- a/usability/latex_envs/latex_envs.yaml +++ b/nbextensions/usability/latex_envs/latex_envs.yaml @@ -1,7 +1,7 @@ Type: IPython Notebook Extension Name: (some) LaTeX environments for Jupyter Description: Enable to use laTeX environments in Jupyter's markdown cells -Link: https://github.com/jfbercher/IPython-notebook-extensions/tree/master/testing/latex_envs/ +Link: readme.md Icon: icon.png Main: latex_envs.js Compatibility: 3.x, Jupyter (4.x) diff --git a/usability/latex_envs/latex_envs.zip b/nbextensions/usability/latex_envs/latex_envs.zip similarity index 100% rename from usability/latex_envs/latex_envs.zip rename to nbextensions/usability/latex_envs/latex_envs.zip diff --git a/usability/latex_envs/latex_envs_jup.js b/nbextensions/usability/latex_envs/latex_envs_jup.js similarity index 100% rename from usability/latex_envs/latex_envs_jup.js rename to nbextensions/usability/latex_envs/latex_envs_jup.js diff --git a/usability/latex_envs/main_toolbar.png b/nbextensions/usability/latex_envs/main_toolbar.png similarity index 100% rename from usability/latex_envs/main_toolbar.png rename to nbextensions/usability/latex_envs/main_toolbar.png diff --git a/usability/latex_envs/makezip b/nbextensions/usability/latex_envs/makezip similarity index 100% rename from usability/latex_envs/makezip rename to nbextensions/usability/latex_envs/makezip diff --git a/usability/latex_envs/readme.md b/nbextensions/usability/latex_envs/readme.md similarity index 100% rename from usability/latex_envs/readme.md rename to nbextensions/usability/latex_envs/readme.md diff --git a/usability/latex_envs/thmsInNb.js b/nbextensions/usability/latex_envs/thmsInNb.js similarity index 100% rename from usability/latex_envs/thmsInNb.js rename to nbextensions/usability/latex_envs/thmsInNb.js diff --git a/usability/latex_envs/thmsInNb4.js b/nbextensions/usability/latex_envs/thmsInNb4.js similarity index 100% rename from usability/latex_envs/thmsInNb4.js rename to nbextensions/usability/latex_envs/thmsInNb4.js diff --git a/usability/limit_output/icon.png b/nbextensions/usability/limit_output/icon.png similarity index 100% rename from usability/limit_output/icon.png rename to nbextensions/usability/limit_output/icon.png diff --git a/usability/limit_output/limit-output.yaml b/nbextensions/usability/limit_output/limit-output.yaml similarity index 100% rename from usability/limit_output/limit-output.yaml rename to nbextensions/usability/limit_output/limit-output.yaml diff --git a/usability/limit_output/main.js b/nbextensions/usability/limit_output/main.js similarity index 100% rename from usability/limit_output/main.js rename to nbextensions/usability/limit_output/main.js diff --git a/usability/limit_output/readme.md b/nbextensions/usability/limit_output/readme.md similarity index 71% rename from usability/limit_output/readme.md rename to nbextensions/usability/limit_output/readme.md index 489d55e..61406dc 100644 --- a/usability/limit_output/readme.md +++ b/nbextensions/usability/limit_output/readme.md @@ -2,10 +2,10 @@ This extension limits the number of characters a codecell can output as text. Th [![Demo Video](http://img.youtube.com/vi/U26ujuPXf00/0.jpg)](https://youtu.be/U26ujuPXf00) -You can set the number of characters in the notebook extensions configration page or use the ConfigManager: +You can set the number of characters using the ConfigManager: ```Python from IPython.html.services.config import ConfigManager ip = get_ipython() -cm = ConfigManager(parent=ip) +cm = ConfigManager(parent=ip, profile_dir=ip.profile_dir.location) cm.update('notebook', {"limit_output": 1000}) ``` diff --git a/usability/linenumbers.js b/nbextensions/usability/linenumbers.js similarity index 100% rename from usability/linenumbers.js rename to nbextensions/usability/linenumbers.js diff --git a/usability/navigation-hotkeys/hotkeys.yaml b/nbextensions/usability/navigation-hotkeys/hotkeys.yaml similarity index 58% rename from usability/navigation-hotkeys/hotkeys.yaml rename to nbextensions/usability/navigation-hotkeys/hotkeys.yaml index 0f58db8..75acd8a 100644 --- a/usability/navigation-hotkeys/hotkeys.yaml +++ b/nbextensions/usability/navigation-hotkeys/hotkeys.yaml @@ -1,7 +1,7 @@ Type: IPython Notebook Extension Name: Navigation-Hotkeys Description: Additional hotkeys for easier navigation in the notebook -Link: https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/navigation_hotkeys +Link: readme.md Icon: icon.png Main: main.js -Compatibility: 3.x +Compatibility: 4.x diff --git a/usability/navigation-hotkeys/icon.png b/nbextensions/usability/navigation-hotkeys/icon.png similarity index 100% rename from usability/navigation-hotkeys/icon.png rename to nbextensions/usability/navigation-hotkeys/icon.png diff --git a/nbextensions/usability/navigation-hotkeys/main.js b/nbextensions/usability/navigation-hotkeys/main.js new file mode 100644 index 0000000..3261460 --- /dev/null +++ b/nbextensions/usability/navigation-hotkeys/main.js @@ -0,0 +1,236 @@ +// add custom shortcuts + +define([ + 'base/js/namespace', + 'jquery' +], function(IPython, $) { + "use strict"; + + var add_command_shortcuts = { + 'esc' : { + help : 'edit mode', + help_index : 'aa', + handler : function() { + IPython.notebook.edit_mode(); + return false; + } + }, + + 'home' : { + help : 'go to top', + help_index : 'ga', + handler : function() { + IPython.notebook.select(0); + IPython.notebook.scroll_to_top(); + return false; + } + }, + + 'end' : { + help : 'go to bottom', + help_index : 'ga', + handler : function() { + var ncells = IPython.notebook.ncells(); + IPython.notebook.select(ncells-1); + IPython.notebook.scroll_to_bottom(); + return false; + } + }, + + 'pageup' : { + help : 'page up', + help_index : 'aa', + handler : function() { + var wh = 0.6 * $(window).height(); + var cell = IPython.notebook.get_selected_cell(); + var h = 0; + /* loop until we have enough cells to span the size of the notebook window (= one page) */ + do { + h += cell.element.height(); + IPython.notebook.select_prev(); + cell = IPython.notebook.get_selected_cell(); + } while ( h < wh ); + var cp = cell.element.position(); + var sp = $('body').scrollTop(); + if ( cp.top < sp) { + IPython.notebook.scroll_to_cell(IPython.notebook.get_selected_index(), 0); + } + cell.focus_cell(); + return false; + } + }, + + 'pagedown' : { + help : 'page down', + help_index : 'aa', + handler : function() { + + /* jump to bottom if we are already in the last cell */ + var ncells = IPython.notebook.ncells(); + if ( IPython.notebook.get_selected_index()+1 == ncells) { + IPython.notebook.scroll_to_bottom(); + return false; + } + + var wh = 0.6*$(window).height(); + var cell = IPython.notebook.get_selected_cell(); + var h = 0; + + /* loop until we have enough cells to span the size of the notebook window (= one page) */ + do { + h += cell.element.height(); + IPython.notebook.select_next(); + cell = IPython.notebook.get_selected_cell(); + } while ( h < wh ); + cell.focus_cell(); + return false; + } + }, + + 'shift-down': { + help : 'shift down', + help_index : 'aa', + handler : function() { + var index = IPython.notebook.get_selected_index(); + if (index !== (IPython.notebook.ncells()-1) && index !== null) { + IPython.notebook.extend_selection('down'); + IPython.notebook.focus_cell(); + } + return false; + } + }, + + 'shift-up': { + help : 'shift down', + help_index : 'aa', + handler : function() { + var index = IPython.notebook.get_selected_index(); + if (index !== 0 && index !== null) { + IPython.notebook.extend_selection('up'); + IPython.notebook.focus_cell(); + } + return false; + } + } + + }; + + var add_edit_shortcuts = { + 'alt-add' : { + help : 'split cell', + help_index : 'eb', + handler : function() { + IPython.notebook.split_cell(); + IPython.notebook.edit_mode(); + return false; + } + }, + 'alt-subtract' : { + help : 'merge cell', + help_index : 'eb', + handler : function() { + var i = IPython.notebook.get_selected_index(); + if (i > 0) { + var l = IPython.notebook.get_cell(i-1).code_mirror.lineCount(); + IPython.notebook.merge_cell_above(); + IPython.notebook.get_selected_cell().code_mirror.setCursor(l,0); + } + } + }, + 'shift-enter' : { + help : 'run cell, select next codecell', + help_index : 'bb', + handler : function() { + IPython.notebook.execute_cell_and_select_below(); + var rendered = IPython.notebook.get_selected_cell().rendered; + var ccell = IPython.notebook.get_selected_cell().cell_type; + if (rendered === false || ccell === 'code') IPython.notebook.edit_mode(); + return false; + } + }, + 'ctrl-enter' : { + help : 'run cell', + help_index : 'bb', + handler : function() { + var cell = IPython.notebook.get_selected_cell(); + var mode = cell.mode; + cell.execute(); + if (mode === "edit") IPython.notebook.edit_mode(); + return false; + } + }, + 'alt-n' : { + help : 'toggle line numbers', + help_index : 'xy', + handler : function() { + var cell = IPython.notebook.get_selected_cell(); + cell.toggle_line_numbers(); + return false; + } + }, + 'pagedown' : { + help : 'page down', + help_index : 'xy', + handler : function() { + + var ic = IPython.notebook.get_selected_index(); + var cells = IPython.notebook.get_cells(); + var i, h=0; + for (i=0; i < ic; i ++) { + h += cells[i].element.height(); + } + var cur = cells[ic].code_mirror.getCursor(); + h += cells[ic].code_mirror.defaultTextHeight() * cur.line; + IPython.notebook.element.animate({scrollTop:h}, 0); + return false; + } + }, + 'pageup' : { + help : 'page down', + help_index : 'xy', + handler : function() { + + var ic = IPython.notebook.get_selected_index(); + var cells = IPython.notebook.get_cells(); + var i, h=0; + for (i=0; i < ic; i ++) { + h += cells[i].element.height(); + } + var cur =cells[ic].code_mirror.getCursor(); + h += cells[ic].code_mirror.defaultTextHeight() * cur.line; + IPython.notebook.element.animate({scrollTop:h}, 0); + return false; + } + }, + 'ctrl-y' : { + help : 'toggle markdown/code', + handler : function() { + var cell = IPython.notebook.get_selected_cell(); + var cur = cell.code_mirror.getCursor(); + if (cell.cell_type == 'code') { + IPython.notebook.command_mode(); + IPython.notebook.to_markdown(); + IPython.notebook.edit_mode(); + cell = IPython.notebook.get_selected_cell(); + cell.code_mirror.setCursor(cur); + } else if (cell.cell_type == 'markdown') { + IPython.notebook.command_mode(); + IPython.notebook.to_code(); + IPython.notebook.edit_mode(); + cell = IPython.notebook.get_selected_cell(); + cell.code_mirror.setCursor(cur); + } + return false; + } + } + }; + + var load_ipython_extension = function() { + IPython.keyboard_manager.edit_shortcuts.add_shortcuts(add_edit_shortcuts); + IPython.keyboard_manager.command_shortcuts.add_shortcuts(add_command_shortcuts); + }; + var extension = { + load_ipython_extension : load_ipython_extension + }; + return extension; +}); diff --git a/nbextensions/usability/navigation-hotkeys/readme.md b/nbextensions/usability/navigation-hotkeys/readme.md new file mode 100644 index 0000000..cf6cc27 --- /dev/null +++ b/nbextensions/usability/navigation-hotkeys/readme.md @@ -0,0 +1,24 @@ +Hotkeys in + +## Edit Mode + +| Hotkey | Description | +|------------|-------------| +| `pageup` | scroll page up | +| `pagedown` | scroll page down | +| `Alt`- `+` | Split cell and keep cursor position | +| `Alt`- `-` | Combine cell and keep cursor position | +| `Alt`-`n` | Toggle line number display in current codecell | +| `Shift`-`Enter` | Execute cell, goto next cell and stay in edit mode if next cell is a code cell or unredered markdown cell | +| `Ctrl`-`Enter` | Execute cell and stay in edit mode if cell is a code cell | +| `Ctrl`-`y` | toggle celltype between markdown and code | + +## Command Mode + +| Hotkey | Description | +|------------|-------------| +| `esc` | toggle to edit mode | +| `home` | Go to top of notebook | +| `end` | Go to bottom of notebook | +| `pageup` | scroll page up | +| `pagedown` | scroll page down | diff --git a/usability/no_exec_dunder.js b/nbextensions/usability/no_exec_dunder.js similarity index 100% rename from usability/no_exec_dunder.js rename to nbextensions/usability/no_exec_dunder.js diff --git a/usability/noscroll.js b/nbextensions/usability/noscroll.js similarity index 100% rename from usability/noscroll.js rename to nbextensions/usability/noscroll.js diff --git a/usability/python-markdown/main.js b/nbextensions/usability/python-markdown/main.js similarity index 98% rename from usability/python-markdown/main.js rename to nbextensions/usability/python-markdown/main.js index 2c71564..507a707 100644 --- a/usability/python-markdown/main.js +++ b/nbextensions/usability/python-markdown/main.js @@ -17,10 +17,6 @@ define([ 'notebook/js/textcell' ], function(IPython, $, cell, security, marked, events,textcell) { "use strict"; - if (IPython.version[0] < 3) { - console.log("This extension requires IPython 3.x"); - return - } /* * Find Python expression enclosed in {{ }}, execute and add to text as diff --git a/usability/python-markdown/python-markdown.png b/nbextensions/usability/python-markdown/python-markdown.png similarity index 100% rename from usability/python-markdown/python-markdown.png rename to nbextensions/usability/python-markdown/python-markdown.png diff --git a/usability/python-markdown/python-markdown.yaml b/nbextensions/usability/python-markdown/python-markdown.yaml similarity index 100% rename from usability/python-markdown/python-markdown.yaml rename to nbextensions/usability/python-markdown/python-markdown.yaml diff --git a/usability/python-markdown/readme.md b/nbextensions/usability/python-markdown/readme.md similarity index 74% rename from usability/python-markdown/readme.md rename to nbextensions/usability/python-markdown/readme.md index 576442a..40e84e7 100644 --- a/usability/python-markdown/readme.md +++ b/nbextensions/usability/python-markdown/readme.md @@ -13,6 +13,8 @@ It will be displayed as: a = 1.23 ``` +[![Demo Video](http://img.youtube.com/vi/_wLwLsgkExc/0.jpg)](https://youtu.be/_wLwLsgkExc) + ## Further examples Before rendering the markdown cell: ![before](https://raw.github.com/ipython-contrib/IPython-notebook-extensions/master/wiki-images/python-markdown-pre.png) @@ -20,25 +22,23 @@ Before rendering the markdown cell: After rendering the markdown cell: ![after](https://raw.github.com/ipython-contrib/IPython-notebook-extensions/master/wiki-images/python-markdown-post.png) +Python code is only executed when the notebook is trusted. So if your original Python code is still shown in rendered markdown output, please make sure your notebook is trusted. **Caution:** There is no restriction in the expression you can embedd in `{{ }}`. Be careful as you might crash your browser if you return too large datasets. Also, images in markdown will be removed due to the HTML sanitizer after a reload. ## Installation -There are different versions of this extension for the 2.x or 3.x version of IPython. Please make sure you use the correct one by selecting the `2.x` or `master` branch in the repository. +Install the master version of the IPython-notebook-extensions repository as explained on the main wiki page. -Copy `python-markdown.js` to the `nbextensions` directory of your IPython notebook server. -Then load the using +Then load the extension from within the IPyton notebook: ```javascript %%javascript -IPython.load_extensions('python-markdown') +IPython.load_extensions('IPython-notebook-extensions-master/usability/python-markdown/main'); ``` -You can add the `IPython.load_extensions('python-markdown')` call to your local `custom.js` file to have the extension automatically loaded. See the IPython documentation or the main make of this Wiki for details. In order to have `nbconvert` show the preprocessed output, copy the `pymdpreprocessor.py` file to a location in your `PYTHONPATH`and add or extend the following line to your `ipython_nbconvert_config.py` configuration file: -`c.Exporter.preprocessors = [ 'pymdpreprocessor.PyMarkdownPreprocessor' ]`. Make sure you have defined ` -c = get_config()` beforehand. +`c.Exporter.preprocessors = [ 'pymdpreprocessor.PyMarkdownPreprocessor' ]` ## Internals The extension overrides the `textcell.MarkdownCell.prototype.render` function and searches for a Python expression enclosed in double curly braced `{{ }}`. It then executes the expression and replaces it with the result returned from Python, embedded in a `` tag. diff --git a/usability/read-only.js b/nbextensions/usability/read-only.js similarity index 100% rename from usability/read-only.js rename to nbextensions/usability/read-only.js diff --git a/usability/rubberband/icon.png b/nbextensions/usability/rubberband/icon.png similarity index 100% rename from usability/rubberband/icon.png rename to nbextensions/usability/rubberband/icon.png diff --git a/usability/rubberband/main.css b/nbextensions/usability/rubberband/main.css similarity index 100% rename from usability/rubberband/main.css rename to nbextensions/usability/rubberband/main.css diff --git a/usability/rubberband/main.js b/nbextensions/usability/rubberband/main.js similarity index 100% rename from usability/rubberband/main.js rename to nbextensions/usability/rubberband/main.js diff --git a/nbextensions/usability/rubberband/readme.md b/nbextensions/usability/rubberband/readme.md new file mode 100644 index 0000000..842712a --- /dev/null +++ b/nbextensions/usability/rubberband/readme.md @@ -0,0 +1,31 @@ +Multi-Cell selection using a rubberband. This extension is only available for IPython version 3.x. + +Description +=========== +The *rubberband* extension allows selecting multiple cells. Cells are selected by pressing `shift` or `ctrl`+`shift` + left mouse button click and dragging the rubber band over the cells. + +* `shift` + left mouse button : select cells that are currently touched by the rubberband +* `ctrl` + `shift` + left mouse button : select cells that were touched by the rubberband + +The `ctrl`+`shift` action is useful when scrolling inside the notebook. Scrolling is activated when the mouse reaches the upper or lower boundary of the notebook area. For now, the mouse has to be moved to achieve continuous scrolling. + +A short video demonstrating the rubberband extension can be found here: +[![screenshot](https://cloud.githubusercontent.com/assets/2445216/4668769/b6dd5b72-5567-11e4-9b55-558da6da027c.jpg)](http://youtu.be/TOPfWhqa3oI) + + +Two other extensions make use of this feature: exercise and chrome_clipboard. + +Installation +============ +Copy the `rubberband` directory to a new `/nbextensions/usability/rubberband` directory of your user's IPython directory and add +```javascript +IPython.load_extensions('usability/rubberband/main') +``` +to your `custom.js` file. Take a look at the general installation instructions in the Wiki if you are unsure how to proceed. + +Internals +========= + +New metadata element added to each cell: +* `cell.metadata.selected` - means this cell is selected + diff --git a/usability/rubberband/rubberband.yaml b/nbextensions/usability/rubberband/rubberband.yaml similarity index 66% rename from usability/rubberband/rubberband.yaml rename to nbextensions/usability/rubberband/rubberband.yaml index 14319e3..643a505 100644 --- a/usability/rubberband/rubberband.yaml +++ b/nbextensions/usability/rubberband/rubberband.yaml @@ -1,7 +1,7 @@ Type: IPython Notebook Extension Name: Rubberband Description: The rubberband extension allows selecting multiple cells -Link: https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Rubberband +Link: readme.md Icon: icon.png Main: main.js Compatibility: 4.x diff --git a/usability/ruler/icon.png b/nbextensions/usability/ruler/icon.png similarity index 100% rename from usability/ruler/icon.png rename to nbextensions/usability/ruler/icon.png diff --git a/usability/ruler/main.js b/nbextensions/usability/ruler/main.js similarity index 100% rename from usability/ruler/main.js rename to nbextensions/usability/ruler/main.js diff --git a/usability/ruler/readme.md b/nbextensions/usability/ruler/readme.md similarity index 100% rename from usability/ruler/readme.md rename to nbextensions/usability/ruler/readme.md diff --git a/usability/ruler/ruler.yaml b/nbextensions/usability/ruler/ruler.yaml similarity index 100% rename from usability/ruler/ruler.yaml rename to nbextensions/usability/ruler/ruler.yaml diff --git a/usability/runtools/dummy.js b/nbextensions/usability/runtools/dummy.js similarity index 100% rename from usability/runtools/dummy.js rename to nbextensions/usability/runtools/dummy.js diff --git a/usability/runtools/gutter.css b/nbextensions/usability/runtools/gutter.css similarity index 100% rename from usability/runtools/gutter.css rename to nbextensions/usability/runtools/gutter.css diff --git a/usability/runtools/icon.png b/nbextensions/usability/runtools/icon.png similarity index 100% rename from usability/runtools/icon.png rename to nbextensions/usability/runtools/icon.png diff --git a/usability/runtools/main.css b/nbextensions/usability/runtools/main.css similarity index 100% rename from usability/runtools/main.css rename to nbextensions/usability/runtools/main.css diff --git a/usability/runtools/main.js b/nbextensions/usability/runtools/main.js similarity index 100% rename from usability/runtools/main.js rename to nbextensions/usability/runtools/main.js diff --git a/usability/runtools/readme.md b/nbextensions/usability/runtools/readme.md similarity index 100% rename from usability/runtools/readme.md rename to nbextensions/usability/runtools/readme.md diff --git a/usability/runtools/runtools.png b/nbextensions/usability/runtools/runtools.png similarity index 100% rename from usability/runtools/runtools.png rename to nbextensions/usability/runtools/runtools.png diff --git a/usability/runtools/runtools.yaml b/nbextensions/usability/runtools/runtools.yaml similarity index 100% rename from usability/runtools/runtools.yaml rename to nbextensions/usability/runtools/runtools.yaml diff --git a/usability/runtools/runtools_execute.png b/nbextensions/usability/runtools/runtools_execute.png similarity index 100% rename from usability/runtools/runtools_execute.png rename to nbextensions/usability/runtools/runtools_execute.png diff --git a/usability/runtools/runtools_marker.png b/nbextensions/usability/runtools/runtools_marker.png similarity index 100% rename from usability/runtools/runtools_marker.png rename to nbextensions/usability/runtools/runtools_marker.png diff --git a/usability/runtools/runtools_nb.png b/nbextensions/usability/runtools/runtools_nb.png similarity index 100% rename from usability/runtools/runtools_nb.png rename to nbextensions/usability/runtools/runtools_nb.png diff --git a/usability/search-replace/icon.png b/nbextensions/usability/search-replace/icon.png similarity index 100% rename from usability/search-replace/icon.png rename to nbextensions/usability/search-replace/icon.png diff --git a/usability/search-replace/main.css b/nbextensions/usability/search-replace/main.css similarity index 100% rename from usability/search-replace/main.css rename to nbextensions/usability/search-replace/main.css diff --git a/usability/search-replace/main.js b/nbextensions/usability/search-replace/main.js similarity index 100% rename from usability/search-replace/main.js rename to nbextensions/usability/search-replace/main.js diff --git a/nbextensions/usability/search-replace/readme.md b/nbextensions/usability/search-replace/readme.md new file mode 100644 index 0000000..16d34de --- /dev/null +++ b/nbextensions/usability/search-replace/readme.md @@ -0,0 +1,8 @@ +This extension provides a notebook-wide search&replace toolbar. + +![before](https://raw.github.com/ipython-contrib/IPython-notebook-extensions/master/usability/search-replace/icon.png) + +It uses the codemirror `search` and `searchcursor` add ons. + +## Installation +Install the master version of the IPython-notebook-extensions repository as explained on the main wiki page. diff --git a/nbextensions/usability/search-replace/search-replace.yaml b/nbextensions/usability/search-replace/search-replace.yaml new file mode 100644 index 0000000..f5b9126 --- /dev/null +++ b/nbextensions/usability/search-replace/search-replace.yaml @@ -0,0 +1,7 @@ +Type: IPython Notebook Extension +Name: Search-Replace +Description: Search and replace +Link: readme.md +Icon: icon.png +Main: main.js +Compatibility: 4.x diff --git a/usability/search.js b/nbextensions/usability/search.js similarity index 100% rename from usability/search.js rename to nbextensions/usability/search.js diff --git a/usability/skip-traceback/icon.png b/nbextensions/usability/skip-traceback/icon.png similarity index 100% rename from usability/skip-traceback/icon.png rename to nbextensions/usability/skip-traceback/icon.png diff --git a/usability/skip-traceback/main.js b/nbextensions/usability/skip-traceback/main.js similarity index 100% rename from usability/skip-traceback/main.js rename to nbextensions/usability/skip-traceback/main.js diff --git a/usability/skip-traceback/readme.md b/nbextensions/usability/skip-traceback/readme.md similarity index 91% rename from usability/skip-traceback/readme.md rename to nbextensions/usability/skip-traceback/readme.md index b9efc6a..921ba1f 100644 --- a/usability/skip-traceback/readme.md +++ b/nbextensions/usability/skip-traceback/readme.md @@ -2,8 +2,8 @@ This extension hides Python tracebacks and only displays the error type an name. ![](https://raw.github.com/ipython-contrib/IPython-notebook-extensions/master/wiki-images/skip-traceback.png) -After loading the extension, only newly executed cells are affected. Previous tracebacks will remain visible until the -corresponding cell is executed again. +After loading the extension, only newly executed cells are affected. Previous tracebacks will remain visible until the + corresponding cell is executed again. If you press the button on the toolbar with the exclamation mark, you can turn on tracebacks again. diff --git a/usability/skip-traceback/skip-traceback.yaml b/nbextensions/usability/skip-traceback/skip-traceback.yaml similarity index 100% rename from usability/skip-traceback/skip-traceback.yaml rename to nbextensions/usability/skip-traceback/skip-traceback.yaml diff --git a/usability/toggle_all_line_number.js b/nbextensions/usability/toggle_all_line_number.js similarity index 100% rename from usability/toggle_all_line_number.js rename to nbextensions/usability/toggle_all_line_number.js diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..7ef1f90 --- /dev/null +++ b/setup.py @@ -0,0 +1,172 @@ +# Install notebook extensions + +from jupyter_core.paths import jupyter_config_dir, jupyter_data_dir +from traitlets.config.loader import Config, JSONFileConfigLoader +import os +import sys +import json +import shutil + +marker = '#--- nbextensions configuration ---' + +if len(sys.argv) == 2 and sys.argv[1] == "install": + print("Installing Jupyter notebook extensions") +else: + print("To install the notebook extensions use 'python setup.py install'") + exit() + + +# http://stackoverflow.com/questions/12683834/how-to-copy-directory-recursively-in-python-and-overwrite-all +def recursive_overwrite(src, dest, ignore=None): + if os.path.isdir(src): + if not os.path.isdir(dest): + os.makedirs(dest) + files = os.listdir(src) + if ignore is not None: + ignored = ignore(src, files) + else: + ignored = set() + for f in files: + if f not in ignored: + recursive_overwrite(os.path.join(src, f), + os.path.join(dest, f), + ignore) + else: + shutil.copyfile(src, dest) + + +def remove_old_config(config): + """ Remove old configuration entries + + :param config: python configuration data + """ + marker_found = [] + lines = config.splitlines() + for i, l in enumerate(lines): + if l.find(marker) >= 0: + marker_found.append(i) + start = marker_found[0] + end = marker_found[-1] + return '\n'.join(lines[0:start] + lines[end+1:]) + + +def update_config(config_file, newconfig_file): + """ Update .py configuration file with new path to extensions + + :param config_file: name of the existing python config file + :param newconfig_file: name of the config file to be written into the existing python config file + """ + if os.path.isfile(config_file) is True: + f = open(config_file, 'r') + config = f.read() + f.close() + else: + config = '' + + # add config + f = open(newconfig_file, 'r') + new_config = f.read() + f.close() + + if config.find(marker) >= 0: + config = remove_old_config(config) + + config = marker + '\n' + new_config + '\n' + marker + '\n' + config + + # write config file + f = open(config_file, 'w') + f.write(config) + f.close() + + +# +# 1. Get the local cofiguration file path +# +config_dir = jupyter_config_dir() +data_dir = jupyter_data_dir() + +print("Configuration files directory: %s" % config_dir) +print("Extensions and templates path: %s" % data_dir) + +# now test if path exists +if os.path.exists(config_dir) is False: + os.mkdir(config_dir) +if os.path.exists(data_dir) is False: + os.mkdir(data_dir) + +# +# 2. Install files +# Indiscriminately copy all files from the nbextensions, extensions and template directories +# Currently there is no other way, because there is no definition of a notebook extension package +# + +# copy extensions to IPython extensions directory +src = 'extensions' +destination = os.path.join(data_dir, 'extensions') +print("Install Python extensions to %s" % destination) +recursive_overwrite(src, destination) + +# Install templates +src = 'templates' +destination = os.path.join(data_dir, 'templates') +print("Install templates to %s" % destination) +recursive_overwrite(src, destination) + +# Install nbextensions +src = 'nbextensions' +destination = os.path.join(data_dir, 'nbextensions') +print("Install notebook extensions to %s" % destination) +recursive_overwrite(src, destination) + + +# +# 3. Update nbconvert configuration +# +json_config = os.path.join(jupyter_config_dir(), 'jupyter_nbconvert_config.json') +print("Configuring %s" % json_config) +if os.path.isfile(json_config) is True: + cl = JSONFileConfigLoader(json_config) + config = cl.load_config() +else: + config = Config() +newconfig = Config() +# Set template path, pre- and postprocessors of notebook extensions +newconfig.Exporter.template_path = [os.path.join(data_dir, 'templates')] +newconfig.Exporter.preprocessors = ["pre_codefolding.CodeFoldingPreprocessor", "pre_pymarkdown.PyMarkdownPreprocessor"] +newconfig.NbConvertApp.postprocessor_class = 'post_embedhtml.EmbedPostProcessor' +config.merge(newconfig) +config.version = 1 +s=json.dumps(config, indent=2, separators=(',', ': '), sort_keys=True) +with open(json_config, 'w') as f: + f.write(s) + +py_config = os.path.join(jupyter_config_dir(), 'jupyter_nbconvert_config.py') +print("Configuring %s" % py_config) + +new_py_config = 'jupyter_nbconvert_config.py' +update_config(py_config, new_py_config) + +# +# 4. Update notebook configuration +# +fname = os.path.join(config_dir, 'jupyter_notebook_config.json') +print("Configuring %s" % fname) +if os.path.isfile(json_config) is True: + cl = JSONFileConfigLoader(json_config) + config = cl.load_config() +else: + config = Config() +newconfig = Config() +# Add server extension of /nbextension/ configuration tool +newconfig.NotebookApp.server_extensions = ["nbextensions"] +config.merge(newconfig) +config.version = 1 +s = json.dumps(config, indent=2, separators=(',', ': '), sort_keys=True) +with open(fname, 'w') as f: + f.write(s) + + py_config = os.path.join(jupyter_config_dir(), 'jupyter_notebook_config.py') +print("Configuring %s" % py_config) + +new_py_config = 'jupyter_notebook_config.py' +update_config(py_config, new_py_config) diff --git a/templates/hide_input.tpl b/templates/hide_input.tpl new file mode 100644 index 0000000..044b0f0 --- /dev/null +++ b/templates/hide_input.tpl @@ -0,0 +1,20 @@ +{%- extends 'slides_reveal.tpl' -%} + +{% block input_group %} +{%- if cell.metadata.input_collapsed -%} +{%- else -%} +
+{{ super() }} +
+{%- endif -%} +{% endblock input_group %} + +{% block output %} +
+{%- if cell.metadata.input_collapsed -%} + {{ super() | strip_output_prompt }} +{%- else -%} + {{ super() }} +{%- endif -%} +
+{% endblock output %} diff --git a/usability/runtools/hide_input_output.tpl b/templates/hide_input_output.tpl similarity index 100% rename from usability/runtools/hide_input_output.tpl rename to templates/hide_input_output.tpl diff --git a/config/nbextensions.html b/templates/nbextensions.html similarity index 95% rename from config/nbextensions.html rename to templates/nbextensions.html index 0601a44..fa518a4 100644 --- a/config/nbextensions.html +++ b/templates/nbextensions.html @@ -1,47 +1,47 @@ -{% extends "page.html" %} - -{% block title %}{{page_title}}{% endblock %} - -{% block stylesheet %} -{{super()}} -{% endblock %} - -{% block params %} - -data-base-url='{{base_url}}' -data-extension-list='{{extension_list}}' - -{% endblock %} - -{% block headercontainer %} - -
- -
- - -{% endblock %} - -{% block header %} - -{% endblock %} - -{% block site %} - -
- -{% endblock %} - -{% block script %} - - {{super()}} - - -{% endblock %} +{% extends "page.html" %} + +{% block title %}{{page_title}}{% endblock %} + +{% block stylesheet %} +{{super()}} +{% endblock %} + +{% block params %} + +data-base-url='{{base_url}}' +data-extension-list='{{extension_list}}' + +{% endblock %} + +{% block headercontainer %} + +
+ +
+ + +{% endblock %} + +{% block header %} + +{% endblock %} + +{% block site %} + +
+ +{% endblock %} + +{% block script %} + + {{super()}} + + +{% endblock %} diff --git a/config/rendermd.html b/templates/rendermd.html similarity index 100% rename from config/rendermd.html rename to templates/rendermd.html diff --git a/tests/data/Untitled.ipynb b/tests/data/Untitled.ipynb new file mode 100644 index 0000000..ace058d --- /dev/null +++ b/tests/data/Untitled.ipynb @@ -0,0 +1,59 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a=1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Markdown Cell" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/tests/data/icon.png b/tests/data/icon.png new file mode 100644 index 0000000..09d28ac Binary files /dev/null and b/tests/data/icon.png differ diff --git a/tests/test-postprocessors.py b/tests/test-postprocessors.py new file mode 100644 index 0000000..e69de29 diff --git a/usability/dragdrop/embed.py b/usability/dragdrop/embed.py deleted file mode 100644 index 9715ecd..0000000 --- a/usability/dragdrop/embed.py +++ /dev/null @@ -1,53 +0,0 @@ -"""PostProcessor for embedding markdown images in HTML files.""" -from __future__ import print_function -#----------------------------------------------------------------------------- -#Copyright (c) 2013, the IPython Development Team. -# -#Distributed under the terms of the Modified BSD License. -# -#The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import os -import re -import base64 -import urllib - -from IPython.utils.traitlets import Bool, Unicode, Int - -from IPython.nbconvert.postprocessors.base import PostProcessorBase - - -class EmbedPostProcessor(PostProcessorBase): - """Post processor designed to embed images in markdown cells - as base64 encoded blob in HTML file - """ - - def replfunc(self, match): - """ replace source url or file link with base64 encoded blob - """ - url = match.group(1) - imgformat = url.split('.')[-1] - self.log.info("embedding url: %s, format: %s" % (url, imgformat)) - data = urllib.urlopen(url).read() - b64_data=base64.b64encode(data) - if imgformat == "svg": - img = '
' + data + '
' - img = '' - else: - img = '' - return img - - def postprocess(self, input): - regex = re.compile('') - ext = input.split('.')[-1] - output=input[0:-(len(ext)+1)] + '-embedded.' + ext - with open(input) as fin, open(output,'w') as fout: - for line in fin: - fout.write(regex.sub(self.replfunc,line)) - fin.close() - fout.close() diff --git a/usability/dragdrop/main.js b/usability/dragdrop/main.js deleted file mode 100644 index 6c30bab..0000000 --- a/usability/dragdrop/main.js +++ /dev/null @@ -1,163 +0,0 @@ -// Allow drag&drop of images into a notebook -// Tested with Firefox and Chrome - -define([ - 'base/js/namespace', - 'jquery', - "base/js/events" -], function(IPython, $, events) { - "use strict"; - - /* http://stackoverflow.com/questions/3231459/create-unique-id-with-javascript */ - function uniqueid(){ - // always start with a letter (for DOM friendlyness) - var idstr=String.fromCharCode(Math.floor((Math.random()*25)+65)); - do { - // between numbers and characters (48 is 0 and 90 is Z (42-48 = 90) - var ascicode=Math.floor((Math.random()*42)+48); - if (ascicode<58 || ascicode>64){ - // exclude all chars between : (58) and @ (64) - idstr+=String.fromCharCode(ascicode); - } - } while (idstr.length<32); - - return (idstr); - } - - var send_to_server = function(name,path,msg) { - if (name == '') { - name = uniqueid() + '.' + msg.match(/data:image\/(\S+);/)[1]; - } - path = path.substring(0, path.lastIndexOf('/')) + '/'; - if (path === '/') path = ''; - var url = '//' + location.host + '/api/contents/' + path + name; - var img = msg.replace(/(^\S+,)/, ''); // strip header - //console.log("send_to_server:", url, img); - var data = {'name': name, 'format':'base64', 'content': img, 'type': 'file'}; - var settings = { - processData : false, - cache : false, - type : "PUT", - dataType : "json", - data : JSON.stringify(data), - headers : {'Content-Type': 'text/plain'}, - async : false, - success : function (data, status, xhr) { - var new_cell = IPython.notebook.insert_cell_below('markdown'); - var str = ''; - new_cell.set_text(str); - new_cell.execute(); - }, - error : function() {console.log('Data transfer for drag-and-drop failed.'); } - }; - $.ajax(url, settings); - }; - - /* the dragover event needs to be canceled to allow firing the drop event */ - window.addEventListener('dragover', function(event){ - if (event.preventDefault) { - event.preventDefault(); - } - }); - - /* allow dropping an image in notebook */ - window.addEventListener('drop', function(event){ - var cell = IPython.notebook.get_selected_cell(); - event.preventDefault(); - if(event.stopPropagation) {event.stopPropagation();} - if (event.dataTransfer.items != undefined) { - /* Chrome here */ - var items = event.dataTransfer.items; - for (var i = 0; i < items.length; i++) { - /* data coming from local file system, must be an image to allow dropping*/ - if (items[i].kind == 'file' && items[i].type.indexOf('image/') !== -1) { - - var blob = items[i].getAsFile(); - var filename = blob.name; - var reader = new FileReader(); - reader.onload = ( function(evt) { - send_to_server(filename, IPython.notebook.notebook_path, evt.target.result); - if(event.stopPropagation) {event.stopPropagation();} - } ); - reader.readAsDataURL(blob); - } else { - console.log("Unsupported type:", items[i].kind); - } - } - } else { - /* Firefox here */ - var files = event.dataTransfer.files; - if (files.length == 0) { - var filename = event.dataTransfer.getData('application/x-moz-file-promise-dest-filename'); - var data = event.dataTransfer.getData('text/plain'); - if (filename.length == 0) { - url = ""; - filename = ''; - } else { - url = data; - data = ""; - } - /* data coming from browser: - * url - image is given as an url - * data - image is a base64 blob - */ - //console.log("type:",url," name:", filename," path:", IPython.notebook.notebook_path," url:", url); - send_to_server(filename, IPython.notebook.notebook_path, data); - return; - } - /* data coming from local file system, must be an image to allow dropping*/ - for (var i=0; i < files.length; i++) { - var blob = event.dataTransfer.files[0]; - if (blob.type.indexOf('image/') !== -1) { - var filename = blob.name; - var url = event.view.location.origin; - var reader = new FileReader(); - reader.onload = ( function(evt) { - //console.log("file"," name:", filename," path:", IPython.notebook.notebook_path," url:", url); - send_to_server(filename, IPython.notebook.notebook_path, evt.target.result); - event.preventDefault(); - } ); - reader.readAsDataURL(blob); - } else { - console.log("Unsupported type:", blob.type); - } - - } - } - }); - - /* - * make sure we do not drop images into a codemirror text field - */ - var checktype = function(cm,event) { - if (event.dataTransfer.items != undefined) - { - event.codemirrorIgnore = true; - } - var blob = event.dataTransfer.files[0]; - - if (event.dataTransfer.files.length > 0 && blob.type.indexOf('image/') !== -1) { - event.codemirrorIgnore = true; - } - }; - - var create_cell = function (event,nbcell,nbindex) { - var cell = nbcell.cell; - if ((cell instanceof IPython.CodeCell)) { - cell.code_mirror.on('drop', checktype); - } - }; - - var cells = IPython.notebook.get_cells(); - for(var i in cells){ - var cell = cells[i]; - if ((cell instanceof IPython.CodeCell)) { - cell.code_mirror.on('drop', checktype); - } - } - - events.on('create.Cell',create_cell); -}); - - - diff --git a/usability/dragdrop/readme.md b/usability/dragdrop/readme.md deleted file mode 100644 index a5cc65e..0000000 --- a/usability/dragdrop/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -This IPython notebook extension allows dragging&dropping images from the desktop or other programs into a notebook. -A new markdown cell is created below the currently selected cell and the image is embedded. -The notebook has been tested with Firefox and Chrome. - -A demo video showing drag&drop of images is here: -http://youtu.be/buAL1bTZ73c - -## Installation - -You can manually load the extension from within the IPyton notebook: -```javascript -%%javascript -IPython.load_extensions('nbextensions/usability/dragdrop'); -``` - -For installation instructions using the nbextensions config tool, please see the -[Readme](/rendermd/nbextensions/config/readme.md) - -## Internals -The image will be uploaded to the server into the directory where your notebook resides. This means, the image is not -copied into the notebook itself, it will only be linked to. The markdown cell in the notebook will contain this tag: -`` - -If you run `nbconvert` to generate a HTML file, this image will remain outside of the html file. You can embedd all -images by calling `nbconvert` with the option `--post=embed.EmbedPostProcessor`. The file `embed.py`, located in the -same directory of this extension needs to be in `PYTHONPATH` to be found. \ No newline at end of file diff --git a/usability/navigation-hotkeys/main.js b/usability/navigation-hotkeys/main.js deleted file mode 100644 index 82bd9ad..0000000 --- a/usability/navigation-hotkeys/main.js +++ /dev/null @@ -1,206 +0,0 @@ -// add custom shortcuts - -"use strict"; - -var add_command_shortcuts = { - 'esc' : { - help : 'edit mode', - help_index : 'aa', - handler : function (event) { - IPython.notebook.edit_mode(); - return false; - } - }, - - 'home' : { - help : 'go to top', - help_index : 'ga', - handler : function (event) { - IPython.notebook.select(0); - IPython.notebook.scroll_to_top() - return false; - } - }, - - 'end' : { - help : 'go to bottom', - help_index : 'ga', - handler : function (event) { - var ncells = IPython.notebook.ncells(); - IPython.notebook.select(ncells-1); - IPython.notebook.scroll_to_bottom() - return false; - } - }, - - 'pageup' : { - help : 'page up', - help_index : 'aa', - handler : function (event) { - var wh = 0.6 * $(window).height(); - var cell = IPython.notebook.get_selected_cell(); - var h = 0; - /* loop until we have enough cells to span the size of the notebook window (= one page) */ - do { - h += cell.element.height(); - IPython.notebook.select_prev(); - cell = IPython.notebook.get_selected_cell(); - } while ( h < wh ) - var cp = cell.element.position(); - var sp = $('body').scrollTop(); - if ( cp.top < sp) { - IPython.notebook.scroll_to_cell(IPython.notebook.get_selected_index()); - } - cell.focus_cell(); - return false; - } - }, - - 'pagedown' : { - help : 'page down', - help_index : 'aa', - handler : function (event) { - - /* jump to bottom if we are already in the last cell */ - var ncells = IPython.notebook.ncells(); - if ( IPython.notebook.get_selected_index()+1 == ncells) { - IPython.notebook.scroll_to_bottom(); - return false; - } - - var wh = 0.6*$(window).height(); - var cell = IPython.notebook.get_selected_cell(); - var h = 0; - - /* loop until we have enough cells to span the size of the notebook window (= one page) */ - do { - h += cell.element.height(); - IPython.notebook.select_next(); - cell = IPython.notebook.get_selected_cell(); - } while ( h < wh ) - cell.focus_cell(); - return false; - } - }, - }; - -IPython.keyboard_manager.command_shortcuts.add_shortcuts(add_command_shortcuts); - -var add_edit_shortcuts = { - 'Alt-add' : { - help : 'split cell', - help_index : 'eb', - handler : function (event) { - IPython.notebook.split_cell(); - IPython.notebook.edit_mode(); - return false; - } - }, - 'alt-subtract' : { - help : 'merge cell', - help_index : 'eb', - handler : function (event) { - var i = IPython.notebook.get_selected_index(); - if (i > 0) { - var c = IPython.notebook.get_cell(i-1); - var l = c.code_mirror.lineCount(); - IPython.notebook.merge_cell_above(); - var c = IPython.notebook.get_selected_cell(); - c.code_mirror.setCursor(l,0); - } - } - }, - 'shift-enter' : { - help : 'run cell, select next codecell', - help_index : 'bb', - handler : function (event) { - IPython.notebook.execute_cell_and_select_below(); - var rendered = IPython.notebook.get_selected_cell().rendered; - var ccell = IPython.notebook.get_selected_cell().cell_type; - if (rendered === false || ccell === 'code') IPython.notebook.edit_mode(); - return false; - } - }, - 'ctrl-enter' : { - help : 'run cell', - help_index : 'bb', - handler : function (event) { - var cell = event.notebook.get_selected_cell(); - var mode = cell.mode; - cell.execute(); - if (mode === "edit") IPython.notebook.edit_mode(); - return false; - } - }, - 'alt-n' : { - help : 'toggle line numbers', - help_index : 'xy', - handler : function (event) { - var cell = IPython.notebook.get_selected_cell(); - cell.toggle_line_numbers(); - return false; - } - }, - 'pagedown' : { - help : 'page down', - help_index : 'xy', - handler : function (event) { - - var ic = IPython.notebook.get_selected_index(); - var cells = IPython.notebook.get_cells(); - var i, h=0; - for (i=0; i < ic; i ++) { - var cell=cells[i]; - h += cell.element.height(); - } - var cell = cells[ic]; - var cur =cell.code_mirror.getCursor(); - h += cell.code_mirror.defaultTextHeight() * cur.line; - IPython.notebook.element.animate({scrollTop:h}, 0); - return false; - } - }, - 'pageup' : { - help : 'page down', - help_index : 'xy', - handler : function (event) { - - var ic = IPython.notebook.get_selected_index(); - var cells = IPython.notebook.get_cells(); - var i, h=0; - for (i=0; i < ic; i ++) { - var cell=cells[i]; - h += cell.element.height(); - } - var cell = cells[ic]; - var cur =cell.code_mirror.getCursor(); - h += cell.code_mirror.defaultTextHeight() * cur.line; - IPython.notebook.element.animate({scrollTop:h}, 0); - return false; - } - }, - 'ctrl-y' : { - help : 'toggle markdown/code', - handler : function (event) { - var cell = IPython.notebook.get_selected_cell(); - if (cell.cell_type == 'code') { - var cur = cell.code_mirror.getCursor(); - IPython.notebook.command_mode(); - IPython.notebook.to_markdown(); - IPython.notebook.edit_mode(); - cell = IPython.notebook.get_selected_cell(); - cell.code_mirror.setCursor(cur); - } else if (cell.cell_type == 'markdown') { - var cur = cell.code_mirror.getCursor(); - IPython.notebook.command_mode(); - IPython.notebook.to_code(); - IPython.notebook.edit_mode(); - cell = IPython.notebook.get_selected_cell(); - cell.code_mirror.setCursor(cur); - } - return false; - } - }, - }; - -IPython.keyboard_manager.edit_shortcuts.add_shortcuts(add_edit_shortcuts); diff --git a/usability/python-markdown/python-markdown-post.png b/usability/python-markdown/python-markdown-post.png deleted file mode 100644 index 3c95198..0000000 Binary files a/usability/python-markdown/python-markdown-post.png and /dev/null differ diff --git a/usability/python-markdown/python-markdown-pre.png b/usability/python-markdown/python-markdown-pre.png deleted file mode 100644 index 5226d95..0000000 Binary files a/usability/python-markdown/python-markdown-pre.png and /dev/null differ diff --git a/wiki-images/breakpoint_ext.png b/wiki-images/breakpoint_ext.png deleted file mode 100644 index de4ef89..0000000 Binary files a/wiki-images/breakpoint_ext.png and /dev/null differ diff --git a/wiki-images/breakpoint_ext_buttons.png b/wiki-images/breakpoint_ext_buttons.png deleted file mode 100644 index e932750..0000000 Binary files a/wiki-images/breakpoint_ext_buttons.png and /dev/null differ diff --git a/wiki-images/cellstate-1.png b/wiki-images/cellstate-1.png deleted file mode 100644 index a978978..0000000 Binary files a/wiki-images/cellstate-1.png and /dev/null differ diff --git a/wiki-images/cellstate-2.png b/wiki-images/cellstate-2.png deleted file mode 100644 index bc07c55..0000000 Binary files a/wiki-images/cellstate-2.png and /dev/null differ diff --git a/wiki-images/cellstate-3.png b/wiki-images/cellstate-3.png deleted file mode 100644 index e964bc5..0000000 Binary files a/wiki-images/cellstate-3.png and /dev/null differ diff --git a/wiki-images/codefolding_firstline_folded.png b/wiki-images/codefolding_firstline_folded.png deleted file mode 100644 index 4ce9908..0000000 Binary files a/wiki-images/codefolding_firstline_folded.png and /dev/null differ diff --git a/wiki-images/codefolding_firstline_unfolded.png b/wiki-images/codefolding_firstline_unfolded.png deleted file mode 100644 index f421e00..0000000 Binary files a/wiki-images/codefolding_firstline_unfolded.png and /dev/null differ diff --git a/wiki-images/codefolding_indent_folded_1.png b/wiki-images/codefolding_indent_folded_1.png deleted file mode 100644 index e5b98b7..0000000 Binary files a/wiki-images/codefolding_indent_folded_1.png and /dev/null differ diff --git a/wiki-images/codefolding_indent_folded_2.png b/wiki-images/codefolding_indent_folded_2.png deleted file mode 100644 index 287e292..0000000 Binary files a/wiki-images/codefolding_indent_folded_2.png and /dev/null differ diff --git a/wiki-images/codefolding_indent_unfolded.png b/wiki-images/codefolding_indent_unfolded.png deleted file mode 100644 index 0e07bb7..0000000 Binary files a/wiki-images/codefolding_indent_unfolded.png and /dev/null differ diff --git a/wiki-images/execution-timings-box.png b/wiki-images/execution-timings-box.png deleted file mode 100644 index 401edc0..0000000 Binary files a/wiki-images/execution-timings-box.png and /dev/null differ diff --git a/wiki-images/execution-timings-menu.png b/wiki-images/execution-timings-menu.png deleted file mode 100644 index fa129d3..0000000 Binary files a/wiki-images/execution-timings-menu.png and /dev/null differ diff --git a/wiki-images/help_panel_ext.png b/wiki-images/help_panel_ext.png deleted file mode 100644 index d932aa2..0000000 Binary files a/wiki-images/help_panel_ext.png and /dev/null differ diff --git a/wiki-images/help_panel_ext_button.png b/wiki-images/help_panel_ext_button.png deleted file mode 100644 index 55d51b3..0000000 Binary files a/wiki-images/help_panel_ext_button.png and /dev/null differ diff --git a/wiki-images/hide_input_all_hide.png b/wiki-images/hide_input_all_hide.png deleted file mode 100644 index a15486a..0000000 Binary files a/wiki-images/hide_input_all_hide.png and /dev/null differ diff --git a/wiki-images/hide_input_all_show.png b/wiki-images/hide_input_all_show.png deleted file mode 100644 index 8d7e030..0000000 Binary files a/wiki-images/hide_input_all_show.png and /dev/null differ diff --git a/wiki-images/nbconvert-button.png b/wiki-images/nbconvert-button.png deleted file mode 100644 index d466a72..0000000 Binary files a/wiki-images/nbconvert-button.png and /dev/null differ diff --git a/wiki-images/notebook-configuration.png b/wiki-images/notebook-configuration.png deleted file mode 100644 index 0cfb705..0000000 Binary files a/wiki-images/notebook-configuration.png and /dev/null differ diff --git a/wiki-images/printview-button.png b/wiki-images/printview-button.png deleted file mode 100644 index e98073d..0000000 Binary files a/wiki-images/printview-button.png and /dev/null differ diff --git a/wiki-images/python-markdown-post.png b/wiki-images/python-markdown-post.png deleted file mode 100644 index 3c95198..0000000 Binary files a/wiki-images/python-markdown-post.png and /dev/null differ diff --git a/wiki-images/python-markdown-pre.png b/wiki-images/python-markdown-pre.png deleted file mode 100644 index 5226d95..0000000 Binary files a/wiki-images/python-markdown-pre.png and /dev/null differ diff --git a/wiki-images/read_only_ext.png b/wiki-images/read_only_ext.png deleted file mode 100644 index 5df3a5f..0000000 Binary files a/wiki-images/read_only_ext.png and /dev/null differ diff --git a/wiki-images/runtools.png b/wiki-images/runtools.png deleted file mode 100644 index 234357b..0000000 Binary files a/wiki-images/runtools.png and /dev/null differ diff --git a/wiki-images/runtools_execute.png b/wiki-images/runtools_execute.png deleted file mode 100644 index f3d649b..0000000 Binary files a/wiki-images/runtools_execute.png and /dev/null differ diff --git a/wiki-images/runtools_marker.png b/wiki-images/runtools_marker.png deleted file mode 100644 index 72a22b9..0000000 Binary files a/wiki-images/runtools_marker.png and /dev/null differ diff --git a/wiki-images/runtools_nb.png b/wiki-images/runtools_nb.png deleted file mode 100644 index 7a783d6..0000000 Binary files a/wiki-images/runtools_nb.png and /dev/null differ diff --git a/wiki-images/toggle_codecells.png b/wiki-images/toggle_codecells.png deleted file mode 100644 index 1457de9..0000000 Binary files a/wiki-images/toggle_codecells.png and /dev/null differ