| 1 | PXRMTEXT ; SLC/PKR - Text formatting utility routines. ;07/19/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**6**;Feb 04, 2005;Build 123 | 
|---|
| 3 | ; | 
|---|
| 4 | ;============================================ | 
|---|
| 5 | NEWLINE ;Put TEXT on a new line to the output, make sure it does not end | 
|---|
| 6 | ;with a " ". | 
|---|
| 7 | N TLEN | 
|---|
| 8 | ;If there is no text in TEXT don't do anything. | 
|---|
| 9 | I TEXT=INDSTR Q | 
|---|
| 10 | S TLEN=$L(TEXT) | 
|---|
| 11 | I $E(TEXT,TLEN)=" " S TEXT=$E(TEXT,1,TLEN-1) | 
|---|
| 12 | S NOUT=NOUT+1,TEXTOUT(NOUT)=TEXT | 
|---|
| 13 | S TEXT=INDSTR,CLEN=0 | 
|---|
| 14 | Q | 
|---|
| 15 | ; | 
|---|
| 16 | ;============================================ | 
|---|
| 17 | BLANK ;Add a blank line (line containing just " ") to the output. | 
|---|
| 18 | S NOUT=NOUT+1,TEXTOUT(NOUT)=" " | 
|---|
| 19 | S TEXT=INDSTR,CLEN=0 | 
|---|
| 20 | Q | 
|---|
| 21 | ; | 
|---|
| 22 | ;============================================ | 
|---|
| 23 | CHECKLEN(WORD) ;Check to see if adding the next word makes the line too long. | 
|---|
| 24 | ;If it does add it to the output and start a new line. | 
|---|
| 25 | N LENWORD | 
|---|
| 26 | S LENWORD=$L(WORD) | 
|---|
| 27 | I (CLEN+LENWORD)>WIDTH D | 
|---|
| 28 | . D NEWLINE | 
|---|
| 29 | . I WORD'[" " S WORD=WORD_" ",LENWORD=LENWORD+1 | 
|---|
| 30 | . S TEXT=INDSTR_WORD,CLEN=LENWORD | 
|---|
| 31 | E  D | 
|---|
| 32 | . I WORD'[" " S WORD=WORD_" ",LENWORD=LENWORD+1 | 
|---|
| 33 | . S TEXT=TEXT_WORD,CLEN=CLEN+LENWORD | 
|---|
| 34 | Q | 
|---|
| 35 | ; | 
|---|
| 36 | ;============================================ | 
|---|
| 37 | COLFMT(FMTSTR,TEXTSTR,PC,NL,OUTPUT) ;Columnar text formatter. | 
|---|
| 38 | ;FMTSTR - format string; ^ separated string for each column in the | 
|---|
| 39 | ;output. 35R2 defines a right justified column 35 characters wide | 
|---|
| 40 | ;with 2 blank spaces following. Columns can be centered (C) left | 
|---|
| 41 | ;justified (L) or right justified (R). | 
|---|
| 42 | ;TEXTSTR - string to be formated | 
|---|
| 43 | ;PC - the pad character | 
|---|
| 44 | ;NL - number of lines of output | 
|---|
| 45 | ;OUTPUT - array containing output lines. | 
|---|
| 46 | N COLOUT,ENTRY,FMT,JND,JUS,IND,LEN,NCOL,NLO,NROW,SP,TEMP,TEXT,WIDTH,WPSP | 
|---|
| 47 | S NCOL=$L(FMTSTR,U),NROW=1 | 
|---|
| 48 | F IND=1:1:NCOL D | 
|---|
| 49 | . S FMT=$P(FMTSTR,U,IND) | 
|---|
| 50 | . S JUS(IND)=$S(FMT["C":"C",FMT["L":"L",FMT["R":"R",1:"C") | 
|---|
| 51 | . S WIDTH(IND)=$P(FMT,JUS(IND),1) | 
|---|
| 52 | . S SP(IND)=$P(FMT,JUS(IND),2) | 
|---|
| 53 | . S WPSP(IND)=WIDTH(IND)+SP(IND) | 
|---|
| 54 | F IND=1:1:NCOL D | 
|---|
| 55 | . S ENTRY=$S(JUS(IND)="C":"CJ",JUS(IND)="L":"LJ",JUS(IND)="R":"RJ") | 
|---|
| 56 | . S TEMP=$P(TEXTSTR,U,IND) | 
|---|
| 57 | . S LEN=$L(TEMP) | 
|---|
| 58 | . I LEN'>WIDTH(IND) D | 
|---|
| 59 | .. S TEMP=$$@ENTRY^XLFSTR(TEMP,WIDTH(IND),PC) | 
|---|
| 60 | .. S COLOUT(1,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") | 
|---|
| 61 | . I LEN>WIDTH(IND) D | 
|---|
| 62 | .. D FORMATS(1,WIDTH(IND),TEMP,.NLO,.TEXTOUT) | 
|---|
| 63 | .. F JND=1:1:NLO D | 
|---|
| 64 | ... S TEMP=$$@ENTRY^XLFSTR(TEXTOUT(JND),WIDTH(IND),PC) | 
|---|
| 65 | ... S COLOUT(JND,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") | 
|---|
| 66 | .. I NLO>NROW S NROW=NLO | 
|---|
| 67 | F IND=1:1:NROW D | 
|---|
| 68 | . S TEXT="" | 
|---|
| 69 | . F JND=1:1:NCOL D | 
|---|
| 70 | .. I $D(COLOUT(IND,JND)) S TEXT=TEXT_COLOUT(IND,JND) | 
|---|
| 71 | .. E  S TEXT=TEXT_$$LJ^XLFSTR("",(WPSP(JND))," ") | 
|---|
| 72 | . S OUTPUT(IND)=TEXT | 
|---|
| 73 | S NL=NROW | 
|---|
| 74 | Q | 
|---|
| 75 | ; | 
|---|
| 76 | ;============================================ | 
|---|
| 77 | COLFMTA(FMTSTR,INPUT,PC,NL,OUTPUT) ;Columnar text formatter. | 
|---|
| 78 | ;Array version of COLFMT. Input array is ^TMP($J,INPUT,M) and | 
|---|
| 79 | ;output is ^TMP(OUTPUT,$J,N,0). | 
|---|
| 80 | N COLOUT,ENTRY,FMT,JND,JUS,IND,LEN,NCOL,NLO,NROW,NUM | 
|---|
| 81 | N SP,TEMP,TEXT,WIDTH,WPSP | 
|---|
| 82 | S NCOL=$L(FMTSTR,U) | 
|---|
| 83 | F IND=1:1:NCOL D | 
|---|
| 84 | . S FMT=$P(FMTSTR,U,IND) | 
|---|
| 85 | . S JUS(IND)=$S(FMT["C":"C",FMT["L":"L",FMT["R":"R",1:"C") | 
|---|
| 86 | . S WIDTH(IND)=$P(FMT,JUS(IND),1) | 
|---|
| 87 | . S SP(IND)=$P(FMT,JUS(IND),2) | 
|---|
| 88 | . S WPSP(IND)=WIDTH(IND)+SP(IND) | 
|---|
| 89 | S NL=0,NUM="" | 
|---|
| 90 | F  S NUM=$O(^TMP($J,INPUT,NUM)) Q:NUM=""  D | 
|---|
| 91 | . K COLOUT | 
|---|
| 92 | . S NROW=1 | 
|---|
| 93 | . F IND=1:1:NCOL D | 
|---|
| 94 | .. S ENTRY=$S(JUS(IND)="C":"CJ",JUS(IND)="L":"LJ",JUS(IND)="R":"RJ") | 
|---|
| 95 | .. S TEMP=$P(^TMP($J,INPUT,NUM),U,IND) | 
|---|
| 96 | .. S LEN=$L(TEMP) | 
|---|
| 97 | .. I LEN'>WIDTH(IND) D | 
|---|
| 98 | ... S TEMP=$$@ENTRY^XLFSTR(TEMP,WIDTH(IND),PC) | 
|---|
| 99 | ... S COLOUT(1,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") | 
|---|
| 100 | .. I LEN>WIDTH(IND) D | 
|---|
| 101 | ... D FORMATS(1,WIDTH(IND),TEMP,.NLO,.TEXTOUT) | 
|---|
| 102 | ... F JND=1:1:NLO D | 
|---|
| 103 | .... S TEMP=$$@ENTRY^XLFSTR(TEXTOUT(JND),WIDTH(IND),PC) | 
|---|
| 104 | .... S COLOUT(JND,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") | 
|---|
| 105 | ... I NLO>NROW S NROW=NLO | 
|---|
| 106 | . F IND=1:1:NROW D | 
|---|
| 107 | .. S TEXT="" | 
|---|
| 108 | .. F JND=1:1:NCOL D | 
|---|
| 109 | ... I $D(COLOUT(IND,JND)) S TEXT=TEXT_COLOUT(IND,JND) | 
|---|
| 110 | ... E  S TEXT=TEXT_$$LJ^XLFSTR("",(WPSP(JND))," ") | 
|---|
| 111 | .. S NL=NL+1,^TMP(OUTPUT,$J,NL,0)=TEXT | 
|---|
| 112 | Q | 
|---|
| 113 | ; | 
|---|
| 114 | ;============================================ | 
|---|
| 115 | FORMAT(LM,RM,NIN,TEXTIN,NOUT,TEXTOUT) ;Format the text in TEXTIN so it has | 
|---|
| 116 | ;a left margin of LM and a right margin of RM. The formatted text | 
|---|
| 117 | ;is in TEXTOUT. "\\" is the end of line marker. Lines ending with | 
|---|
| 118 | ;"\\" will not have anything appended to them. A blank line can | 
|---|
| 119 | ;be created by creating a line containing just "\\". Lines containing | 
|---|
| 120 | ;nothing but whitespace will also act like a "\\". | 
|---|
| 121 | I NIN=0 S NOUT=0 Q | 
|---|
| 122 | N ACHAR,ALLWSP,CHAR,CLEN,END,IND,INDENT,INDSTR,JND | 
|---|
| 123 | N LWSP,NWSP,START,TEMP,TEXT,TLEN,WIDTH,W1,W2,WORD | 
|---|
| 124 | ;Catalog the whitespace so we have places to break and look for | 
|---|
| 125 | ;end of line markers. | 
|---|
| 126 | F IND=1:1:NIN D | 
|---|
| 127 | . S TEMP=TEXTIN(IND) | 
|---|
| 128 | . S TLEN=$L(TEMP) | 
|---|
| 129 | . S ALLWSP=1,NWSP=0 | 
|---|
| 130 | . F JND=1:1:TLEN D | 
|---|
| 131 | .. S CHAR=$E(TEMP,JND) | 
|---|
| 132 | .. S ACHAR=$A(CHAR) | 
|---|
| 133 | .. I ACHAR>32 S ALLWSP=0 | 
|---|
| 134 | .. E  S NWSP=NWSP+1,LWSP(IND,NWSP)=JND | 
|---|
| 135 | .;Mark the end of the line. | 
|---|
| 136 | . S NWSP=NWSP+1,LWSP(IND,NWSP)=TLEN,LWSP(IND)=NWSP | 
|---|
| 137 | . I ALLWSP S LWSP(IND,"ALLWSP")="" | 
|---|
| 138 | I LM<1 S LM=1 | 
|---|
| 139 | S WIDTH=RM-LM+1 | 
|---|
| 140 | S INDENT=LM-1 | 
|---|
| 141 | S INDSTR="" | 
|---|
| 142 | F IND=1:1:INDENT S INDSTR=INDSTR_" " | 
|---|
| 143 | S NOUT=0 | 
|---|
| 144 | S TEXT=INDSTR,CLEN=0 | 
|---|
| 145 | F IND=1:1:NIN D | 
|---|
| 146 | .;If there is a blank line force whatever is in TEXT to be output by | 
|---|
| 147 | .;calling NEWLINE and then add the blank. | 
|---|
| 148 | . I $D(LWSP(IND,"ALLWSP")) D NEWLINE,BLANK Q | 
|---|
| 149 | . S TEMP=TEXTIN(IND) | 
|---|
| 150 | . S (END,NWSP)=0 | 
|---|
| 151 | . F NWSP=1:1:LWSP(IND) D | 
|---|
| 152 | .. S START=END+1,END=LWSP(IND,NWSP) | 
|---|
| 153 | .. S WORD=$E(TEMP,START,END) | 
|---|
| 154 | .. I WORD["\\" D  Q | 
|---|
| 155 | ... S W1=$P(WORD,"\\",1) | 
|---|
| 156 | ... D CHECKLEN(W1) | 
|---|
| 157 | ... D NEWLINE | 
|---|
| 158 | ... S W2=$P(WORD,"\\",2) | 
|---|
| 159 | ... I W2'="" D CHECKLEN(W2) | 
|---|
| 160 | .. D CHECKLEN(WORD) | 
|---|
| 161 | ;Output the last line. | 
|---|
| 162 | D NEWLINE | 
|---|
| 163 | Q | 
|---|
| 164 | ; | 
|---|
| 165 | ;============================================ | 
|---|
| 166 | FORMATS(LM,RM,TEXTLINE,NOUT,TEXTOUT) ;Take a single line of input text | 
|---|
| 167 | ;and format it. | 
|---|
| 168 | N TEXTIN | 
|---|
| 169 | S TEXTIN(1)=TEXTLINE | 
|---|
| 170 | D FORMAT(LM,RM,1,.TEXTIN,.NOUT,.TEXTOUT) | 
|---|
| 171 | Q | 
|---|
| 172 | ; | 
|---|
| 173 | ;============================================ | 
|---|
| 174 | LMFMTSTR(VALMDDF,JSTR) ;The List Manager variable VALMDDF contains the | 
|---|
| 175 | ;list template caption column formatting information. It contains | 
|---|
| 176 | ;the starting column and the width if the form | 
|---|
| 177 | ;VALMDDF(COLUMN NAME)=COLUMN NAME^COLUMN^WIDTH^CAPTION^VIDEO^SCROLL | 
|---|
| 178 | ;LOCK. JUSSTR, which is optional,is the justification for each column; | 
|---|
| 179 | ;(L=left, C=center, R=right) the default is center. Use this information | 
|---|
| 180 | ;to build the format string for the column formatter COLFMT. | 
|---|
| 181 | N CN,COL,FMTSTR,IND,JC,JUSSTR,PLCOL,SCOL,SP,TEMP,WIDTH | 
|---|
| 182 | ;Sort by columns | 
|---|
| 183 | S IND="" | 
|---|
| 184 | F  S IND=$O(VALMDDF(IND)) Q:IND=""  D | 
|---|
| 185 | . S TEMP=VALMDDF(IND) | 
|---|
| 186 | . S COL($P(TEMP,U,2))=$P(TEMP,U,3) | 
|---|
| 187 | S JUSSTR=$G(JSTR) | 
|---|
| 188 | S (CN,PLCOL,SCOL,SP)=0 | 
|---|
| 189 | S FMTSTR="" | 
|---|
| 190 | S SCOL=0 | 
|---|
| 191 | F  S SCOL=$O(COL(SCOL)) Q:SCOL=""  D | 
|---|
| 192 | . S CN=CN+1 | 
|---|
| 193 | . S WIDTH=COL(SCOL) | 
|---|
| 194 | . I CN=1 S PLCOL=WIDTH | 
|---|
| 195 | . E  S SP=SCOL-PLCOL-1,FMTSTR=FMTSTR_SP_U,PLCOL=SCOL+WIDTH-1 | 
|---|
| 196 | . S JC=$E(JUSSTR,CN) | 
|---|
| 197 | . I JC="" S JC="C" | 
|---|
| 198 | . S TEMP=WIDTH_JC | 
|---|
| 199 | . S FMTSTR=FMTSTR_TEMP | 
|---|
| 200 | Q FMTSTR | 
|---|
| 201 | ; | 
|---|