On Thursday, January 23, 2014 1:10:20 PM UTC-5, Edward K. Ream wrote:
> The project now has met its original design goals!
> Next up: restoring custom headlines. It's tricky, but nowhere near as
tricky as moving nodes.
This post documents yesterday's work. It has two parts: 1) restoring
headlines and 2) the at-file-to-at-auto command.
===== Restoring headlines: the easy part.
Once an @auto file is created, restoring headlines is straightforward
because all the data relates to the outline *after* it has been
rearranged. So unls don't have to be munged.
[Reading] vc.update_headlines_after_read, called from
vc.update_after_read_at_auto_file, sets v._imported_headline for all vnodes
to their *original* imported value.
[Writing] vc.create_at_headlines, called from
update_before_write_at_auto_file, makes an entry in the @headlines node for
all nodes p whose present headlines do not match p.v._imported_headline.
So, everything is very easy for *already existing* @auto nodes.
===== The at-file-to-at-auto command
The bulk of the code is in the ConvertController class, contained within
vc.convert_at_file_to_at_auto.
Happily, the existing vc code was already perfectly factored to handle the
new command. The main line of the code, in ConvertController.run, does the
following:
1. cc.set_expected_imported_headlines *predictively* sets
v._imported_headline for all vnodes. This required new importer code,
namely baseScannerClass.headlineForNode. Given the body text of a node,
headlineForNode attempts to predict what the importer will create as a
headline when it actually generates the node.
This is inherently an inexact science: it's not even guaranteed that the
nodes created by the importer will match the nodes in the @file tree. But
we will do the best we can, and attempt not to crash if there are
discrepancies ;-)
2. Calls vc.vc.update_before_write_at_auto_file **on the @file node** to
create the appropriate @auto-view nodes and all its children **for the
to-be-created @auto node**!!! This is almost too good to be true, but it
works. Two hacks are needed, as described below.
3. Calls cc.strip_sentinels to write (to a string) the @file node as if it
were an @auto node. cc.strip_sentinels is straightforward: it calls
atFile.writeOneAtAutoNode with the trialWrite keyword argument set to True
to prevent calling vc.update_after_read_at_auto_file ;-)
cc.strip_sentinels returns the written string.
4. Calls cc.import_from_string creates the actual @auto node from the
string returned from cc.strip_sentinels. It calls the proper importer and
returns p, the position of the newly created @auto node.
5. Now for the first hack I mentioned in step 2. Now that we have the real
@auto node, we must change the body text of the @auto-view node so that
refers to the @auto node, not the @file node! It's easy::
at_auto_view.b = vc.at_auto_view_body(p)
6. Finally, we call vc.update_after_read_at_auto_file(p) to do all the new
@auto processing on the new @auto node using all the data in the @auto-view
node that was created from the @file node. It's very slick.
HOWEVER, there is one more set of **switcheroos** that must be applied.
This is the second hack I mentioned in step 2.
Alas, the unls created in step two refer to the headlines as they exist in
the @file tree, not the imported @auto tree. To correct this, we must
*dynamically munge* unls. Again, the existing factoring of code turned out
to be perfect. The munging is done in two easy places: vc.relative_unl and
vc.unl. The munge uses:
getattr(p.v,self.headline_ivar,p.h)
instead of just p.h. It's almost too slick to be comprehensible ;-) Note
that vc.headline_ivar is the string '_imported_headline'.
7. That's all there is to it! A few problems remain:
- baseScannerClass.headlineForNode must be as accurate as possible. I'm
working on it.
- An assert will fail if the corresponding position for an organizer node
can't be found. This is wrong. The code must change in several places to
allow for this possibility.
I expect several hours of work remain before the at-file-to-at-auto command
works on all of Leo's @file nodes.
The last part of the new @auto project will be saving and restore uas from
an @uas trees containing one @ua node for every node having an ua. That
will be easy.
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/groups/opt_out.