(Arne Babenhauserheide)
2013-09-12: added the missing escaping and unescaping of linebreaks inside added the missing escaping and unescaping of linebreaks inside strings.
diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -6,7 +6,7 @@ ;; nostringandbracketbreaks INPORT ;; ;; Replace linebreaks within brackets and strings in the INPORT by the -;; placeholders \STRING_BREAK_N and \STRING_BREAK_R. Also identify +;; placeholders \LINE_BREAK_N and \LINE_BREAK_R. Also identify ;; real comments as ;\REALCOMMENTHERE ;; ;; bootstrap via python3 wisp.py wisp-guile.w > 1 && guile 1 wisp-guile.w > 2 && guile 2 wisp-guile.w > 3 && diff 2 3 @@ -147,9 +147,12 @@ define : nostringandbracketbreaksreader if : or instring : > inbrackets 0 if : char=? nextchar #\linefeed - set! text : string-append text "\\LINE_BREAK_N" + ; we have to actually construct the escape + ; sequence here to be able to parse ourselves. + ; FUBBLE, I’m NEW! + set! text : string-append text : string-append "\\LINE_" "BREAK_N" if : char=? nextchar #\newline - set! text : string-append text "\\LINE_BREAK_R" + set! text : string-append text : string-append "\\LINE_" "BREAK_R" ; else set! text : string-append text : string nextchar ; mark the start of a comment, so we do not have to @@ -537,12 +540,50 @@ define : wisp2lisp-lines lines parsed : apply wisp2lisp-parse deinitialized . parsed + +define : string-replace-substring s substring replacement + . "Replace every instance of substring in s by replacement." + let : : sublen : string-length substring + let replacer + : newstring s + index : string-contains s substring + if : not : equal? index #f + let : : replaced : string-replace s replacement index : + index sublen + replacer replaced : string-contains replaced substring + . newstring + + +define : unescape-linebreaks text + . "unescape linebreaks" + string-replace-substring + ; we have to construct the placeholders here to avoid unescaping them when we parse ourselves… + string-replace-substring text (string-append "\\LINE_" "BREAK_N") : string #\linefeed + . (string-append "\\LINE_" "BREAK_R") : string #\newline + +define : join-lisp-lines lisp-lines + let join : (joined "") (unprocessed lisp-lines) + if : not : equal? unprocessed '() + let* + : next : list-ref unprocessed 0 + nextstring + string-append + xsubstring " " 0 : line-indent next + ; here we re-add all necessary linebreakswe get rid + unescape-linebreaks : line-content next + if : equal? "" : line-comment next + . "" + string-append ";" : line-comment next + . "\n" + join (string-append joined nextstring) (list-tail unprocessed 1) + . joined + define : wisp2lisp text let* : nobreaks : call-with-input-string text nostringandbracketbreaks textlines : call-with-input-string nobreaks splitlines lines : linestoindented textlines - wisp2lisp-lines lines + lisp-lines : wisp2lisp-lines lines + join-lisp-lines lisp-lines ; first step: Be able to mirror a file to stdout let* @@ -554,22 +595,23 @@ let* ; textlines : split-wisp-lines text ; lines : linestoindented textlines lisp : wisp2lisp text + display lisp ; display : list-ref lines 100 ; seems good - let show : (processed '()) (unprocessed lisp) - when : not : equal? unprocessed '() - let : : next : list-ref unprocessed 0 - ;display : length processed - ;display "/" - ;display : length unprocessed - ;display ": " - display : xsubstring " " 0 : line-indent next - display : line-content next - unless : equal? "" : line-comment next - display ";" - display : line-comment next - newline - show (append processed (list next)) (list-tail unprocessed 1) - +; let show : (processed '()) (unprocessed lisp) +; when : not : equal? unprocessed '() +; let : : next : list-ref unprocessed 0 +; ;display : length processed +; ;display "/" +; ;display : length unprocessed +; ;display ": " +; display : xsubstring " " 0 : line-indent next +; display : line-content next +; unless : equal? "" : line-comment next +; display ";" +; display : line-comment next +; newline +; show (append processed (list next)) (list-tail unprocessed 1) +; ; let : : line : list-ref lisp 158 ; display : line-indent line ; display ","