Ejemplo n.º 1
0
 /// <summary>
 /// Parses the CSS rule.
 /// </summary>
 /// <param name="curStyle">Current style.</param>
 /// <param name="rule">Rule.</param>
 internal static void ParseCSSRule(ref TextStyleParameters curStyle, CssParserRule rule)
 {
     foreach (var declaration in rule.Declarations) {
         if (_textStyleProperties.ContainsKey (declaration.Property)) {
             var cleanedValue = declaration.Value.Replace ("\"", "");
             cleanedValue = cleanedValue.Trim ();
             var prop = _textStyleProperties [declaration.Property];
             switch (prop.PropertyType.Name) {
             case "String":
                 curStyle.SetValue (prop.Name, cleanedValue);
                 break;
             case "Int32":
                 int numInt;
                 if (int.TryParse (cleanedValue, out numInt)) {
                     curStyle.SetValue (prop.Name, numInt);
                 }
                 break;
             case "Single":
                 cleanedValue = cleanedValue.Replace ("px", "");
                 float numFloat;
                 if (float.TryParse (cleanedValue, out numFloat)) {
                     curStyle.SetValue (prop.Name, numFloat);
                 } else
                     throw new Exception ("Failed to Parse Single value " + cleanedValue);
                 break;
             case "Single[]":
                 var parts = cleanedValue.Split (new char[]{ ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
                 var parsedValues = new float[parts.Length];
                 for (int i = 0; i < parts.Length; i++) {
                     float numArrayFloat;
                     if (float.TryParse (parts [i], out numArrayFloat)) {
                         parsedValues [i] = numArrayFloat;
                     }
                 }
                 curStyle.SetValue (prop.Name, parsedValues);
                 break;
             case "TextStyleAlign":
                 curStyle.TextAlign = EnumUtils.FromDescription<TextStyleAlign> (cleanedValue);
                 break;
             case "TextStyleDecoration":
                 curStyle.TextDecoration = EnumUtils.FromDescription<TextStyleDecoration> (cleanedValue);
                 break;
             case "TextStyleTextTransform":
                 curStyle.TextTransform = EnumUtils.FromDescription<TextStyleTextTransform> (cleanedValue);
                 break;
             case "TextStyleTextOverflow":
                 curStyle.TextOverflow = EnumUtils.FromDescription<TextStyleTextOverflow> (cleanedValue);
                 break;
             default:
                 throw new InvalidCastException ("Could not find the appropriate type " + prop.PropertyType.Name);
             }
         }
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Parses the CSS rule.
        /// </summary>
        /// <param name="curStyle">Current style.</param>
        /// <param name="rule">Rule.</param>
        internal static void ParseCSSRule(ref TextStyleParameters curStyle, CssParserRule rule, Dictionary <string, string> cssVariables)
        {
            foreach (var declaration in rule.Declarations)
            {
                if (_textStyleProperties.ContainsKey(declaration.Property))
                {
                    // Assign the variable if it exists
                    if (cssVariables != null && declaration.ReferencesVariable)
                    {
                        declaration.Value = cssVariables[declaration.Value];
                    }

                    var cleanedValue = declaration.Value.Replace("\"", "");
                    cleanedValue = cleanedValue.Trim();

                    var prop = _textStyleProperties[declaration.Property];
                    switch (prop.PropertyType.Name)
                    {
                    case "String":
                        curStyle.SetValue(prop.Name, cleanedValue);
                        break;

                    case "Int32":
                        int numInt;
                        if (int.TryParse(cleanedValue, out numInt))
                        {
                            curStyle.SetValue(prop.Name, numInt);
                        }
                        break;

                    case "Single":
                        cleanedValue = cleanedValue.Replace("px", "");
                        float numFloat;
                        if (float.TryParse(cleanedValue, out numFloat))
                        {
                            curStyle.SetValue(prop.Name, numFloat);
                        }
                        else
                        {
                            throw new Exception("Failed to Parse Single value " + cleanedValue);
                        }
                        break;

                    case "Single[]":
                        var parts        = cleanedValue.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
                        var parsedValues = new float[parts.Length];
                        for (int i = 0; i < parts.Length; i++)
                        {
                            float numArrayFloat;
                            if (float.TryParse(parts[i], out numArrayFloat))
                            {
                                parsedValues[i] = numArrayFloat;
                            }
                        }
                        curStyle.SetValue(prop.Name, parsedValues);
                        break;

                    case "ColorRGB":
                        curStyle.SetValue(prop.Name, ColorRGB.FromHex(cleanedValue));
                        break;

                    case "CssAlign":
                        curStyle.TextAlign = EnumUtils.FromDescription <CssAlign>(cleanedValue);
                        break;

                    case "CssDecoration":
                        curStyle.TextDecoration = EnumUtils.FromDescription <CssDecoration>(cleanedValue);
                        break;

                    case "CssTextTransform":
                        curStyle.TextTransform = EnumUtils.FromDescription <CssTextTransform>(cleanedValue);
                        break;

                    case "CssTextOverflow":
                        curStyle.TextOverflow = EnumUtils.FromDescription <CssTextOverflow>(cleanedValue);
                        break;

                    case "CssFontStyle":
                        curStyle.FontStyle = EnumUtils.FromDescription <CssFontStyle>(cleanedValue);
                        break;

                    case "CssFontWeight":
                        curStyle.FontWeight = EnumUtils.FromDescription <CssFontWeight>(cleanedValue);
                        break;

                    default:
                        throw new InvalidCastException("Could not find the appropriate type " + prop.PropertyType.Name);
                    }
                }
            }
        }