示例#1
0
        public EvaluatorResponse Evaluate(Node node, EvaluatorOption options)
        {
            if (node.nodeType != enumNodeType.COMMENT)
            {
                return(null);
            }

            /// NOTO: There are two place for evaluating comment command.
            if (Commands.CommandManager.IsCommand(node as Comment))
            {
                var response = new EvaluatorResponse();
                List <IRenderTask> result = new List <IRenderTask>();

                Guid OwnerObjectId = options.OwnerObjectId;

                var command = Commands.CommandParser.ParseCommand(node as Comment);

                if (command.Name.ToLower() == "layout")
                {
                    if ((options.IgnoreEvaluators & EnumEvaluator.LayoutCommand) == EnumEvaluator.LayoutCommand)
                    {
                        return(null);
                    }
                    var task = new CommandRenderTask(node as Comment, options);
                    task.ClearBefore = true;
                    result.Add(task);
                    response.AppendTask = result;
                }
                else
                {
                    var task = new CommandRenderTask(node as Comment, options);
                    result.Add(task);
                    response.ContentTask = result;
                }

                response.StopNextEvaluator = true;
                response.OmitTag           = true;

                if (options.RequireBindingInfo)
                {
                    if (response.BindingTask == null)
                    {
                        response.BindingTask = new List <IRenderTask>();
                    }
                    var traceability = new ComponentTrace(command.Name, "command");
                    var bindingTask  = new BindingRenderTask(traceability);
                    response.BindingTask.Add(bindingTask);
                    if (response.EndBindingTask == null)
                    {
                        response.EndBindingTask = new List <IRenderTask>();
                    }
                    response.EndBindingTask.Add(bindingTask.BindingEndRenderTask);
                }
                return(response);
            }

            return(null);
        }
示例#2
0
        /// <summary>
        /// Evaluate the to be rendered HTML into a list of RenderTask.
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static List <IRenderTask> Evaluate(string html, EvaluatorOption options)
        {
            if (options == null)
            {
                options = new EvaluatorOption();
            }

            List <IRenderTask> tasklist   = new List <IRenderTask>();
            List <IRenderTask> appendtask = new List <IRenderTask>();

            if (string.IsNullOrEmpty(html))
            {
                return(tasklist);
            }
            var doc          = DomParser.CreateDom(html);
            int currentindex = 0;
            int totallen     = html.Length;

            // handle comment in the top.
            foreach (var item in doc.childNodes.item)
            {
                if (item is Comment && Kooboo.Sites.Render.Commands.CommandManager.IsCommand(item as Comment))
                {
                    var command = Kooboo.Sites.Render.Commands.CommandParser.ParseCommand(item as Comment);

                    if (command.Name.ToLower() == "layout")
                    {
                        if ((options.IgnoreEvaluators & EnumEvaluator.LayoutCommand) == EnumEvaluator.LayoutCommand)
                        {
                            continue;
                        }
                    }

                    var comment = item as Comment;
                    if (comment != null)
                    {
                        if (comment.location.endTokenEndIndex <= doc.documentElement.location.openTokenStartIndex)
                        {
                            tasklist.Add(new ContentRenderTask(doc.HtmlSource.Substring(currentindex,
                                                                                        comment.location.openTokenStartIndex - currentindex)));

                            var commandtask = new CommandRenderTask(comment, options);
                            if (command.Name.ToLower() == "layout")
                            {
                                commandtask.ClearBefore = true;
                                appendtask.Add(commandtask);
                            }
                            else
                            {
                                tasklist.Add(commandtask);
                            }

                            currentindex = comment.location.endTokenEndIndex + 1;
                        }
                        else
                        {
                            var commandtask = new CommandRenderTask(comment, options);
                            if (command.Name.ToLower() == "layout")
                            {
                                commandtask.ClearBefore = true;
                                appendtask.Add(commandtask);
                            }
                            else
                            {
                                tasklist.Add(commandtask);
                            }
                        }
                    }
                }
            }

            var iterator = doc.createNodeIterator(doc.documentElement, enumWhatToShow.ELEMENT | enumWhatToShow.COMMENT, null);

            var nextnode = iterator.nextNode();

            List <EvaluatorResponse> responseList = new List <EvaluatorResponse>();

            List <IEvaluator> Evaluator;

            if (options.Evaluators != null)
            {
                Evaluator = options.Evaluators;
            }
            else
            {
                Evaluator = EvaluatorContainer.DefaultList;
            }

            while (nextnode != null)
            {
                if (ShouldTryRender(nextnode))
                {
                    foreach (var item in Evaluator)
                    {
                        var response = item.Evaluate(nextnode, options);
                        if (response != null)
                        {
                            responseList.Add(response);
                            if (response.StopNextEvaluator)
                            {
                                break;
                            }
                        }
                    }
                    int len = nextnode.location.openTokenStartIndex - currentindex;
                    //document parse error,may cause nextnode openTokenStartIndex less than currentindex.
                    //then get repeated content
                    if (responseList.Count() > 0 && len >= 0)
                    {
                        var  element      = nextnode as Element;
                        bool IsSelfClosed = element == null ? false : Service.DomService.IsSelfCloseTag(element.tagName);
                        bool OmitTag      = responseList.Any(o => o.OmitTag);


                        if (len > 0)
                        {
                            tasklist.Add(new ContentRenderTask(doc.HtmlSource.Substring(currentindex, len)));
                        }
                        var bindings = GetBinding(responseList);
                        if (bindings != null)
                        {
                            tasklist.AddRange(bindings);
                        }
                        var attributes  = GetAttribute(responseList);
                        var contenttask = GetContent(responseList);

                        if (IsSelfClosed)
                        {
                            if (attributes != null && !OmitTag)
                            {
                                tasklist.Add(new ContentRenderTask(GetHalfOpenTag(element)));
                                tasklist.AddRange(attributes);
                                tasklist.Add(new ContentRenderTask("/>"));
                            }
                            else
                            {
                                if (contenttask != null)
                                {
                                    tasklist.AddRange(contenttask);
                                }
                            }
                        }
                        else
                        {
                            if (attributes != null && !OmitTag)
                            {
                                tasklist.Add(new ContentRenderTask(GetHalfOpenTag(element)));
                                tasklist.AddRange(attributes);
                                tasklist.Add(new ContentRenderTask(">"));
                            }
                            else
                            {
                                if (!OmitTag)
                                {
                                    tasklist.Add(new ContentRenderTask(GetHalfOpenTag(element) + ">"));
                                }
                            }

                            if (contenttask != null)
                            {
                                tasklist.AddRange(contenttask);
                            }

                            if (!OmitTag && contenttask != null)
                            {
                                tasklist.Add(new ContentRenderTask("</" + element.tagName + ">"));
                            }
                        }

                        var endbinding = GetEndBinding(responseList);
                        if (endbinding != null)
                        {
                            tasklist.AddRange(endbinding);
                        }

                        var append = GetAppend(responseList);
                        if (append != null)
                        {
                            appendtask.AddRange(append);
                        }

                        if (IsFakeHeader(element))
                        {
                            currentindex = nextnode.location.openTokenStartIndex;
                            nextnode     = iterator.NextSibling(nextnode);
                        }
                        else if (contenttask != null)
                        {
                            currentindex = nextnode.location.endTokenEndIndex + 1;
                            //document parse error,endTokenEndIndex may be zero
                            if (nextnode.location.endTokenEndIndex + 1 < nextnode.location.openTokenEndIndex + 1)
                            {
                                currentindex = nextnode.location.openTokenEndIndex + 1;
                            }
                            nextnode = iterator.NextSibling(nextnode);
                        }
                        else
                        {
                            currentindex = nextnode.location.openTokenEndIndex + 1;
                            nextnode     = iterator.nextNode();
                        }

                        responseList.Clear();
                    }
                    else
                    {
                        nextnode = iterator.nextNode();
                    }
                }
                else
                {
                    nextnode = iterator.nextNode();
                }
            }

            if (currentindex < totallen - 1)
            {
                tasklist.Add(new ContentRenderTask(doc.HtmlSource.Substring(currentindex, totallen - currentindex)));
            }

            if (appendtask.Count() > 0)
            {
                tasklist.AddRange(appendtask);
            }
            RenderHelper.OptimizeTask(tasklist);

            return(tasklist);
        }
示例#3
0
        public EvaluatorResponse Evaluate(Node node, EvaluatorOption options)
        {
            if (node.nodeType != enumNodeType.COMMENT)
            {
                return(null);
            }

            /// NOTO: There are two place for evaluating comment command.
            if (Commands.CommandManager.IsCommand(node as Comment))
            {
                var response = new EvaluatorResponse();
                List <IRenderTask> result = new List <IRenderTask>();

                Guid OwnerObjectId = options.OwnerObjectId;

                var command = Commands.CommandParser.ParseCommand(node as Comment);

                if (command.Name.ToLower() == "layout")
                {
                    if ((options.IgnoreEvaluators & EnumEvaluator.LayoutCommand) == EnumEvaluator.LayoutCommand)
                    {
                        return(null);
                    }
                    var task = new CommandRenderTask(node as Comment);
                    task.ClearBefore = true;
                    result.Add(task);
                    response.AppendTask = result;
                }
                else
                {
                    var task = new CommandRenderTask(node as Comment);
                    result.Add(task);
                    response.ContentTask = result;
                }

                response.StopNextEvaluator = true;
                response.OmitTag           = true;

                if (options.RequireBindingInfo)
                {
                    string boundary = Kooboo.Lib.Helper.StringHelper.GetUniqueBoundary();

                    var startbinding = new BindingObjectRenderTask()
                    {
                        ObjectType = "Command", Boundary = boundary, NameOrId = command.Name
                    };
                    List <IRenderTask> bindingstarts = new List <IRenderTask>();
                    bindingstarts.Add(startbinding);
                    response.BindingTask = bindingstarts;

                    var endbinding = new BindingObjectRenderTask()
                    {
                        ObjectType = "Command", IsEndBinding = true, Boundary = boundary, NameOrId = command.Name
                    };

                    List <IRenderTask> bindingends = new List <IRenderTask>();
                    bindingends.Add(endbinding);
                    response.EndBindingTask = bindingends;
                }
                return(response);
            }

            return(null);
        }