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/colorer.rkt

40 lines
1.3 KiB
Racket

#lang br
7 years ago
(require brag/support syntax-color/racket-lexer racket/contract)
(define in-racket-expr? #f)
8 years ago
(define/contract (color-jsonic port)
7 years ago
(input-port? . -> . (values
(or/c string? eof-object?)
8 years ago
symbol?
(or/c symbol? #f)
(or/c exact-positive-integer? #f)
(or/c exact-positive-integer? #f)))
(define jsonic-lexer
(lexer
[(eof) (values lexeme 'eof #f #f #f)]
["@$" (begin
(set! in-racket-expr? #t)
8 years ago
(values lexeme 'parenthesis '|(|
(pos lexeme-start) (pos lexeme-end)))]
["$@" (begin
(set! in-racket-expr? #f)
8 years ago
(values lexeme 'parenthesis '|)|
(pos lexeme-start) (pos lexeme-end)))]
[(from/to "//" "\n")
7 years ago
(values lexeme 'comment #f
(pos lexeme-start) (pos lexeme-end))]
[any-char
7 years ago
(values lexeme 'string #f
(pos lexeme-start) (pos lexeme-end))]))
8 years ago
(if (and in-racket-expr?
(not (equal? (peek-string 2 0 port) "$@")))
8 years ago
(racket-lexer port)
(jsonic-lexer port)))
8 years ago
(provide color-jsonic)
(module+ test
(require rackunit)
7 years ago
(check-equal? (values->list
(color-jsonic (open-input-string "x")))
8 years ago
(list "x" 'string #f 1 2)))