Function: web-mode-fold-or-unfold
web-mode-fold-or-unfold is an interactive and natively compiled
function defined in web-mode.el.
Signature
(web-mode-fold-or-unfold &optional POS)
Documentation
Toggle folding on an html element or a control block.
Key Bindings
web-mode-map C-c C-f
Source Code
;; Defined in /nix/store/2qgnz1rp30nzfz6w0apx4kdm14if1bbs-emacs-packages-deps/share/emacs/site-lisp/elpa/web-mode-20260831.219/web-mode.el
(defun web-mode-fold-or-unfold (&optional pos)
"Toggle folding on an html element or a control block."
(interactive)
(web-mode-scan)
(with-silent-modifications
(save-excursion
(if pos (goto-char pos))
(let (beg-inside beg-outside end-inside end-outside overlay overlays)
(when (looking-back "^[\t ]*" (point-min))
(back-to-indentation))
(setq overlays (overlays-at (point)))
(dolist (elt overlays)
(when (and (not overlay)
(eq (overlay-get elt 'font-lock-face) 'web-mode-folded-face))
(setq overlay elt)))
(cond
;; *** unfolding
(overlay
(setq beg-inside (overlay-start overlay)
end-inside (overlay-end overlay))
(remove-overlays beg-inside end-inside)
(put-text-property beg-inside end-inside 'invisible nil)
)
;; *** block folding
((and (get-text-property (point) 'block-side)
(cdr (web-mode-block-is-control (point))))
(setq beg-outside (web-mode-block-beginning-position (point)))
(setq beg-inside (1+ (web-mode-block-end-position (point))))
(when (web-mode-block-match)
(setq end-inside (point))
(setq end-outside (1+ (web-mode-block-end-position (point)))))
)
;; *** html comment folding
((eq (get-text-property (point) 'tag-type) 'comment)
(setq beg-outside (web-mode-tag-beginning-position))
(setq beg-inside (+ beg-outside 4))
(setq end-outside (web-mode-tag-end-position))
(setq end-inside (- end-outside 3))
)
;; *** tag folding
((or (member (get-text-property (point) 'tag-type) '(start end))
(web-mode-element-parent))
(when (not (web-mode-element-is-collapsed (point)))
(web-mode-tag-beginning)
(when (eq (get-text-property (point) 'tag-type) 'end)
(web-mode-tag-match))
(setq beg-outside (point))
(web-mode-tag-end)
(setq beg-inside (point))
(goto-char beg-outside)
(when (web-mode-tag-match)
(setq end-inside (point))
(web-mode-tag-end)
(setq end-outside (point)))
)
)
) ;cond
(when (and beg-inside beg-outside end-inside end-outside)
(setq overlay (make-overlay beg-outside end-outside))
(overlay-put overlay 'font-lock-face 'web-mode-folded-face)
(put-text-property beg-inside end-inside 'invisible t))
))))