<> <> <> <> <> 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.