home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 2 / amigaformatcd02.iso / pd / text / alphaspell_suite / aspellgui / rexx / golded / aspell.ged
Encoding:
Text File  |  1996-05-20  |  17.7 KB  |  554 lines

  1. /**************************************************************************/
  2. /* $VER: ASpell.ged 1.6 (12 Mar 1996)                                     */
  3. /* The AlphaSpell GUI © Copyright Fergus Duniho 1995-6                    */
  4. /**************************************************************************/
  5.  
  6. OPTIONS RESULTS
  7. OPTIONS FAILAT 20
  8. SIGNAL ON SYNTAX
  9. SIGNAL ON FAILURE
  10.  
  11. CALL OpenLib("rexxsupport.library")
  12. CALL OpenLib("rexxtricks.library")
  13. CALL OpenLib("rexxreqtools.library")
  14.  
  15. EditPort = GetEditPort()
  16. IF EditPort ~= "" THEN ADDRESS VALUE EditPort
  17. 'LOCK' /* GOLDED SPECIFIC*/
  18. PSC = GetScreen()
  19.  
  20. tempfile = "T:Temp" || TIME(s)
  21. GUI = GetENV("ENV:ASpellGUI")
  22. rttags = "rt_pubscrname =" PSC
  23. win.title = "Select a Word:"
  24. win.gadgettext = "_Accept|_Cancel"
  25. win.pubscreen = PSC
  26. win.width = 40
  27. win.sort = "FALSE"
  28. win.multiselect = "FALSE"
  29.  
  30. CALL Spellcheck()
  31. CALL Cleanup()
  32. 'UNLOCK' /* GOLDED SPECIFIC */
  33. EXIT
  34.  
  35. /**************************************************************************/
  36. /* Spellcheck() -- The MAIN routine                                       */
  37. /**************************************************************************/
  38.  
  39. Spellcheck:
  40.  
  41. /**************************************************************************/
  42. /* Launch Varexx                                                          */
  43. /**************************************************************************/
  44.  
  45. /* Check Varexx is loaded if not load it */
  46.  
  47. IF SHOW("P","VAREXX") ~= 1 THEN DO
  48.     ADDRESS COMMAND "run >NIL: varexx"
  49.     ADDRESS COMMAND "WaitForPort VAREXX"
  50. END
  51. ADDRESS VAREXX
  52.  
  53. IF OPENPORT("HOLLY") = 0 THEN DO
  54.     CALL rtezrequest "Could not open a port.", "_Abort", "Varexx Error:", rttags
  55.     RETURN
  56. END
  57. version
  58. IF RESULT < 1.6 THEN DO
  59.     CALL rtezrequest "You need version 1.6+ of Varexx", "_Okay", "Varexx Error:", rttags
  60.     RETURN
  61. END
  62. "load" GUI "HOLLY PS" PSC
  63. vhost = RESULT
  64. ADDRESS
  65. ADDRESS VALUE vhost
  66.  
  67. /**************************************************************************/
  68. /* Localize gadget text for chosen language                               */
  69. /**************************************************************************/
  70.  
  71. lang = GetENV("language")
  72. IF lang ~= "" & lang ~= "english" THEN DO
  73.     catalog = "SYS:Catalogs/ASpell." || lang
  74.     CALL READFILE catalog, lines
  75.     DO x = 1 to lines.0
  76.         INTERPRET "setlabel" "'"lines.x"'"
  77.     END
  78. END
  79.  
  80. /**************************************************************************/
  81. /* Show About screen while AlphaSpell checks document.                    */
  82. /**************************************************************************/
  83.  
  84. show about
  85. CALL ReadPrefs()
  86. CALL SaveTemp()
  87.  
  88. /**************************************************************************/
  89. /* Spell check tempfile with AlphaSpell                                   */
  90. /**************************************************************************/
  91.  
  92. ADDRESS COMMAND "AlphaSpell -Ss" tempfile "-o" tempfile "-d" dict_path dict_list
  93.  
  94. /**************************************************************************/
  95. /* Set Lists                                                              */
  96. /**************************************************************************/
  97.  
  98. CALL ReadList "UNFOUND"
  99. IF UNFOUND.0 = 0 THEN DO
  100.     CALL rtezrequest "No misspellings found.", "_Exit", "Spell Checked Finished:", rttags
  101.     RETURN
  102. END
  103. current = 1
  104. LWORDS.0 = 0
  105. MWORDS.0 = 0
  106.  
  107. hide
  108. show main
  109. window front activate
  110. CALL SetTarget UNFOUND.1
  111.  
  112. /**************************************************************************/
  113. /* MAIN LOOP -- Check for GUI events                                      */
  114. /**************************************************************************/
  115.  
  116. DO FOREVER
  117.     CALL WAITPKT("HOLLY")
  118.     packet = GETPKT("HOLLY")
  119.     IF packet ~= '00000000'x THEN DO
  120.         class = GETARG(packet)
  121.         SELECT
  122.             WHEN class = "CLOSEWINDOW" THEN LEAVE
  123.             WHEN class = "LEARN" THEN CALL Learn()
  124.             WHEN class = "FIND" THEN flag = FindWord(flag)
  125.             WHEN class = "REPLACE" THEN CALL ReplaceWord()
  126.             WHEN class = "ANAGRAMS" THEN CALL ASearch("A")
  127.             WHEN class = "GUESS" THEN CALL ASearch("G")
  128.             WHEN class = "NEXT" THEN CALL SetTarget("+1")
  129.             WHEN class = "PREV" THEN CALL SetTarget("-1")
  130.             WHEN class = "FIRST" THEN CALL SetTarget(1)
  131.             WHEN class = "LAST" THEN CALL SetTarget(UNFOUND.0)
  132.             WHEN class = "SELECT" THEN CALL ChooseWord()
  133.             WHEN class = "PREFS" THEN DO
  134.                 CALL Preferences()
  135.                 CALL SetTarget(current)
  136.             END
  137.             OTHERWISE NOP
  138.         END
  139.         window front activate
  140.     END
  141. END
  142. IF LWORDS.0 + MWORDS.0 > 0 THEN DO
  143.     hide
  144.     show learn
  145.     CALL QSORT "LWORDS"
  146.     LWORDS.count = LWORDS.0
  147.     setlist lwords clear stem LWORDS select LWORDS.1
  148.     CALL QSORT "MWORDS"
  149.     MWORDS.count = MWORDS.0
  150.     setlist mwords clear stem MWORDS select MWORDS.1
  151.     DO FOREVER
  152.         CALL WAITPKT("HOLLY")
  153.         packet = GETPKT("HOLLY")
  154.         IF packet ~= '00000000'x THEN DO
  155.             class = GETARG(packet)
  156.             SELECT
  157.                 WHEN class = "CLOSEWINDOW" THEN LEAVE
  158.                 WHEN class = "SAVEWORDS" THEN DO
  159.                     CALL SaveList()
  160.                     LEAVE
  161.                 END
  162.                 WHEN class = "MOVE" THEN CALL Move()
  163.                 WHEN class = "RML" THEN CALL Lose("lwords")
  164.                 WHEN class = "RMM" THEN CALL Lose("mwords")
  165.                 OTHERWISE NOP
  166.             END
  167.             window front activate
  168.         END
  169.     END
  170. END
  171. ADDRESS
  172. RETURN
  173.  
  174. /**************************************************************************/
  175. /* VARIOUS SUBROUTINES                                                    */
  176. /**************************************************************************/
  177.  
  178. /**************************************************************************/
  179. /* SetTarget(word) -- Sets the word in the target string gadget           */
  180. /**************************************************************************/
  181.  
  182. SetTarget:
  183. IF DATATYPE(arg(1)) = "NUM" THEN DO
  184.     IF VERIFY(arg(1), "+-", "M") = 1 THEN current = current + arg(1)
  185.     ELSE current = arg(1)
  186.     IF current < 1 THEN current = UNFOUND.0
  187.     IF current > UNFOUND.0 THEN current = 1
  188.     settext target UNFOUND.current
  189.     settext replacement UNFOUND.current
  190. END
  191. ELSE DO
  192.     settext target arg(1)
  193.     settext replacement arg(1)
  194. END
  195. flag = 0 /* Word hasn't been searched for since selection */
  196. RETURN
  197.  
  198. /**************************************************************************/
  199. /* SetReplace() - Sets replacement string gadget                          */
  200. /**************************************************************************/
  201.  
  202. SetReplace:
  203. settext replacement arg(1)
  204. settext target UNFOUND.current
  205. RETURN
  206.  
  207. /**************************************************************************/
  208. /* Learn() -- Adds a word to LEARN, the words to learn list               */
  209. /**************************************************************************/
  210.  
  211. Learn:
  212. read target
  213. wrd = RESULT
  214. /* Tests whether wrd is lowercase */
  215. IF BITOR(wrd,," ") == wrd THEN DO
  216.     IF LSEARCH(wrd, "LWORDS") == -1 THEN DO
  217.         cnt = LWORDS.0 + 1
  218.         LWORDS.0 = cnt
  219.         LWORDS.cnt = wrd
  220.     END
  221. END
  222. ELSE DO
  223.     cur = LSEARCH(wrd, "MWORDS")
  224.     DO WHILE (MWORDS.cur = wrd) & (MWORDS.cur ~== wrd)
  225.         cur = cur + 1
  226.     END
  227.     IF cur == -1 THEN DO
  228.         cnt = MWORDS.0 + 1
  229.         MWORDS.0 = cnt
  230.         MWORDS.cnt = wrd
  231.     END
  232. END
  233. CALL SetTarget("+1")
  234. RETURN
  235.  
  236. /**************************************************************************/
  237. /* ASearch(mode) has AlphaSpell search for anagrams, matches, or guesses  */
  238. /**************************************************************************/
  239.  
  240. ASearch:
  241. ARG mode /* G = Guess, A = Anagrams, P = Pattern Match" */
  242. busy set
  243. read replacement
  244. targ = RESULT
  245. IF VERIFY(target, "[]!^*?\", "M") > 0 THEN mode = "P"
  246. com = "AlphaSpell -" || mode "-d" dict_path "-w" targ "-n" edit_dist "-o" tempfile "-k" keyfile dict_list
  247. ADDRESS COMMAND com
  248. CALL ReadList "GUESS"
  249. busy
  250. IF GUESS.0 > 0 THEN DO
  251.     IF VIEWLIST("GUESS", "win", "dest") = 1 THEN CALL SetReplace(dest.1)
  252. END
  253. ELSE CALL rtezrequest "No match found.", "_Continue", "Search Complete:", rttags
  254. RETURN
  255.  
  256. /**************************************************************************/
  257. /* ChooseWord() -- Select word from listview of unfound words             */
  258. /**************************************************************************/
  259.  
  260. ChooseWord:
  261. IF VIEWLIST("UNFOUND", "win", "dest") = 1 THEN CALL SetTarget(dest.1)
  262. IF dest.1 ~= "" THEN DO
  263.     current = LSEARCH(dest.1, "UNFOUND")
  264.     uwrd = UPPER(dest.1)
  265.     DO WHILE (UPPER(UNFOUND.current) = uwrd) & (UNFOUND.current ~= dest.1)
  266.         current = current + 1
  267.     END
  268. END
  269. RETURN
  270.  
  271. /**************************************************************************/
  272. /* SaveList() -- Saves words in the "LEARN" list to user dictionary       */
  273. /**************************************************************************/
  274.  
  275. SaveList:
  276. udict.low = MAKEPATH(dict_path, user_dict || ".low")
  277. udict.mix = MAKEPATH(dict_path, user_dict || ".mix")
  278. read lwords LEARN
  279. LEARN.0 = LEARN.count
  280. IF LEARN.0 > 0 THEN DO
  281.     CALL WRITEFILE tempfile, "LEARN"
  282.     com = "AlphaSpell -Lco" udict.low tempfile
  283.     IF Exists(udict.low) THEN com = com udict.low
  284.     ADDRESS COMMAND com
  285. END
  286. read mwords LEARN
  287. LEARN.0 = LEARN.count
  288. IF LEARN.0 > 0 THEN DO
  289.     CALL WRITEFILE tempfile, "LEARN"
  290.     com = "AlphaSpell -Lco" udict.mix tempfile
  291.     IF Exists(udict.mix) THEN com = com udict.mix
  292.     ADDRESS COMMAND com
  293. END
  294. CALL DELETE tempfile
  295. RETURN
  296.  
  297. /**************************************************************************/
  298. /* Move() -- Moves word from mixed case listview to lowercase listview    */
  299. /**************************************************************************/
  300.  
  301. Move:
  302. setlist lwords BITOR(Lose("mwords"),," ")
  303. RETURN
  304.  
  305. /**************************************************************************/
  306. /* ReadList -- Reads words from tempfile to a list and sorts the list     */
  307. /**************************************************************************/
  308.  
  309. ReadList:
  310. CALL READFILE tempfile, arg(1)
  311. INTERPRET arg(1) || ".count =" arg(1) || ".0"
  312. CALL QSORT arg(1)
  313. RETURN
  314.  
  315. /**************************************************************************/
  316. /* Lose() -- Deletes a word from a listview                               */
  317. /**************************************************************************/
  318.  
  319. Lose:
  320. INTERPRET "read" arg(1) boo
  321. wrd = RESULT
  322. INTERPRET "setlist" arg(1) "wrd del"
  323. item = boo.select
  324. IF item = boo.count THEN item = item - 1
  325. INTERPRET "setlist" arg(1) "select s update" item
  326. RETURN wrd
  327.  
  328. /**************************************************************************/
  329. /* Preferences() -- Preferences GUI                                       */
  330. /**************************************************************************/
  331.  
  332. Preferences:
  333. hide
  334. show prefs
  335. settext dir dict_path
  336. settext dict dict_list
  337. settext udict user_dict
  338. setnum ed edit_dist
  339. settext key keyfile
  340. IF ~EXISTS(keyfile) THEN setbar ed max 2
  341. DO FOREVER
  342.     CALL WAITPKT("HOLLY")
  343.     packet = GETPKT("HOLLY")
  344.     IF packet ~= '00000000'x THEN DO
  345.         class = GETARG(packet)
  346.         SELECT
  347.             WHEN class = "CLOSEWINDOW" | class = "CANCEL" THEN LEAVE
  348.             WHEN class = "SAVE" | class = "USE" THEN DO
  349.                 read dir
  350.                 dict_path = RESULT
  351.                 read dict
  352.                 dict_list = RESULT
  353.                 read udict
  354.                 user_dict = RESULT
  355.                 read ed
  356.                 edit_dist = RESULT
  357.                 read key
  358.                 keyfile = RESULT
  359.                 CALL WritePrefs "ENV:ASpell.prefs"
  360.                 IF class = "SAVE" THEN CALL WritePrefs "ENVARC:ASpell.prefs"
  361.                 LEAVE
  362.             END
  363.             OTHERWISE NOP
  364.         END
  365.     END
  366. END
  367. hide
  368. show main
  369. RETURN
  370.  
  371. /**************************************************************************/
  372. /* WritePrefs() -- Writes Preferences to a file                           */
  373. /**************************************************************************/
  374.  
  375. WritePrefs:
  376. IF OPEN(output, arg(1), "W") = 1 THEN DO
  377.     CALL WRITELN output, dict_path
  378.     CALL WRITELN output, dict_list
  379.     CALL WRITELN output, user_dict
  380.     CALL WRITELN output, edit_dist
  381.     CALL WRITELN output, keyfile
  382.     CALL CLOSE output
  383. END
  384. RETURN
  385.  
  386. /**************************************************************************/
  387. /* ReadPrefs() -- Read Preferences from ENV:ASpell.prefs or use defaults  */
  388. /**************************************************************************/
  389.  
  390. ReadPrefs:
  391. CALL READFILE "ENV:ASpell.prefs", "PREFS"
  392. fields = 5
  393. IF PREFS.0 >= 1 & PREFS.0 <= fields THEN dict_path = PREFS.1
  394. ELSE dict_path = "Work:AlphaSpell/English/"
  395. IF PREFS.0 >= 2 & PREFS.0 <= fields THEN dict_list = PREFS.2
  396. ELSE dict_list = "*.low *.mix"
  397. IF PREFS.0 >= 3 & PREFS.0 <= fields THEN user_dict = PREFS.3
  398. ELSE user_dict = "User"
  399. IF PREFS.0 >= 4 & PREFS.0 <= fields THEN edit_dist = PREFS.4
  400. ELSE edit_dist = 0
  401. IF PREFS.0 >= 5 & PREFS.0 <= fields THEN keyfile = PREFS.5
  402. ELSE keyfile = "S:Alpha-Key"
  403. IF PREFS.0 ~= fields THEN DO
  404.     CALL Preferences()
  405.     show about
  406. END
  407. RETURN
  408.  
  409. /**************************************************************************/
  410. /* Cleanup() -- Closes down the GUI                                       */
  411. /**************************************************************************/
  412.  
  413. Cleanup:
  414. IF SHOWLIST("P", "HOLLY") = 1 THEN CALL CLOSEPORT ("HOLLY")
  415. IF SHOWLIST("P", "VAREXX") = 1 THEN ADDRESS "VAREXX" hide unload
  416. RETURN
  417.  
  418. /**************************************************************************/
  419. /* OpenLib(library) -- Checks that library exists and opens it if it does */
  420. /**************************************************************************/
  421.  
  422. OpenLib: PROCEDURE
  423.  
  424. IF EXISTS("libs:" || arg(1)) THEN DO
  425.     IF ~SHOW("L", arg(1)) THEN
  426.         IF ~ADDLIB(arg(1),0,-30,0) THEN EXIT
  427. END
  428. ELSE EXIT
  429. RETURN
  430.  
  431. /**************************************************************************/
  432. /* ERROR MESSAGES                                                         */
  433. /**************************************************************************/
  434.  
  435. failure:
  436. syntax:
  437. SAY "Error" rc  "-- Line" SIGL
  438. SAY errortext(rc)
  439. SAY sourceline(SIGL)
  440. CALL Cleanup()
  441. EXIT
  442.  
  443. /**************************************************************************/
  444. /* Functions to get around the limits of some text editors. You might or  */
  445. /* might not need some of these.                                          */
  446. /**************************************************************************/
  447.  
  448. /**************************************************************************/
  449. /* Replace(word, target, replacement)                                     */
  450. /**************************************************************************/
  451.  
  452. Replace: PROCEDURE
  453. PARSE ARG word, target, repl
  454. start = 1
  455. size = Length(target)
  456. DO WHILE start < Length(word)
  457.     x = Pos(target, word, start)
  458.     IF x == 0 THEN LEAVE
  459.     word = Delstr(word, x, size)
  460.     word = Insert(repl, word, x-1)
  461.     start = x + size + 1
  462. END
  463. RETURN word
  464.  
  465. /**************************************************************************/
  466. /* WordComp(string, word) -- Checks whether a target word can be parsed   */
  467. /* from a given string. This is useful if your text editor lacks a whole  */
  468. /* word search mode. You can search for a word, read the full text of the */
  469. /* found string, and compare them.                                        */
  470. /**************************************************************************/
  471.  
  472. WordComp: PROCEDURE
  473. Parse Arg str, wrd, x
  474. s = Index(str, wrd, x)
  475. IF s = 0 THEN RETURN 0
  476. IF s>1 THEN DO
  477.     c = Substr(str, s-1, 1)
  478.     IF Datatype(c, "A") = 1 | c = "'" THEN RETURN 0
  479. END
  480. s = s + Length(wrd)
  481. IF s > Length(str) THEN RETURN 1
  482. c = Substr(str, s, 1)
  483. IF Datatype(c, "M") = 1 THEN RETURN 0
  484. RETURN 1
  485. END
  486.  
  487. /**************************************************************************/
  488. /* EDITOR SPECIFIC SUBROUTINES                                            */
  489. /**************************************************************************/
  490.  
  491. /**************************************************************************/
  492. /* FindWord() -- Finds selected word in document                          */
  493. /**************************************************************************/
  494.  
  495. FindWord: PROCEDURE
  496. read target
  497. wrd = RESULT /* Reads find word */
  498. ADDRESS
  499. IF arg(1) = 0 THEN DO
  500.     'FIND STRING' wrd 'FIRST CASE true WORDS true'
  501. END
  502. ELSE DO
  503.     'FIND STRING' wrd 'NEXT CASE true WORDS true'
  504. END
  505. ADDRESS
  506. RETURN 1
  507.  
  508. /**************************************************************************/
  509. /* ReplaceWord() -- Replaces selected word with word in string gadget     */
  510. /**************************************************************************/
  511.  
  512. ReplaceWord:
  513. read target
  514. wrd = RESULT
  515. read replacement
  516. newword = RESULT
  517. ADDRESS
  518. 'REPLACE BY' newword 'STRING' wrd 'NEXT'
  519. ADDRESS
  520. RETURN
  521.  
  522. /**************************************************************************/
  523. /* SaveTemp() -- Saves the current file as a temporary file               */
  524. /**************************************************************************/
  525.  
  526. SaveTemp:
  527. ADDRESS
  528. 'QUERY DOC VAR OLDNAME' /* remember current file name */
  529. 'SAVE NAME' tempfile 'ALL'
  530. 'NAME' oldname          /* Restore original name */
  531. ADDRESS
  532. RETURN
  533.  
  534. /**************************************************************************/
  535. /* GetEditPort() -- Makes sure the right text editor port is open.        */
  536. /**************************************************************************/
  537.  
  538. GetEditPort:
  539. IF Abbrev(Address(), "GOLDED.") = 1 THEN RETURN Address()
  540. IF ~SHOWLIST("P", "GOLDED.1") THEN DO
  541.     CALL rtezrequest "GOLDED.1 unavailable", "_Abort", "Missing Port:"
  542.     EXIT
  543. END
  544. RETURN "GOLDED.1"
  545.  
  546. /**************************************************************************/
  547. /* GetScreen() -- Returns the screen name                                 */
  548. /**************************************************************************/
  549.  
  550. GetScreen: PROCEDURE
  551. 'QUERY SCREEN VAR NAME'
  552. RETURN NAME
  553.  
  554.