diff options
Diffstat (limited to 'cook/parse.scm')
-rw-r--r-- | cook/parse.scm | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/cook/parse.scm b/cook/parse.scm index 7092905..f9c4ddd 100644 --- a/cook/parse.scm +++ b/cook/parse.scm @@ -40,11 +40,10 @@ https://github.com/cooklang/spec/blob/main/EBNF.md (define (component->timer comp) (make-timer (component-name comp) (component-amount comp))) -(define-record-type <metadata-line> - (make-metadata-line key value) - metadata-line? - (key metadata-line-key) - (value metadata-line-value)) +(define-record-type <metadata> + (make-metadata lines) + metadata? + (lines metadata-lines)) (define-record-type <step> (make-step elements) @@ -82,15 +81,6 @@ https://github.com/cooklang/spec/blob/main/EBNF.md (define recipe-cookware (cut recipe-find cookware? <>)) (define recipe-timers (cut recipe-find timer? <>)) -(define (metadata-line-list->hash-table meta-lines) - (let ((metadata (make-hash-table))) - (for-each (lambda (line) - (hash-table-set! metadata - (metadata-line-key line) - (metadata-line-value line))) - meta-lines) - metadata)) - (define (merge-step-strings lis) (reduce-right (lambda (el acc) @@ -228,12 +218,18 @@ https://github.com/cooklang/spec/blob/main/EBNF.md (string->char-set "=")) (list->string c))))) - (metadata ((: bol ">>" - (=> k ,(parse-map meta-key string-trim-whitespace)) - (* ,whitespace) ":" (* ,whitespace) - (=> v ,(parse-map any-text-item string-trim-whitespace)) - (* ,whitespace) eol) - (make-metadata-line k v))) + (metadata-line ((: (? ,whitespace) + (=> k ,(parse-map meta-key string-trim-whitespace)) + (* ,whitespace) ":" (* ,whitespace) + (=> v ,(parse-map any-text-item string-trim-whitespace)) + (* ,whitespace) + (+ ,nl)) + (cons k v))) + + (metadata ((: bol "---" (* ,whitespace) (+ ,nl) + (=> x (: ,(parse-repeat metadata-line))) + bol "---" (* ,whitespace) (+ ,nl)) + (make-metadata (concatenate! (append! x))))) (element ((or ,metadata ,comment ,note ,section ,step))) @@ -244,7 +240,10 @@ https://github.com/cooklang/spec/blob/main/EBNF.md (parse-optional parse-end)))))) (concatenate! els)))) +(define (merge-metadata meta) + (concatenate! (map metadata-lines meta))) + (define (parse-cook str) (let ((lis (parse-fully recipe str))) - (let-values (((meta-lines body) (partition metadata-line? lis))) - (make-recipe (metadata-line-list->hash-table meta-lines) body)))) + (let-values (((metadata body) (partition metadata? lis))) + (make-recipe (merge-metadata metadata) body)))) |