emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/hyperbole 7b6ce90 3/4: Major update to Koutliner data s


From: ELPA Syncer
Subject: [elpa] externals/hyperbole 7b6ce90 3/4: Major update to Koutliner data structures; simplified and faster
Date: Sun, 23 May 2021 23:57:09 -0400 (EDT)

branch: externals/hyperbole
commit 7b6ce90c9b5305d9cca2eefa66e3f30f5383694a
Author: Bob Weiner <rsw@gnu.org>
Commit: Bob Weiner <rsw@gnu.org>

    Major update to Koutliner data structures; simplified and faster
---
 ChangeLog           |  52 ++++++++++++++++
 Makefile            |  10 ++-
 kotl/EXAMPLE.kotl   | 136 ++++++++++++++++++++--------------------
 kotl/MANIFEST       |   7 +--
 kotl/kcell.el       | 175 +++++++++++++++++++++++++++++-----------------------
 kotl/kfile.el       |  10 +--
 kotl/klabel.el      |  16 ++---
 kotl/knode.el       |  92 ---------------------------
 kotl/kotl-mode.el   |  90 +++++++++++++--------------
 kotl/kotl-orgtbl.el |   2 +-
 kotl/kprop-em.el    |  92 ---------------------------
 kotl/kprop-xe.el    | 135 ----------------------------------------
 kotl/kproperty.el   |  95 ++++++++++++++++++++++++++--
 kotl/kview.el       |  80 +++++++++++++-----------
 kotl/kvspec.el      |   1 +
 15 files changed, 418 insertions(+), 575 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1e4d460..c076e18 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,11 +12,63 @@
 * hyrolo.el: Add (require 'xml) and local binding of child used
     in google-contacts support.
 
+* kotl/kotl-mode.el (kotl-mode:move-after): Suppress label increment
+   when label type is permanent ids (fix bug).
+
 * kotl/kexport.el (kexport:html-replacement-alist): Change \0
     back to \\& to try to fix link replacements again.
 
+* kotl/kotl-mode.el (kotl-mode:goto-cell): Use prefix arg as a
+    number rather than a string when called interactively.
+
+* kotl/kvspec.el (kvspec:activate): Ensure Koutline is narrowed to
+    editable region only.
+
+* kotl/kview.el (kview:goto-cell-id): Simplify and make much more
+    efficient via kproperty:position call.  Allow for integer
+    idstamp argument as well.
+
+* kotl/kcell.el (kcell:ref-to-id): Simplfy using 'when' and
+    'match-string'; update doc on unimplemented Augment features.
+    Fix to validate that idstamp exists before returning and to
+    convert relative kcell labels to idstamps (integers).
+
+* kotl/kproperty.el (kproperty:position): Add to quickly locate
+    the first kcell with a property value.
+                    (kproperty:all-positions): Add to quickly
+    locate all kcells with a property value.
+                    (kproperty:add-properties): Add to set
+    multiple properties from a plist.
+  kotl/kcell.el (kcell:is-p):
+  kotl/kview.el (kcell-view:create, kcell-view:set-cell, kview:goto-cell-id):
+  kotl/kfile.el (kfile:insert-attributes-v2, kfile:insert-attributes-v3):
+    Update to use new kcell and kproperty single-level property-list
+    configuration.
+
 2021-05-22  Bob Weiner  <rsw@gnu.org>
 
+* kotl/kcell.el (kcell:create): Remove contents arg since contents
+    are now stored exclusively in kviews.
+                (kcell:contents): Remove function.
+                (kcell:create-top, kcell-data:create,
+                 kcell-data:to-kcell-v2, kcell-data:to-kcell-v3):
+  kotl/kview.el (kview:add-cell):
+  kotl/kotl-mode.el (kotl-mode:copy-after, kotl-mode:copy-before):
+    Use new kcell:create calling convention (no contents arg).
+
+* kotl/kcell.el (kcell:copy, kcell:create, kcell:is-p):
+Delete knode.el and integrate functionality into kcell.el.
+
+* kotl/kcell.el (kcell:get-attr): Alias to plist-get.
+                (kcell:set-attr): Alias to plist-put.
+
+* kotl/kview.el (kcell-view:cell-from-ref): Add to get a kcell from a cell
+    reference (label or idstamp).
+
+* Makefile:
+  kotl/MANIFEST:
+  kotl/kproperty.el: Merge in "kprop-em.el" and remove "kprop-xe.el".
+
 * kotl/kexport.el (kexport:html-file-klink): Change '\0' back to
    '\\&' to prevent klink nul char insertion bug.
                   (kexport:html): Fix cell label vertical alignment
diff --git a/Makefile b/Makefile
index fcbd2e1..12548a5 100644
--- a/Makefile
+++ b/Makefile
@@ -163,9 +163,8 @@ EL_COMPILE = hact.el hactypes.el hargs.el hbdata.el 
hbmap.el hbut.el \
             hui-dired-sidebar.el hypb-maintenance.el
 
 EL_KOTL = kotl/kexport.el kotl/kfile.el kotl/kfill.el kotl/kimport.el 
kotl/klabel.el \
-         kotl/klink.el kotl/kmenu.el kotl/knode.el kotl/kotl-mode.el 
kotl/kotl-orgtbl.el \
-          kotl/kcell.el kotl/kproperty.el kotl/kprop-em.el \
-         kotl/kview.el kotl/kvspec.el
+         kotl/klink.el kotl/kmenu.el kotl/kotl-mode.el kotl/kotl-orgtbl.el \
+          kotl/kcell.el kotl/kproperty.el kotl/kview.el kotl/kvspec.el
 
 ELC_COMPILE =  hactypes.elc hibtypes.elc hib-debbugs.elc hib-doc-id.elc 
hib-kbd.elc \
             hib-social.elc hact.elc \
@@ -179,9 +178,8 @@ ELC_COMPILE =  hactypes.elc hibtypes.elc hib-debbugs.elc 
hib-doc-id.elc hib-kbd.
             set.elc hypb-ert.elc hui-dired-sidebar.elc hypb-maintenance.elc
 
 ELC_KOTL = kotl/kexport.elc kotl/kfile.elc kotl/kfill.elc kotl/kimport.elc 
kotl/klabel.elc \
-          kotl/klink.elc kotl/kmenu.elc kotl/knode.elc kotl/kotl-mode.elc 
kotl/kotl-orgtbl.elc \
-           kotl/kcell.elc kotl/kproperty.elc kotl/kprop-em.elc \
-           kotl/kview.elc kotl/kvspec.elc
+          kotl/klink.elc kotl/kmenu.elc kotl/kotl-mode.elc 
kotl/kotl-orgtbl.elc \
+           kotl/kcell.elc kotl/kproperty.elc kotl/kview.elc kotl/kvspec.elc
 
 HY-TALK  = HY-TALK/.hypb HY-TALK/HYPB HY-TALK/HY-TALK.org
 
diff --git a/kotl/EXAMPLE.kotl b/kotl/EXAMPLE.kotl
index df1efe6..1f02908 100644
--- a/kotl/EXAMPLE.kotl
+++ b/kotl/EXAMPLE.kotl
@@ -185,7 +185,7 @@
      3b13. Cell Identifiers: Permanent ids are associated with each cell
            and can be used in hyperlinks that are maintained as cells are
            reordered in a file.  (These ids may also be displayed in place
-           of the outline level relative ids.  Use {C-c C-l id RET}.)
+           of the outline level relative ids.  Use {C-c C-l id RET}).
            Permanent ids are numbered from 0, where 0 is the root node of
            the entire outline.  This node is never visible within the
            outline.  Permanent ids always begin with a 0, as in 012, to
@@ -199,7 +199,7 @@
            the kcell id to see attributes for all visible cells in the
            outline.
            
-           Use {C-c C-i}  to add an attribute to or to modify an existing
+           Use {C-c C-i} to add an attribute to or to modify an existing
            attribute of the cell at point.
 
      3b15. File Insertion: The elements of another buffer or file may be
@@ -254,7 +254,7 @@
               koutline buffer or file to create.
 
        3b16c. Augment Files Numbered on the Right-Side: (Skip this if you are
-              unfamiliar with this sort of file.)  Files exported from the
+              unfamiliar with this sort of file).  Files exported from the
               Augment system as text often have alphanumeric statement
               identifiers on the right side.
               
@@ -317,7 +317,7 @@
 
         3c1a. <@ 3b=06> jumps to the cell within this outline which has
               permanent id `06' and relative id `3b'.  <@ 06> does the same
-              thing, as does <@ 2b>, though this latter form will not
+              thing, as does <@ 3b>, though this latter form will not
               maintain the link properly if the cell is moved elsewhere
               within the outline.
 
@@ -360,7 +360,7 @@
     4f. Flexible view handling has been only partially implemented.
 
 
-"bn" ;; kvspec:current
+"ben" ;; kvspec:current
 77 ;; id-counter
 alpha ;; label-type
 3 ;; label-min-width
@@ -369,127 +369,127 @@ alpha ;; label-type
 
 ;; depth-first kcell attributes
 [[0
-  (creator "rsw@gnu.org" create-time "20210510:04:09:59" id-counter 77 file 
"/Users/bk/Dropbox/emacs/hyperbole/kotl/EXAMPLE.kotl")]
+  (idstamp 0 creator "bw@NYC-WEINERBOB" create-time "20210524:02:30:42" 
id-counter 77 file 
"/mnt/c/Users/bob.weiner/Dropbox/emacs/hyperbole/kotl/EXAMPLE.kotl")]
  [20
-  (creator "rsw@gnu.org" create-time "19940104:17:38:28" no-fill t)]
- [75
-  (idstamp 20 creator "rsw@gnu.org" create-time "19940104:17:38:28" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19940104:17:38:28" creator 
"rsw@gnu.org" idstamp 20 kcell t)]
+ [2
+  (rear-nonsticky t no-fill t create-time "19940104:17:38:28" creator 
"rsw@gnu.org" idstamp 2 kcell t)]
  [34
-  (creator "rsw@gnu.org" create-time "19940610:16:43:55")]
+  (rear-nonsticky t create-time "19940610:16:43:55" creator "rsw@gnu.org" 
idstamp 34 kcell t)]
  [35
-  (creator "rsw@gnu.org" create-time "19940610:16:44:03")]
+  (rear-nonsticky t create-time "19940610:16:44:03" creator "rsw@gnu.org" 
idstamp 35 kcell t)]
  [4
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 4 kcell t)]
  [5
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 5 kcell t)]
  [6
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 6 kcell t)]
  [14
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 14 kcell t)]
  [67
-  (creator "rsw@gnu.org" create-time "19951028:04:29:13" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951028:04:29:13" creator 
"rsw@gnu.org" idstamp 67 kcell t)]
  [15
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 15 kcell t)]
  [31
-  (creator "rsw@gnu.org" create-time "19940306:18:11:43")]
+  (rear-nonsticky t create-time "19940306:18:11:43" creator "rsw@gnu.org" 
idstamp 31 kcell t)]
  [7
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 7 kcell t)]
  [46
-  (creator "rsw@gnu.org" create-time "19950614:21:35:17")]
+  (rear-nonsticky t create-time "19950614:21:35:17" creator "rsw@gnu.org" 
idstamp 46 kcell t)]
  [43
-  (creator "rsw@gnu.org" create-time "19940610:22:00:46")]
+  (rear-nonsticky t create-time "19940610:22:00:46" creator "rsw@gnu.org" 
idstamp 43 kcell t)]
  [22
-  (creator "rsw@gnu.org" create-time "19940127:22:41:42")]
+  (rear-nonsticky t create-time "19940127:22:41:42" creator "rsw@gnu.org" 
idstamp 22 kcell t)]
  [32
-  (creator "rsw@gnu.org" create-time "19940610:16:31:28")]
+  (rear-nonsticky t create-time "19940610:16:31:28" creator "rsw@gnu.org" 
idstamp 32 kcell t)]
  [41
-  (creator "rsw@gnu.org" create-time "19940610:18:55:09")]
+  (rear-nonsticky t create-time "19940610:18:55:09" creator "rsw@gnu.org" 
idstamp 41 kcell t)]
  [42
-  (creator "rsw@gnu.org" create-time "19940610:18:55:57")]
+  (rear-nonsticky t create-time "19940610:18:55:57" creator "rsw@gnu.org" 
idstamp 42 kcell t)]
  [33
-  (creator "rsw@gnu.org" create-time "19940610:16:31:29")]
+  (rear-nonsticky t create-time "19940610:16:31:29" creator "rsw@gnu.org" 
idstamp 33 kcell t)]
  [47
-  (creator "rsw@gnu.org" create-time "19951022:22:59:26" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951022:22:59:26" creator 
"rsw@gnu.org" idstamp 47 kcell t)]
  [8
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 8 kcell t)]
  [28
-  (creator "rsw@gnu.org" create-time "19940128:22:50:44")]
+  (rear-nonsticky t create-time "19940128:22:50:44" creator "rsw@gnu.org" 
idstamp 28 kcell t)]
  [29
-  (creator "rsw@gnu.org" create-time "19940128:22:50:54")]
+  (rear-nonsticky t create-time "19940128:22:50:54" creator "rsw@gnu.org" 
idstamp 29 kcell t)]
  [10
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 10 kcell t)]
  [30
-  (creator "rsw@gnu.org" create-time "19940129:00:27:59")]
+  (rear-nonsticky t create-time "19940129:00:27:59" creator "rsw@gnu.org" 
idstamp 30 kcell t)]
  [62
-  (creator "rsw@gnu.org" create-time "19951026:08:32:57" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951026:08:32:57" creator 
"rsw@gnu.org" idstamp 62 kcell t)]
  [70
-  (creator "rsw@gnu.org" create-time "19951030:19:18:49" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951030:19:18:49" creator 
"rsw@gnu.org" idstamp 70 kcell t)]
  [71
-  (creator "rsw@gnu.org" create-time "19951030:19:19:40" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951030:19:19:40" creator 
"rsw@gnu.org" idstamp 71 kcell t)]
  [73
-  (creator "rsw@gnu.org" create-time "19951030:19:23:09" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951030:19:23:09" creator 
"rsw@gnu.org" idstamp 73 kcell t)]
  [63
-  (creator "rsw@gnu.org" create-time "19951026:19:31:34" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951026:19:31:34" creator 
"rsw@gnu.org" idstamp 63 kcell t)]
  [64
-  (creator "rsw@gnu.org" create-time "19951026:19:33:01" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951026:19:33:01" creator 
"rsw@gnu.org" idstamp 64 kcell t)]
  [69
-  (creator "rsw@gnu.org" create-time "19951029:06:24:35" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951029:06:24:35" creator 
"rsw@gnu.org" idstamp 69 kcell t)]
  [68
-  (creator "rsw@gnu.org" create-time "19951029:06:24:27" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951029:06:24:27" creator 
"rsw@gnu.org" idstamp 68 kcell t)]
  [65
-  (creator "rsw@gnu.org" create-time "19951026:19:33:08" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951026:19:33:08" creator 
"rsw@gnu.org" idstamp 65 kcell t)]
  [66
-  (creator "rsw@gnu.org" create-time "19951026:19:33:15" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951026:19:33:15" creator 
"rsw@gnu.org" idstamp 66 kcell t)]
  [77
-  (creator "rsw@gnu.org" create-time "19980226:19:54:44" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19980226:19:54:44" creator 
"rsw@gnu.org" idstamp 77 kcell t)]
  [48
-  (creator "rsw@gnu.org" create-time "19951023:05:55:19" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:05:55:19" creator 
"rsw@gnu.org" idstamp 48 kcell t)]
  [57
-  (creator "rsw@gnu.org" create-time "19951023:10:07:06" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:10:07:06" creator 
"rsw@gnu.org" idstamp 57 kcell t)]
  [58
-  (creator "rsw@gnu.org" create-time "19951023:10:07:26" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:10:07:26" creator 
"rsw@gnu.org" idstamp 58 kcell t)]
  [49
-  (creator "rsw@gnu.org" create-time "19951023:05:55:55" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:05:55:55" creator 
"rsw@gnu.org" idstamp 49 kcell t)]
  [55
-  (creator "rsw@gnu.org" create-time "19951023:08:56:41" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:08:56:41" creator 
"rsw@gnu.org" idstamp 55 kcell t)]
  [50
-  (creator "rsw@gnu.org" create-time "19951023:05:57:26" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:05:57:26" creator 
"rsw@gnu.org" idstamp 50 kcell t)]
  [51
-  (creator "rsw@gnu.org" create-time "19951023:05:58:31" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:05:58:31" creator 
"rsw@gnu.org" idstamp 51 kcell t)]
  [56
-  (creator "rsw@gnu.org" create-time "19951023:08:57:09" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:08:57:09" creator 
"rsw@gnu.org" idstamp 56 kcell t)]
  [52
-  (creator "rsw@gnu.org" create-time "19951023:05:59:59" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:05:59:59" creator 
"rsw@gnu.org" idstamp 52 kcell t)]
  [53
-  (creator "rsw@gnu.org" create-time "19951023:06:00:48" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:06:00:48" creator 
"rsw@gnu.org" idstamp 53 kcell t)]
  [54
-  (creator "rsw@gnu.org" create-time "19951023:06:05:50" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951023:06:05:50" creator 
"rsw@gnu.org" idstamp 54 kcell t)]
  [26
-  (creator "rsw@gnu.org" create-time "19940128:03:56:23")]
+  (rear-nonsticky t create-time "19940128:03:56:23" creator "rsw@gnu.org" 
idstamp 26 kcell t)]
  [27
-  (creator "rsw@gnu.org" create-time "19940128:22:36:54")]
+  (rear-nonsticky t create-time "19940128:22:36:54" creator "rsw@gnu.org" 
idstamp 27 kcell t)]
  [59
-  (creator "rsw@gnu.org" create-time "19951024:03:40:05" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951024:03:40:05" creator 
"rsw@gnu.org" idstamp 59 kcell t)]
  [60
-  (creator "rsw@gnu.org" create-time "19951024:03:40:13" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951024:03:40:13" creator 
"rsw@gnu.org" idstamp 60 kcell t)]
  [61
-  (creator "rsw@gnu.org" create-time "19951024:03:40:42" no-fill t)]
+  (rear-nonsticky t no-fill t create-time "19951024:03:40:42" creator 
"rsw@gnu.org" idstamp 61 kcell t)]
  [1
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 1 kcell t)]
  [11
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 11 kcell t)]
  [12
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 12 kcell t)]
  [44
-  (creator "rsw@gnu.org" create-time "19940728:21:56:49")]
+  (rear-nonsticky t create-time "19940728:21:56:49" creator "rsw@gnu.org" 
idstamp 44 kcell t)]
  [36
-  (creator "rsw@gnu.org" create-time "19940610:16:49:34")]
+  (rear-nonsticky t create-time "19940610:16:49:34" creator "rsw@gnu.org" 
idstamp 36 kcell t)]
  [37
-  (creator "rsw@gnu.org" create-time "19940610:16:50:02")]
+  (rear-nonsticky t create-time "19940610:16:50:02" creator "rsw@gnu.org" 
idstamp 37 kcell t)]
  [38
-  (creator "rsw@gnu.org" create-time "19940610:16:50:13")]
+  (rear-nonsticky t create-time "19940610:16:50:13" creator "rsw@gnu.org" 
idstamp 38 kcell t)]
  [13
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 13 kcell t)]
  [16
-  (creator "rsw@gnu.org" create-time "19940104:17:38:29")]
+  (rear-nonsticky t create-time "19940104:17:38:29" creator "rsw@gnu.org" 
idstamp 16 kcell t)]
  nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]
diff --git a/kotl/MANIFEST b/kotl/MANIFEST
index 454c746..473ef2b 100644
--- a/kotl/MANIFEST
+++ b/kotl/MANIFEST
@@ -8,11 +8,8 @@ kimport.el               - Convert and insert other outline 
file formats into koutlines
 klabel.el                 - Display label handling for koutlines
 klink.el                  - Implicit reference to a kcell action type, for use 
in koutlines
 kmenu.el                  - Pulldown and popup menus for kotl-mode, the 
Koutliner mode
-knode.el                  - Generic nodes for use as elements in data 
structures
 kotl-mode.el              - Major mode for editing koutlines and associated 
commands
-kotl-orgtbl.el            - Allow use of Org minor-mode table editing in 
Koutlines
-kproperty.el              - Wrapper for koutline text property implementations
-kprop-em.el               - Koutline text property handling under GNU Emacs
-kprop-xe.el               - Koutline text property handling under XEmacs
+kotl-orgtbl.el            - Allow use of Org minor-mode table editing in 
koutlines
+kproperty.el              - Kcell in-buffer property handling for the Koutliner
 kview.el                  - Display handling of koutlines
 kvspec.el                 - Koutline view specification
diff --git a/kotl/kcell.el b/kotl/kcell.el
index e6a06df..0e8ed17 100644
--- a/kotl/kcell.el
+++ b/kotl/kcell.el
@@ -12,15 +12,15 @@
 ;;; Commentary:
 ;;
 ;;   Defines kcells, nodes in Koutlines, along with a persistent representation
-;;   for writing to files called kcell-data.
-;;
+;;   called kcell-data for writing to files.  Node text content is stored
+;;   separately in kview for efficiency. 
 
 ;;; Code:
 ;;; ************************************************************************
 ;;; Other required Elisp libraries
 ;;; ************************************************************************
 
-(eval-and-compile (mapc #'require '(hinit htz klabel knode kview)))
+(eval-and-compile (mapc #'require '(hinit htz klabel kview)))
 
 ;;; ************************************************************************
 ;;; Public variables
@@ -39,102 +39,131 @@ Add to this list but don't remove any of the default 
elements.")
 ;;; kcell
 ;;;
 
-(defalias 'kcell:contents     'knode:contents)
-
 (defun kcell:copy (kcell)
   "Return a copy of KCELL."
-  (knode:copy kcell))
+  (copy-tree kcell))
 
-(defun kcell:create (contents idstamp &optional plist)
-  "Return a new kcell which store CONTENTS (a string or nil), has permanent 
IDSTAMP (an integer), and optional additional property list, PLIST.
+(defun kcell:create (idstamp &optional plist)
+  "Return a new kcell which has permanent IDSTAMP (an integer) and optional 
additional property list, PLIST.
 User id of `creator' of cell and `create-time' are added to cell's PLIST if
 not already there."
-  (and contents (not (stringp contents))
-       (error "(kcell:create): Invalid `contents' argument: %s" contents))
   (unless (klabel:idstamp-p idstamp)
-      (error "(kcell:create): Invalid `idstamp' argument: %s" idstamp))
-  (knode:create
-   contents (nconc (list 'idstamp idstamp)
-                  (if (memq 'creator plist)
-                      nil
-                    (list 'creator hyperb:user-email
-                          'create-time (htz:date-sortable-gmt)))
-                  plist)))
+      (error "(kcell:create): Invalid `idstamp' argument: '%s'" idstamp))
+  (nconc
+   (list 'kcell t)
+   (list 'idstamp idstamp)
+   (unless (memq 'creator plist)
+     (list 'creator hyperb:user-email
+          'create-time (htz:date-sortable-gmt)))
+   plist))
 
 (defun kcell:create-top (&optional file counter)
   "Return a new koutline top cell optionally attached to FILE with current 
idstamp COUNTER."
-  (kcell:create nil 0
+  (kcell:create 0
                ;; id-counter = max idstamp value given out in this koutline
                (list 'id-counter (or counter 0) 'file file)))
 
-(defun kcell:get-attr (kcell attribute)
-  "Return the value of KCELL's ATTRIBUTE."
-  (knode:get-attr (kcell:plist kcell) attribute))
+(defalias 'kcell:get-attr 'plist-get)
 
 (defun kcell:idstamp (kcell)
   "Return permanent idstamp of KCELL as an integer."
   (kcell:get-attr kcell 'idstamp))
 
-(defalias 'kcell:is-p      'knode:is-p)
+(defun kcell:is-p (object)
+  "Is OBJECT a kcell?"
+  (and (listp object) (plist-get object 'kcell)))
 
-(defun kcell:plist (kcell)
-  (knode:get-attr kcell 'plist))
+(defalias 'kcell:plist 'identity)
 
 (defun kcell:ref-to-id (cell-ref)
-  "Return a CELL-REF string converted to a cell identifier string.
+  "When CELL-REF is valid, return a CELL-REF string converted to a cell 
idstamp (integer).
 If CELL-REF contains both a relative and a permanent id, the permanent id is
 returned.  If CELL-REF is invalid, nil is returned.
 
-CELL-REF may be of any of the following forms:
-  1b        - relative id, augment style
+CELL-REF may be a whole number:
+
+  12       - permanent idstamp
+
+or any of the following string forms:
+  1 or 1b   - relative id, augment style
   1.2       - relative id, legal style
   012       - permanent idstamp
   1a=012    - both relative and permanent ids (in that order) separated by =
   |viewspec - a viewspec setting, rather than a cell reference
   :viewspec - an augment viewspec, ignored for now.
 
-Optionally, any of the above id forms may be followed by a period and some
-alpha characters indicating a location relative to the id.
-
 Optionally, any of these id forms (or the relative form) may be followed by
 zero or more whitespace characters, a | and some view specification
-characters.  Augment viewspec characters preceded by a colon are ignored, for
-now."
-
-  (if (not (stringp cell-ref))
-      nil
-    (setq cell-ref (hypb:replace-match-string "\\s +" cell-ref "" t))
-    (let ((specs) result)
-      ;; Ignore Augment :viewspecs.
-      (if (string-match ":" cell-ref)
-         (setq cell-ref (substring cell-ref 0 (match-beginning 0))))
-      ;; Separate koutline |viewspecs from cell id.
-      (if (string-match "\\(\\.[a-zA-Z]\\||\\)" cell-ref)
-         (setq specs (substring cell-ref (match-beginning 1))
-               cell-ref (substring cell-ref 0 (match-beginning 0))))
-      (setq result
-           (cond
-            ((string-match "[^.= \t\n\r\f0-9a-zA-Z]" cell-ref) nil)
-            ((string-match "^\\([.0-9a-zA-Z]+\\)=\\(0[0-9]*\\)$"
-                           cell-ref)
-             (substring cell-ref (match-beginning 2) (match-end 2)))
-            ((string-match "^\\([.0-9a-zA-Z]+\\)$" cell-ref)
-             (substring cell-ref (match-beginning 1) (match-end 1)))))
-      (cond (result
-            (if specs (concat result specs) result))
-           (specs
-            (if (eq ?| (aref specs 0)) specs))))))
+characters.
+
+Augment capabilities not yet implemented and ignored for now:
+  1. Augment viewspec characters preceded by a colon
+  2. Any of the above id forms followed by a period and some
+     alpha characters indicating a location relative to the id."
+  (cond ((integerp cell-ref)
+        (when (kproperty:position 'idstamp cell-ref)
+          cell-ref))
+       ((stringp cell-ref)
+        (setq cell-ref (hypb:replace-match-string "\\s-+" cell-ref "" t))
+        (let (specs
+              result)
+          ;; Ignore Augment :viewspecs.
+          (when (string-match ":" cell-ref)
+            (setq cell-ref (substring cell-ref 0 (match-beginning 0))))
+          ;; Separate koutline |viewspecs from cell id.
+          (when (string-match "\\(\\.[a-zA-Z]\\||\\)" cell-ref)
+            (setq specs (substring cell-ref (match-beginning 1))
+                  cell-ref (substring cell-ref 0 (match-beginning 0))))
+          (setq result
+                (cond
+                 ((string-match "[^.= \t\n\r\f0-9a-zA-Z]" cell-ref) nil)
+                 ((or (string-match "^\\([.0-9a-zA-Z]+\\)=\\(0[0-9]*\\)$"
+                                    cell-ref)
+                      ;; idstamp only
+                      (string-match "^\\(\\)\\(0[0-9]*\\)$" cell-ref))
+                  (setq result (string-to-number (match-string 2 cell-ref)))
+                  ;; Validate that idstamp value exists, else return nil
+                  (when (kproperty:position 'idstamp result)
+                    result))
+                 ((string-match "^\\([.0-9a-zA-Z]+\\)$" cell-ref)
+                  ;; relative label
+                  (setq result (match-string 1 cell-ref))
+                  (save-excursion
+                    (goto-char (point-min))
+                    (when (re-search-forward (concat "^[ \t]*" (regexp-quote 
result)
+                                                     (regexp-quote 
(kview:label-separator kview)))
+                                             nil t)
+
+                      (setq result (string-to-number (kcell-view:idstamp)))
+                      ;; Validate that idstamp value exists, else return nil
+                      (when (kproperty:position 'idstamp result)
+                        result))))))
+          (cond (result
+                 (if specs (concat result specs) result))
+                (specs
+                 (when (eq ?| (aref specs 0)) specs)))))))
        
 (defun kcell:remove-attr (kcell attribute)
-  "Remove KCELL's ATTRIBUTE, if any, return modified KCELL."
-  (knode:set-attr
-   kcell 'plist (knode:remove-attr (kcell:plist kcell) attribute)))
-
-(defun kcell:set-attr (kcell attribute value)
-  "Set KCELL's ATTRIBUTE to VALUE and return modified KCELL."
-  (knode:set-attr
-   kcell 'plist (knode:set-attr (kcell:plist kcell)
-                               attribute value)))
+  "Remove KCELL's ATTRIBUTE, if any, and return modified KCELL."
+  (let ((tail kcell)
+       sym
+       prev)
+    (setq sym (car tail))
+    (while (and sym (eq sym attribute))
+      (setq tail (cddr tail)
+           sym (car tail)))
+    (setq kcell tail
+         prev tail
+         tail (cddr tail))
+    (while tail
+      (setq sym (car tail))
+      (if (eq sym attribute)
+         (setcdr (cdr prev) (cddr tail)))
+      (setq prev tail
+           tail (cddr tail)))
+    kcell))
+
+(defalias 'kcell:set-attr 'plist-put)
 
 (defun kcell:set-create-time (kcell)
   "Store the time of creation of KCELL."
@@ -162,7 +191,7 @@ assuming it is the cell at point and filling in the missing 
information."
      (if (and cell idstamp plist)
         (vector idstamp plist)
        (kcell-data:create
-       (kcell:create nil (or idstamp (kview:id-increment kview)) plist)))))
+       (kcell:create (or idstamp (kview:id-increment kview)) plist)))))
 
 (defun kcell-data:idstamp (kcell-data)
   (aref kcell-data 0))
@@ -176,28 +205,20 @@ assuming it is the cell at point and filling in the 
missing information."
 (defun kcell-data:to-kcell-v2 (kcell-data)
   (if (vectorp kcell-data)
       (kcell:create
-       ;; Cell contents are no longer put into cells themselves by default
-       ;; when a file is read.  The contents are stored within the kview
-       ;; buffer, so use nil as a place-holder.
-       nil
        ;; Repair invalid idstamps on the fly.
        (or (kcell-data:idstamp kcell-data) (kview:id-increment kview))
        (kcell-data:plist-v2 kcell-data))
     ;; Repair invalid cells on the fly.
-    (kcell:create nil (kview:id-increment kview))))
+    (kcell:create (kview:id-increment kview))))
 
 (defun kcell-data:to-kcell-v3 (kcell-data)
   (if (vectorp kcell-data)
       (kcell:create
-       ;; Cell contents are no longer put into cells themselves by default
-       ;; when a file is read.  The contents are stored within the kview
-       ;; buffer, so use nil as a place-holder.
-       nil
        ;; Repair invalid idstamps on the fly.
        (or (kcell-data:idstamp kcell-data) (kview:id-increment kview))
        (kcell-data:plist-v3 kcell-data))
     ;; Repair invalid cells on the fly.
-    (kcell:create nil (kview:id-increment kview))))
+    (kcell:create (kview:id-increment kview))))
 
 (provide 'kcell)
 
diff --git a/kotl/kfile.el b/kotl/kfile.el
index 80b8ab0..ee248d8 100644
--- a/kotl/kfile.el
+++ b/kotl/kfile.el
@@ -59,7 +59,8 @@ Return the new kview."
     ;; again.
     (unless (kview:is-p kview)
       (kfile:read buffer existing-file))
-    (or (eq major-mode 'kotl-mode) (kotl-mode))
+    (unless (derived-mode-p 'kotl-mode)
+      (kotl-mode))
     kview))
 
 ;;;###autoload
@@ -398,7 +399,7 @@ hidden."
          ;; Be sure not to skip past a period which may terminate the label.
          (if (re-search-forward "[A-Za-z0-9]\\(\\.?[A-Za-z0-9]\\)*" nil t)
              (progn
-               (kproperty:set 'kcell (car kcell-list))
+               (kproperty:add-properties (car kcell-list))
                (setq kcell-list (cdr kcell-list))))
          (search-forward "\n\n" nil t)))))
 
@@ -417,9 +418,8 @@ hidden."
          ;; Be sure not to skip past a period which may terminate the label.
          (if (re-search-forward "[A-Za-z0-9]\\(\\.?[A-Za-z0-9]\\)*" nil t)
              (progn
-               (kproperty:set 'kcell
-                              (kcell-data:to-kcell-v3
-                               (aref kcell-vector kcell-num)))
+               (kproperty:add-properties
+                (kcell-data:to-kcell-v3 (aref kcell-vector kcell-num)))
                (setq kcell-num (1+ kcell-num))))
          (search-forward "\n\n" nil t)))))
 
diff --git a/kotl/klabel.el b/kotl/klabel.el
index 96f9d41..5ba3a5c 100644
--- a/kotl/klabel.el
+++ b/kotl/klabel.el
@@ -478,13 +478,13 @@ and the start of its contents."
 CURRENT-CELL-LABEL is the label to display for the current cell.
 If, however, it is \"0\", then all cell labels are updated."
   (let ((label-type (kview:label-type kview)))
-    (if (memq label-type '(alpha legal partial-alpha))
-       (if (string-equal current-cell-label "0")
-           ;; Update all cells in view.
-           (klabel-type:set-labels label-type)
-         ;; Update current tree and its siblings only.
-         (klabel-type:update-labels-from-point
-          label-type current-cell-label)))))
+    (when (memq label-type '(alpha legal partial-alpha))
+      (if (string-equal current-cell-label "0")
+         ;; Update all cells in view.
+         (klabel-type:set-labels label-type)
+       ;; Update current tree and its siblings only.
+       (klabel-type:update-labels-from-point
+        label-type current-cell-label)))))
 
 (defun klabel-type:update-tree-labels (current-cell-label first-label)
   "Update the labels of current cell and its subtree.
@@ -572,7 +572,7 @@ For example, \"14\" would become \"15\"."
 
 (defun kotl-label:integer-p (label)
   "Return LABEL iff LABEL is composed of all digits, else return nil."
-  (if (string-match "\\`[0-9]+\\'" label) label))
+  (when (string-match "\\`[0-9]+\\'" label) label))
 
 ;; This handles partial alphabetic labels with a maximum single level
 ;; sequence of 17575 items, which = (1- (expt 26 3)), after which it gives
diff --git a/kotl/knode.el b/kotl/knode.el
deleted file mode 100644
index ee06201..0000000
--- a/kotl/knode.el
+++ /dev/null
@@ -1,92 +0,0 @@
-;;; knode.el --- Generic nodes for use as elements in data structures
-;;
-;; Author:       Bob Weiner
-;;
-;; Orig-Date:    5/1/93
-;;
-;; Copyright (C) 1993-2016  Free Software Foundation, Inc.
-;; See the "../HY-COPY" file for license information.
-;;
-;; This file is part of GNU Hyperbole.
-
-;;; Commentary:
-
-;;; Code:
-;;; ************************************************************************
-;;; Public functions
-;;; ************************************************************************
-
-;;;
-;;; Knodes
-;;;
-
-(defun knode:create (contents &optional prop-list)
-  "Return a new knode which store CONTENTS and optional PROP-LIST."
-  (list   'knode
-         'contents contents
-         'plist prop-list))
-
-(defun knode:contents (knode)
-   "Return KNODE's contents."
-   (if (knode:is-p knode)
-       (car (cdr (memq 'contents knode)))
-     (error "(knode:contents): Argument must be a knode")))
-
-(defalias 'knode:copy 'copy-tree)
-
-(defun knode:is-p (object)
-  "Is OBJECT a knode?"
-  (and (listp object) (eq (car object) 'knode)))
-
-(defun knode:set-contents (knode contents)
-  "Set KNODE's CONTENTS."
-  (if (knode:is-p knode)
-      (setcar (cdr (memq 'contents knode)) contents)
-    (error "(knode:set-contents): First arg must be a knode")))
-
-;;; ************************************************************************
-;;; Private functions
-;;; ************************************************************************
-
-(defun knode:get-attr (obj attribute)
-  "Return the value of OBJ's ATTRIBUTE."
-  (car (cdr (memq attribute obj))))
-
-(defun knode:remove-attr (obj attribute)
-  "Remove OBJ's ATTRIBUTE, if any, and return modified OBJ.
-Use (setq object (knode:remove-attr object attribute)) to ensure that OBJ
-is updated."
-  (let ((tail obj)
-       sym
-       prev)
-    (setq sym (car tail))
-    (while (and sym (eq sym attribute))
-      (setq tail (cdr (cdr tail))
-           sym (car tail)))
-    (setq obj tail
-         prev tail
-         tail (cdr (cdr tail)))
-    (while tail
-      (setq sym (car tail))
-      (if (eq sym attribute)
-         (setcdr (cdr prev) (cdr (cdr tail))))
-      (setq prev tail
-           tail (cdr (cdr tail))))
-    obj))
-
-(defun knode:set-attr (obj attribute value)
-  "Set OBJ's ATTRIBUTE to VALUE and return OBJ."
-  (let ((attr (memq attribute obj)))
-    (if attr
-       (setcar (cdr attr) value)
-      (setq obj (nconc obj (list attribute value)))))
-  obj)
-
-;;; ************************************************************************
-;;; Private variables
-;;; ************************************************************************
-
-(provide 'knode)
-
-
-;;; knode.el ends here
diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el
index 722cbcb..8363c32 100644
--- a/kotl/kotl-mode.el
+++ b/kotl/kotl-mode.el
@@ -208,7 +208,7 @@ Hyperbole EXAMPLE."
     (unless (stringp example)
       (setq example "EXAMPLE.kotl"))
     (when (file-directory-p example)
-      (setq personal-example (expand-file-name "EXAMPLE.kotl" example )
+      (setq personal-example (expand-file-name "EXAMPLE.kotl" example)
            example "EXAMPLE.kotl"))
     (unless personal-example
       (if (file-name-absolute-p example)
@@ -961,7 +961,7 @@ Goes backward if ARG is negative; error if CHAR not found."
 ;;; ------------------------------------------------------------------------
 
 (defun kotl-mode:append-cell (contents-cell append-to-cell)
-  "Append CONTENTS-CELL to APPEND-TO-CELL.
+   "Append CONTENTS-CELL (a cell ref) to APPEND-TO-CELL (a cell ref).
 APPEND-TO-CELL is refilled if neither cell has a no-fill property and
 kotl-mode:refill-flag is enabled."
   (interactive
@@ -1014,7 +1014,7 @@ Leave point at the start of the root cell of the new 
tree."
   (kview:map-tree
    (lambda (view)
      (kcell-view:set-cell
-      (kcell:create nil (kview:id-increment view))))
+      (kcell:create (kview:id-increment view))))
    kview))
 
 (defun kotl-mode:copy-before (from-cell-ref to-cell-ref parent-p)
@@ -1040,7 +1040,7 @@ Leave point at the start of the root cell of the new 
tree."
   (kview:map-tree
    (lambda (view)
      (kcell-view:set-cell
-      (kcell:create nil (kview:id-increment view))))
+      (kcell:create (kview:id-increment view))))
    kview))
 
 (defun kotl-mode:copy-to-buffer (cell-ref buffer invisible-flag)
@@ -1107,6 +1107,7 @@ Leave point at original location but return the tree's 
new start point."
         (end   (kotl-mode:tree-end))
         (sib-id (if (= 0 (kotl-mode:forward-cell 1))
                     (kcell-view:idstamp)))
+        (id-label-flag (eq (kview:label-type kview) 'id))
         new-tree-start)
     ;;
     ;; We can't move a tree to a point within itself, so if that is the case
@@ -1119,10 +1120,10 @@ Leave point at original location but return the tree's 
new start point."
     ;; sibling cell.  Mark its label with a property which will be deleted
     ;; whenever the cell label is renumbered.  This tells us whether or not
     ;; to renumber the sibling separately from the tree to move.
-    (if sib-id
-       ;; Move to middle of label and insert klabel-original temp property.
-       (progn (goto-char (- (point) label-sep-len 3))
-              (kproperty:set 'klabel-original t)))
+    (when sib-id
+      ;; Move to middle of label and insert klabel-original temp property.
+      (goto-char (- (point) label-sep-len 3))
+      (kproperty:set 'klabel-original t))
     ;;
     ;; Position for insertion before deletion of tree-to-move from old
     ;; position, in case old position precedes new one.
@@ -1135,7 +1136,8 @@ Leave point at original location but return the tree's 
new start point."
                     to-indent (+ to-indent (kview:level-indent kview))))
       ;; Move to after to-cell-ref's tree for insertion as following sibling.
       (goto-char (kotl-mode:tree-end))
-      (setq to-label (klabel:increment to-label)))
+      (unless id-label-flag
+       (setq to-label (klabel:increment to-label))))
     ;;
     ;; Insert tree-to-move at new location
     ;;
@@ -1153,13 +1155,13 @@ Leave point at original location but return the tree's 
new start point."
       ;;
       ;; Move to sibling of tree-to-move within view and update labels within
       ;; view of tree-to-move's original siblings.
-      (if sib-id
-         (progn (kotl-mode:goto-cell sib-id t)
-                ;; Sibling labels may have already been updated if tree was
-                ;; moved somewhere preceding its siblings.
-                (let ((label-middle (- (point) label-sep-len 2)))
-                  (if (kproperty:get label-middle 'klabel-original)
-                      (klabel-type:update-labels from-label))))))
+      (when sib-id
+       (kotl-mode:goto-cell sib-id t)
+       ;; Sibling labels may have already been updated if tree was
+       ;; moved somewhere preceding its siblings.
+       (let ((label-middle (- (point) label-sep-len 2)))
+         (when (kproperty:get label-middle 'klabel-original)
+           (klabel-type:update-labels from-label)))))
     ;;
     (goto-char new-tree-start)
     ;;
@@ -1731,7 +1733,7 @@ CELL-REF is not found within current view.  Will signal 
same
 error if called interactively when CELL-REF is not found."
   (interactive
    (list (if current-prefix-arg
-            (format "0%d" (prefix-numeric-value current-prefix-arg))
+            (prefix-numeric-value current-prefix-arg)
           (read-string "Goto cell label or id: "))))
   (setq cell-ref
        (or (kcell:ref-to-id cell-ref)
@@ -1739,39 +1741,33 @@ error if called interactively when CELL-REF is not 
found."
   (let* ((opoint (point))
         (found)
         cell-id kvspec)
-    (if (eq ?| (aref cell-ref 0))
+    (if (and (stringp cell-ref) (eq ?| (aref cell-ref 0)))
        ;; This is a standalone view spec, not a cell reference.
        (progn (kvspec:activate cell-ref) (setq found (point)))
 
-      ;; !! Remove any relative specs and view specs from
-      ;; cell-ref to form cell-id.  Really should account for relative
-      ;; specs here, but we don't yet support them.
-      (if (string-match "\\(\\.[a-zA-Z]+\\)?\\([|:].*\\)\\|\\.[a-zA-Z]+"
-                       cell-ref)
+      ;; !! Todo: Remove any relative specs and view specs from
+      ;; cell-ref to form cell-id.  Really should account for Augment-style
+      ;; relative specs here, but we don't yet support them.
+      (if (and (stringp cell-ref)
+              (string-match "\\(\\.[a-zA-Z]+\\)?\\([|:].*\\)\\|\\.[a-zA-Z]+"
+                            cell-ref))
          (setq cell-id (substring cell-ref 0 (match-beginning 0))
                kvspec  (when (match-beginning 2)
-                         (substring cell-ref (match-beginning 2) (match-end 
2))))
+                         (match-string 2 cell-ref)))
        (setq cell-id cell-ref kvspec nil))
 
       (goto-char (point-min))
-      (cond ((eq ?0 (aref cell-id 0))
-            ;; is an idstamp
-            (when (kview:goto-cell-id cell-id)
-                (setq found (point))))
-           ;; is a label
-           ((re-search-forward
-             (format "\\([\n\r][\n\r]\\|\\`\\)[ ]*%s%s"
-                     (regexp-quote cell-id)
-                     (regexp-quote (kview:label-separator kview)))
-             nil t)
-            (setq found (point)))
-           ;; no match
-           (t (goto-char opoint)
-              nil))
-      (if (and (not found) (or error-p (called-interactively-p 'interactive)))
-         (error "(kotl-mode:goto-cell): No `%s' cell in this view" cell-ref)
-       ;; Activate any viewspec associated with cell-ref.
-       (when kvspec (kvspec:activate kvspec))))
+      (when (or (integerp cell-id)
+               (eq ?0 (aref cell-id 0)))
+       ;; is an idstamp
+       (when (kview:goto-cell-id cell-id)
+         (setq found (point))))
+      (if found
+         ;; Activate any viewspec associated with cell-ref.
+         (when kvspec (kvspec:activate kvspec))
+       (goto-char opoint)
+       (when (or error-p (called-interactively-p 'interactive))
+         (error "(kotl-mode:goto-cell): No `%s' cell in this view" cell-ref))))
     found))
 
 (defun kotl-mode:head-cell ()
@@ -2135,9 +2131,13 @@ If assist-key is pressed:
 (defun kotl-mode:add-cell (&optional relative-level contents plist no-fill)
   "Add a cell following current cell at optional RELATIVE-LEVEL with CONTENTS 
string, attributes in PLIST, a property list, and NO-FILL flag to prevent any 
filling of CONTENTS.
 
-Optional prefix arg RELATIVE-LEVEL means add as sibling if nil or >= 0, as
-child if equal to universal argument, {C-u}, and as sibling of current cell's
-parent, otherwise.  If added as sibling of current level, RELATIVE-LEVEL is
+Optional prefix arg RELATIVE-LEVEL means either:
+
+ 1. add as the next sibling if nil or >= 0;
+ 2. as the first child if equal to '(4), given by the universal argument, 
{C-u};
+ 3. otherwise, as the first sibling of the current cell's parent.
+
+If added as the next sibling of the current level, then RELATIVE-LEVEL is
 used as a repeat count for the number of cells to add.
 
 Return last newly added cell."
diff --git a/kotl/kotl-orgtbl.el b/kotl/kotl-orgtbl.el
index 7ae9a00..a1632ad 100644
--- a/kotl/kotl-orgtbl.el
+++ b/kotl/kotl-orgtbl.el
@@ -1,4 +1,4 @@
-;;; kotl-orgtbl.el --- Allow use of Org minor-mode table editing in Koutlines
+;;; kotl-orgtbl.el --- Allow use of Org minor-mode table editing in koutlines
 ;;
 ;; Author:       Bob Weiner
 ;;
diff --git a/kotl/kprop-em.el b/kotl/kprop-em.el
deleted file mode 100644
index 3509331..0000000
--- a/kotl/kprop-em.el
+++ /dev/null
@@ -1,92 +0,0 @@
-;;; kprop-em.el --- Koutline text property handling under GNU Emacs
-;;
-;; AUTHOR:       Bob Weiner
-;;
-;; Orig-Date:    7/27/93
-;;
-;; Copyright (C) 1993-2016  Free Software Foundation, Inc.
-;; See the "../HY-COPY" file for license information.
-;;
-;; This file is part of GNU Hyperbole.
-
-;;; Commentary:
-
-;;; Code:
-;;; ************************************************************************
-;;; Other required Elisp libraries
-;;; ************************************************************************
-
-(require 'hversion)
-
-;;; ************************************************************************
-;;; Public functions
-;;; ************************************************************************
-
-(defalias 'kproperty:get 'get-text-property)
-
-(defun kproperty:map (function property value)
-  "Apply FUNCTION to each character with PROPERTY `eq' to VALUE in the current 
buffer.
-FUNCTION is called with the start and end points of the text span with the 
matching PROPERTY
-and with point at the start."
-  (let ((result)
-       (start (point-min))
-       end)
-    (save-excursion
-      (while (and (< start (point-max))
-                 (setq start (text-property-any start (point-max) property 
value)))
-       (goto-char start)
-       (setq end (or (text-property-not-all start (point-max) property value) 
(point-max))
-             result (cons (funcall function start end) result)
-             start end)))
-    (nreverse result)))
-
-(defalias 'kproperty:next-single-change 'next-single-property-change)
-
-(defalias 'kproperty:previous-single-change 'previous-single-property-change)
-
-(defalias 'kproperty:properties 'text-properties-at)
-
-(defun kproperty:put (start end property-list &optional object)
-  "From START to END, add PROPERTY-LIST properties to the text.
-The optional fourth argument, OBJECT, is the string or buffer containing the
-text.  Text inserted before or after this region does not inherit the added
-properties."
-  (add-text-properties
-   start end (append property-list '(rear-nonsticky t)) object))
-
-(defun kproperty:remove (start end property-list &optional object)
-  "From START to END, remove the text properties in PROPERTY-LIST.
-The optional fourth argument, OBJECT, is the string or buffer containing the
-text.  PROPERTY-LIST should be a plist; if the value of a property is
-non-nil, then only a property with a matching value will be removed.
-Returns t if any property was changed, nil otherwise."
-  (let ((changed) plist property value next)
-    (while property-list
-      (setq property (car property-list)
-           value (car (cdr property-list))
-           plist (list property value)
-           property-list (nthcdr 2 property-list)
-           next start)
-      (while (setq next (text-property-any next end property value object))
-       (remove-text-properties next (1+ next) plist object)
-       (setq changed t next (1+ next))))
-    changed))
-
-(defun kproperty:replace-separator (pos label-separator old-sep-len)
-  "Replace at POS the cell label separator with LABEL-SEPARATOR.
-OLD-SEP-LEN is the length of the separator being replaced."
-  (let (properties)
-    (while (setq pos (kproperty:next-single-change (point) 'kcell))
-      (goto-char pos)
-      (setq properties (text-properties-at pos))
-      ;; Replace label-separator while maintaining cell properties.
-      (insert label-separator)
-      (add-text-properties pos (+ pos 2) properties)
-      (delete-region (point) (+ (point) old-sep-len)))))
-
-(defun kproperty:set (property value)
-  "Set PROPERTY of character at point to VALUE."
-  (kproperty:put (point) (min (+ 2 (point)) (point-max))
-                (list property value)))
-
-;;; kprop-em.el ends here
diff --git a/kotl/kprop-xe.el b/kotl/kprop-xe.el
deleted file mode 100644
index d92b608..0000000
--- a/kotl/kprop-xe.el
+++ /dev/null
@@ -1,135 +0,0 @@
-;;; kprop-xe.el --- Koutline text property handling under XEmacs
-;;
-;; Author:       Bob Weiner
-;;
-;; Orig-Date:    7/27/93
-;;
-;; Copyright (C) 1993-2016  Free Software Foundation, Inc.
-;; See the "../HY-COPY" file for license information.
-;;
-;; This file is part of GNU Hyperbole.
-
-;;; Commentary:
-
-;;; Code:
-;;; ************************************************************************
-;;; Other required Elisp libraries
-;;; ************************************************************************
-
-(require 'hversion)
-
-;;; ************************************************************************
-;;; Public functions
-;;; ************************************************************************
-
-;; (get-text-property (pos prop &optional object))
-;; Return the value of position POS's property PROP, in OBJECT.
-;; OBJECT is optional and defaults to the current buffer.
-;; If POSITION is at the end of OBJECT, the value is nil.
-(defalias 'kproperty:get 'get-text-property)
-
-(defun kproperty:map (function property &optional value)
-  "Apply FUNCTION to each character with PROPERTY `eq' to VALUE in the current 
buffer.
-FUNCTION is called with the start and end points of the text span with the 
matching PROPERTY
-and with point at the start."
-  (let ((result)
-       (start) end)
-    (save-excursion
-      (map-extents (lambda (extent unused)
-                      (if (setq start (extent-start-position extent))
-                          (progn (goto-char start)
-                                 (setq end (extent-end-position extent)
-                                       result (cons (funcall function start 
end) result))))
-                      nil)
-                  nil nil nil nil nil property value))
-    (nreverse result)))
-
-;; (next-single-property-change (pos prop &optional object))
-;; Return the position of next property change for a specific property.
-;; Scans characters forward from POS till it finds
-;; a change in the PROP property, then returns the position of the change.
-;; The optional third argument OBJECT is the string or buffer to scan.
-;; Return nil if the property is constant all the way to the end of OBJECT.
-;; If the value is non-nil, it is a position greater than POS, never equal.
-(defalias 'kproperty:next-single-change 'next-single-property-change)
-
-;; (previous-single-property-change (pos prop &optional object))
-;; Return the position of previous property change for a specific property.
-;; Scans characters backward from POS till it finds
-;; a change in the PROP property, then returns the position of the change.
-;; The optional third argument OBJECT is the string or buffer to scan.
-;; Return nil if the property is constant all the way to the start of OBJECT.
-;; If the value is non-nil, it is a position less than POS, never equal.
-(defalias 'kproperty:previous-single-change 'previous-single-property-change)
-
-(defalias 'kproperty:properties 'extent-properties-at)
-
-(defun kproperty:put (start end property-list &optional object)
-  "From START to END, add PROPERTY-LIST properties to the text.
-The optional fourth argument, OBJECT, is the string or buffer containing the
-text.  Text inserted before or after this region does not inherit the added
-properties."
-  ;; Don't use text properties internally because they don't work as desired
-  ;; when copied to a string and then reinserted, at least in some versions
-  ;; of XEmacs.
-  (let ((extent (make-extent start end object)))
-    (if (null extent)
-       (error "(kproperty:put): No extent at %d-%d to add properties %s"
-              start end property-list))
-    (if (/= (mod (length property-list) 2) 0)
-       (error "(kproperty:put): Property-list has odd number of elements, %s"
-              property-list))
-    (set-extent-property extent 'text-prop (car property-list))
-    (set-extent-property extent 'duplicable t)
-    (set-extent-property extent 'start-open t)
-    (set-extent-property extent 'end-open t)
-    (while property-list
-      (set-extent-property
-       extent (car property-list) (car (cdr property-list)))
-      (setq property-list (nthcdr 2 property-list)))
-    extent))
-
-(defun kproperty:remove (start end property-list &optional object)
-  "From START to END, remove the text properties in PROPERTY-LIST.
-The optional fourth argument, OBJECT, is the string or buffer containing the
-text.  PROPERTY-LIST should be a plist; if the value of a property is
-non-nil, then only a property with a matching value will be removed.
-Returns t if any property was changed, nil otherwise."
-  ;; Don't use text property functions internally because they only look for
-  ;; closed extents, which kproperty does not use.
-  (let ((changed) property value)
-    (while property-list
-      (setq property (car property-list)
-           value (car (cdr property-list))
-           property-list (nthcdr 2 property-list))
-      (map-extents
-       (lambda (extent maparg)
-        (if (extent-live-p extent)
-            (progn (setq changed t)
-                   (delete-extent extent)))
-        nil)
-       object start end nil nil property value))
-    changed))
-
-(defun kproperty:replace-separator (pos label-separator old-sep-len)
-  "Replace at POS the cell label separator with LABEL-SEPARATOR.
-OLD-SEP-LEN is the length of the separator being replaced."
-  (let (extent)
-    (while (setq pos (kproperty:next-single-change (point) 'kcell))
-      (goto-char pos)
-      (setq extent (extent-at pos))
-      ;; Replace label-separator while maintaining cell properties.
-      (insert label-separator)
-      (set-extent-endpoints extent pos (+ pos 2))
-      (delete-region (point) (+ (point) old-sep-len)))))
-
-(defun kproperty:set (property value)
-  "Set PROPERTY of character at point to VALUE."
-  (kproperty:put (point) (min (+ 2 (point)) (point-max))
-                (list property value)))
-
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
-
-;;; kprop-xe.el ends here
diff --git a/kotl/kproperty.el b/kotl/kproperty.el
index e1bec2d..865f9cc 100644
--- a/kotl/kproperty.el
+++ b/kotl/kproperty.el
@@ -1,25 +1,112 @@
-;;; kproperty.el --- Wrapper for koutline text property implementations
+;;; kproperty.el --- Kcell in-buffer property handling for the Koutliner
 ;;
 ;; Author:       Bob Weiner
 ;;
 ;; Orig-Date:    7/27/93
 ;;
-;; Copyright (C) 1993-2019  Free Software Foundation, Inc.
+;; Copyright (C) 1993-2021  Free Software Foundation, Inc.
 ;; See the "../HY-COPY" file for license information.
 ;;
 ;; This file is part of GNU Hyperbole.
 
 ;;; Commentary:
+;;    Stores and retrieves kcell properties as Emacs text properties
+;;    at the kcell label separator.
 
 ;;; Code:
 ;;; ************************************************************************
 ;;; Other required Elisp libraries
 ;;; ************************************************************************
 
-;; Ensures kotl/ is in load-path.
+;; Ensure kotl/ is in load-path.
 (require 'hyperbole)
 
-(load "kprop-em")
+;;; ************************************************************************
+;;; Public functions
+;;; ************************************************************************
+
+(defun kproperty:add-properties (plist)
+  "Add properties at point and the following character from PLIST."
+  (kproperty:put (point) (min (+ 2 (point)) (point-max))
+                plist))
+
+(defun kproperty:all-positions (property value)
+  "Return a list of all non-narrowed buffer positions of kcells with PROPERTY 
set to VALUE, else nil.
+Use (kcell-view:start <position>) on each returned <position> to get
+the start position of each cell's content."
+  (kproperty:map (lambda (start end) start) property value))
+
+(defalias 'kproperty:get 'get-text-property)
+
+(defun kproperty:map (function property value)
+  "Apply FUNCTION to each character with PROPERTY `eq' to VALUE in the current 
buffer.
+FUNCTION is called with the start and end points of the text span with the 
matching PROPERTY
+and with point at the start."
+  (let ((result)
+       (start (point-min))
+       end)
+    (save-excursion
+      (while (and (< start (point-max))
+                 (setq start (text-property-any start (point-max) property 
value)))
+       (goto-char start)
+       (setq end (or (text-property-not-all start (point-max) property value) 
(point-max))
+             result (cons (funcall function start end) result)
+             start end)))
+    (nreverse result)))
+
+(defalias 'kproperty:next-single-change 'next-single-property-change)
+
+(defun kproperty:position (property value)
+  "Return the non-narrowed buffer position of the first kcell with PROPERTY 
set to VALUE, else nil.
+Use (kcell-view:start <position>) on the returned <position> to get
+the start position of the cell's content."
+  (text-property-any (point-min) (point-max) property value))
+
+(defalias 'kproperty:previous-single-change 'previous-single-property-change)
+
+(defalias 'kproperty:properties 'text-properties-at)
+
+(defun kproperty:put (start end property-list &optional object)
+  "From START to END, add PROPERTY-LIST properties to the text.
+The optional fourth argument, OBJECT, is the string or buffer containing the
+text.  Text inserted before or after this region does not inherit the added
+properties."
+  (add-text-properties
+   start end (append property-list '(rear-nonsticky t)) object))
+
+(defun kproperty:remove (start end property-list &optional object)
+  "From START to END, remove the text properties in PROPERTY-LIST.
+The optional fourth argument, OBJECT, is the string or buffer containing the
+text.  PROPERTY-LIST should be a plist; if the value of a property is
+non-nil, then only a property with a matching value will be removed.
+Returns t if any property was changed, nil otherwise."
+  (let ((changed) plist property value next)
+    (while property-list
+      (setq property (car property-list)
+           value (car (cdr property-list))
+           plist (list property value)
+           property-list (nthcdr 2 property-list)
+           next start)
+      (while (setq next (text-property-any next end property value object))
+       (remove-text-properties next (1+ next) plist object)
+       (setq changed t next (1+ next))))
+    changed))
+
+(defun kproperty:replace-separator (pos label-separator old-sep-len)
+  "Replace at POS the cell label separator with LABEL-SEPARATOR.
+OLD-SEP-LEN is the length of the separator being replaced."
+  (let (properties)
+    (while (setq pos (kproperty:next-single-change (point) 'kcell))
+      (goto-char pos)
+      (setq properties (text-properties-at pos))
+      ;; Replace label-separator while maintaining cell properties.
+      (insert label-separator)
+      (add-text-properties pos (+ pos 2) properties)
+      (delete-region (point) (+ (point) old-sep-len)))))
+
+(defun kproperty:set (property value)
+  "Set PROPERTY of character at point and the following character to VALUE."
+  (kproperty:add-properties (list property value)))
 
 (provide 'kproperty)
 
diff --git a/kotl/kview.el b/kotl/kview.el
index d815307..a3ff628 100644
--- a/kotl/kview.el
+++ b/kotl/kview.el
@@ -111,7 +111,19 @@ Return t unless no such cell."
 
 (defun kcell-view:cell (&optional pos)
   "Return kcell at optional POS or point."
-  (kproperty:get (kcell-view:plist-point pos) 'kcell))
+  (kproperty:properties (kcell-view:plist-point pos)))
+
+(defun kcell-view:cell-from-ref (cell-ref)
+  "Return a kcell referenced by CELL-REF, a cell label, id string or integer 
idstamp.
+Trigger an error if CELL-REF is not a string or is not found."
+  (if (or (stringp cell-ref)
+         (integerp cell-ref))
+      (let ((idstamp (kcell:ref-to-id cell-ref))
+           pos)
+       (or (and idstamp (setq pos (kproperty:position 'idstamp idstamp))
+                (kcell-view:cell pos))
+           (error "(kcell:get-from-ref): No such Koutline cell: '%s'" 
cell-ref)))
+    (error "(kcell:get-from-ref): cell-ref arg must be a string, not: %s" 
cell-ref)))
 
 (defun kcell-view:child (&optional visible-p label-sep-len)
   "Move to start of current cell's child.
@@ -200,8 +212,8 @@ Any cell that is invisible is also collapsed as indicated 
by a call to
        (concat "\\([\n\r]\\)" (make-string indent ?\ ))
        (buffer-substring start end) "\\1"))))
 
-(defun kcell-view:create (kview cell level klabel &optional no-fill)
-  "Insert into KVIEW at point, CELL at LEVEL (1 = first level) with KLABEL.
+(defun kcell-view:create (kview cell contents level klabel &optional no-fill)
+  "Insert into KVIEW at point, CELL with CONTENTS at LEVEL (1 = first level) 
with KLABEL.
 Optional NO-FILL non-nil suppresses filling of cell's contents upon insertion
 or movement."
   (unless (zerop (kcell:idstamp cell))
@@ -223,11 +235,11 @@ or movement."
                          (length label-separator)))
           (old-point (point))
           (fill-prefix (make-string thru-label ?\ ))
-          contents new-point)
+          new-point)
       (when no-fill
        (kcell:set-attr cell 'no-fill t))
       (insert fill-prefix)
-      (setq contents (kview:insert-contents cell nil no-fill fill-prefix))
+      (setq contents (kview:insert-contents cell contents no-fill fill-prefix))
       ;; Insert lines to separate cell from next.
       (insert (if (or no-fill (equal contents ""))
                  "\n\n" "\n"))
@@ -247,7 +259,7 @@ or movement."
       (insert label-separator)
       (goto-char old-point)
       ;; Add cell's attributes to the text property list at point.
-      (kproperty:set 'kcell cell)
+      (kproperty:add-properties cell)
       (goto-char new-point))))
 
 (defun kcell-view:end (&optional pos)
@@ -471,10 +483,11 @@ or is nil), before it is returned."
   (save-excursion
     (when pos
       (goto-char pos))
+
     (let ((kcell (kcell:remove-attr (kcell-view:cell) attribute)))
       (when (called-interactively-p 'interactive)
-       (message "Cell <%s> now has no %s attribute."
-                (kcell-view:label) attribute))1
+       (message "Cell <%s> now has no %s attribute."
+                (kcell-view:label) attribute))
       kcell)))
 
 (defun kcell-view:set-attr (attribute value &optional pos)
@@ -489,7 +502,7 @@ or is nil), before it is returned."
   "Attach KCELL property to cell at point."
   (save-excursion
     (kcell-view:to-label-end)
-    (kproperty:set 'kcell kcell)))
+    (kproperty:add-properties kcell)))
 
 (defun kcell-view:sibling-p (&optional pos visible-p label-sep-len)
   "Return t if cell at optional POS or point has a successor.
@@ -541,8 +554,8 @@ level."
   (let* ((idstamp (if (klabel:idstamp-p klabel)
                      (if (stringp klabel) (string-to-number klabel) klabel)
                    (kview:id-increment kview)))
-        (new-cell (kcell:create contents idstamp prop-list)))
-    (kcell-view:create kview new-cell level klabel no-fill)
+        (new-cell (kcell:create idstamp prop-list)))
+    (kcell-view:create kview new-cell contents level klabel no-fill)
     new-cell))
 
 (defun kview:beginning-of-actual-line ()
@@ -704,25 +717,16 @@ the lines displayed, since it has hidden branches."
           (t 0)))
    kview t start end))
 
-(defun kview:goto-cell-id (id-string)
-  "Move point to start of cell with idstamp ID-STRING and return t, else nil."
-  (let ((cell-id (string-to-number id-string))
-       (opoint (point))
-       pos kcell)
-    (goto-char (point-min))
-    (while (and (setq pos (kproperty:next-single-change (point) 'kcell))
-               (goto-char pos)
-               (or (null (setq kcell (kproperty:get pos 'kcell)))
-                   (/= (kcell:idstamp kcell) cell-id))
-               ;; Skip to the end of this kcell property
-               (setq pos (kproperty:next-single-change (point) 'kcell))
-               (goto-char pos)))
-    (if pos
-       (progn
-         (forward-char (kview:label-separator-length kview))
-         t)
-      (goto-char opoint)
-      nil)))
+(defun kview:goto-cell-id (idstamp-or-string)
+  "Move point to start of cell with permanent IDSTAMP-OR-STRING and return t, 
else nil."
+  (let* ((idstamp (if (integerp idstamp-or-string)
+                     idstamp-or-string
+                   (string-to-number idstamp-or-string)))
+        (pos (kproperty:position 'idstamp idstamp)))
+    (when pos
+      (goto-char pos)
+      (forward-char (kview:label-separator-length kview))
+      t)))
 
 (defun kview:id-counter (kview)
   "Return the highest current idstamp (an integer) used by KVIEW."
@@ -742,12 +746,13 @@ the lines displayed, since it has hidden branches."
 
 (defun kview:insert-contents (kcell contents no-fill fill-prefix)
   "Insert KCELL's CONTENTS into view at point and fill resulting paragraphs, 
unless NO-FILL is non-nil.
-FILL-PREFIX is the indentation string for the current cell.
-If CONTENTS is nil, get contents from KCELL.  Return contents inserted (this
-value may differ from the value passed in.)"
+FILL-PREFIX is the indentation string for the current cell.  If
+CONTENTS is nil, get contents from the cell at point.  Return contents
+inserted (this value may differ from the value passed in) due to
+filling."
   (let ((start (point))
        end)
-    (setq contents (or contents (kcell:contents kcell) ""))
+    (setq contents (or contents ""))
     (insert contents)
     ;;
     ;; Delete any extra newlines at end of cell contents.
@@ -1057,9 +1062,10 @@ FILL-P is non-nil.  Leave point at TO-START."
          (if (< from-indent to-indent)
              ;; Add indent
              (progn
-               (setq expr (make-string (1+ (- to-indent from-indent)) ?\ ))
-               (while (re-search-forward "^ " nil t)
-                 (replace-match expr t t)
+               (setq expr (concat (make-string (- to-indent from-indent) ?\ )
+                                  "\\&"))
+               (while (re-search-forward "^[^\n\r\f]" nil t)
+                 (replace-match expr t)
                  (kfill:forward-line 1)))
            ;; Reduce indent in all but first cell lines.
            (setq expr (concat "^" (make-string (- from-indent to-indent) ?\ )))
diff --git a/kotl/kvspec.el b/kotl/kvspec.el
index 257c6e7..51e723c 100644
--- a/kotl/kvspec.el
+++ b/kotl/kvspec.el
@@ -77,6 +77,7 @@ VIEW-SPEC is a string or t, which means recompute the current 
view spec.  See
 <${hyperb:dir}/kotl/EXAMPLE.kotl, 2b17=048> for details on valid view specs."
   (interactive (list (read-string "Set view spec: " kvspec:current)))
   (kotl-mode:is-p)
+  (kfile:narrow-to-kcells)
   (when (equal view-spec "")
     (setq view-spec nil))
   (kvspec:initialize)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]