예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }