Code archives/3D Graphics - Misc/B3D - > XML -> B3D
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
B3D text file format | |||||
;-------------------------------------------------------------- ; Date: 2003.05.02 ; B3D text file (xml) format Rev 0.3 by Peter Scheutz ; Based on the official Sample Blitz code for the B3D format ; ; ; This is a rough version, expect cleanups in the near future... ; ;-------------------------------------------------------------- Include "b3dfile.bb" ; get this file from www.blitzbasic.com -> ; Community -> Specs And utils -> Sample Blitz code ;OSB: in b3dfile.bb change "Function b3dReadFloat()" to "Function b3dReadFloat#()" Const B3DXML_ERROR_NONE=True Const B3DXML_ERROR_NOFILE=-1 Const B3DXML_ERROR_FILENOTVALID =-2 Const B3DXML_ERROR_WRONGVERSION =-3 Const B3DXML_FLAG_StripTexturePaths=1 Const B3DXML_FLAG_StripBrushPaths=2 Const B3DXML_FLAG_StripNodePaths=4 Const B3DXML_FLAG_SkipVertices=8 Const B3DXML_FLAG_SkipTriangles=16 Const B3DXML_FLAG_SkipKeys=32 Const B3DXML_FLAG_SkipWeights=64 Global b3dxml_emf Global b3dxml_xml$ Global b3dxml_xmlpos Global b3dxml_xmlpos2 Global b3dxml_xmlpos3 Global b3dxml_kflags Global b3dxml_brushtexcount Global b3dxml_vflags Global b3dxml_vtexsets Global b3dxml_vtexsize ;retval=b3d2xml( "man.b3d" ,"maplet.xml",127) ; convert a b3d to xml retval=b3d2xml( "robot2.b3d" ,"robot.xml") ; path stripping version: ;retval=b3d2xml( "robot2.b3d" ,"robot.xml",7) If retval= B3DXML_ERROR_NONE Then msg$ = "File successfully converted" Else Select retval Case B3DXML_ERROR_NOFILE msg$ = "Input file not found" Case B3DXML_ERROR_FILENOTVALID msg$ = "This is not a valid B3D file" Case B3DXML_ERROR_WRONGVERSION msg$ = "Wrong B3D version" End Select EndIf ; convert xml back to b3d retval = xml2B3d( "robot.xml" ,"test.b3d") If retval= B3DXML_ERROR_NONE Then msg$ = "File successfully converted" Else Select retval Case B3DXML_ERROR_NOFILE msg$ = "Input file not found" Case B3DXML_ERROR_FILENOTVALID msg$ = "This is not a valid B3D file" Case B3DXML_ERROR_WRONGVERSION msg$ = "Wrong B3D version" End Select EndIf ; convert to xml again retval=b3d2xml( "test.b3d" ,"test.xml") If retval= B3DXML_ERROR_NONE Then msg$ = "File successfully converted" Else Select retval Case B3DXML_ERROR_NOFILE msg$ = "Input file not found" Case B3DXML_ERROR_FILENOTVALID msg$ = "This is not a valid B3D file" Case B3DXML_ERROR_WRONGVERSION msg$ = "Wrong B3D version" End Select EndIf ;ExecFile "test.xml" ;uncomment to view in default xml viewer (usually IE) Print msg$ DebugLog msg$ WaitKey End Function xml2B3d(xmlfile$,b3dfile$) Local xbank=CreateBank(FileSize(xmlfile$)) file=ReadFile(xmlfile$) If Not file Return B3DXML_ERROR_NOFILE ;ret=ReadBytes(xbank,file,0,BankSize(xbank)) While Not Eof(file) b3dxml_xml$=b3dxml_xml$ + ReadLine(file) Wend CloseFile file ; DebugLog b3dxml_xml$ ; DebugLog "*************************************************" b3dxml_xml$ = Replace (b3dxml_xml$," >",">") b3dxml_xml$ = Replace (b3dxml_xml$," />","/>") ; DebugLog b3dxml_xml$ ; WaitKey ; End file=WriteFile( b3dfile$ ) b3dSetFile( file ) b3dxml_xmlpos=Instr(b3dxml_xml$,"<BB3D")-1 TransChunks CloseFile file Return B3DXML_ERROR_NONE End Function Function bankToString$(bank) Local ret$ For n=0 To BankSize(bank)-1 ret$=ret$ + Chr$(PeekByte(bank,n)) Next Return ret$ End Function Function xmlReadTag$() Local pos2 b3dxml_xmlpos=Instr(b3dxml_xml$,"<",b3dxml_xmlpos+1) If b3dxml_xmlpos>0 Then b3dxml_xmlpos2=Instr(b3dxml_xml$," ",b3dxml_xmlpos+1) pos3=Instr(b3dxml_xml$,">",b3dxml_xmlpos+1) If pos3<>0 If b3dxml_xmlpos2<>0 If pos3<b3dxml_xmlpos2 Then b3dxml_xmlpos2=pos3 Else b3dxml_xmlpos2=pos3 EndIf EndIf If b3dxml_xmlpos2<>0 b3dxml_xmlpos3=Instr(b3dxml_xml$,">",b3dxml_xmlpos2) Return Mid$(b3dxml_xml$,b3dxml_xmlpos+1,b3dxml_xmlpos2-b3dxml_xmlpos-1) EndIf EndIf End Function Function xmlReadInt(attrib$,defval=0) Local pos1,pos2 Local lookfor$=attrib$ + "=" + Chr$(34) pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos) If Not pos1 Return defval pos1=pos1+Len(lookfor$) pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1) Return Int(Mid$(b3dxml_xml$,pos1,pos2-pos1)) End Function Function xmlReadString$(attrib$) Local pos1,pos2 Local lookfor$=attrib$ + "=" + Chr$(34) pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos) If Not pos1 Return pos1=pos1+Len(lookfor$) pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1) Return Mid$(b3dxml_xml$,pos1,pos2-pos1) End Function Function xmlReadFloat#(attrib$,defval#=0) Local pos1,pos2 Local lookfor$=attrib$ + "=" + Chr$(34) pos1=Instr(b3dxml_xml$,lookfor$,b3dxml_xmlpos) If Not pos1 Return defval pos1=pos1+Len(lookfor$) pos2=Instr(b3dxml_xml$,Chr$(34),pos1+1) ;DebugLog "here. " + Mid$(b3dxml_xml$,pos1,pos2-pos1) ;DebugLog "****" + Mid$(b3dxml_xml$,pos1,pos2-pos1) + "****" Return Float(Mid$(b3dxml_xml$,pos1,pos2-pos1)) End Function Function TransChunks() Local closing While b3dxml_xmlpos closing=False chunk$=xmlReadTag$() Select chunk$ Case "BB3D" b3dBeginChunk(chunk$) b3dWriteInt xmlReadInt("version") Case "/BB3D" b3dEndChunk Case "ANIM" b3dBeginChunk(chunk$) b3dWriteInt xmlReadInt("version") b3dWriteInt xmlReadInt("frames") b3dWritefloat xmlReadFloat("fps") b3dEndChunk Case "KEYS" b3dBeginChunk(chunk$) b3dxml_kflags=xmlReadInt("flags") b3dWriteInt b3dxml_kflags Case "/KEYS" b3dEndChunk Case "KEY" b3dWriteInt xmlReadInt("frame") If b3dxml_kflags And 1 b3dWritefloat xmlReadFloat("xpos") b3dWritefloat xmlReadFloat("ypos") b3dWritefloat xmlReadFloat("zpos") EndIf If b3dxml_kflags And 2 b3dWritefloat xmlReadFloat("xscale") b3dWritefloat xmlReadFloat("yscale") b3dWritefloat xmlReadFloat("zscale") EndIf If b3dxml_kflags And 4 b3dWritefloat xmlReadFloat("wrot") b3dWritefloat xmlReadFloat("xrot") b3dWritefloat xmlReadFloat("yrot") b3dWritefloat xmlReadFloat("zrot") EndIf Case "TEXS" b3dBeginChunk(chunk$) Case "/TEXS" b3dEndChunk Case "TEXTURE" b3dWriteString xmlReadString("name") b3dWriteInt xmlReadInt("flags") b3dWriteInt xmlReadInt("blend") b3dWritefloat xmlReadFloat("xpos") b3dWritefloat xmlReadFloat("ypos") b3dWritefloat xmlReadFloat("xscale") b3dWritefloat xmlReadFloat("yscale") b3dWritefloat xmlReadFloat("rot") Case "BRUS" b3dBeginChunk(chunk$) b3dxml_brushtexcount=xmlReadInt("count") b3dWriteInt b3dxml_brushtexcount Case "/BRUS" b3dEndChunk Case "BRUSH" b3dWriteString xmlReadString("name") b3dWritefloat xmlReadFloat("red") b3dWritefloat xmlReadFloat("green") b3dWritefloat xmlReadFloat("blue") b3dWritefloat xmlReadFloat("alpha") b3dWritefloat xmlReadFloat("shininess") b3dWriteInt xmlReadInt("blend") b3dWriteInt xmlReadInt("fx") For n=0 To b3dxml_brushtexcount-1 b3dWriteInt xmlReadInt("texture" + n) Next Case "NODE" b3dBeginChunk(chunk$) b3dWriteString xmlReadString("name") ; DebugLog "*" + xmlReadString("name") + "*" ; DebugLog "*" + xmlReadFloat("xscale") + "*" b3dWritefloat xmlReadFloat("xpos") b3dWritefloat xmlReadFloat("ypos") b3dWritefloat xmlReadFloat("zpos") b3dWritefloat xmlReadFloat("xscale") b3dWritefloat xmlReadFloat("yscale") b3dWritefloat xmlReadFloat("zscale") b3dWritefloat xmlReadFloat("wrot") b3dWritefloat xmlReadFloat("xrot") b3dWritefloat xmlReadFloat("yrot") b3dWritefloat xmlReadFloat("zrot") Case "/NODE" b3dEndChunk Case "MESH" b3dBeginChunk(chunk$) b3dWriteInt xmlReadInt("brush") Case "/MESH" b3dEndChunk Case "BONE" b3dBeginChunk(chunk$) Case "/BONE" b3dEndChunk Case "WEIGHT" b3dWriteInt xmlReadInt("vertex") b3dWritefloat xmlReadFloat("weight") Case "VRTS" b3dBeginChunk(chunk$) b3dxml_vflags=xmlReadInt("flags") b3dxml_vtexsets=xmlReadInt("texturecoordsets") b3dxml_vtexsize=xmlReadInt("texturecoordsize") b3dWriteInt b3dxml_vflags b3dWriteInt b3dxml_vtexsets b3dWriteInt b3dxml_vtexsize Case "/VRTS" b3dEndChunk Case "VERTEX" b3dWritefloat xmlReadFloat("x") b3dWritefloat xmlReadFloat("y") b3dWritefloat xmlReadFloat("z") If b3dxml_vflags And 1 b3dWritefloat xmlReadFloat("nx") b3dWritefloat xmlReadFloat("ny") b3dWritefloat xmlReadFloat("nz") EndIf If b3dxml_vflags And 2 b3dWritefloat xmlReadFloat("r") b3dWritefloat xmlReadFloat("g") b3dWritefloat xmlReadFloat("b") b3dWritefloat xmlReadFloat("a") EndIf For j=1 To b3dxml_vtexsets If b3dxml_vtexsize>0 Then b3dWritefloat xmlReadFloat("u"+(j-1)) If b3dxml_vtexsize>1 Then b3dWritefloat xmlReadFloat("v"+(j-1)) If b3dxml_vtexsize>2 Then b3dWritefloat xmlReadFloat("w"+(j-1)) Next Case "TRIS" b3dBeginChunk(chunk$) b3dWriteInt xmlReadInt("brush") Case "/TRIS" b3dEndChunk Case "TRI" b3dWriteInt xmlReadInt("v0") b3dWriteInt xmlReadInt("v1") b3dWriteInt xmlReadInt("v2") End Select ; TransChunks() ;dump any subchunks ; If closing Then b3dEndChunk ;exit this chunk ; DebugLog "- " + Mid$(b3dxml_xml$,b3dxml_xmlpos3-1,1) ; If chunk$<>"ANIM" Then emit "</" + chunk$ + ">" Wend End Function Function b3d2xml(b3dfile$,xmlfile$,dumpflags=0) Local file file=ReadFile( b3dfile$) If Not file Return B3DXML_ERROR_NOFILE b3dSetFile( file ) If b3dReadChunk$()<>"BB3D" Return B3DXML_ERROR_FILENOTVALID ;RuntimeError "Invalid b3d file" version=b3dReadInt() If version/100>0 Return Return B3DXML_ERROR_WRONGVERSION ;RuntimeError "Invalid b3d file version" emitfile$=xmlfile$ b3dxml_emf=WriteFile(emitfile$) emit "<?xml version=" + Chr$(34) + "1.0" + Chr$(34) + "?>" emit "<BB3D version=" + Chr$(34) + version +Chr$(34) + " exporter=" + Chr$(34) + "dumpb3dasxml version 0.1" + Chr$(34) +">" DumpChunks(dumpflags,"*") b3dExitChunk() emit "</BB3D>" If b3dxml_emf Then CloseFile b3dxml_emf CloseFile file Return B3DXML_ERROR_NONE End Function Function DumpChunks(dumpflags, tab$="" ) tt$=tab$ tab$=tab$+" " While b3dChunkSize() chunk$=b3dReadChunk$() Select chunk$ Case "ANIM" flags=b3dReadInt() n_frames=b3dReadInt() fps=b3dReadFloat() out$=BeginTag$("ANIM") out$=AddIntegerAttrib(out$,"flags",flags) out$=AddIntegerAttrib(out$,"frames",n_frames) out$=AddFloatAttrib(out$,"fps",fps) out$ = CloseAndEndTag(out$) emit out$ Case "KEYS" flags=b3dReadInt() out$=BeginTag$("KEYS") out$=AddIntegerAttrib(out$,"flags",flags) out$ = CloseTag(out$) emit out$ sz=4 If flags And 1 sz=sz+12 If flags And 2 sz=sz+12 If flags And 4 sz=sz+16 n_keys=b3dChunkSize()/sz If n_keys*sz=b3dChunkSize() While b3dChunkSize() frame=b3dReadInt() out$=BeginTag$("KEY") out$=AddIntegerAttrib(out$,"frame",frame) If flags And 1 key_px#=b3dReadFloat() key_py#=b3dReadFloat() key_pz#=b3dReadFloat() out$=AddFloatAttrib(out$,"xpos",key_px) out$=AddFloatAttrib(out$,"ypos",key_py) out$=AddFloatAttrib(out$,"zpos",key_pz) EndIf If flags And 2 key_sx#=b3dReadFloat() key_sy#=b3dReadFloat() key_sz#=b3dReadFloat() out$=AddFloatAttrib(out$,"xscale",key_sx) out$=AddFloatAttrib(out$,"yscale",key_sy) out$=AddFloatAttrib(out$,"zscale",key_sz) EndIf If flags And 4 key_rw#=b3dReadFloat() key_rx#=b3dReadFloat() key_ry#=b3dReadFloat() key_rz#=b3dReadFloat() out$=AddFloatAttrib(out$,"wrot",key_rw) out$=AddFloatAttrib(out$,"xrot",key_rx) out$=AddFloatAttrib(out$,"yrot",key_ry) out$=AddFloatAttrib(out$,"zrot",key_rz) EndIf out$ = CloseAndEndTag(out$) If Not (dumpflags And B3DXML_FLAG_SkipKeys ) emit out$ EndIf Wend Else ;;;DebugLog tab$+"***** Illegal number of keys *****" EndIf Case "TEXS" emit "<" + chunk$ + ">" While b3dChunkSize() name$=b3dReadString$() flags=b3dReadInt() blend=b3dReadInt() x_pos#=b3dReadFloat() y_pos#=b3dReadFloat() x_scl#=b3dReadFloat() y_scl#=b3dReadFloat() rot#=b3dReadFloat() If dumpflags And B3DXML_FLAG_StripTexturePaths Then name$=StripPath(name$) out$=BeginTag$("TEXTURE") out$=AddStringAttrib(out$,"name",name$) out$=AddIntegerAttrib(out$,"flags",flags) out$=AddIntegerAttrib(out$,"blend",blend) out$=AddFloatAttrib(out$,"xpos",x_pos) ; Changed from xoffset to xpos out$=AddFloatAttrib(out$,"ypos",y_pos) ; Changed from yoffset to ypos out$=AddFloatAttrib(out$,"xscale",x_scl) out$=AddFloatAttrib(out$,"yscale",y_scl) out$=AddFloatAttrib(out$,"rot",rot) out$ = CloseAndEndTag(out$) emit out$ Wend Case "BRUS" n_texs=b3dReadInt() out$=BeginTag$("BRUS") out$=AddIntegerAttrib(out$,"count",n_texs) out$ = CloseTag(out$) emit out$ ;read all brushes in chunk... While b3dChunkSize() name$=b3dReadString$() red#=b3dReadFloat() grn#=b3dReadFloat() blu#=b3dReadFloat() alp#=b3dReadFloat() shi#=b3dReadFloat() blend=b3dReadInt() fx=b3dReadInt() If dumpflags And B3DXML_FLAG_StripBrushPaths Then name$=StripPath(name$) out$=BeginTag$("BRUSH") out$=AddStringAttrib(out$,"name",name$) out$=AddFloatAttrib(out$,"red",red) out$=AddFloatAttrib(out$,"green",grn) out$=AddFloatAttrib(out$,"blue",blu) out$=AddFloatAttrib(out$,"alpha",alp) out$=AddFloatAttrib(out$,"shininess",shi) out$=AddIntegerAttrib(out$,"blend",blend) out$=AddIntegerAttrib(out$,"fx",fx) For k=0 To n_texs-1 tex_id=b3dReadInt() out$ = AddIntegerAttrib(out$,"texture" + k ,tex_id) Next out$ = CloseAndEndTag(out$) emit out$ Wend Case "VRTS" flags=b3dReadInt() tc_sets=b3dReadInt() tc_size=b3dReadInt() sz=12+tc_sets*tc_size*4 If flags And 1 Then sz=sz+12 If flags And 2 Then sz=sz+16 n_verts=b3dChunkSize()/sz out$=BeginTag$("VRTS") out$=AddIntegerAttrib(out$,"count",n_verts) out$=AddIntegerAttrib(out$,"flags",flags) out$=AddIntegerAttrib(out$,"texturecoordsets",tc_sets) out$=AddIntegerAttrib(out$,"texturecoordsize",tc_size) out$ = CloseTag(out$) emit out$ If n_verts*sz=b3dChunkSize() ;read all verts in chunk While b3dChunkSize() x#=b3dReadFloat() y#=b3dReadFloat() z#=b3dReadFloat() out$=BeginTag$("VERTEX") out$=AddFloatAttrib(out$,"x",x) out$=AddFloatAttrib(out$,"y",y) out$=AddFloatAttrib(out$,"z",z) If flags And 1 nx#=b3dReadFloat() ny#=b3dReadFloat() nz#=b3dReadFloat() out$=AddFloatAttrib(out$,"nx",nx) out$=AddFloatAttrib(out$,"ny",ny) out$=AddFloatAttrib(out$,"nz",nz) EndIf If flags And 2 r#=b3dReadFloat() g#=b3dReadFloat() b#=b3dReadFloat() a#=b3dReadFloat() out$=AddFloatAttrib(out$,"r",r) out$=AddFloatAttrib(out$,"g",g) out$=AddFloatAttrib(out$,"b",b) out$=AddFloatAttrib(out$,"a",a) EndIf coordnameindex=0 set=0 ;read tex coords... For j=1 To tc_sets*tc_size uvw#=b3dReadFloat() coordnameindex=coordnameindex + 1 If coordnameindex>tc_size Then coordnameindex =1 set=set+1 EndIf If coordnameindex=1 cn$="u" ElseIf coordnameindex=2 cn$="v" Else cn$="w" EndIf out$=AddFloatAttrib(out$,cn$ + Str$(set),uvw) Next out$ = CloseAndEndTag(out$) If Not (dumpflags And B3DXML_FLAG_SkipVertices ) emit out$ EndIf Wend Else ;;;DebugLog tab$+"***** Illegal number of vertices *****" EndIf Case "TRIS" brush_id=b3dReadInt() sz=12 n_tris=b3dChunkSize()/sz out$=BeginTag$("TRIS") out$=AddIntegerAttrib(out$,"count",n_tris) ; trianglecount changed to count out$=AddIntegerAttrib(out$,"brush",brush_id) out$ = CloseTag(out$) emit out$ If n_tris*sz=b3dChunkSize() ;read all tris in chunk While b3dChunkSize() v0=b3dReadInt() v1=b3dReadInt() v2=b3dReadInt() If Not (dumpflags And B3DXML_FLAG_SkipTriangles ) out$=BeginTag$("TRI") out$=AddIntegerAttrib(out$,"v0",v0) out$=AddIntegerAttrib(out$,"v1",v1) out$=AddIntegerAttrib(out$,"v2",v2) out$ = CloseAndEndTag(out$) emit out$ EndIf Wend Else ;;;DebugLog tab$+"***** Illegal number of triangles *****" EndIf Case "MESH" brush_id=b3dReadInt() out$=BeginTag$("MESH") out$=AddIntegerAttrib(out$,"brush",brush_id) out$ = CloseTag(out$) emit out$ Case "BONE" emit "<" + chunk$ + ">" sz=8 n_weights=b3dChunkSize()/sz If n_weights*sz=b3dChunkSize() ;read all weights While b3dChunkSize() vertex_id=b3dReadInt() weight#=b3dReadFloat() If Not (dumpflags And B3DXML_FLAG_SkipWeights ) out$=BeginTag$("WEIGHT") out$=AddIntegerAttrib(out$,"vertex",vertex_id) out$=AddFloatAttrib(out$,"weight",weight) out$ = CloseAndEndTag(out$) emit out$ EndIf Wend Else ;;;DebugLog tab$+"***** Illegal number of bone weights *****" EndIf Case "NODE" name$=b3dReadString$() x_pos#=b3dReadFloat() y_pos#=b3dReadFloat() z_pos#=b3dReadFloat() x_scl#=b3dReadFloat() y_scl#=b3dReadFloat() z_scl#=b3dReadFloat() w_rot#=b3dReadFloat() x_rot#=b3dReadFloat() y_rot#=b3dReadFloat() z_rot#=b3dReadFloat() If dumpflags And B3DXML_FLAG_StripNodePaths Then name$=StripPath(name$) out$=BeginTag$("NODE") out$=AddStringAttrib(out$,"name",name$) out$=AddFloatAttrib(out$,"xpos",x_pos) out$=AddFloatAttrib(out$,"ypos",y_pos) out$=AddFloatAttrib(out$,"zpos",z_pos) out$=AddFloatAttrib(out$,"xscale",x_scl) out$=AddFloatAttrib(out$,"yscale",y_scl) out$=AddFloatAttrib(out$,"zscale",z_scl) out$=AddFloatAttrib(out$,"wrot",w_rot) out$=AddFloatAttrib(out$,"xrot",x_rot) out$=AddFloatAttrib(out$,"yrot",y_rot) out$=AddFloatAttrib(out$,"zrot",z_rot) out$ = CloseTag(out$) emit out$ Default ; OBS untested! ; out$=BeginTag$(chunk$) ; out$=AddIntegerAttrib(out$,"size",b3dChunkSize()) ; out$ = CloseTag(out$) ; emit out$ ; out$="<![CDATA[" ; While b3dChunkSize() ; out$=out$ + Chr$(b3dReadByte()) ; Wend ; out$=out$ + "]]>" ; emit out$ End Select DumpChunks(dumpflags, tab$ ) ;dump any subchunks b3dExitChunk() ;exit this chunk If chunk$<>"ANIM" Then emit "</" + chunk$ + ">" Wend End Function Function StripPath$(name$) Local pos For pos=Len(name$) To 1 Step -1 If Mid$(name$,pos,1)="\" Or Mid$(name$,pos,1)="/" Then Exit Next Return Right$(name$,Len(name$)-pos) End Function Function emit(out$) ;DebugLog out$ If b3dxml_emf Then WriteLine b3dxml_emf,out$ End Function Function AddFloatAttrib$(tag$,name$,value#) If Right$(tag$,1)<>" " Then Return tag$ + " " + name$ + "=" + Chr$(34) + value# + Chr$(34) Else Return tag$ + name$ + "=" + Chr$(34) + value# + Chr$(34) EndIf End Function Function AddStringAttrib$(tag$,name$,value$) If Right$(tag$,1)<>" " Then Return tag$ + " " + name$ + "=" + Chr$(34) + value$ + Chr$(34) Else Return tag$ + name$ + "=" + Chr$(34) + value$ + Chr$(34) EndIf End Function Function AddIntegerAttrib$(tag$,name$,value%) If Right$(tag$,1)<>" " Then Return tag$ + " " + name$ + "=" + Chr$(34) + value% + Chr$(34) Else Return tag$ + name$ + "=" + Chr$(34) + value% + Chr$(34) EndIf End Function Function BeginTag$(tag$) Return "<" + tag$ End Function Function CloseTag$(tag$) Return tag$ + ">" End Function Function CloseAndEndTag$(tag$) Return tag$ + "/>" End Function |
Comments
None.
Code Archives Forum