branch: elpa/typst-ts-mode
commit 755615407a2da40ee486876484e19c99a7723ac0
Author: Meow King <mr.meowk...@anche.no>
Commit: Meow King <mr.meowk...@anche.no>

    feat: add more predefined embedding language settings
---
 justfile                            |   1 +
 typst-ts-embedding-lang-settings.el | 179 +++++++++++++++++++++++++-----------
 typst-ts-mode.el                    |   9 +-
 3 files changed, 131 insertions(+), 58 deletions(-)

diff --git a/justfile b/justfile
index 16cd0d90d2..637dff6d97 100644
--- a/justfile
+++ b/justfile
@@ -1,4 +1,5 @@
 els-settings-test:
     emacs --batch -l ./typst-ts-embedding-lang-settings.el \
     -l ~/.emacs.d/.local/elpaca/repos/emacs-kotlin-ts-mode/kotlin-ts-mode.el \
+    -l ~/.emacs.d/.local/elpaca/repos/mermaid-ts-mode/mermaid-ts-mode.el \
     --eval "(typst-ts-embedding-lang-settings-test)"
diff --git a/typst-ts-embedding-lang-settings.el 
b/typst-ts-embedding-lang-settings.el
index 3a1097c8b2..b69d2ff3e1 100644
--- a/typst-ts-embedding-lang-settings.el
+++ b/typst-ts-embedding-lang-settings.el
@@ -37,9 +37,10 @@ error occurs."
   :type 'boolean
   :group 'typst-ts)
 
-(defcustom typst-ts-highlight-raw-block-langs-not-in-settings nil
+(defcustom typst-ts-highlight-raw-block-langs-not-in-predefined-settings t
   "Whether to highlight raw block of language that is not in settings.
-The cost for setting up these languages is usually higher than those
+i.e. not in `typst-ts-embedding-lang-settings'.
+The cost for setting up other languages is usually higher than those
 languages in settings."
   :type 'boolean
   :group 'typst-ts)
@@ -468,15 +469,15 @@ languages in settings."
                   ( keyword string type directives)
                   ( constant escape-sequence expression literal property)
                   ( function bracket delimiter error))))
-    (clojure . (:feature
-                cmake-ts-mode
-                :font-lock cmake-ts-mode--font-lock-settings
-                :indentation cmake-ts-mode--indent-rules
-                :ts-feature-list
-                '((comment)
-                  (keyword string)
-                  (builtin constant escape-sequence function number variable)
-                  (bracket error misc-punctuation))))
+    (cmake . (:feature
+              cmake-ts-mode
+              :font-lock cmake-ts-mode--font-lock-settings
+              :indentation cmake-ts-mode--indent-rules
+              :ts-feature-list
+              '((comment)
+                (keyword string)
+                (builtin constant escape-sequence function number variable)
+                (bracket error misc-punctuation))))
     (cpp . (:feature
             c-ts-mode
             :font-lock (c-ts-mode--font-lock-settings 'cpp)
@@ -574,6 +575,16 @@ languages in settings."
                '((comment number string definition)
                  (keyword builtin type constant variable)
                  (escape-sequence function property))))
+    (lua . (:feature
+            lua-ts-mode
+            :font-lock lua-ts--font-lock-settings
+            :indentation lua-ts--simple-indent-rules
+            :ts-feature-list
+            '((comment definition)
+              (keyword string)
+              (assignment builtin constant number)
+              (bracket delimiter escape function
+                       operator property punctuation variable))))
     (python . (:feature
                python
                :font-lock python--treesit-settings
@@ -584,6 +595,18 @@ languages in settings."
                  ( assignment builtin constant decorator
                    escape-sequence number string-interpolation )
                  ( bracket delimiter function operator variable property ))))
+    (ruby . (:feature
+             ruby-ts-mode
+             :font-lock (ruby-ts--font-lock-settings 'ruby)
+             :indentation (ruby-ts--indent-rules)
+             :ts-feature-list
+             '(( comment method-definition parameter-definition)
+               ( keyword regexp string type)
+               ( builtin-variable builtin-constant builtin-function
+                 delimiter escape-sequence
+                 constant global instance
+                 interpolation literal symbol assignment)
+               ( bracket error function operator punctuation))))
     (rust . (:feature
              rust-ts-mode
              :font-lock rust-ts-mode--font-lock-settings
@@ -593,18 +616,61 @@ languages in settings."
                ( keyword string)
                ( assignment attribute builtin constant escape-sequence
                  number type)
-               ( bracket delimiter error function operator property 
variable)))))
+               ( bracket delimiter error function operator property 
variable))))
+    (toml . (:feature
+             toml-ts-mode
+             :font-lock toml-ts-mode--font-lock-settings
+             :indentation toml-ts-mode--indent-rules
+             :ts-feature-list
+             '((comment)
+               (constant number pair string)
+               (escape-sequence)
+               (delimiter error))))
+    (tsx . (:feature
+            typescript-ts-mode
+            :font-lock (typescript-ts-mode--font-lock-settings 'tsx)
+            :indentation (typescript-ts-mode--indent-rules 'tsx)
+            :ts-feature-list
+            '((comment declaration)
+              (keyword string escape-sequence)
+              (constant expression identifier jsx number pattern property)
+              (function bracket delimiter))))
+    (typescript . (:feature
+                   typescript-ts-mode
+                   :font-lock (typescript-ts-mode--font-lock-settings 
'typescript)
+                   :indentation (typescript-ts-mode--indent-rules 'typescript)
+                   :ts-feature-list
+                   '((comment declaration)
+                     (keyword string escape-sequence)
+                     (constant expression identifier number pattern property)
+                     (operator function bracket delimiter))))
+    (yaml . (:feature
+             yaml-ts-mode
+             :font-lock yaml-ts-mode--font-lock-settings
+             :indentation nil
+             :ts-feature-list
+             '((comment)
+               (string type)
+               (constant escape-sequence number property)
+               (bracket delimiter error misc-punctuation))))
+    (mermaid . (:feature
+                mermaid-ts-mode
+                :font-lock mermaid-ts--treesit-font-lock-rules
+                :indentation mermaid-ts--indent-rules
+                :ts-feature-list
+                '((comments)
+                  (constants keywords text links)
+                  (nodes)))))
   "Settings for raw block languages.")
 
 
-;; from vimscript-ts-mode (https://github.com/nverno/vimscript-ts-mode)
 (defun typst-ts-els--merge-features (a b)
   "Merge `treesit-font-lock-feature-list's A with B."
   (when (not (and a b))
     (error "One of the treesit font lock feature list is nil when merge!"))
-  (cl-loop for x in a
-           for y in b
-           collect (seq-uniq (append x y))))
+  (cl-loop for i to 3  ; [0, 3]
+           collect
+           (seq-uniq (append (nth i a) (nth i b)))))
 
 ;; hugely insprired by vimscript-ts-mode 
(https://github.com/nverno/vimscript-ts-mode)
 (defun typst-ts-els-merge-settings (settings)
@@ -728,41 +794,46 @@ Use this function as one notifier of 
`treesit-parser-notifiers'."
                   ;; note: the `treesit-range-settings' for languages in
                   ;; predefined settings are already settled at mode start
                   (typst-ts-els-merge-lang-settings lang)
+                  ;; some feature like cmake-ts-mode will create a parser when
+                  ;; the feature is required, so we need to clean thease 
parsers
+                  (mapc #'treesit-parser-delete (treesit-parser-list nil lang))
                   (message "Load %s language settings from configuration." 
lang))
               (error
                ;; if language not in setting or encounter error during loading,
                ;; then try your luck to load it
-               (condition-case err
-                   (progn
-                     ;; add range rules
-                     (typst-ts-els--add-treesit-range-rules lang)
-                     ;; delete top level parsers, so range rules works (i.e. 
local parsers)
-                     ;; so that highlighting will not exceed the desired range
-                     (mapc #'treesit-parser-delete (treesit-parser-list nil 
lang))
-
-                     ;; find and merge settings
-                     (setq lang-ts-mode
-                           (intern (concat (symbol-name lang) "-ts-mode")))
-                     (setq settings
-                           (typst-ts-els--try-get-ts-settings lang-ts-mode))
-
-                     (setq treesit-font-lock-settings
-                           (append treesit-font-lock-settings
-                                   (plist-get settings 
:treesit-font-lock-settings)))
-
-                     (setq treesit-simple-indent-rules
-                           (append treesit-simple-indent-rules
-                                   (plist-get settings 
:treesit-simple-indent-rules)))
-
-                     (setq treesit-font-lock-feature-list
-                           (typst-ts-els--merge-features
-                            treesit-font-lock-feature-list
-                            (plist-get settings 
:treesit-font-lock-feature-list)))
-                     (message "Luckily merged %s language settings." lang))
-                 (error
-                  (message "Loading %s language settings without luck: \n%s"
-                           lang
-                           (error-message-string err))))))
+               (when 
typst-ts-highlight-raw-block-langs-not-in-predefined-settings
+                 (condition-case err
+                     (progn
+                       ;; add range rules
+                       (typst-ts-els--add-treesit-range-rules lang)
+                       ;; delete top level parsers, so range rules works (i.e. 
local parsers)
+                       ;; so that highlighting will not exceed the desired 
range
+                       (mapc #'treesit-parser-delete (treesit-parser-list nil 
lang))
+
+                       ;; find and merge settings
+                       (setq lang-ts-mode
+                             (intern (concat (symbol-name lang) "-ts-mode")))
+                       (setq settings
+                             (typst-ts-els--try-get-ts-settings lang-ts-mode))
+
+                       (setq treesit-font-lock-settings
+                             (append treesit-font-lock-settings
+                                     (plist-get settings 
:treesit-font-lock-settings)))
+
+                       (setq treesit-simple-indent-rules
+                             (append treesit-simple-indent-rules
+                                     (plist-get settings 
:treesit-simple-indent-rules)))
+
+                       (setq treesit-font-lock-feature-list
+                             (typst-ts-els--merge-features
+                              treesit-font-lock-feature-list
+                              (plist-get settings 
:treesit-font-lock-feature-list)))
+                       (message "Luckily merged %s language settings." lang))
+                   (error
+                    (message "Loading %s language settings without luck: \n%s"
+                             lang
+                             (error-message-string err)))))
+               ))
           ;; whatever, we won't load that language again
           (add-to-list 'typst-ts-els--include-languages lang))
         ))))
@@ -831,12 +902,12 @@ LANG and NEWLANG: either a symbol or string."
 
 (defun typst-ts-embedding-lang-settings-test ()
   "Test typst-ts-embedding-lang-settings."
-  (let ((treesit-font-lock-feature-list
-         '((comment common)
-           (markup-basic code-basic math-basic)
-           (markup-standard code-standard math-standard)
-           (markup-extended code-extended math-extended)))
-        missing-dylibs err-msgs)
+  (setq-local treesit-font-lock-feature-list
+              '((comment common)
+                (markup-basic code-basic math-basic)
+                (markup-standard code-standard math-standard)
+                (markup-extended code-extended math-extended)))
+  (let (missing-dylibs err-msgs)
     (dolist (setting-entry typst-ts-embedding-lang-settings)
       (let ((language (car setting-entry))
             (config (cdr setting-entry)))
@@ -848,7 +919,7 @@ LANG and NEWLANG: either a symbol or string."
           (error
            (setq err-msgs (list (error-message-string err)))))))
     (message "---------  Missing Tree Sitter Dynamic libraries -------------")
-    (message " (This also could be an error of settings entry key name) ")
+    (message " (This also could be an error of entry key name in settings) ")
     (message "%s" (string-join missing-dylibs " "))
     (message "---------  Error Messages ------------------------------------")
     (message "%s" (string-join err-msgs "\n"))))
diff --git a/typst-ts-mode.el b/typst-ts-mode.el
index fe7d026c54..a68b6d76d3 100644
--- a/typst-ts-mode.el
+++ b/typst-ts-mode.el
@@ -1023,8 +1023,11 @@ See `treesit-language-at-point-function'."
              for config = (cdr setting)
              when (treesit-ready-p lang t)
              do
-             (ignore-errors
-               (typst-ts-els-merge-settings config)
+             (unwind-protect
+                 (typst-ts-els-merge-settings config)
+               ;; some feature like cmake-ts-mode will create a parser when
+               ;; the feature is required, so we need to clean thease parsers
+               (mapc #'treesit-parser-delete (treesit-parser-list nil lang))
                (add-to-list 'typst-ts-els--include-languages lang))))
 
   (unless (treesit-ready-p 'typst)
@@ -1087,8 +1090,6 @@ See `treesit-language-at-point-function'."
   ;; Although without enabling `outline-minor-mode' also works, enabling it
   ;; provides outline ellipsis
   (outline-minor-mode t)
-
-
   
   (treesit-major-mode-setup))
 

Reply via email to