204 lines
7.1 KiB
EmacsLisp
204 lines
7.1 KiB
EmacsLisp
|
;;; django.el ---
|
||
|
;;
|
||
|
;; Author: Lennart Borgman (lennart O borgman A gmail O com)
|
||
|
;; Created: Sun Nov 18 18:29:41 2007
|
||
|
;; Version: 0.3
|
||
|
;; Last-Updated: 2008-08-08T13:22:19+0200 Fri
|
||
|
;; URL:
|
||
|
;; Keywords:
|
||
|
;; Compatibility:
|
||
|
;;
|
||
|
;; Features that might be required by this library:
|
||
|
;;
|
||
|
;; None
|
||
|
;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;
|
||
|
;;; Commentary:
|
||
|
;;
|
||
|
;; Simple highlighting for Django for use with mumamo.
|
||
|
;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;
|
||
|
;;; Change log:
|
||
|
;;
|
||
|
;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;
|
||
|
;; 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, 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; see the file COPYING. If not, write to
|
||
|
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||
|
;; Floor, Boston, MA 02110-1301, USA.
|
||
|
;;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;
|
||
|
;;; Code:
|
||
|
|
||
|
;; Maybe there are something to get here?
|
||
|
;; http://github.com/cosmin/emacs-utils/tree/85cc1d2bd447cb9b2fc98e27b5f8780453e5b978/django-html-mode.el
|
||
|
|
||
|
(defconst django-indenting-keywords
|
||
|
'("block" "comment" "else"
|
||
|
"filter" "for" "if" "ifchanged" "ifequal"
|
||
|
"ifnotequal" "spaceless" "with"))
|
||
|
|
||
|
;; (append '(or) django-indenting-keywords)
|
||
|
(defconst django-font-lock-keywords
|
||
|
(list
|
||
|
(cons (rx-to-string
|
||
|
`(and
|
||
|
word-start
|
||
|
(or "as" "autoescape" "csrf_token" "cycle" "debug" "extends"
|
||
|
"firstof" "in" "include" "load" "now" "regroup" "ssi"
|
||
|
"templatetag" "url" "widthratio"
|
||
|
(seq
|
||
|
(opt "end")
|
||
|
;; (or "autoescape" "block" "comment" "cycle" "debug" "else"
|
||
|
;; "extends" "filter" "firstof" "for" "if" "ifchanged" "ifequal"
|
||
|
;; "ifnotequal" "include" "load" "now" "regroup"
|
||
|
;; "spaceless" "ssi" "templatetag" "url" "widthratio"
|
||
|
;; "with")
|
||
|
,(append '(or) django-indenting-keywords)
|
||
|
))
|
||
|
word-end))
|
||
|
font-lock-keyword-face)
|
||
|
)
|
||
|
"Minimal highlighting expressions for Django mode")
|
||
|
|
||
|
(defcustom django-indent-width 2
|
||
|
"Indentation width for Django."
|
||
|
:type 'integer
|
||
|
:group 'django)
|
||
|
|
||
|
(defun django-indent-line ()
|
||
|
"Indent current line as Django code.
|
||
|
Indent like the examples on URL
|
||
|
`http://docs.djangoproject.com/en/1.1/ref/templates/builtins/'."
|
||
|
(save-match-data
|
||
|
(let* ((indent-re (rx-to-string `(and word-start
|
||
|
,(append '(or "else") django-indenting-keywords))))
|
||
|
(deindent-re (rx-to-string `(and word-start
|
||
|
(or "else"
|
||
|
(seq
|
||
|
"end"
|
||
|
,(append '(or) django-indenting-keywords))))))
|
||
|
(here (point-marker))
|
||
|
(this-indentation (current-indentation))
|
||
|
(this-line-start (progn (beginning-of-line) (point)))
|
||
|
(prev-line-start (progn (skip-chars-backward " \t\n\r\f")
|
||
|
(beginning-of-line)
|
||
|
(when (< (point) this-line-start)
|
||
|
(point))))
|
||
|
(prev-indentation (if prev-line-start (current-indentation) 0))
|
||
|
(shift-in (if (and prev-line-start
|
||
|
(re-search-forward indent-re (point-at-eol) t))
|
||
|
django-indent-width 0))
|
||
|
(shift-out (progn
|
||
|
(goto-char this-line-start)
|
||
|
(if (re-search-forward deindent-re (point-at-eol) t)
|
||
|
(- django-indent-width) 0)))
|
||
|
(new-indentation (max 0 (+ prev-indentation shift-in shift-out)))
|
||
|
)
|
||
|
(goto-char this-line-start)
|
||
|
(cond
|
||
|
((> new-indentation this-indentation)
|
||
|
(skip-chars-forward " \t")
|
||
|
(indent-to new-indentation))
|
||
|
((< new-indentation this-indentation)
|
||
|
(back-to-indentation)
|
||
|
(delete-region this-line-start (point))
|
||
|
(indent-to new-indentation)))
|
||
|
(goto-char here))))
|
||
|
|
||
|
;;;###autoload
|
||
|
(define-derived-mode django-mode nil "Django"
|
||
|
"Simple Django mode for use with mumamo.
|
||
|
This mode only provides syntax highlighting."
|
||
|
(set (make-local-variable 'indent-line-function) 'django-indent-line)
|
||
|
(setq font-lock-defaults '(django-font-lock-keywords)))
|
||
|
|
||
|
;;; Comments mode
|
||
|
;; (defconst django-comment-font-lock-keywords
|
||
|
;; (list
|
||
|
;; (cons "\\(.*\\)" (list 1 font-lock-comment-face))
|
||
|
;; ))
|
||
|
|
||
|
;; (defvar django-comment-font-lock-defaults
|
||
|
;; '(django-comment-font-lock-keywords t t))
|
||
|
|
||
|
;; (define-derived-mode django-comment-mode nil "Django comment"
|
||
|
;; "For django comment blocks."
|
||
|
;; (set (make-local-variable 'font-lock-defaults) django-comment-font-lock-defaults))
|
||
|
|
||
|
;;; Variables mode
|
||
|
|
||
|
(defconst django-variable-font-lock-keywords
|
||
|
(list
|
||
|
;; Built in filters:
|
||
|
(cons (rx
|
||
|
"|"
|
||
|
(submatch
|
||
|
(or "add" "addslashes" "capfirst" "center" "cut"
|
||
|
"date" "default" "default_if_none"
|
||
|
"dictsort" "dictsortreversed"
|
||
|
"divisibleby"
|
||
|
"escape"
|
||
|
"filesizeformat"
|
||
|
"first"
|
||
|
"fixampersands"
|
||
|
"floatformat"
|
||
|
"force_escape"
|
||
|
"iriencode"
|
||
|
"join"
|
||
|
"length" "length_is"
|
||
|
"linebreaks" "linebreaksbr" "linenumbers"
|
||
|
"ljust"
|
||
|
"lower"
|
||
|
"make_list"
|
||
|
"phone2numeric"
|
||
|
"pluralize"
|
||
|
"pprint"
|
||
|
"random"
|
||
|
"removetags"
|
||
|
"rjust"
|
||
|
"safe" "slice" "slugify" "stringformat" "striptags"
|
||
|
"time" "timesince" "timeuntil"
|
||
|
"title" "truncatewords" "truncatewords_html"
|
||
|
"unordered_list"
|
||
|
"upper" "urlencode" "urlize" "urlizetrunc"
|
||
|
"wordcount" "wordwrap" "yesno")))
|
||
|
(list 1 font-lock-builtin-face))
|
||
|
(cons (rx
|
||
|
"|"
|
||
|
(submatch
|
||
|
(0+ (any "a-z"))))
|
||
|
(list 1 font-lock-function-name-face))
|
||
|
(cons "\\([^|]*\\)" (list 1 font-lock-variable-name-face))
|
||
|
))
|
||
|
|
||
|
(defvar django-variable-font-lock-defaults
|
||
|
'(django-variable-font-lock-keywords
|
||
|
t t
|
||
|
;; This still gives teh syntax symbol to |, why?
|
||
|
((?| . ". "))
|
||
|
))
|
||
|
|
||
|
(define-derived-mode django-variable-mode nil "Django variable"
|
||
|
"For django comment blocks."
|
||
|
;;(modify-syntax-entry ?| ?.)
|
||
|
(set (make-local-variable 'font-lock-defaults) django-variable-font-lock-defaults))
|
||
|
|
||
|
(provide 'django)
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;;; django.el ends here
|