diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index f2b1d7e..a7f18b2 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -2,6 +2,7 @@ (require racket/class racket/unit racket/file racket/gui/base net/sendurl mrlib/switchable-button mrlib/bitmap-label drracket/tool framework + drracket/private/auto-language "info.rkt" "client.rkt" "this-collection.rkt") (provide tool@) @@ -708,25 +709,6 @@ (define handin-icon (scale-by-half (in-this-collection "icon.png"))) -(define (editors->string editors) - (let* ([base (make-object editor-stream-out-bytes-base%)] - [stream (make-object editor-stream-out% base)]) - (write-editor-version stream base) - (write-editor-global-header stream) - (for ([ed (in-list editors)]) (send ed write-to-file stream)) - (write-editor-global-footer stream) - (send base get-bytes))) - -(define (string->editor! str defs) - (let* ([base (make-object editor-stream-in-bytes-base% str)] - [stream (make-object editor-stream-in% base)]) - (read-editor-version stream base #t) - (read-editor-global-header stream) - (send* defs (begin-edit-sequence #f) - (erase) (read-from-file stream) - (end-edit-sequence)) - (read-editor-global-footer stream))) - (define tool@ (unit (import drracket:tool^) @@ -738,6 +720,56 @@ (dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update) void)) + (define (get-lang-prefix modname editor) + (let* ([lang-settings (send editor get-next-settings)] + [lang (drracket:language-configuration:language-settings-language lang-settings)] + [settings (drracket:language-configuration:language-settings-settings lang-settings)]) + (send lang get-metadata modname settings))) + + (define (with-fake-header editor) + (let ([new-editor (send editor copy-self)] + [text (get-lang-prefix 'handin editor)]) + (when text + (send new-editor set-position 0) + (send new-editor insert-port (open-input-string text))) + new-editor)) + + (define (editors->string definitions interactions) + (let* ([base (make-object editor-stream-out-bytes-base%)] + [stream (make-object editor-stream-out% base)] + [definitions-with-fake-header (with-fake-header definitions)]) + (write-editor-version stream base) + (write-editor-global-header stream) + (for ([ed (in-list (list definitions-with-fake-header interactions))]) (send ed write-to-file stream)) + (write-editor-global-footer stream) + (send base get-bytes))) + + ; Adapted from + ; https://github.com/racket/drracket/blob/a2f8efc910ffd5e0992279ff59bfe7145598d5ba/drracket/drracket/private/unit.rkt#L619-L643 + (define (guess-language defs) + (let-values ([(matching-language settings) + (pick-new-language + defs + (drracket:language-configuration:get-languages) + #f #f)]) + (when matching-language + (send defs set-next-settings + (drracket:language-configuration:language-settings + matching-language + settings) + #f)))) + + (define (string->editor! str defs) + (let* ([base (make-object editor-stream-in-bytes-base% str)] + [stream (make-object editor-stream-in% base)]) + (read-editor-version stream base #t) + (read-editor-global-header stream) + (send* defs (begin-edit-sequence #f) + (erase) (read-from-file stream)) + (guess-language defs) + (send defs end-edit-sequence) + (read-editor-global-footer stream))) + (define tool-button-label (bitmap-label-maker button-label/h handin-icon)) (define (make-new-unit-frame% super%) @@ -793,8 +825,8 @@ [callback (lambda (button) (let ([content (editors->string - (list (get-definitions-text) - (get-interactions-text)))]) + (get-definitions-text) + (get-interactions-text))]) (new handin-frame% [parent this] [content content]