示例#1
0
        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);
        }
示例#2
0
        /// <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, "");
                }
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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;
        }
示例#5
0
        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);
        }
示例#6
0
        /// <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);
            }
        }