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