<> <> <> DIRECTORY Rope, TextFind; TextReplace: CEDAR DEFINITIONS = { ROPE: TYPE = Rope.ROPE; RopeMap: TYPE = REF RopeMapRep; RopeMapRep: TYPE = RECORD [ Map: PROC [REF ANY, ROPE] RETURNS [ROPE], data: REF ANY _ NIL]; Apply: PROC [s: RopeMap, r: ROPE] RETURNS [mapped: ROPE]; <<= {mapped _ s.Map[s.data, r]};>> id: RopeMap; addBrackets: RopeMap; Constant: PROC [result: ROPE] RETURNS [rm: RopeMap]; Cat: PROC [first, second: RopeMap] RETURNS [catted: RopeMap]; <> Layer: PROC [first, later: RopeMap] RETURNS [layered: RopeMap]; <> RopeMapFromPairs: PROC [PairList] RETURNS [RopeMap]; PairList: TYPE = LIST OF Pair; Pair: TYPE = RECORD [match, replace: ROPE, literal, addBounds: BOOL _ FALSE]; <> MapNamedSubfieldToMatch: PROC [finder: TextFind.Finder, lastMatchedRope: ROPE] RETURNS [rm: RopeMap]; <> MapByMatchToTemplate: PROC [finder: TextFind.Finder, template: ROPE] RETURNS [rm: RopeMap]; <> <> <> <> Nest: PROC [rm: RopeMap] RETURNS [nested: RopeMap]; <> < is found, it is replaced by what rm has for name.>> <> <> SyntaxError: ERROR; <).>> NoMapping: SIGNAL [rm: RopeMap, from: ROPE] RETURNS [to: ROPE]; <> MatchAndSubstitute: PROC [pattern, against, template: ROPE] RETURNS [ROPE]; }.