DIRECTORY Ascii, Rope, MessageWindow, ViewerTools, ViewerClasses, Buttons, TiogaOps; CapsArrows: CEDAR PROGRAM IMPORTS Ascii, MessageWindow, ViewerTools, Buttons, Rope, TiogaOps = BEGIN showPositionButton: Buttons.Button _ Buttons.Create[info: [name: "CapsArrows"], proc: Button, documentation: "Under test"]; loc: INT _ 0; Button: Buttons.ButtonProc = { rope: Rope.ROPE _ ViewerTools.GetSelectionContents[]; viewer: ViewerClasses.Viewer; start, end: TiogaOps.Location; level: TiogaOps.SelectionGrain; [viewer:viewer, start:start, end:end, level:level] _ TiogaOps.GetSelection[]; IF mouseButton=red THEN { rope_MesaToPascal[rope]; } ELSE IF mouseButton=blue THEN { rope_PascalToMesa[rope]; } ELSE MessageWindow.Append["Left: Mesa ids to Pascal ids; Right: vice versa", TRUE]; viewer.class.notify[viewer, LIST[$Delete, rope]]; [end:end] _ TiogaOps.GetSelection[]; end.where _ end.where - 1; -- God only knows why this is necessary TiogaOps.SetSelection[viewer:viewer, start:start, end:end, level:level, caretBefore: FALSE]; }; MesaToPascal: PROCEDURE [rope: Rope.ROPE] RETURNS [new: Rope.ROPE] = { firstInToken: BOOLEAN _ TRUE; startPos: INT _ 0; -- used to avoid Rope.Cats of single chars. new _ ""; FOR i:INT IN [0..rope.Length[]) DO char: CHAR _ rope.Fetch[i]; SELECT TRUE FROM char IN ['A..'Z] AND firstInToken => { new _ Rope.Cat[new, rope.Substr[start~startPos, len~i-startPos], Rope.FromChar[Ascii.Lower[char]]]; firstInToken _ FALSE; startPos _ i+1; }; char IN ['A..'Z] AND NOT firstInToken => { new _ Rope.Cat[new, rope.Substr[start~startPos, len~i-startPos], "_", Rope.FromChar[Ascii.Lower[char]]]; startPos _ i+1; }; Ascii.Letter[char], Ascii.Digit[char], char = '$ => { firstInToken _ FALSE; }; ENDCASE => { firstInToken _ TRUE; }; ENDLOOP; IF startPos < rope.Length[] THEN new _ Rope.Cat[new, rope.Substr[start~startPos, len~rope.Length[]-startPos]]; }; PascalToMesa: PROCEDURE [rope: Rope.ROPE] RETURNS [new: Rope.ROPE] = { upperCaseFlag: BOOL _ TRUE; new _ ""; FOR i:INT IN [0..rope.Length[]) DO char: CHAR _ rope.Fetch[i]; SELECT TRUE FROM Ascii.Letter[char], Ascii.Digit[char], char = '$ => { new _ Rope.Concat[new, Rope.FromChar[ IF upperCaseFlag THEN Ascii.Upper[char] ELSE Ascii.Lower[char] ]]; upperCaseFlag _ FALSE }; char = '_ => upperCaseFlag _ TRUE; ENDCASE => { new _ Rope.Concat[new, Rope.FromChar[char]]; upperCaseFlag _ TRUE }; ENDLOOP }; END. ΚCapsArrows.mesa Michael Plass, December 22, 1982 12:10 pm Last Edited by: Ramshaw, January 20, 1984 1:39 pm Last Edited by: Nichols, July 25, 1983 2:38 pm Pavel, September 12, 1985 8:10:33 pm PDT Κm˜Icode™K™)K™1™.K™(—šΟk ˜ KšœJ˜JK˜—šœ  ˜Kšœ;˜BKšœ˜Kšœ{˜{Kšœœ˜ K˜šΟnœ˜Kšœ5˜5K˜Kšœ˜Kšœ˜KšœM˜Mšœœ˜Kšœ˜K˜—šœ˜Kšœ˜Kšœ˜—KšœIœ˜SKšœ1˜1Kšœ$˜$KšœΟc'˜DKšœUœ˜\K˜K˜—š ž œ œ œœ œ˜FKšœœœ˜Kšœ œŸ+˜?K˜Kšœ ˜ šœœœ˜"Kšœœ˜šœœ˜šœœ œ˜&K•StartOfExpansion9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]šœc˜cKšœœ˜K˜K˜—šœœ œœ˜*K–9[base: ROPE, start: INT _ 0, len: INT _ 2147483647]šœh˜hK˜Kšœ˜—šœ5˜5Kšœœ˜K˜—šœ˜ Kšœœ˜Kšœ˜——Kšœ˜—šœ˜ K˜M—K˜K˜—š ž œ œ œœ œ˜FKšœœœ˜K˜ šœœœ˜"Kšœœ˜šœœ˜šœ5˜5šœ%˜%Kšœœœ˜>Kšœ˜—Kšœ˜Kšœ˜—Kšœœ˜"šœ˜ Kšœ,˜,Kšœ˜Kšœ˜——Kš˜—K˜K˜—Kšœ˜——…— N