This Engineering Notebook post describes a spectacular new pattern for 
collaboration between Leo's mode files. Only Leo's devs will likely be 
interested. Please feel free to ignore it.


*Note:* Unless qualified, all methods are members of the JEditColorizer (
*jedit*) class.


*A new delegation pattern*


I have attempted (repeatedly and in vain) to use the jedit class's existing 
delegation machinery to switch between python and markdown coloring modes 
within text controlled by @language jupytext.


That effort is doomed to fail. The "delegate" kwarg of jedit's pattern 
matchers is rule-based. Alas, delegation in @jupytext nodes must happen 
line by line.


Happily, I have stumbled upon an astounding (dead easy!) new pattern for 
collaboration. The *leo/modes/jupytext.py* mode file is the result.


Several Ahas make it hard to reconstruct my previous mental world. I've 
mentioned this effect often. Anyway, the general progression went something 
like this:


*Aha 1*: jupytext.py can use python code, not rules.


The initial plan (now *abandoned *as the result of Aha 2) was as follows:


When a mode file contains a *scan_line* function, *_recolor* should call 
*newMainLine*. This new method will call the mode's scan_line function to 
do *all* the work.


But even after this Aha, I didn't see how even a Python program could 
delegate coloring. Must jupytext.py somehow duplicate the work of the mode 
files *python.py* and *md.py*? 


Eventually, I stumbled on the way forward. 


*Aha 2*: Add one new rule to python.py and md.py!!


This Aha happened mysteriously. Call it what you will; it felt like luck at 
the time. It's one of my all-time best.


- In md.py, I added a *new *rule, *md_jupytext_comment*.

- In python.py, I changed one *existing *rule, *python_comment*.


*Aha 3*: There is no need for newMainLine or scan_line!


I reverted jupytext.py so that it is a standard mode file. This file 
contains just two rules:


- *jupytext_comment* does all the delegation!

- *jupytext_directive* handles Leo's directive.


These new rules are straightforward, as PR #4147 
<https://github.com/leo-editor/leo-editor/pull/4147> shows. Note that the 
diffs for md.py are large because I converted it from @clean to @file.


*Summary*


The mode file *jupytext.py* handles delegation elegantly without using the 
"delegation" kwarg of Leo's pattern matchers. The new design pattern is 
breathtaking in its simplicity.


Edward

-- 
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/1ef11d47-e906-49c4-9118-9e936257a51fn%40googlegroups.com.

Reply via email to