namespace Sandbox.UI;
internal static partial class StyleParser
{
///
/// Get the appropriate property name from a potential alias (color -> font-color).
/// This means we can define all our aliases in one place without any code re-use.
///
internal static string GetPropertyFromAlias( string name )
{
switch ( name )
{
case "background-image-tint":
return "background-tint";
case "color":
return "font-color";
default:
return name;
}
}
///
/// Parse the styles as you would if they were passed in an style="width: 100px" attribute
///
internal static void ParseStyles( ref Parse p, Styles style, bool parentheses = false, StyleSheet sheet = null )
{
if ( parentheses )
{
p = p.SkipWhitespaceAndNewlines();
if ( !p.TrySkip( "{" ) )
throw new Exception( $"Expected {{ {p.FileAndLine}" );
}
while ( !p.IsEnd )
{
p = p.SkipWhitespaceAndNewlines( ":;" );
if ( p.Current == ':' )
throw new System.Exception( "Parsing error - unexpected ':' at " );
var name = p.ReadUntil( ":" );
name = GetPropertyFromAlias( name );
if ( name == null )
break;
p.Pointer++;
p = p.SkipWhitespaceAndNewlines();
var value = p.ReadUntilOrEnd( ";" );
if ( value == null )
break;
p.Pointer++;
// Replace SCSS variables if stylesheet is provided
if ( sheet != null && value.IndexOf( '$' ) >= 0 )
{
try
{
value = sheet.ReplaceVariables( value );
}
catch ( System.Exception e )
{
throw new System.Exception( $"{e.Message} {p.FileAndLine}" );
}
}
if ( !style.Set( name, value ) )
{
throw new Exception( $"Unknown Property: {name} / {value} {p.FileAndLine}" );
}
p = p.SkipWhitespaceAndNewlines();
if ( parentheses && p.TrySkip( "}" ) )
break;
}
}
}