(Arne Babenhauserheide)
2013-09-12: split the linebreakkiller into a block reader and a gatherer. split the linebreakkiller into a block reader and a gatherer.
diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -13,7 +13,7 @@ ;; ;; -Author: Arne Babenhauserheide -define-module : language wisp +define-module : language wisp parser . #:export : wisp2lisp define : endsinunevenbackslashes text @@ -34,6 +34,14 @@ define : endsinunevenbackslashes text define : nostringandbracketbreaks inport + . "Replace all linebreaks inside strings and brackets with placeholders." + let : : expressions : list : nostringandbracketbreaksreader inport + while : not : eof-object? : peek-char inport + set! expressions : append expressions : list : nostringandbracketbreaksreader inport + string-join expressions "\n" + +define : nostringandbracketbreaksreader inport + . "Read one wisp-expression from the inport. Ends with three consecutive linebreaks or eof." ; Replace end of line characters in brackets and strings ; FIXME: Breaks if the string is shorter than 2 chars let* @@ -45,7 +53,12 @@ define : nostringandbracketbreaks inport instring #f inbrackets 0 incharform 0 ; #\<something> - while : not : eof-object? nextchar + while + not + or : eof-object? nextchar + and + or (char=? nextchar #\linefeed ) (char=? nextchar #\newline ) + string-suffix? text "\n\n" ; incommentfirstchar is only valid for exactly one char when incommentfirstchar : set! incommentfirstchar #f ; already started char forms win over everything, so process them first. @@ -323,10 +336,6 @@ define : read-whole-file filename read-char origfile -define : split-wisp-lines text - let : : nobreaks : call-with-input-string text nostringandbracketbreaks - call-with-input-string nobreaks splitlines - define : wisp2lisp-add-inline-colon-brackets line . "Add inline colon brackets to a wisp-line (indent,content,comment)" @@ -530,7 +539,8 @@ define : wisp2lisp-lines lines define : wisp2lisp text let* - : textlines : split-wisp-lines text + : nobreaks : call-with-input-string text nostringandbracketbreaks + textlines : call-with-input-string nobreaks splitlines lines : linestoindented textlines wisp2lisp-lines lines