python parser with all code blocks

This commit is contained in:
anton 2020-01-07 04:42:54 -05:00
parent 1f38085c8f
commit 5538af82c0

View File

@ -188,24 +188,32 @@ position in the CONTENT."
(origami-fold-root-node (funcall javadoc content)))))))
(defun origami-python-parser (create)
"Parse python block of codes and invoke callback CREATE on parsed regions."
(lambda (content)
(with-temp-buffer
(insert content)
(python-mode)
(goto-char (point-min))
(beginning-of-defun -1)
(let (beg (end (point-max)) offset acc)
(while (not (= (point) end))
(setq beg (point))
(search-forward-regexp ":" nil t)
(setq offset (- (point) beg))
(end-of-defun)
(backward-char)
(setq end (point))
(when (> offset 0)
(setq acc (cons (funcall create beg end offset nil) acc)))
(beginning-of-defun -1))
(reverse acc)))))
(defun origami-python-parser-one-level-blocks (wrap-beg wrap-end)
"Parser one level python blocks of codes from WRAP-BEG to WRAP-END."
(goto-char wrap-beg)
(let ((beg wrap-beg) (prev -1) (end wrap-end) (offset 0) children acc)
(while (and (< prev beg) (< beg end))
(python-nav-forward-block)
(setq prev beg) ;; if prev == beg, region has not next block
(setq beg (point))
(save-excursion (python-nav-end-of-block) (setq end (point)))
(save-excursion (python-nav-end-of-statement) (setq offset (- (point) beg)))
(save-excursion
(python-nav-forward-block)
(when (and (< (point) end) (< prev beg)) (setq children t)))
(when (and (< prev beg) (< beg end) (< end wrap-end))
(setq acc (cons (funcall create beg end offset (and children (origami-python-parser-one-level-blocks beg end))) acc)))
)
(reverse acc)))
(origami-python-parser-one-level-blocks (point-min) (point-max)))))
(defun origami-lisp-parser (create regex)
(lambda (content)