From 093ac69a6a7dfc8476d295a03ca18e930f8fae29 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 21 Dec 2016 11:57:15 -0800 Subject: [PATCH] br/indent adjustments --- beautiful-racket-lib/br/indent.rkt | 15 ++++++-- .../br/demo/jsonic-2/indenter.rkt | 34 +++++++++++-------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/beautiful-racket-lib/br/indent.rkt b/beautiful-racket-lib/br/indent.rkt index 9415bb0..a51a54a 100644 --- a/beautiful-racket-lib/br/indent.rkt +++ b/beautiful-racket-lib/br/indent.rkt @@ -121,6 +121,14 @@ (check-equal? (line-start-visible t 2) 10) (check-equal? (line-start-visible t 3) #f)) +(define/contract (line-first-visible-char text line) + ((is-a?/c text%) (or/c exact-nonnegative-integer? #f) . -> . (or/c char? #f)) + (char text (line-start-visible text line))) + +(define/contract (line-last-visible-char text line) + ((is-a?/c text%) (or/c exact-nonnegative-integer? #f) . -> . (or/c char? #f)) + (char text (line-end-visible text line))) + (define/contract (line-end-visible text line) ((is-a?/c text%) (or/c exact-nonnegative-integer? #f) . -> . (or/c exact-nonnegative-integer? #f)) (define start+1 (line-end text line)) ; start before newline @@ -185,9 +193,10 @@ (send indented-t get-text)) (define/contract (string-indents str) - (string? . -> . (listof exact-nonnegative-integer?)) + (string? . -> . (listof (or/c exact-positive-integer? #f))) (for/list ([line (in-list (string-split str "\n"))]) - (length (takef (string->list line) space-char?)))) + (define len (length (takef (string->list line) space-char?))) + (and (exact-positive-integer? len) len))) (module+ test - (check-equal? (string-indents t-str) '(0 1 2))) \ No newline at end of file + (check-equal? (string-indents t-str) '(#f 1 2))) \ No newline at end of file diff --git a/beautiful-racket/br/demo/jsonic-2/indenter.rkt b/beautiful-racket/br/demo/jsonic-2/indenter.rkt index 426b2b6..23a2ba7 100644 --- a/beautiful-racket/br/demo/jsonic-2/indenter.rkt +++ b/beautiful-racket/br/demo/jsonic-2/indenter.rkt @@ -3,32 +3,33 @@ (provide indent-jsonic) (define indent-width 2) - -(define (left-bracket? c) (member c '(#\{ #\[))) -(define (right-bracket? c) (member c '(#\} #\]))) +(define (left-bracket? c) (member c (list #\{ #\[))) +(define (right-bracket? c) (member c (list #\} #\]))) ;; if this line begins with } or ], outdent. ;; if last line begins with { or [, indent. ;; otherwise use previous indent -(define/contract (indent-jsonic textbox [tbpos 0]) +(define/contract (indent-jsonic tbox [posn 0]) ((is-a?/c text%) exact-nonnegative-integer? . -> . (or/c exact-nonnegative-integer? #f)) - (define this-line (line textbox tbpos)) - (define prev-line (previous-line textbox tbpos)) - (define prev-indent (or (line-indent textbox prev-line) 0)) - (define this-indent + (define prev-line (previous-line tbox posn)) + (define current-line (line tbox posn)) + (define prev-indent (or (line-indent tbox prev-line) 0)) + (define current-indent (cond - [(left-bracket? (char textbox (line-start-visible textbox prev-line))) + [(left-bracket? + (line-first-visible-char tbox prev-line)) (+ prev-indent indent-width)] - [(right-bracket? (char textbox (line-start-visible textbox this-line))) + [(right-bracket? + (line-first-visible-char tbox current-line)) (- prev-indent indent-width)] [else prev-indent])) - (and (exact-positive-integer? this-indent) this-indent)) + (and (exact-positive-integer? current-indent) current-indent)) (module+ test (require rackunit) - (define test-str #<