; Delmonta's HTML Helper Mode
; (c) IIJIMA 'Delmonta' Hiromitsu
;------------------------------------------------------------------------------
;$Id: ds-html.el,v 1.3 2005/07/22 05:59:38 delmonta Exp $
;------------------------------------------------------------------------------
;
;******************************************************************************
; 初期化部
;******************************************************************************
(if (not (assq 'delmonta-html-mode minor-mode-alist))
(setq minor-mode-alist
(cons '(delmonta-html-mode " DS-HTML") minor-mode-alist)
)
)
(defvar delmonta-html-mode nil)
;******************************************************************************
; キーマップの定義
;******************************************************************************
(defvar delmonta-html-mode-map (make-sparse-keymap))
(define-key delmonta-html-mode-map "1" '(lambda () (interactive) (delmonta-html-insert-tag "h1")))
(define-key delmonta-html-mode-map "2" '(lambda () (interactive) (delmonta-html-insert-tag "h2")))
(define-key delmonta-html-mode-map "3" '(lambda () (interactive) (delmonta-html-insert-tag "h3")))
(define-key delmonta-html-mode-map "4" '(lambda () (interactive) (delmonta-html-insert-tag "h4")))
(define-key delmonta-html-mode-map "5" '(lambda () (interactive) (delmonta-html-insert-tag "h5")))
(define-key delmonta-html-mode-map "6" '(lambda () (interactive) (delmonta-html-insert-tag "h6")))
(define-key delmonta-html-mode-map "a" '(lambda () (interactive) (delmonta-html-insert-tag "a" "href=\"\" name=\"\"")))
(define-key delmonta-html-mode-map "A" 'delmonta-html-selection-to-anchor)
(define-key delmonta-html-mode-map "b" '(lambda () (interactive) (delmonta-html-insert-tag "b")))
(define-key delmonta-html-mode-map "B" '(lambda () (interactive) (delmonta-html-insert-tag "blockquote" "class=")))
(define-key delmonta-html-mode-map "c" '(lambda () (interactive) (delmonta-html-insert-tag "code")))
(define-key delmonta-html-mode-map "d" '(lambda () (interactive) (delmonta-html-insert-tag "div" "align=")))
(define-key delmonta-html-mode-map "e" '(lambda () (interactive) (delmonta-html-insert-tag "em")))
(define-key delmonta-html-mode-map "C" '(lambda () (interactive) (delmonta-html-insert-tag "center")))
(define-key delmonta-html-mode-map "e" '(lambda () (interactive) (delmonta-html-insert-tag "em")))
(define-key delmonta-html-mode-map "f" '(lambda () (interactive) (delmonta-html-insert-tag "font" "color=\"\"")))
(define-key delmonta-html-mode-map "i" '(lambda () (interactive) (delmonta-html-insert-tag "i")))
(define-key delmonta-html-mode-map "k" '(lambda () (interactive) (delmonta-html-insert-tag "kbd")))
(define-key delmonta-html-mode-map "n" '(lambda () (interactive) (delmonta-html-insert-tag "nobr")))
(define-key delmonta-html-mode-map "p" '(lambda () (interactive) (delmonta-html-insert-tag "pre")))
(define-key delmonta-html-mode-map "P" '(lambda () (interactive) (delmonta-html-insert-tag "p")))
(define-key delmonta-html-mode-map "R" '(lambda () (interactive) (delmonta-html-insert-tag "ruby")))
(define-key delmonta-html-mode-map "s" '(lambda () (interactive) (delmonta-html-insert-tag "strong")))
(define-key delmonta-html-mode-map "t" '(lambda () (interactive) (delmonta-html-insert-tag "tt")))
(define-key delmonta-html-mode-map "T" '(lambda () (interactive) (delmonta-html-insert-tag "table" "border=1 cellspacing=0 cellpadding=3")))
(define-key delmonta-html-mode-map "u" '(lambda () (interactive) (delmonta-html-insert-tag "u")))
(define-key delmonta-html-mode-map "x" '(lambda () (interactive) (delmonta-html-insert-tag "s")))
(define-key delmonta-html-mode-map "^" '(lambda () (interactive) (delmonta-html-insert-tag "sup")))
(define-key delmonta-html-mode-map "_" '(lambda () (interactive) (delmonta-html-insert-tag "sub")))
(define-key delmonta-html-mode-map "+" '(lambda () (interactive) (delmonta-html-insert-tag "big")))
(define-key delmonta-html-mode-map "-" '(lambda () (interactive) (delmonta-html-insert-tag "small")))
(define-key delmonta-html-mode-map "<" '(lambda () (interactive) (insert "")))
(define-key delmonta-html-mode-map "/" '(lambda () (interactive) (insert "
")))
(define-key delmonta-html-mode-map "w" '(lambda () (interactive) (insert "")))
(define-key delmonta-html-mode-map "M" 'delmonta-html-insert-matrix)
(define-key delmonta-html-mode-map "q" '(lambda () (interactive) (delmonta-html-insert-tag nil)))
(define-key delmonta-html-mode-map "&" 'delmonta-html-quote-metacharacter)
(if (not (assq 'delmonta-html-mode minor-mode-map-alist))
(setq minor-mode-map-alist
(cons
(cons 'delmonta-html-mode delmonta-html-mode-map)
minor-mode-map-alist
)
)
)
;******************************************************************************
; 起動・終了関数群
;******************************************************************************
(defun delmonta-html-mode (&optional arg)
"でるもんたの HTML 補助モード。\nキーを押すとそれに対応するタグ(または、閉じタグ)が挿入されます。"
(interactive "P")
(if (null arg)
(if delmonta-html-mode
(exit-delmonta-html-mode)
(enter-delmonta-html-mode)
)
; else
(if (> (prefix-numeric-value arg) 0)
(exit-delmonta-html-mode)
(enter-delmonta-html-mode)
)
)
)
(defun enter-delmonta-html-mode ()
(interactive)
(if (not delmonta-html-mode)
(progn
(setq delmonta-html-mode t)
(if (fboundp 'update-mode-lines) (update-mode-lines))
(setq delmonta-html-tag-stack nil)
))
)
(defun exit-delmonta-html-mode ()
(interactive)
(if delmonta-html-mode
(progn
(setq delmonta-html-mode nil)
(if (fboundp 'update-mode-lines) (update-mode-lines))
(setq delmonta-html-tag-stack nil)
))
)
;******************************************************************************
; 実体関数
;******************************************************************************
(defvar delmonta-html-tag-stack nil)
(defun delmonta-html-insert-tag (sTag &optional sArg)
(interactive "sTag to insert:")
(if (null sTag)
(progn
(setq delmonta-html-tag-stack nil)
(message "Tag Stack を空にしました")
) ;THEN ends here ; begins ELSE
(let (sLastTag)
(setq sLastTag (car delmonta-html-tag-stack))
(if (string-equal sLastTag sTag)
(progn
(insert "" sTag ">")
(setq delmonta-html-tag-stack
(cdr delmonta-html-tag-stack)
)
) ; THEN ends here ; begins ELSE
(insert "<" sTag)
(if sArg (insert " " sArg))
(insert ">")
(setq delmonta-html-tag-stack
(cons sTag delmonta-html-tag-stack)
)
)
)
)
)
(defun delmonta-html-insert-matrix (nSize)
(interactive "n行列の行数は:")
(insert
"\t\n"
"\t\n"
"\t\t| * = | \n"
"\t\t( | \n"
"\t\t\t | \n"
"\t\t\t | \n"
"\t\t) | \n"
"\t\t + | \n"
"\t
\n"
"\t\t | \n"
"\t\t | \n"
)
)
(defun delmonta-html-quote-metacharacter (&optional c)
(interactive)
(if (not c)
(setq c (following-char))
)
(cond
((= c ?&) (delete-char 1) (insert "&"))
((= c ?<) (delete-char 1) (insert "<"))
((= c ?>) (delete-char 1) (insert ">"))
(t (message "%c need not be quoted." c) (forward-char))
)
)
(defun delmonta-html-selection-to-anchor ()
(interactive)
(let (s)
(setq s (buffer-substring (point) (mark)))
(delete-region (point) (mark))
(insert "" s "")
)
)