DIRECTORY Rope, SpellingLooks, TextLooks, UserProfile; SpellingLooksImpl: CEDAR PROGRAM IMPORTS Rope, UserProfile EXPORTS SpellingLooks = { ROPE: TYPE = Rope.ROPE; ROPEList: TYPE = LIST OF ROPE; Looks: TYPE = TextLooks.Looks; StyleNote: TYPE = RECORD [ style: ROPE, unwordlich: Looks _ TextLooks.noLooks]; StyleNotes: TYPE = LIST OF StyleNote; styleNotes: StyleNotes _ NIL; globalVerboten: Looks _ TextLooks.noLooks; Wordlich: PUBLIC PROC [style: ROPE, looks: Looks] RETURNS [wordlich: BOOL] = { perThisStyle: StyleNotes; IF Intersects[globalVerboten, looks] THEN RETURN [FALSE]; perThisStyle _ FindStyle[style]; IF perThisStyle # NIL AND Intersects[perThisStyle.first.unwordlich, looks] THEN RETURN [FALSE]; wordlich _ TRUE; }; FindStyle: PROC [style: ROPE] RETURNS [styleNote: StyleNotes] = { FOR styleNote _ styleNotes, styleNote.rest WHILE styleNote # NIL DO IF Rope.Equal[styleNote.first.style, style, FALSE] THEN RETURN; ENDLOOP; }; Intersects: PROC [l1, l2: Looks] RETURNS [intersects: BOOL] = INLINE { FOR l: TextLooks.Look IN TextLooks.Look DO IF l1[l] AND l2[l] THEN RETURN [TRUE]; ENDLOOP; intersects _ FALSE}; NoteProfile: PROC [reason: UserProfile.ProfileChangeReason] --UserProfile.ProfileChangedProc-- = { profileNotes: ROPEList _ UserProfile.ListOfTokens[key: "SpellingTool.NonWordLooks", default: LIST ["cedar~dugm"]]; globalVerboten _ TextLooks.noLooks; styleNotes _ NIL; FOR rl: ROPEList _ profileNotes, rl.rest WHILE rl # NIL DO spec: ROPE _ rl.first; style, looks: ROPE; sep: INT _ spec.Find["~"]; IF sep >= 0 THEN {style _ spec.Substr[len: sep]; looks _ spec.Substr[start: sep+1]} ELSE {style _ NIL; looks _ spec}; IF style.Equal["*"] OR style.Length[] = 0 THEN globalVerboten _ ORLooks[globalVerboten, looks] ELSE { perThisStyle: StyleNotes _ FindStyle[style]; IF perThisStyle = NIL THEN perThisStyle _ styleNotes _ CONS[[style], styleNotes]; perThisStyle.first.unwordlich _ ORLooks[perThisStyle.first.unwordlich, looks]; }; ENDLOOP; }; ORLooks: PROC [urLooks: Looks, inRope: ROPE] RETURNS [moreLooks: Looks] = { moreLooks _ urLooks; FOR i: INT IN [0 .. inRope.Length[]) DO c: CHAR _ inRope.Fetch[i]; IF c IN TextLooks.Look THEN moreLooks[c] _ TRUE; ENDLOOP; }; UserProfile.CallWhenProfileChanges[NoteProfile]; }. JSpellingLooksImpl.Mesa Spreitzer, February 27, 1985 9:03:31 pm PST Κ&˜code™K™+—K˜KšΟk œ-˜6K˜š Πbxœœœœœ˜TK˜Kšœœœ˜Kš œ œœœœ˜Kšœœ˜K˜šœ œœ˜Kšœœ˜ K˜'—K˜Kšœ œœœ ˜%K˜Kšœœ˜K˜*K˜š Οnœœœ œœ œ˜NKšœ˜Kšœ#œœœ˜9Kšœ ˜ Kš œœœ2œœœ˜_Kšœ œ˜K˜—K˜šŸ œœ œœ˜Ašœ(œ œ˜CKšœ*œœœ˜?Kšœ˜—K˜—K˜š Ÿ œœœœœ˜Fšœœ˜*Kš œœœœœ˜&Kšœ˜—Kšœ œ˜—K˜šŸ œœ+Οc"œ˜bKšœ]œ˜rK˜#Kšœ œ˜šœ&œœ˜:Kšœœ ˜Kšœœ˜Kšœœ˜šœ ˜ KšœC˜GKšœ œ˜!—šœœ˜)Kšœ0˜4šœ˜K˜,Kšœœœœ˜QKšœN˜NK˜——Kšœ˜—K˜—K˜šŸœœœœ˜KK˜šœœœ˜'Kšœœ˜Kšœœœœ˜0Kšœ˜—K˜—K˜Kšœ0˜0K˜K˜——…—Μ <