Tony,
Thanks for the pointer. The extension uses CKEditor4 which we decided against because it is pretty heavy weight and used iframes, making styling consistency more difficult. I see that CKEditor5 which does not use iframes is now available. We might look into CKEditor again although they make it difficult to look at the code if there are problems. The editor we chose,
Quill, is relatively lightweight. Plus, I think the argument for their internal document model rather than just using html is good.
I can address your point about things getting messy when using the jupyter-wysiwyg extension that tries to keep everything in markdown and the questions others have asked about why I think jupyter needs a new cell type simultaneously. I have been thinking about this very seriously as I play with and debug the code we have written so far. I too would prefer not to change the notebook format if possible. However, I have concluded that if we want to continue making Jupyter easier to use and have it be useful over the long haul the notebook format will have to continue to evolve.
Ease of use considerations:
- As you (Tony) have noted things get very messy in a markdown cell if you try to include formatting beyond the basic formatting supported in markdown. This is a problem for lots of users. Only if you are comfortable writing and editing html and are familiar with all the css embedded in Jupyter does this work OK. Others (including myself) find it frustrating to get the formatting I intend.
- Unless you use markdown a lot it is easy to forget exactly what to do to get specific formatting. I and many users of Jupyter do a lot of other things and only use Jupyter for cases where we need to do particular kinds of coding or data analysis. This means making useful annotations in the notebook is almost always a frustrating experience. Also having to execute the cell to see if the formatting is what you actually want is frustrating. This is where WYSIWYG shines.
- I think we want people to be able to concentrate on the work they are trying to do in Jupyter. Some examples where I do not think the users are likely to be interested in writing html code, but may need to format explanatory text more extensively than can be done with pure markdown: data analysis, code development, and my use case. My use case requires undergraduates to answer questions in a Jupyter notebook used for direct collection of lab data into the notebook. Freshman students taking chemistry do not need the added cognitive load of having to learn markdown to provide answers to chemistry lab questions. Additionally, the instructors who create the worksheets want to be able to use more formatting of their instructions than is available in markdown and do not know how to code html or markdown.
- From a user perspective I do not want a cell that I just edited using full WYSIWYG editing to open by default as a markdown cell. I want it to open as a full WYSIWYG editor when I double click on it. To be consistent with the way Jupyter works this means that the WYSIWYG cell is a different type of cell and as such has to be defined separately in the notebook format.
- Related to the issue above is that getting clean conversion back and forth between markdown (with embedded html) and WYSIWYG is not easy. This stems in part from the ambiguity (which provides flexibility as well) of html. If the cell types are different, people have to explicitly choose to convert between the two and are more likely to accept and be prepared to deal with small inconsistencies.
- The above also suggests that to make Jupyter easier to use Jupyter should also support a toolbar (that can be hidden) for markdown cells containing buttons and menus for just the formatting options markdown supports. Github does something like this. As part of the idea of markdown is that you can "just type it", I am not sure that a WYSIWYG version of a markdown cell is appropriate or necessary. I think WYSIWYG should be reserved for a rich text cell as done in the Jupyter fork I am working on.
Jupyter longevity considerations:
- The currently chosen json format for the stored notebooks is admirably flexible much as xml/html and likely to have good longevity. The only issue I see is that people might want an automatic way to bundle up external files used in a workbook, sort of a zip archive. Embedded images are already handled cleanly as base64 encoded binary in the json strings.
- The major issue is with the cell definitions. The idea of a code cell probably has staying power. However, a markdown cell is dependent upon a very specific type of coded input. Based on the number of text formatting schemes I've seen in my 35+ years of using computers, I do not have much confidence that markdown will be particularly popular in even 5 years. Therefore, to remain relevant long term, I believe that Jupyter will eventually have to add a cell type to replace markdown.
- I do not think any of us can predict exactly what future needs will be. Jupyter should be prepared to update the kind of cells it handles while maintaining the ability to open older cell formats and convert them to newer formats when appropriate.
- As presently coded the notebook format that includes the WYSIWYG cell accepts all V4 cell formats without any conversion. Additionally, the python code is available (although not yet implemented in Jupyter) to convert the WYSIWYG json code into html that can then be used to make a markdown cell when downgrading to V4. The key idea is that although this adds to the specification of a notebook it does not take anything away. If we were to default to opening unrecognized cells as rawNBconvert, older versions of Jupyter could open this extension without problems as well (is there a security reason for not doing this?).
In conclusion based on ease of use and longevity I think the Jupyter notebook and Jupyter need two changes:
- Addition of a toolbar to markdown cells.
- Addition of the new cell type WYSIWYG.
Jonathan