dont show spaces at the end of a line when not needed
svn: r14077 original commit: 35374355648e0be9cdd93f9df4d74bb04b3d554f
This commit is contained in:
parent
d1f1c4011d
commit
4672f9b344
|
@ -19,9 +19,11 @@
|
||||||
;; system (when line counts are enabled) -- this is used to tell what part of a
|
;; system (when line counts are enabled) -- this is used to tell what part of a
|
||||||
;; prefix is already displayed.
|
;; prefix is already displayed.
|
||||||
;;
|
;;
|
||||||
;; Each prefix is either an integer (for a number of spaces), a string, or #f
|
;; Each prefix is either an integer (for a number of spaces) or a
|
||||||
;; indicating that prefixes are disabled (different from 0 -- they will not be
|
;; string. The prefix mechanism can be disabled by using #f for the
|
||||||
;; accumulated).
|
;; global prefix, and in this case the line prefix can have (cons pfx
|
||||||
|
;; lpfx) so it can be restored -- used by `verbatim' and `unverbatim'
|
||||||
|
;; resp. (This is different from 0 -- no prefix will be accumulated).
|
||||||
;;
|
;;
|
||||||
(define (output x [p (current-output-port)])
|
(define (output x [p (current-output-port)])
|
||||||
;; these are the global prefix and the one that is local to the current line
|
;; these are the global prefix and the one that is local to the current line
|
||||||
|
@ -63,6 +65,37 @@
|
||||||
(let ([col (- col len1)]
|
(let ([col (- col len1)]
|
||||||
[len2 (if (number? pfx2) pfx2 (string-length pfx2))])
|
[len2 (if (number? pfx2) pfx2 (string-length pfx2))])
|
||||||
(when (< col len2) (write-string (->str pfx2) p col )))])))))
|
(when (< col len2) (write-string (->str pfx2) p col )))])))))
|
||||||
|
;; the basic printing unit: strings
|
||||||
|
(define (output-string x)
|
||||||
|
(define pfx (mcar pfxs))
|
||||||
|
(if (not pfx) ; vervatim mode?
|
||||||
|
(write-string x p)
|
||||||
|
(let ([len (string-length x)]
|
||||||
|
[nls (regexp-match-positions* #rx"\n" x)])
|
||||||
|
(let loop ([start 0] [nls nls] [lpfx (mcdr pfxs)] [col (getcol)])
|
||||||
|
(cond [(pair? nls)
|
||||||
|
(let ([nl (car nls)])
|
||||||
|
(if (regexp-match? #rx"^ *$" x start (car nl))
|
||||||
|
(newline p) ; only spaces before the end of the line
|
||||||
|
(begin (output-pfx col pfx lpfx)
|
||||||
|
(write-string x p start (cdr nl))))
|
||||||
|
(loop (cdr nl) (cdr nls) 0 0))]
|
||||||
|
;; last substring from here (always set lpfx state when done)
|
||||||
|
[(start . = . len)
|
||||||
|
(set-mcdr! pfxs lpfx)]
|
||||||
|
[(col . > . (2pfx-length pfx lpfx))
|
||||||
|
(set-mcdr! pfxs lpfx)
|
||||||
|
;; the prefix was already shown, no accumulation needed
|
||||||
|
(write-string x p start)]
|
||||||
|
[else
|
||||||
|
(let ([m (regexp-match-positions #rx"^ +" x start)])
|
||||||
|
;; accumulate spaces to lpfx, display if it's not all spaces
|
||||||
|
(let ([lpfx (if m (pfx+ lpfx (- (cdar m) (caar m))) lpfx)])
|
||||||
|
(set-mcdr! pfxs lpfx)
|
||||||
|
(unless (and m (= len (cdar m)))
|
||||||
|
(output-pfx col pfx lpfx)
|
||||||
|
;; the spaces were already added to lpfx
|
||||||
|
(write-string x p (if m (cdar m) start)))))])))))
|
||||||
;; main loop
|
;; main loop
|
||||||
(define (loop x)
|
(define (loop x)
|
||||||
(cond
|
(cond
|
||||||
|
@ -114,41 +147,16 @@
|
||||||
[else (error 'output "unknown special value flag: ~e"
|
[else (error 'output "unknown special value flag: ~e"
|
||||||
(special-flag x))]))]
|
(special-flag x))]))]
|
||||||
[else
|
[else
|
||||||
(let* ([x (cond [(string? x) x]
|
(output-string
|
||||||
[(bytes? x) (bytes->string/utf-8 x)]
|
(cond [(string? x) x]
|
||||||
[(symbol? x) (symbol->string x)]
|
[(bytes? x) (bytes->string/utf-8 x)]
|
||||||
[(path? x) (path->string x)]
|
[(symbol? x) (symbol->string x)]
|
||||||
[(keyword? x) (keyword->string x)]
|
[(path? x) (path->string x)]
|
||||||
[(number? x) (number->string x)]
|
[(keyword? x) (keyword->string x)]
|
||||||
[(char? x) (string x)]
|
[(number? x) (number->string x)]
|
||||||
;; generic fallback: throw an error
|
[(char? x) (string x)]
|
||||||
[else (error 'output "don't know how to render value: ~v"
|
;; generic fallback: throw an error
|
||||||
x)])]
|
[else (error 'output "don't know how to render value: ~v" x)]))]))
|
||||||
[len (string-length x)]
|
|
||||||
[nls (regexp-match-positions* #rx"\n" x)]
|
|
||||||
[pfx (mcar pfxs)])
|
|
||||||
(let loop ([start 0] [nls nls] [lpfx (mcdr pfxs)] [col (getcol)])
|
|
||||||
(cond [(pair? nls)
|
|
||||||
(let ([nl (car nls)])
|
|
||||||
(output-pfx col pfx lpfx)
|
|
||||||
(write-string x p start (cdr nl))
|
|
||||||
(loop (cdr nl) (cdr nls) 0 0))]
|
|
||||||
;; last substring from here (always set lpfx state when done)
|
|
||||||
[(start . = . len)
|
|
||||||
(set-mcdr! pfxs lpfx)]
|
|
||||||
[(col . > . (2pfx-length pfx lpfx))
|
|
||||||
(set-mcdr! pfxs lpfx)
|
|
||||||
;; the prefix was already shown, no accumulation needed
|
|
||||||
(write-string x p start)]
|
|
||||||
[else
|
|
||||||
(let ([m (regexp-match-positions #rx"^ +" x start)])
|
|
||||||
;; accumulate spaces to lpfx, display if it's not all spaces
|
|
||||||
(let ([lpfx (if m (pfx+ lpfx (- (cdar m) (caar m))) lpfx)])
|
|
||||||
(set-mcdr! pfxs lpfx)
|
|
||||||
(unless (and m (= len (cdar m)))
|
|
||||||
(output-pfx col pfx lpfx)
|
|
||||||
;; the spaces were already added to lpfx
|
|
||||||
(write-string x p (if m (cdar m) start)))))])))]))
|
|
||||||
;;
|
;;
|
||||||
(port-count-lines! p)
|
(port-count-lines! p)
|
||||||
(loop x)
|
(loop x)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user