about summary refs log tree commit diff
path: root/src/guile/skribilo/ast.scm
diff options
context:
space:
mode:
authorLudovic Court`es2006-07-20 09:49:41 +0000
committerLudovic Court`es2006-07-20 09:49:41 +0000
commit9edadfcf60d6f507038585010b83813132a41c03 (patch)
tree3597568d77346f8b0c065ebc7ef970be6ce96817 /src/guile/skribilo/ast.scm
parent6d153732418f61e12f94c15686523f6898a8b99d (diff)
downloadskribilo-9edadfcf60d6f507038585010b83813132a41c03.tar.gz
skribilo-9edadfcf60d6f507038585010b83813132a41c03.tar.lz
skribilo-9edadfcf60d6f507038585010b83813132a41c03.zip
Removed the `(skribilo skribe utils)' module.
* src/guile/skribilo/ast.scm (find-markup-ident): New, copied from
  `(skribilo skribe utils)'.
  (container-search-down): Likewise.
  (search-down): Likewise.
  (find-down): Likewise.
  (find1-down): Likewise.
  (find1-up): Likewise.
  (ast-document): Likewise.
  (ast-chapter): Likewise.
  (ast-section): Likewise.

* src/guile/skribilo/engine.scm (engine-custom-add!): Likewise.

* src/guile/skribilo/module.scm (%skribilo-user-imports): Added
  `(skribilo utils keywords)'.
  (%skribe-core-modules): Removed `utils'.

* src/guile/skribilo/package/eq.scm: Use `utils keywords' instead of
  `skribe utils'.

* src/guile/skribilo/package/eq/lout.scm: Likewise.

* src/guile/skribilo/skribe/Makefile.am (dist_guilemodule_DATA): Removed
  `utils.scm'.

* src/guile/skribilo/utils/Makefile.am (dist_guilemodule_DATA): Added
  `keywords.scm'.

git-archimport-id: lcourtes@laas.fr--2005-libre/skribilo--devo--1.2--patch-17
Diffstat (limited to 'src/guile/skribilo/ast.scm')
-rw-r--r--src/guile/skribilo/ast.scm124
1 files changed, 122 insertions, 2 deletions
diff --git a/src/guile/skribilo/ast.scm b/src/guile/skribilo/ast.scm
index ee53f30..fdfecd4 100644
--- a/src/guile/skribilo/ast.scm
+++ b/src/guile/skribilo/ast.scm
@@ -1,6 +1,7 @@
 ;;; ast.scm  --  Skribilo abstract syntax trees.
 ;;;
 ;;; Copyright 2003, 2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
+;;; Copyright 2003, 2004  Manuel Serrano
 ;;; Copyright 2005, 2006  Ludovic Courtès <ludovic.courtes@laas.fr>
 ;;;
 ;;;
@@ -47,9 +48,15 @@
 		       container-env-get
 
 	   <document> document? document-ident document-body
-		      document-options document-end))
+		      document-options document-end
 
-;;; Author:  Ludovic Courtès
+           ;; traversal
+           find-markup-ident
+           container-search-down search-down find-down find1-down
+           find-up find1-up
+           ast-document ast-chapter ast-section))
+
+;;; Author:  Erick Gallesio, Manuel Serrano, Ludovic Courtès
 ;;;
 ;;; Commentary:
 ;;;
@@ -365,6 +372,119 @@
 (define document-env         container-env)
 
 
+
+;;;
+;;; AST traversal utilities.
+;;;
+
+
+;; The procedures below are almost unchanged compared to Skribe 1.2d's
+;; `lib.scm' file found in the `common' directory, written by Manuel Serrano
+;; (I removed uses of `with-debug' et al., though).
+
+
+(define (find-markup-ident ident)
+  (let ((r (find-markups ident)))
+    (if (or (pair? r) (null? r))
+        r
+        '())))
+
+(define (container-search-down pred obj)
+  (let loop ((obj (markup-body obj)))
+    (cond
+     ((pair? obj)
+      (apply append (map (lambda (o) (loop o)) obj)))
+     ((container? obj)
+      (let ((rest (loop (markup-body obj))))
+        (if (pred obj)
+            (cons obj rest)
+            rest)))
+     ((pred obj)
+      (list obj))
+     (else
+      '()))))
+
+(define (search-down pred obj)
+  (let loop ((obj (markup-body obj)))
+    (cond
+     ((pair? obj)
+      (apply append (map (lambda (o) (loop o)) obj)))
+     ((markup? obj)
+      (let ((rest (loop (markup-body obj))))
+        (if (pred obj)
+            (cons obj rest)
+            rest)))
+     ((pred obj)
+      (list obj))
+     (else
+      '()))))
+
+(define (find-down pred obj)
+  (let loop ((obj obj))
+    (cond
+     ((pair? obj)
+      (apply append (map (lambda (o) (loop o)) obj)))
+     ((markup? obj)
+      (if (pred obj)
+          (list (cons obj (loop (markup-body obj))))
+          '()))
+     (else
+      (if (pred obj)
+          (list obj)
+          '())))))
+
+(define (find1-down pred obj)
+  (let loop ((obj obj)
+             (stack '()))
+    (cond
+     ((memq obj stack)
+      (skribe-error 'find1-down "Illegal cyclic object" obj))
+     ((pair? obj)
+      (let liip ((obj obj))
+        (cond
+         ((null? obj)
+          #f)
+         (else
+          (or (loop (car obj) (cons obj stack))
+              (liip (cdr obj)))))))
+     ((pred obj)
+      obj)
+     ((markup? obj)
+      (loop (markup-body obj) (cons obj stack)))
+     (else
+      #f))))
+
+(define (find-up pred obj)
+  (let loop ((obj obj)
+             (res '()))
+    (cond
+     ((not (ast? obj))
+      res)
+     ((pred obj)
+      (loop (ast-parent obj) (cons obj res)))
+     (else
+      (loop (ast-parent obj) (cons obj res))))))
+
+(define (find1-up pred obj)
+  (let loop ((obj obj))
+    (cond
+     ((not (ast? obj))
+      #f)
+     ((pred obj)
+      obj)
+     (else
+      (loop (ast-parent obj))))))
+
+(define (ast-document m)
+  (find1-up document? m))
+
+(define (ast-chapter m)
+  (find1-up (lambda (n) (is-markup? n 'chapter)) m))
+
+(define (ast-section m)
+  (find1-up (lambda (n) (is-markup? n 'section)) m))
+
+
 ;;; arch-tag: e2489bd6-1b6d-4b03-bdfb-83cffd2f7ce7
 
 ;;; ast.scm ends here