From 2d8fa88ef04b3a6141a2b03a9671a7dd0fcc1f60 Mon Sep 17 00:00:00 2001 From: Ludovic Courtes Date: Mon, 16 Jan 2006 22:31:32 +0000 Subject: More SRFI-3[45] enhancements; first stab at the user documentation. * src/guile/skribilo/biblio.scm (skribe-open-bib-file): Raise a `&file-search-error' when needed. * src/guile/skribilo/runtime.scm (convert-image): Likewise. * src/guile/skribilo/source.scm (source-read-lines): Likewise. (source-read-definition): Likewise. * src/guile/skribilo/utils/compat.scm (skribe-load): Only look up `%skribe-known-files' when `load-document' failed. (find-file/path): Use `search-path'. (find-runtime-type): Implemented. * doc/skr/api.skr: Use `(ice-9 match)'. Use `match' instead of `match-case'. (api-search-definition): Search in `%load-path' and `(skribe-path)'. (define-markup?): First stab at getting the `match' syntax right. * doc/user/src/start[3-5].skb: Small fixes. git-archimport-id: lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2--patch-25 --- ChangeLog | 35 ++++++++++++++++ doc/skr/api.skr | 31 ++++++++------ doc/user/src/start3.skb | 4 +- doc/user/src/start4.skb | 8 ++-- doc/user/src/start5.skb | 2 +- src/guile/skribilo/biblio.scm | 12 +++--- src/guile/skribilo/runtime.scm | 10 +++-- src/guile/skribilo/source.scm | 81 ++++++++++++++++++++----------------- src/guile/skribilo/utils/compat.scm | 46 ++++++++++++++++----- 9 files changed, 153 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ca3201..25a5820 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,41 @@ # arch-tag: automatic-ChangeLog--lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2 # +2006-01-16 22:31:32 GMT Ludovic Courtes patch-25 + + Summary: + More SRFI-3[45] enhancements; first stab at the user documentation. + Revision: + skribilo--devel--1.2--patch-25 + + * src/guile/skribilo/biblio.scm (skribe-open-bib-file): Raise a + `&file-search-error' when needed. + + * src/guile/skribilo/runtime.scm (convert-image): Likewise. + + * src/guile/skribilo/source.scm (source-read-lines): Likewise. + (source-read-definition): Likewise. + + * src/guile/skribilo/utils/compat.scm (skribe-load): Only look up + `%skribe-known-files' when `load-document' failed. + (find-file/path): Use `search-path'. + (find-runtime-type): Implemented. + + * doc/skr/api.skr: Use `(ice-9 match)'. Use `match' instead of + `match-case'. + (api-search-definition): Search in `%load-path' and `(skribe-path)'. + (define-markup?): First stab at getting the `match' syntax right. + + * doc/user/src/start[3-5].skb: Small fixes. + + modified files: + ChangeLog doc/skr/api.skr doc/user/src/start3.skb + doc/user/src/start4.skb doc/user/src/start5.skb + src/guile/skribilo/biblio.scm src/guile/skribilo/runtime.scm + src/guile/skribilo/source.scm + src/guile/skribilo/utils/compat.scm + + 2006-01-15 21:22:18 GMT Ludovic Courtes patch-24 Summary: diff --git a/doc/skr/api.skr b/doc/skr/api.skr index 504dd5a..70016b9 100644 --- a/doc/skr/api.skr +++ b/doc/skr/api.skr @@ -9,6 +9,8 @@ ;* The Skribe style for documenting Lisp APIs. */ ;*=====================================================================*/ +(use-modules (ice-9 match)) + ;*---------------------------------------------------------------------*/ ;* Html configuration */ ;*---------------------------------------------------------------------*/ @@ -59,11 +61,13 @@ ;* Find a definition inside a source file. */ ;*---------------------------------------------------------------------*/ (define (api-search-definition id file pred) - (let ((f (find-file/path file *skribe-source-path*))) + (let* ((path (append %load-path (skribe-path))) + (f (find-file/path file path))) (if (not (string? f)) (skribe-error 'api-search-definition - (format #t "can't find source file `~a' in path" file) - *skribe-source-path*) + (format #f "can't find source file `~a' in path" + file) + path) (with-input-from-file f (lambda () (let loop ((exp (read))) @@ -104,9 +108,10 @@ ;* define-markup? ... */ ;*---------------------------------------------------------------------*/ (define (define-markup? id o) - (match-case o - (((or define-markup define define-inline) - ((? (lambda (x) (eq? x id))) . (? (lambda (x) (or (pair? x) (null? x))))) . ?-) + (match o + ((or 'define-markup 'define 'define-inline + (? (lambda (x) (eq? x id))) + (? (lambda (x) (or (pair? x) (null? x))))) o) ((define-simple-markup (? (lambda (x) (eq? x id)))) o) @@ -119,7 +124,7 @@ ;* make-engine? ... */ ;*---------------------------------------------------------------------*/ (define (make-engine? id o) - (match-case o + (match o (((or make-engine copy-engine) (quote (? (lambda (x) (eq? x id)))) . ?-) o) ((quasiquote . ?-) @@ -135,7 +140,7 @@ ;* make-engine-custom ... */ ;*---------------------------------------------------------------------*/ (define (make-engine-custom def) - (match-case (memq :custom def) + (match (memq :custom def) ((:custom (quote ?custom) . ?-) custom) ((:custom ?custom . ?-) @@ -150,7 +155,7 @@ ;* options). */ ;*---------------------------------------------------------------------*/ (define (define-markup-formals def) - (match-case def + (match def ((?- (?- . ?args) . ?-) (if (symbol? args) (list args) @@ -180,7 +185,7 @@ ;* Returns the options parameters of a define-markup. */ ;*---------------------------------------------------------------------*/ (define (define-markup-options def) - (match-case def + (match def ((?- (?- . ?args) . ?-) (if (not (list? args)) '() @@ -203,7 +208,7 @@ ;* Returns the rest parameter of a define-markup. */ ;*---------------------------------------------------------------------*/ (define (define-markup-rest def) - (match-case def + (match def ((?- (?- . ?args) . ?-) (if (not (pair? args)) args @@ -270,7 +275,7 @@ (table :cellpadding 0 :cellspacing 0 (tr (td :align 'left exp)))) (else - (match-case exp + (match exp ((quote (and ?sym (? symbol?))) (string-append "'" (symbol->string sym))) (else @@ -319,7 +324,7 @@ (idx *markup-index*) (idx-note "definition") (idx-suffix #f) - (source "src/common/api.scm") + (source "skribilo/skribe/api.scm") (def #f) (see-also '()) (others '()) diff --git a/doc/user/src/start3.skb b/doc/user/src/start3.skb index 0705966..65fa738 100644 --- a/doc/user/src/start3.skb +++ b/doc/user/src/start3.skb @@ -1,9 +1,9 @@ (document :title [Hello World!] -(section :title [A first Section] [ +(chapter :title [A first Section] [ This is a ,(bold [very]) ,(it [simple]) ,(color :fg [red] [text]).]) -(section :title [A second Section] [ +(chapter :title [A second Section] [ That section contains an ,(bold itemize) construction: ,(itemize (item [first item]) (item [second item]) diff --git a/doc/user/src/start4.skb b/doc/user/src/start4.skb index 3311925..31fba0c 100644 --- a/doc/user/src/start4.skb +++ b/doc/user/src/start4.skb @@ -1,13 +1,13 @@ -(document :title [Various links] [ +(document :title [Various links] -(section :title "A Section" [ + (chapter :title "A Section" [ The first link points to an external web page. Here we point to a ,(ref :url [http://slashdot.org/] [Slashdot]) web page. The second one points to the second ,(ref :section [A second Section] [Section]) of that document.]) -(section :title [A second Section] [ + (chapter :title [A second Section] [ The last links points to the first ,(ref :scribe [user.scr] :figure [A simple web page] [Figure]) -of the Scribe User Manual.])]) +of the Scribe User Manual.])) diff --git a/doc/user/src/start5.skb b/doc/user/src/start5.skb index 9e6b877..6977608 100644 --- a/doc/user/src/start5.skb +++ b/doc/user/src/start5.skb @@ -6,4 +6,4 @@ (itemize (map (lambda (x) (item (it (markup-option x :title)))) - sects))))) \ No newline at end of file + sects))))) diff --git a/src/guile/skribilo/biblio.scm b/src/guile/skribilo/biblio.scm index 2ea35bc..082fb99 100644 --- a/src/guile/skribilo/biblio.scm +++ b/src/guile/skribilo/biblio.scm @@ -25,6 +25,11 @@ :use-module (skribilo utils syntax) ;; `when', `unless' :use-module (skribilo module) :use-module (skribilo skribe bib) ;; `make-bib-entry' + + :autoload (srfi srfi-34) (raise) + :use-module (srfi srfi-35) + :autoload (skribilo condition) (&file-search-error) + :autoload (skribilo reader) (%default-reader) :autoload (skribilo parameters) (*bib-path*) :autoload (ice-9 format) (format) @@ -155,8 +160,5 @@ (string-append "| " (format #f command path)) path))) - (begin - (skribe-warning 1 - 'bibliography - "Can't find bibliography -- " file) - #f)))) + (raise (condition (&file-search-error (file-name file) + (path (*bib-path*)))))))) diff --git a/src/guile/skribilo/runtime.scm b/src/guile/skribilo/runtime.scm index b129652..e302ee9 100644 --- a/src/guile/skribilo/runtime.scm +++ b/src/guile/skribilo/runtime.scm @@ -33,7 +33,10 @@ make-string-replace) :use-module (skribilo parameters) :use-module (skribilo lib) - :use-module (srfi srfi-13)) + :use-module (srfi srfi-13) + :use-module (srfi srfi-35) + :autoload (skribilo condition) (&file-search-error) + :autoload (srfi srfi-34) (raise)) (define (suffix path) @@ -128,9 +131,8 @@ (define (convert-image file formats) (let ((path (search-path (*image-path*) file))) (if (not path) - (skribe-error 'convert-image - (format #f "can't find `~a' image file in path: " file) - (*image-path*)) + (raise (condition (&file-search-error (file-name file) + (path (*image-path*))))) (let ((suf (suffix file))) (if (member suf formats) (let* ((dir (if (string? (*destination-file*)) diff --git a/src/guile/skribilo/source.scm b/src/guile/skribilo/source.scm index 3eb7d65..a632f18 100644 --- a/src/guile/skribilo/source.scm +++ b/src/guile/skribilo/source.scm @@ -23,6 +23,11 @@ (define-module (skribilo source) :export ( language? language-extractor language-fontifier source-read-lines source-read-definition source-fontify) + + :use-module (srfi srfi-35) + :autoload (srfi srfi-34) (raise) + :autoload (skribilo condition) (&file-search-error &file-open-error) + :use-module (skribilo utils syntax) :use-module (skribilo parameters) :use-module (skribilo lib) @@ -53,40 +58,39 @@ ;* source-read-lines ... */ ;*---------------------------------------------------------------------*/ (define (source-read-lines file start stop tab) - (let ((p (search-path (*source-path*) file))) - (if (or (not (string? p)) (not (file-exists? p))) - (skribe-error 'source - (format "Can't find `~a' source file in path" file) - (*source-path*)) - (with-input-from-file p - (lambda () - (if (> (*verbose*) 0) - (format (current-error-port) " [source file: ~S]\n" p)) - (let ((startl (if (string? start) (string-length start) -1)) - (stopl (if (string? stop) (string-length stop) -1))) - (let loop ((l 1) - (armedp (not (or (integer? start) (string? start)))) - (s (read-line)) - (r '())) - (cond - ((or (eof-object? s) - (and (integer? stop) (> l stop)) - (and (string? stop) (substring=? stop s stopl))) - (apply string-append (reverse! r))) - (armedp - (loop (+ l 1) - #t - (read-line) - (cons* "\n" (untabify s tab) r))) - ((and (integer? start) (>= l start)) - (loop (+ l 1) - #t - (read-line) - (cons* "\n" (untabify s tab) r))) - ((and (string? start) (substring=? start s startl)) - (loop (+ l 1) #t (read-line) r)) - (else - (loop (+ l 1) #f (read-line) r)))))))))) + (let ((p (search-path (*source-path*) file))) + (if (or (not (string? p)) (not (file-exists? p))) + (raise (condition (&file-search-error (file-name file) + (path (*source-path*))))) + (with-input-from-file p + (lambda () + (if (> (*verbose*) 0) + (format (current-error-port) " [source file: ~S]\n" p)) + (let ((startl (if (string? start) (string-length start) -1)) + (stopl (if (string? stop) (string-length stop) -1))) + (let loop ((l 1) + (armedp (not (or (integer? start) (string? start)))) + (s (read-line)) + (r '())) + (cond + ((or (eof-object? s) + (and (integer? stop) (> l stop)) + (and (string? stop) (substring=? stop s stopl))) + (apply string-append (reverse! r))) + (armedp + (loop (+ l 1) + #t + (read-line) + (cons* "\n" (untabify s tab) r))) + ((and (integer? start) (>= l start)) + (loop (+ l 1) + #t + (read-line) + (cons* "\n" (untabify s tab) r))) + ((and (string? start) (substring=? start s startl)) + (loop (+ l 1) #t (read-line) r)) + (else + (loop (+ l 1) #f (read-line) r)))))))))) ;*---------------------------------------------------------------------*/ ;* untabify ... */ @@ -136,16 +140,17 @@ (skribe-error 'source "The specified language has not defined extractor" (slot-ref lang 'name))) + ((or (not p) (not (file-exists? p))) - (skribe-error 'source - (format "Can't find `~a' program file in path" file) - (*source-path*))) + (raise (condition (&file-search-error (file-name file) + (path (*source-path*)))))) + (else (let ((ip (open-input-file p))) (if (> (*verbose*) 0) (format (current-error-port) " [source file: ~S]\n" p)) (if (not (input-port? ip)) - (skribe-error 'source "Can't open file for input" p) + (raise (condition (&file-open-error (file-name p)))) (unwind-protect (let ((s ((language-extractor lang) ip definition tab))) (if (not (string? s)) diff --git a/src/guile/skribilo/utils/compat.scm b/src/guile/skribilo/utils/compat.scm index b6e6420..45abd10 100644 --- a/src/guile/skribilo/utils/compat.scm +++ b/src/guile/skribilo/utils/compat.scm @@ -24,7 +24,11 @@ :use-module (skribilo parameters) :use-module (skribilo evaluator) :use-module (srfi srfi-1) + :use-module (srfi srfi-34) + :use-module (srfi srfi-35) :use-module (ice-9 optargs) + :autoload (skribilo ast) (ast?) + :autoload (skribilo condition) (file-search-error? &file-search-error) :replace (gensym)) ;;; Author: Ludovic Courtès @@ -111,11 +115,26 @@ '(("web-book.skr" . (skribilo packages web-book)))) (define*-public (skribe-load file :rest args) - (let ((mod (assoc-ref %skribe-known-files file))) - (if mod - (set-module-uses! (current-module) - (cons mod (module-uses (current-module)))) - (apply load-document file args)))) + (call/cc + (lambda (return) + (guard (c ((file-search-error? c) + ;; Regular file loading failed. Try built-ins. + (let ((mod-name (assoc-ref %skribe-known-files file))) + (if mod-name + (let ((mod (false-if-exception + (resolve-module mod-name)))) + (if (not mod) + (raise c) + (begin + (set-module-uses! + (current-module) + (cons mod (module-uses (current-module)))) + (return #t)))) + (raise c))))) + + ;; Try a regular `load-document'. + (apply load-document file args))))) + (define-public skribe-include include-document) (define-public skribe-load-options *load-options*) @@ -175,9 +194,9 @@ (define-public system->string system) ;; FIXME (define-public any? any) (define-public every? every) -(define-public find-file/path (lambda (. args) - (format #t "find-file/path: ~a~%" args) - #f)) +(define-public (find-file/path file path) + (search-path path file)) + (define-public process-input-port #f) ;process-input) (define-public process-output-port #f) ;process-output) (define-public process-error-port #f) ;process-error) @@ -191,7 +210,16 @@ (define-public hashtable->list (lambda (h) (map cdr (hash-map->list cons h)))) -(define-public find-runtime-type (lambda (obj) obj)) +(define-public (find-runtime-type obj) + (cond ((string? obj) "string") + ((ast? obj) "ast") + ((list? obj) "list") + ((pair? obj) "pair") + ((number? obj) "number") + ((char? obj) "character") + ((keyword? obj) "keyword") + (else (with-output-to-string + (lambda () (write obj)))))) -- cgit v1.2.3