;;; mumamo-aspnet.el --- Support for ASP .Net in `mumamo-mode'. ;; ;;;;; John: Please change here to what you want: ;; Author: John J Foerch (jjfoerch A earthlink O net) ;; Maintainer: ;; Created: ?? ;; Version: == ;; Last-Updated: Wed Dec 12 21:55:11 2007 (3600 +0100) ;; URL: http://OurComments.org/Emacs/Emacs.html ;; Keywords: ;; Compatibility: ;; ;; Features that might be required by this library: ;; ;; None ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; 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 3, 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, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; ;; Support for ASP .Net in `mumamo-mode'. If you want to use VB then ;; you have to get the vb mode that this is written for here: ;; ;; http://www.emacswiki.org/cgi-bin/wiki/VbDotNetMode ;; ;; A C# mode is already included in nXhtml. That is the one that this ;; library has been tested with. ;; ;; ;;; Usage: ;; ;; Put this file in you Emacs `load-path' and add in your .emacs: ;; ;; (eval-after-load 'mumamo ;; (require 'mumamo-aspnet) ;; (mumamo-aspnet-add-me)) ;; ;; A file with the extension .aspx will no be opened with nxhtml-mode ;; as the main major mode and with chunks in csharp-mode etc. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (eval-when-compile (require 'mumamo)) ;;; ;; (defun mumamo-aspnet-add-me() ;; "Make mumamo aware of the ASP.Net extension." ;; (add-to-list 'mumamo-chunk-family-list ;; '("ASP.Net nXhtml Family" nxhtml-mode ;; (mumamo-chunk-aspnet ;; mumamo-chunk-aspnet-script ;; mumamo-chunk-inlined-style ;; mumamo-chunk-inlined-script ;; mumamo-chunk-style= ;; mumamo-chunk-onjs= ;; )) ;; t) ;; (add-to-list 'mumamo-chunk-family-list ;; '("ASP.Net XHTML Family" html-mode ;; (mumamo-chunk-aspnet ;; mumamo-chunk-aspnet-script ;; mumamo-chunk-inlined-style ;; mumamo-chunk-inlined-script ;; mumamo-chunk-style= ;; mumamo-chunk-onjs= ;; )) ;; t) ;; (add-to-list 'mumamo-filenames-list ;; '("\\.aspx\\'" "ASP.Net nXhtml Family")) ;; ;; Make it SET for current session in Custom. ;; (customize-set-variable 'mumamo-filenames-list mumamo-filenames-list) ;; (customize-set-value 'mumamo-filenames-list mumamo-filenames-list) ;; ;; this is how to set up mode aliases, should we need them. ;; (add-to-list 'mumamo-major-modes '(csharp-mode csharp-mode)) ;; (add-to-list 'mumamo-major-modes '(vbnet-mode vbnet-mode)) ;; ;; Make it SET for current session in Custom. ;; (customize-set-variable 'mumamo-major-modes mumamo-major-modes) ;; (customize-set-value 'mumamo-major-modes mumamo-major-modes) ;; ) ;;; aspnet (defvar mumamo-aspnet-page-language-mode-spec nil "A mumamo mode-spec for the default language of an ASP.Net page. This is what is set with the directive `@ Page Language' on the page. Internal variable.") (make-variable-buffer-local 'mumamo-aspnet-page-language-mode-spec) ;;(add-to-list 'mumamo-survive 'mumamo-aspnet-page-language-mode-spec) (put 'mumamo-aspnet-page-language-mode-spec 'permanent-local t) (defconst mumamo-aspnet-language-regex (rx (0+ (not (any ">"))) word-start "language" (0+ space) "=" (0+ space) ?\" (submatch (0+ (not (any ?\" ?>)))) ?\" )) (defun mumamo-aspnet-get-page-language-mode-spec () (or mumamo-aspnet-page-language-mode-spec (save-excursion (goto-char (point-min)) (when (search-forward "<%@ Page") (let ((case-fold-search t)) (when (looking-at mumamo-aspnet-language-regex) (mumamo-aspnet-mode-spec-for-language (match-string 1)))))) 'fundamental-mode)) (defun mumamo-aspnet-get-mode-for-chunk (&optional chunk-type) (cond ((eq chunk-type 'script) (mumamo-get-major-mode-substitute (or (if (looking-at mumamo-aspnet-language-regex) (mumamo-aspnet-mode-spec-for-language (match-string 1)) (mumamo-aspnet-get-page-language-mode-spec)) 'fundamental-mode) 'fontification)) ((eq chunk-type 'directive) 'fundamental-mode) ;;(t (mumamo-mode-from-modespec (t (mumamo-get-major-mode-substitute (mumamo-aspnet-get-page-language-mode-spec) 'fontification )))) (defun mumamo-chunk-aspnet(pos min max) "Find <% ... %>." (mumamo-find-possible-chunk pos min max 'mumamo-search-bw-exc-start-aspnet 'mumamo-search-bw-exc-end-jsp 'mumamo-search-fw-exc-start-jsp 'mumamo-search-fw-exc-end-jsp)) (defun mumamo-search-bw-exc-start-aspnet(pos min) ;;(let ((exc-start (mumamo-search-bw-exc-start-str pos min "<%"))) (let ((exc-start (mumamo-chunk-start-bw-str pos min "<%"))) (when (and exc-start (<= exc-start pos)) (cons exc-start (mumamo-aspnet-get-mode-for-chunk (if (eq (char-after exc-start) ?@) 'directive)))))) (defconst mumamo-aspnet-script-tag-start-regex (rx ""))) word-start "runat" (0+ space) "=" (0+ space) ?\" "server" ?\" (0+ (not (any ">"))) ">" )) (defun mumamo-aspnet-mode-spec-for-language (language) (let ((language (downcase language))) (cond ((equal language "c#") 'csharp-mode) ((equal language "vb") 'vbnet-mode) (t 'fundamental-mode)))) (defun mumamo-search-bw-exc-start-aspnet-script(pos min) (goto-char (+ pos 7)) (let ((marker-start (search-backward "...." (mumamo-find-possible-chunk pos min max 'mumamo-search-bw-exc-start-aspnet-script 'mumamo-search-bw-exc-end-inlined-script 'mumamo-search-fw-exc-start-aspnet-script 'mumamo-search-fw-exc-end-inlined-script)) ;; Fix-me: define a multi major mode for asp. Or maybe just drop this ;; file? (provide 'mumamo-aspnet) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; mumamo-aspnet.el ends here