Exemplo n.º 1
0
        public static CSSStyleDeclaration ParseStyleDeclaration(CmsCssRule rule)
        {
            //current.Declarations = Kooboo.Dom.CSS.CSSSerializer.deserializeDeclarationBlock(cmscssrule.RuleText);

            var cssrule = Dom.CSSParser.ParseOneCssRule(rule.CssText);

            if (cssrule != null)
            {
                var stylerule = cssrule as CSSStyleRule;
                if (stylerule != null)
                {
                    return(stylerule.style);
                }
            }
            return(null);
        }
Exemplo n.º 2
0
        public static List <UsedByRelation> ShowUsedBy(SiteDb sitedb, List <Relation.ObjectRelation> objectrelations)
        {
            List <UsedByRelation> relations = new List <UsedByRelation>();

            foreach (var item in objectrelations)
            {
                UsedByRelation relation = new UsedByRelation();

                if (item.ConstTypeX == ConstObjectType.CssRule)
                {
                    CmsCssRule cssrule = sitedb.CssRules.Get(item.objectXId);
                    if (cssrule == null)
                    {
                        continue;
                    }
                    var declarations = Kooboo.Dom.CSS.CSSSerializer.deserializeDeclarationBlock(cssrule.CssText);

                    string remark = cssrule.SelectorText + "{";
                    foreach (var decl in declarations.item)
                    {
                        if (Sites.Tag.Property.CanHaveUri(decl.propertyname))
                        {
                            remark += decl.propertyname + ":" + decl.value;
                        }
                    }
                    remark         += "}";
                    relation.Remark = remark;
                }

                var objectinfo = Sites.Service.ObjectService.GetObjectInfo(sitedb, item.objectXId, item.ConstTypeX);

                if (objectinfo != null)
                {
                    relation.Name      = objectinfo.DisplayName;
                    relation.Url       = objectinfo.Url;
                    relation.ModelType = objectinfo.ModelType;
                    relation.ObjectId  = objectinfo.ObjectId;
                    relation.ConstType = objectinfo.ConstType;
                }

                relations.Add(relation);
            }

            return(relations);
        }
Exemplo n.º 3
0
        /// <summary>
        /// compute html tag inline css.
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="sitedb"></param>
        /// <param name="objectId"></param>
        /// <param name="constType"></param>
        public static void ComputeInlineCss(Document doc, SiteDb sitedb, Guid objectId, byte constType, string baseurl)
        {
            HTMLCollection elements = doc.getElementByAttribute("style");

            List <CmsCssRule> cmsrules = new List <CmsCssRule>();

            foreach (var item in elements.item)
            {
                string style = item.getAttribute("style");

                if (!string.IsNullOrEmpty(style))
                {
                    CmsCssRule rule = new CmsCssRule();
                    rule.OwnerObjectId        = objectId;
                    rule.OwnerObjectConstType = constType;
                    rule.IsInline             = true;
                    rule.CssText       = style;
                    rule.KoobooId      = Service.DomService.GetKoobooId(item);
                    rule.KoobooOpenTag = Service.DomService.GetOpenTag(item);
                    rule.DisplayName   = Service.DomService.GetElementDisplayName(item);
                    var decls = Kooboo.Dom.CSS.CSSSerializer.deserializeDeclarationBlock(style);
                    rule.Properties = decls.item.Select(o => o.propertyname).ToList();
                    cmsrules.Add(rule);
                }
            }

            /// get old relation.
            List <CmsCssRule> oldrules = sitedb.CssRules.Query.Where(o => o.OwnerObjectId == objectId && o.IsInline).SelectAll();

            foreach (var item in oldrules)
            {
                if (!cmsrules.Where(o => o.Id == item.Id).Any())
                {
                    sitedb.CssRules.Delete(item.Id, false);
                }
            }

            foreach (var item in cmsrules)
            {
                sitedb.CssRules.AddOrUpdate(item, default(Guid), false);
                Relation.CmsCssRuleRelation.ComputeUrl(item, baseurl, sitedb);
            }
        }
Exemplo n.º 4
0
        public List <UsedByRelation> GetUsedBy(Style Style)
        {
            List <UsedByRelation> result = new List <UsedByRelation>();

            if (Style == null)
            {
                return(result);
            }

            /// for embedded style, this is belong to one parent object.
            if (Style.IsEmbedded)
            {
                var samestyles = this.GetSameEmbedded(Style.BodyHash);

                foreach (var item in samestyles)
                {
                    UsedByRelation relation = new UsedByRelation();
                    relation.ObjectId  = item.OwnerObjectId;
                    relation.ConstType = item.OwnerConstType;
                    Helper.RelationHelper.SetNameUrl(this.SiteDb, relation);
                    relation.Remark = item.KoobooOpenTag;
                    result.Add(relation);
                }

                return(result);
            }

            var relations = this.SiteDb.Relations.GetReferredBy(Style);

            foreach (var item in relations)
            {
                ///import rule has relation to cssrule only.
                ///this style if reference by another style using import rule.
                if (item.ConstTypeX == ConstObjectType.CssRule)
                {
                    CmsCssRule cssrule = this.SiteDb.CssRules.Get(item.objectXId);
                    if (cssrule.ParentStyleId != default(Guid))
                    {
                        Style ParentStyle = this.SiteDb.Styles.Get(cssrule.ParentStyleId);

                        if (ParentStyle != null)
                        {
                            var parentresults = this.GetUsedBy(ParentStyle);
                            if (parentresults != null && parentresults.Count() > 0)
                            {
                                result.AddRange(parentresults);
                            }

                            UsedByRelation relation = new UsedByRelation();
                            relation.ObjectId  = ParentStyle.Id;
                            relation.ConstType = ParentStyle.ConstType;
                            Helper.RelationHelper.SetNameUrl(this.SiteDb, relation);
                            relation.Remark = cssrule.CssText;
                            result.Add(relation);
                        }
                    }
                }
                else
                {
                    UsedByRelation relation = new UsedByRelation();
                    relation.ObjectId  = item.objectXId;
                    relation.ConstType = item.ConstTypeX;
                    Helper.RelationHelper.SetNameUrl(this.SiteDb, relation);
                    result.Add(relation);
                }
            }
            return(result);
        }
Exemplo n.º 5
0
        public static List <CssConvertResult> ConvertCss(CSSRuleList rulelist, Guid ParentStyleId, Guid ParentCssRuleId = default(Guid))
        {
            List <CssConvertResult> Result = new List <CssConvertResult>();

            int counter = rulelist.item.Count;

            for (int i = 0; i < counter; i++)
            {
                CmsCssRule cmsrule = new CmsCssRule();
                cmsrule.ParentCssRuleId = ParentCssRuleId;
                cmsrule.ParentStyleId   = ParentStyleId;

                cmsrule.OwnerObjectId        = ParentStyleId;
                cmsrule.OwnerObjectConstType = ConstObjectType.Style;

                cmsrule.TempCssRuleIndex = i;

                CSSRule item = rulelist.item[i];

                cmsrule.selectorPositionIndex = item.EndSelectorIndex;

                if (item.type == enumCSSRuleType.STYLE_RULE)
                {
                    CSSStyleRule stylerule = item as CSSStyleRule;
                    cmsrule.CssText    = stylerule.cssText;
                    cmsrule.ruleType   = RuleType.StyleRule;
                    cmsrule.Properties = stylerule.style.item.Where(o => o != null && !string.IsNullOrWhiteSpace(o.propertyname)).Select(o => o.propertyname).ToList();
                }
                else if (item.type == enumCSSRuleType.IMPORT_RULE)
                {
                    CSSImportRule importrule = item as CSSImportRule;
                    cmsrule.CssText  = importrule.cssText;
                    cmsrule.ruleType = RuleType.ImportRule;
                }
                else if (item.type == enumCSSRuleType.MEDIA_RULE)
                {
                    CSSMediaRule mediarule = item as CSSMediaRule;
                    cmsrule.CssText  = mediarule.cssText;
                    cmsrule.ruleType = RuleType.MediaRule;
                }
                else if (item.type == enumCSSRuleType.FONT_FACE_RULE)
                {
                    CSSFontFaceRule facerule = item as CSSFontFaceRule;
                    cmsrule.CssText  = facerule.cssText;
                    cmsrule.ruleType = RuleType.FontFaceRule;
                }

                else
                {
                    continue;
                }

                /// check duplicate in the current collections.
                cmsrule.DuplicateIndex = CssService.GetDuplicateIndex(Result, cmsrule.SelectorText, cmsrule.ruleType);

                CssConvertResult converted = new CssConvertResult();
                converted.RuleId  = cmsrule.Id;
                converted.CmsRule = cmsrule;
                converted.CssRule = item;
                Result.Add(converted);

                if (item.type == enumCSSRuleType.MEDIA_RULE)
                {
                    var mediarule = item as Kooboo.Dom.CSS.CSSMediaRule;
                    var sub       = ConvertCss(mediarule.cssRules, ParentStyleId, cmsrule.Id);
                    if (sub != null && sub.Count() > 0)
                    {
                        Result.AddRange(sub);
                    }
                }
            }

            return(Result);
        }
Exemplo n.º 6
0
        // Get the original CssRule from style sheet based on the converted cmscssrule.
        public static CSSRule GetOrginalCssRule(List <CssConvertResult> ConvertResult, CmsCssRule foundCmsCssRule)
        {
            var find = ConvertResult.Find(o => o.RuleId == foundCmsCssRule.Id);

            return(find != null ? find.CssRule : null);
        }
Exemplo n.º 7
0
        public static void ComputeUrl(CmsCssRule CmsCssRule, string baseurl, SiteDb sitedb)
        {
            bool canhaveuri = false;

            var currentRelations = sitedb.Relations.GetRelations(CmsCssRule.Id);

            foreach (var item in CmsCssRule.Properties)
            {
                if (Kooboo.Sites.Tag.Property.CanHaveUri(item))
                {
                    canhaveuri = true; break;
                }
            }
            if (!canhaveuri)
            {
                foreach (var item in currentRelations)
                {
                    sitedb.Relations.Delete(item.Id);
                }
                return;
            }

            var urls = Kooboo.Sites.Service.CssService.GetUrlInfos(CmsCssRule.RuleText).Select(o => o.PureUrl).ToList();

            urls = urls.Where(o => Kooboo.Lib.Utilities.DataUriService.isDataUri(o) == false).ToList();

            ComputeUrlRelation(sitedb, CmsCssRule.Id, CmsCssRule.ConstType, urls);

            //Dictionary<Guid, string> routelist = null;

            //if (urls.Count == 0)
            //{
            //    routelist = new Dictionary<Guid, string>();
            //}
            //else
            //{
            //    routelist = Service.CssService.ConvertUrlsToRoutes(urls, baseurl);
            //}

            //foreach (var item in currentRelations)
            //{
            //    if (!routelist.Keys.Contains(item.objectYId))
            //    {
            //        sitedb.Relations.Delete(item.Id);
            //    }
            //}

            //foreach (var item in routelist)
            //{
            //    byte consttype = 0;
            //    var objecttype = Kooboo.Lib.Helper.UrlHelper.GetFileType(item.Value);

            //    if (objecttype == Lib.Helper.UrlHelper.UrlFileType.Image)
            //    {
            //        consttype = ConstObjectType.Image;
            //    }
            //    else
            //    {
            //        consttype = ConstObjectType.File;
            //    }

            //    if (currentRelations.Find(o => o.objectYId == item.Key) == null)
            //    {
            //        sitedb.Routes.EnsureExists(item.Value, consttype);
            //        sitedb.Relations.AddOrUpdate(CmsCssRule.Id, item.Key, CmsCssRule.ConstType, ConstObjectType.Route, consttype);
            //    }
            //}
        }