summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guile/skribilo/coloring/lisp.scm113
-rw-r--r--src/guile/skribilo/coloring/xml.scm119
-rw-r--r--src/guile/skribilo/engine/lout.scm11
-rw-r--r--src/guile/skribilo/evaluator.scm8
-rw-r--r--src/guile/skribilo/lib.scm36
-rw-r--r--src/guile/skribilo/module.scm15
-rw-r--r--src/guile/skribilo/skribe/api.scm10
-rw-r--r--src/guile/skribilo/source.scm23
-rw-r--r--src/guile/skribilo/types.scm6
9 files changed, 189 insertions, 152 deletions
diff --git a/src/guile/skribilo/coloring/lisp.scm b/src/guile/skribilo/coloring/lisp.scm
index 53cf670..ad02431 100644
--- a/src/guile/skribilo/coloring/lisp.scm
+++ b/src/guile/skribilo/coloring/lisp.scm
@@ -1,46 +1,46 @@
 ;;;;
-;;;; lisp.stk	-- Lisp Family Fontification
-;;;; 
+;;;; lisp.scm	-- Lisp Family Fontification
+;;;;
 ;;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
-;;;; 
-;;;; 
+;;;; Copyright © 2005      Ludovic Courtès  <ludovic.courtes@laas.fr>
+;;;;
+;;;;
 ;;;; 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
+;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;;; USA.
-;;;; 
+;;;;
 ;;;;           Author: Erick Gallesio [eg@essi.fr]
 ;;;;    Creation date: 16-Oct-2003 22:17 (eg)
 ;;;; Last file update: 28-Oct-2004 21:14 (eg)
 ;;;;
 
-(require "lex-rt")	;; to avoid module problems
+(define-module (skribilo coloring lisp)
+  :use-module (skribilo source)
+  :use-module (skribilo lib)
+  :use-module (skribilo runtime)
+  :export (skribe scheme stklos bigloo lisp))
 
-(define-module (skribilo lisp)
-  :export (skribe scheme stklos bigloo lisp)
-  :import (skribe source))
 
-(include "lisp-lex.stk")		;; SILex generated
-  
-(define *bracket-highlight* #f)
-(define *class-highlight*   #f)
-(define *the-keys*	    #f)
+(define *bracket-highlight* (make-fluid))
+(define *class-highlight*   (make-fluid))
+(define *the-keys*	    (make-fluid))
 
-(define *lisp-keys*	    #f)
-(define *scheme-keys*       #f)
-(define *skribe-keys*	    #f)
-(define *stklos-keys*	    #f)
-(define *lisp-keys*	    #f)
+(define *lisp-keys*	    (make-fluid))
+(define *scheme-keys*       (make-fluid))
+(define *skribe-keys*	    (make-fluid))
+(define *stklos-keys*	    (make-fluid))
+(define *lisp-keys*	    (make-fluid))
 
 
 ;;;
@@ -57,17 +57,17 @@
 
 
 (define (lisp-family-fontifier s)
-  (let ((lex (lisp-lex (open-input-string s))))
-    (let Loop ((token (lexer-next-token lex))
+  (let ((lisp-input (open-input-string s)))
+    (let loop ((token (read lisp-input))
 	       (res   '()))
-      (if (eq? token 'eof)
+      (if (eof-object? token)
 	  (reverse! res)
-	  (Loop (lexer-next-token lex)
+	  (loop (read lisp-input)
 		(cons token res))))))
 
 ;;;; ======================================================================
 ;;;;
-;;;; 				LISP
+;;;;				LISP
 ;;;;
 ;;;; ======================================================================
 (define (lisp-extractor iport def tab)
@@ -77,17 +77,17 @@
     (lambda (exp)
       (match-case exp
 	 (((or defun defmacro) ?fun ?- . ?-)
-	  	(and (eq? def fun) exp))
+		(and (eq? def fun) exp))
 	 ((defvar ?var . ?-)
-	 	(and (eq? var def) exp))
+		(and (eq? var def) exp))
 	 (else
-	  	#f)))))
+		#f)))))
 
 (define (init-lisp-keys)
   (unless *lisp-keys*
     (set! *lisp-keys*
       (append  ;; key
-               (map (lambda (x) (cons x '&source-keyword))
+	       (map (lambda (x) (cons x '&source-keyword))
 		    '(setq if let let* letrec cond case else progn lambda))
 	       ;; define
 	       (map (lambda (x) (cons x '&source-define))
@@ -95,9 +95,9 @@
   *lisp-keys*)
 
 (define (lisp-fontifier s)
-  (fluid-let ((*the-keys* 	   (init-lisp-keys))
-	      (*bracket-highlight* #f)
-	      (*class-highlight*   #f))
+  (with-fluids ((*the-keys*	   (init-lisp-keys))
+		(*bracket-highlight* #f)
+		(*class-highlight*   #f))
     (lisp-family-fontifier s)))
 
 
@@ -109,7 +109,7 @@
 
 ;;;; ======================================================================
 ;;;;
-;;;; 				SCHEME
+;;;;				SCHEME
 ;;;;
 ;;;; ======================================================================
 (define (scheme-extractor iport def tab)
@@ -130,7 +130,7 @@
   (unless *scheme-keys*
     (set! *scheme-keys*
       (append ;; key
-       	      (map (lambda (x) (cons x '&source-keyword))
+	      (map (lambda (x) (cons x '&source-keyword))
 		   '(set! if let let* letrec quote cond case else begin do lambda))
 	      ;; define
 	      (map (lambda (x) (cons x '&source-define))
@@ -139,11 +139,11 @@
 
 
 (define (scheme-fontifier s)
-  (fluid-let ((*the-keys* 	   (init-scheme-keys))
-	      (*bracket-highlight* #f)
-	      (*class-highlight*   #f))
+  (with-fluids ((*the-keys*	   (init-scheme-keys))
+		(*bracket-highlight* #f)
+		(*class-highlight*   #f))
     (lisp-family-fontifier s)))
-  
+
 
 (define scheme
   (new language
@@ -153,7 +153,7 @@
 
 ;;;; ======================================================================
 ;;;;
-;;;; 				STKLOS
+;;;;				STKLOS
 ;;;;
 ;;;; ======================================================================
 (define (stklos-extractor iport def tab)
@@ -164,11 +164,11 @@
       (match-case exp
 	 (((or define define-generic define-method define-macro)
 	   (?fun . ?-) . ?-)
-	        (and (eq? def fun) exp))
+		(and (eq? def fun) exp))
 	 (((or define define-module) (and (? symbol?) ?var) . ?-)
-	  	(and (eq? var def) exp))
+		(and (eq? var def) exp))
 	 (else
-	  	#f)))))
+		#f)))))
 
 
 (define (init-stklos-keys)
@@ -192,9 +192,9 @@
 
 
 (define (stklos-fontifier s)
-  (fluid-let ((*the-keys* 	   (init-stklos-keys))
-	      (*bracket-highlight* #t)
-	      (*class-highlight*   #t))
+  (with-fluids ((*the-keys*	   (init-stklos-keys))
+		(*bracket-highlight* #t)
+		(*class-highlight*   #t))
     (lisp-family-fontifier s)))
 
 
@@ -206,7 +206,7 @@
 
 ;;;; ======================================================================
 ;;;;
-;;;; 				SKRIBE
+;;;;				SKRIBE
 ;;;;
 ;;;; ======================================================================
 (define (skribe-extractor iport def tab)
@@ -250,12 +250,12 @@
 				(map (lambda (x) (cons x '&source-define))
 				     '(define-markup)))))
   *skribe-keys*)
-    
+
 
 (define (skribe-fontifier s)
-  (fluid-let ((*the-keys* 	   (init-skribe-keys))
-	      (*bracket-highlight* #t)
-	      (*class-highlight*   #t))
+  (with-fluids ((*the-keys*	   (init-skribe-keys))
+		(*bracket-highlight* #t)
+		(*class-highlight*   #t))
     (lisp-family-fontifier s)))
 
 
@@ -267,7 +267,7 @@
 
 ;;;; ======================================================================
 ;;;;
-;;;; 				BIGLOO
+;;;;				BIGLOO
 ;;;;
 ;;;; ======================================================================
 (define (bigloo-extractor iport def tab)
@@ -279,15 +279,14 @@
 	 (((or define define-inline define-generic
 	       define-method define-macro define-expander)
 	   (?fun . ?-) . ?-)
-	        (and (eq? def fun) exp))
+		(and (eq? def fun) exp))
 	 (((or define define-struct define-library) (and (? symbol?) ?var) . ?-)
-	  	(and (eq? var def) exp))
+		(and (eq? var def) exp))
 	 (else
-	  	#f)))))
+		#f)))))
 
 (define bigloo
   (new language
        (name "bigloo")
        (fontifier scheme-fontifier)
        (extractor bigloo-extractor)))
-
diff --git a/src/guile/skribilo/coloring/xml.scm b/src/guile/skribilo/coloring/xml.scm
index d71e98c..e3db36f 100644
--- a/src/guile/skribilo/coloring/xml.scm
+++ b/src/guile/skribilo/coloring/xml.scm
@@ -1,53 +1,82 @@
-;;;;
-;;;; xml.stk			-- XML Fontification stuff
-;;;; 
-;;;; Copyright © 2003 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
-;;;; 
-;;;; 
-;;;; 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 
-;;;; USA.
-;;;; 
-;;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;;    Creation date: 16-Oct-2003 22:33 (eg)
-;;;; Last file update: 28-Dec-2003 17:33 (eg)
-;;;;
-
-
-;(require "lex-rt")		;; to avoid module problems
-
-
-(define-module (skribilo xml)
-   :export (xml))
-
-(use-modules (skribilo source))
-
-(include "xml-lex.stk")		;; SILex generated
-
-(define (xml-fontifier s)
-  (let ((lex (xml-lex (open-input-string s))))
-    (let Loop ((token (lexer-next-token lex))
-	       (res   '()))
-      (if (eq? token 'eof)
-	  (reverse! res)
-	  (Loop (lexer-next-token lex)
-		(cons token res))))))
+;;; xml.scm -- XML syntax highlighting.
+;;;
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; 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 St, Fifth Floor, Boston, MA  02110-1301 USA
 
 
+(define-module (skribilo coloring xml)
+  :export (xml)
+  :use-module (skribilo source)
+  :use-module (skribilo lib)
+  :use-module (ice-9 rdelim)
+  :use-module (ice-9 regex))
+
+
+(define %comment-rx (make-regexp "<!--(.|\\n)*-->" regexp/extended))
+
+(define (xml-fontifier str)
+  (let loop ((start 0)
+	     (result '()))
+    (if (>= start (string-length str))
+	(reverse! result)
+	(case (string-ref str start)
+	  ((#\")
+	   (let ((end (string-index str start #\")))
+	     (if (not end)
+		 (skribe-error 'xml-fontifier
+			       "unterminated XML string"
+			       (string-drop str start))
+		 (loop end
+		       (cons (new markup
+				  (markup '&source-string)
+				  (body (substring str start end)))
+			     result)))))
+	  ((#\<)
+	   (let ((end (string-index str #\> start)))
+	     (if (not end)
+		 (skribe-error 'xml-fontifier
+			       "unterminated XML tag"
+			       (string-drop str start))
+		 (let ((comment? (regexp-exec %comment-rx
+					      (substring str start end))))
+		   (loop end
+			 (cons (if comment?
+				   (new markup
+					(markup '&source-comment)
+					(body (substring str start end)))
+				   (new markup
+					(markup '&source-module)
+					(body (substring str start end))))
+			       result))))))
+
+	  (else
+	   (loop (+ 1 start)
+		 (if (or (null? result)
+			 (not (string? (car result))))
+		     (cons (string (string-ref str start)) result)
+		     (cons (string-append (car result)
+					  (string (string-ref str start)))
+			   (cdr result)))))))))
+
+
 (define xml
   (new language
        (name "xml")
        (fontifier xml-fontifier)
        (extractor #f)))
 
+;;; xml.scm ends here
diff --git a/src/guile/skribilo/engine/lout.scm b/src/guile/skribilo/engine/lout.scm
index b466ac1..36df9f9 100644
--- a/src/guile/skribilo/engine/lout.scm
+++ b/src/guile/skribilo/engine/lout.scm
@@ -384,10 +384,10 @@
 	     "    @PageMark @Tag\n"
 	     "}\n\n"
 
-	     "# @SkribeLeaders is used in `toc'\n"
+	     "# @SkribiloLeaders is used in `toc'\n"
 	     "# (this is mostly copied from the expert's guide)\n"
-	     "def @SkribeLeaders { "
-	     ,leader " |" ,leader-space " @SkribeLeaders }\n\n"))))
+	     "def @SkribiloLeaders { "
+	     ,leader " |" ,leader-space " @SkribiloLeaders }\n\n"))))
 
 (define (lout-make-doc-cover-sheet doc engine)
   ;; Create a cover sheet for node `doc' which is a doc-style Lout document.
@@ -397,7 +397,8 @@
 	(author (markup-option doc :author))
 	(date-line (engine-custom engine 'date-line))
 	(cover-sheet? (engine-custom engine 'cover-sheet?))
-	(multi-column? (> 1 (engine-custom engine 'column-number))))
+	(multi-column? (> (engine-custom engine 'column-number) 1)))
+
     (if multi-column?
 	;; In single-column document, `@FullWidth' yields a blank page.
 	(display "\n@FullWidth {"))
@@ -1205,7 +1206,7 @@
 	  (entry-proc node engine)
 
 	  (display " &1rt @OneCol { ")
-	  (printf " @SkribeLeaders & @PageOf { ~a }"
+	  (printf " @SkribiloLeaders & @PageOf { ~a }"
 		  (lout-tagify (markup-ident node)))
 	  (display " &0io } }")
 
diff --git a/src/guile/skribilo/evaluator.scm b/src/guile/skribilo/evaluator.scm
index 974d72a..def3280 100644
--- a/src/guile/skribilo/evaluator.scm
+++ b/src/guile/skribilo/evaluator.scm
@@ -175,16 +175,14 @@
 		    path))
     (when (> *skribe-verbose* 0)
       (format (current-error-port) "  [including file: ~S]\n" path))
+
     (with-input-from-file path
       (lambda ()
 	(let Loop ((exp (%default-reader (current-input-port)))
 		   (res '()))
-	  (format (current-error-port) "exp=~a~%" exp)
 	  (if (eof-object? exp)
-	      (begin
-		(format (current-error-port) "include: eof reached~%")
-		(if (and (pair? res) (null? (cdr res)))
+	      (if (and (pair? res) (null? (cdr res)))
 		    (car res)
-		    (reverse! res)))
+		    (reverse! res))
 	      (Loop (%default-reader (current-input-port))
 		    (cons (%evaluate exp) res))))))))
diff --git a/src/guile/skribilo/lib.scm b/src/guile/skribilo/lib.scm
index d916db4..2961fc6 100644
--- a/src/guile/skribilo/lib.scm
+++ b/src/guile/skribilo/lib.scm
@@ -1,5 +1,5 @@
 ;;;
-;;; lib.stk	-- Utilities
+;;; lib.scm	-- Utilities
 ;;;
 ;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
 ;;;
@@ -18,11 +18,6 @@
 ;;; along with this program; if not, write to the Free Software
 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;; USA.
-;;;
-;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;    Creation date: 11-Aug-2003 20:29 (eg)
-;;; Last file update: 27-Oct-2004 12:41 (eg)
-;;;
 
 (read-set! keywords 'prefix)
 
@@ -59,7 +54,9 @@
            hashtable->list
 
 	   skribe-read
-           find-runtime-type)
+           find-runtime-type
+
+	   date)
 
   :export-syntax (new define-markup define-simple-markup
                   define-simple-container define-processor-markup
@@ -73,6 +70,8 @@
   :use-module (skribilo vars)
 
   :use-module (srfi srfi-1)
+  :use-module ((srfi srfi-19) :renamer (symbol-prefix-proc 's19:)) ;; date
+  :use-module (oop goops)
   :use-module (ice-9 optargs))
 
 
@@ -81,11 +80,20 @@
 ;;;
 ;;; NEW
 ;;;
+
+(define %types-module (resolve-module '(skribilo types)))
+
 (define-macro (new class . parameters)
-  `(make ,(string->symbol (format #f "<~a>" class))
-     ,@(apply append (map (lambda (x)
-			    `(,(symbol->keyword (car x)) ,(cadr x)))
-			  parameters))))
+  ;; Thanks to the trick below, modules don't need to import `(oop goops)'
+  ;; and `(skribilo types)' in order to make use of `new'.
+  (let* ((class-name (symbol-append '< class '>))
+	 (actual-class (module-ref %types-module class-name)))
+    `(let ((make ,make)
+	   (,class-name ,actual-class))
+       (make ,class-name
+	 ,@(apply append (map (lambda (x)
+				`(,(symbol->keyword (car x)) ,(cadr x)))
+			      parameters))))))
 
 ;;;
 ;;; DEFINE-MARKUP
@@ -387,3 +395,9 @@
 
 (define-macro (when condition . exprs)
   `(if ,condition (begin ,@exprs)))
+
+(define (date)
+  (s19:date->string (s19:current-date) "~c"))
+
+
+;;; lib.scm ends here
diff --git a/src/guile/skribilo/module.scm b/src/guile/skribilo/module.scm
index 1a8f622..bb0c5ad 100644
--- a/src/guile/skribilo/module.scm
+++ b/src/guile/skribilo/module.scm
@@ -42,7 +42,6 @@
   '((srfi srfi-1)         ;; lists
     (srfi srfi-13)        ;; strings
     ;(srfi srfi-19)        ;; date and time
-    (oop goops)           ;; `make'
     (ice-9 optargs)       ;; `define*'
     (ice-9 and-let-star)  ;; `and-let*'
     (ice-9 receive)       ;; `receive'
@@ -60,9 +59,13 @@
     (skribilo output)
     (skribilo evaluator)
     (skribilo color)
-    (skribilo debug)))
+    (skribilo debug)
+    (skribilo source)     ;; `source-read-lines', `source-fontify', etc.
+    (skribilo coloring lisp) ;; `skribe', `scheme', `lisp'
+    (skribilo coloring xml)  ;; `xml'
+    ))
 
-(define *skribe-core-modules*
+(define %skribe-core-modules
   '("utils" "api" "bib" "index" "param" "sui"))
 
 (define-macro (define-skribe-module name . options)
@@ -81,7 +84,7 @@
 						      ,(string->symbol
 							mod))))
 				    (and (not (equal? m name)) m)))
-				*skribe-core-modules*)))))
+				%skribe-core-modules)))))
 
 
 ;; Make it available to the top-level module.
@@ -106,7 +109,7 @@ execution of Skribilo/Skribe code."
 			  (map (lambda (mod)
 				 `(skribilo skribe
 					    ,(string->symbol mod)))
-			       *skribe-core-modules*)))
+			       %skribe-core-modules)))
         (set-module-name! the-module '(skribilo-user))
         the-module))
 
@@ -152,7 +155,7 @@ hierarchy and in @code{(run-time-module)}."
               (module-use! (run-time-module)
                            (resolve-module `(skribilo skribe
                                              ,(string->symbol mod)))))
-            *skribe-core-modules*))
+            %skribe-core-modules))
 
 
 ;;; module.scm ends here
diff --git a/src/guile/skribilo/skribe/api.scm b/src/guile/skribilo/skribe/api.scm
index d66b3b4..34528ac 100644
--- a/src/guile/skribilo/skribe/api.scm
+++ b/src/guile/skribilo/skribe/api.scm
@@ -274,8 +274,8 @@
 			  (new unresolved
 			       (proc (lambda (n e env)
 					(resolve-counter n env
-							 'footnote #t)))))
-			 ,@(the-options opts :ident :class)))))
+							 'footnote #t))))))
+		  ,@(the-options opts :ident :class))))
       (body (the-body opts))))
 
 ;*---------------------------------------------------------------------*/
@@ -466,9 +466,9 @@
 			"start line > stop line"
 			(format #f "~a/~a" start stop)))
 	 ((and language (not (language? language)))
-	  (skribe-error 'source "Illegal language" language))
+	  (skribe-error 'source "illegal language" language))
 	 ((and tab (not (integer? tab)))
-	  (skribe-error 'source "Illegal tab" tab))
+	  (skribe-error 'source "illegal tab" tab))
 	 (file
 	  (let ((s (if (not definition)
 		       (source-read-lines file start stop tab)
@@ -489,7 +489,7 @@
 ;*---------------------------------------------------------------------*/
 (define-markup (language #!key name (fontifier #f) (extractor #f))
    (if (not (string? name))
-       (skribe-type-error 'language "Illegal name, " name "string")
+       (skribe-type-error 'language "illegal name" name "string")
        (new language
 	  (name name)
 	  (fontifier fontifier)
diff --git a/src/guile/skribilo/source.scm b/src/guile/skribilo/source.scm
index c682687..e03deae 100644
--- a/src/guile/skribilo/source.scm
+++ b/src/guile/skribilo/source.scm
@@ -1,7 +1,8 @@
 ;;;;
-;;;; source.stk	-- Skibe SOURCE implementation stuff
+;;;; source.scm	-- Highlighting source files.
 ;;;;
 ;;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
+;;;; Copyright © 2005      Ludovic Courtès  <ludovic.courtes@laas.fr>
 ;;;;
 ;;;;
 ;;;; This program is free software; you can redistribute it and/or modify
@@ -19,24 +20,16 @@
 ;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;;; USA.
 ;;;;
-;;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;;    Creation date:  3-Sep-2003 12:22 (eg)
-;;;; Last file update: 27-Oct-2004 20:09 (eg)
-;;;;
 
 
 
 (define-module (skribilo source)
   :export (source-read-lines source-read-definition source-fontify)
-  :use-module (skribilo vars))
-
-
-;; Temporary solution
-(define (language-extractor lang)
-  (slot-ref lang 'extractor))
+  :use-module (skribilo types)
+  :use-module (skribilo vars)
+  :use-module (skribilo lib)
+  :use-module (ice-9 rdelim))
 
-(define (language-fontifier lang)
-  (slot-ref lang 'fontifier))
 
 
 ;*---------------------------------------------------------------------*/
@@ -172,7 +165,7 @@
 	     (if (= i j)
 		 (reverse! r)
 		 (reverse! (cons (substring str j i) r))))
-	    ((char=? (string-ref str i) #\Newline)
+	    ((char=? (string-ref str i) #\newline)
 	     (loop (+ i 1)
 		   (+ i 1)
 		   (if (= i j)
@@ -180,7 +173,7 @@
 		       (cons* 'eol (substring str j i) r))))
 	    ((and (char=? (string-ref str i) #\cr)
 		  (< (+ i 1) l)
-		  (char=? (string-ref str (+ i 1)) #\Newline))
+		  (char=? (string-ref str (+ i 1)) #\newline))
 	     (loop (+ i 2)
 		   (+ i 2)
 		   (if (= i j)
diff --git a/src/guile/skribilo/types.scm b/src/guile/skribilo/types.scm
index c6188b6..ac1edc4 100644
--- a/src/guile/skribilo/types.scm
+++ b/src/guile/skribilo/types.scm
@@ -43,7 +43,7 @@
 			container-ident container-body
 	    <document> document? document-ident document-body
 		       document-options document-end
-	    <language> language?
+	    <language> language? language-extractor language-fontifier
 	    <location> location? ast-location
 	    location-file location-line location-pos
 
@@ -283,8 +283,8 @@
 ;;; ======================================================================
 (define-class <language> ()
   (name	:init-keyword :name	 :init-value #f :getter langage-name)
-  (fontifier	:init-keyword :fontifier :init-value #f :getter langage-fontifier)
-  (extractor	:init-keyword :extractor :init-value #f :getter langage-extractor))
+  (fontifier	:init-keyword :fontifier :init-value #f :getter language-fontifier)
+  (extractor	:init-keyword :extractor :init-value #f :getter language-extractor))
 
 (define (language? obj)
   (is-a? obj <language>))