| 1 | MXMLBLD ;;ISF/RWF - Tool to build XML ;07/09/09  16:55
 | 
|---|
| 2 |  ;;8.0;KERNEL;;
 | 
|---|
| 3 |  QUIT
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;DOC - The top level tag
 | 
|---|
| 6 |  ;DOCTYPE - Want to include a DOCTYPE node
 | 
|---|
| 7 |  ;FLAG - Set to 'G' to store the output in the global ^TMP("MXMLBLD",$J,
 | 
|---|
| 8 | START(DOC,DOCTYPE,FLAG,NO1ST) ;Call this once at the begining.
 | 
|---|
| 9 |  K ^TMP("MXMLBLD",$J)
 | 
|---|
| 10 |  S ^TMP("MXMLBLD",$J,"DOC")=DOC,^TMP("MXMLBLD",$J,"STK")=0
 | 
|---|
| 11 |  I $G(FLAG)["G" S ^TMP("MXMLBLD",$J,"CNT")=1
 | 
|---|
| 12 |  I $G(NO1ST)'=1 D OUTPUT($$XMLHDR) 
 | 
|---|
| 13 |  D:$L($G(DOCTYPE)) OUTPUT("<!DOCTYPE "_DOCTYPE_">") D OUTPUT("<"_DOC_">")
 | 
|---|
| 14 |  Q
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 | END ;Call this once to close out the document
 | 
|---|
| 17 |  D OUTPUT("</"_$G(^TMP("MXMLBLD",$J,"DOC"))_">")
 | 
|---|
| 18 |  I '$G(^TMP("MXMLBLD",$J,"CNT")) K ^TMP("MXMLBLD",$J)
 | 
|---|
| 19 |  K ^TMP("MXMLBLD",$J,"DOC"),^("CNT"),^("STK")
 | 
|---|
| 20 |  Q
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 | ITEM(INDENT,TAG,ATT,VALUE) ;Output a Item
 | 
|---|
| 23 |  N I,X
 | 
|---|
| 24 |  S ATT=$G(ATT)
 | 
|---|
| 25 |  I '$D(VALUE) D OUTPUT($$BLS($G(INDENT))_"<"_TAG_$$ATT(.ATT)_" />") Q
 | 
|---|
| 26 |  D OUTPUT($$BLS($G(INDENT))_"<"_TAG_$$ATT(.ATT)_">"_$$CHARCHK(VALUE)_"</"_TAG_">")
 | 
|---|
| 27 |  Q
 | 
|---|
| 28 |  ;DOITEM is a callback to output the lower level.
 | 
|---|
| 29 | MULTI(INDENT,TAG,ATT,DOITEM) ;Output a Multipule
 | 
|---|
| 30 |  N I,X,S
 | 
|---|
| 31 |  S ATT=$G(ATT)
 | 
|---|
| 32 |  D PUSH($G(INDENT),TAG,.ATT)
 | 
|---|
| 33 |  D @DOITEM
 | 
|---|
| 34 |  D POP
 | 
|---|
| 35 |  Q
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 | ATT(ATT) ;Output a string of attributes
 | 
|---|
| 38 |  I $D(ATT)<9 Q ""
 | 
|---|
| 39 |  N I,S,V
 | 
|---|
| 40 |  S S="",I=""
 | 
|---|
| 41 |  F  S I=$O(ATT(I)) Q:I=""  S S=S_" "_I_"="_$$Q(ATT(I))
 | 
|---|
| 42 |  Q S
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 | Q(X) ;Add Quotes - Changed by gpl to use single instead of double quotes 6/11
 | 
|---|
| 45 |  ;I X'[$C(34) Q $C(34)_X_$C(34)
 | 
|---|
| 46 |  I X'[$C(39) Q $C(39)_X_$C(39)
 | 
|---|
| 47 |  ;N Q,Y,I,Z S Q=$C(34),(Y,Z)=""
 | 
|---|
| 48 |  N Q,Y,I,Z S Q=$C(39),(Y,Z)=""
 | 
|---|
| 49 |  F I=1:1:$L(X,Q)-1 S Y=Y_$P(X,Q,I)_Q_Q
 | 
|---|
| 50 |  S Y=Y_$P(X,Q,$L(X,Q))
 | 
|---|
| 51 |  ;Q $C(34)_Y_$C(34)
 | 
|---|
| 52 |  Q $C(39)_Y_$C(39)
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 | XMLHDR() ; -- provides current XML standard header
 | 
|---|
| 55 |  Q "<?xml version=""1.0"" encoding=""utf-8"" ?>"
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 | OUTPUT(S) ;Output
 | 
|---|
| 58 |  N C S C=$G(^TMP("MXMLBLD",$J,"CNT"))
 | 
|---|
| 59 |  I C S ^TMP("MXMLBLD",$J,C)=S,^TMP("MXMLBLD",$J,"CNT")=C+1 Q
 | 
|---|
| 60 |  W S,!
 | 
|---|
| 61 |  Q
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 | CHARCHK(STR) ; -- replace xml character limits with entities
 | 
|---|
| 64 |  N A,I,X,Y,Z,NEWSTR
 | 
|---|
| 65 |  S (Y,Z)=""
 | 
|---|
| 66 |  ;IF STR["&" SET NEWSTR=STR DO  SET STR=Y_Z
 | 
|---|
| 67 |  ;. FOR X=1:1  SET Y=Y_$PIECE(NEWSTR,"&",X)_"&",Z=$PIECE(STR,"&",X+1,999) QUIT:Z'["&"
 | 
|---|
| 68 |  I STR["&" F I=1:1:$L(STR,"&")-1 S STR=$P(STR,"&",1,I)_"&"_$P(STR,"&",I+1,999)
 | 
|---|
| 69 |  I STR["<" F  S STR=$PIECE(STR,"<",1)_"<"_$PIECE(STR,"<",2,99) Q:STR'["<"
 | 
|---|
| 70 |  I STR[">" F  S STR=$PIECE(STR,">",1)_">"_$PIECE(STR,">",2,99) Q:STR'[">"
 | 
|---|
| 71 |  I STR["'" F  S STR=$PIECE(STR,"'",1)_"'"_$PIECE(STR,"'",2,99) Q:STR'["'"
 | 
|---|
| 72 |  I STR["""" F  S STR=$PIECE(STR,"""",1)_"""_$PIECE(STR,"""",2,99) Q:STR'[""""
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  S STR=$TR(STR,$C(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31))
 | 
|---|
| 75 |  QUIT STR
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 | COMMENT(VAL) ;Add Comments
 | 
|---|
| 78 |  N I,L
 | 
|---|
| 79 |  ;I $D($G(VAL))=1 D OUTPUT("<!-- "_ATT_" -->") Q
 | 
|---|
| 80 |  I $D(VAL) D OUTPUT("<!-- "_ATT_" -->") Q  ;CHANGED BY GPL FOR GTM
 | 
|---|
| 81 |  S I="",L="<!--"
 | 
|---|
| 82 |  F  S I=$O(ATT(I)) Q:I=""  D OUTPUT(L_ATT(I)) S L=""
 | 
|---|
| 83 |  D OUTPUT("-->")
 | 
|---|
| 84 |  Q
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 | PUSH(INDENT,TAG,ATT) ;Write a TAG and save.
 | 
|---|
| 87 |  N CNT
 | 
|---|
| 88 |  S ATT=$G(ATT)
 | 
|---|
| 89 |  D OUTPUT($$BLS($G(INDENT))_"<"_TAG_$$ATT(.ATT)_">")
 | 
|---|
| 90 |  S CNT=$G(^TMP("MXMLBLD",$J,"STK"))+1,^TMP("MXMLBLD",$J,"STK")=CNT,^TMP("MXMLBLD",$J,"STK",CNT)=INDENT_"^"_TAG
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | POP ;Write last pushed tag and pop
 | 
|---|
| 94 |  N CNT,TAG,INDENT,X
 | 
|---|
| 95 |  S CNT=$G(^TMP("MXMLBLD",$J,"STK")),X=^TMP("MXMLBLD",$J,"STK",CNT),^TMP("MXMLBLD",$J,"STK")=CNT-1
 | 
|---|
| 96 |  S INDENT=+X,TAG=$P(X,"^",2)
 | 
|---|
| 97 |  D OUTPUT($$BLS(INDENT)_"</"_TAG_">")
 | 
|---|
| 98 |  Q
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 | BLS(I) ;Return INDENT string
 | 
|---|
| 101 |  N S
 | 
|---|
| 102 |  S S="",I=$G(I) S:I>0 $P(S," ",I)=" "
 | 
|---|
| 103 |  Q S
 | 
|---|
| 104 |  ;
 | 
|---|
| 105 | INDENT() ;Renturn indent level
 | 
|---|
| 106 |  Q +$G(^TMP("MXMLBLD",$J,"STK"))
 | 
|---|