From 252a4f525210d1b5a0dca71c337695a117c06156 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Mon, 18 Aug 2025 00:37:05 +0200 Subject: parse: add support for modern fenced metadata --- cook/debug.sld | 6 ++---- cook/parse-internals.sld | 8 +++----- cook/parse.scm | 43 +++++++++++++++++++++---------------------- cook/parse.sld | 1 - 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/cook/debug.sld b/cook/debug.sld index 5b6ddb2..bb0cfbd 100644 --- a/cook/debug.sld +++ b/cook/debug.sld @@ -25,12 +25,10 @@ (list 'ingredient name (cook->list amount))) (($ name amount) (list 'timer name (cook->list amount))) - (($ key value) - (list 'metadata-line key value)) + (($ lines) + (list 'metadata lines)) (($ elements) (list 'step (map cook->list elements ))) - ((? hash-table? y) - (list 'metadata (cook->list (hash-table->alist y)))) (($ metadata body) (list 'recipe (cook->list metadata) (cook->list body))) ((? list? y) diff --git a/cook/parse-internals.sld b/cook/parse-internals.sld index 39761fb..3935c47 100644 --- a/cook/parse-internals.sld +++ b/cook/parse-internals.sld @@ -3,7 +3,6 @@ (srfi 1) (srfi 9) (srfi 26) - (srfi 69) (chibi) (chibi char-set ascii) (chibi char-set) @@ -32,10 +31,6 @@ cookware? cookware-name cookware-amount - - metadata-line? - metadata-line-key - metadata-line-value recipe? recipe-metadata @@ -43,6 +38,9 @@ recipe-ingredients recipe-cookware recipe-timers + + metadata? + metadata-lines step? step-elements 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 - (make-metadata-line key value) - metadata-line? - (key metadata-line-key) - (value metadata-line-value)) +(define-record-type + (make-metadata lines) + metadata? + (lines metadata-lines)) (define-record-type (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)))) diff --git a/cook/parse.sld b/cook/parse.sld index fdef4a0..8c21749 100644 --- a/cook/parse.sld +++ b/cook/parse.sld @@ -3,7 +3,6 @@ (srfi 1) (srfi 9) (srfi 26) - (srfi 69) (chibi) (chibi char-set ascii) (chibi char-set) -- cgit v1.2.3