/plan9/acme/Dict/Dict.go

https://code.google.com/p/goplan9/ · Go · 87 lines · 80 code · 7 blank · 0 comment · 23 complexity · f69387069a10c68b9a48ec460dbe32ae MD5 · raw file

  1. package main
  2. import (
  3. "code.google.com/p/go.net/dict"
  4. "flag"
  5. "log"
  6. "code.google.com/p/goplan9/plan9/acme"
  7. )
  8. var dictx = flag.String("d", "", "dictionary")
  9. var server = flag.String("s", "dict.org:dict", "server")
  10. var lookc = make(chan string)
  11. var d *dict.Client
  12. var dicts []dict.Dict
  13. func main() {
  14. w, err := acme.New()
  15. if err != nil {
  16. log.Fatal(err)
  17. }
  18. w.Name("/dict/")
  19. d, err = dict.Dial("tcp", "216.93.242.2:dict")
  20. if err != nil {
  21. w.Write("body", []byte(err.Error()))
  22. return
  23. }
  24. w.Ctl("clean")
  25. go func() {
  26. dicts, err = d.Dicts()
  27. if err != nil {
  28. w.Write("body", []byte(err.Error()))
  29. return
  30. }
  31. for _, dict := range dicts {
  32. w.Fprintf("body", "%s\t%s\n", dict.Name, dict.Desc)
  33. }
  34. }()
  35. for word := range events(w) {
  36. go lookup(word)
  37. }
  38. }
  39. func lookup(word string) {
  40. defs, err := d.Define("!", word)
  41. if err != nil {
  42. log.Print(err)
  43. return
  44. }
  45. for _, def := range defs {
  46. go wordwin(def)
  47. }
  48. }
  49. func wordwin(def *dict.Defn) {
  50. w, err := acme.New()
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. w.Name("/dict/%s/%s", def.Dict.Name, def.Word)
  55. w.Write("body", def.Text)
  56. w.Ctl("clean")
  57. for word := range events(w) {
  58. go lookup(word)
  59. }
  60. }
  61. func events(w *acme.Win) <-chan string {
  62. c := make(chan string, 10)
  63. go func() {
  64. for e := range w.EventChan() {
  65. switch e.C2 {
  66. case 'x', 'X': // execute
  67. if string(e.Text) == "Del" {
  68. w.Ctl("delete")
  69. }
  70. w.WriteEvent(e)
  71. case 'l', 'L': // look
  72. w.Ctl("clean")
  73. c <- string(e.Text)
  74. }
  75. }
  76. w.CloseFiles()
  77. close(c)
  78. }()
  79. return c
  80. }