Create basic indent parser
This commit is contained in:
parent
f28a9209d9
commit
2b07b5c6fd
@ -65,6 +65,70 @@ position in the CONTENT."
|
|||||||
acc))))
|
acc))))
|
||||||
(reverse acc))))
|
(reverse acc))))
|
||||||
|
|
||||||
|
;;; TODO: support tabs
|
||||||
|
(defun origami-indent-parser (create)
|
||||||
|
(cl-labels ((lines (string)
|
||||||
|
(-> string
|
||||||
|
(origami-get-positions ".*?\r?\n")
|
||||||
|
(->> (-filter (lambda (line)
|
||||||
|
(not (s-blank? (s-trim (car line)))))))))
|
||||||
|
(annotate-levels (lines)
|
||||||
|
(-map (lambda (line)
|
||||||
|
(let ((beg (cdr line))
|
||||||
|
(end (+ (cdr line) (length (car line)) -1)))
|
||||||
|
(vector (length (car (s-match "^ *" (car line))))
|
||||||
|
beg
|
||||||
|
end
|
||||||
|
(- end beg))))
|
||||||
|
lines))
|
||||||
|
(indent (line) (aref line 0))
|
||||||
|
(beg (line) (aref line 1))
|
||||||
|
(end (line) (aref line 2))
|
||||||
|
(offset (line) (aref line 3))
|
||||||
|
(collapse-same-level (levels)
|
||||||
|
(reverse (-reduce-from (lambda (acc level)
|
||||||
|
(if (= (indent level) (indent (car acc)))
|
||||||
|
(cons (vector (indent (car acc))
|
||||||
|
(beg (car acc))
|
||||||
|
(end level)
|
||||||
|
(offset (car acc)))
|
||||||
|
(cdr acc))
|
||||||
|
(cons level acc)))
|
||||||
|
(list (car levels))
|
||||||
|
(cdr levels))))
|
||||||
|
(create-tree (levels)
|
||||||
|
(if (null levels)
|
||||||
|
levels
|
||||||
|
(let ((curr-indent (indent (car levels))))
|
||||||
|
(->> levels
|
||||||
|
(-partition-by (lambda (l) (= (indent l) curr-indent)))
|
||||||
|
(-partition-all 2)
|
||||||
|
(-map (lambda (x) (cons (caar x) (create-tree (cadr x)))))))))
|
||||||
|
(build-nodes (tree)
|
||||||
|
(if (null tree) (cons 0 nil)
|
||||||
|
;; complexity here is due to having to find the end of the children so that the
|
||||||
|
;; parent encompasses them
|
||||||
|
(-reduce-r-from (lambda (nodes acc)
|
||||||
|
(destructuring-bind (children-end . children) (build-nodes (cdr nodes))
|
||||||
|
(let ((this-end (max children-end (end (car nodes)))))
|
||||||
|
(cons (max this-end (car acc))
|
||||||
|
(cons (funcall create
|
||||||
|
(beg (car nodes))
|
||||||
|
this-end
|
||||||
|
(offset (car nodes))
|
||||||
|
children)
|
||||||
|
(cdr acc))))))
|
||||||
|
'(0 . nil)
|
||||||
|
tree))))
|
||||||
|
(lambda (content)
|
||||||
|
(-> content
|
||||||
|
lines
|
||||||
|
annotate-levels
|
||||||
|
collapse-same-level
|
||||||
|
create-tree
|
||||||
|
build-nodes
|
||||||
|
cdr))))
|
||||||
|
|
||||||
(defun origami-build-pair-tree (create open close positions)
|
(defun origami-build-pair-tree (create open close positions)
|
||||||
(cl-labels ((build (positions)
|
(cl-labels ((build (positions)
|
||||||
;; this is so horrible, but fast
|
;; this is so horrible, but fast
|
||||||
|
Loading…
Reference in New Issue
Block a user