[plt-scheme] GUI editor simple example
What called my attention to PLT scheme was its editor, and unicode processing facilities. I am a very poor writer. Therefore, since I know Ancient Greek, my teachers suggested reading and translating Homer to improve my writing skills. Homer wrote in a kind of language that has many similarities with Ancient Greek. The first step was to write an editor to deal with Homer's language (there aren't many of them around, you know :-) I tried to write the editor in Clean. However, Clean does not deal with Unicode strings at all. I switched to Bigloo. Although Bigloo has tools to work with unicode, these tools are awkward, and I failed.
To my surprise, PLT worked almost flawlessly with the Homeric text. I mean, the IDE didn't work correctly, but the resulting program is almost perfect. Interesting enough, the only charcter that the editor does not renders well is ... lambda, the symbol of functional programming. Below, you will find a simplified version of the module that produces a latex document from a unicode edition of the Odyssey (www.perseus.tufts.edu). Here are the first two lines of the Odyssey, with latex produced by the program:
ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς μάλα πολλὰ
πλάγχθη, ἐπεὶ Τροίης ἱερὸν πτολίεθρον ἔπερσεν:
>'andra moi >'ennepe, mo\~usa, pol'utropon, <`oc m'ala poll`a\\
pl'agqjh, >epe`i Tro'ihc <ier`on ptol'iejron >'epersen;
(module greekfilter scheme/gui
(define (geragreek b n)
(cond ( (< n 1) '())
( (cons (list b (list->string
(list(integer->char b))))
(geragreek (+ b 1) (- n 1))))))
(define (gb b n)
(geragreek b n))
(define gcod
'(
(913 "A") (914 "B") (915 "G") (916 "D")(917 "E")
(918 "Z") (919 "H") (920 "J") (921 "I") (922 "K")
(923 "L") (924 "M") (925 "N") (926 "X") (927 "O")
(928 "P") (929 "R") (931 "S") (932 "T") (933 "U")
(934 "F") (935 "X") (936 "Y") (937 "W")
(945 "a") (946 "b") (947 "g") (948 "d") (949 "e")
(950 "z") (951 "h") (952 "j") (953 "i") (954 "k")
(955 "l") (956 "m") (957 "n") (958 "x") (959 "o")
(960 "p") (961 "r") (962 "c") (963 "s") (964 "t")
(965 "u") (966 "f") (967 "q") (968 "y") (969 "w")
;; ἀἁἂἃ ἄἅἆἇ ἈἉἊἋ ἌἍἎἏ
(7936 ">a") (7937 "<a") (7938 ">`a") (7939 "<`a")
(7940 ">'a") (7941 "<'a") (7942 "{\\char 146}")
(7943 "\\char 145")
(7944 ">A") (7945 "<A") (7946 ">`A") (7947 "<'A")
(7948 ">'A") (7949 "<'A") (7950 "\\~>A") (7951 "\\~<A")
;; ἐἑἒ ἓἔἕ
(7952 ">e") (7953 "<e") (7954 ">`e")
(7955 "<`e") (7956 ">'e") (7957 "<'e")
;; ἘἙἚ ἛἜἝ
(7960 ">E") (7961 "<E") (7962 ">`E") (7963 "<`E") (7964 ">'E") (7965 "<'E")
;; ἠἡἢἣ ἤἥἦἧ ἨἩἪἫ ἬἭἮἯ
(7968 ">h") (7969 "<h") (7970 ">`h") (7971 "<`h")
(7972 ">'h") (7973 "<'h") (7974 "{\\ese}") (7975 "{\\hee}")
(7976 ">H") (7977 "<H") (7978 ">`H") (7979 "<`H")
(7980 ">'H") (7981 "<'H") (7982 "\\~>H")
(7983 "\\~<H")
;;
(8032 ">w") (8033 "<w") (8034 ">`w") (8035 "<`w")
(8036 ">'w") (8037 "<'w") (8038 "{\\w}") (8039 "{\\hw}")
(8040 ">W") (8041 "<W") (8042 ">`W") (8043 "<`W")
(8044 ">'W") (8045 "<'W") (8046 "\\~>W") (8047 "\\~<W")
(8000 ">o") (8001 "<o") (8002 ">`o") (8003 "<`o")(8004 ">'o")(8005 "<'o")
(8008 ">O")(8009 "<O") (8010 ">`O") (8011 "<`O") (8012 ">'O") (8013 "<'O")
(8016 ">u") (8017 "<u") (8018 ">`u") (8019 "<`u") (8020 ">'u") (8021 "<'u")
(8022 "{\\usu}") (8023 "{\\huu}") (8025 "<U")(8027 "<`U")(8029 "<'U")
(8031 "\\~<U") (8160 "\\u u") (8161 "\\=u")
(8162 "`u"); ῢ
(8163 "'u"); ΰ
(8164 ">r") (8165 "<r") (8166 "\\~u")
(8167 "\\~u") ;ῧ
(8168 "U") ; Ῠ
(8169 "U") ; Ῡ
(8170 "`U") (8171 "'U") (8172 "<R") (8048 "`a") (8049 "'a") (8050 "`e")
(8051 "'e") (8052 "`h") (8053 "'h") (8054 "`i") (8055 "'i") (8056 "`o")
(8057 "'o") (8058 "`u") (8059 "'u") (8060 "`w") (8061 "'w") (7984 ">i")
(7985 "<i") (7986 ">`i") (7987 "<`i") (7988 ">'i")
(7989 "<'i") (7990 "{\\ii}") (7991 "{\\hii}") (7992 ">I")
(7993 "<I") (7994 ">`I") (7995 "<`I") (7996 ">'I")
(7997 "<'I") (7998 "\\~>") (7999 "\\~<") (8125 "\\e")
(8178 "`w|") (8179 "w|") (8180 "'w|") (8182 "\\~w")
(8183 "{\\wi}") (8184 "`O") (8185 "'O") (8186 "`W")
(8187 "'W") (8188 "Wi") (8128 "\\~") (8130 "`h|")
(8131 "h|") (8132 "'h|") (8134 "\\~h") (8135 "{\\eei}")
(8136 "`E") (8137 "'E") (8138 "`H") (8139 "'H")
(8140 "Hi") (8141 "{>`}") (8142 "{>'}") (8143 "\\~>") (8144 "{\\u i}")
(8145 "{\\=i}")
(8146 "`i") ;;ῒ
(8147 "'i") ;;ΐ
(8150 "\\~i")
(8151 "\\~i") ;;ῗ
(8152 "I") ;;Ῐ
(8153 "\\=I") ;;Ῑ
(8154 "`I") (8155 "'I")
(8220 "{\\oq}") (8221 "{\\cq}") (8064 ">a|") (8065 "<a|")
(8066 ">`a|") (8067 "<`a|") (8068 ">'a|") (8069 "<'a|")
(8070 "{\\char 150}") (8071 "{\\char 149}")
(8080 ">h|") (8081 "<h|") (8082 ">`h|") (8083 "<`h|")
(8084 ">'h|") (8085 "<'h|") (8086 "{\\esei}") (8087 "{\\heei}")
(8096 ">w|") (8097 "<w|") (8098 ">`w|") (8099 "<`w|")
(8100 ">'w|") (8101 "<'w|") (8102 "{\\wswi}") (8103 "{\\hwi}")
(8104 ">Wi") (8105 "<Wi") (8106 ">`Wi") (8107 "<`Wi")
(8108 ">'Wi") (8109 "<'Wi") (8110 "\\~>Wi") (8111 "\\~<Wi")
(8112 "\\u a") (8113 "\\=a") (8114 "`a|") (8115 "a|")
(8116 "'a|") (8118 "\\~a") (8119 "{\\ai")
(8122 "`A") (8123 "'A") (970 "{\\\"i}")
)
)
(define (convert1 c)
(cond ( (equal? c #\newline) "\\\\\n")
( (equal? c #\:) ";")
( (< (char->integer c) 255) c)
(else (let ((x (assoc (char->integer c) gcod)))
(if x (cadr x) "*"))) ))
(define diálogo
(new dialog% (label "GreekFilter")))
(define txt
(new text%))
(define edtxt
(new editor-canvas% [parent diálogo]
[editor txt]
(min-height 200)
(min-width 500)))
(define painel (new horizontal-panel% [parent diálogo]
(alignment '(center center))))
(define pasteButton
(new button% [parent painel] (label "Paste")
(callback (lambda(b e) (send txt paste )))))
(define cpyButton
(new button% [parent painel] (label "Cut")
(callback (lambda(b e) (send txt cut )))))
(define (convert b e)
(send txt insert
(with-output-to-string
(lambda()
(let ((s (send txt get-text)))
(newline)(newline)
(do ( (i 0 (+ i 1)))
( (>= i (string-length s)))
(display (convert1 (string-ref s i)))))))))
(define prtFirst
(new button% [parent painel] (label "2TEX")
(callback convert)))
(send diálogo show #t)
)
--- On Sat, 7/4/09, Matthew Flatt <mflatt at cs.utah.edu> wrote:
From: Matthew Flatt <mflatt at cs.utah.edu>
Subject: Re: [plt-scheme] GUI editor simple example
To: "Hugh Myers" <hsmyers at gmail.com>
Cc: plt-scheme at list.cs.brown.edu
Received: Saturday, July 4, 2009, 7:47 AM
At Sat, 4 Jul 2009 01:44:42 -0600, Hugh Myers wrote:
> Given:
>
> (define f (new frame% [label "Simple Edit"]
> [width 200]
> [height 200]))
> (define c (new editor-canvas% [parent f]))
> (define t (new text%))
> (send c set-editor t)
>
> How do I control the initial font?
Setting the font is more complicated than it should be. You have to
create a `style-delta%' (which has a poor API), and then apply the
style delta with `change-style'.
For example, to change the font to size 20:
(send t change-style (make-object style-delta% 'change-size 20))
To set the font to "Times":
(send t change-style (send (make-object style-delta%)
set-delta-face "Times"))
> How do I insert a line of text?
(send t insert "Hello\n")
> Lines?
(send t insert "Hello\n")
(send t insert "Goodbye\n")
_________________________________________________
For list-related administrative tasks:
http://list.cs.brown.edu/mailman/listinfo/plt-scheme
__________________________________________________________________
Looking for the perfect gift? Give the gift of Flickr!
http://www.flickr.com/gift/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090704/195a0547/attachment.html>