DEFER: name/values
: (parse-value) ( string -- values )
- decode-value lines
+ decode-value split-lines
[ "" ] [ dup length 1 = [ first ] when ] if-empty ;
: parse-value ( string -- remain value )
dup find-` [
dup 1 - pick ?nth CHAR: : =
[ drop name/values ] [ cut swap (parse-value) ] if
- [ rest [ blank? ] trim-head ] dip
+ [ rest [ unicode:blank? ] trim-head ] dip
] [ f swap ] if* ;
: (name=value) ( string -- remain term )
parse-name [ parse-value ] dip associate ;
: name=value ( string -- remain term )
- [ blank? ] trim
- ":`" over subseq? [ (name=value) ] [ f swap ] if ;
+ [ unicode:blank? ] trim
+ dup ":`" subseq-of? [ (name=value) ] [ f swap ] if ;
: name/values ( string -- remain terms )
[ dup { [ empty? not ] [ first CHAR: ` = not ] } 1&& ]
- [ name=value ] produce assoc-combine ;
+ [ name=value ] produce assoc-union-all ;
: parse-txon ( string -- objects )
[ dup empty? not ] [ name=value ] produce nip ;
GENERIC: >txon ( object -- string )
M: sequence >txon
- [ >txon ] map unlines ;
+ [ >txon ] map join-lines ;
M: assoc >txon
>alist [
first2 [ encode-value ] [ >txon ] bi* "%s:`%s`" sprintf
- ] map unlines ;
+ ] map join-lines ;
M: string >txon
encode-value ;