sailfish-mode.el raw

;;;; Place this file in one of the directories on your emacs load-path

;;;; In .emacs, if you use use-package:
;; (use-package sailfish-mode
;;   :mode
;;   ("\\.stpl\\'" . poly-sailfish-fundamental-mode)
;;   ("\\.stpl\\.rs\\'" . poly-sailfish-rust-mode)
;;   ("\\.stpl\\.html\\'" . poly-sailfish-html-mode))

;;;; If you have LSP mode set up to run automatically in
;;;; prog-mode-hook or the like, you might want to make it
;;;; conditional:
;; (if (and buffer-file-name
;;          (not (string-match "\\.stpl\\(\\.\\|\\'\\)" buffer-file-name)))
;;     (lsp))

(require 'polymode-core)
(require 'polymode-base)

(define-hostmode poly-sailfish-rust-hostmode
  :mode 'rust-mode)

(define-innermode poly-sailfish-rust-innermode
  :mode 'rust-mode
  :head-matcher "<%[=+-]?"
  :tail-matcher "%>")

(define-innermode poly-sailfish-comment-innermode
  :mode 'fundamental-mode
  :head-matcher "<%#"
  :tail-matcher "%>")

(define-innermode poly-sailfish-js-innermode
  :mode 'javascript-mode
  :head-matcher "<script>"
  :tail-matcher "</script>"
  :head-mode 'host
  :tail-mode 'host)

(define-innermode poly-sailfish-css-innermode
  :mode 'css-mode
  :head-matcher "<style>"
  :tail-matcher "</style>"
  :head-mode 'host
  :tail-mode 'host)

(define-polymode poly-sailfish-html-mode
  :hostmode 'poly-html-hostmode
  :innermodes '(poly-sailfish-rust-innermode poly-sailfish-comment-innermode poly-sailfish-js-innermode poly-sailfish-css-innermode))

(define-polymode poly-sailfish-rust-mode
  :hostmode 'poly-sailfish-rust-hostmode
  :innermodes '(poly-sailfish-rust-innermode poly-sailfish-comment-innermode))

(define-polymode poly-sailfish-fundamental-mode
  :hostmode 'poly-fundamental-hostmode
  :innermodes '(poly-sailfish-rust-innermode poly-sailfish-comment-innermode))

(add-to-list 'auto-mode-alist '("\\.html\\.stpl\\'" . poly-sailfish-html-mode))
(add-to-list 'auto-mode-alist '("\\.stpl\\.html\\'" . poly-sailfish-html-mode))
(add-to-list 'auto-mode-alist '("\\.rs\\.stpl\\'" . poly-sailfish-rust-mode))
(add-to-list 'auto-mode-alist '("\\.stpl\\.rs\\'" . poly-sailfish-rust-mode))
(add-to-list 'auto-mode-alist '("\\.stpl\\'" . poly-sailfish-fundamental-mode))

(add-to-list 'auto-mode-alist '("\\.html\\.st\\'" . poly-sailfish-html-mode))
(add-to-list 'auto-mode-alist '("\\.html\\.st\\'" . poly-sailfish-html-mode))
(add-to-list 'auto-mode-alist '("\\.st\\.rs\\'" . poly-sailfish-rust-mode))
(add-to-list 'auto-mode-alist '("\\.st\\.rs\\'" . poly-sailfish-rust-mode))
(add-to-list 'auto-mode-alist '("\\.st\\'" . poly-sailfish-fundamental-mode))