summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2025-08-18 00:37:05 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2025-08-19 22:38:37 +0200
commit252a4f525210d1b5a0dca71c337695a117c06156 (patch)
treeafe576f4ead466208a2716bda2e16c9dd6bd244f
parent46402db0fceee23295547c5b47990bc68a1619d9 (diff)
parse: add support for modern fenced metadata
-rw-r--r--cook/debug.sld6
-rw-r--r--cook/parse-internals.sld8
-rw-r--r--cook/parse.scm43
-rw-r--r--cook/parse.sld1
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)))
(($ <timer> name amount)
(list 'timer name (cook->list amount)))
- (($ <metadata-line> key value)
- (list 'metadata-line key value))
+ (($ <metadata> lines)
+ (list 'metadata lines))
(($ <step> elements)
(list 'step (map cook->list elements )))
- ((? hash-table? y)
- (list 'metadata (cook->list (hash-table->alist y))))
(($ <recipe> 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?
- metadata-line-key
- metadata-line-value
<recipe>
recipe?
recipe-metadata
@@ -43,6 +38,9 @@
recipe-ingredients
recipe-cookware
recipe-timers
+ <metadata>
+ metadata?
+ metadata-lines
<step>
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 <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))))
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)