Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: TIUFWRAP

TIUFWRAP.m

Go to the documentation of this file.
  1. TIUFWRAP ;SPFO/AJB - Evaluate & Clean File #8927 ;04/06/22 12:5
  1. ;;1.0;TEXT INTEGRATION UTILITIES;**338,254**;Jun 20, 1997;Build 9
  1. ;
  1. Q
  1. ;
  1. EN ; main entry
  1. N ANS,BU,C,OUTPUT,POP,X,Y
  1. D HOME^%ZIS,PREP^XGF W IOCUON
  1. D BACKUP^TIUFWRAP1(.BU,0) ; save a copy of #8927 in ^XTMP
  1. S OUTPUT=$NA(^TMP($J,"OUTPUT")) K @OUTPUT
  1. S ANS="" F D Q:ANS'=""
  1. . N BROKEN,LONG,NOFLD,NOOBJ,UNLINKED
  1. . F X="BROKEN","LONG","NOFLD","NOOBJ","UNLINKED" D
  1. . . S @X@("COUNT")=0,@X=$NA(^TMP($J,X)) K ^TMP($J,X) ; reset counts, set temp global, clean temp global
  1. . D DISPLAY^TIUFWRAP2("INFO")
  1. . N DIR S DIR=$S(+BU:"SA^B:BACKUP;V:VIEW;P:PRINT;E:EMAIL;R:RESTORE;U:UPDATE;H:HELP;Q:QUIT",1:"SA^B:BACKUP;V:VIEW;P:PRINT;E:EMAIL;U:UPDATE;H:HELP;Q:QUIT")
  1. . N PROMPT S PROMPT=$S(+BU:"VIEW, PRINT, EMAIL, RESTORE or UPDATE File #8927? ",1:"BACKUP, VIEW, PRINT, EMAIL or UPDATE File #8927? ")
  1. . S ANS=$$FMR^TIUFWRAP2(DIR,PROMPT,"VIEW") Q:ANS=U!(ANS="Q")
  1. . I ANS="B" D BACKUP^TIUFWRAP1(.BU,1) S ANS="" Q
  1. . I ANS="R" D RESTORE^TIUFWRAP1 S ANS="" Q
  1. . I ANS="U" D UPDATE^TIUFWRAP1(BU) S ANS="" Q
  1. . I ANS="H" D HELP^TIUFWRAP2 S ANS="" Q
  1. . I '$D(@OUTPUT) W !!,"Analyzing File #8927..." D
  1. . . D GATHER^TIUFWRAP1(0,0) I $D(LONG)=1,$D(UNLINKED)=1,$D(BROKEN)=1,$D(NOFLD)=1 W !!,"No issues found...",! I $$FMR^TIUFWRAP2("EA","Press <Enter> to continue.")
  1. . . D PREPOUT^TIUFWRAP1(.LONG,.OUTPUT,LONG("COUNT")_" Entries With Lines >80 Characters")
  1. . . D PREPOUT^TIUFWRAP1(.UNLINKED,.OUTPUT,UNLINKED("COUNT")_" Entries With No Items, Pointers, or Text")
  1. . . D PREPOUT^TIUFWRAP1(.BROKEN,.OUTPUT,BROKEN("COUNT")_" Entries With Broken Fields/Objects")
  1. . . D PREPOUT^TIUFWRAP1(.NOFLD,.OUTPUT,NOFLD("COUNT")_" Entries With Broken/Missing Fields from #8927.1")
  1. . . D PREPOUT^TIUFWRAP1(.NOOBJ,.OUTPUT,NOOBJ("COUNT")_" Entries With Missing Objects from #8925.1")
  1. . I ANS="V" D VIEW^TIUFWRAP1 S ANS="" Q
  1. . I ANS="P" D PRINT^TIUFWRAP1 S ANS="" Q
  1. . I ANS="E" D EMAIL^TIUFWRAP1 S ANS="" Q
  1. D CLEAN^XGF W !!
  1. K @OUTPUT
  1. Q
  1. ;
  1. EE(IEN,LEVEL,PATH,LOD) ; evaluate entry
  1. N NODE,NODE0,TYPE
  1. S NODE0=$G(^TIU(8927,IEN,0)) ; zero node
  1. S TYPE=$P(NODE0,U,3) ; type
  1. S:LEVEL=0 PATH="" ; reset path
  1. S $P(PATH,U,(LEVEL+1))=$P(NODE0,U) ; set path for traversing GUI Editor
  1. F NODE=10,2 D ; items=10, boilerplate text=2
  1. . N CNT,DATA,ITEM
  1. . S (CNT,ITEM)=0 F S ITEM=$O(^TIU(8927,IEN,NODE,ITEM)) Q:'+ITEM D
  1. . . I NODE=10 S CNT=CNT+1 ; increment count only for items
  1. . . I CNT=1 S LEVEL=LEVEL+1 ; only increment LEVEL once/ien
  1. . . ; value=item ien or value=line of boilerplate text
  1. . . N VALUE S VALUE=^TIU(8927,IEN,NODE,ITEM,0),VALUE=$S(NODE=2:VALUE,1:$P(VALUE,U,2)) ; item ien is 2nd piece of 0 node
  1. . . I NODE=10,'VALUE D:+UPDATE Q
  1. . . . K ^TIU(8927,IEN,10,ITEM),^TIU(8927,IEN,10,"B",ITEM) ; remove broken item
  1. . . ;
  1. . . I NODE=10,'$$EE(VALUE,LEVEL,.PATH,LOD) D Q ; item not linked
  1. . . . S PATH=$P(PATH,U,1,(LEVEL+1)) ; final path
  1. . . . I +UPDATE D DEL(IEN,ITEM,VALUE) Q ; remove item and re-check entry
  1. . . . S:'$D(@UNLINKED@(VALUE)) UNLINKED("COUNT")=$G(UNLINKED("COUNT"))+1 S @UNLINKED@(VALUE,"PATH")=PATH
  1. . . I NODE=10 Q ; nothing more to do for items
  1. . . ;
  1. . . ; boilerplate text actions
  1. . . I '+UPDATE D Q ; evaluate lines and quit
  1. . . . S PATH=$P(PATH,U,1,(LEVEL+1)) ; final path
  1. . . . N BENT S BENT=$$BROKEN(VALUE) ; broken entry?
  1. . . . I +BENT D ; keep track of broken entries
  1. . . . . S:'$D(@BROKEN@(IEN)) BROKEN("COUNT")=$G(BROKEN("COUNT"))+1,@BROKEN@(IEN,"PATH")=PATH
  1. . . . . S:$G(@BROKEN@(IEN,"NODE"))'[ITEM @BROKEN@(IEN,"NODE")=$S($G(@BROKEN@(IEN,"NODE"))="":ITEM,1:@BROKEN@(IEN,"NODE")_U_ITEM)
  1. . . . I '+BENT D CHKOF(VALUE) ; check object/fields for non-broken entries
  1. . . . I '$$EX80(VALUE) Q ; exceed 80 characters after resolving fields? also checking for missing fields from #8927.1
  1. . . . I $L(VALUE)'>80 Q ; length ok
  1. . . . I '$$MERGE(VALUE) Q ; merge criteria?
  1. . . . I '$$NXTLINE(IEN,ITEM) Q ; ok to merge with next line?
  1. . . . S:'$D(@LONG@(IEN)) LONG("COUNT")=$G(LONG("COUNT"))+1,@LONG@(IEN,"PATH")=PATH
  1. . . . S @LONG@(IEN,"NODE")=$S($G(@LONG@(IEN,"NODE"))="":ITEM,1:$G(@LONG@(IEN,"NODE"))_U_ITEM)
  1. . . ;
  1. . . ; update actions for boilerplate text
  1. . . I $$BROKEN(VALUE) D FBF(IEN,ITEM,.VALUE) S VALUE=^TIU(8927,IEN,NODE,ITEM,0) ; fix broken fields & reset value
  1. . . S VALUE=$$CLEAN(VALUE) ; clean the line of text
  1. . . ;
  1. . . N LAST S LAST=+$O(DATA(8927,IEN,NODE,""),-1) ; get last line of new data
  1. . . S LAST=LAST+1 ; increment
  1. . . S DATA(8927,IEN,NODE,LAST,0)=VALUE ; save the line for update
  1. . . I LOD=1 Q ; basic update and quit
  1. . . I $L(VALUE)'>80 Q ; length ok
  1. . . I '$$MERGE(VALUE) Q ; merge criteria?
  1. . . ; implement levels of wrapping aggression
  1. . . I LOD=2 D WRAP(.DATA,IEN,NODE,.LAST) Q ; intermediate update and quit
  1. . . ; advanced update
  1. . . F Q:'$$NXTLINE(IEN,ITEM) D
  1. . . . S ITEM=$O(^TIU(8927,IEN,NODE,ITEM))
  1. . . . S VALUE=$$CLEAN(^TIU(8927,IEN,NODE,ITEM,0))
  1. . . . S DATA(8927,IEN,NODE,LAST,0)=DATA(8927,IEN,NODE,LAST,0)_$S($E(VALUE)=" ":"",1:" ")_VALUE
  1. . . D WRAP(.DATA,IEN,NODE,.LAST)
  1. . ; set global with new data
  1. . I NODE=2,+UPDATE,$D(DATA) D
  1. . . N TOTAL S TOTAL=$O(DATA(8927,IEN,2,""),-1) ; total # of line
  1. . . S DATA(8927,IEN,2,0)="^^"_TOTAL_"^"_TOTAL_"^"_DT_"^^" ; set the new 0 node
  1. . . K ^TIU(8927,IEN,2) M ^TIU(8927,IEN,2)=DATA(8927,IEN,2) ; replace old with new text
  1. ; linked to REMINDER DIALOG or COM OBJECT or LINK or has BOILERPLATE TEXT or has ITEMS?
  1. Q $S(+$P(NODE0,U,15):1,+$P(NODE0,U,17):1,+$P(NODE0,U,19):1,+$$HASBPTXT(IEN):1,+$$HASITEMS(IEN):1,1:0)
  1. ;
  1. FBF(IEN,NODE,LINE) ; fix broken fields/objects
  1. ; only evaluates the current line and the next line
  1. ; case #1 - missing a single closing bracket at the end of a line
  1. ; either missing the bracket or wrapped
  1. N CONT,FLD S CONT=1 F FLD="{FLD:","{FLD","{FL","{F" D
  1. . I LINE[FLD,$P(LINE,FLD,$L(LINE,FLD))'["}" D
  1. . . Q:'CONT ; continue only if line not fixed
  1. . . N CL,FNAME,NL S FNAME=$P(LINE,FLD,$L(LINE,FLD))
  1. . . S CL=LINE,NL=$O(^TIU(8927,IEN,2,NODE)) S:+NL NL=^TIU(8927,IEN,2,NL,0)
  1. . . ; if name is good, fix and quit
  1. . . I FNAME'="",+$O(^TIU(8927.1,"B",FNAME,"")) S ^TIU(8927,IEN,2,NODE,0)=CL_"}" Q
  1. . . S FNAME=FNAME_$P(NL,"}") ; grab first piece of next line (name was wrapped?)
  1. . . S CL=CL_$P(NL,"}")_"}" ; set the current line with the bracket
  1. . . S NL=$P(NL,"}",2,999) ; remove first piece from next line and get everything else
  1. . . I $$BROKEN(CL) Q ; quit if the line is still broken or the field doesn't exist
  1. . . S ^TIU(8927,IEN,2,NODE,0)=CL ; set current line
  1. . . S ^TIU(8927,IEN,2,$O(^TIU(8927,IEN,2,NODE)),0)=NL ; set next line
  1. . . S CONT=0 ; don't continue, all done
  1. ; case #2 - missing a single closing | for objects at the end of a line
  1. ; either missing the | or wrapped
  1. I '($L(LINE,"|")#2) D
  1. . N CL,NL,ONOK,ONAME S ONOK=0,ONAME=$P(LINE,"|",$L(LINE,"|")) Q:ONAME="" ; quit if name is null
  1. . S CL=LINE,NL=$O(^TIU(8927,IEN,2,NODE)) S:+NL NL=^TIU(8927,IEN,2,NL,0)
  1. . ; if object name exists, fix and quit
  1. . I +$$CHKOBJ(ONAME,"B") S ^TIU(8927,IEN,2,NODE,0)=CL_"|" Q
  1. . S ONAME=ONAME_$P(NL,"|") ; grab the first piece of the next line (name was wrapped?)
  1. . S CL=CL_$P(NL,"|")_"|" ; set the current line with the bracket
  1. . S NL=$P(NL,"|",2,999) ; remove first piece from next line and get everything else
  1. . I $$BROKEN(CL) Q ; sad
  1. . I '$$CHKOBJ(ONAME,"B") D ; couldn't find the object name
  1. . . S:'$D(@NOOBJ@(IEN)) NOOBJ("COUNT")=+$G(NOOBJ("COUNT"))+1,@NOOBJ@(IEN,"PATH")=$P($G(PATH),U,1,LEVEL+1)
  1. . . S:$G(@NOOBJ@(IEN,"NODE"))'[ITEM @NOOBJ@(IEN,"NODE")=$S($G(@NOOBJ@(IEN,"NODE"))="":ITEM,1:$G(@NOOBJ@(IEN,"NODE"))_U_ITEM)
  1. . S ^TIU(8927,IEN,2,NODE,0)=CL ; set current line
  1. . S:+$O(^TIU(8927,IEN,2,NODE)) ^TIU(8927,IEN,2,$O(^TIU(8927,IEN,2,NODE)),0)=NL ; set next line
  1. Q
  1. ;
  1. CHKOF(DATA) ; check the object/fields in a non-broken line
  1. N FLD,NUM,OBJ
  1. I DATA'["FLD:",(DATA'["|") Q
  1. I DATA["|" F NUM=2:1:$L(DATA,"|") D:'(NUM#2) ; check objects
  1. . N ONAME S ONAME=$P(DATA,"|",NUM) I $$CHKOBJ(ONAME,"B") Q ; object exists
  1. . S:'$D(@NOOBJ@(IEN)) NOOBJ("COUNT")=+$G(NOOBJ("COUNT"))+1,@NOOBJ@(IEN,"PATH")=$P($G(PATH),U,1,LEVEL+1)
  1. . S:$G(@NOOBJ@(IEN,"NODE"))'[ITEM @NOOBJ@(IEN,"NODE")=$S($G(@NOOBJ@(IEN,"NODE"))="":ITEM,1:$G(@NOOBJ@(IEN,"NODE"))_U_ITEM)
  1. I DATA["{FLD:" F NUM=2:1:$L(DATA,"{FLD:") D ; check fields
  1. . N FNAME S FNAME=$P($P(DATA,"{FLD:",NUM),"}")
  1. . I FNAME="" D Q
  1. . . S:'$D(@NOFLD@(IEN)) NOFLD("COUNT")=$G(NOFLD("COUNT"))+1,@NOFLD@(IEN,"PATH")=PATH
  1. . . S @NOFLD@(IEN,"NODE")=$S($G(@NOFLD@(IEN,"NODE"))="":ITEM,1:$G(@NOFLD@(IEN,"NODE"))_U_ITEM)
  1. . I $O(^TIU(8927.1,"B",FNAME,"")) Q
  1. . S:'$D(@NOFLD@(IEN)) NOFLD("COUNT")=+$G(NOFLD("COUNT"))+1,@NOFLD@(IEN,"PATH")=$P($G(PATH),U,1,LEVEL+1)
  1. . S:$G(@NOFLD@(IEN,"NODE"))'[ITEM @NOFLD@(IEN,"NODE")=$S($G(@NOFLD@(IEN,"NODE"))="":ITEM,1:$G(@NOFLD@(IEN,"NODE"))_U_ITEM)
  1. Q
  1. ;
  1. CHKOBJ(NAME,XREF) ; check if object exists
  1. Q:NAME="" 0
  1. N ANS,TIUDA S TIUDA=0 F S TIUDA=$O(^TIU(8925.1,XREF,NAME,TIUDA)) Q:'TIUDA D
  1. . I $D(^TIU(8925.1,"AT","O",TIUDA)) S ANS=1
  1. Q +$G(ANS)
  1. ;
  1. NXTLINE(IEN,ITEM) ; evaluate next line for suitability to merge
  1. N LINE S LINE=$O(^TIU(8927,IEN,2,ITEM)) Q:'+LINE 0 ; quit if there isn't a next line
  1. S LINE=$G(^TIU(8927,IEN,2,LINE,0)) ; set the next line
  1. ; criteria to disqualify a line
  1. I LINE=""!(LINE["{FLD:")!(LINE["}")!(LINE["|")!(LINE["(")!(LINE[")") Q 0
  1. Q 1
  1. ;
  1. BROKEN(TEXT) ; check for broken field/object
  1. N RESULT S RESULT=0
  1. ; assume any use of {F is a template field - might be too aggressive...
  1. I TEXT["|",'($L(TEXT,"|")#2) S RESULT=1 Q RESULT
  1. ;N FLD F FLD="{FLD:","{FLD","{FL","{F" D
  1. N FLD F FLD="{F" D
  1. . I TEXT[FLD,$P(TEXT,FLD,$L(TEXT,FLD))'["}" D
  1. . . N X F X=2:1:$L(TEXT,FLD) I $P(TEXT,FLD,X)'["}" S RESULT=1
  1. Q RESULT
  1. ;
  1. WRAP(DATA,IEN,NODE,LAST) ;
  1. N LINE,NODE0,REP,REP2,TIUFT,X
  1. S LAST("Start")=(LAST-1),NODE0=DATA(8927,IEN,NODE,LAST,0)
  1. I '+$$EX80(NODE0) Q ; check fields to see if line needs to be wrapped
  1. D WRAP^TIUFLD(NODE0,80) ; wrap
  1. S LINE=0 F S LINE=$O(TIUFT(LINE)) Q:'+LINE D ; set the new line of data
  1. . S DATA(8927,IEN,NODE,LAST,0)=TIUFT(LINE) S:+$O(TIUFT(LINE)) LAST=LAST+1 ; increment if more lines
  1. Q
  1. ;
  1. EX80(DATA) ; checks field(s) length
  1. Q:DATA'["{FLD:" 1 ; no field
  1. N FLD,LENGTH,RESULT S LENGTH=$L(DATA),RESULT=1
  1. F FLD=2:1:$L(DATA,"{FLD:") D
  1. . N FIEN,FNAME S FNAME=$P($P(DATA,"{FLD:",FLD),"}") Q:FNAME="" S FIEN=$O(^TIU(8927.1,"B",FNAME,""))
  1. . I 'FIEN D Q ; field name missing from 8927.1
  1. . . S:'$D(@NOFLD@(IEN)) NOFLD("COUNT")=+$G(NOFLD("COUNT"))+1,@NOFLD@(IEN,"PATH")=$P($G(PATH),U,1,LEVEL+1)
  1. . . S:$G(@NOFLD@(IEN,"NODE"))'[ITEM @NOFLD@(IEN,"NODE")=$S($G(@NOFLD@(IEN,"NODE"))="":ITEM,1:$G(@NOFLD@(IEN,"NODE"))_U_ITEM)
  1. . N NODE0 S NODE0=$G(^TIU(8927.1,FIEN,0))
  1. . S LENGTH=LENGTH-($L(FNAME)+6) ; subtract the length of the name and brackets
  1. . N MAXLEN ; maximum length
  1. . S MAXLEN(+$P(NODE0,U,4))="" ; length of field
  1. . S MAXLEN(+$P(NODE0,U,10))="" ; max length of field
  1. . S MAXLEN(+$L($P(NODE0,U,6)))="" ; length of LM text
  1. . S LENGTH=LENGTH+($O(MAXLEN(""),-1)) ; add the longest to the length
  1. Q $S(LENGTH'>80:0,1:1)
  1. ;
  1. MERGE(DATA) ; merge lines of text criteria
  1. N RESULT S RESULT=1
  1. Q:$E(DATA,$L(DATA))="}" 0 ; if the last character of the line is a field, do not merge
  1. Q:$E(DATA,$L(DATA))="|" 0 ; if the last character of the line is an object, do not merge
  1. Q RESULT
  1. ;
  1. DEL(PARENT,ITEM,CHILD) ;
  1. N TYPE S TYPE=$P($G(^TIU(8927,CHILD,0)),U,3)
  1. Q:TYPE="R"!(TYPE="CF")!(TYPE="TF")!(TYPE="OF") ; NEVER delete root folders
  1. N %,DA,DIK,X,Y
  1. S DA=CHILD,DIK="^TIU(8927," D:+DA ^DIK ; delete entry
  1. I +$G(PARENT)=0 Q
  1. S DA=ITEM,DA(1)=PARENT,DIK="^TIU(8927,"_DA(1)_",10," D ^DIK ; delete entry from ITEM list of PARENT
  1. Q
  1. ;
  1. HASBPTXT(IEN) ; does entry have BOILERPLATE TEXT?
  1. Q $O(^TIU(8927,IEN,2,0))
  1. ;
  1. HASITEMS(IEN) ; does entry have ITEMS?
  1. Q $O(^TIU(8927,IEN,10,0))
  1. ;
  1. CLEAN(DATA) ;
  1. ; remove trailing spaces, replace characters, remove control characters
  1. S DATA=$$RTS(DATA)
  1. S DATA=$$REPLACE(DATA)
  1. S DATA=$$CTRL(DATA)
  1. Q DATA
  1. ;
  1. RTS(X) ; remove trailing spaces
  1. F Q:$E(X,$L(X))'=" " S X=$E(X,1,$L(X)-1)
  1. Q X
  1. ;
  1. REPLACE(DATA) ; replace characters
  1. N REP S REP($C(9))=" ",REP($C(149))=" - ",REP("$c")="$C" ; setup replacment characters
  1. S REP("{{")="{",REP("}}")="}" ; fix double field brackets
  1. Q $$REPLACE^XLFSTR(DATA,.REP)
  1. ;
  1. CTRL(X) ; remove all control characters
  1. N I S I=1 F Q:X'?.E1C.E D
  1. . F I=I:1 Q:$E(X,I)?1C
  1. . S X=$E(X,1,I-1)_$E(X,I+1,999)
  1. Q X
  1. ;