public static bool RequireRenderLink(Dom.Element hrefElement, Repository.SiteDb SiteDb = null) { if (hrefElement.hasAttribute(Kooboo.Sites.ConstTALAttributes.href)) { return(true); } var href = Service.DomUrlService.GetLinkOrSrc(hrefElement); if (string.IsNullOrEmpty(href)) { return(false); } if (href.Contains("{") && href.Contains("}")) { return(true); } if (href.StartsWith("/__kb")) { return(true); } if (SiteDb == null) { return(false); } if (SiteDb.WebSite != null && SiteDb.WebSite.EnableSitePath && SiteDb.WebSite.SitePath != null && SiteDb.WebSite.HasSitePath()) { return(true); } if (Service.DomUrlService.IsExternalLink(href)) { return(false); } var route = Routing.ObjectRoute.GetRoute(SiteDb, href); if (route == null) { return(false); } if (route.Parameters.Count > 0) { return(true); } if (route.DestinationConstType == ConstObjectType.Page) { var page = SiteDb.Pages.Get(route.objectId); if (page != null && page.Parameters.Count > 0) { return(true); } } return(false); }
/// <summary> /// apply the style sheet to all Dom Elements. /// </summary> /// <param name="page"></param> public static void ApplySiteStyle(Page page, Repository.SiteDb SiteDb) { var dom = page.Dom; if (!dom.hasParseCSS && dom.StyleSheets.item.Count == 0) { ParseSiteStyleSheet(page, SiteDb); } foreach (var item in dom.StyleSheets.item) { CSSStyleSheet stylesheet = item as CSSStyleSheet; if (stylesheet != null) { dom.ApplyCssRules(stylesheet.cssRules, ""); } } }
public static void Compute(ResourceGroup group, Repository.SiteDb sitedb) { var routes = group.Children.Select(o => o.Key).ToList(); var existings = sitedb.Relations.GetRelations(group.Id); foreach (var item in existings) { if (!routes.Contains(item.objectYId)) { sitedb.Relations.Delete(item.Id); } } foreach (var item in routes) { sitedb.Relations.AddOrUpdate(group.Id, item, group.ConstType, ConstObjectType.Route, group.Type); } }
public static void ParseSiteStyleSheet(Page page, Repository.SiteDb SiteDb) { var dom = page.Dom; string pageRelativeUrl = Kooboo.Sites.Service.ObjectService.GetObjectRelativeUrl(SiteDb, page); string pageAbsoluteUrl = UrlHelper.Combine(SiteDb.WebSite.BaseUrl(), pageRelativeUrl); HTMLCollection styletags = dom.getElementsByTagName("link, style"); HTMLCollection availablesheets = new HTMLCollection(); foreach (var item in styletags.item) { if (item.tagName == "style") { availablesheets.Add(item); } else if (item.hasAttribute("type")) { if (item.getAttribute("type").ToLower().Contains("css")) { availablesheets.Add(item); } } else if (item.hasAttribute("rel")) { if (item.getAttribute("rel").ToLower().Contains("stylesheet")) { availablesheets.Add(item); } } } foreach (var item in availablesheets.item) { if (item.tagName == "link") { string href = item.getAttribute("href"); if (string.IsNullOrEmpty(href)) { continue; } string cssrelativeUrl = UrlHelper.Combine(pageRelativeUrl, href); cssrelativeUrl = UrlHelper.RelativePath(cssrelativeUrl); var route = Sites.Routing.ObjectRoute.GetRoute(SiteDb, cssrelativeUrl); if (route == null || route.DestinationConstType != ConstObjectType.Style) { continue; } string cssText = SiteDb.Styles.Get(route.objectId).Body; string cssabsoluteUrl = UrlHelper.Combine(pageAbsoluteUrl, cssrelativeUrl); if (string.IsNullOrEmpty(cssText)) { continue; } CSSStyleSheet newStyleSheet = CSSParser.ParseCSSStyleSheet(cssText, cssabsoluteUrl, true); newStyleSheet.ownerNode = item; if (newStyleSheet != null) { newStyleSheet.ownerNode = item; string media = item.getAttribute("media"); if (!string.IsNullOrEmpty(media)) { string[] medialist = media.Split(','); foreach (var mediaitem in medialist) { newStyleSheet.Medialist.appendMedium(mediaitem); } } dom.StyleSheets.appendStyleSheet(newStyleSheet); } } else if (item.tagName == "style") { string cssText = item.InnerHtml; CSSStyleSheet newStyleSheet = CSSParser.ParseCSSStyleSheet(cssText, pageAbsoluteUrl, true); newStyleSheet.ownerNode = item; string media = item.getAttribute("media"); if (!string.IsNullOrEmpty(media)) { string[] medialist = media.Split(','); foreach (var mediaitem in medialist) { newStyleSheet.Medialist.appendMedium(mediaitem); } } dom.StyleSheets.appendStyleSheet(newStyleSheet); } } dom.hasParseCSS = true; }
public static AnalyzerContext GetContext(string HtmlSource, string BaseUrl, Guid ObjectId, byte ObjectType, Repository.SiteDb SiteDb, string OriginalImortUrl = "") { string baseurl = BaseUrl; AnalyzerContext context = new AnalyzerContext(); context.SiteDb = SiteDb; context.ObjectId = ObjectId; context.ObjectType = ObjectType; context.HtmlSource = HtmlSource; string htmlbase = context.Dom.baseURI; if (!string.IsNullOrEmpty(htmlbase)) { baseurl = htmlbase; } context.AbsoluteUrl = baseurl; if (!string.IsNullOrEmpty(OriginalImortUrl)) { context.OriginalImportUrl = OriginalImortUrl; } return(context); }
/// <summary> /// Calculate or reclculate the relation to css rule. /// </summary> /// <param name="style"></param> /// <param name="sitedb"></param> public static void Compute(Style style, Repository.SiteDb sitedb) { var body = style.Body; var covnerted = Kooboo.Sites.Service.CssService.ConvertCss(body, style.Id); if (style.OwnerObjectId != default(Guid)) { foreach (var item in covnerted) { item.CmsRule.OwnerObjectId = style.OwnerObjectId; item.CmsRule.OwnerObjectConstType = style.OwnerConstType; } } // remove not any more valid rules. RemoveOldRules(style, sitedb, covnerted); string baseurl = ObjectService.GetObjectRelativeUrl(sitedb, style); foreach (var item in covnerted) { ///compute import relation or the style image/font definition... if (item.CmsRule.ruleType == RuleType.ImportRule) { var importrule = item.CssRule as Kooboo.Dom.CSS.CSSImportRule; if (importrule != null) { string url = importrule.href; if (!string.IsNullOrEmpty(url)) { string objecturl = Kooboo.Lib.Helper.UrlHelper.Combine(baseurl, url); Route temprouteid = new Route() { Name = objecturl }; Guid routeid = temprouteid.Id; List <ObjectRelation> oldrelations = sitedb.Relations.GetRelations(item.RuleId); if (oldrelations.Count == 1 && oldrelations[0].objectYId == routeid && oldrelations[0].ConstTypeY == ConstObjectType.Route) { // the relation already there. continue; } foreach (var relation in oldrelations) { sitedb.Relations.Delete(relation.Id); } sitedb.Relations.AddOrUpdate(item.CmsRule.Id, routeid, item.CmsRule.ConstType, ConstObjectType.Route, ConstObjectType.Style); } } } else if (item.CmsRule.ruleType == RuleType.StyleRule) { Relation.CmsCssRuleRelation.ComputeUrl(item.CmsRule, baseurl, sitedb); } sitedb.CssRules.AddOrUpdate(item.CmsRule); } }