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); }
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); }
/// <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); } }
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); }
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); }
// 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); }
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); // } //} }