diff options
-rw-r--r-- | cook/debug.sld | 6 | ||||
-rw-r--r-- | cook/parse-internals.sld | 8 | ||||
-rw-r--r-- | cook/parse.scm | 43 | ||||
-rw-r--r-- | 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))) (($ <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) |