diff lisp/psgml/psgml-other.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/psgml/psgml-other.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,323 @@
+;;;; psgml-other.el --- Part of SGML-editing mode with parsing support
+;; $Id: psgml-other.el,v 1.1.1.1 1996/12/18 03:35:21 steve Exp $
+
+;; Copyright (C) 1994 Lennart Staflin
+
+;; Author: Lennart Staflin <lenst@lysator.liu.se>
+
+;; 
+;; 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+;;;; Commentary:
+
+;;; Part of psgml.el
+
+;;; Menus for use with FSF Emacs 19
+
+
+;;;; Code:
+
+(require 'psgml)
+(require 'easymenu)
+
+(defvar sgml-max-menu-size (/ (* (frame-height) 2) 3)
+  "*Max number of entries in Tags and Entities menus before they are split
+into several panes.")
+
+
+;;;; Menu bar
+
+(easy-menu-define
+ sgml-dtd-menu sgml-mode-map "DTD menu"
+ '("DTD"))
+
+(defconst sgml-dtd-root-menu
+  '("DTD"
+    ["Parse DTD"  sgml-parse-prolog t]
+    ("Info"
+     ["General DTD info"	sgml-general-dtd-info           t]
+     ["Describe element type"	sgml-describe-element-type	t]
+     ["Describe entity"		sgml-describe-entity		t]
+     ["List elements" 		sgml-list-elements 		t]
+     ["List attributes" 	sgml-list-attributes 		t]
+     ["List terminals" 		sgml-list-terminals 		t]
+     ["List content elements" 	sgml-list-content-elements 	t]
+     ["List occur in elements" 	sgml-list-occur-in-elements 	t]
+     )
+    "--"
+    ["Load Parsed DTD"  sgml-load-dtd t]
+    ["Save Parsed DTD"  sgml-save-dtd t]
+    ))
+
+(easy-menu-define
+ sgml-view-menu sgml-mode-map "View menu"
+ '("View"
+   ["Fold Element"	sgml-fold-element	t]
+   ["Fold Subelement"	sgml-fold-subelement	t]
+   ["Unfold Line"	sgml-unfold-line	t]
+   ["Unfold Element"	sgml-unfold-element	t]
+   ["Expand"		sgml-expand-element	t]
+   ["Fold Region"	sgml-fold-region	t]
+   ["Unfold All"	sgml-unfold-all		t]
+   ["Hide Tags"		sgml-hide-tags		t]
+   ["Hide Attributes"	sgml-hide-attributes	t]
+   ["Show All Tags"	sgml-show-tags		t]
+   )
+ )
+
+
+(easy-menu-define
+ sgml-markup-menu sgml-mode-map "Markup menu"
+ '("Markup")
+)
+
+(defconst sgml-markup-root-menu
+  '("Markup"
+    ["Insert Element"	sgml-element-menu	t]
+    ["Insert Start-Tag" sgml-start-tag-menu	t]
+    ["Insert End-Tag"	sgml-end-tag-menu	t]
+    ["Tag Region"	sgml-tag-region-menu	t]
+    ["Insert Attribute" sgml-attrib-menu	t]
+    ["Insert Entity"	sgml-entities-menu	t]
+    ))
+
+(easy-menu-define
+ sgml-move-menu sgml-mode-map "Menu of move commands"
+ '("Move"
+   ["Next trouble spot" sgml-next-trouble-spot t]
+   ["Next data field"   sgml-next-data-field   t]
+   ["Forward element"	sgml-forward-element t]
+   ["Backward element"  sgml-backward-element t]
+   ["Up element"	sgml-up-element t]
+   ["Down element"	sgml-down-element t]
+   ["Backward up element" sgml-backward-up-element t]
+   ["Beginning of element" sgml-beginning-of-element t]
+   ["End of element"	sgml-end-of-element t]
+   ))
+
+(easy-menu-define
+ sgml-modify-menu sgml-mode-map "Menu of modification commands"
+ '("Modify"
+   ["Normalize"			sgml-normalize	t]
+   ["Expand All Short References"	sgml-expand-all-shortrefs t]
+   ["Expand Entity Reference"	sgml-expand-entity-reference t]
+   ["Normalize Element"		sgml-normalize-element t]
+   ["Make Character Reference"	sgml-make-character-reference t]
+   ["Unmake Character Reference"	(sgml-make-character-reference t) t]
+   ["Fill Element"		sgml-fill-element t]
+   ["Change Element Name..."	sgml-change-element-name t]
+   ["Edit Attributes..."	sgml-edit-attributes t]
+   ["Kill Markup"		sgml-kill-markup t]
+   ["Kill Element"		sgml-kill-element t]
+   ["Untag Element"		sgml-untag-element t]
+   ["Trim and leave element"	sgml-trim-and-leave-element t]
+   ["Decode Character Entities"  sgml-charent-to-display-char t]
+   ["Encode Characters"		sgml-display-char-to-charent t]
+   )
+ )
+
+(easy-menu-define
+ sgml-main-menu sgml-mode-map "Main menu"
+ '("SGML"
+   ["Reset Buffer"	normal-mode t]
+   ["End Element"	sgml-insert-end-tag t]
+   ["Show Context"	sgml-show-context t]
+   ["What Element"	sgml-what-element t]
+   ["List Valid Tags"	sgml-list-valid-tags t]
+   ["Show/Hide Warning Log"  sgml-show-or-clear-log t]
+   ["Validate"		sgml-validate t]
+   ["File Options >"	sgml-file-options-menu t]
+   ["User Options >"	sgml-user-options-menu t]
+   ["Save File Options"  sgml-save-options t]
+   ["Submit Bug Report"  sgml-submit-bug-report t]
+   )
+ )
+
+
+;;;; Key Commands
+
+;; Doesn't this work in Lucid? ***
+(define-key sgml-mode-map [?\M-\C-\ ] 'sgml-mark-element)
+
+(define-key sgml-mode-map [S-mouse-1] 'sgml-tags-menu)
+
+
+;;;; Pop Up Menus
+
+(defun sgml-popup-menu (event title entries)
+  "Display a popup menu.
+ENTRIES is a list where every element has the form (STRING . VALUE) or
+STRING."
+  (x-popup-menu
+   event
+   (let ((menus (list (cons title entries))))
+     (cond ((> (length entries)
+	       sgml-max-menu-size)
+	    (setq menus
+		  (loop for i from 1 while entries
+			collect
+			(let ((submenu
+			       (subseq entries 0 (min (length entries)
+						      sgml-max-menu-size))))
+			  (setq entries (nthcdr sgml-max-menu-size
+						entries))
+			  (cons
+			   (format "%s '%s'-'%s'"
+				   title
+				   (sgml-range-indicator (caar submenu))
+				   (sgml-range-indicator (caar (last submenu))))
+			   submenu))))))
+     (cons title menus))))
+
+(defun sgml-range-indicator (string)
+  (substring string
+	     0
+	     (min (length string) sgml-range-indicator-max-length)))
+
+(defun sgml-popup-multi-menu (event title menus)
+  "Display a popup menu.
+MENUS is a list of menus on the form (TITLE ITEM1 ITEM2 ...).
+ITEM should have to form (STRING EXPR) or STRING.  The EXPR gets evaluated
+if the item is selected."
+  (nconc menus '(("---" "---")))	; Force x-popup-menu to use two level
+					; menu even if there is only one entry
+					; on the first level
+  (eval (car (x-popup-menu event (cons title menus)))))
+
+
+
+;;;; Build Custom Menus
+
+(defun sgml-build-custom-menus ()
+  ;; Build custom menus
+;;  (sgml-add-custom-entries
+;;   sgml-markup-menu
+;;   (mapcar (function (lambda (e)
+;;		       (sgml-markup (car e) (cadr e))))
+;;	   sgml-custom-markup))
+  (easy-menu-define
+   sgml-markup-menu sgml-mode-map "Markup menu"
+   (append sgml-markup-root-menu
+	   (list "----")
+	   (loop for e in sgml-custom-markup collect
+		 (vector (first e)
+			 (` (sgml-insert-markup  (, (cadr e))))
+			 t))))
+  (easy-menu-define
+   sgml-dtd-menu sgml-mode-map "DTD menu"
+   (append sgml-dtd-root-menu
+	   (list "----")
+	   (loop for e in sgml-custom-dtd collect
+		 (vector (first e)
+			 (` (sgml-doctype-insert (, (cadr e))
+						 '(, (cddr e))))
+			 t)))))
+
+
+;(defun sgml-add-custom-entries (keymap entries)
+;  "Add to KEYMAP the ENTRIES, a list of (name . command) pairs.
+;The entries are added last in keymap and a blank line precede it."
+;  (let ((l keymap)
+;	(last (last keymap)))		; cons with keymap name
+;    ;; Find the cons before 'blank-c' event, or last cons.
+;    (while (and (cdr l)
+;		(consp (cadr l))
+;		(not (eq 'blank-c (caadr l))))
+;      (setq l (cdr l)))
+;    ;; Delete entries after
+;    (setcdr l nil)
+;    (when entries			; now add the entries
+;      (setcdr l
+;	      (cons
+;	       '(blank-c "")		; a blank line before custom entries
+;	       (loop for i from 0 as e in entries
+;		     collect (cons (intern (concat "custom" i)) e)))))
+;    ;; add keymap name to keymap
+;    (setcdr (last keymap) last)))
+
+
+
+
+
+
+;;;; Insert with properties
+
+(defvar sgml-write-protect-intagible
+  (not (boundp 'emacs-minor-version)))
+
+(defun sgml-insert (props format &rest args)
+  (let ((start (point)))
+    (insert (apply (function format)
+		   format
+		   args))
+    (when (and sgml-write-protect-intagible
+	       (getf props 'intangible))
+	  (setf (getf props 'read-only) t))
+    (add-text-properties start (point) props)))
+
+
+;;;; Set face of markup
+
+(defun sgml-set-face-for (start end type)
+  (let ((current (overlays-at start))
+	(face (cdr (assq type sgml-markup-faces)))
+	(pos start)
+	o)
+    (while current
+      (cond ((and (null o)
+		  (eq type (overlay-get (car current) 'sgml-type)))
+	     (setq o (car current)))
+	    ((overlay-get (car current) 'sgml-type)
+	     (delete-overlay (car current))))
+      (setq current (cdr current)))
+    (while (< (setq pos (next-overlay-change pos))
+	      end)
+      (setq current (overlays-at pos))
+      (while current
+	(when (overlay-get (car current) 'sgml-type)
+	  (delete-overlay (car current)))
+	(setq current (cdr current))))
+    (cond (o
+	   (move-overlay o start end)
+	   (if (null (overlay-get o 'face))
+	       (overlay-put o 'face face)))
+	  (face
+	   (setq o (make-overlay start end))
+	   (overlay-put o 'sgml-type type)
+	   (overlay-put o 'face face)))))
+
+(defun sgml-set-face-after-change (start end &optional pre-len)
+  (when sgml-set-face
+    (loop for o in (overlays-at start)
+	  do (cond
+	      ((not (overlay-get o 'sgml-type)))
+	      ((= start (overlay-start o))
+	       (move-overlay o end (overlay-end o)))))))
+
+(defalias 'next-overlay-at 'next-overlay-change) ; fix bug in cl.el
+
+(defun sgml-clear-faces ()
+  (interactive)
+  (loop for o being the overlays
+	if (overlay-get o 'sgml-type)
+	do (delete-overlay o)))
+
+
+;;;; Provide
+
+(provide 'psgml-other)
+
+;;; psgml-other.el ends here