summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/guile/skribilo/ast.scm22
-rw-r--r--src/guile/skribilo/engine/lout.scm22
2 files changed, 30 insertions, 14 deletions
diff --git a/src/guile/skribilo/ast.scm b/src/guile/skribilo/ast.scm
index 542f629..55f37bf 100644
--- a/src/guile/skribilo/ast.scm
+++ b/src/guile/skribilo/ast.scm
@@ -30,6 +30,9 @@
 
   :autoload (skribilo location) (location?)
   :autoload (srfi srfi-1)  (fold)
+
+  :use-module (ice-9 optargs)
+
   :export (<ast> ast? ast-loc ast-loc-set!
 		 ast-parent ast->string ast->file-location
 		 ast-resolved?
@@ -62,6 +65,9 @@
            find-up find1-up
            ast-document ast-chapter ast-section
 
+           ;; numbering
+           markup-number-string
+
 	   ;; error conditions
 	   &ast-error &ast-orphan-error &ast-cycle-error
 	   &markup-unknown-option-error &markup-already-bound-error
@@ -596,6 +602,22 @@
 (define (ast-section m)
   (find1-up (lambda (n) (is-markup? n 'section)) m))
 
+
+;;;
+;;; Section numbering.
+;;;
+
+(define* (markup-number-string markup :optional (sep "."))
+  ;; Return a structure number string such as "1.2".
+  (let loop ((markup markup))
+    (if (document? markup)
+	""
+	(let ((parent-num (loop (ast-parent markup)))
+	      (num (markup-option markup :number)))
+	  (string-append parent-num
+			 (if (string=? "" parent-num) "" sep)
+			 (if (number? num) (number->string num) ""))))))
+
 
 ;;; arch-tag: e2489bd6-1b6d-4b03-bdfb-83cffd2f7ce7
 
diff --git a/src/guile/skribilo/engine/lout.scm b/src/guile/skribilo/engine/lout.scm
index 272b131..6106f35 100644
--- a/src/guile/skribilo/engine/lout.scm
+++ b/src/guile/skribilo/engine/lout.scm
@@ -502,7 +502,7 @@
     (if num
 	(begin
 	  (if (is-markup? node 'chapter) (display "@B { "))
-	  (printf "~a. |2s " (lout-structure-number-string node))
+	  (printf "~a. |2s " (markup-number-string node))
 	  (output title engine)
 	  (if (is-markup? node 'chapter) (display " }")))
 	(if (is-markup? node 'chapter)
@@ -525,7 +525,7 @@
 (define (lout-pdf-bookmark-title node engine)
   ;; Default implementation of the `pdf-bookmark-title-proc' custom that
   ;; returns a title (a string) for the PDF bookmark of `node'.
-  (let ((number (lout-structure-number-string node)))
+  (let ((number (markup-number-string node)))
     (string-append  (if (string=? number "") "" (string-append number ". "))
 		    (ast->string (markup-option node :title)))))
 
@@ -1321,17 +1321,11 @@
 		     doc-type)))))
 
 (define-public (lout-structure-number-string markup)
-  ;; Return a structure number string such as "1.2".
-  ;; FIXME: External code has started to rely on this.  This should be
-  ;;        generalized and moved elsewhere.
-  (let loop ((struct markup))
-    (if (document? struct)
-	""
-	(let ((parent-num (loop (ast-parent struct)))
-	      (num (markup-option struct :number)))
-	  (string-append parent-num
-			 (if (string=? "" parent-num) "" ".")
-			 (if (number? num) (number->string num) ""))))))
+  ;; FIXME: External code has started to rely on this before this was moved
+  ;; to the `ast' module as `markup-number-string'.  Thus, we'll have to keep it
+  ;; here for some time.
+  (markup-number-string markup "."))
+
 
 ;*---------------------------------------------------------------------*/
 ;*    lout-block-before ...                                            */
@@ -1360,7 +1354,7 @@
 
 	   (if (number? number)
 	       (printf "  @BypassNumber { ~a }\n"
-		       (lout-structure-number-string n))
+		       (markup-number-string n))
 	       (if (not number)
 		   ;; this trick hides the section number
 		   (printf "  @BypassNumber { } # unnumbered\n")))