;;; HTML mode, based on text mode. ;;; Copyright (C) 1985 Free Software Foundation, Inc. ;;; Copyright (C) 1992, 1993 National Center for Supercomputing Applications. ;;; NCSA modifications by Marc Andreessen (marca@ncsa.uiuc.edu). ;;; ;;; 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 1, 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 GNU Emacs; see the file COPYING. If not, write to the ;;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; ;;; -------------------------------- CONTENTS -------------------------------- ;;; ;;; html-mode: Major mode for editing HTML hypertext documents. ;;; Revision: 2.1 (beta) ;;; ;;; Changes from 2.0 (beta): ;;; - Ripped out numeric anchor name stuff altogether (all names should be ;;; meaningful, not just numbers). ;;; - Fixed problem with unquoted names. ;;; - Fixed font-lock support (yeah! thanks lamour@engin.umich.edu). ;;; ;;; ------------------------------ INSTRUCTIONS ------------------------------ ;;; ;;; Put the following code in your .emacs file: ;;; ;;; (autoload 'html-mode "html-mode" "HTML major mode." t) ;;; (or (assoc "\\.html$" auto-mode-alist) ;;; (setq auto-mode-alist (cons '("\\.html$" . html-mode) ;;; auto-mode-alist))) ;;; ;;; Emacs will detect the ``.html'' suffix and activate html-mode ;;; appropriately. ;;; ;;; You are assumed to be at least somewhat familiar with the HTML ;;; format. If you aren't, read about it first (see below). ;;; ;;; Here are key sequences and corresponding commands: ;;; ;;; NORMAL COMMANDS: ;;; ;;; C-c a html-add-address ;;; Open an address element. ;;; ;;; C-c b html-add-blockquote ;;; ;;; C-c C-b html-add-bold ;;; Open a bold element. ;;; ;;; C-c c html-add-code ;;; Open a 'code' (fixed-font) element. ;;; ;;; C-c C-c html-add-citation ;;; ;;; C-c d html-add-description-list ;;; Open a definition list. The initial entry is created for you. ;;; To create subsequent entries, use 'C-c e'. ;;; ;;; C-c e html-add-description-entry ;;; Add a new definition entry in a definition list. You are ;;; assumed to be inside a definition list (specifically, at the end ;;; of another definition entry). ;;; ;;; C-c C-e html-add-emphasized ;;; Open an emphasized element. ;;; ;;; C-c C-f html-add-fixed ;;; ;;; C-c g html-add-img ;;; Add an IMG element (inlined image or graphic). Note that the ;;; IMG tag is currently an extension to HTML supported only by the ;;; NCSA Mosaic browser (to my knowledge). You will be prompted for ;;; the URL of the image you wish to inline into the document. ;;; ;;; C-c h html-add-header ;;; Add a header. You are prompted for size (1 is biggest, 2 is ;;; next biggest; bottom limit is 6) and header contents. ;;; ;;; C-c i html-add-list-or-menu-item ;;; Add a new list or menu item in a list or menu. You are assumed ;;; to be inside a list or menu (specifically, at the end of another ;;; item). ;;; ;;; C-c C-i html-add-italic ;;; Open an italic element. ;;; ;;; C-c C-k html-add-keyboard ;;; ;;; C-c l html-add-normal-link ;;; Add a link. You will be prompted for the link (any string; ;;; e.g., http://foo.bar/argh/blagh). The cursor will be left where ;;; you can type the text that will represent the link in the ;;; document. ;;; ;;; C-c C-l html-add-listing ;;; ;;; C-c m html-add-menu ;;; Open a menu. The initial item is created for you. To create ;;; additional items, use 'C-c i'. ;;; ;;; C-c C-m html-add-sample ;;; ;;; C-c n html-add-numbered-list ;;; ;;; C-c p html-add-paragraph-separator ;;; Use this command at the end of each paragraph. ;;; ;;; C-c C-p html-add-preformatted ;;; ;;; C-c r html-add-normal-reference ;;; ;;; C-c s html-add-list ;;; Open a list. The initial item is created for you. To create ;;; additional items, use 'C-c i'. ;;; ;;; C-c C-s html-add-strong ;;; ;;; C-c t html-add-title ;;; Add a title to the document. You will be prompted for the ;;; contents of the title. If a title already exists at the very ;;; top of the document, the existing contents will be replaced. ;;; ;;; C-c C-v html-add-variable ;;; ;;; C-c x html-add-plaintext ;;; Add plaintext. The cursor will be positioned where you can type ;;; plaintext (or insert another file, or whatever). ;;; ;;; C-c z html-preview-document ;;; Fork off a Mosaic process to preview the current document. ;;; After you do this once, subsequent invocations of ;;; html-preview-document will cause the same Mosaic process to be ;;; used; this magic is accomplished through Mosaic's ability to be ;;; remote-controlled via Unix signals. This feature is only ;;; available when running Lucid Emacs v19 (it will maybe work with ;;; GNU Emacs v19; I'm not sure). ;;; ;;; COMMANDS THAT OPERATE ON THE CURRENT REGION: ;;; ;;; C-c C-r l html-add-normal-link-to-region ;;; Add a link that will be represented by the current region. You ;;; will be prompted for the link (any string, as with ;;; html-add-normal-link). ;;; ;;; C-c C-r r html-add-reference-to-region ;;; Add a reference (a link that does not reference anything) that ;;; will be represented by the current region. You will be prompted ;;; for the name of the link. ;;; ;;; SPECIAL COMMANDS: ;;; ;;; <, >, & ;;; These are overridden to output <, >, and & ;;; respectively. The real characters <, >, and & can be entered ;;; into the text either by typing 'C-c' before typing the character ;;; or by using the Emacs quoted-insert (C-q) command. ;;; ;;; C-c <, C-c >, C-c & ;;; See '<, >, &' above. ;;; ;;; ---------------------------- ADDITIONAL NOTES ---------------------------- ;;; ;;; If you are running Epoch or Lucid Emacs, highlighting will be used ;;; to deemphasize HTML message elements as they are created. You can ;;; turn this off; see the variables 'html-use-highlighting' and ;;; 'html-use-font-lock'. ;;; ;;; HREF and NAME arguments in anchors should always be quoted. In ;;; some existing HTML documents, they are not. html-mode will ;;; automatically quotify all such unquoted arguments when it ;;; encounters them. The following variables affect this behavior. ;;; ;;; html-quotify-hrefs-on-find (variable, default t) ;;; If this is non-nil, all HREF arguments will be quotified ;;; automatically when a HTML document is loaded into Emacs ;;; (actually when html-mode is entered). ;;; ;;; -------------------------------- GOTCHAS --------------------------------- ;;; ;;; HTML documents can be tricky. html-mode is not smart enough to ;;; enforce correctness or sanity, so you have to do that yourself. ;;; ;;; ------------------------- WHAT HTML-MODE IS NOT -------------------------- ;;; ;;; html-mode is not a mode for *browsing* HTML documents. In ;;; particular, html-mode provides no hypertext or World Wide Web ;;; capabilities. ;;; ;;; The World Wide Web browser we (naturally) recommend is NCSA ;;; Mosaic, which can be found at ftp.ncsa.uiuc.edu in /Mosaic. ;;; ;;; See file://moose.cs.indiana.edu/pub/elisp/w3 for w3.el, which is ;;; an Elisp World Wide Web browser written by William Perry. ;;; ;;; ------------------------------ WHAT HTML IS ------------------------------ ;;; ;;; HTML (HyperText Markup Language) is a format for hypertext ;;; documents, particularly in the World Wide Web system. For more ;;; information on HTML, telnet to info.cern.ch or pick up a copy of ;;; NCSA Mosaic for the X Window System via ftp to ftp.ncsa.uiuc.edu ;;; in /Mosaic; information is available online through the software ;;; products distributed at those sites. ;;; ;;; ---------------------------- ACKNOWLEDGEMENTS ---------------------------- ;;; ;;; Some code herein provided by: ;;; Dan Connolly <connolly@pixel.convex.com> ;;; ;;; -------------------------------------------------------------------------- ;;; LCD Archive Entry: ;;; html-mode|Marc Andreessen|marca@ncsa.uiuc.edu| ;;; Major mode for editing HTML hypertext files.| ;;; Date: sometime in 1993|Revision: 2.1 (beta)|~/modes/html-mode.el.Z| ;;; -------------------------------------------------------------------------- ;;; ---------------------------- emacs variations ---------------------------- (defvar html-running-lemacs (if (string-match "Lucid" emacs-version) t nil) "Non-nil if running Lucid Emacs.") (defvar html-running-epoch (boundp 'epoch::version) "Non-nil if running Epoch.") ;;; ------------------------------- variables -------------------------------- (defvar html-quotify-hrefs-on-find t "*If non-nil, all HREF's (and NAME's) in a file will be automatically quotified when the file is loaded. This is useful for converting ancient HTML documents to SGML-compatible syntax, which mandates quoted HREF's. This should always be T.") (defvar html-use-highlighting html-running-epoch "*Flag to use highlighting for HTML directives in Epoch or Lucid Emacs; if non-NIL, highlighting will be used. Default is T if you are running Epoch; nil otherwise (for Lucid Emacs, font-lock is better; see html-use-font-lock instead).") (defvar html-use-font-lock html-running-lemacs "*Flag to use font-lock for HTML directives in Lucid Emacs. If non-NIL, font-lock will be used. Default is T if you are running with Lucid Emacs; NIL otherwise. This doesn't currently seem to work. Bummer. Ten points to the first person who tells me why not.") (defvar html-deemphasize-color "grey80" "*Color for de-highlighting HTML directives in Epoch or Lucid Emacs.") (defvar html-emphasize-color "yellow" "*Color for highlighting HTML something-or-others in Epoch or Lucid Emacs.") (defvar html-document-previewer "xmosaic" "*Program to be used to preview HTML documents. Program is assumed to accept a single argument, a filename containing a file to view; program is also assumed to follow the Mosaic convention of handling SIGUSR1 as a remote-control mechanism.") (defvar html-document-previewer-args "-ngh" "*Arguments to be given to the program named by html-document-previewer; NIL if none should be given.") (defvar html-sigusr1-signal-value 16 "*Value for the SIGUSR1 signal on your system. See, usually, /usr/include/sys/signal.h.") ;;; --------------------------------- setup ---------------------------------- (defvar html-mode-syntax-table nil "Syntax table used while in html mode.") (defvar html-mode-abbrev-table nil "Abbrev table used while in html mode.") (define-abbrev-table 'html-mode-abbrev-table ()) (if html-mode-syntax-table () (setq html-mode-syntax-table (make-syntax-table)) (modify-syntax-entry ?\" ". " html-mode-syntax-table) (modify-syntax-entry ?\\ ". " html-mode-syntax-table) (modify-syntax-entry ?' "w " html-mode-syntax-table)) (defvar html-mode-map nil "") (if html-mode-map () (setq html-mode-map (make-sparse-keymap)) (define-key html-mode-map "\t" 'tab-to-tab-stop) (define-key html-mode-map "\C-ca" 'html-add-address) (define-key html-mode-map "\C-cb" 'html-add-blockquote) (define-key html-mode-map "\C-cc" 'html-add-code) (define-key html-mode-map "\C-cd" 'html-add-description-list) (define-key html-mode-map "\C-ce" 'html-add-description-entry) (define-key html-mode-map "\C-cg" 'html-add-img) (define-key html-mode-map "\C-ch" 'html-add-header) (define-key html-mode-map "\C-ci" 'html-add-list-or-menu-item) (define-key html-mode-map "\C-cl" 'html-add-normal-link) (define-key html-mode-map "\C-cm" 'html-add-menu) (define-key html-mode-map "\C-cn" 'html-add-numbered-list) (define-key html-mode-map "\C-cp" 'html-add-paragraph-separator) (define-key html-mode-map "\C-cr" 'html-add-normal-reference) (define-key html-mode-map "\C-cs" 'html-add-list) (define-key html-mode-map "\C-ct" 'html-add-title) (define-key html-mode-map "\C-cx" 'html-add-plaintext) ;; html-preview-document currently requires the primitive ;; signal-process, which is only in v19 (is it in gnu 19? dunno). (and html-running-lemacs (define-key html-mode-map "\C-cz" 'html-preview-document)) (define-key html-mode-map "\C-c\C-b" 'html-add-bold) (define-key html-mode-map "\C-c\C-c" 'html-add-citation) (define-key html-mode-map "\C-c\C-e" 'html-add-emphasized) (define-key html-mode-map "\C-c\C-f" 'html-add-fixed) (define-key html-mode-map "\C-c\C-i" 'html-add-italic) (define-key html-mode-map "\C-c\C-k" 'html-add-keyboard) (define-key html-mode-map "\C-c\C-l" 'html-add-listing) (define-key html-mode-map "\C-c\C-m" 'html-add-sample) (define-key html-mode-map "\C-c\C-p" 'html-add-preformatted) (define-key html-mode-map "\C-c\C-s" 'html-add-strong) (define-key html-mode-map "\C-c\C-v" 'html-add-variable) (define-key html-mode-map "<" 'html-less-than) (define-key html-mode-map ">" 'html-greater-than) (define-key html-mode-map "&" 'html-ampersand) (define-key html-mode-map "\C-c<" 'html-real-less-than) (define-key html-mode-map "\C-c>" 'html-real-greater-than) (define-key html-mode-map "\C-c&" 'html-real-ampersand) (define-key html-mode-map "\C-c\C-rl" 'html-add-normal-link-to-region) (define-key html-mode-map "\C-c\C-rr" 'html-add-reference-to-region) ) ;;; ------------------------------ highlighting ------------------------------ (if (and html-running-epoch html-use-highlighting) (progn (defvar html-deemphasize-style (make-style)) (set-style-foreground html-deemphasize-style html-deemphasize-color) (defvar html-emphasize-style (make-style)) (set-style-foreground html-emphasize-style html-emphasize-color))) (if (and html-running-lemacs html-use-highlighting) (progn (defvar html-deemphasize-style (make-face 'html-deemphasize-face)) (set-face-foreground html-deemphasize-style html-deemphasize-color) (defvar html-emphasize-style (make-face 'html-emphasize-face)) (set-face-foreground html-emphasize-style html-emphasize-color))) (if html-use-highlighting (progn (if html-running-lemacs (defun html-add-zone (start end style) "Add a Lucid Emacs extent from START to END with STYLE." (let ((extent (make-extent start end))) (set-extent-face extent style) (set-extent-data extent 'html-mode)))) (if html-running-epoch (defun html-add-zone (start end style) "Add an Epoch zone from START to END with STYLE." (let ((zone (add-zone start end style))) (epoch::set-zone-data zone 'html-mode)))))) (defun html-maybe-deemphasize-region (start end) "Maybe deemphasize a region of text. Region is from START to END." (and (or html-running-epoch html-running-lemacs) html-use-highlighting (html-add-zone start end html-deemphasize-style))) ;;; -------------------------------------------------------------------------- ;;; ------------------------ command support routines ------------------------ ;;; -------------------------------------------------------------------------- (defun html-add-link (link-object) "Add a link. Single argument LINK-OBJECT is value of HREF in the new anchor. Mark is set after anchor." (let ((start (point))) (insert "<A") (insert " HREF=\"" link-object "\">") (html-maybe-deemphasize-region start (1- (point))) (insert "</A>") (push-mark) (forward-char -4) (html-maybe-deemphasize-region (1+ (point)) (+ (point) 4)))) (defun html-add-reference (ref-object) "Add a reference. Single argument REF-OBJECT is value of NAME in the new anchor. Mark is set after anchor." (let ((start (point))) (insert "<A") (insert " NAME=\"" ref-object "\">") (html-maybe-deemphasize-region start (1- (point))) (insert "</A>") (push-mark) (forward-char -4) (html-maybe-deemphasize-region (1+ (point)) (+ (point) 4)))) (defun html-add-list-internal (type) "Set up a given type of list by opening the list start/end pair and creating an initial element. Single argument TYPE is a string, assumed to be a valid HTML list type (e.g. \"UL\" or \"OL\"). Mark is set after list." (let ((start (point))) (insert "<" type ">\n") (html-maybe-deemphasize-region start (1- (point))) (insert "<LI> ") ;; Point goes right there. (save-excursion (insert "\n") (setq start (point)) (insert "</" type ">\n") (html-maybe-deemphasize-region start (1- (point))) ;; Reuse start to set mark. (setq start (point))) (push-mark start t))) (defun html-open-area (tag) "Open an area for entering text such as PRE, XMP, or LISTING." (let ((start (point))) (insert "<" tag ">\n") (html-maybe-deemphasize-region start (1- (point))) (save-excursion (insert "\n") (setq start (point)) (insert "</" tag ">\n") (html-maybe-deemphasize-region start (1- (point))) ;; Reuse start to set mark. (setq start (point))) (push-mark start t))) (defun html-open-field (tag) (let ((start (point))) (insert "<" tag ">") (html-maybe-deemphasize-region start (1- (point))) (setq start (point)) (insert "</" tag ">") (html-maybe-deemphasize-region (1+ start) (point)) (push-mark) (goto-char start))) ;;; -------------------------------------------------------------------------- ;;; -------------------------------- commands -------------------------------- ;;; -------------------------------------------------------------------------- ;; C-c a (defun html-add-address () "Add an address." (interactive) (html-open-field "ADDRESS")) ;; C-c b (defun html-add-blockquote () (interactive) (html-open-area "BLOCKQUOTE")) ;; C-c C-b (defun html-add-bold () (interactive) (html-open-field "B")) ;; C-c c (defun html-add-code () (interactive) (html-open-field "CODE")) ;; C-c C-c (defun html-add-citation () (interactive) (html-open-field "CITE")) ;; C-c d (defun html-add-description-list () "Add a definition list. Blah blah." (interactive) (let ((start (point))) (insert "<DL>\n") (html-maybe-deemphasize-region start (1- (point))) (insert "<DT> ") ;; Point goes right there. (save-excursion (insert "\n<DD> \n") (setq start (point)) (insert "</DL>\n") (html-maybe-deemphasize-region start (1- (point))) ;; Reuse start to set mark. (setq start (point))) (push-mark start t))) ;; C-c e (defun html-add-description-entry () "Add a definition entry. Assume we're at the end of a previous entry." (interactive) (let ((start (point))) (insert "\n<DT> ") (save-excursion (insert "\n<DD> ")))) ;; C-c C-e (defun html-add-emphasized () (interactive) (html-open-field "EM")) ;; C-c C-f (defun html-add-fixed () (interactive) (html-open-field "TT")) ;; C-c g (defun html-add-img (href) "Add an img." (interactive "sImage URL: ") (let ((start (point))) (insert "<IMG SRC=\"" href "\">") (html-maybe-deemphasize-region (1+ start) (1- (point))))) ;; C-c h (defun html-add-header (size header) "Add a header." (interactive "sSize (1-6; 1 biggest): \nsHeader: ") (let ((start (point))) (insert "<H" size ">") (html-maybe-deemphasize-region start (1- (point))) (insert header) (setq start (point)) (insert "</H" size ">\n") (html-maybe-deemphasize-region (1+ start) (1- (point))))) ;; C-c i (defun html-add-list-or-menu-item () "Add a list or menu item. Assume we're at the end of the last item." (interactive) (let ((start (point))) (insert "\n<LI> "))) ;; C-c C-i (defun html-add-italic () (interactive) (html-open-field "I")) ;; C-c C-k (defun html-add-keyboard () (interactive) (html-open-field "KBD")) ;; C-c l (defun html-add-normal-link (link) "Make a link" (interactive "sLink to: ") (html-add-link link)) ;; C-c C-l (defun html-add-listing () (interactive) (html-open-area "LISTING")) ;; C-c m (defun html-add-menu () "Add a menu." (interactive) (html-add-list-internal "MENU")) ;; C-c C-m (defun html-add-sample () (interactive) (html-open-field "SAMP")) ;; C-c n (defun html-add-numbered-list () "Add a numbered list." (interactive) (html-add-list-internal "OL")) ;; C-c p (defun html-add-paragraph-separator () "Add a paragraph separator." (interactive) (let ((start (point))) (insert " <P>") (html-maybe-deemphasize-region (+ start 1) (point)))) ;; C-c C-p (defun html-add-preformatted () (interactive) (html-open-area "PRE")) ;; C-c r (defun html-add-normal-reference (reference) "Add a reference (named anchor)." (interactive "sReference name: ") (html-add-reference reference)) ;; C-c s (defun html-add-list () "Add a list." (interactive) (html-add-list-internal "UL")) ;; C-c C-s (defun html-add-strong () (interactive) (html-open-field "STRONG")) ;; C-c t (defun html-add-title (title) "Add or modify a title." (interactive "sTitle: ") (save-excursion (goto-char (point-min)) (if (and (looking-at "<TITLE>") (save-excursion (forward-char 7) (re-search-forward "[^<]*" (save-excursion (end-of-line) (point)) t))) ;; Plop the new title in its place. (replace-match title t) (insert "<TITLE>") (html-maybe-deemphasize-region (point-min) (1- (point))) (insert title) (insert "</TITLE>") (html-maybe-deemphasize-region (- (point) 7) (point)) (insert "\n")))) ;; C-c C-v (defun html-add-variable () (interactive) (html-open-field "VAR")) ;; C-c x (defun html-add-plaintext () "Add plaintext." (interactive) (html-open-area "XMP")) ;;; -------------------------------------------------------------------------- ;;; ---------------------------- region commands ----------------------------- ;;; -------------------------------------------------------------------------- ;; C-c C-r l (defun html-add-normal-link-to-region (link start end) "Make a link that applies to the current region. Again, no completion." (interactive "sLink to: \nr") (save-excursion (goto-char end) (save-excursion (goto-char start) (insert "<A") (insert " HREF=\"" link "\">") (html-maybe-deemphasize-region start (1- (point)))) (insert "</A>") (html-maybe-deemphasize-region (- (point) 3) (point)))) ;; C-c C-r r (defun html-add-reference-to-region (name start end) "Add a reference point (a link with no reference of its own) to the current region." (interactive "sName: \nr") (or (string= name "") (save-excursion (goto-char end) (save-excursion (goto-char start) (insert "<A NAME=\"" name "\">") (html-maybe-deemphasize-region start (1- (point)))) (insert "</A>") (html-maybe-deemphasize-region (- (point) 3) (point))))) ;;; -------------------------------------------------------------------------- ;;; ---------------------------- special commands ---------------------------- ;;; -------------------------------------------------------------------------- (defun html-less-than () (interactive) (insert "<")) (defun html-greater-than () (interactive) (insert ">")) (defun html-ampersand () (interactive) (insert "&")) (defun html-real-less-than () (interactive) (insert "<")) (defun html-real-greater-than () (interactive) (insert ">")) (defun html-real-ampersand () (interactive) (insert "&")) ;;; -------------------------------------------------------------------------- ;;; --------------------------- Mosaic previewing ---------------------------- ;;; -------------------------------------------------------------------------- ;; OK, we work like this: We have a variable html-previewer-process. ;; When we start, it's nil. First time html-preview-document is ;; called, we write the current document into a tmp file and call ;; Mosaic on it. Second time html-preview-document is called, we ;; write the current document into a tmp file, write out a tmp config ;; file, and send Mosaic SIGUSR1. ;; This feature REQUIRES the Lisp command signal-process, which seems ;; to be a Lucid Emacs v19 feature. It might be in GNU Emacs v19 too; ;; I dunno. (defvar html-previewer-process nil "Variable used to track live viewer process.") (defun html-write-buffer-to-tmp-file () "Write the current buffer to a temp file and return the name of the tmp file." (let ((filename (concat "/tmp/" (make-temp-name "html") ".html"))) (write-region (point-min) (point-max) filename nil 'foo) filename)) (defun html-preview-document () "Preview the current buffer's HTML document by spawning off a previewing process (assumed to be Mosaic, basically) and controlling it with signals as long as it's alive." (interactive) (let ((tmp-file (html-write-buffer-to-tmp-file))) ;; If html-previewer-process is nil, we start a process. ;; OR if the process status is not equal to 'run. (if (or (eq html-previewer-process nil) (not (eq (process-status html-previewer-process) 'run))) (progn (message "Starting previewer...") (setq html-previewer-process (if html-document-previewer-args (start-process "html-previewer" "html-previewer" html-document-previewer html-document-previewer-args tmp-file) (start-process "html-previewer" "html-previewer" html-document-previewer tmp-file)))) ;; We've got a running previewer; use it via SIGUSR1. (save-excursion (let ((config-file (format "/tmp/xmosaic.%d" (process-id html-previewer-process)))) (set-buffer (generate-new-buffer "*html-preview-tmp*")) (insert "goto\nfile:" tmp-file "\n") (write-region (point-min) (point-max) config-file nil 'foo) ;; This is a v19 routine only. (signal-process (process-id html-previewer-process) html-sigusr1-signal-value) (delete-file config-file) (delete-file tmp-file) (kill-buffer (current-buffer))))))) ;;; -------------------------------------------------------------------------- ;;; -------------------------------------------------------------------------- ;;; -------------------------------------------------------------------------- (defun html-replace-string-in-buffer (start end newstring) (save-excursion (goto-char start) (delete-char (1+ (- end start))) (insert newstring))) ;;; --------------------------- html-quotify-hrefs --------------------------- (defun html-quotify-hrefs () "Insert quotes around all HREF and NAME attribute value literals. This remedies the problem with old HTML files that can't be processed by SGML parsers. That is, changes <A HREF=foo> to <A HREF=\"foo\">." (interactive) (save-excursion (goto-char (point-min)) (while (re-search-forward "<[aA][ \t\n]+\\([nN][aA][mM][eE]=[a-zA-Z0-9]+[ \t\n]+\\)?[hH][rR][eE][fF]=" (point-max) t) (cond ((null (looking-at "\"")) (insert "\"") (re-search-forward "[ \t\n>]" (point-max) t) (forward-char -1) (insert "\"")))))) ;;; ------------------------------- html-mode -------------------------------- ;;;###autoload (defun html-mode () "Major mode for editing HTML hypertext documents. Special commands:\\{html-mode-map} Turning on html-mode calls the value of the variable html-mode-hook, if that value is non-nil. More extensive documentation is available in the file 'html-mode.el'. The latest (possibly unstable) version of this file will always be available on anonymous FTP server ftp.ncsa.uiuc.edu in /Mosaic/elisp." (interactive) (kill-all-local-variables) (use-local-map html-mode-map) (setq mode-name "HTML") (setq major-mode 'html-mode) (setq local-abbrev-table html-mode-abbrev-table) (set-syntax-table html-mode-syntax-table) (run-hooks 'html-mode-hook) (and html-use-font-lock (html-fontify))) ;;; ------------------------------- our hooks -------------------------------- (defun html-html-mode-hook () "Hook called from html-mode-hook. Run htlm-quotify-hrefs if html-quotify-hrefs-on-find is non-nil." ;; Quotify existing HREF's if html-quotify-hrefs-on-find is non-nil. (and html-quotify-hrefs-on-find (html-quotify-hrefs))) ;;; ------------------------------- hook setup ------------------------------- ;; Author: Daniel LaLiberte (liberte@cs.uiuc.edu). (defun html-postpend-unique-hook (hook-var hook-function) "Postpend HOOK-VAR with HOOK-FUNCTION, if it is not already an element. hook-var's value may be a single function or a list of functions." (if (boundp hook-var) (let ((value (symbol-value hook-var))) (if (and (listp value) (not (eq (car value) 'lambda))) (and (not (memq hook-function value)) (set hook-var (append value (list hook-function)))) (and (not (eq hook-function value)) (set hook-var (append value (list hook-function)))))) (set hook-var (list hook-function)))) (html-postpend-unique-hook 'html-mode-hook 'html-html-mode-hook) ;;; -------------------------- lucid menubar setup --------------------------- (if html-running-lemacs (progn (defvar html-menu '("HTML Mode" ["Open Address" html-add-address t] ["Open Blockquote" html-add-blockquote t] ["Open Header" html-add-header t] ["Open Hyperlink" html-add-normal-link t] ["Open Listing" html-add-listing t] ["Open Plaintext" html-add-plaintext t] ["Open Preformatted" html-add-preformatted t] ["Open Reference" html-add-normal-reference t] ["Open Title" html-add-title t] "----" ["Open Bold" html-add-bold t] ["Open Citation" html-add-citation t] ["Open Code" html-add-code t] ["Open Emphasized" html-add-emphasized t] ["Open Fixed" html-add-fixed t] ["Open Keyboard" html-add-keyboard t] ["Open Sample" html-add-sample t] ["Open Strong" html-add-strong t] ["Open Variable" html-add-variable t] "----" ["Add Inlined Image" html-add-img t] ["End Paragraph" html-add-paragraph-separator t] ["Preview Document" html-preview-document t] "----" ("Definition List ..." ["Open Definition List" html-add-description-list t] ["Add Definition Entry" html-add-description-entry t] ) ("Other Lists ..." ["Open Unnumbered List" html-add-list t] ["Open Numbered List" html-add-numbered-list t] ["Open Menu" html-add-menu t] "----" ["Add List Or Menu Item" html-add-list-or-menu-item t] ) ("Operations On Region ..." ["Add Hyperlink To Region" html-add-normal-link-to-region t] ["Add Reference To Region" html-add-reference-to-region t] ) ("Reserved Characters ..." ["Less Than (<)" html-real-less-than t] ["Greater Than (>)" html-real-greater-than t] ["Ampersand (&)" html-real-ampersand t] ) ) ) (defun html-menu (e) (interactive "e") (mouse-set-point e) (beginning-of-line) (popup-menu html-menu)) (define-key html-mode-map 'button3 'html-menu) (defun html-install-menubar () (if (and current-menubar (not (assoc "HTML" current-menubar))) (progn (set-buffer-menubar (copy-sequence current-menubar)) (add-menu nil "HTML" (cdr html-menu))))) (html-postpend-unique-hook 'html-mode-hook 'html-install-menubar) (defconst html-font-lock-keywords (list '("\\(<[^>]*>\\)+" . font-lock-comment-face) '("[Hh][Rr][Ee][Ff]=\"\\([^\"]*\\)\"" 1 font-lock-string-face t) '("[Ss][Rr][Cc]=\"\\([^\"]*\\)\"" 1 font-lock-string-face t)) "Patterns to highlight in HTML buffers.") (defun html-fontify () (font-lock-mode 1) (make-local-variable 'font-lock-keywords) (setq font-lock-keywords html-font-lock-keywords) (font-lock-hack-keywords (point-min) (point-max)) (message "Hey boss, we been through html-fontify.")) ) ) ;;; ------------------------------ final setup ------------------------------- (or (rassq 'html-mode auto-mode-alist) ;jwz (setq auto-mode-alist (cons '("\\.html\\'" . html-mode) auto-mode-alist))) (provide 'html-mode)