1 | PSOUTLA2 ;BHAM ISC/GSN-Pharmacy utility program cont. ;6/6/05 12:19pm
|
---|
2 | ;;7.0;OUTPATIENT PHARMACY;**210**;DEC 1997
|
---|
3 | Q
|
---|
4 | ;
|
---|
5 | WORDWRAP(STR,IEN,GL,LM) ;Wraps words at spaces normally and will breakup long
|
---|
6 | ; words at a delimiter & wrap at those break points
|
---|
7 | ; Input: STR - a text string
|
---|
8 | ; IEN - ien of global
|
---|
9 | ; GL - global root
|
---|
10 | ; LM - left margin
|
---|
11 | ; Output: Populated global (usually in ^TMP)
|
---|
12 | ;
|
---|
13 | ; When a long word is encountered, i.e. text with no spaces, an
|
---|
14 | ; attempt will be made to locate a delimiter & break the line there.
|
---|
15 | ; If it can't find a valid delimiter without a restricted scenario,
|
---|
16 | ; i.e. a number like 1,000 , then it will be forced to break at the
|
---|
17 | ; End of Line (EOL).
|
---|
18 | ;
|
---|
19 | ; Delimiters searched for and order they are picked for use:
|
---|
20 | ; preferred: , ;
|
---|
21 | ; alternate: : =
|
---|
22 | ; do not use: - . ) ( / (to critical, used in dosing)
|
---|
23 | ; example: "TAKE 1/2-1 TAB(7.5MG) TABLET(S)"
|
---|
24 | ;
|
---|
25 | ; Key Variables: WORD - current word from text string
|
---|
26 | ; WORD1 - 1st part of word that will fit
|
---|
27 | ; WORD2 - 2nd part of word for new line
|
---|
28 | ; WORD0 - remnant that won't fit on the new line
|
---|
29 | ;
|
---|
30 | N QQ,DL,DLM,WD,LL,TL,UL,MAXLN,LSTD,CURD,GWRD,LC,WORD0,WORD,WORD1,WORD2
|
---|
31 | S IEN=+$G(IEN),@GL@(IEN,0)=$G(@GL@(IEN,0)),WORD0=""
|
---|
32 | ;loop thru words, quit if no more words & no remnants - i.e. WORD0
|
---|
33 | F QQ=1:1 S WORD=$P(STR," ",QQ) D Q:(QQ'<$L(STR," "))&(WORD0="")
|
---|
34 | . ;if remnant exists, prepend to next Word
|
---|
35 | . S:WORD0]"" WORD=WORD0_WORD,WORD0=""
|
---|
36 | . ;wrap short words at spaces, check if last char is already a space
|
---|
37 | . S GWRD=@GL@(IEN,0)
|
---|
38 | . S LC=$E(@GL@(IEN,0),$L(GWRD))
|
---|
39 | . I LC=" ",$L(GWRD_WORD)<81 S @GL@(IEN,0)=@GL@(IEN,0)_WORD Q
|
---|
40 | . I LC'=" ",$L(GWRD_" "_WORD)<81 S @GL@(IEN,0)=@GL@(IEN,0)_" "_WORD Q
|
---|
41 | . I $L(WORD)<20,$L(LM+1+$L(WORD))<81 D Q
|
---|
42 | . . S WORD1="",WORD2=WORD,DLM="" D ADDWORDS S WORD0=WORD2 Q
|
---|
43 | . ;
|
---|
44 | . ;word>80, so wrap long words @ a specific delimiter, if found
|
---|
45 | . S MAXLN=79-$L(@GL@(IEN,0))
|
---|
46 | . ;search backwards & pick 1st dl > 1 count of preferred delims
|
---|
47 | . F DL=";","," S DL($L(WORD,DL))=DL
|
---|
48 | . S DL=$O(DL(DL),-1) S DLM=$S(DL>1:DL(DL),1:"")
|
---|
49 | . I DLM="" F DL="=",":" S DL($L(WORD,DL))=DL D ;try these alt delims
|
---|
50 | . . S DL=$O(DL(DL),-1) S DLM=$S(DL>1:DL(DL),1:"")
|
---|
51 | . ;
|
---|
52 | . ;no good delimiter, will have to break at end of line
|
---|
53 | . I DLM="" D Q
|
---|
54 | . . S WORD1=$E(WORD,1,MAXLN),WORD2=$E(WORD,MAXLN+1,$L(WORD))
|
---|
55 | . . D ADDWORDS S WORD0=WORD2
|
---|
56 | . ;
|
---|
57 | . ;good delimiter, will break at last dlm that fits within maxln
|
---|
58 | . S (LSTD,LL)=0,CURD=1 F TL=0:0 S CURD=$F(WORD,DLM,CURD) Q:'CURD D
|
---|
59 | . . S TL=TL+1
|
---|
60 | . . S WD(TL)=CURD_"^"_$E(WORD,CURD-2,CURD)
|
---|
61 | . . S:CURD<MAXLN LSTD=CURD,LL=TL
|
---|
62 | . ;special check of "," embedded in a number e.g. 1,000
|
---|
63 | . ;backup to previous delimiter if pattern match
|
---|
64 | . I DLM="," F UL=LL:-1:0 Q:$P($G(WD(UL)),"^",2)'?1N1","1N
|
---|
65 | . I DLM=",",+$G(WD(UL))<LSTD S LSTD=+$G(WD(UL))
|
---|
66 | . ;
|
---|
67 | . ;'LSTD usually means no valid Dlm's found in Word, but if line
|
---|
68 | . ;found to have some valid Dlm's later in the Word, then go ahead
|
---|
69 | . ;defer entire string to next line via Addwords Api
|
---|
70 | . I 'LSTD,TL>LL,$P($G(WD(TL)),"^",2)'?1N1","1N D Q
|
---|
71 | . . S WORD1="",WORD2=WORD D ADDWORDS S WORD0=WORD2
|
---|
72 | . ;
|
---|
73 | . ;no valid Dlm's found in word, can't determine a word, break @EOL
|
---|
74 | . I 'LSTD,$L(WORD)>(MAXLN) D Q
|
---|
75 | . . S WORD1=$E(WORD,1,MAXLN),WORD2=$E(WORD,MAXLN+1,$L(WORD))
|
---|
76 | . . D ADDWORDS S WORD0=WORD2
|
---|
77 | . ;no valid Dlm's found in word, and can add Word to curr line
|
---|
78 | . I 'LSTD,$L(WORD)'>(MAXLN) S @GL@(IEN,0)=@GL@(IEN,0)_WORD Q
|
---|
79 | . ;
|
---|
80 | . ;valid Dlm's & location found indicated by SS
|
---|
81 | . I LSTD D Q
|
---|
82 | . . S WORD1=$E(WORD,1,LSTD-1),WORD2=$E(WORD,LSTD,$L(WORD))
|
---|
83 | . . D ADDWORDS S WORD0=WORD2
|
---|
84 | Q
|
---|
85 | ;
|
---|
86 | ADDWORDS ;Add words to curr line and to a new line
|
---|
87 | N CH
|
---|
88 | ;if last character is the DLM or a " ", then don't add a space when
|
---|
89 | ;adding Word1 to current line
|
---|
90 | S CH=$E(@GL@(IEN,0),$L(@GL@(IEN,0)))
|
---|
91 | I (CH=DLM)!(CH=" ") D
|
---|
92 | . S @GL@(IEN,0)=@GL@(IEN,0)_WORD1
|
---|
93 | E D
|
---|
94 | . S @GL@(IEN,0)=@GL@(IEN,0)_" "_WORD1
|
---|
95 | ;create new line to hold Word2
|
---|
96 | S IEN=IEN+1,$P(@GL@(IEN,0)," ",LM+1)=" "
|
---|
97 | S MAXLN=79-$L(@GL@(IEN,0))
|
---|
98 | ;word2 won't fit, quit for further wrapping
|
---|
99 | Q:$L(WORD2)>(80-LM)
|
---|
100 | ;word2 will fit add it
|
---|
101 | S @GL@(IEN,0)=@GL@(IEN,0)_WORD2,WORD2=""
|
---|
102 | Q
|
---|