;;; engine.skb  --  The description of the Skribe engines
;;;
;;; Copyright 2003, 2004  Manuel Serrano
;;;
;;;
;;; This program is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2 of the License, or
;;; (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software
;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;; USA.


(cond-expand 
   (guile
    (define *engine-src*  "skribilo/engine.scm")
    (define *types-src*   #f))
   (bigloo 
    (define *engine-src*  "../src/bigloo/engine.scm")
    (define *types-src*   "../src/bigloo/types.scm"))
   (stklos
    (define *engine-src*  "../src/stklos/engine.stk")
    (define *types-src*   "../src/stklos/types.stk")))

;*---------------------------------------------------------------------*/
;*    Engine                                                           */
;*---------------------------------------------------------------------*/
(chapter :title "Engines" 

   (p [When Skribe produces a document in a given format, it uses a
specialize engine. For instance, when a Web page is made from a Skribe
document, the HTML engine is used. The engines provided by Skribe are
given below:])

   (resolve (lambda (n e env)
	       (let* ((current-chapter (ast-chapter n))
		      (body  (map (lambda (x) (if (pair? x) (car x) x))
				  (markup-body current-chapter)))
		      (sects (filter (lambda (x) (is-markup? x 'section))
				     body)))
		  (itemize 
		     (map (lambda (x)
			     (let ((title (markup-option x :title)))
				(item (ref :text title :section title))))
			  sects)))))
   
   (section :title "Functions dealing with engines"
      
      (subsection :title "Creating engines"
	 (p [The function ,(code "make-engine") creates a brand new engine.])
	 
	 (doc-markup 'make-engine
	    '((ident [The name (a symbol) of the new engine.])
	      (:version [The version number.])
	      (:format [The output format (a string) of this engine.])
	      (:filter [A string filter (a function).])
	      (:delegate [A delegate engine.])
	      (:symbol-table [The engine symbol table.])
	      (:custom [The engine custom list.])
	      (:info [Miscellaneous.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*)
	 
	 (p [The function ,(code "copy-engine") duplicates an existing engine.])
	 (doc-markup 'copy-engine
	    '((ident [The name (a symbol) of the new engine.])
	      (e [The old engine to be duplicated.])
	      (:version [The version number.])
	      (:filter [A string filter (a function).])
	      (:delegate [A delegate engine.])
	      (:symbol-table [The engine symbol table.])
	      (:custom [The engine custom list.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*))
	      
      (subsection :title "Retrieving engines"
	 
	 (p [The ,(code "find-engine") function searches in the list of defined
engines. It returns an ,(code "engine") object on success and ,(code "#f")
on failure.])
	 (doc-markup 'find-engine
	    '((id [The name (a symbol) of the engine to be searched.])
	      (:version [An optional version number for the searched engine.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*))
      
      (subsection :title "Engine accessors"
	 (p [The predicate ,(code "engine?") returns ,(code "#t") if its
argument is an engine. Otherwise, it returns ,(code "#f"). In other words,
,(code "engine?") returns ,(code "#t") for objects created by 
,(code "make-engine"), ,(code "copy-engine"), and ,(code "find-engine").])
	 (doc-markup 'engine?
	    '((obj [The checked object.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*)
	 
	 (p [The following functions return information about engines.])
	 
	 (doc-markup 'engine-ident
	    '((obj [The engine.]))
	    :common-args '()
	    :others '(engine-format engine-customs engine-filter engine-symbol-table)
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*))
      
      (subsection :title "Engine customs"
	 
	 (p [Engine customs are locations where dynamic informations relative
to engines can be stored. Engine custom can be seen a global variables that
are specific to engines. The function ,(code "engine-custom") returns the
value of a custom or ,(code "#f") if that custom is not defined. The
function ,(code "engine-custom-set!") defines or sets a new value for
a custom.])
	 
	 (doc-markup 'engine-custom
	    `((e ,[The engine (as returned by 
,(ref :mark "find-engine" :text (code "find-engine"))).])
	      (id [The name of the custom.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*)
	 
	 (doc-markup 'engine-custom-set!
	    `((e ,[The engine (as returned by 
,(ref :mark "find-engine" :text (code "find-engine"))).])
	      (id [The name of the custom.])
	      (val [The new value of the custom.]))
	    :common-args '()
            :skribe-source? #f
	    :source *engine-src*
	    :idx *function-index*)))

   ;; existing engines
   (include "htmle.skb")
   (include "latexe.skb")
   (include "xmle.skb"))