Skip to content

Commit

Permalink
feat: roughly parse extract-snippets-from-file
Browse files Browse the repository at this point in the history
  • Loading branch information
cmpitg committed Jun 28, 2015
1 parent 083fde4 commit a455daf
Showing 1 changed file with 56 additions and 53 deletions.
109 changes: 56 additions & 53 deletions src/Ulquikit.adoc
Expand Up @@ -367,59 +367,62 @@ anchor:func/extract-snippets-from-file[]
(the string (with-open-file (in path :element-type '(unsigned-byte 8))
(read-utf-8-string in :stop-at-eof t))))
(define (extract-snippets-from-file path)
(let* ([file-content (read-file path)]
[lines (string-split file-content "\n" #:trim? #f)]
[snippets (box {'file {}
'code {}})]
[prev-prev-line (box "")]
[prev-line (box "")]
[snippet-type (box null)]
[snippet-lines (box '())]
[snippet-name (box "")]
[snippet-linenum (box 0)]
[inside-snippet (box #f)])
(for ([line-num (in-naturals 1)]
[line (in-list lines)])
(cond [(and (unbox inside-snippet)
(not (is-block-delimiter? line)))
(box-swap! snippet-lines append (list line))]
[(and (unbox inside-snippet)
(is-block-delimiter? line))
(box-set! inside-snippet #f)
(box-swap! snippets
add-snippets
(create-snippet #:type (unbox snippet-type)
#:name (unbox snippet-name)
#:linenum (unbox snippet-linenum)
#:lines (unbox snippet-lines)))]
[(is-block-delimiter? line)
(when (or (is-block-title? (unbox prev-prev-line))
(is-block-title? (unbox prev-line)))
(let ([title-line (if (is-block-title? (unbox prev-prev-line))
(unbox prev-prev-line)
(unbox prev-line))])
(box-set! inside-snippet #t)
(box-set! snippet-type (get-snippet-type title-line))
(box-set! snippet-name (get-snippet-name title-line))
(box-set! snippet-lines '())
(box-set! snippet-linenum (dec line-num))))])
;; Always update previous line
(box-set! prev-prev-line (unbox prev-line))
(box-set! prev-line line))
(unbox snippets)))
(defun extract-snippets-from-file (path)
"Extracts snippets from a file."
(declare (type (or string pathname) path))
(let* ((text (string-trim '(#\Space #\Newline #\e #\t #\m) (read-file path)))
(lines (split-sequence #\Newline text))
(snippets (make-snippets))
(prev-prev-line "")
(prev-line "")
(linenum 0) ; current line number
(inside? nil) ; current inside a snippet?
(s/type :code)
(s/lines/rev (list))
(s/name "")
(s/linenum 0)
)
(dolist (line lines)
(incf linenum)
(cond ((and inside? (not (block-delimiter? line)))
(push s/lines/rev line))
((and inside? (block-delimiter? line))
;; Close the current snippet
(setf inside? nil
snippets (collect-snippet snippets
(create-snippet
:type s/type
:name s/name
:lines (nreverse s/lines/rev)
:linenum s/linenum))))
((and (not inside?) (block-delimiter? line))
(when-let (title (cond ((block-title? prev-line) prev-line)
((block-title? prev-prev-line) (prev-prev-line))
(t nil)))
(multiple-value-bind (type name) (parse-snippet-title title)
(setf s/type type
s/name name
s/lines/rev (list)
s/linenum (1- linenum))))))
;; Update previous lines
(unless (zerop (length (string-trim '(#\Space #\Newline #\e #\t #\m) line)))
(setf prev-prev-line prev-line
prev-line line)))
(list linenum (length lines) snippets)))
;; (extract-snippets-from-file "/m/src/ulquikit/src/Ulquikit.adoc")
;; (time (extract-snippets-from-file "/m/src/ulquikit/src/Ulquikit.adoc"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Helpers
Expand Down

0 comments on commit a455daf

Please sign in to comment.