diff --git a/extra/farkup/farkup-tests.factor b/extra/farkup/farkup-tests.factor index 4d418ab99c..ec1b915d4d 100644 --- a/extra/farkup/farkup-tests.factor +++ b/extra/farkup/farkup-tests.factor @@ -6,7 +6,7 @@ IN: temporary [ "" ] [ "-foo\n-bar" parse-farkup ] unit-test [ "\n" ] [ "-foo\n-bar\n" parse-farkup ] unit-test -[ "

\nbar\n

" ] [ "-foo\nbar\n" parse-farkup ] unit-test +[ "\n

bar\n

" ] [ "-foo\nbar\n" parse-farkup ] unit-test [ "

*foo\nbar\n

" ] [ "*foo\nbar\n" parse-farkup ] unit-test [ "

Wow!

" ] [ "*Wow!*" parse-farkup ] unit-test [ "

Wow.

" ] [ "_Wow._" parse-farkup ] unit-test @@ -14,3 +14,13 @@ IN: temporary [ "

*

" ] [ "*" parse-farkup ] unit-test [ "

*

" ] [ "\\*" parse-farkup ] unit-test [ "

**

" ] [ "\\**" parse-farkup ] unit-test + +[ "" ] [ "\n\n" parse-farkup ] unit-test +[ "\n" ] [ "\n\n\n" parse-farkup ] unit-test +[ "

foo

bar

" ] [ "foo\n\nbar" parse-farkup ] unit-test + +[ "\n

bar\n

" ] [ "\nbar\n" parse-farkup ] unit-test + +[ "

foo

\n

bar

" ] [ "foo\n\n\nbar" parse-farkup ] unit-test + +[ "" ] [ "" parse-farkup ] unit-test diff --git a/extra/farkup/farkup.factor b/extra/farkup/farkup.factor index ff39606853..e605483f54 100644 --- a/extra/farkup/farkup.factor +++ b/extra/farkup/farkup.factor @@ -40,6 +40,7 @@ MEMO: h1 ( -- parser ) "=" "h1" delimited ; MEMO: h2 ( -- parser ) "==" "h2" delimited ; MEMO: h3 ( -- parser ) "===" "h3" delimited ; MEMO: h4 ( -- parser ) "====" "h4" delimited ; +MEMO: nl ( -- parser ) "\n" token ; MEMO: 2nl ( -- parser ) "\n\n" token hide ; : render-code ( string mode -- string' ) @@ -104,19 +105,25 @@ MEMO: line ( -- parser ) ] choice* repeat1 ; MEMO: paragraph ( -- parser ) + line + "\n" token over 2seq repeat0 + "\n" token "\n" token ensure-not 2seq optional 3seq [ - line , - "\n" token , - ] choice* repeat1 [ dup [ dup string? not swap [ blank? ] all? or ] deep-all? [ "

" swap "

" 3array ] unless ] action ; MEMO: farkup ( -- parser ) [ - list , h1 , h2 , h3 , h4 , code , paragraph , 2nl , - ] choice* repeat1 ; + list , h1 , h2 , h3 , h4 , code , paragraph , 2nl , nl , + ] choice* repeat0 "\n" token optional 2seq ; : parse-farkup ( string -- string' ) farkup parse parse-result-ast [ [ dup string? [ write ] [ drop ] if ] deep-each ] with-string-writer ; + +! paragraph + ! [ + ! line , + ! "\n" token , + ! ] choice* repeat1