/// <summary> /// Attempts to parse a method call with format MethodId(Args) /// </summary> static public bool TryParse(StringSlice inData, out MethodCall outMethodCall) { int openParenIdx = inData.IndexOf('('); int closeParenIdx = inData.LastIndexOf(')'); if (openParenIdx <= 0 || closeParenIdx <= 0 || closeParenIdx <= openParenIdx) { outMethodCall = default(MethodCall); return(false); } StringSlice methodSlice = inData.Substring(0, openParenIdx).Trim(); if (!VariantUtils.IsValidIdentifier(methodSlice)) { outMethodCall = default(MethodCall); return(false); } StringSlice afterMethod = inData.Substring(closeParenIdx + 1); if (!afterMethod.IsWhitespace) { outMethodCall = default(MethodCall); return(false); } int argsLength = closeParenIdx - 1 - openParenIdx; outMethodCall.Id = methodSlice.Hash32(); outMethodCall.Args = inData.Substring(openParenIdx + 1, argsLength).Trim(); return(true); }
/// <summary> /// Attempts to parse the string slice into a color. /// </summary> static public bool TryParseColor(StringSlice inSlice, out Color outColor) { StringSlice colorData = inSlice; StringSlice alphaData = StringSlice.Empty; int dotIdx = inSlice.IndexOf('.'); if (dotIdx >= 0) { colorData = inSlice.Substring(0, dotIdx); alphaData = inSlice.Substring(dotIdx + 1); } Color color = default(Color); bool bParsed = false; if (colorData.StartsWith('#')) { ulong hex; StringSlice hexString = colorData.Substring(1); if (hexString.Length <= 6 && TryParseHex(colorData, 6, out hex)) { color = Colors.RGBA((uint)hex << 8); bParsed = true; } else if (TryParseHex(colorData, 8, out hex)) { color = Colors.RGBA((uint)hex); bParsed = true; } } if (!bParsed) { bParsed = ColorUtility.TryParseHtmlString(colorData.ToString(), out color); if (!bParsed) { outColor = default(Color); return(false); } } if (!alphaData.IsEmpty) { float alphaMult; if (!TryParseFloat(alphaData, out alphaMult)) { outColor = default(Color); return(false); } color.a *= alphaMult / 100f; } outColor = color; return(bParsed); }