Transform flat document to hierarchical document

;; Contents of continued para is transformed relative to
;; previous para of same level

(=> (children (q-element '(p (cont cont))))
    (create-sub
      (node-list-last
       (select-elements
        (preced (current-node))
        `(p (level ,(attribute-string
                     (current-node)
                     "level")
            cont nocont))))
      (copy-current))
    1)

;; Leave out continued P elements

(=> (q-element '(p (cont cont)))
    '()
    1)

(=> (q-element '(p (cont nocont)))
    (if (node-list-empty? (ipreced (current-node)))
        (identity-transform-by-origin)
        (let* ((last-nocont   ; last non-continued P
                (node-list-last
                 (select-elements (preced (current-node))
                                  '(p (cont nocont)))))
               (inc           ; change in list level
                (- (string->number
                    (attribute-string (current-node)
                                      "level"))
                   (string->number
                    (attribute-string last-nocont
                                      "level")))))
          (cond ((> inc 0)
                 (create-sub last-nocont
                             (l-i-p-subgrove inc))
                ((match-element? (current-node) '(p (mark mark)))
                 (create-follow (last-nocont-same-level-p)
                                (subgrove-spec
                                 class: 'element
                                 add: '((gi "I"))
                                 label: 'ignore
                                 children: (list (copy-current)))
                                result-path: parent))
                (else
                 (create-follow (last-nocont-same-level-p)
                                (copy-current))))))
    1)

(define (last-nocont-same-level-p)
  (node-list-last
   (select-elements
    (preced (current-node))
    `(p (level ,(attribute-string (current-node)
                                  "level")
         cont nocont)))))

(define (l-i-p-subgrove rep)
  (subgrove-spec
   class: 'element
   add: '((gi "L"))
   label: 'ignore
   children:
   (list
    (subgrove-spec
     class: 'element
     add: '((gi "I"))
     label: 'ignore
     children: (if (= rep 1)
                   (subgrove-spec
                    class: 'element
                    add: '((gi "P")))
                   (subgrove-spec
                    class: 'element
                    add: '((gi "P"))
                    label: 'ignore
                    children:
                    (list
                     (l-i-p-subgrove (- rep 1)))))))))

;; Leave out attributes of P element

(=> (attributes (q-element 'p))
    '()
    1)

(=> (current-root)
    (create-root
     #f
     (subgrove-spec
      subgrove: (sgml-parse-prolog "hierarch.sgm"))))

(=> (document-instance)
    (default-transform))
[Prev][Next]