;;; html-font.el --- Adds font-lock support to HTML helper mode. ;; Copyright (C) 1995 Ulrik Dickow. ;; Author: Ulrik Dickow (http://www.nbi.dk/~dickow) ;; Created: 18-Jan-1995 ;; Maintainer: Ulrik Dickow (http://www.nbi.dk/~dickow) ;; Version: @(#) html-font.el version 4.01 19-Sep-1995 U.Dickow ;; Keywords: languages HTML font-lock faces ;; See also: fort-font.el kumac-font.el html-helper-mode.el html-mode.el ;; See also URL: http://www.nbi.dk/~dickow/emacs/ ;; 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, or (at your option) ;; any later version. ;; LCD Archive Entry: ;; html-font|Ulrik Dickow|dickow@nbi.dk| ;; Adds Font Lock support to HTML helper mode.| ;; 19-Sep-1995|4.01|~/misc/html-font.el.Z| ;;; Commentary: ;; Sets up the current HTML helper mode for full support of font-lock-mode. ;; Required: html-helper-mode.el (LCD or http://www.santafe.edu/~nelson/tools/) ;; However, this file can easily be adapted to e.g. M.Andreessen's html-mode. ;; Known to work with Emacs 19.27-29 and XEmacs 19.12-13. ;; Probably works with XEmacs 19.11 too. ;; The code in this file was included in beta release 2.15 of html-helper-mode. ;; When it exits the beta stage and replaces the 1994 version, ;; this file will presumably become obsolete. ;; Installation, currently: ;; 1) Put html-font.el in your load-path and `M-x byte-compile-file' it. ;; 2) Add this to your ~/.emacs (without the ";;" in front): ;; (add-hook 'html-helper-load-hook '(lambda () (require 'html-font))) ;; Customize font-lock as you would do for any other major mode. ;; For XEmacs and Emacs 19.29, default colours are set up automatically. ;; For earlier Emacsen, you have to write a lot yourself (or get it from ;; somewhere else, e.g. Simon Marshall's face-lock.el in the LCD; see also ;; http://www.nbi.dk/~dickow/emacs/), for example: ;; 3) To have a colourful display with font lock in any supported major mode, ;; you can add something like this to your ~/.emacs: ;; (copy-face 'bold 'font-lock-keyword-face) ; or italic/... ;; (set-face-foreground 'font-lock-keyword-face "ForestGreen") ;; (setq font-lock-keyword-face 'font-lock-keyword-face) ;; and similary for `font-lock-string-face' etc. (see font-lock.el). ;; 4) To have font-lock turned on every time html-helper-mode is entered do ;; (add-hook 'html-helper-mode-hook '(lambda () (font-lock-mode 1))) ;;; Code: (require 'html-helper-mode) ; Even though we no longer modify the syntax table. (require 'font-lock) ; New in 3.0, for better backwards compatibility (<19.29). ;; Originally aimed at Emacs 19.29. Later on disabled syntactic fontification ;; and reordered regexps completely, to be compatible with XEmacs (it doesn't ;; understand OVERRIDE=`keep'). ;; ;; We make an effort on handling nested tags intelligently. ;; font-lock compatibility with XEmacs/Lucid and older Emacsen (<19.29). ;; (if (string-match "XEmacs\\|Lucid" (emacs-version)) ;; XEmacs/Lucid ;; Make needed faces if the user hasn't already done so. ;; Respect X resources (`make-face' uses them when they exist). (let ((change-it (function (lambda (face) (or (if (fboundp 'facep) (facep face) (memq face (face-list))) (make-face face)) (not (face-differs-from-default-p face)))))) (if (funcall change-it 'html-helper-bold-face) (copy-face 'bold 'html-helper-bold-face)) (if (funcall change-it 'html-helper-italic-face) (copy-face 'italic 'html-helper-italic-face)) (if (funcall change-it 'html-helper-underline-face) (set-face-underline-p 'html-helper-underline-face t)) (if (funcall change-it 'font-lock-variable-name-face) (set-face-foreground 'font-lock-variable-name-face "salmon")) (if (funcall change-it 'font-lock-reference-face) (set-face-foreground 'font-lock-reference-face "violet"))) ;; Emacs (any version) ;; ;; Note that Emacs evaluates the face entries in `font-lock-keywords', ;; while XEmacs doesn't. So XEmacs doesn't use the following *variables*, ;; but instead the faces with the same names as the variables. (defvar html-helper-bold-face 'bold "Face used as bold. Typically `bold'.") (defvar html-helper-italic-face 'italic "Face used as italic. Typically `italic'.") (defvar html-helper-underline-face 'underline "Face used as underline. Typically `underline'.") ;; (if (string-lessp "19.28.89" emacs-version) () ; Emacs 19.29 and later ;; Emacs 19.28 and older ;; Define face variables that don't exist until Emacs 19.29. (defvar font-lock-variable-name-face 'font-lock-doc-string-face "Face to use for variable names -- and some HTML keywords.") (defvar font-lock-reference-face 'underline ; Ugly at line breaks "Face to use for references -- including HTML hyperlink texts."))) (defvar html-helper-font-lock-keywords (let ((tword "\\(h1\\|title\\)") ; Titles, like function defs (bword "\\(b\\|h[2-4]\\|strong\\)") ; Names of tags to boldify (iword "\\(address\\|cite\\|em\\|i\\|var\\)") ; ... to italify ;; Regexp to match shortest sequence that surely isn't a bold end. ;; We simplify a bit by extending "" to "]\\|" "h\\([^2-4]\\|[2-4][^>]\\)\\|" "s\\([^t]\\|t[^r]\\)\\)\\)\\)")) (not-iend (concat "\\([^<]\\|<\\([^/]\\|/\\([^aceiv]\\|" "a\\([^d]\\|d[^d]\\)\\|" "c\\([^i]\\|i[^t]\\)\\|" "e\\([^m]\\|m[^>]\\)\\|" "i[^>]\\|" "v\\([^a]\\|a[^r]\\)\\)\\)\\)")) (not-tend (concat "\\([^<]\\|<\\([^/]\\|/\\([^ht]\\|" "h[^1]\\|t\\([^i]\\|i[^t]\\)\\)\\)\\)"))) (list ; Avoid use of `keep', since XEmacs will treat it the same as `t'. ;; First fontify the text of a HREF anchor. It may be overridden later. ;; Anchors in headings will be made bold, for instance. '("]*>\\([^>]+\\)" 1 font-lock-reference-face t) ;; Tag pairs like ... etc. ;; Cunning repeated fontification to handle common cases of overlap. ;; Bold complex --- possibly with arbitrary other non-bold stuff inside. (list (concat "<" bword ">\\(" not-bend "*\\)") 2 'html-helper-bold-face t) ;; Italic complex --- possibly with arbitrary non-italic kept inside. (list (concat "<" iword ">\\(" not-iend "*\\)") 2 'html-helper-italic-face t) ;; Bold simple --- first fontify bold regions with no tags inside. (list (concat "<" bword ">\\(" "[^<]" "*\\)") 2 'html-helper-bold-face t) ;; Any tag, general rule, just after bold/italic stuff. '("\\(<[^>]*>\\)" 1 font-lock-type-face t) ;; Titles and level 1 headings (anchors do sometimes appear in h1's) (list (concat "<" tword ">\\(" not-tend "*\\)") 2 'font-lock-function-name-face t) ;; Underline is rarely used. Only handle it when no tags inside. '("\\([^<]*\\)" 1 html-helper-underline-face t) ;; Forms, anchors & images (also fontify strings inside) '("\\(<\\(form\\|i\\(mg\\|nput\\)\\)\\>[^>]*>\\)" 1 font-lock-variable-name-face t) '("" 0 font-lock-keyword-face t) '("\\(]*>\\)" 1 font-lock-keyword-face t) '("=[ \t\n]*\\(\"[^\"]+\"\\)" 1 font-lock-string-face t) ;; Large-scale structure keywords (like "program" in Fortran). ;; "" "" "" "" "" "" "" '("" 0 font-lock-variable-name-face t) ;; HTML special characters '("&[^;\n]*;" 0 font-lock-string-face t) ;; SGML things like with possible inside. '("\\([^<>]*\\(<[^>]*>[^<>]*\\)*>\\)" 1 font-lock-comment-face t) ;; Comments: . They traditionally override anything else. ;; It's complicated 'cause we won't allow "-->" inside a comment, and ;; font-lock colours the *longest* possible match of the regexp. '("\\(\\)" 1 font-lock-comment-face t))) "Additional expressions to highlight in HTML helper mode.") (defun html-font-setup () "Font-lock setup for `html-helper-mode' or `html-helper-mode-hook'." ;; font-lock setup for various emacsen: XEmacs, Emacs 19.29+, Emacs <19.29. ;; By Ulrik Dickow . (Last update: 05-Sep-1995). (cond ((string-match "XEmacs\\|Lucid" (emacs-version)) ; XEmacs/Lucid (put major-mode 'font-lock-keywords-case-fold-search t)) ;; XEmacs (19.13, at least) guesses the rest correctly. ;; If any older XEmacsen don't, then tell me. ;; ((string-lessp "19.28.89" emacs-version) ; Emacs 19.29 and later (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(html-helper-font-lock-keywords t t))) ;; (t ; Emacs 19.28 and older (make-local-variable 'font-lock-keywords-case-fold-search) (make-local-variable 'font-lock-keywords) (make-local-variable 'font-lock-no-comments) (setq font-lock-keywords-case-fold-search t) (setq font-lock-keywords html-helper-font-lock-keywords) (setq font-lock-no-comments t)))) (add-hook 'html-helper-mode-hook (function html-font-setup)) (provide 'html-font) ;;; html-font.el ends here