From e3b21ffd6b88008fd1cc3599a0f816773dc11f9d Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 22 Apr 2024 21:58:10 +0300 Subject: Refactor whole thing to use in-memory DB as source of truth --- md-parser.scm | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 md-parser.scm (limited to 'md-parser.scm') diff --git a/md-parser.scm b/md-parser.scm new file mode 100644 index 0000000..accc927 --- /dev/null +++ b/md-parser.scm @@ -0,0 +1,49 @@ +(module md-parser (read-md-frontmatter) + (import scheme + (chicken base) + (chicken format) + (chicken file) + (chicken io) + (chicken irregex) + (chicken sort) + srfi-1 + srfi-13 + + utils + ) + + (define (collect-fm-lines lines #!optional (acc '())) + (if (string=? "---" (car lines)) + acc + (collect-fm-lines (cdr lines) (cons (car lines) acc)))) + + (define (extract-field field fm) (call/cc (@ extract-field* field fm))) + (define (extract-field* field fm return) + (define (search line) + (define irx (format "^~A: (.+?)$" field)) + (define m (irregex-search irx line)) + (if m + (return (submatch m)))) + + (for-each search fm) + #f) + + (define (parse-line line) + (define irx (format "^(.+?): (.+?)$" line)) + (define m (irregex-search irx line)) + (if m + (cons (submatch m 1) (submatch m 2)) + #f)) + + (define (read-md-frontmatter md-path) + (define lines (with-input-from-file md-path + (λ () (read-lines)))) + + (define (inner return) + (if (not (string=? "---" (car lines))) + (return #f)) + + (define fm (collect-fm-lines (cdr lines))) + (map parse-line fm)) + + (call/cc (@ inner)))) -- cgit v1.3