;; Define an Emacs Mode for Webtester
;;
;; Features:
;;  - indentation support
;;  - syntax highlighting
;;
;; Documentations:
;;  - mode tutorial:
;;    https://www.emacswiki.org/emacs/ModeTutorial
;;  - faces for font lock:
;;    https://www.gnu.org/software/emacs/manual/html_node/elisp/Faces-for-Font-Lock.html

(defvar wt-mode-hook nil)

(defvar wt-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\C-j" 'newline-and-indent)
    map)
  "Newline and indent")

(add-to-list 'auto-mode-alist '("\\.wt\\'" . wt-mode))


;; get all keywords:
;;   echo $(webrunner -h | sed -n 's,  COMMAND: ,,p') | sed 's, ,\\\\|,g'
(defconst wt-font-lock-keywords
  (list
   '("^ *\\(auth\\|ca-certificate\\|call\\|case\\|default\\|check\\|clear-cookies\\|click\\|clicktype\\|client-certificate\\|do\\|download\\|echo\\|execute\\|exists\\|exit\\|expect\\|fail\\|for\\|function\\|if\\|else\\|while\\|ignore\\|unignore\\|ignoreto\\|include\\|label\\|load\\|not\\|offline-storage-path\\|open\\|screenshot\\|set\\|setvalue\\|sleep\\|testcase\\|testsuite\\|timeout\\|timeout-false\\|unset\\|upload\\)\\b" . font-lock-builtin-face)
   '("^ *#.*$" . font-lock-comment-face))
  "Highlighting expressions for Webtester")

(defvar wt-mode-syntax-table
  (let ((st (make-syntax-table)))
    st)
  "Syntax table for wt-mode")

(defun wt-mode ()
  "Major mode for editing Webtester test scripts"
  (interactive)
  (kill-all-local-variables)
  (set-syntax-table wt-mode-syntax-table)
  (use-local-map wt-mode-map)
  (set (make-local-variable 'font-lock-defaults) '(wt-font-lock-keywords))
  (setq major-mode 'wt-mode)
  (setq mode-name "Webtester")
  (run-hooks 'wpdl-mode-hook))

(provide 'wt-mode)
