diff lisp/packages/lispm-fonts.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 0293115a14e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/packages/lispm-fonts.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,190 @@
+;;; lispm-fonts.el --- quick hack to parse LISPM-style font-shift codes
+
+;; Keywords: faces
+
+;; Copyright (C) 1992-1993 Free Software Foundation, Inc.
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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, or (at your option)
+;; any later version.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Synched up with: Not in FSF.
+
+;; This only copes with MIT/LMI/TI style font shifts, not Symbolics.
+;; It doesn't do diagram lines (ha ha).  It doesn't do output.  That
+;; has to wait until it is possible to attach faces to characters
+;; instead of just intervals, since this code is really talking about
+;; attributes of the text instead of attributes of regions of the
+;; buffer.  We could do it by mapping over the extents and hacking
+;; the overlaps by hand, but that would be hard.
+
+(make-face 'variable)
+(or (face-differs-from-default-p 'variable)
+    (set-face-font 'variable
+		   "-*-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*"))
+
+(make-face 'variable-bold)
+(or (face-differs-from-default-p 'variable-bold)
+    (progn
+      ;; This is no good because helvetica-12-bold is a LOT larger than
+      ;; helvetica-12-medium.  Someone really blew it there.
+      ;; (copy-face 'variable 'variable-bold)
+      ;; (make-face-bold 'variable-bold)
+      (set-face-font 'variable-bold
+		     "-*-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*")))
+
+(make-face 'variable-italic)
+(or (face-differs-from-default-p 'variable-italic)
+    (progn
+      (copy-face 'variable-bold 'variable-italic) ; see above
+      (make-face-unbold 'variable-italic)
+      (make-face-italic 'variable-italic)))
+
+(make-face 'variable-bold-italic)
+(or (face-differs-from-default-p 'variable-bold-italic)
+    (progn
+      (copy-face 'variable-bold 'variable-bold-italic)
+      (make-face-italic 'variable-bold-italic)))
+
+(defconst lispm-font-to-face
+  '(("tvfont"		. default)
+    ("cptfont"		. default)
+    ("cptfontb"		. bold)
+    ("cptfonti"		. italic)
+    ("cptfontbi"	. bold-italic)
+    ("base-font"	. default)
+    ("bigfnt"		. bold)
+    ("cmb8"		. variable-bold)
+    ("higher-medfnb"	. bold)
+    ("higher-tr8"	. default)
+    ("medfnb"		. bold)
+    ("medfnt"		. normal)
+    ("medfntb"		. bold)
+    ("wider-font"	. bold)
+    ("wider-medfnt"	. bold)
+    ("mets"		. variable-large)
+    ("metsb"		. variable-large-bold)
+    ("metsbi"		. variable-large-bold-italic)
+    ("metsi"		. variable-large-italic)
+    ("cmr5"		. variable)
+    ("cmr10"		. variable)
+    ("cmr18"		. variable)
+    ("cmold"		. variable)
+    ("cmdunh"		. variable)
+    ("hl10"		. variable)
+    ("hl10b"		. variable-bold)
+    ("hl12"		. variable)
+    ("hl12b"		. variable-bold)
+    ("hl12bi"		. variable-bold-italic)
+    ("hl12i"		. variable-italic)
+    ("hl6"		. variable)
+    ("hl7"		. variable)
+    ("tr10"		. variable)
+    ("tr10b"		. variable-bold)
+    ("tr10bi"		. variable-bold-italic)
+    ("tr10i"		. variable-italic)
+    ("tr12"		. variable)
+    ("tr12b"		. variable-bold)
+    ("tr12bi"		. variable-bold-italic)
+    ("tr12i"		. variable-italic)
+    ("tr18"		. variable-large)
+    ("tr18b"		. variable-large-bold)
+    ("tr8"		. variable)
+    ("tr8b"		. variable-bold)
+    ("tr8i"		. variable-italic)
+    ("5x5"		. small)
+    ("tiny"		. small)
+    ("43vxms"		. variable-large)
+    ("courier"		. bold)
+    ("adobe-courier10"	. default)
+    ("adobe-courier14"	. bold)
+    ("adobe-courier10b"	. bold)
+    ("adobe-courier14b"	. bold)
+    ("adobe-hl12"	. variable)
+    ("adobe-hl14"	. variable)
+    ("adobe-hl14b"	. variable-bold)
+    )
+  "Alist of LISPM font names to Emacs face names.")
+
+
+(defun lispm-font-to-face (lispm-font)
+  (if (symbolp lispm-font)
+      (setq lispm-font (symbol-name lispm-font)))
+  (let ((case-fold-search t)
+	face)
+    (setq lispm-font (downcase lispm-font))
+    (if (string-match "^fonts:+" lispm-font)
+	(setq lispm-font (substring lispm-font (match-end 0))))
+    (if (setq face (cdr (assoc lispm-font lispm-font-to-face)))
+	(if (find-face face)
+	    face
+	  (message "warning: unknown face %s" face)
+	  'default)
+      (message "warning: unknown Lispm font %s" (upcase lispm-font))
+      'default)))
+
+(defvar fonts)  ; the -*- line of the file will set this.
+
+(defun lispm-fontify-hack-local-variables ()
+  ;; Sometimes code has font-shifts in the -*- line, which means that the
+  ;; local variables will have been read incorrectly by the emacs-lisp reader.
+  ;; In particular, the `fonts' variable might be corrupted.  So if there
+  ;; are font-shifts in the prop line, re-parse it.
+  (if (or (not (boundp 'fonts))
+	  (null 'fonts)
+	  (let ((case-fold-search t))
+	    (and (looking-at "[ \t]*;.*-\\*-.*fonts[ \t]*:.*-\\*-")
+		 (looking-at ".*\^F"))))
+      (save-excursion
+	(save-restriction
+	  (end-of-line)
+	  (narrow-to-region (point-min) (point))
+	  (goto-char (point-min))
+	  (while (re-search-forward "\^F[0-9a-zA-Z*]" nil t)
+	    (delete-region (match-beginning 0) (match-end 0)))
+	  (let ((enable-local-variables 'query))
+	    (hack-local-variables))))))
+
+(defun lispm-fontify-buffer ()
+  (save-excursion
+    (goto-char (point-min))
+    (if (fboundp 'font-lock-mode) (font-lock-mode 0))
+    (lispm-fontify-hack-local-variables)
+    (let ((font-stack nil)
+	  (p (point))
+	  c)
+      (while (search-forward "\^F" nil t)
+	(delete-char -1)
+	(setq c (following-char))
+	(delete-char 1)
+	(cond ((= c ?\^F)
+	       (insert "\^F"))
+	      ((= c ?*)
+	       (if (and font-stack (/= p (point)))
+		   (set-extent-face (make-extent p (point)) (car font-stack)))
+	       (setq p (point))
+	       (setq font-stack (cdr font-stack)))
+	      ((or (< c ?0) (> c ?Z)) ; error...
+	       nil)
+	      ((>= (setq c (- c ?0)) (length fonts)) ; error...
+	       nil)
+	      (t
+	       (if (and font-stack (/= p (point)))
+		   (set-extent-face (make-extent p (point)) (car font-stack)))
+	       (setq font-stack (cons (lispm-font-to-face (nth c fonts))
+				      font-stack))
+	       (setq p (point)))))
+      (if (and font-stack (/= p (point)))
+	  (set-extent-face (make-extent p (point)) (car font-stack))))))