The following prototype code shows how to adapt the @shadow algorithm for
use by @nosent files::
def run(self,path,root):
'''Main line.'''
x = self.c.shadowController
new_public_lines = self.read(path)
old_private_lines = self.write(root,nosentinels=False)
fn = g.shortFileName(path)
marker = x.markerFromFileLines(old_private_lines,fn)
new_private_lines = x.propagate_changed_lines(
new_public_lines,old_private_lines,marker,p=root)
The read method just reads the external file created by @nosent. We assume
that the user may have updated this file outside of Leo.
The write method writes the @nosent tree (to a list of strings) as if it
were an @file node. This recreates what in the @shadow world are called the
lines of the old private file. These lines contain the sentinels that Leo
would have written if the @nosent tree were an @file tree::
def write(self,root,nosentinels):
'''Return all lines of the @nosent tree at root.'''
at = self.c.atFileCommands
at.write(root,
kind = '@nosent',
nosentinels = nosentinels,
perfectImportFlag = False,
scriptWrite = True,
thinFile = True,
toString = True)
return g.splitLines(at.stringOutput)
This is *much* faster than reading and writing hidden private @shadow files!
Still to do:
1. Fold the run code shown above into at.openFileForReading.
2. Replace the @nosent tree (in the outline) by the outline corresponding
to the updated lines, preserving uA's in the @nosent tree. This is surely
possible because:
A. The @shadow algorithm preserves gnx's.
B. The to-be-preserved data exists in the original @nosent tree.
The details may be tricky, but they will be nowhere near as dire as with
@persistence trees. The code will be fast because no external files need be
read or written.
3. [Optional but desirable] Improve the core @shadow code so that Leo can
show the user all inserted, deleted or changed nodes. This logging is a
separate matter from what I have been discussing here. It can be delayed
until everything else is thoroughly tested.
Unbelievable! Very soon Leo will be able to update @nosent trees based on
changes to the corresponding external files! The new scheme will *just
work*. I never dreamed this could be possible.
To summarize, here are the advantages:
1. A collapse in complexity: @auto, @persistence and @shadow may be
deprecated or even eliminated! This is a *big* advance in user
friendliness.
2. A performance boost: the @shadow algorithm will not read or write
auxiliary files. Note: caching ensures that Leo will run the full @shadow
algorithm only if the external @nosent file has actually changed.
3. A reduction in Leo's footprint: no need for hidden helper files in
irritating .leo_shadow folders.
4. A reduced role for @auto importers. The user will likely create the
*original* @nosent tree using Leo's import command. The user will then
change @auto to @nosent and off we go. Alternatively, Leo's import
commands could create @nosent nodes instead of @auto nodes.
This is a great day for Leo. It will be at least several days before this
scheme becomes fully operational.
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 post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.