<> <> <> <> <> <> <> <<>> DIRECTORY Atom USING [GetPName], FS USING [Error], Commander USING [CommandProc, Handle, Register], EditSpan USING [CannotDoEdit, Delete, InsertTextNode], IO USING [EndOfStream, GetTokenRope, PutFR, PutRope, RIS, STREAM], NodeProps USING [GetProp, GetSpecs, MapProps, MapPropsAction, PutProp, true], ProcessExtras USING [CheckForAbort], PutGet USING [FromFile, ToFile], Rope USING [Cat, Equal, Find, ROPE, Size], TextEdit USING [AppendRope], TextNode USING [FirstChild, Forward, MakeNodeSpan, Ref, RefTextNode], WindowManager USING [UnWaitCursor, WaitCursor]; AnnotateProperties: CEDAR PROGRAM IMPORTS Atom, FS, Commander, EditSpan, IO, NodeProps, ProcessExtras, PutGet, Rope, TextEdit, TextNode, WindowManager = { rootNode: TextNode.Ref; annotationNode: TextNode.RefTextNode; commentAtom: ATOM = $Comment; propertyAnnotationAtom: ATOM = $PropertyAnnotation; trueRope: Rope.ROPE = "TRUE"; DoAnnotations: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> ENABLE UNWIND => WindowManager.UnWaitCursor[]; execOut: IO.STREAM = cmd.out; filename: Rope.ROPE; tabIndent: NAT _ 8; commandLineStream: IO.STREAM = IO.RIS[cmd.commandLine]; annotate: BOOL _ cmd.procData.clientData = $Annotate; WindowManager.WaitCursor[]; DO -- process each file in command line filename _ IO.GetTokenRope[commandLineStream ! IO.EndOfStream => {filename _ NIL; CONTINUE}].token; IF Rope.Size[filename]=0 THEN EXIT; IF Rope.Find[filename,"."] = -1 THEN -- add .mesa extension filename _ Rope.Cat[filename,".mesa"]; { ENABLE FS.Error => { execOut.PutRope[filename]; execOut.PutRope[" not found.\n"]; result _ $Warning; msg _ "Some files not found"; LOOP }; ProcessExtras.CheckForAbort[]; rootNode _ PutGet.FromFile[filename]; ProcessExtras.CheckForAbort[]; }; IF annotate THEN AddAnnotationNodes[] ELSE PruneAnnotationNodes[]; [] _ PutGet.ToFile[filename, rootNode]; ENDLOOP; WindowManager.UnWaitCursor[]; }; AddAnnotationNodes: PROCEDURE = { next: TextNode.Ref; level, levelDelta: INTEGER _ 1; IF AnAnnotationNode[TextNode.FirstChild[rootNode]] THEN RETURN; CreateRootAnnotationNode[]; [next, levelDelta] _ TextNode.Forward[TextNode.FirstChild[rootNode]]; WHILE next#NIL DO level _ level+levelDelta; CreateAnnotationNode[next, level]; [next, levelDelta] _ TextNode.Forward[next]; ENDLOOP; }; PruneAnnotationNodes: PROCEDURE = { next, prev: TextNode.Ref; [next, ] _ TextNode.Forward[rootNode]; WHILE next#NIL DO IF AnAnnotationNode[next] THEN { prev _ next; [next, ] _ TextNode.Forward[next]; EditSpan.Delete[ root: rootNode, del: TextNode.MakeNodeSpan[prev, prev], saveForPaste: FALSE ! EditSpan.CannotDoEdit => CONTINUE]} ELSE [next, ] _ TextNode.Forward[next]; ENDLOOP; }; AnAnnotationNode: PROC [node: TextNode.Ref] RETURNS[BOOLEAN] = { propValue: REF; IF node#NIL THEN IF (propValue _ NodeProps.GetProp[node, propertyAnnotationAtom])#NIL THEN IF Rope.Equal[trueRope, NodeProps.GetSpecs[propertyAnnotationAtom, propValue]] THEN RETURN[TRUE]; RETURN[FALSE]; }; CreateRootAnnotationNode: PROCEDURE = { annotationNode _ EditSpan.InsertTextNode[rootNode, rootNode, child]; [] _ TextEdit.AppendRope[rootNode, annotationNode, "<>"]; NodeProps.PutProp[annotationNode, propertyAnnotationAtom, trueRope]; NodeProps.PutProp[annotationNode, commentAtom, NodeProps.true]; }; CreateAnnotationNode: PROCEDURE [thisNode: TextNode.Ref, level: INTEGER] = { annotationNode _ EditSpan.InsertTextNode[rootNode, thisNode, before]; [] _ TextEdit.AppendRope[ rootNode, annotationNode, IO.PutFR["<>"]; NodeProps.PutProp[annotationNode, propertyAnnotationAtom, trueRope]; NodeProps.PutProp[annotationNode, commentAtom, NodeProps.true]; }; AnnotateProps: NodeProps.MapPropsAction = { nodeRope: Rope.ROPE _ Rope.Cat[", ", Atom.GetPName[name], ": ", NodeProps.GetSpecs[name, value]]; [] _ TextEdit.AppendRope[rootNode, annotationNode, nodeRope]; RETURN[FALSE]}; Commander.Register[ "AnnotateProperties", DoAnnotations, "Annotate a Tioga document by inserting nodes identifying properties and styles of each node", $Annotate]; Commander.Register[ "PruneAnnotations", DoAnnotations, "Prune the nodes created by the AnnotateProperties command", $Prune]; }.