Pixel-Composer/scripts/SnapBufferWriteXML/SnapBufferWriteXML.gml

118 lines
3.5 KiB
Plaintext
Raw Normal View History

2024-06-06 09:54:13 +02:00
// Feather disable all
/// @param buffer Buffer to write the data to
/// @param struct The data to be encoded
///
/// @jujuadams 2022-10-30
function SnapBufferWriteXML(_buffer, _struct)
{
var _prologStruct = _struct[$ "prolog"];
if (is_struct(_prologStruct))
{
var _attributeStruct = _prologStruct[$ "attributes"];
if (is_struct(_attributeStruct))
{
var _names = variable_struct_get_names(_attributeStruct);
var _count = array_length(_names);
if (_count > 0)
{
buffer_write(_buffer, buffer_text, "<?xml");
var _i = 0;
repeat(_count)
{
var _key = _names[_i];
var _value = _attributeStruct[$ _key];
buffer_write(_buffer, buffer_text, " ");
buffer_write(_buffer, buffer_text, _key);
buffer_write(_buffer, buffer_text, "=\"");
buffer_write(_buffer, buffer_text, string(_value));
buffer_write(_buffer, buffer_text, "\"");
++_i;
}
buffer_write(_buffer, buffer_text, "?>\n");
}
}
}
var _children = _struct[$ "children"];
if (is_array(_children))
{
var _i = 0;
repeat(array_length(_children))
{
__SnapToXMLBufferInner(_buffer, _children[_i], "");
++_i;
}
}
}
function __SnapToXMLBufferInner(_buffer, _struct, _indent)
{
buffer_write(_buffer, buffer_text, _indent);
buffer_write(_buffer, buffer_text, "<");
buffer_write(_buffer, buffer_text, _struct.type);
var _attributeStruct = _struct[$ "attributes"];
if (is_struct(_attributeStruct))
{
var _names = variable_struct_get_names(_attributeStruct);
var _i = 0;
repeat(array_length(_names))
{
var _key = _names[_i];
var _value = _attributeStruct[$ _key];
buffer_write(_buffer, buffer_text, " ");
buffer_write(_buffer, buffer_text, _key);
buffer_write(_buffer, buffer_text, "=\"");
buffer_write(_buffer, buffer_text, string(_value));
buffer_write(_buffer, buffer_text, "\"");
++_i;
}
}
buffer_write(_buffer, buffer_text, ">");
var _content = _struct[$ "text"];
if (_content != undefined)
{
buffer_write(_buffer, buffer_text, string(_content));
}
else
{
var _children = _struct[$ "children"];
if (is_array(_children))
{
var _count = array_length(_children);
if (_count > 0)
{
var _preIndent = _indent;
_indent += chr(0x09);
var _i = 0;
repeat(_count)
{
buffer_write(_buffer, buffer_u8, 13);
__SnapToXMLBufferInner(_buffer, _children[_i], _indent);
++_i;
}
_indent = _preIndent;
buffer_write(_buffer, buffer_u8, 13);
buffer_write(_buffer, buffer_text, _indent);
}
}
}
buffer_write(_buffer, buffer_text, "</");
buffer_write(_buffer, buffer_text, _struct.type);
buffer_write(_buffer, buffer_text, ">");
}