[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/treesit-fold 18d874fd3d 3/5: parse markdown headings (#13)
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/treesit-fold 18d874fd3d 3/5: parse markdown headings (#13) |
Date: |
Wed, 24 Jul 2024 22:01:31 -0400 (EDT) |
branch: elpa/treesit-fold
commit 18d874fd3d4a5b709e404f5bfa2ac0b4d47758e3
Author: tpeacock19 <git@treypeacock.com>
Commit: GitHub <noreply@github.com>
parse markdown headings (#13)
* parse markdown headings
* document next heading function
* replace treesit-node-get call with treesit-node-next-sibling
---
treesit-fold-parsers.el | 5 ++++-
treesit-fold.el | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/treesit-fold-parsers.el b/treesit-fold-parsers.el
index b8c2f2f0dc..4d80b93517 100644
--- a/treesit-fold-parsers.el
+++ b/treesit-fold-parsers.el
@@ -72,6 +72,8 @@
(declare-function treesit-fold-range-lua-do-loop "treesit-fold.el")
(declare-function treesit-fold-range-lua-repeat "treesit-fold.el")
(declare-function treesit-fold-range-make-recipe "treesit-fold.el")
+(declare-function treesit-fold-markdown-heading "treesit-fold.el")
+(declare-function treesit-fold-markdown-code-block "treesit-fold.el")
(declare-function treesit-fold-range-matlab-function "treesit-fold.el")
(declare-function treesit-fold-range-matlab-statements "treesit-fold.el")
(declare-function treesit-fold-range-matlab-blocks "treesit-fold.el")
@@ -450,7 +452,8 @@
(defun treesit-fold-parsers-markdown ()
"Rule set for Markdown."
- '((fenced_code_block . (treesit-fold-range-seq 2 -2))
+ '((fenced_code_block . treesit-fold-markdown-code-block)
+ (section . treesit-fold-markdown-heading)
(html_block . treesit-fold-range-html)))
(defun treesit-fold-parsers-matlab ()
diff --git a/treesit-fold.el b/treesit-fold.el
index f067a78fea..dd47530835 100644
--- a/treesit-fold.el
+++ b/treesit-fold.el
@@ -1153,6 +1153,47 @@ more information."
(end (treesit-node-end last-child)))
(treesit-fold--cons-add (cons beg end) offset)))
+(defun treesit-fold-markdown-next-heading (node siblings)
+ "Return first heading from SIBLINGS with start point after NODE.
+If there is no sibling, then return nil."
+ (or
+ (seq-find
+ (lambda (n)
+ (when-let ((child (treesit-node-child n 0 t)))
+ (and (> (treesit-node-start child) (treesit-node-start node))
+ (treesit-fold--compare-type child "atx_heading"))))
+ (remove node siblings))
+ (treesit-node-next-sibling (treesit-node-parent node) t)))
+
+(defun treesit-fold-markdown-heading (node offset)
+ "Define fold range for Markdown headings.
+
+For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
+more information."
+ (when-let*
+ ((parent (treesit-node-parent node))
+ (head (treesit-node-child node 0 t))
+ (beg (treesit-node-start node))
+ (siblings (treesit-fold-find-children parent "section"))
+ (end (1-
+ (or (treesit-node-start
+ (treesit-fold-markdown-next-heading node siblings))
+ (point-max))))
+ (name (length (string-trim (or (treesit-node-text head) "")))))
+ (treesit-fold--cons-add (cons beg end) (cons name 0))))
+
+(defun treesit-fold-markdown-code-block (node offset)
+ "Define fold range for Markdown code blocks.
+
+For arguments NODE and OFFSET, see function `treesit-fold-range-seq' for
+more information."
+ (let* ((beg (1+ (treesit-node-start node)))
+ (end (1- (treesit-node-end node)))
+ (name (+ 2 (length
+ (or (treesit-node-text (treesit-node-child node 1))
+ "")))))
+ (treesit-fold--cons-add (cons beg end) (cons name -2))))
+
(defun treesit-fold-range-matlab-blocks (node offset)
"Define fold range for MATLAB blocks.