PXRMTEXT ; SLC/PKR - Text formatting utility routines. ;07/19/2007 ;;2.0;CLINICAL REMINDERS;**6**;Feb 04, 2005;Build 123 ; ;============================================ NEWLINE ;Put TEXT on a new line to the output, make sure it does not end ;with a " ". N TLEN ;If there is no text in TEXT don't do anything. I TEXT=INDSTR Q S TLEN=$L(TEXT) I $E(TEXT,TLEN)=" " S TEXT=$E(TEXT,1,TLEN-1) S NOUT=NOUT+1,TEXTOUT(NOUT)=TEXT S TEXT=INDSTR,CLEN=0 Q ; ;============================================ BLANK ;Add a blank line (line containing just " ") to the output. S NOUT=NOUT+1,TEXTOUT(NOUT)=" " S TEXT=INDSTR,CLEN=0 Q ; ;============================================ CHECKLEN(WORD) ;Check to see if adding the next word makes the line too long. ;If it does add it to the output and start a new line. N LENWORD S LENWORD=$L(WORD) I (CLEN+LENWORD)>WIDTH D . D NEWLINE . I WORD'[" " S WORD=WORD_" ",LENWORD=LENWORD+1 . S TEXT=INDSTR_WORD,CLEN=LENWORD E D . I WORD'[" " S WORD=WORD_" ",LENWORD=LENWORD+1 . S TEXT=TEXT_WORD,CLEN=CLEN+LENWORD Q ; ;============================================ COLFMT(FMTSTR,TEXTSTR,PC,NL,OUTPUT) ;Columnar text formatter. ;FMTSTR - format string; ^ separated string for each column in the ;output. 35R2 defines a right justified column 35 characters wide ;with 2 blank spaces following. Columns can be centered (C) left ;justified (L) or right justified (R). ;TEXTSTR - string to be formated ;PC - the pad character ;NL - number of lines of output ;OUTPUT - array containing output lines. N COLOUT,ENTRY,FMT,JND,JUS,IND,LEN,NCOL,NLO,NROW,SP,TEMP,TEXT,WIDTH,WPSP S NCOL=$L(FMTSTR,U),NROW=1 F IND=1:1:NCOL D . S FMT=$P(FMTSTR,U,IND) . S JUS(IND)=$S(FMT["C":"C",FMT["L":"L",FMT["R":"R",1:"C") . S WIDTH(IND)=$P(FMT,JUS(IND),1) . S SP(IND)=$P(FMT,JUS(IND),2) . S WPSP(IND)=WIDTH(IND)+SP(IND) F IND=1:1:NCOL D . S ENTRY=$S(JUS(IND)="C":"CJ",JUS(IND)="L":"LJ",JUS(IND)="R":"RJ") . S TEMP=$P(TEXTSTR,U,IND) . S LEN=$L(TEMP) . I LEN'>WIDTH(IND) D .. S TEMP=$$@ENTRY^XLFSTR(TEMP,WIDTH(IND),PC) .. S COLOUT(1,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") . I LEN>WIDTH(IND) D .. D FORMATS(1,WIDTH(IND),TEMP,.NLO,.TEXTOUT) .. F JND=1:1:NLO D ... S TEMP=$$@ENTRY^XLFSTR(TEXTOUT(JND),WIDTH(IND),PC) ... S COLOUT(JND,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") .. I NLO>NROW S NROW=NLO F IND=1:1:NROW D . S TEXT="" . F JND=1:1:NCOL D .. I $D(COLOUT(IND,JND)) S TEXT=TEXT_COLOUT(IND,JND) .. E S TEXT=TEXT_$$LJ^XLFSTR("",(WPSP(JND))," ") . S OUTPUT(IND)=TEXT S NL=NROW Q ; ;============================================ COLFMTA(FMTSTR,INPUT,PC,NL,OUTPUT) ;Columnar text formatter. ;Array version of COLFMT. Input array is ^TMP($J,INPUT,M) and ;output is ^TMP(OUTPUT,$J,N,0). N COLOUT,ENTRY,FMT,JND,JUS,IND,LEN,NCOL,NLO,NROW,NUM N SP,TEMP,TEXT,WIDTH,WPSP S NCOL=$L(FMTSTR,U) F IND=1:1:NCOL D . S FMT=$P(FMTSTR,U,IND) . S JUS(IND)=$S(FMT["C":"C",FMT["L":"L",FMT["R":"R",1:"C") . S WIDTH(IND)=$P(FMT,JUS(IND),1) . S SP(IND)=$P(FMT,JUS(IND),2) . S WPSP(IND)=WIDTH(IND)+SP(IND) S NL=0,NUM="" F S NUM=$O(^TMP($J,INPUT,NUM)) Q:NUM="" D . K COLOUT . S NROW=1 . F IND=1:1:NCOL D .. S ENTRY=$S(JUS(IND)="C":"CJ",JUS(IND)="L":"LJ",JUS(IND)="R":"RJ") .. S TEMP=$P(^TMP($J,INPUT,NUM),U,IND) .. S LEN=$L(TEMP) .. I LEN'>WIDTH(IND) D ... S TEMP=$$@ENTRY^XLFSTR(TEMP,WIDTH(IND),PC) ... S COLOUT(1,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") .. I LEN>WIDTH(IND) D ... D FORMATS(1,WIDTH(IND),TEMP,.NLO,.TEXTOUT) ... F JND=1:1:NLO D .... S TEMP=$$@ENTRY^XLFSTR(TEXTOUT(JND),WIDTH(IND),PC) .... S COLOUT(JND,IND)=TEMP_$$LJ^XLFSTR("",SP(IND)," ") ... I NLO>NROW S NROW=NLO . F IND=1:1:NROW D .. S TEXT="" .. F JND=1:1:NCOL D ... I $D(COLOUT(IND,JND)) S TEXT=TEXT_COLOUT(IND,JND) ... E S TEXT=TEXT_$$LJ^XLFSTR("",(WPSP(JND))," ") .. S NL=NL+1,^TMP(OUTPUT,$J,NL,0)=TEXT Q ; ;============================================ FORMAT(LM,RM,NIN,TEXTIN,NOUT,TEXTOUT) ;Format the text in TEXTIN so it has ;a left margin of LM and a right margin of RM. The formatted text ;is in TEXTOUT. "\\" is the end of line marker. Lines ending with ;"\\" will not have anything appended to them. A blank line can ;be created by creating a line containing just "\\". Lines containing ;nothing but whitespace will also act like a "\\". I NIN=0 S NOUT=0 Q N ACHAR,ALLWSP,CHAR,CLEN,END,IND,INDENT,INDSTR,JND N LWSP,NWSP,START,TEMP,TEXT,TLEN,WIDTH,W1,W2,WORD ;Catalog the whitespace so we have places to break and look for ;end of line markers. F IND=1:1:NIN D . S TEMP=TEXTIN(IND) . S TLEN=$L(TEMP) . S ALLWSP=1,NWSP=0 . F JND=1:1:TLEN D .. S CHAR=$E(TEMP,JND) .. S ACHAR=$A(CHAR) .. I ACHAR>32 S ALLWSP=0 .. E S NWSP=NWSP+1,LWSP(IND,NWSP)=JND .;Mark the end of the line. . S NWSP=NWSP+1,LWSP(IND,NWSP)=TLEN,LWSP(IND)=NWSP . I ALLWSP S LWSP(IND,"ALLWSP")="" I LM<1 S LM=1 S WIDTH=RM-LM+1 S INDENT=LM-1 S INDSTR="" F IND=1:1:INDENT S INDSTR=INDSTR_" " S NOUT=0 S TEXT=INDSTR,CLEN=0 F IND=1:1:NIN D .;If there is a blank line force whatever is in TEXT to be output by .;calling NEWLINE and then add the blank. . I $D(LWSP(IND,"ALLWSP")) D NEWLINE,BLANK Q . S TEMP=TEXTIN(IND) . S (END,NWSP)=0 . F NWSP=1:1:LWSP(IND) D .. S START=END+1,END=LWSP(IND,NWSP) .. S WORD=$E(TEMP,START,END) .. I WORD["\\" D Q ... S W1=$P(WORD,"\\",1) ... D CHECKLEN(W1) ... D NEWLINE ... S W2=$P(WORD,"\\",2) ... I W2'="" D CHECKLEN(W2) .. D CHECKLEN(WORD) ;Output the last line. D NEWLINE Q ; ;============================================ FORMATS(LM,RM,TEXTLINE,NOUT,TEXTOUT) ;Take a single line of input text ;and format it. N TEXTIN S TEXTIN(1)=TEXTLINE D FORMAT(LM,RM,1,.TEXTIN,.NOUT,.TEXTOUT) Q ; ;============================================ LMFMTSTR(VALMDDF,JSTR) ;The List Manager variable VALMDDF contains the ;list template caption column formatting information. It contains ;the starting column and the width if the form ;VALMDDF(COLUMN NAME)=COLUMN NAME^COLUMN^WIDTH^CAPTION^VIDEO^SCROLL ;LOCK. JUSSTR, which is optional,is the justification for each column; ;(L=left, C=center, R=right) the default is center. Use this information ;to build the format string for the column formatter COLFMT. N CN,COL,FMTSTR,IND,JC,JUSSTR,PLCOL,SCOL,SP,TEMP,WIDTH ;Sort by columns S IND="" F S IND=$O(VALMDDF(IND)) Q:IND="" D . S TEMP=VALMDDF(IND) . S COL($P(TEMP,U,2))=$P(TEMP,U,3) S JUSSTR=$G(JSTR) S (CN,PLCOL,SCOL,SP)=0 S FMTSTR="" S SCOL=0 F S SCOL=$O(COL(SCOL)) Q:SCOL="" D . S CN=CN+1 . S WIDTH=COL(SCOL) . I CN=1 S PLCOL=WIDTH . E S SP=SCOL-PLCOL-1,FMTSTR=FMTSTR_SP_U,PLCOL=SCOL+WIDTH-1 . S JC=$E(JUSSTR,CN) . I JC="" S JC="C" . S TEMP=WIDTH_JC . S FMTSTR=FMTSTR_TEMP Q FMTSTR ;