|
Subject: Re: Preceding list function From: Norman Walsh <ndw@xxxxxxxxxx> Date: 08 Aug 2000 07:54:32 -0400 |
/ Brandon Ibach <bibach@xxxxxxxxxxxxxx> was heard to say:
| Well, here's a possible solution (untested, mind you). I know I
| don't have your most recent stylesheets, so I'll just quote the
| relevant function from the ones I have, with the parts that I changed
| commented.
Thanks, Brandon. In considering your solution, I couldn't convince myself
that it handled all of the various nesting cases correctly.
[...]
| Now... the changes. By adding orderedlist to the list of gis to
| match in the call to ancestor-member, we can narrow our search to only
| the other lists within the parent orderedlist, if there is one. Of
| course, we need to start with the parent of the current list, to avoid
| matching the list we're in.
I wasn't, for example, sure that simply parent was looking far enough
back, since we could be nested arbitrarily deep.
Anyway, I decided to just start over. Here's what I came up with, and
it seems to work.
(define (orderedlist-listitem-number listitem)
;; return the number of listitem, taking continuation into account
(let* ((orderedlist (parent listitem))
(listitems (select-elements (children orderedlist)
(normalize "listitem")))
(continue? (equal? (attribute-string (normalize "continuation")
orderedlist)
(normalize "continues")))
;; If a list is the continuation of a previous list, we must find the
;; list that is continued in order to calculate the starting
;; item number of this list.
;;
;; Of all the lists in this component, only the following are candidates:
;; 1. Lists which precede this list
;; 2. Lists which are not ancestors of this list
;; 3. Lists that do not have ancestors that are lists which precede this one
;;
;; Of the candidates, the last one, in document order, is the preceding
;; list
(all-lists (select-elements
(descendants (ancestor-member orderedlist
(component-element-list)))
(normalize "orderedlist")))
(cand1 (if continue?
(let loop ((nl all-lists)
(prec (empty-node-list)))
(if (node-list-empty? nl)
prec
(if (node-list=? (node-list-first nl)
orderedlist)
prec
(loop (node-list-rest nl)
(node-list prec
(node-list-first nl))))))
(empty-node-list)))
(cand2 (let loop ((nl cand1)
(cand2lists (empty-node-list)))
(if (node-list-empty? nl)
cand2lists
(loop (node-list-rest nl)
(if (descendant-of? (node-list-first nl)
orderedlist)
cand2lists
(node-list cand2lists
(node-list-first nl)))))))
;; now find the last item of cand2 that is not a descendant
;; of some other element of the cand2 list.
(preclist (let loop ((nl (node-list-reverse cand2)))
(if (node-list-empty? nl)
(empty-node-list)
(if (descendant-member-of?
(node-list-first nl)
(node-list-rest nl))
(loop (node-list-rest nl))
(node-list-first nl)))))
(precitem (if (node-list-empty? preclist)
(empty-node-list)
(node-list-last (children preclist))))
(precitem-number (if (and continue? (not (node-list-empty? precitem)))
(orderedlist-listitem-number precitem)
0)))
(+ precitem-number (child-number listitem))))
(define (descendant-member-of? node node-list)
;; return true if node is a descedant of any member of node-list
(let loop ((nl node-list))
(if (node-list-empty? nl)
#f
(if (descendant-of? (node-list-first nl) node)
#t
(loop (node-list-rest nl))))))
Be seeing you,
norm
--
Norman Walsh <ndw@xxxxxxxxxx> | The truest wild beasts live in the most
http://nwalsh.com/ | populous places.--Graci\'an
DSSSList info and archive: http://www.mulberrytech.com/dsssl/dssslist
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: Preceding list function, Brandon Ibach | Thread | Re: Preceding list function, Brandon Ibach |
| jadetex/tex: capacity exceeded erro, Deborah Greenberg Li | Date | Re: jadetex/tex: capacity exceeded , Sebastian Rahtz |
| Month |