{
 "metadata": {
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Widget related imports\n",
      "from IPython.html import widgets\n",
      "from IPython.display import display, clear_output, Javascript\n",
      "from IPython.utils.traitlets import Unicode\n",
      "\n",
      "# nbconvert related imports\n",
      "from IPython.nbconvert import get_export_names, export_by_name\n",
      "from IPython.nbconvert.writers import FilesWriter\n",
      "from IPython.nbformat import current\n",
      "from IPython.nbconvert.utils.exceptions import ConversionException"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Create a text Widget without displaying it.  The widget will be used to store the notebook's name which is otherwise only available in the front-end."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "notebook_name = widgets.TextWidget()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Get the current notebook's name by pushing JavaScript to the browser that sets the notebook name in a string widget."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "js = \"\"\"var model = IPython.notebook.kernel.widget_manager.get_model('{model_id}');\n",
      "model.set('value', IPython.notebook.notebook_name);\n",
      "model.save();\"\"\".format(model_id=notebook_name.model_id)\n",
      "display(Javascript(data=js))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "javascript": [
        "var model = IPython.notebook.kernel.widget_manager.get_model('8c6583524eb3422c99491730a3e1ce6c');\n",
        "model.set('value', IPython.notebook.notebook_name);\n",
        "model.save();"
       ],
       "metadata": {},
       "output_type": "display_data",
       "text": [
        "<IPython.core.display.Javascript at 0x164ea50>"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "filename = notebook_name.value\n",
      "filename"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 4,
       "text": [
        "u'Export As (nbconvert).ipynb'"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Create the widget that will allow the user to Export the current notebook."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "exporter_names = widgets.DropdownWidget(values=get_export_names(), value='html')\n",
      "export_button = widgets.ButtonWidget(description=\"Export\")\n",
      "download_link = widgets.HTMLWidget(visible=False)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Export the notebook when the export button is clicked."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "file_writer = FilesWriter()\n",
      "\n",
      "def export(name, nb):\n",
      "    \n",
      "    # Get a unique key for the notebook and set it in the resources object.\n",
      "    notebook_name = name[:name.rfind('.')]\n",
      "    resources = {}\n",
      "    resources['unique_key'] = notebook_name\n",
      "    resources['output_files_dir'] = '%s_files' % notebook_name\n",
      "\n",
      "    # Try to export\n",
      "    try:\n",
      "        output, resources = export_by_name(exporter_names.value, nb)\n",
      "    except ConversionException as e:\n",
      "        download_link.value = \"<br>Could not export notebook!\"\n",
      "    else:\n",
      "        write_results = file_writer.write(output, resources, notebook_name=notebook_name)\n",
      "    \n",
      "        download_link.value = \"<br>Results: <a href='files/{filename}'><i>\\\"{filename}\\\"</i></a>\".format(filename=write_results)\n",
      "        download_link.visible = True\n",
      "        \n",
      "def handle_export(widget):\n",
      "    with open(filename, 'r') as f:\n",
      "        export(filename, current.read(f, 'json'))\n",
      "export_button.on_click(handle_export)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Display the controls."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "display(exporter_names, export_button, download_link)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    }
   ],
   "metadata": {}
  }
 ]
}
