diff --git a/extra/farkup/farkup-tests.factor b/extra/farkup/farkup-tests.factor index 1964b2b8a6..4d418ab99c 100644 --- a/extra/farkup/farkup-tests.factor +++ b/extra/farkup/farkup-tests.factor @@ -2,11 +2,15 @@ USING: farkup kernel tools.test ; IN: temporary [ "
bar
" ] [ "-foo\nbar\n" parse-farkup ] unit-test -[ "*foo\nbar\n" parse-farkup ] must-fail +[ "\nbar\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 + +[ "*
" ] [ "*" parse-farkup ] unit-test +[ "*
" ] [ "\\*" parse-farkup ] unit-test +[ "**
" ] [ "\\**" parse-farkup ] unit-test diff --git a/extra/farkup/farkup.factor b/extra/farkup/farkup.factor index 084b1c80cb..ff39606853 100644 --- a/extra/farkup/farkup.factor +++ b/extra/farkup/farkup.factor @@ -3,16 +3,24 @@ USING: arrays io kernel memoize namespaces peg peg.ebnf sequences strings html.elements xml.entities xmode.code2html splitting io.streams.string html -html.elements sequences.deep unicode.categories ; +html.elements sequences.deep ascii ; +! unicode.categories ; USE: tools.walker IN: farkup MEMO: any-char ( -- parser ) [ drop t ] satisfy ; +: delimiters ( -- string ) + "*_^~%=[-|\\\n" ; inline + MEMO: text ( -- parser ) - [ "*_^~%=[-|\n" member? not ] satisfy repeat1 + [ delimiters member? not ] satisfy repeat1 [ >string escape-string ] action ; +MEMO: delimiter ( -- parser ) + [ dup delimiters member? swap CHAR: \n = not and ] satisfy + [ 1string ] action ; + : delimited ( str html -- parser ) [ over token hide , @@ -20,6 +28,9 @@ MEMO: text ( -- parser ) token hide , ] seq* ; +MEMO: escaped-char ( -- parser ) + [ "\\" token hide , any-char , ] seq* [ >string ] action ; + MEMO: strong ( -- parser ) "*" "strong" delimited ; MEMO: emphasis ( -- parser ) "_" "em" delimited ; MEMO: superscript ( -- parser ) "^" "sup" delimited ; @@ -89,16 +100,17 @@ MEMO: line ( -- parser ) [ text , strong , emphasis , link , superscript , subscript , inline-code , + escaped-char , delimiter , ] choice* repeat1 ; MEMO: paragraph ( -- parser ) [ - line [ - dup [ [ blank? ] all? ] deep-all? - [ "" swap "
" 3array ] unless - ] action , - "\n" token hide , - ] choice* ; + line , + "\n" token , + ] choice* repeat1 [ + dup [ dup string? not swap [ blank? ] all? or ] deep-all? + [ "" swap "
" 3array ] unless + ] action ; MEMO: farkup ( -- parser ) [