diff --git a/docs/source/_static/images/cell-tags-toolbar.png b/docs/source/_static/images/cell-tags-toolbar.png
new file mode 100644
index 000000000..5058ef872
Binary files /dev/null and b/docs/source/_static/images/cell-tags-toolbar.png differ
diff --git a/docs/source/_static/images/shortcut-editor.png b/docs/source/_static/images/shortcut-editor.png
new file mode 100644
index 000000000..7efd2be9a
Binary files /dev/null and b/docs/source/_static/images/shortcut-editor.png differ
diff --git a/docs/source/_static/images/table-style-change.png b/docs/source/_static/images/table-style-change.png
new file mode 100644
index 000000000..46c139fe4
Binary files /dev/null and b/docs/source/_static/images/table-style-change.png differ
diff --git a/docs/source/_static/images/table-style-change.xcf b/docs/source/_static/images/table-style-change.xcf
new file mode 100644
index 000000000..dd34ce265
Binary files /dev/null and b/docs/source/_static/images/table-style-change.xcf differ
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index 0b6277dd5..99637d7e1 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -24,52 +24,93 @@ Upgrade to version 9+ of pip before upgrading ``notebook`` is strongly recommend
.. _release-5.0.0:
Notebook version 5.0
-====================
+--------------------
-This is the first major release of the Notebook Application and Server after
-the version 4.0 created by the "Big Split" of IPython into IPython and Jupyter.
+This is the first major release of the Jupyter Notebook since version 4.0 was
+created by the "Big Split" of IPython and Jupyter.
We encourage users to start trying JupyterLab in preparation for a future
transition.
-The Notebook Web Application and Server have seen more than 200 pull requests
-merged since the 4.x series. This only covers a small subset of the new
-features available on this new version; bugfixes are omitted.
+We have merged more than 200 pull requests since the 4.x series. Some of the
+major user-facing changes are described here.
-- Dashboard/tree can now be ordered by ``last-modified`` and ``name``,
- (:ghpull:`943`)
+Cell tags
+*********
-- Keyboard shortcuts for command mode are now editable from within the UI, see
- the ``Help > Edit Keyboard Shortcuts`` Menu item and follow instructions.
- (:ghpull:`1347`)
+There is a new cell toolbar for adding *cell tags* (:ghpull:`2048`):
+.. image:: /_static/images/cell-tags-toolbar.png
+ :align: center
-- Markdown cells now supports attachments. Simply drag and drop an image from
+Cell tags are a lightweight way to customise the behaviour of tools working with
+notebooks; we're working on building support for them into tools like `nbconvert
+`__ and `nbval
+`__.
+
+The UI for editing cell tags is basic for now; we hope to improve it in future
+releases.
+
+Table style
+***********
+
+The default styling for tables in the notebook has been updated (:ghpull:`1776`):
+
+.. image:: /_static/images/table-style-change.png
+ :align: center
+
+Customise keyboard shortcuts
+****************************
+
+You can now edit keyboard shortcuts for command mode within the UI
+(:ghpull:`1347`):
+
+.. image:: /_static/images/shortcut-editor.png
+ :align: center
+
+See the ``Help > Edit Keyboard Shortcuts`` menu item and follow the instructions.
+
+Other additions
+***************
+
+- You can copy and paste cells between notebooks, using :kbd:`Ctrl-C` and
+ :kbd:`Ctrl-V` (:kbd:`Cmd-C` and :kbd:`Cmd-V` on Mac).
+
+- It's easier to configure a password for the notebook with the new
+ ``jupyter notebook password`` command (:ghpull:`2007`).
+
+- The file list can now be ordered by *last modified* or by *name*
+ (:ghpull:`943`).
+
+- Markdown cells now support attachments. Simply drag and drop an image from
your desktop to a markdown cell to add it. Unlike relative links that you
- enter manually, attachments are embedded in the notebook itself. A
- non-referenced attachment will be automatically scrubbed from the notebook on
- save. :ghpull:`621`
+ enter manually, attachments are embedded in the notebook itself. An
+ unreferenced attachment will be automatically scrubbed from the notebook on
+ save (:ghpull:`621`).
+- Undoing cell deletion now supports undeleting multiple cells. Cells may not be
+ in the same order as before their deletion, depending on the actions you did
+ on the meantime, but this should should help reduce the impact of
+ accidentally deleting code.
-- Undoing cell deletion now supports undeleting multiple cells. Cell may not be
- in the same order as before their deletion depending on the actions you did
- on the meantime, but this should should help minimize the impact of
- accidental code deletion.
+- The file browser now has *Edit* and *View* buttons.
-- Dashboard now has ``edit`` and ``view`` buttons.
+- The file browser now supports moving multiple files at once
+ (:ghpull:`1088`).
-- The Dashboard/Tree view now supports moving multiple files at once.
- :ghpull:`1088`
+- The Notebook will refuse to run as root unless the ``--allow-root`` flag is
+ given (:ghpull:`1115`).
-- Notebook refuses to run as root user (unless forced to) :ghpull:`1115`
+- Keyboard shortcuts are now declarative (:ghpull:`1234`).
-- Keyboard shortcuts are now declarative (:ghpull:`1234`)
+- Toggling line numbers can now affect all cells (:ghpull:`1312`).
-- Toggling line numbers can now affect all cells (:ghpull:`1312`)
+- Add more visible *Trusted* and *Untrusted* notifications (:ghpull:`1658`).
-- Add more visible ``Trusted`` and ``Untrusted`` notifications :ghpull:`1658`
+- The tab icon in the browser now changes to indicate when the kernel is busy
+ (:ghpull:`1837`).
-We remind readers that upgrading ``notebook`` only affect part of the user
+Remember that upgrading ``notebook`` only affects the user
interface. Upgrading kernels and libraries may also provide new features,
better stability and integration with the notebook interface.
@@ -161,7 +202,7 @@ Bug fixes:
Other improvements:
-- Allow JSON output data with mime type "application/*+json"
+- Allow JSON output data with mime type ``application/*+json``
- Allow kernelspecs to have spaces in them for backward compat
- Allow websocket connections from scripts
- Allow :code:`None` for post_save_hook
diff --git a/docs/source/conf.py b/docs/source/conf.py
index f190444f5..c82a2344b 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -30,6 +30,8 @@ for item in sys.path:
# add repo root to sys.path
# here = root/docs/source
here = os.path.abspath(os.path.dirname(__file__))
+sphinxext = os.path.join(os.path.dirname(here), 'sphinxext')
+sys.path.insert(0, sphinxext)
repo_root = os.path.dirname(os.path.dirname(here))
sys.path.insert(0, repo_root)
@@ -70,6 +72,7 @@ extensions = [
'sphinx.ext.mathjax',
'IPython.sphinxext.ipython_console_highlighting',
'nbsphinx',
+ 'github',
]
# Add any paths that contain templates here, relative to this directory.
@@ -91,6 +94,9 @@ project = 'Jupyter Notebook'
copyright = '2015, Jupyter Team, https://jupyter.org'
author = 'The Jupyter Team'
+# ghissue config
+github_project_url = "https://github.com/jupyter/notebook"
+
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
diff --git a/docs/sphinxext/github.py b/docs/sphinxext/github.py
new file mode 100644
index 000000000..8f0ffc0d9
--- /dev/null
+++ b/docs/sphinxext/github.py
@@ -0,0 +1,157 @@
+"""Define text roles for GitHub
+
+* ghissue - Issue
+* ghpull - Pull Request
+* ghuser - User
+
+Adapted from bitbucket example here:
+https://bitbucket.org/birkenfeld/sphinx-contrib/src/tip/bitbucket/sphinxcontrib/bitbucket.py
+
+Authors
+-------
+
+* Doug Hellmann
+* Min RK
+"""
+#
+# Original Copyright (c) 2010 Doug Hellmann. All rights reserved.
+#
+
+from docutils import nodes, utils
+from docutils.parsers.rst.roles import set_classes
+
+def make_link_node(rawtext, app, type, slug, options):
+ """Create a link to a github resource.
+
+ :param rawtext: Text being replaced with link node.
+ :param app: Sphinx application context
+ :param type: Link type (issues, changeset, etc.)
+ :param slug: ID of the thing to link to
+ :param options: Options dictionary passed to role func.
+ """
+
+ try:
+ base = app.config.github_project_url
+ if not base:
+ raise AttributeError
+ if not base.endswith('/'):
+ base += '/'
+ except AttributeError as err:
+ raise ValueError('github_project_url configuration value is not set (%s)' % str(err))
+
+ ref = base + type + '/' + slug + '/'
+ set_classes(options)
+ prefix = "#"
+ if type == 'pull':
+ prefix = "PR " + prefix
+ node = nodes.reference(rawtext, prefix + utils.unescape(slug), refuri=ref,
+ **options)
+ return node
+
+def ghissue_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
+ """Link to a GitHub issue.
+
+ Returns 2 part tuple containing list of nodes to insert into the
+ document and a list of system messages. Both are allowed to be
+ empty.
+
+ :param name: The role name used in the document.
+ :param rawtext: The entire markup snippet, with role.
+ :param text: The text marked with the role.
+ :param lineno: The line number where rawtext appears in the input.
+ :param inliner: The inliner instance that called us.
+ :param options: Directive options for customization.
+ :param content: The directive content for customization.
+ """
+
+ try:
+ issue_num = int(text)
+ if issue_num <= 0:
+ raise ValueError
+ except ValueError:
+ msg = inliner.reporter.error(
+ 'GitHub issue number must be a number greater than or equal to 1; '
+ '"%s" is invalid.' % text, line=lineno)
+ prb = inliner.problematic(rawtext, rawtext, msg)
+ return [prb], [msg]
+ app = inliner.document.settings.env.app
+ #app.info('issue %r' % text)
+ if 'pull' in name.lower():
+ category = 'pull'
+ elif 'issue' in name.lower():
+ category = 'issues'
+ else:
+ msg = inliner.reporter.error(
+ 'GitHub roles include "ghpull" and "ghissue", '
+ '"%s" is invalid.' % name, line=lineno)
+ prb = inliner.problematic(rawtext, rawtext, msg)
+ return [prb], [msg]
+ node = make_link_node(rawtext, app, category, str(issue_num), options)
+ return [node], []
+
+def ghuser_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
+ """Link to a GitHub user.
+
+ Returns 2 part tuple containing list of nodes to insert into the
+ document and a list of system messages. Both are allowed to be
+ empty.
+
+ :param name: The role name used in the document.
+ :param rawtext: The entire markup snippet, with role.
+ :param text: The text marked with the role.
+ :param lineno: The line number where rawtext appears in the input.
+ :param inliner: The inliner instance that called us.
+ :param options: Directive options for customization.
+ :param content: The directive content for customization.
+ """
+ app = inliner.document.settings.env.app
+ #app.info('user link %r' % text)
+ ref = 'https://www.github.com/' + text
+ node = nodes.reference(rawtext, text, refuri=ref, **options)
+ return [node], []
+
+def ghcommit_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
+ """Link to a GitHub commit.
+
+ Returns 2 part tuple containing list of nodes to insert into the
+ document and a list of system messages. Both are allowed to be
+ empty.
+
+ :param name: The role name used in the document.
+ :param rawtext: The entire markup snippet, with role.
+ :param text: The text marked with the role.
+ :param lineno: The line number where rawtext appears in the input.
+ :param inliner: The inliner instance that called us.
+ :param options: Directive options for customization.
+ :param content: The directive content for customization.
+ """
+ app = inliner.document.settings.env.app
+ #app.info('user link %r' % text)
+ try:
+ base = app.config.github_project_url
+ if not base:
+ raise AttributeError
+ if not base.endswith('/'):
+ base += '/'
+ except AttributeError as err:
+ raise ValueError('github_project_url configuration value is not set (%s)' % str(err))
+
+ ref = base + text
+ node = nodes.reference(rawtext, text[:6], refuri=ref, **options)
+ return [node], []
+
+
+def setup(app):
+ """Install the plugin.
+
+ :param app: Sphinx application context.
+ """
+ app.info('Initializing GitHub plugin')
+ app.add_role('ghissue', ghissue_role)
+ app.add_role('ghpull', ghissue_role)
+ app.add_role('ghuser', ghuser_role)
+ app.add_role('ghcommit', ghcommit_role)
+ app.add_config_value('github_project_url', None, 'env')
+
+ metadata = {'parallel_read_safe': True, 'parallel_write_safe': True}
+ return metadata