91 lines
2.4 KiB
C#
91 lines
2.4 KiB
C#
using Godot;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Rokojori
|
|
{
|
|
public enum SceneFileValueType
|
|
{
|
|
Variant,
|
|
ExtResource,
|
|
SubResource,
|
|
NodePath
|
|
}
|
|
|
|
public class SceneFileValue
|
|
{
|
|
public SceneFileValueType type;
|
|
public Variant variant;
|
|
public string reference;
|
|
|
|
public static readonly List<SceneFileValueType> referenceTypes = new List<SceneFileValueType>
|
|
{
|
|
SceneFileValueType.ExtResource,
|
|
SceneFileValueType.SubResource,
|
|
SceneFileValueType.NodePath
|
|
};
|
|
|
|
public static readonly List<string> referenceStringTypes = Lists.Map(
|
|
referenceTypes, ( s, i ) => s + ""
|
|
);
|
|
|
|
|
|
public void ParseValue( List<LexerEvent> tokens, int start, int length )
|
|
{
|
|
|
|
var startToken = tokens[ start ];
|
|
var startTokenInfo = LexerEvent.GetMatchFromRange( tokens, start, length );
|
|
|
|
// RJLog.Log( "ParseValue", startToken.type, startToken.IsAny( LexerMatcherLibrary.CwordMatcher ), startTokenInfo );
|
|
|
|
if ( startToken.IsAny( LexerMatcherLibrary.CFunctionMatcher ) )
|
|
{
|
|
var referenceStringIndex = referenceStringTypes.IndexOf( startToken.match );
|
|
|
|
if ( referenceStringIndex != -1 )
|
|
{
|
|
type = referenceTypes[ referenceStringIndex ];
|
|
reference = JSONStringConverter.Read( tokens[ start + 2 ].match );
|
|
|
|
// RJLog.Log( "Reference type:", type, reference );
|
|
|
|
return;
|
|
}
|
|
|
|
// RJLog.Log( "Not a reference type:", startToken );
|
|
}
|
|
|
|
type = SceneFileValueType.Variant;
|
|
|
|
variant = VariantFromTokens( tokens, start, length );
|
|
|
|
//RJLog.Log( "Variant type:", variant );
|
|
}
|
|
|
|
public static Variant VariantFromTokens( List<LexerEvent> tokens, int start, int length )
|
|
{
|
|
var startToken = tokens[ start ];
|
|
|
|
if ( length == 1 )
|
|
{
|
|
if ( startToken.Is( LexerMatcherLibrary.NumberMatcher ) )
|
|
{
|
|
return Variant.From( RegexUtility.ParseDouble( startToken.match ) );
|
|
}
|
|
|
|
if ( startToken.Is( LexerMatcherLibrary.DoubleQuotedStringMatcher ) )
|
|
{
|
|
return Variant.From( JSONStringConverter.Read( startToken.match ) );
|
|
}
|
|
|
|
if ( startToken.IsAny( LexerMatcherLibrary.CwordMatcher, "true", "false" ) )
|
|
{
|
|
return Variant.From( startToken.match == "true" ) ;
|
|
}
|
|
}
|
|
|
|
return Variant.From( "" );
|
|
}
|
|
|
|
|
|
}
|
|
} |