about summary refs log tree commit diff
path: root/src/guile/skribilo/coloring/lisp.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/guile/skribilo/coloring/lisp.scm')
-rw-r--r--src/guile/skribilo/coloring/lisp.scm302
1 files changed, 302 insertions, 0 deletions
diff --git a/src/guile/skribilo/coloring/lisp.scm b/src/guile/skribilo/coloring/lisp.scm
new file mode 100644
index 0000000..13bb6db
--- /dev/null
+++ b/src/guile/skribilo/coloring/lisp.scm
@@ -0,0 +1,302 @@
+;;;; lisp.scm	-- Lisp Family Fontification
+;;;;
+;;;; Copyright 2003, 2004  Erick Gallesio - I3S-CNRS/ESSI <eg@essi.fr>
+;;;; Copyright 2005, 2006  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 Street, Fifth Floor, Boston, MA 02110-1301,
+;;;; USA.
+
+
+(define-module (skribilo coloring lisp)
+  :use-module (skribilo utils syntax)
+  :use-module (skribilo source)
+  :use-module (skribilo lib)
+  :use-module (skribilo utils strings)
+  :use-module (srfi srfi-39)
+  :use-module (ice-9 match)
+  :autoload   (ice-9 regex)      (make-regexp)
+  :autoload   (skribilo reader)  (make-reader)
+  :export (skribe scheme stklos bigloo lisp))
+
+
+(define *bracket-highlight* (make-parameter #t))
+(define *class-highlight*   (make-parameter #t))
+(define *the-keys*	    (make-parameter '()))
+
+(define %lisp-keys	    #f)
+(define %scheme-keys        #f)
+(define %skribe-keys	    #f)
+(define %stklos-keys	    #f)
+(define %lisp-keys	    #f)
+
+
+;;;
+;;; DEFINITION-SEARCH
+;;;
+(define (definition-search inp read tab def?)
+  (let Loop ((exp (read inp)))
+    (unless (eof-object? exp)
+      (if (def? exp)
+	  (let ((start (and (pair? exp) (source-property exp 'line)))
+		(stop  (port-line inp)))
+	    (source-read-lines (port-filename inp) start stop tab))
+	  (Loop (read inp))))))
+
+;; Load the SILex-generated lexer.
+(load-from-path "skribilo/coloring/lisp-lex.l.scm")
+
+(define (lisp-family-fontifier s)
+  (lexer-init 'port (open-input-string s))
+  (let loop ((token (lexer))
+	     (res   '()))
+    (if (eq? token 'eof)
+	(reverse! res)
+	(loop (lexer)
+	      (cons token res)))))
+
+
+;;;; ======================================================================
+;;;;
+;;;;				LISP
+;;;;
+;;;; ======================================================================
+(define (lisp-extractor iport def tab)
+  (definition-search
+    iport
+    read
+    tab
+    (lambda (exp)
+      (match exp
+	 (((or 'defun 'defmacro) fun _ . _)
+	  (and (eq? def fun) exp))
+	 (('defvar var . _)
+	  (and (eq? var def) exp))
+	 (else #f)))))
+
+(define (init-lisp-keys)
+  (unless %lisp-keys
+    (set! %lisp-keys
+      (append  ;; key
+	       (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))
+		    '(defun defclass defmacro)))))
+  %lisp-keys)
+
+(define (lisp-fontifier s)
+  (parameterize ((*the-keys*	   (init-lisp-keys))
+		 (*bracket-highlight* #f)
+		 (*class-highlight*   #f))
+    (lisp-family-fontifier s)))
+
+
+(define lisp
+  (new language
+       (name "lisp")
+       (fontifier lisp-fontifier)
+       (extractor lisp-extractor)))
+
+
+;;;; ======================================================================
+;;;;
+;;;;				SCHEME
+;;;;
+;;;; ======================================================================
+(define (scheme-extractor iport def tab)
+  (definition-search
+    iport
+    %skribilo-module-reader
+    tab
+    (lambda (exp)
+      (match exp
+	 (((or 'define 'define-macro) (fun . _) . _)
+	  (and (eq? def fun) exp))
+	 (('define (? symbol? var) . _)
+	  (and (eq? var def) exp))
+	 (else #f)))))
+
+
+(define (init-scheme-keys)
+  (unless %scheme-keys
+    (set! %scheme-keys
+      (append ;; key
+	      (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))
+		 '(define define-syntax)))))
+  %scheme-keys)
+
+
+(define (scheme-fontifier s)
+  (parameterize ((*the-keys*	   (init-scheme-keys))
+		 (*bracket-highlight* #f)
+		 (*class-highlight*   #f))
+    (lisp-family-fontifier s)))
+
+
+(define scheme
+  (new language
+       (name "scheme")
+       (fontifier scheme-fontifier)
+       (extractor scheme-extractor)))
+
+
+;;;; ======================================================================
+;;;;
+;;;;				STKLOS
+;;;;
+;;;; ======================================================================
+(define (stklos-extractor iport def tab)
+  (definition-search
+    iport
+    %skribilo-module-reader
+    tab
+    (lambda (exp)
+      (match exp
+	 (((or 'define 'define-generic 'define-method 'define-macro)
+	   (fun . _) . _)
+	  (and (eq? def fun) exp))
+	 (((or 'define 'define-module) (? symbol? var) . _)
+	  (and (eq? var def) exp))
+	 (else
+		#f)))))
+
+
+(define (init-stklos-keys)
+  (unless %stklos-keys
+    (init-scheme-keys)
+    (set! %stklos-keys (append %scheme-keys
+				;; Markups
+				(map (lambda (x) (cons x '&source-key))
+				     '(select-module import export))
+				;; Key
+				(map (lambda (x) (cons x '&source-keyword))
+				     '(case-lambda dotimes match-case match-lambda))
+				;; Define
+				(map (lambda (x) (cons x '&source-define))
+				     '(define-generic define-class
+				       define-macro define-method define-module))
+				;; error
+				(map (lambda (x) (cons x '&source-error))
+				     '(error call/cc)))))
+  %stklos-keys)
+
+
+(define (stklos-fontifier s)
+  (parameterize ((*the-keys*	   (init-stklos-keys))
+		 (*bracket-highlight* #t)
+		 (*class-highlight*   #t))
+    (lisp-family-fontifier s)))
+
+
+(define stklos
+  (new language
+       (name "stklos")
+       (fontifier stklos-fontifier)
+       (extractor stklos-extractor)))
+
+
+;;;; ======================================================================
+;;;;
+;;;;				SKRIBE
+;;;;
+;;;; ======================================================================
+(define (skribe-extractor iport def tab)
+  (definition-search
+    iport
+    (make-reader 'skribe)
+    tab
+    (lambda (exp)
+      (match exp
+	(((or 'define 'define-macro 'define-markup 'define-public)
+	  (fun . _) . _)
+	 (and (eq? def fun) exp))
+	(('define (? symbol? var) . _)
+	 (and (eq? var def) exp))
+	(('markup-output (quote mk) . _)
+	 (and (eq? mk def) exp))
+	(else #f)))))
+
+
+(define (init-skribe-keys)
+  (unless %skribe-keys
+    (init-stklos-keys)
+    (set! %skribe-keys (append %stklos-keys
+				;; Markups
+				(map (lambda (x) (cons x '&source-markup))
+				     '(bold it emph tt color ref index underline
+				       roman figure center pre flush hrule
+				       linebreak image kbd code var samp
+				       sc sf sup sub
+				       itemize description enumerate item
+				       table tr td th item prgm author
+				       prgm hook font
+				       document chapter section subsection
+				       subsubsection paragraph p handle resolve
+				       processor abstract margin toc
+				       table-of-contents current-document
+				       current-chapter current-section
+				       document-sections* section-number
+				       footnote print-index include skribe-load
+				       slide))
+				;; Define
+				(map (lambda (x) (cons x '&source-define))
+				     '(define-markup)))))
+  %skribe-keys)
+
+
+(define (skribe-fontifier s)
+  (parameterize ((*the-keys*	   (init-skribe-keys))
+		 (*bracket-highlight* #t)
+		 (*class-highlight*   #t))
+    (lisp-family-fontifier s)))
+
+
+(define skribe
+  (new language
+       (name "skribe")
+       (fontifier skribe-fontifier)
+       (extractor skribe-extractor)))
+
+
+;;;; ======================================================================
+;;;;
+;;;;				BIGLOO
+;;;;
+;;;; ======================================================================
+(define (bigloo-extractor iport def tab)
+  (definition-search
+    iport
+    %skribilo-module-reader
+    tab
+    (lambda (exp)
+      (match exp
+	 (((or 'define 'define-inline 'define-generic
+	       'define-method 'define-macro 'define-expander)
+	   (fun . _) . _)
+	  (and (eq? def fun) exp))
+	 (((or 'define 'define-struct 'define-library)
+	   (? symbol? var) . _)
+	  (and (eq? var def) exp))
+	 (else #f)))))
+
+(define bigloo
+  (new language
+       (name "bigloo")
+       (fontifier scheme-fontifier)
+       (extractor bigloo-extractor)))