Function: markdown-imenu-create-nested-index
markdown-imenu-create-nested-index is a byte-compiled function defined
in markdown-mode.el.
Signature
(markdown-imenu-create-nested-index)
Documentation
Create and return a nested imenu index alist for the current buffer.
See imenu-create-index-function and imenu--index-alist for details.
Source Code
;; Defined in ~/.emacs.d/elpa/markdown-mode-20260321.143/markdown-mode.el
;;; imenu =====================================================================
(defun markdown-imenu-create-nested-index ()
"Create and return a nested imenu index alist for the current buffer.
See `imenu-create-index-function' and `imenu--index-alist' for details."
(let* ((root (list nil))
(min-level 9999)
hashes headers)
(save-excursion
;; Headings
(goto-char (point-min))
(while (re-search-forward markdown-regex-header (point-max) t)
(unless (or (markdown-code-block-at-point-p)
(and (match-beginning 3)
(get-text-property (match-beginning 3) 'markdown-yaml-metadata-end)))
(cond
((match-string-no-properties 2) ;; level 1 setext
(setq min-level 1)
(push (list :heading (match-string-no-properties 1)
:point (match-beginning 1)
:level 1) headers))
((match-string-no-properties 3) ;; level 2 setext
(setq min-level (min min-level 2))
(push (list :heading (match-string-no-properties 1)
:point (match-beginning 1)
:level (- 2 (1- min-level))) headers))
((setq hashes (markdown-trim-whitespace
(match-string-no-properties 4)))
(setq min-level (min min-level (length hashes)))
(push (list :heading (match-string-no-properties 5)
:point (match-beginning 4)
:level (- (length hashes) (1- min-level))) headers)))))
(cl-loop with cur-level = 0
with cur-alist = nil
with empty-heading = "-"
with self-heading = "."
for header in (reverse headers)
for level = (plist-get header :level)
do
(let ((alist (list (cons (plist-get header :heading) (plist-get header :point)))))
(cond
((= cur-level level) ; new sibling
(setcdr cur-alist alist)
(setq cur-alist alist))
((< cur-level level) ; first child
(dotimes (_ (- level cur-level 1))
(setq alist (list (cons empty-heading alist))))
(if cur-alist
(let* ((parent (car cur-alist))
(self-pos (cdr parent)))
(setcdr parent (cons (cons self-heading self-pos) alist)))
(setcdr root alist)) ; primogenitor
(setq cur-alist alist)
(setq cur-level level))
(t ; new sibling of an ancestor
(let ((sibling-alist (last (cdr root))))
(dotimes (_ (1- level))
(setq sibling-alist (last (cdar sibling-alist))))
(setcdr sibling-alist alist)
(setq cur-alist alist))
(setq cur-level level)))))
(setq root (copy-tree root))
;; Footnotes
(let ((fn (markdown-get-defined-footnotes)))
(if (or (zerop (length fn))
(null markdown-add-footnotes-to-imenu))
(cdr root)
(nconc (cdr root) (list (cons "Footnotes" fn))))))))