From 6a340b9a13049e9836312653e185bfb8f3762c1d Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Thu, 10 Sep 2015 18:13:32 +0200 Subject: [PATCH 1/7] Refactor: move editors->string Now this is where drracket:tool^ is available. --- handin-client/client-gui.rkt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index f2b1d7e..49f9d90 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -708,15 +708,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)]) @@ -738,6 +729,15 @@ (dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update) void)) + (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 tool-button-label (bitmap-label-maker button-label/h handin-icon)) (define (make-new-unit-frame% super%) From 5a844d3c0ebb22b3dcc1ddf51dad669be8b145e9 Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Thu, 10 Sep 2015 14:13:08 +0200 Subject: [PATCH 2/7] Refactoring: specialize API Now editors->string knows it's only ever called with two arguments. --- handin-client/client-gui.rkt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index 49f9d90..24c85eb 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -729,12 +729,12 @@ (dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update) void)) - (define (editors->string editors) + (define (editors->string definitions interactions) (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)) + (for ([ed (in-list (list definitions interactions))]) (send ed write-to-file stream)) (write-editor-global-footer stream) (send base get-bytes))) @@ -793,8 +793,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] From 85a04ac921998d92662729d4ff0f19a9ba9817ab Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Mon, 7 Sep 2015 22:23:26 +0200 Subject: [PATCH 3/7] Hand in language info Fix plt/handin#17 by loading the language metadata from the DrRacket configuration and prepending it to a clone of the definitions editor before serializing this clone. Warning: This hard-codes the module name to `'handin`, which doesn't sound very good. --- handin-client/client-gui.rkt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index 24c85eb..c056053 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -729,12 +729,27 @@ (dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update) void)) + (define (get-lang-prefix modname) + (let* ([pref (preferences:get (drracket:language-configuration:get-settings-preferences-symbol))] + [lang (drracket:language-configuration:language-settings-language pref)] + [settings (drracket:language-configuration:language-settings-settings pref)]) + (send lang get-metadata modname settings))) + + (define (with-fake-header editor) + (let ([new-editor (send editor copy-self)] + [text (get-lang-prefix 'handin)]) + (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)]) + [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 interactions))]) (send ed write-to-file 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))) From bf7341c5e91e004fce60efcdd6587ab4ceddff78 Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Sun, 4 Oct 2015 20:42:58 +0200 Subject: [PATCH 4/7] Refactor new code --- handin-client/client-gui.rkt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index c056053..4dcc59c 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -730,9 +730,9 @@ void)) (define (get-lang-prefix modname) - (let* ([pref (preferences:get (drracket:language-configuration:get-settings-preferences-symbol))] - [lang (drracket:language-configuration:language-settings-language pref)] - [settings (drracket:language-configuration:language-settings-settings pref)]) + (let* ([lang-settings (preferences:get (drracket:language-configuration:get-settings-preferences-symbol))] + [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) From 1348760243d9b989acb8a71d8a6f7a8f82652960 Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Sun, 4 Oct 2015 20:44:15 +0200 Subject: [PATCH 5/7] Get language header correctly --- handin-client/client-gui.rkt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index 4dcc59c..9d2c614 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -729,15 +729,15 @@ (dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update) void)) - (define (get-lang-prefix modname) - (let* ([lang-settings (preferences:get (drracket:language-configuration:get-settings-preferences-symbol))] + (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)]) + [text (get-lang-prefix 'handin editor)]) (when text (send new-editor set-position 0) (send new-editor insert-port (open-input-string text))) From 9bc3bc78c9cdec531a1fd17a8c459d6bf6310627 Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Sun, 4 Oct 2015 23:27:03 +0200 Subject: [PATCH 6/7] Refactor: move string->editor! in unit scope --- handin-client/client-gui.rkt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index 9d2c614..ae7303c 100644 --- a/handin-client/client-gui.rkt +++ b/handin-client/client-gui.rkt @@ -708,16 +708,6 @@ (define handin-icon (scale-by-half (in-this-collection "icon.png"))) -(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^) @@ -753,6 +743,16 @@ (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-button-label (bitmap-label-maker button-label/h handin-icon)) (define (make-new-unit-frame% super%) From 638aba20999c9f35c4e19d5b5f0a03827f4a8ed6 Mon Sep 17 00:00:00 2001 From: "Paolo G. Giarrusso" Date: Sun, 4 Oct 2015 23:50:06 +0200 Subject: [PATCH 7/7] Restore language on retrieval This uses many internal APIs, but I don't see how to do that otherwise. I already simplified significantly the code (as done elsewhere in the handin-client), removing various calls to internal APIs in the process. --- handin-client/client-gui.rkt | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/handin-client/client-gui.rkt b/handin-client/client-gui.rkt index ae7303c..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@) @@ -743,14 +744,30 @@ (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) - (end-edit-sequence)) + (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))