This is a long post so I'm putting a summary at the start.

1. Leo can provide a very good way for a user to create and edit Juptyer 
notebooks.
2. The exploratory work for @jupytext files does not provide a proper 
Leonine experience.
3. The usual Leo approach is weak when it comes to working with 
documentation, and documentation mixed with code, in contrast to progams, 
itemized lists, and the like where Leo is strong.
4. This weaknesss can be overcome and there is a discussion of how and why, 
and some design suggestions.

There has been a flurry of activity in the last few weeks to add an ability 
for working with Jupyter notebooks by means of an intermediate file format. 
 That format is provided by the JupyText program.  However, in the rush no 
one seems to have thought much about what Leo can bring to the table, or 
why anyone would want to use Leo for this purpose, compared let's say with 
the Jupyter plugin for Visual Studio Code, which seems very good and very 
readable to me.

For those who don't know yet, a Jupyter notebook's file format is JSON. 
 JSON was designed to interchange data, including program structures. It 
was not designed for documentation or readability. Jupyter notebooks 
contain a sequence of "cells" - basically nodes - that are either Markdown 
text or code cells. There is no other structure. Jupytext's contribution is 
to flatten the nested JSON data structure to a flat text format with what 
amounts to sentinels - each line is commented out, and there are a few 
specially-formatted comments. One of these special comment lines marks the 
start of a Markdown cell, and another marks the start of a Python cell.

Leo is very strong in these areas:

    1. Structure is indicated by and can be changed using the outline;

    2. Only the contents of a single node are visible and editable at one 
time.  This is excellent for concentrating on programming and itemized 
lists of all kinds.

    3. Any markup such as Leo's sentinels that are needed to support 
structure or other Leo features are hidden from the user.  There's hardly 
any visual clutter. IMO this is a crucial feature that Leo offers.  It 
makes writing code to save and restore outlines and external files very 
complicated, but the user doesn't need to know about that.

Leo is not nearly as capable in supporting writing and documentation. 
That's because even though structure is important, it's also important to 
be able to see and edit the flow of the document from node to node and how 
nearby parts work together. An example is creating documentation using the 
rst3 command and Sphinx.  The mechanics of this process are excellent but 
doing editing beyond the node level requires a lot of mental effort and 
trial runs with Sphinx.  The Viewrendered3 plugin is designed to help with 
this problem by letting the user view an entire subtree.

Jupyter notebooks are serial combinations of documentation and code. 
Basically they are a limited form of "literate programming".  The code 
cells are usually small enough that they don't need to be structured.  They 
are displayed by a Jupyter-viewing program in a clean, very readable way.

The Jupytext work over the last few weeks presents the user with a direct 
view of the Jupytext-formatted file, sentinels, embedded comments, and all. 
 A user has to hand-edit the file while being distracted by the extra 
markup and not being able to see the flow of the parts one into another. 
 Yes, parts can be moved around and navigated to using the outline, but the 
editing experience is inferior.  There is also no syntax highlighting for 
code nodes - since the code is all commented out - nor can even rudimentary 
syntax checks be carried out.  The appearance of the document as it would 
be viewed in a Jupyter program - well, it is unknown until the file is 
saved to the .ipynb form and reloaded into Jupyter.

The Leonine Way
------------------
1.  Leo should present a view of a Jupyter notebook file to the user 
without sentinels or visual clutter, just like it does with other external 
file types.

2. Leo should be able to recreate the file's structure on reloading, or at 
least a close approximation to it.

3. Code cells should be syntax-highlighted and preferably able to be at 
least syntax-checkable.

4. Code execution would be a bonus but not required.

5. The user should need to know a minimum of special forms such as 
directives or other special markup features, and if there are any they 
should have a form similar to other Leo forms.

6. There should be a way to show a view of adjacent or nearby nodes so that 
the user can make sure they work together as intended. Showing a fully 
rendered view of nodes' Markdown is a desirable bonus to avoid 
round-tripping to Jupyter.

7. There should be an easy way to extend the file handling and rendering 
capabilities to use other programming languages besides Python.

6. The process of converting, importing, and exporting the files should be 
invisible to the user, just as for any other external file that Leo 
currently supports.

Thoughts on Design
-------------------
Leo already has parts that parts of the items above. The rst3 command gives 
a way to maintain structure apart from embedding it into an external file. 
With rst3, a Sphinx document becomes an ordinary Leo tree, not an external 
file. Running the command creates file(s) in the format that Sphinx needs. 
A "jupyter" command would do a similar job, and it would be far simpler.

VR3 is designed to handle 4, 5, and 6.  For example, a Jupytext file starts 
a new markdown cell with this line:

    # %% [markdown]

A code cell is started by:

    # %%

VR3 can recognize blocks delineated with @language directives:

@language md
This starts a block of markdown.

@language python
# Python code goes here

To get a jupytext file to render in VR3, just run a text substitution for 
these forms and then remove the remaining leading "#" characters.  That can 
be done during import of a notebook file, and doing it will give the user a 
clean view of the contents without visual clutter.  If we're going to have 
code to convert for VR3 to render we might as well have the same code 
up-front at import time.

The most challenging task will be how to merge changes that someone makes 
inside Jupyter with the internal arrangement of nodes inside a Leo outline. 
I don't think that will be easy, but it's essentially the same problem that 
has already been solved for @clean external files.

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/leo-editor/f96785e9-14eb-440b-8c40-f96bb0269dden%40googlegroups.com.

Reply via email to