summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guile/skribilo/biblio.scm103
-rw-r--r--src/guile/skribilo/biblio/template.scm13
2 files changed, 92 insertions, 24 deletions
diff --git a/src/guile/skribilo/biblio.scm b/src/guile/skribilo/biblio.scm
index 55f2ea9..d3fc472 100644
--- a/src/guile/skribilo/biblio.scm
+++ b/src/guile/skribilo/biblio.scm
@@ -29,7 +29,7 @@
   :autoload   (srfi srfi-34)         (raise)
   :use-module (srfi srfi-35)
   :use-module (srfi srfi-39)
-  :autoload   (skribilo condition)   (&file-search-error)
+  :use-module (skribilo condition)
 
   :autoload   (skribilo reader)      (%default-reader)
   :autoload   (skribilo parameters)  (*bib-path*)
@@ -45,7 +45,14 @@
            bib-load! resolve-bib resolve-the-bib make-bib-entry
 
            ;; sorting entries
-           bib-sort/authors bib-sort/idents bib-sort/dates))
+           bib-sort/authors bib-sort/idents bib-sort/dates
+
+           ;; error conditions
+           &biblio-error &biblio-entry-error &biblio-template-error
+           biblio-error? biblio-entry-error? biblio-template-error?
+           biblio-entry-error:entry
+           biblio-template-error:expression
+           biblio-template-error:template))
 
 ;;; Author: Erick Gallesio, Manuel Serrano, Ludovic Courtès
 ;;;
@@ -61,6 +68,52 @@
 
 
 ;;;
+;;; Error conditions.
+;;;
+
+(define-condition-type &biblio-error &skribilo-error
+  biblio-error?)
+
+(define-condition-type &biblio-entry-error &biblio-error
+  biblio-entry-error?
+  (entry biblio-entry-error:entry))
+
+(define-condition-type &biblio-template-error &biblio-error
+  biblio-template-error?
+  (expression  biblio-template-error:expression)
+  (template    biblio-template-error:template))
+
+
+(define (handle-biblio-error c)
+  ;; Issue a user-friendly error message for error condition C.
+  (cond ((biblio-entry-error? c)
+         (let* ((entry (biblio-entry-error:entry c))
+                (file  (source-property entry 'filename))
+                (col   (source-property entry 'column))
+                (line  (source-property entry 'line)))
+           (if (and file col line)
+               (format (current-error-port)
+                       (_ "~a:~a:~a: invalid bibliography entry: ~a~%")
+                       file line col)
+               (format (current-error-port)
+                       (_ "invalid bibliography entry: ~a~%")
+                       entry))))
+	((biblio-template-error? c)
+	 (format (current-error-port)
+                 (_ "invalid bibliography entry template: `~a', in `~a'~%")
+                 (biblio-template-error:expression c)
+                 (biblio-template-error:template c)))
+	(else
+	 (format (current-error-port)
+                 (_ "undefined bibliography error: ~a~%")
+		 c))))
+
+(register-error-condition-handler! biblio-error?
+				   handle-biblio-error)
+
+
+
+;;;
 ;;; Accessors.
 ;;;
 
@@ -74,15 +127,11 @@
 (define *bib-table*
   (make-parameter (make-bib-table "default-bib-table")))
 
-(define (%bib-error who entry)
-  (let ((msg "bibliography syntax error on entry"))
-    (if (%epair? entry)
-	(skribe-line-error (%epair-file entry) (%epair-line entry) who msg entry)
-	(skribe-error who msg entry))))
-
 (define (bib-add! table . entries)
   (if (not (bib-table? table))
-      (skribe-error 'bib-add! "Illegal bibliography table" table)
+      (raise (condition
+              (&invalid-argument-error (proc-name "bib-add!")
+                                       (argument table))))
       (for-each (lambda (entry)
 		  (cond
 		    ((and (list? entry) (> (length entry) 2))
@@ -95,7 +144,8 @@
 			   (hash-set! table key
 				      (make-bib-entry kind key fields #f)))))
 		    (else
-		     (%bib-error 'bib-add! entry))))
+                     (raise (condition
+                             (&biblio-entry-error (entry entry)))))))
 		entries)))
 
 (define* (bib-for-each proc :optional (table (*bib-table*)))
@@ -129,7 +179,9 @@
 (define (parse-bib table port)
   (let ((read %default-reader)) ;; FIXME: We should use a fluid
     (if (not (bib-table? table))
-	(skribe-error 'parse-bib "Illegal bibliography table" table)
+        (raise (condition
+                (&invalid-argument-error (proc-name "parse-bib")
+                                         (argument table))))
 	(let ((from (port-filename port)))
 	  (let Loop ((entry (read port)))
 	    (unless (eof-object? entry)
@@ -145,7 +197,8 @@
 				 (make-bib-entry kind key fields from)))
 		  (Loop (read port))))
 	       (else
-		(%bib-error 'bib-parse entry)))))))))
+                (raise (condition
+                        (&biblio-entry-error (entry entry))))))))))))
 
 (define* (open-bib-file file :optional (command #f))
  (let ((path (search-path (*bib-path*) file)))
@@ -180,25 +233,31 @@
 ;*---------------------------------------------------------------------*/
 (define (bib-load! table filename command)
    (if (not (bib-table? table))
-       (skribe-error 'bib-load "Illegal bibliography table" table)
+       (raise (condition
+               (&invalid-argument-error (proc-name "bib-load!")
+                                        (argument table))))
        ;; read the file
        (let ((p (open-bib-file filename command)))
-	  (if (not (input-port? p))
-	      (skribe-error 'bib-load "Can't open data base" filename)
-	      (unwind-protect
-		 (parse-bib table p)
-		 (close-input-port p))))))
+         (unwind-protect
+           (parse-bib table p)
+           (close-input-port p)))))
 
 ;*---------------------------------------------------------------------*/
 ;*    resolve-bib ...                                                  */
 ;*---------------------------------------------------------------------*/
 (define (resolve-bib table ident)
    (if (not (bib-table? table))
-       (skribe-error 'resolve-bib "Illegal bibliography table" table)
+       (raise (condition
+               (&invalid-argument-error (proc-name "resolve-bib")
+                                        (argument table))))
        (let* ((i (cond
 		    ((string? ident) ident)
 		    ((symbol? ident) (symbol->string ident))
-		    (else (skribe-error 'resolve-bib "Illegal ident" ident))))
+		    (else
+                     (raise (condition
+                             (&invalid-argument-error
+                              (proc-name "resolve-bib")
+                              (argument ident)))))))
 	      (en (hash-ref table i)))
 	  (if (is-markup? en '&bib-entry)
 	      en
@@ -339,7 +398,9 @@
 				       :body (make <handle> :ast (car es))))
 		(loop (cdr es) (+ i 1))))))
    (if (not (bib-table? table))
-       (skribe-error 'resolve-the-bib "Illegal bibliography table" table)
+       (raise (condition
+               (&invalid-argument-error (proc-name "resolve-the-bib")
+                                        (argument table))))
        (let* ((es (sort (hash-map->list (lambda (key val) val) table)))
 	      (fes (filter (if (procedure? pred)
 			       (lambda (m) (pred m n))
diff --git a/src/guile/skribilo/biblio/template.scm b/src/guile/skribilo/biblio/template.scm
index 02b4e76..a38790e 100644
--- a/src/guile/skribilo/biblio/template.scm
+++ b/src/guile/skribilo/biblio/template.scm
@@ -21,9 +21,13 @@
 
 (define-module (skribilo biblio template)
   :use-module (srfi srfi-1)
+  :use-module (srfi srfi-34)
+  :use-module (srfi srfi-35)
+
   :use-module (skribilo ast)
   :autoload   (skribilo lib)    (skribe-error)
   :autoload   (skribilo output) (output)
+  :use-module (skribilo biblio)
 
   :use-module (ice-9 optargs)
 
@@ -91,8 +95,9 @@
         ((if)
          (if (or (> (length formals) 3)
                  (< (length formals) 2))
-             (error (_ "wrong number of arguments to `if' template")
-                    formals))
+             (raise (condition
+                     (&biblio-template-error (expression sexp)
+                                             (template template)))))
          (let* ((if-cond (car formals))
                 (if-then (cadr formals))
                 (if-else (if (null? (cddr formals))
@@ -118,7 +123,9 @@
           ((string? template)
            template)
           (else
-           (error (_ "invalid bibliography entry template") template)))))
+           (raise (condition
+                   (&biblio-template-error (expression template)
+                                           (template template))))))))
 
 
 (define* (output-bib-entry-template bib engine template