[796] | 1 | TMGSHORT ;TMG/kst/Code to Shorten Names ;03/25/06
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;12/23/06
|
---|
| 3 |
|
---|
| 4 | ;" SHORTEN NAMES code
|
---|
| 5 |
|
---|
| 6 | ;"Kevin Toppenberg MD
|
---|
| 7 | ;"GNU General Public License (GPL) applies
|
---|
| 8 | ;"12-23-2006
|
---|
| 9 |
|
---|
| 10 | ;"=======================================================================
|
---|
| 11 | ;" API -- Public Functions.
|
---|
| 12 | ;"=======================================================================
|
---|
| 13 | ;"ShortNetName(GenericName,TradeName,Strength,Units,MaxLen)
|
---|
| 14 | ;"$$ShortenArray(Names,Dividers,MaxLen,AllowCut) -- core menus for shortening name
|
---|
| 15 | ;"$$PShortName(Name,Length,AskUser) -- shorten the drug smartly, using abbreviations
|
---|
| 16 | ;"$$ShortName(Name,Length,AskUser,DivStr) -- shorten the drug smartly, using abbreviations
|
---|
| 17 | ;"$$Short2Name(Name,Div1,Div2,.Words,.Dividers) -- Shorten a name to shortest form possible
|
---|
| 18 | ;"$$Short1Name(Name,MaxLen,Div1,Div2,Words,Dividers) -- An interactive editing of one name
|
---|
| 19 | ;"$$Cut1Name(Name,MaxLen,Div1,Div2,Words,Dividers) -- A non-interactive cut of one name
|
---|
| 20 |
|
---|
| 21 | ;"=======================================================================
|
---|
| 22 | ;" Private Functions.
|
---|
| 23 | ;"=======================================================================
|
---|
| 24 | ;"$$ReadJoin(JoinNum,Len,Words,Dividers) -- read out a phrase of joined words, Len words long
|
---|
| 25 | ;"SetJoin(JoinNum,Len,Words,Dividers) -- reform the Word and Dividers arrays such that
|
---|
| 26 | ;" words are joined together. E.g. #1='One' #2='Minute' ==> #1='One Minute'
|
---|
| 27 | ;"SubDivArray(Words,Dividers,Div1,Div2) -- check and handle if words in Words array need subdivision
|
---|
| 28 | ;"PackArrays(pNames,pDividers) -- pack the arrays, after items had been deleted.
|
---|
| 29 | ;"CompArray(Names,Dividers) -- reconstruct the resulting sentence from words in array.
|
---|
| 30 | ;"AutoShortenArray(.Names,.Dividers,MaxLen,Div1,Div2) -- automatically shorten the words in the array
|
---|
| 31 | ;"$$CutName(.Names,.Dividers,MaxLen) -- return a non-interactive shortened ('cut') name
|
---|
| 32 |
|
---|
| 33 | ;"=======================================================================
|
---|
| 34 | ;"=======================================================================
|
---|
| 35 |
|
---|
| 36 | ShortNetName(GenericName,TradeName,Strength,Units,MaxLen,AllowCut)
|
---|
| 37 | ;"Purpose: to create a shortened name from parts, not longer than MaxLen
|
---|
| 38 | ;"Input: GenericName -- Generic portion of name
|
---|
| 39 | ;" TradeName -- Tradename portion of name
|
---|
| 40 | ;" Strength -- OPTIONAL Strength portion of name
|
---|
| 41 | ;" Units -- OPTIONAL units portion of name
|
---|
| 42 | ;" MaxLen -- the maximum length
|
---|
| 43 | ;" AllowCut -- OPTIONAL If 1 then name may be cut off with ... to reach target length
|
---|
| 44 | ;" and user will not be asked for input
|
---|
| 45 | ;" If 2 then name wil be shortened as far as possible, but it
|
---|
| 46 | ;" wil not be cut off
|
---|
| 47 | ;"Result: Returns new shortened name, or "^" for user abort
|
---|
| 48 |
|
---|
| 49 | new result,temp
|
---|
| 50 | set GenericName=$get(GenericName)
|
---|
| 51 | set TradeName=$get(TradeName)
|
---|
| 52 | set Strength=$get(Strength)
|
---|
| 53 | set Units=$get(Units)
|
---|
| 54 | set MaxLen=$get(MaxLen,16)
|
---|
| 55 | set AllowCut=$get(AllowCut,0)
|
---|
| 56 |
|
---|
| 57 | new Names,Dividers
|
---|
| 58 | new unitsIdx,GenericIdx set GenericIdx=0,unitsIdx=0
|
---|
| 59 | ;"sometimes 'Trade Name' is actually an expanded form of the Generic name
|
---|
| 60 | ;"e.g. ACETAZOLAMIDE (ACETAZOLAMIDE CAP USP) 250
|
---|
| 61 | ;"In these cases I will delete the duplication
|
---|
| 62 | SNN0 if $extract(TradeName,1,$length(GenericName))=GenericName set GenericName=""
|
---|
| 63 | if (TradeName="")!(GenericName="") do
|
---|
| 64 | . new i set i=0
|
---|
| 65 | . if TradeName'="" set i=i+1,Names(i)=TradeName,Dividers(i)=" "
|
---|
| 66 | . if GenericName'="" set i=i+1,Names(i)=GenericName,Dividers(i)=" ",GenericIdx=i
|
---|
| 67 | . ;"set Names(i)=TradeName,Dividers(i)=" ",i=i+1
|
---|
| 68 | . if Strength'="" set i=i+1,Names(i)=Strength,Dividers(i)=" "
|
---|
| 69 | . if Units'="" set i=i+1,Names(i)=Units,unitsIdx=i,Dividers(i)=""
|
---|
| 70 | . set Names("MAXNODE")=i,Dividers("MAXNODE")=i
|
---|
| 71 | else do
|
---|
| 72 | . new i set i=0
|
---|
| 73 | . set i=i+1,Names(i)=TradeName,Dividers(i)=" ("
|
---|
| 74 | . set i=i+1,Names(i)=GenericName,GenericIdx=i,Dividers(i)=") "
|
---|
| 75 | . ;"set i=i+1,Names(i)=GenericName,GenericIdx=i,Dividers(i)=" (" ;changed 10-30-07
|
---|
| 76 | . ;"set i=i+1,Names(i)=TradeName,Dividers(i)=") "
|
---|
| 77 | . if Strength'="" set i=i+1,Names(i)=Strength,Dividers(i)=" "
|
---|
| 78 | . if Units'="" set i=i+1,Names(i)=Units,unitsIdx=i,Dividers(i)=""
|
---|
| 79 | . set Names("MAXNODE")=i,Dividers("MAXNODE")=i
|
---|
| 80 |
|
---|
| 81 | for i=1:1:Names("MAXNODE")-1 do ;"don't cleave units (e.g. MG/ML)
|
---|
| 82 | . set:(i>1) Names(i)=$translate(Names(i),"/","|")
|
---|
| 83 | do SubDivArray(.Names,.Dividers," ","/")
|
---|
| 84 |
|
---|
| 85 | set result=$$ShortenArray(.Names,.Dividers,MaxLen,AllowCut)
|
---|
| 86 | if result=0 kill Names,Dividers goto SNN0 ;"honor requested retry
|
---|
| 87 |
|
---|
| 88 | ;"If shortening required "...", see if removing parts of name allow goal.
|
---|
| 89 | if (AllowCut=1)&(result["...") do
|
---|
| 90 | SNN1 . ;"try removing units first
|
---|
| 91 | . kill Names(unitsIdx),Dividers(unitsIdx)
|
---|
| 92 | . do PackArrays("Names","Dividers")
|
---|
| 93 | . set result=$$ShortenArray(.Names,.Dividers,MaxLen,AllowCut)
|
---|
| 94 | . if result'["..." quit
|
---|
| 95 | . if GenericIdx'=0 do
|
---|
| 96 | . . kill Names(GenericIdx)
|
---|
| 97 | . . if Dividers(GenericIdx)=" (" set Dividers(GenericIdx+1)=" "
|
---|
| 98 | . . kill Dividers(GenericIdx)
|
---|
| 99 | . . do PackArrays("Names","Dividers")
|
---|
| 100 | . . set result=$$ShortenArray(.Names,.Dividers,MaxLen,AllowCut)
|
---|
| 101 | . if result'["..." quit
|
---|
| 102 | . ;"more later... ?
|
---|
| 103 |
|
---|
| 104 | SNNDone
|
---|
| 105 | set result=$$Trim^TMGSTUTL(result)
|
---|
| 106 | if $extract(result,1,1)="(" do ;"Input transform doesn't allow first chart to be '('
|
---|
| 107 | . ;"NOTE: I should write better code to change only the LAST ) to "", i.e. not cut out ALL ()'s
|
---|
| 108 | . set result=$translate(result,"(","")
|
---|
| 109 | . set result=$translate(result,")","")
|
---|
| 110 | if (result[")")&(result'["(") set result=$translate(result,")","")
|
---|
| 111 | set result=$translate(result,"|","/")
|
---|
| 112 | quit result
|
---|
| 113 |
|
---|
| 114 |
|
---|
| 115 | ShortenArray(Names,Dividers,MaxLen,AllowCut)
|
---|
| 116 | ;"Purpose: shorten name
|
---|
| 117 | ;"Input: Names -- PASS BY REFERENCE. An array containing the words
|
---|
| 118 | ;" Dividers -- PASS BY REFERENCE. An array containing the bits between words
|
---|
| 119 | ;" MaxLen -- OPTIONAL. Default=1. The length that words must fit within
|
---|
| 120 | ;" AllowCut -- OPTIONAL. Default=0. Set 1 if automatic shortening is allowed.
|
---|
| 121 | ;" If 1, MaxLen value SHOULD BE supplied
|
---|
| 122 | ;" If 2 then name wil be shortened as far as possible, but it
|
---|
| 123 | ;" wil not be cut off. User will not be asked.
|
---|
| 124 |
|
---|
| 125 | ;"Result: returns the shortened name, or "^" for abort, or 0 for requested retry.
|
---|
| 126 |
|
---|
| 127 | new result set result=""
|
---|
| 128 | set MaxLen=$get(MaxLen,1)
|
---|
| 129 | set AllowCut=$get(AllowCut,0)
|
---|
| 130 | new UserAsked set UserAsked=0
|
---|
| 131 | new StartOver set StartOver=0
|
---|
| 132 | new OrigName set OrigName=$$CompArray(.Names,.Dividers)
|
---|
| 133 |
|
---|
| 134 | ;"First try a non-interactive shortening
|
---|
| 135 | set result=$$AutoShortenArray(.Names,.Dividers,MaxLen,"/"," ")
|
---|
| 136 | if (AllowCut'=1)&(result["...") goto SNA0
|
---|
| 137 | if $length(result)'>MaxLen goto SNA1Done
|
---|
| 138 |
|
---|
| 139 | SNA0 if AllowCut=1 set result=$$CutName(.Names,.Dividers,MaxLen) goto SNA1Done
|
---|
| 140 | if AllowCut=2 set result=$$CompArray(.Names,.Dividers) goto SNA1Done
|
---|
| 141 |
|
---|
| 142 | SNA1 if result=0 goto SNA2Done ;"requesting retry.
|
---|
| 143 | set result=$$Trim^TMGSTUTL($$CompArray(.Names,.Dividers))
|
---|
| 144 | if $length(result)'>MaxLen goto SNA1Done
|
---|
| 145 |
|
---|
| 146 | write OrigName,"-->",!
|
---|
| 147 | write "Current Name:",!
|
---|
| 148 | write result,!
|
---|
| 149 | if MaxLen>1 do
|
---|
| 150 | . new tempS set tempS="Shorten to ---> |"
|
---|
| 151 | . for i=1:1:MaxLen-$length(tempS) write " "
|
---|
| 152 | . write tempS
|
---|
| 153 | . for i=1:1:$length(result)-MaxLen write "x"
|
---|
| 154 | . write !
|
---|
| 155 |
|
---|
| 156 | write "-----------------------",!
|
---|
| 157 | for i=1:1:Names("MAXNODE") do
|
---|
| 158 | . if $get(Names(i))="" quit
|
---|
| 159 | . write i,". ",Names(i)
|
---|
| 160 | . new temp set temp=$$GetAbvr^TMGABV(Names(i),0)
|
---|
| 161 | . if (temp'="")&(temp'=Names(i)) write " (<-- Quick Fix: ",temp,")"
|
---|
| 162 | . write !
|
---|
| 163 | write "-----------------------",!
|
---|
| 164 | write " # (or #-#) -- Shorten name(s) Q# (or #-#) -- Use Quick FiX",!
|
---|
| 165 | write " S# -- Sub-edit name T -- Free text for ALL",!
|
---|
| 166 | write " S?# -- Sub-edit name (ask for divider character)",!
|
---|
| 167 | write " Sx# -- Sub-edit name (use any character (i.e. replace 'x') as divider)",!
|
---|
| 168 | write " J# -- Join word # to word #+1 F# -- Fix erroneous abbrev",!
|
---|
| 169 | write " D# (or D#-#) -- Delete # X# -- Kill Quick Fix",!
|
---|
| 170 | write " ! -- toggle debug mode ",$select(($get(TMGDBABV)=1):"OFF",1:"ON"),!
|
---|
| 171 | write " C -- cut to: ",$$CutName(.Names,.Dividers,MaxLen),!
|
---|
| 172 | ;"write " ^^ -- Abort",!
|
---|
| 173 | write "(^ to quit, ^^ to abort): ^//"
|
---|
| 174 | set UserAsked=1
|
---|
| 175 | read temp:$get(DTIME,3600),!
|
---|
| 176 | set temp=$$UP^XLFSTR(temp)
|
---|
| 177 | if temp="" set temp="^" do goto SNA1Done
|
---|
| 178 | . set result=$$CompArray(.Names,.Dividers)
|
---|
| 179 | if temp="^^" set result="^" goto SNA2Done
|
---|
| 180 | if temp="C" set AllowCut=1 goto SNA0
|
---|
| 181 | if "S"[$extract(temp,1) do
|
---|
| 182 | . new num1,s
|
---|
| 183 | . new nodeDiv set nodeDiv=" "
|
---|
| 184 | . set s=$extract(temp,2)
|
---|
| 185 | . if +s'=s do quit:(nodeDiv="^")
|
---|
| 186 | . . if s="?" do quit:(nodeDiv="^")
|
---|
| 187 | . . . write "Enter character that divides words (e.g. '/' ',' '|' ';' ' ' etc.)",!
|
---|
| 188 | . . . read "Divider character? ' '// ",nodeDiv,!
|
---|
| 189 | . . . if nodeDiv="" set nodeDiv=" "
|
---|
| 190 | . . else set nodeDiv=s
|
---|
| 191 | . . set num1=+$extract(temp,3,99)
|
---|
| 192 | . else set num1=+$extract(temp,2,99)
|
---|
| 193 | . if num1=0 read "Enter NUMBER of name to edit: ",num1:$get(DTIME,3600),!
|
---|
| 194 | . set num1=+num1
|
---|
| 195 | . if (num1'>0)!(num1>Names("MAXNODE")) quit
|
---|
| 196 | . new temp set temp=$$Short1Name(Names(num1),$length(Names(num1))-1,nodeDiv)
|
---|
| 197 | . if (temp="^")!(temp="")!(temp=Names(num1)) quit
|
---|
| 198 | . do Write^TMGABV(Names(num1),temp,,1) ;"1=> confirm
|
---|
| 199 | . set Names(num1)=temp
|
---|
| 200 | if temp="T" do goto SNA1Done
|
---|
| 201 | TX1 . write "Enter text for ENTIRE name (combining all shown parts) (^ to abort):",!
|
---|
| 202 | . read "> ",input:$get(DTIME,3600),!
|
---|
| 203 | . if input="^" quit
|
---|
| 204 | . ;"kill Words,Dividers
|
---|
| 205 | . kill Names,Dividers
|
---|
| 206 | . ;"set Words(1)=input,Words("MAXNODE")=1,Dividers(1)=""
|
---|
| 207 | . set Names(1)=input,Names("MAXNODE")=1,Dividers(1)=""
|
---|
| 208 | if "J"[$extract(temp,1) do
|
---|
| 209 | . new JoinNum
|
---|
| 210 | . set JoinNum=+$extract(temp,2,99)
|
---|
| 211 | . if JoinNum'>0 read "Enter # to join: ",JoinNum:$get(DTIME,3600),!
|
---|
| 212 | . if +JoinNum'>0 quit
|
---|
| 213 | . ;"if JoinNum=Words("MAXNODE") do quit
|
---|
| 214 | . if JoinNum=Names("MAXNODE") do quit
|
---|
| 215 | . . write "Enter the # of the FIRST word to be joined.",!
|
---|
| 216 | JL1 . ;"do SetJoin(JoinNum,2,.Words,.Dividers)
|
---|
| 217 | . do SetJoin(JoinNum,2,.Names,.Dividers)
|
---|
| 218 | if (temp="D")!(temp?1"D".N)!(temp?1"D".N1"-".N) do goto SNA1
|
---|
| 219 | JL2 . new delNum,delNum2,i
|
---|
| 220 | . set temp=$extract(temp,2,99)
|
---|
| 221 | . ;"if Words("MAXNODE")=1 set delNum=1,delNum2=1
|
---|
| 222 | . if $get(Names("MAXNODE"))=1 set delNum=1,delNum2=1
|
---|
| 223 | . else do
|
---|
| 224 | . . set delNum=+$piece(temp,"-",1)
|
---|
| 225 | . . set delNum2=+$piece(temp,"-",2)
|
---|
| 226 | . . if delNum2<delNum set delNum2=delNum
|
---|
| 227 | . . if delNum>0 quit
|
---|
| 228 | . . read "Enter # (or #-#) to delete: ",temp:$get(DTIME,3600),!
|
---|
| 229 | . . set delNum=+$piece(temp,"-",1)
|
---|
| 230 | . . set delNum2=+$piece(temp,"-",2)
|
---|
| 231 | . . if delNum2<delNum set delNum2=delNum
|
---|
| 232 | . for i=delNum:1:delNum2 do
|
---|
| 233 | . . ;"if +i>0 kill Words(i),Dividers(i)
|
---|
| 234 | . . if +i>0 kill Names(i),Dividers(i)
|
---|
| 235 | . ;"do PackArrays("Words","Dividers")
|
---|
| 236 | . do PackArrays("Names","Dividers")
|
---|
| 237 | if "X"[$extract(temp,1) do
|
---|
| 238 | . new delNum
|
---|
| 239 | . ;"if Words("MAXNODE")=1 set delNum=1
|
---|
| 240 | . if Names("MAXNODE")=1 set delNum=1
|
---|
| 241 | . else do
|
---|
| 242 | . . set delNum=+$extract(temp,2,99)
|
---|
| 243 | . . if delNum>0 quit
|
---|
| 244 | . . read "Enter # of Quick Fix to delete: ",delNum:$get(DTIME,3600),!
|
---|
| 245 | . ;"if +delNum>0 do Del^TMGABV(Words(delNum))
|
---|
| 246 | . if +delNum>0 do Del^TMGABV(Names(delNum))
|
---|
| 247 | if (temp?.N)!(temp?.N1"-".N) do goto SNA1
|
---|
| 248 | . new num1,num2
|
---|
| 249 | . set num1=+$piece(temp,"-",1)
|
---|
| 250 | . set num2=+$piece(temp,"-",2)
|
---|
| 251 | . if num2=0 set num2=num1
|
---|
| 252 | . new tempS set tempS=""
|
---|
| 253 | . for i=num1:1:num2 set tempS=tempS_Names(i)_" "
|
---|
| 254 | . set tempS=$$Trim^TMGSTUTL(tempS)
|
---|
| 255 | . set tempS=$$GetAbvr^TMGABV(tempS,1)
|
---|
| 256 | . for i=num1+1:1:num2 kill Names(i)
|
---|
| 257 | . for i=num1:1:(num2-1) kill Dividers(i)
|
---|
| 258 | . set Names(num1)=tempS
|
---|
| 259 | . do PackArrays("Names","Dividers")
|
---|
| 260 | if (temp="Q")!(temp?1"Q".N)!(temp?1"Q".N1"-".N) do goto SNA1
|
---|
| 261 | . new num1,num2
|
---|
| 262 | . set num1=+$extract(temp,2,99)
|
---|
| 263 | . if num1=0 do quit:(+num1=0)
|
---|
| 264 | . . read "Enter NUMBER(S) of Quick Fix to use: ",temp:$get(DTIME,3600),!
|
---|
| 265 | . . set num1=+$piece(temp,"-",1)
|
---|
| 266 | . . set num2=+$piece(temp,"-",2)
|
---|
| 267 | . if +$get(num2)=0 set num2=num1
|
---|
| 268 | . for i=num1:1:num2 do
|
---|
| 269 | . . set Names(i)=$$GetAbvr^TMGABV(Names(i),0)
|
---|
| 270 | if (temp="F")!(temp?1"F"1N) do goto SNA1
|
---|
| 271 | . new num1 set num1=+$extract(temp,2,99)
|
---|
| 272 | . if num1=0 do quit:(+num1=0)
|
---|
| 273 | . . read "Enter NUMBER of abbreviation to fix: ",temp:$get(DTIME,3600),!
|
---|
| 274 | . . set num1=+temp
|
---|
| 275 | . new s set s=$$Fix^TMGABV(Names(num1),OrigName)
|
---|
| 276 | . if s=0 set result=0 quit ;"signal retry
|
---|
| 277 | . set Names(num1)=s
|
---|
| 278 | . if Names(num1)="" do
|
---|
| 279 | . . kill Names(num1)
|
---|
| 280 | . . ;"do PackArrays("Words","Dividers")
|
---|
| 281 | . . do PackArrays("Names","Dividers")
|
---|
| 282 | if (temp="!") do goto SNA1
|
---|
| 283 | JL5 . if $get(TMGDBABV)=1 kill TMGDBABV
|
---|
| 284 | . else set TMGDBABV=1
|
---|
| 285 | . set result=0 ;"signal request for retry.
|
---|
| 286 | goto SNA1
|
---|
| 287 |
|
---|
| 288 | SNA1Done set result=$$Trim^TMGSTUTL(result)
|
---|
| 289 | SNA2Done
|
---|
| 290 | if (UserAsked=1)&(+result'=0) write "Using: ",result,!
|
---|
| 291 | quit result
|
---|
| 292 |
|
---|
| 293 |
|
---|
| 294 | ReadJoin(JoinNum,Len,Words,Dividers)
|
---|
| 295 | ;"Purpose: To read out a phrase of joined words, Len words long
|
---|
| 296 | ;"Input: JoinNum -- the index in Words where joining begins
|
---|
| 297 | ;" Len -- the length to return. e.g. 2 --> two words joined
|
---|
| 298 | ;" Words -- PASS BY REFERENCE. Array holding words
|
---|
| 299 | ;" Dividers -- PASS BY REFERENCE. Array holding dividers between words
|
---|
| 300 | ;"Results: returns string of joined words
|
---|
| 301 |
|
---|
| 302 | new result set result=""
|
---|
| 303 | if (JoinNum+Len-1)>Words("MAXNODE") goto RJDone
|
---|
| 304 | set result=$get(Words(JoinNum))
|
---|
| 305 | new i for i=JoinNum:1:(JoinNum+Len-2) do
|
---|
| 306 | . set result=result_Dividers(i)_$get(Words(i+1))
|
---|
| 307 | RJDone quit result
|
---|
| 308 |
|
---|
| 309 |
|
---|
| 310 | SetJoin(JoinNum,Len,Words,Dividers)
|
---|
| 311 | ;"Purpose: To reform the Word and Dividers arrays such that words are
|
---|
| 312 | ;" joined together. E.g. #1='One' #2='Minute' ==> #1='One Minute'
|
---|
| 313 | ;"Input: JoinNum -- the index in Words where joining begins
|
---|
| 314 | ;" Len -- the length to return. e.g. 2 --> two words joined
|
---|
| 315 | ;" Words -- PASS BY REFERENCE. Array holding words
|
---|
| 316 | ;" Dividers -- PASS BY REFERENCE. Array holding dividers between words
|
---|
| 317 | ;"Results: None
|
---|
| 318 |
|
---|
| 319 | new temp set temp=$$ReadJoin^TMGSHORT(JoinNum,Len,.Words,.Dividers)
|
---|
| 320 | new i for i=JoinNum:1:(JoinNum+Len-1) do
|
---|
| 321 | . if i'=JoinNum kill Words(i)
|
---|
| 322 | . if i'=(JoinNum+Len-1) kill Dividers(i)
|
---|
| 323 |
|
---|
| 324 | set Words(JoinNum)=temp
|
---|
| 325 | do PackArrays("Words","Dividers")
|
---|
| 326 |
|
---|
| 327 | quit
|
---|
| 328 |
|
---|
| 329 |
|
---|
| 330 | Short1Name(Name,MaxLen,Div1,Div2,Words,Dividers)
|
---|
| 331 | ;"Purpose: An interactive editing of one name
|
---|
| 332 | ;"Input: Name -- the name (string) to shorten.
|
---|
| 333 | ;" MaxLen -- OPTIONAL. The Max length of the string.
|
---|
| 334 | ;" Div1 -- OPTIONAL. The first character used to separate words. Default is " "
|
---|
| 335 | ;" Div2 -- OPTIONAL. The second character used to separate words. Default is "/"
|
---|
| 336 | ;" Words -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns Name divided up into words
|
---|
| 337 | ;" Dividers -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns dividers between words
|
---|
| 338 | ;"Results: returns shortened name, or "^" for user abort
|
---|
| 339 |
|
---|
| 340 | set Div1=$get(Div1," ")
|
---|
| 341 | set Div2=$get(Div2)
|
---|
| 342 |
|
---|
| 343 | S1N0 do CleaveToArray^TMGSTUTL(Name,Div1,.Words)
|
---|
| 344 | for i=1:1:Words("MAXNODE") set Dividers(i)=Div1
|
---|
| 345 | set Dividers(Words("MAXNODE"))=""
|
---|
| 346 | if Div2'="" do SubDivArray(.Words,.Dividers,Div1,Div2)
|
---|
| 347 |
|
---|
| 348 | set result=$$ShortenArray^TMGSHORT(.Words,.Dividers,MaxLen,0)
|
---|
| 349 | if result=0 kill Words,Dividers goto S1N0
|
---|
| 350 |
|
---|
| 351 | quit result
|
---|
| 352 |
|
---|
| 353 |
|
---|
| 354 | Cut1Name(Name,MaxLen,Div1,Div2,Words,Dividers)
|
---|
| 355 | ;"Purpose: A non-interactive cut of one name
|
---|
| 356 | ;"Input: Name -- the name (string) to shorten.
|
---|
| 357 | ;" MaxLen -- The length of the string to cut to.
|
---|
| 358 | ;" Div1 -- OPTIONAL. The first character used to separate words. Default is " "
|
---|
| 359 | ;" Div2 -- OPTIONAL. The second character used to separate words. Default is "/"
|
---|
| 360 | ;" Words -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns Name divided up into words
|
---|
| 361 | ;" Dividers -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns dividers between words
|
---|
| 362 | ;"Results: returns cut name
|
---|
| 363 |
|
---|
| 364 | set Div1=$get(Div1," ")
|
---|
| 365 | set Div2=$get(Div2)
|
---|
| 366 |
|
---|
| 367 | do CleaveToArray^TMGSTUTL(Name,Div1,.Words)
|
---|
| 368 | for i=1:1:Words("MAXNODE") set Dividers(i)=Div1
|
---|
| 369 | set Dividers(Words("MAXNODE"))=""
|
---|
| 370 | if Div2'="" do SubDivArray(.Words,.Dividers,Div1,Div2)
|
---|
| 371 |
|
---|
| 372 | set result=$$CutName(.Words,.Dividers,MaxLen)
|
---|
| 373 |
|
---|
| 374 | quit result
|
---|
| 375 |
|
---|
| 376 |
|
---|
| 377 | Short2Name(Name,Div1,Div2,Words,Dividers,Category)
|
---|
| 378 | ;"Purpose: Shorten a name, using abbreviations etc. to shortest form possible
|
---|
| 379 | ;" Will separate name into individual words, separated by spaces
|
---|
| 380 | ;" and try to abbreviate each one.
|
---|
| 381 | ;"Input: Name -- name to shorten
|
---|
| 382 | ;" Div1 -- OPTIONAL. The first character used to separate words. Default is " "
|
---|
| 383 | ;" Div2 -- OPTIONAL. The second character used to separate words. Default is "/"
|
---|
| 384 | ;" Words -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns Name divided up into words
|
---|
| 385 | ;" Dividers -- OPTIONAL. PASS BY REFERENCE, an OUT PARAMETER. Returns dividers between words
|
---|
| 386 | ;" Category -- OPTIONAL. a category to look for phrases in
|
---|
| 387 | ;"Result: returns a shortened form of name
|
---|
| 388 | ;"Note: no testing of length done.
|
---|
| 389 | ;"Note: this function is NOT interactive with the user
|
---|
| 390 | ;"Note: This functions should be called repetatively,using the output from
|
---|
| 391 | ;" the last run as the input for the next run, until there is not further
|
---|
| 392 | ;" change, to get the best results.
|
---|
| 393 |
|
---|
| 394 | new temp,result,i
|
---|
| 395 | set result=""
|
---|
| 396 | if $get(Name)="" goto SN2Don2
|
---|
| 397 |
|
---|
| 398 | set result=$$GetAbvr^TMGABV(Name,0)
|
---|
| 399 | if (result'="")&(result'=Name) goto SN2Done
|
---|
| 400 |
|
---|
| 401 | set Div1=$get(Div1," ") if Div1="" set Div1="@@@@"
|
---|
| 402 | set Div2=$get(Div2,"/") if Div2="" set Div2="@@@@"
|
---|
| 403 |
|
---|
| 404 | kill Words,Dividers
|
---|
| 405 | do CleaveToArray^TMGSTUTL(Name,Div1,.Words)
|
---|
| 406 | for i=1:1:Words("MAXNODE") set Dividers(i)=Div1
|
---|
| 407 | set Dividers(Words("MAXNODE"))="" ;"//kt added 10/27/06
|
---|
| 408 |
|
---|
| 409 | ;"Note: This purposefully does not keep rechecking for ever shortening
|
---|
| 410 | ;" Abreviations (or abrv of abrv's) so that the calling function
|
---|
| 411 | ;" can concat the results from this onto others and determine a
|
---|
| 412 | ;" total length, and then recall if needed.
|
---|
| 413 | new count set count=Words("MAXNODE")
|
---|
| 414 | for i=1:1:count do
|
---|
| 415 | . new temp,temp2
|
---|
| 416 | . if Words(i)[Div2 set temp=$$Short2Name(Words(i),Div2)
|
---|
| 417 | . else set temp=$$GetAbvr^TMGABV(Words(i),0)
|
---|
| 418 | . set Words(i)=temp
|
---|
| 419 |
|
---|
| 420 | ;"Now look for double word matches
|
---|
| 421 | set Category=$get(Category,0)
|
---|
| 422 | SNL0 for i=1:1:count do
|
---|
| 423 | . new temp,temp2
|
---|
| 424 | . set temp=$$ReadJoin^TMGSHORT(i,2,.Words,.Dividers)
|
---|
| 425 | . set temp2=$$GetAbvr^TMGABV(temp,Category)
|
---|
| 426 | . if (temp2'="")&(temp'=temp2) do
|
---|
| 427 | SNL1 . . ;"write "Found double word match: ",temp,"-->",temp2,!
|
---|
| 428 | . . do SetJoin^TMGSHORT(i,2,.Words,.Dividers)
|
---|
| 429 | . . set Words(i)=temp2
|
---|
| 430 | . . ;"zwr Words(*)
|
---|
| 431 | . . set i=0,count=Words("MAXNODE")
|
---|
| 432 |
|
---|
| 433 | set result=$$CompArray(.Words,.Dividers)
|
---|
| 434 |
|
---|
| 435 | SN2Done set result=$$Trim^TMGSTUTL(result)
|
---|
| 436 | if (Name'=result) do Write^TMGABV(Name,result)
|
---|
| 437 |
|
---|
| 438 | SN2Don2 quit result
|
---|
| 439 |
|
---|
| 440 |
|
---|
| 441 | SubDivArray(Words,Dividers,Div1,Div2)
|
---|
| 442 | ;"Purpose: To see if any words in Words array needs to be subdivided,
|
---|
| 443 | ;" and to handle if needed.
|
---|
| 444 | ;"Input: Words -- PASS BY REFERENCE. Array of words
|
---|
| 445 | ;" Dividers -- PASS BY REFERENCE. Array of dividing parts
|
---|
| 446 | ;" Div1 -- the first division character, e.g. "/" or " "
|
---|
| 447 | ;" Div2 -- the second division character, e.g. " " or "/"
|
---|
| 448 | ;"Results: none
|
---|
| 449 |
|
---|
| 450 | new i
|
---|
| 451 | for i=1:1:Words("MAXNODE") do
|
---|
| 452 | . if Words(i)[Div2 do
|
---|
| 453 | . . new tempWords,j
|
---|
| 454 | . . do CleaveToArray^TMGSTUTL(Words(i),Div2,.tempWords)
|
---|
| 455 | . . for j=1:1:tempWords("MAXNODE") do
|
---|
| 456 | . . . set Words(+(i_"."_j))=tempWords(j)
|
---|
| 457 | . . . if j'=tempWords("MAXNODE") set Dividers(+(i_"."_j))=Div2
|
---|
| 458 | . . . else set Dividers(+(i_"."_j))=Div1
|
---|
| 459 | . . kill Words(i),Dividers(i)
|
---|
| 460 | do PackArrays("Words","Dividers")
|
---|
| 461 |
|
---|
| 462 | quit
|
---|
| 463 |
|
---|
| 464 |
|
---|
| 465 | PackArrays(pNames,pDividers)
|
---|
| 466 | ;"Purpose: to pack the arrays, after items had been deleted.
|
---|
| 467 | ;"Input: Names -- PASS BY NAME. Array of words
|
---|
| 468 | ;" Dividers -- PASS BY NAME. Array of dividing parts
|
---|
| 469 | ;"Result: none
|
---|
| 470 |
|
---|
| 471 | do ListPack^TMGMISC(pNames)
|
---|
| 472 | do ListPack^TMGMISC(pDividers)
|
---|
| 473 | set @pNames@("MAXNODE")=$$ListCt^TMGMISC(pNames)
|
---|
| 474 | set @pDividers@("MAXNODE")=$$ListCt^TMGMISC(pDividers)
|
---|
| 475 | quit
|
---|
| 476 |
|
---|
| 477 |
|
---|
| 478 | CompArray(Names,Dividers)
|
---|
| 479 | ;"Purpose: to reconstruct the resulting sentence from words in array.
|
---|
| 480 | ;"Input: Names -- PASS BY REFERENCE. Array of words
|
---|
| 481 | ;" Dividers -- PASS BY REFERENCE. Array of dividing parts
|
---|
| 482 | ;"Result: returns the compiled result
|
---|
| 483 |
|
---|
| 484 | new result,j
|
---|
| 485 | set result=""
|
---|
| 486 | for j=1:1:Names("MAXNODE") do
|
---|
| 487 | . set result=result_Names(j)
|
---|
| 488 | . if Names(j)'="" set result=result_Dividers(j)
|
---|
| 489 | quit result
|
---|
| 490 |
|
---|
| 491 |
|
---|
| 492 | AutoShortenArray(Names,Dividers,MaxLen,Div1,Div2)
|
---|
| 493 | ;"Purpose: To automatically shorten the words in the array
|
---|
| 494 | ;"Input: Names -- PASS BY REFERENCE. Array of words
|
---|
| 495 | ;" Dividers -- PASS BY REFERENCE. Array of dividing parts
|
---|
| 496 | ;" Div1 -- the first division character, e.g. "/" or " "
|
---|
| 497 | ;" Div2 -- the second division character, e.g. " " or "/"
|
---|
| 498 |
|
---|
| 499 | new result,newName,changeMade
|
---|
| 500 | set result=""
|
---|
| 501 |
|
---|
| 502 | new temp set temp=$$CompArray(.Names,.Dividers)
|
---|
| 503 | set result=$$GetAbvr^TMGABV(temp,0)
|
---|
| 504 | if result="^" set result="" do Del^TMGABV(temp)
|
---|
| 505 | if (result'="")&($length(result)'>MaxLen) goto ASADone
|
---|
| 506 |
|
---|
| 507 | for do quit:(changeMade=0)!($length(result)'>MaxLen)
|
---|
| 508 | . set changeMade=0
|
---|
| 509 | . for i=1:1:Names("MAXNODE") do
|
---|
| 510 | . . set newName=$$Short2Name(Names(i),.Div1,.Div2)
|
---|
| 511 | . . ;"there was a loop where a name was repeatitively being replace with longer names --> crash
|
---|
| 512 | . . if (newName'=Names(i))&($length(newName)<$length(Names(i))) do
|
---|
| 513 | . . . set Names(i)=newName
|
---|
| 514 | . . . set changeMade=1
|
---|
| 515 | . set result=$$CompArray(.Names,.Dividers)
|
---|
| 516 |
|
---|
| 517 | ASADone
|
---|
| 518 | quit result
|
---|
| 519 |
|
---|
| 520 |
|
---|
| 521 | CutName(Names,Dividers,MaxLen)
|
---|
| 522 | ;"Purpose: To return a non-interactive shortened ('cut') name
|
---|
| 523 | ;"Input: Names - PASS BY REFERENCE. As created in ShortNetName
|
---|
| 524 | ;" This is an array with the various words in the name
|
---|
| 525 | ;" Dividers -- PASS BY REFERENCE As created in ShortNetName
|
---|
| 526 | ;" This is an array with the spaces or punctiation separating words
|
---|
| 527 | ;" MaxLen -- The target length for result
|
---|
| 528 | ;"Result: returns the shortened name
|
---|
| 529 |
|
---|
| 530 | new partA,partB,Max,i,lenA
|
---|
| 531 | new result
|
---|
| 532 |
|
---|
| 533 | set Max=$get(Names("MAXNODE"))
|
---|
| 534 |
|
---|
| 535 | if Max'>3 do goto CutDone
|
---|
| 536 | . set result=$$CompArray(.Names,.Dividers)
|
---|
| 537 | . set result=$extract(result,1,MaxLen)
|
---|
| 538 |
|
---|
| 539 | set partB=$get(Dividers(Max-3))
|
---|
| 540 | for i=Max-2:1:Max do
|
---|
| 541 | . set partB=partB_Names(i)
|
---|
| 542 | . if Names(i)'="" set partB=partB_Dividers(i)
|
---|
| 543 | set partB=$$Trim^TMGSTUTL(partB)
|
---|
| 544 | set partA=""
|
---|
| 545 | for i=1:1:Max-3 set partA=partA_Names(i) set:(i<(Max-3))&(Names(i)'="") partA=partA_Dividers(i)
|
---|
| 546 | new allowedALen set allowedALen=MaxLen-$length(partB)
|
---|
| 547 | set lenA=$length(partA)
|
---|
| 548 | if lenA>allowedALen do
|
---|
| 549 | . set allowedALen=allowedALen-4
|
---|
| 550 | . if lenA=0 set partA="" quit
|
---|
| 551 | . if (allowedALen/lenA)<0.4 set partA="" quit
|
---|
| 552 | . if allowedALen<4 set partA="" quit
|
---|
| 553 | . set partA=$extract(partA,1,allowedALen)_"... "
|
---|
| 554 | set result=$$Trim^TMGSTUTL(partA_partB)
|
---|
| 555 | if $length(result)>MaxLen do
|
---|
| 556 | . if partA="" do
|
---|
| 557 | . . set partB="" ;"$get(Dividers(Max-2))
|
---|
| 558 | . . for i=Max-1:1:Max do
|
---|
| 559 | . . . set partB=partB_Names(i)
|
---|
| 560 | . . . if Names(i)'="" set partB=partB_Dividers(i)
|
---|
| 561 | . . set partB=$$Trim^TMGSTUTL(partB)
|
---|
| 562 | . . set partA=Names(Max-2)
|
---|
| 563 | . . new allowedALen set allowedALen=MaxLen-$length(partB)-4
|
---|
| 564 | . . set partA=$extract(partA,1,allowedALen)_"... "
|
---|
| 565 | . . set result=partA_partB
|
---|
| 566 | . else set result=$extract(result,1,MaxLen)
|
---|
| 567 |
|
---|
| 568 | CutDone
|
---|
| 569 | quit result
|
---|
| 570 |
|
---|
| 571 |
|
---|
| 572 | PShortName(Name,Length,AskUser)
|
---|
| 573 | ;"Purpose: To shorten the drug smartly, using abbreviations
|
---|
| 574 | ;" This function differs from ShortName (see below) because it smartly
|
---|
| 575 | ;" 'P'icks whether to use '/' or ' ' as a divider str.
|
---|
| 576 | ;"Input: Name -- the drug name to shorten
|
---|
| 577 | ;" Expected format is that found in file 50.6 field .01,
|
---|
| 578 | ;" i.e. INGREDIENT/INGREDIENT/INGREDIENT...
|
---|
| 579 | ;" Length -- The desired string length
|
---|
| 580 | ;" AskUser -- OPTIONAL. Default=0.
|
---|
| 581 | ;" If 1 then user is asked to supply abreviations if needed.
|
---|
| 582 | ;" If 2 then name is shortened as much as possible, but it
|
---|
| 583 | ;" might be longer than Length, it is not cut, and user is
|
---|
| 584 | ;" not asked.
|
---|
| 585 | ;"Result : returns shortened name, "^" for abort.
|
---|
| 586 |
|
---|
| 587 | new DivStr,result
|
---|
| 588 | if $length(Name,"/")>2 set DivStr="/"
|
---|
| 589 | else set DivStr=" "
|
---|
| 590 |
|
---|
| 591 | set result=$$ShortName(.Name,.Length,.AskUser,DivStr)
|
---|
| 592 | quit result
|
---|
| 593 |
|
---|
| 594 | ShortName(Name,Length,AskUser,DivStr)
|
---|
| 595 | ;"Purpose: To shorten the drug smartly, using abbreviations
|
---|
| 596 | ;"Input: Name -- the drug name to shorten
|
---|
| 597 | ;" Expected format is that found in file 50.6 field .01,
|
---|
| 598 | ;" i.e. INGREDIENT/INGREDIENT/INGREDIENT...
|
---|
| 599 | ;" Length -- The desired string length
|
---|
| 600 | ;" AskUser -- OPTIONAL. Default=0.
|
---|
| 601 | ;" If 1 then user is asked to supply abreviations if needed.
|
---|
| 602 | ;" If 2 then name is shortened as much as possible, but it
|
---|
| 603 | ;" might be longer than Length, it is not cut, and user is
|
---|
| 604 | ;" not asked.
|
---|
| 605 | ;" DivStr -- the divider that separates parts. Default="/"
|
---|
| 606 | ;"Result : returns shortened name, "^" for abort.
|
---|
| 607 |
|
---|
| 608 | new temp,Words,Dividers
|
---|
| 609 | set AskUser=$get(AskUser,0)
|
---|
| 610 | set DivStr=$get(DivStr,"/")
|
---|
| 611 |
|
---|
| 612 | if Name="" set temp="^" goto SNDone
|
---|
| 613 | set temp=$$Read^TMGABV(Name,Length)
|
---|
| 614 |
|
---|
| 615 | if (temp'="")&($length(temp)'>Length) goto SNDone
|
---|
| 616 |
|
---|
| 617 | ;"Note: $$ShortName does NOT check length
|
---|
| 618 | new oldTemp,done
|
---|
| 619 | set temp=Name,done=0
|
---|
| 620 | for do quit:done!($length(temp)'>Length)
|
---|
| 621 | . set oldTemp=temp
|
---|
| 622 | . set temp=$$Short2Name(temp,DivStr,"",.Words,.Dividers,Length)
|
---|
| 623 | . if temp=oldTemp set done=1 quit
|
---|
| 624 | . if ($length(temp)'>Length) set done=1 ;"don't quit yet
|
---|
| 625 | . if (temp["...")&(AskUser=1) write !,"Remove '...' from name",! set done=0
|
---|
| 626 |
|
---|
| 627 | if (($length(temp)>Length)&(AskUser=1)) do
|
---|
| 628 | SNm0 . new killthis set killthis=0
|
---|
| 629 | . write "IEN 50.6=",$get(IEN50d6,"?")," IEN 50.606=",$get(IEN50d606,"?")
|
---|
| 630 | . write " Dose=",$get(Dose,"?")," IEN 50=",$get(IEN50,"?"),!
|
---|
| 631 | . write Name,!
|
---|
| 632 | SNm1 . set temp=$$Short1Name(temp,Length,DivStr,"",.Words,.Dividers)
|
---|
| 633 | . if (temp'="")&(temp'="^")&(temp'=Name) do
|
---|
| 634 | . . do Write^TMGABV(Name,temp,Length,(AskUser=1))
|
---|
| 635 | . write !
|
---|
| 636 |
|
---|
| 637 | if ($length(temp)>Length)&(AskUser'=2) do
|
---|
| 638 | . if ($data(Words)=0)!($data(Dividers)=0) do quit
|
---|
| 639 | . . set temp=$extract(temp,1,Length)
|
---|
| 640 | . set temp=$$CutName(.Words,.Dividers,Length)
|
---|
| 641 | SNDone
|
---|
| 642 | if $extract(temp,1)="/" set temp=$extract(temp,2,Length)
|
---|
| 643 | quit temp
|
---|
| 644 |
|
---|
| 645 |
|
---|