The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
(defvar cs-font-lock-keywords
  (list
    '("<\\?cs[^\\?]*\\?>"  0 font-lock-keyword-face t)
   '("<\\?cs +\\(call\\|each\\|if\\|alt\\|var\\|include\\)" 1  font-lock-keyword-face t) 
   '("<\\?cs +\\(/each\\|/if\\|/alt\\|/var\\|/include\\)" 1  font-lock-keyword-face t) 

   ; variable names
   '("<\\?cs +var:\\([_0-9a-zA-Z\.]+\\)[^\\?]+\\?>" 1  font-lock-variable-name-face t) 
   '("<\\?cs +alt:\\([_0-9a-zA-Z\.]+\\)[^\\?]+\\?>" 1  font-lock-variable-name-face t) 
   '("<\\?cs +each:\\([_0-9a-zA-Z\.]+\\)[^\\?]+\\?>" 1  font-lock-variable-name-face t) 

   ; string
   '("<\\?cs[^\"\\?]+\\(\"[^\"]+\"\\)[^\\?]+\\?>"  1 font-lock-string-face t)

))
 
(defvar cs-mode-map ())

(if (not cs-mode-map)
    (progn
      (setq cs-mode-map (make-sparse-keymap))
      (define-key cs-mode-map "\C-c\C-i" 'cs-insert-tag)
      ))

(defun cs-mode nil
  "ClearSilver mode"

  (interactive)
  (setq major-mode 'cs-mode)
  (setq mode-name  "CS")
  (use-local-map cs-mode-map)

  (make-local-variable 'font-lock-defaults)
  (setq font-lock-defaults
       '((cs-font-lock-keywords) t))

  (setq font-lock-keywords cs-font-lock-keywords)

  (font-lock-mode 1)

  (run-hooks 'cs-mode-hook)

)

(defun cs-insert-tag ()
  (interactive)
  (insert "<?cs  ?>")
  (backward-char 3)
)