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))
       ))))