66 lines
1.8 KiB
C#
66 lines
1.8 KiB
C#
|
using Godot;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace SupaLidlGame.Debug;
|
||
|
|
||
|
internal static class NodePathParser
|
||
|
{
|
||
|
internal static IEnumerable<NodePathToken> ParseNodePath(CharIterator iterator)
|
||
|
{
|
||
|
// Some/Node/Path:And:Property/More/Paths
|
||
|
// ->
|
||
|
// Some/Node/Path (Node)
|
||
|
// :And:Property (Property)
|
||
|
// More/Paths (Node)
|
||
|
|
||
|
NodePathTokenType curType = NodePathTokenType.Node;
|
||
|
string path = "";
|
||
|
while (iterator.GetNext() != '\0')
|
||
|
{
|
||
|
char curChar = iterator.MoveNext();
|
||
|
|
||
|
if (curChar == ':')
|
||
|
{
|
||
|
// if we have been parsing a nodepath, yield a nodepath
|
||
|
if (curType == NodePathTokenType.Node)
|
||
|
{
|
||
|
if (path.Length > 0)
|
||
|
{
|
||
|
yield return new NodePathToken(path, curType);
|
||
|
path = "";
|
||
|
curType = NodePathTokenType.Property;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
path += curChar;
|
||
|
}
|
||
|
}
|
||
|
else if (curChar == '/')
|
||
|
{
|
||
|
// if we have been parsing property, yield a property
|
||
|
if (curType == NodePathTokenType.Property)
|
||
|
{
|
||
|
yield return new NodePathToken(path, curType);
|
||
|
path = "";
|
||
|
curType = NodePathTokenType.Node;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
path += curChar;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
path += curChar;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// reached the end
|
||
|
if (path.Length > 0)
|
||
|
{
|
||
|
yield return new NodePathToken(path, curType);
|
||
|
}
|
||
|
}
|
||
|
}
|