| [613] | 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 | 
|---|