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