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"))
|
---|