@@ -1843,7 +1843,9 @@ TODO
18431843 (define name (send definitions-text get-port-name))
18441844 (define settings
18451845 (drracket:language-configuration:language-settings-settings user-language-settings))
1846- (define prog-port (open-input-string (send lang get-auto-text settings) name))
1846+ (define hash-lang-str (or (fetch-hash-lang-str definitions-text)
1847+ (send lang get-auto-text settings)))
1848+ (define prog-port (open-input-string hash-lang-str name))
18471849 (port-count-lines! prog-port)
18481850 (parameterize ([module-language-initial-run #t ])
18491851 (evaluate-from-port
@@ -2416,3 +2418,70 @@ TODO
24162418 (make-object string-snip% "c " ))])
24172419 (check-equal? (simplify-history-element in #t )
24182420 (old-conversion-code in))))
2421+
2422+ (define (fetch-hash-lang-str text)
2423+ (define special-tp (open-input-text-editor text))
2424+ (define (special-filter f bytes)
2425+ ;; @ is not accepted anywhere in the regexp below
2426+ (bytes-set! bytes 0 (char->integer #\@ ))
2427+ 1 )
2428+ (define tp (special-filter-input-port special-tp special-filter))
2429+ (port-count-lines! tp)
2430+ (skip-past-comments tp)
2431+ (define-values (_1 _2 pos-before) (port-next-location tp))
2432+ (cond
2433+ [(regexp-match? #rx"^#lang [a-zA-Z0-9+_/-]+ " tp)
2434+ (define c (peek-char tp))
2435+ (cond
2436+ [(eof-object? c)
2437+ (define-values (line col pos-after) (port-next-location tp))
2438+ (send text get-text (- pos-before 1 ) pos-after)]
2439+ [(char-whitespace? c)
2440+ (define-values (line col pos-after) (port-next-location tp))
2441+ (send text get-text (- pos-before 1 ) (- pos-after 1 ))]
2442+ [else #f ])]
2443+ [else #f ]))
2444+
2445+ (module+ test
2446+ (check-equal? (let ([t (new text%)])
2447+ (send t insert "blah " )
2448+ (fetch-hash-lang-str t))
2449+ #f )
2450+ (check-equal? (let ([t (new text%)])
2451+ (send t insert "#lang racket " )
2452+ (fetch-hash-lang-str t))
2453+ "#lang racket " )
2454+ (check-equal? (let ([t (new text%)])
2455+ (send t insert " #lang racket " )
2456+ (fetch-hash-lang-str t))
2457+ "#lang racket " )
2458+ (check-equal? (let ([t (new text%)])
2459+ (send t insert "#lang racket " )
2460+ (fetch-hash-lang-str t))
2461+ "#lang racket " )
2462+ (check-equal? (let ([t (new text%)])
2463+ (send t insert "#lang racket\n " )
2464+ (fetch-hash-lang-str t))
2465+ "#lang racket " )
2466+ (check-equal? (let ([t (new text%)])
2467+ (send t insert "#lang racket fjd ej ej " )
2468+ (fetch-hash-lang-str t))
2469+ "#lang racket " )
2470+ (check-equal? (let ([t (new text%)])
2471+ (send t insert ";; a\n#lang racket fjd ej ej " )
2472+ (fetch-hash-lang-str t))
2473+ "#lang racket " )
2474+ (check-equal? (let ([t (new text%)])
2475+ (send t insert ";; a " )
2476+ (define es (new editor-snip%))
2477+ (send t insert es)
2478+ (send t insert "\n#lang racket " )
2479+ (fetch-hash-lang-str t))
2480+ "#lang racket " )
2481+ (check-equal? (let ([t (new text%)])
2482+ (send t insert "#lang rac " )
2483+ (define es (new editor-snip%))
2484+ (send t insert es)
2485+ (send t insert "ket\n " )
2486+ (fetch-hash-lang-str t))
2487+ #f ))
0 commit comments