aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--doc/user/compiler.skb3
-rw-r--r--src/guile/skribilo.scm35
3 files changed, 39 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index e5f1341..8395eb1 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ Copyright (C) 2005, 2006, 2007, 2008 Ludovic Courtès <ludo@gnu.org>
** Improved configure-time diagnostics
** `skribilo' now displays a call stack trace upon error when possible
+** New `--custom' compiler option
* New in Skribilo 0.9.1
diff --git a/doc/user/compiler.skb b/doc/user/compiler.skb
index b208037..07fe724 100644
--- a/doc/user/compiler.skb
+++ b/doc/user/compiler.skb
@@ -80,6 +80,9 @@ conventions of Emacs' Outline mode (see ,(numref :text [Section] :ident
`(#\t "engine" ,[Use ,(tt "engine") as the engine, i.e., as
the output format. For details on engines and for a list of supported
engines, see ,(numref :text [Chapter] :ident "engines").])
+ `(#\c "custom=value" ,[Set engine
+custom ,(tt [custom]) to ,(tt [value]), a constant. See Section ,(ref
+:subsection "Engine Customs") for more information on customs.])
`("compat" "compat" ,[Use ,(tt "compat") as the compatibility
mode. This defaults to ,(tt [skribilo]). Specifying ,(tt [skribe])
enables the ,(ref :text [Skribe] :url *skribe-url*) compatibility mode,
diff --git a/src/guile/skribilo.scm b/src/guile/skribilo.scm
index d69ae32..f192838 100644
--- a/src/guile/skribilo.scm
+++ b/src/guile/skribilo.scm
@@ -41,6 +41,7 @@
:use-module (skribilo config)
:autoload (srfi srfi-1) (alist-cons)
+ :use-module (srfi srfi-13)
:use-module (srfi srfi-37)
:use-module (srfi srfi-39)
@@ -67,6 +68,7 @@ specified reader syntax, and produce its output using the specified engine.
-R, --reader=READER Use READER to parse the input file, e.g., `skribe'
(default) or `outline'.
-t, --target=ENGINE Use ENGINE as the output engine, e.g., `html'.
+ -c, --custom=C=VAL Use VAL as the value of ENGINE's custom C.
-o, --output=FILE Write output to FILE.
--compat=COMPAT Use COMPAT as the compatibility layer, e.g., `skribe'.
@@ -166,6 +168,29 @@ Report bugs to <~a>.~%"
(option '(#\t "target") #t #f
(lambda (opt name arg result)
(alist-cons :target arg result)))
+ (option '(#\c "custom") #t #f
+ (lambda (opt name arg result)
+ (let ((=-pos (string-index arg #\=)))
+ (if (not =-pos)
+ (leave (_ "~a: missing value for custom") arg)
+ (let ((custom (string-take arg =-pos))
+ (value (string-drop arg (+ =-pos 1))))
+ (catch 'read-error
+ (lambda ()
+ (let ((custom (string->symbol custom))
+ (value
+ (with-input-from-string value read))
+ (result
+ (alist-delete :customs result eq?))
+ (customs
+ (assoc-ref result :customs)))
+ (alist-cons
+ :customs
+ (alist-cons custom value customs)
+ result)))
+ (lambda (key . args)
+ (leave (_ "~a: invalid custom value")
+ value))))))))
(option '(#\o "output") #t #f
(lambda (opt name arg result)
(if (assoc :output result)
@@ -242,6 +267,7 @@ Report bugs to <~a>.~%"
(:source-path ".")
(:image-path ".")
(:sui-path ".")
+ (:customs)
(:watched-symbols)))
(define (parse-args args)
@@ -266,6 +292,7 @@ options."
(reader-name (string->symbol (assoc-ref options :reader)))
(engine (string->symbol (assoc-ref options :target)))
+ (customs (assoc-ref options :customs))
(input-file (assoc-ref options :input))
(output-file (assoc-ref options :output))
@@ -316,6 +343,14 @@ options."
;; Load the user rc file (FIXME)
;;(load-rc)
+ (or (null? customs)
+ (let ((engine (lookup-engine engine)))
+ (for-each (lambda (custom+value)
+ (let ((custom (car custom+value))
+ (value (cdr custom+value)))
+ (engine-custom-set! engine custom value)))
+ customs)))
+
;; Evaluate expressions passed as `--eval'.
(for-each (lambda (expr)
(eval expr user-module))