From 73e59188a7fb70d83ae8614d90fe2193dff5bcf8 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Mon, 28 May 2018 23:25:21 -0700 Subject: [PATCH] indenter --- brag/brag/codegen/reader.rkt | 1 + brag/brag/private/indenter.rkt | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 brag/brag/private/indenter.rkt diff --git a/brag/brag/codegen/reader.rkt b/brag/brag/codegen/reader.rkt index c4f35f4..36dd5db 100755 --- a/brag/brag/codegen/reader.rkt +++ b/brag/brag/codegen/reader.rkt @@ -61,6 +61,7 @@ brag/codegen/sexp-based-lang (define (my-get-info key default default-filter) (case key [(color-lexer) (dynamic-require 'brag/private/colorer 'color-brag (λ () #f))] + [(drracket:indentation) (dynamic-require 'brag/private/indenter 'indent-brag (λ () #f))] [else (default-filter key default)])) diff --git a/brag/brag/private/indenter.rkt b/brag/brag/private/indenter.rkt new file mode 100644 index 0000000..bec7b8c --- /dev/null +++ b/brag/brag/private/indenter.rkt @@ -0,0 +1,32 @@ +#lang racket/base +(require racket/class) +(provide indent-brag) + +(define (line text pos) + (send text position-line pos)) + +(define (previous-line text pos) + (define this-line (line text pos)) + (and (positive? this-line) (sub1 this-line))) + +(define (line-first-visible-char text line) + (define (char text pos) (and pos (send text get-character pos))) + (char text (for*/first ([pos (in-range (send text line-start-position line) + (send text line-end-position line))] + [c (in-value (char text pos))] + #:unless (char-blank? c)) + pos))) + +(define (indent-brag tbox [posn 0]) + (define prev-line (previous-line tbox posn)) + (define this-line (line tbox posn)) + (cond + [(not prev-line) #f] + [(char=? (line-first-visible-char tbox this-line) #\|) + (define start (send tbox line-start-position prev-line)) + (define end (send tbox line-end-position prev-line)) + (for*/first ([pos (in-range start end)] + [c (in-value (send tbox get-character pos))] + #:when (or (char=? c #\:) (char=? c #\|))) + (- pos start))] + [else #f])) \ No newline at end of file