You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
beautiful-racket/beautiful-racket-demo/jsonic-demo-2/indenter.rkt

48 lines
1.2 KiB
Racket

#lang br
(require br/indent racket/contract racket/gui/base)
8 years ago
8 years ago
(define indent-width 2)
(define (left-bracket? c) (member c (list #\{ #\[)))
(define (right-bracket? c) (member c (list #\} #\])))
8 years ago
(define (indent-jsonic tbox [posn 0])
(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
8 years ago
(cond
[(left-bracket?
(line-first-visible-char tbox prev-line))
8 years ago
(+ prev-indent indent-width)]
[(right-bracket?
(line-first-visible-char tbox current-line))
(- prev-indent indent-width)]
8 years ago
[else prev-indent]))
8 years ago
(and (exact-positive-integer? current-indent)
current-indent))
(provide
(contract-out
[indent-jsonic (((is-a?/c text%))
(exact-nonnegative-integer?) . ->* .
(or/c exact-positive-integer? #f))]))
8 years ago
(module+ test
(require rackunit)
(define test-str #<<HERE
#lang jsonic
8 years ago
{
"value",
"string":
[
8 years ago
{
"array": @$(range 5)$@,
"object": @$(hash 'k1 "valstring")$@
8 years ago
}
]
// "bar"
8 years ago
}
HERE
8 years ago
)
(check-equal?
(string-indents (apply-indenter indent-jsonic test-str))
8 years ago
'(#f #f 2 2 2 4 6 6 4 2 2 #f)))