;; rhtml-minor-mode.el -- Minor mode for Ruby .rhtml files that ;; attempts to link templates (views/$controller/foo.rhtml) to their ;; 'parent' (views/layouts/$controller.rhtml) ;; Copyright 2006 David N. Welton ;; Licensed under the Apache License, Version 2.0 (the "License"); ;; you may not use this file except in compliance with the License. ;; You may obtain a copy of the License at ;; http://www.apache.org/licenses/LICENSE-2.0 ;; Unless required by applicable law or agreed to in writing, software ;; distributed under the License is distributed on an "AS IS" BASIS, ;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;; See the License for the specific language governing permissions and ;; limitations under the License. ;; Usage -- ;; I use some code like the following in my .emacs file to load up ;; both rhtml-minor-mode and two-mode-mode (which needs to be loaded ;; first, as it loads up the major modes. ;; (defun rhtml-modes () ;; (two-mode-mode) ;; (rhtml-minor-mode)) ;; (setq auto-mode-alist ;; (cons '("\\.rhtml$" . rhtml-modes) ;; auto-mode-alist)) ;; Recent versions of this file can be found at: ;; http://www.dedasys.com/freesoftware/files/rhtml-minor-mode.el ;; TODO: ;; * It would be nice to look inside the layout template to see ;; exactly what element we are being called from. ;; ;; * We should probably not even attempt this lookup for ;; _partial.rhtml files. (defvar rhtml-mode-bool nil) (defun rhtml-setup (filename) (setq minor-mode-alist (cons '(rhtml-mode-bool " rhtml") minor-mode-alist)) ;; Rumor has it that emacs translates the / as appropriate for the ;; operating system. (let* ((dirlist (split-string filename "/")) ;; second to last component (parentdir (car (last dirlist 2)))) ;; if it's the layouts .rhtml file, we don't need to do anything ;; else. (when (not (string= parentdir "layouts")) (let ((layout (append (butlast dirlist 2) '("layouts") (list (concat parentdir ".rhtml"))))) ;; put it all back together again, and assume that the layout file contains (setq sgml-parent-document (list (concat "/" (mapconcat 'identity layout "/")) "html" "body" (list))))))) (defun rhtml-minor-mode () "Minor mode for .rhtml files" (interactive) (make-local-variable 'minor-mode-alist) (make-local-variable 'rhtml-mode-bool) (setq rhtml-mode-bool t) (if (eq nil buffer-file-name) (progn (message "rhtml mode only works when associated with a file")) (rhtml-setup buffer-file-name))) (provide 'rhtml-minor-mode)