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.
34 lines
1.2 KiB
Racket
34 lines
1.2 KiB
Racket
#lang br
|
|
(require parser-tools/lex
|
|
syntax-color/racket-lexer
|
|
parser-tools/lex-sre)
|
|
|
|
(provide color-jsonic)
|
|
|
|
(define in-racket-expr? #f)
|
|
|
|
(define (at-racket-boundary? input-port)
|
|
(equal? (peek-string 2 0 input-port) "$@"))
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
(check-true (at-racket-boundary? (open-input-string "$@foo")))
|
|
(check-false (at-racket-boundary? (open-input-string "foo$@"))))
|
|
|
|
(define (color-jsonic input-port)
|
|
(define jsonic-lexer
|
|
(lexer
|
|
[(eof) (values lexeme 'eof #f #f #f)]
|
|
["@$" (begin
|
|
(set! in-racket-expr? #t)
|
|
(values lexeme 'parenthesis '|(| (position-offset start-pos) (position-offset end-pos)))]
|
|
["$@" (begin
|
|
(set! in-racket-expr? #f)
|
|
(values lexeme 'parenthesis '|)| (position-offset start-pos) (position-offset end-pos)))]
|
|
[(seq "//" (* (char-complement #\newline)))
|
|
(values lexeme 'comment #f (position-offset start-pos) (position-offset end-pos))]
|
|
[any-char
|
|
(values lexeme 'string #f (position-offset start-pos) (position-offset end-pos))]))
|
|
(if (and in-racket-expr? (not (at-racket-boundary? input-port)))
|
|
(racket-lexer input-port)
|
|
(jsonic-lexer input-port))) |