Esempio n. 1
0
        // .................................................................
        //
        // Processing CSS Attributes
        //
        // .................................................................

        internal static void GetElementPropertiesFromCssAttributes(XmlElement htmlElement, string elementName, CssStylesheet stylesheet, Hashtable localProperties, List <XmlElement> sourceContext)
        {
            string styleFromStylesheet = stylesheet.GetStyle(elementName, sourceContext);

            string styleInline = HtmlToXamlConverter.GetAttribute(htmlElement, "style");

            // Combine styles from stylesheet and from inline attribute.
            // The order is important - the latter styles will override the former.
            string style = styleFromStylesheet != null ? styleFromStylesheet : null;

            if (styleInline != null)
            {
                style = style == null ? styleInline : (style + ";" + styleInline);
            }

            // Apply local style to current formatting properties
            if (style != null)
            {
                string[] styleValues = style.Split(';');
                for (int i = 0; i < styleValues.Length; i++)
                {
                    string[] styleNameValue;

                    styleNameValue = styleValues[i].Split(':');
                    if (styleNameValue.Length == 2)
                    {
                        string styleName  = styleNameValue[0].Trim().ToLower();
                        string styleValue = HtmlToXamlConverter.UnQuote(styleNameValue[1].Trim()).ToLower();
                        int    nextIndex  = 0;

                        switch (styleName)
                        {
                        case "font":
                            ParseCssFont(styleValue, localProperties);
                            break;

                        case "font-family":
                            ParseCssFontFamily(styleValue, ref nextIndex, localProperties);
                            break;

                        case "font-size":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, "font-size", /*mustBeNonNegative:*/ true);
                            break;

                        case "font-style":
                            ParseCssFontStyle(styleValue, ref nextIndex, localProperties);
                            break;

                        case "font-weight":
                            ParseCssFontWeight(styleValue, ref nextIndex, localProperties);
                            break;

                        case "font-variant":
                            ParseCssFontVariant(styleValue, ref nextIndex, localProperties);
                            break;

                        case "line-height":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, "line-height", /*mustBeNonNegative:*/ true);
                            break;

                        case "word-spacing":
                            // TODO: Implement word-spacing conversion
                            break;

                        case "letter-spacing":
                            // TODO: Implement letter-spacing conversion
                            break;

                        case "color":
                            ParseCssColor(styleValue, ref nextIndex, localProperties, "color");
                            break;

                        case "text-decoration":
                            ParseCssTextDecoration(styleValue, ref nextIndex, localProperties);
                            break;

                        case "text-transform":
                            ParseCssTextTransform(styleValue, ref nextIndex, localProperties);
                            break;

                        case "background-color":
                            ParseCssColor(styleValue, ref nextIndex, localProperties, "background-color");
                            break;

                        case "background":
                            // TODO: need to parse composite background property
                            ParseCssBackground(styleValue, ref nextIndex, localProperties);
                            break;

                        case "text-align":
                            ParseCssTextAlign(styleValue, ref nextIndex, localProperties);
                            break;

                        case "vertical-align":
                            ParseCssVerticalAlign(styleValue, ref nextIndex, localProperties);
                            break;

                        case "text-indent":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, "text-indent", /*mustBeNonNegative:*/ false);
                            break;

                        case "width":
                        case "height":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, /*mustBeNonNegative:*/ true);
                            break;

                        case "margin":     // top/right/bottom/left
                            ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                            break;

                        case "margin-top":
                        case "margin-right":
                        case "margin-bottom":
                        case "margin-left":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, /*mustBeNonNegative:*/ true);
                            break;

                        case "padding":
                            ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                            break;

                        case "padding-top":
                        case "padding-right":
                        case "padding-bottom":
                        case "padding-left":
                            ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, /*mustBeNonNegative:*/ true);
                            break;

                        case "border":
                            ParseCssBorder(styleValue, ref nextIndex, localProperties);
                            break;

                        case "border-style":
                        case "border-width":
                        case "border-color":
                            ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                            break;

                        case "border-top":
                        case "border-right":
                        case "border-left":
                        case "border-bottom":
                            // TODO: Parse css border style
                            break;

                        // NOTE: css names for elementary border styles have side indications in the middle (top/bottom/left/right)
                        // In our internal notation we intentionally put them at the end - to unify processing in ParseCssRectangleProperty method
                        case "border-top-style":
                        case "border-right-style":
                        case "border-left-style":
                        case "border-bottom-style":
                        case "border-top-color":
                        case "border-right-color":
                        case "border-left-color":
                        case "border-bottom-color":
                        case "border-top-width":
                        case "border-right-width":
                        case "border-left-width":
                        case "border-bottom-width":
                            // TODO: Parse css border style
                            break;

                        case "display":
                            // TODO: Implement display style conversion
                            break;

                        case "float":
                            ParseCssFloat(styleValue, ref nextIndex, localProperties);
                            break;

                        case "clear":
                            ParseCssClear(styleValue, ref nextIndex, localProperties);
                            break;

                        default:
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        internal static void GetElementPropertiesFromCssAttributes(XmlElement htmlElement, string elementName, CssStylesheet stylesheet, Hashtable localProperties, List <XmlElement> sourceContext)
        {
            var styleFromStylesheet = stylesheet.GetStyle(elementName, sourceContext);

            var styleInline = HtmlToXamlConverter.GetAttribute(htmlElement, "style");

            var style = styleFromStylesheet;

            if (styleInline != null)
            {
                style = style == null ? styleInline : style + ";" + styleInline;
            }

            if (style == null)
            {
                return;
            }

            var styleValues = style.Split(';');

            foreach (var t in styleValues)
            {
                var styleNameValue = t.Split(':');
                if (styleNameValue.Length != 2)
                {
                    continue;
                }

                var styleName  = styleNameValue[0].Trim().ToLower(CultureInfo.GetCultureInfo("en-US"));
                var styleValue = HtmlToXamlConverter.UnQuote(styleNameValue[1].Trim()).ToLower(CultureInfo.GetCultureInfo("en-US"));
                var nextIndex  = 0;

                switch (styleName)
                {
                case "font":
                    ParseCssFont(styleValue, localProperties);
                    break;

                case "font-family":
                    ParseCssFontFamily(styleValue, ref nextIndex, localProperties);
                    break;

                case "font-size":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, "font-size", true);
                    break;

                case "font-style":
                    ParseCssFontStyle(styleValue, ref nextIndex, localProperties);
                    break;

                case "font-weight":
                    ParseCssFontWeight(styleValue, ref nextIndex, localProperties);
                    break;

                case "font-variant":
                    ParseCssFontVariant(styleValue, ref nextIndex, localProperties);
                    break;

                case "line-height":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, "line-height", true);
                    break;

                case "word-spacing":
                    break;

                case "letter-spacing":
                    break;

                case "color":
                    ParseCssColor(styleValue, ref nextIndex, localProperties, "color");
                    break;

                case "text-decoration":
                    ParseCssTextDecoration(styleValue, ref nextIndex, localProperties);
                    break;

                case "text-transform":
                    ParseCssTextTransform(styleValue, ref nextIndex, localProperties);
                    break;

                case "background-color":
                    ParseCssColor(styleValue, ref nextIndex, localProperties, "background-color");
                    break;

                case "background":
                    //ParseCssBackground(styleValue, ref nextIndex, localProperties);
                    break;

                case "text-align":
                    ParseCssTextAlign(styleValue, ref nextIndex, localProperties);
                    break;

                case "vertical-align":
                    ParseCssVerticalAlign(styleValue, ref nextIndex, localProperties);
                    break;

                case "text-indent":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, "text-indent", false);
                    break;

                case "width":
                case "height":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, true);
                    break;

                case "margin":
                    ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                    break;

                case "margin-top":
                case "margin-right":
                case "margin-bottom":
                case "margin-left":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, true);
                    break;

                case "padding":
                    ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                    break;

                case "padding-top":
                case "padding-right":
                case "padding-bottom":
                case "padding-left":
                    ParseCssSize(styleValue, ref nextIndex, localProperties, styleName, true);
                    break;

                case "border":
                    ParseCssBorder(styleValue, ref nextIndex, localProperties);
                    break;

                case "border-style":
                case "border-width":
                case "border-color":
                    ParseCssRectangleProperty(styleValue, ref nextIndex, localProperties, styleName);
                    break;

                case "border-top":
                case "border-right":
                case "border-left":
                case "border-bottom":
                    break;

                case "border-top-style":
                case "border-right-style":
                case "border-left-style":
                case "border-bottom-style":
                case "border-top-color":
                case "border-right-color":
                case "border-left-color":
                case "border-bottom-color":
                case "border-top-width":
                case "border-right-width":
                case "border-left-width":
                case "border-bottom-width":
                    break;

                case "display":
                    break;

                case "float":
                    ParseCssFloat(styleValue, ref nextIndex, localProperties);
                    break;

                case "clear":
                    ParseCssClear(styleValue, ref nextIndex, localProperties);
                    break;
                }
            }
        }