aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/textmodes
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/textmodes')
-rw-r--r--lisp/textmodes/mhtml-ts-mode.el78
1 files changed, 43 insertions, 35 deletions
diff --git a/lisp/textmodes/mhtml-ts-mode.el b/lisp/textmodes/mhtml-ts-mode.el
index 6b261205409..66bb27ced10 100644
--- a/lisp/textmodes/mhtml-ts-mode.el
+++ b/lisp/textmodes/mhtml-ts-mode.el
@@ -333,7 +333,8 @@ NODE and PARENT are ignored."
333 "function_declaration" 333 "function_declaration"
334 "lexical_declaration" 334 "lexical_declaration"
335 "element" 335 "element"
336 "rule_set")) 336 "rule_set"
337 "keyframe_block"))
337 "Settings for `treesit-defun-type-regexp'.") 338 "Settings for `treesit-defun-type-regexp'.")
338 339
339;; In order to support `prettify-symbols-mode', just `append' the prettify 340;; In order to support `prettify-symbols-mode', just `append' the prettify
@@ -348,13 +349,11 @@ NODE and PARENT are ignored."
348(defun mhtml-ts-mode--defun-name (node) 349(defun mhtml-ts-mode--defun-name (node)
349 "Return the defun name of NODE. 350 "Return the defun name of NODE.
350Return nil if there is no name or if NODE is not a defun node." 351Return nil if there is no name or if NODE is not a defun node."
351 (let ((html-name (html-ts-mode--defun-name node)) 352 (let ((lang (treesit-node-language node)))
352 (js-name (js--treesit-defun-name node))
353 (css-name (css--treesit-defun-name node)))
354 (cond 353 (cond
355 (html-name html-name) 354 ((eq lang 'html) (html-ts-mode--defun-name node))
356 (js-name js-name) 355 ((eq lang 'javascript) (js--treesit-defun-name node))
357 (css-name css-name)))) 356 ((eq lang 'css) (css--treesit-defun-name node)))))
358 357
359(defvar-local mhtml-ts-mode--comment-current-lang nil) 358(defvar-local mhtml-ts-mode--comment-current-lang nil)
360 359
@@ -432,6 +431,41 @@ Calls REPORT-FN directly. Requires tidy."
432 (process-send-region mhtml-ts-mode--flymake-process (point-min) (point-max)) 431 (process-send-region mhtml-ts-mode--flymake-process (point-min) (point-max))
433 (process-send-eof mhtml-ts-mode--flymake-process))))) 432 (process-send-eof mhtml-ts-mode--flymake-process)))))
434 433
434(defvar mhtml-ts-mode--range-settings
435 (append
436 (treesit-range-rules
437 :embed 'javascript
438 :host 'html
439 '((script_element
440 (start_tag (tag_name))
441 (raw_text) @cap))
442
443 ;; Another rule could be added that when it matches an
444 ;; attribute_value that has as its parent an
445 ;; attribute_name "style" it captures it and then
446 ;; passes it to the css parser.
447 :embed 'css
448 :host 'html
449 '((style_element
450 (start_tag (tag_name))
451 (raw_text) @cap)))
452
453 ;; jsdoc is not mandatory for js-ts-mode, so we respect this by
454 ;; adding jsdoc range rules only when jsdoc is available.
455 (when (treesit-ensure-installed 'jsdoc)
456 (treesit-range-rules
457 :embed 'jsdoc
458 :host 'javascript
459 :local t
460 `(((comment) @cap
461 (:match ,js--treesit-jsdoc-beginning-regexp @cap)))))))
462
463(defvar mhtml-ts-mode--treesit-aggregated-outline-predicate
464 `((html . ,#'html-ts-mode--outline-predicate)
465 (javascript . ,js-ts-mode--outline-predicate)
466 (css . ,css-ts-mode--outline-predicate))
467 "Settings for `treesit-aggregated-outline-predicate'.")
468
435;;;###autoload 469;;;###autoload
436(define-derived-mode mhtml-ts-mode html-ts-mode 470(define-derived-mode mhtml-ts-mode html-ts-mode
437 '("HTML+" (:eval (let ((lang (treesit-language-at (point)))) 471 '("HTML+" (:eval (let ((lang (treesit-language-at (point))))
@@ -475,35 +509,11 @@ Powered by tree-sitter."
475 ;; Multi-language modes must set the primary parser. 509 ;; Multi-language modes must set the primary parser.
476 (setq-local treesit-primary-parser (treesit-parser-create 'html)) 510 (setq-local treesit-primary-parser (treesit-parser-create 'html))
477 511
478 (setq-local treesit-range-settings 512 (setq-local treesit-range-settings mhtml-ts-mode--range-settings)
479 (treesit-range-rules
480 :embed 'javascript
481 :host 'html
482 '((script_element
483 (start_tag (tag_name))
484 (raw_text) @cap))
485
486 ;; Another rule could be added that when it matches an
487 ;; attribute_value that has as its parent an
488 ;; attribute_name "style" it captures it and then
489 ;; passes it to the css parser.
490 :embed 'css
491 :host 'html
492 '((style_element
493 (start_tag (tag_name))
494 (raw_text) @cap))))
495 513
496 ;; jsdoc is not mandatory for js-ts-mode, so we respect this by 514 ;; jsdoc is not mandatory for js-ts-mode, so we respect this by
497 ;; adding jsdoc range rules only when jsdoc is available. 515 ;; adding jsdoc range rules only when jsdoc is available.
498 (when (treesit-ensure-installed 'jsdoc) 516 (when (treesit-ensure-installed 'jsdoc)
499 (setq-local treesit-range-settings
500 (append treesit-range-settings
501 (treesit-range-rules
502 :embed 'jsdoc
503 :host 'javascript
504 :local t
505 `(((comment) @cap
506 (:match ,js--treesit-jsdoc-beginning-regexp @cap))))))
507 (setq-local c-ts-common--comment-regexp 517 (setq-local c-ts-common--comment-regexp
508 js--treesit-jsdoc-comment-regexp)) 518 js--treesit-jsdoc-comment-regexp))
509 519
@@ -563,9 +573,7 @@ Powered by tree-sitter."
563 mhtml-ts-mode--treesit-aggregated-simple-imenu-settings) 573 mhtml-ts-mode--treesit-aggregated-simple-imenu-settings)
564 574
565 (setq-local treesit-aggregated-outline-predicate 575 (setq-local treesit-aggregated-outline-predicate
566 `((html . ,#'html-ts-mode--outline-predicate) 576 mhtml-ts-mode--treesit-aggregated-outline-predicate)
567 (javascript . ,js-ts-mode--outline-predicate)
568 (css . ,css-ts-mode--outline-predicate)))
569 577
570 (treesit-major-mode-setup) 578 (treesit-major-mode-setup)
571 579