))
table))
+(defun domtool-syms-re (&rest syms)
+ (concat "\\<" (regexp-opt syms t) "\\>"))
+
+(require 'domtool-tables)
+
(defvar domtool-font-lock-keywords
`(,(concat
"\\_<"
(regexp-opt '("let" "in" "begin" "end" "with" "where" "extern" "type"
- "val" "context" "Root"
- ;; Actions
- "vhost" "location" "directory" "domain" "dom"
- "webAt" "web")
+ "val" "context" "Root" "if" "then" "else")
t)
"\\_>")
+
+ (,domtool-actions-regexp . font-lock-builtin-face)
+ (,domtool-vals-regexp . font-lock-variable-name-face)
+ (,domtool-contexts-regexp . font-lock-constant-face)
+ (,domtool-env-vars-regexp . font-lock-constant-face)
+ (,domtool-types-regexp . font-lock-type-face)
+
("type[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1 font-lock-type-face)
("val[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1 font-lock-variable-name-face)))
(font-lock-syntactic-keywords
. domtool-font-lock-syntactic-keywords)
(font-lock-syntactic-face-function
- . domtool-font-lock-syntactic-face-function))))
+ . domtool-font-lock-syntactic-face-function)))
+ (set (make-local-variable 'comment-start-regexp) "(\\*\\|{{")
+ (set (make-local-variable 'comment-end-regexp) "\\*)\\|}}")
+ (set (make-local-variable 'comment-nested) t)
+
+ (set (make-local-variable 'compile-command)
+ (concat "domtool -tc " (file-relative-name buffer-file-name))))
(defun domtool-indent-line ()
(let ((savep (> (current-column) (current-indentation)))
(savep (save-excursion (indent-line-to indent)))
(t (indent-line-to indent)))))
+(defun until-closed-helper (level)
+ (if
+ (re-search-backward "\\_<\\(with\\|where\\|begin\\|end\\|let\\|val\\|type\\|if\\)\\_>"
+ nil t)
+ (cond
+ ((string= (match-string 0) "end")
+ (until-closed-helper (+ level 1)))
+ ((= level 0)
+ (current-indentation))
+ ((and
+ (string= (match-string 0) "with")
+ (save-excursion
+ (backward-char)
+ (looking-at "\\s-")))
+ (until-closed-helper level))
+ (t
+ (until-closed-helper (- level 1))))
+
+ 0))
+
+(defun until-closed ()
+ (save-excursion
+ (until-closed-helper 0)))
+
(defun domtool-calculate-indent ()
(save-excursion
(back-to-indentation)
(multiple-value-bind (previous-keyword base-indent)
(save-excursion
- (if (re-search-backward "\\_<\\(with\\|where\\|end\\)\\_>"
+ (if (re-search-backward "\\_<\\(with\\|where\\|begin\\|end\\|let\\|in\\|val\\|type\\|if\\)\\_>\\|}}\\|{{"
nil t)
(values (match-string 0) (current-indentation))
(values nil 0)))
'noindent)
((nth 4 state)
(domtool-calculate-comment-indent state))
- ((and (looking-at "\\_<end\\_>")
- (string= previous-keyword "end"))
- (- base-indent domtool-indent))
- ((looking-at "\\_<\\(with\\|end\\)\\_>")
- base-indent)
+ ((looking-at "{{\\|\\_<\\(extern\\|val\\|type\\|context\\)\\_>")
+ 0)
+ ((looking-at "\\_<\\(with\\|end\\|in\\|else\\)\\_>")
+ (until-closed))
((not previous-keyword)
base-indent)
((string= previous-keyword "end")
base-indent)
+ ((looking-at "\\_<\\(val\\|extern\\|context\\)\\_>")
+ base-indent)
(t
(+ base-indent domtool-indent)))))))
(incf depth)
(decf depth)))
(+ (current-indentation) depth)))))
+
+(provide 'domtool-mode)