comparison lisp/hyperbole/kotl/kotl.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
1 ;;!emacs
2 ;;
3 ;; FILE: kotl.el
4 ;; SUMMARY: Internal representation of outline kcells used by kviews.
5 ;; USAGE: GNU Emacs Lisp Library
6 ;; KEYWORDS: outlines, wp
7 ;;
8 ;; AUTHOR: Kellie Clark & Bob Weiner
9 ;;
10 ;; ORIG-DATE: 5/1/93
11 ;; LAST-MOD: 29-Oct-95 at 11:13:47 by Bob Weiner
12 ;;
13 ;; This file is part of Hyperbole.
14 ;; Available for use and distribution under the same terms as GNU Emacs.
15 ;;
16 ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
17 ;; Developed with support from Motorola Inc.
18 ;;
19 ;; DESCRIPTION:
20 ;;
21 ;; DESCRIP-END.
22
23 ;;; ************************************************************************
24 ;;; Other required Elisp libraries
25 ;;; ************************************************************************
26
27 (mapcar 'require '(klabel knode hinit htz))
28
29 ;;; ************************************************************************
30 ;;; Public variables
31 ;;; ************************************************************************
32
33 (defvar kcell:read-only-attributes
34 '(idstamp creator create-time modifier mod-time)
35 "List of kcell attributes which may not be modified by a user.
36 Add to this list but don't remove any of the default elements.")
37
38 ;;; ************************************************************************
39 ;;; Public functions
40 ;;; ************************************************************************
41
42 ;;;
43 ;;; kcell
44 ;;;
45
46 (fset 'kcell:contents 'knode:contents)
47
48 (defun kcell:copy (kcell)
49 "Return a copy of KCELL."
50 (knode:copy kcell))
51
52 (defun kcell:create (contents idstamp &optional plist)
53 "Return a new kcell which stores CONTENTS (a string or nil), has permanent IDSTAMP (an integer), and optional additional property list, PLIST.
54 User id of `creator' of cell and `create-time' are added to cell's PLIST if
55 not already there."
56 (and contents (not (stringp contents))
57 (error "(kcell:create): Invalid `contents' argument: %s" contents))
58 (if (or (not (integerp idstamp)) (< idstamp 0))
59 (error "(kcell:create): Invalid `idstamp' argument: %s" idstamp))
60 (knode:create
61 contents (nconc (list 'idstamp idstamp)
62 (if (memq 'creator plist)
63 nil
64 (list 'creator (concat (user-login-name)
65 hyperb:host-domain)
66 'create-time (htz:date-sortable-gmt)))
67 plist)))
68
69 (defun kcell:create-top (&optional file counter)
70 "Return a new koutline top cell optionally attached to FILE with current idstamp COUNTER."
71 (kcell:create nil 0
72 ;; id-counter = max idstamp value given out in this kotl
73 (list 'id-counter (or counter 0) 'file file)))
74
75 (defun kcell:get-attr (kcell attribute)
76 "Return the value of KCELL's ATTRIBUTE."
77 (knode:get-attr (kcell:plist kcell) attribute))
78
79 (defun kcell:idstamp (kcell)
80 "Return permanent idstamp of KCELL as an integer."
81 (kcell:get-attr kcell 'idstamp))
82
83 (fset 'kcell:is-p 'knode:is-p)
84
85 (defun kcell:plist (kcell)
86 (knode:get-attr kcell 'plist))
87
88 (defun kcell:ref-to-id (cell-ref)
89 "Returns a CELL-REF string converted to a cell identifier string.
90 If CELL-REF contains both a relative and a permanent id, the permanent id is
91 returned. If CELL-REF is invalid, nil is returned.
92
93 CELL-REF may be of any of the following forms:
94 1b - relative id, augment style
95 1.2 - relative id, legal style
96 012 - permanent idstamp
97 1a=012 - both relative and permanent ids (in that order) separated by =
98 |viewspec - a viewspec setting, rather than a cell reference
99 :viewspec - an augment viewspec, ignored for now.
100
101 Optionally, any of the above id forms may be followed by a period and some
102 alpha characters indicating a location relative to the id.
103
104 Optionally, any of these id forms (or the relative form) may be followed by
105 zero or more whitespace characters, a | and some view specification
106 characters. Augment viewspec characters preceded by a colon are ignored, for
107 now."
108
109 (if (not (stringp cell-ref))
110 nil
111 (setq cell-ref (hypb:replace-match-string "\\s +" cell-ref "" t))
112 (let ((specs) result)
113 ;; Ignore Augment :viewspecs.
114 (if (string-match ":" cell-ref)
115 (setq cell-ref (substring cell-ref 0 (match-beginning 0))))
116 ;; Separate koutline |viewspecs from cell id.
117 (if (string-match "\\(\\.[a-zA-Z]\\||\\)" cell-ref)
118 (setq specs (substring cell-ref (match-beginning 1))
119 cell-ref (substring cell-ref 0 (match-beginning 0))))
120 (setq result
121 (cond
122 ((string-match "[^.= \t\n0-9a-zA-Z]" cell-ref) nil)
123 ((string-match "^\\([.0-9a-zA-Z]+\\)=\\(0[0-9]*\\)$"
124 cell-ref)
125 (substring cell-ref (match-beginning 2) (match-end 2)))
126 ((string-match "^\\([.0-9a-zA-Z]+\\)$" cell-ref)
127 (substring cell-ref (match-beginning 1) (match-end 1)))))
128 (cond (result
129 (if specs (concat result specs) result))
130 (specs
131 (if (= ?| (aref specs 0)) specs))))))
132
133 (defun kcell:remove-attr (kcell attribute)
134 "Remove KCELL's ATTRIBUTE, if any, return modified KCELL."
135 (knode:set-attr
136 kcell 'plist (knode:remove-attr (kcell:plist kcell) attribute)))
137
138 (defun kcell:set-attr (kcell attribute value)
139 "Set KCELL's ATTRIBUTE to VALUE and return modified KCELL."
140 (knode:set-attr
141 kcell 'plist (knode:set-attr (kcell:plist kcell)
142 attribute value)))
143
144 (defun kcell:set-create-time (kcell)
145 "Store the time of creation of KCELL."
146 (kcell:set-attr kcell 'create-time (htz:date-sortable-gmt)))
147
148 (defun kcell:set-creator (kcell)
149 "Store the current user's id as the creator of KCELL."
150 (kcell:set-attr
151 kcell 'creator (concat (user-login-name) hyperb:host-domain)))
152
153 (defun kcell:set-idstamp (kcell idstamp)
154 "Set KCELL's permanent IDSTAMP (an integer) and return IDSTAMP."
155 (kcell:set-attr kcell 'idstamp idstamp)
156 (kcell:idstamp kcell))
157
158 ;;;
159 ;;; kotl-data - Persistent representation of kotl cells (written to files).
160 ;;;
161
162 (defun kotl-data:create (cell)
163 "Given a kotl CELL, return a kotl-data structure to write to a file.
164 If CELL, its idstamp, or its property list are nil, this repairs the cell by
165 assuming it is the cell at point and filling in the missing information."
166 (let ((idstamp (kcell:idstamp cell))
167 (plist (nthcdr 2 (kcell:plist cell))))
168 (if (and cell idstamp plist)
169 (vector idstamp plist)
170 (kotl-data:create
171 (kcell:create nil
172 (or idstamp (kview:id-increment kview))
173 plist)))))
174
175 (defun kotl-data:idstamp (kotl-data)
176 (aref kotl-data 0))
177
178 (defun kotl-data:plist-v2 (kotl-data)
179 (aref kotl-data 2))
180
181 (defun kotl-data:plist-v3 (kotl-data)
182 (aref kotl-data 1))
183
184 (defun kotl-data:to-kcell-v2 (kotl-data)
185 (if (vectorp kotl-data)
186 (kcell:create
187 ;; Cell contents are no longer put into cells themselves by default
188 ;; when a file is read. The contents are stored within the kview
189 ;; buffer, so use nil as a place-holder.
190 nil
191 ;; Repair invalid idstamps on the fly.
192 (or (kotl-data:idstamp kotl-data) (kview:id-increment kview))
193 (kotl-data:plist-v2 kotl-data))
194 ;; Repair invalid cells on the fly.
195 (kcell:create nil (kview:id-increment kview))))
196
197 (defun kotl-data:to-kcell-v3 (kotl-data)
198 (if (vectorp kotl-data)
199 (kcell:create
200 ;; Cell contents are no longer put into cells themselves by default
201 ;; when a file is read. The contents are stored within the kview
202 ;; buffer, so use nil as a place-holder.
203 nil
204 ;; Repair invalid idstamps on the fly.
205 (or (kotl-data:idstamp kotl-data) (kview:id-increment kview))
206 (kotl-data:plist-v3 kotl-data))
207 ;; Repair invalid cells on the fly.
208 (kcell:create nil (kview:id-increment kview))))
209
210 (provide 'kotl)