public AliasReference Clone() { AliasReference newObj = new AliasReference(); newObj.referenceObject = this.referenceObject; newObj.iteration = this.iteration; newObj.maxIteration = this.maxIteration; newObj.aliasType = this.aliasType; newObj.kobjectIndex = this.kobjectIndex; return(newObj); }
/// <summary> /// Process nodes with k-object tags. /// </summary> public override void Process(ref HtmlNode node, HtmlAttribute dynamicAttribute, Dictionary <string, AliasReference> classNameAlias, Dictionary <int, string> classNameAliasdepth, int depth, string websiteId, ExpressionEvaluator evaluator, KEntity entity, dynamic websiteData, Models.Pagination viewDetails, string queryString, Dictionary <string, long> functionLog, bool isDetailsView = false, bool isNFSite = false, string developerId = null) { Node result = LexerGenerator.Parse(Helper.TrimDelimiters(dynamicAttribute.Value).Trim('[').Trim(']')); if (result?.Children?.Count == 3) { string referenceName = result.Children[0].Children[0].Token.Value.ToLower(); string referenceObjectKey = result.Children[2].Children[0].Token.Value; AliasReference aliasReference = new AliasReference { referenceObject = referenceObjectKey, iteration = -1, maxIteration = -1 }; if (!classNameAlias.ContainsKey(referenceName)) { classNameAlias.Add(referenceName, aliasReference); } } }
public override void Process(ref HtmlNode node, HtmlAttribute dynamicAttribute, Dictionary <string, AliasReference> classNameAlias, Dictionary <int, string> classNameAliasdepth, int depth, string websiteId, ExpressionEvaluator evaluator, KEntity entity, dynamic websiteData, Models.Pagination viewDetails, string queryString, Dictionary <string, long> functionLog, bool isDetailsView = false, bool isNFSite = false, string developerId = null) { Node result = LexerGenerator.Parse(Helper.TrimDelimiters(dynamicAttribute.Value)); if (result.Token.Value == ACTIONS.Loop) { string referenceObject = result.Children[0].Children[0].Token.Value; string referenceName = result.Children[2].Children[0].Token.Value?.ToLower(); var refObj = evaluator.EvaluateExpression(referenceObject, entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out bool hasData, functionLog, isDetailsView, isNFSite); if (refObj.GetType() == typeof(string) && refObj == "") { node = HtmlCommentNode.CreateNode("<!-- skip -->"); return; } string offsetObj = evaluator.EvaluateExpression(result.Children[6], entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out hasData, functionLog, isDetailsView, isNFSite, developerId).ToString(); int.TryParse(offsetObj, out int offset); int iteration = 0; int maxIteration = 0; if (dynamicAttribute.Value.IndexOf("offset") > 0) { if (int.TryParse(viewDetails.currentpagenumber, out int currentPage) && currentPage > 0) { iteration = offset * (currentPage - 1); } } else { string iterationObj = evaluator.EvaluateExpression(result.Children[4], entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out hasData, functionLog, isDetailsView, isNFSite, developerId).ToString(); int.TryParse(iterationObj, out iteration); } maxIteration = iteration + offset; int objSize = (int)evaluator.GetObjectSize(refObj); maxIteration = (maxIteration < objSize) ? maxIteration : objSize; if (iteration > maxIteration) { node = HtmlCommentNode.CreateNode("<!-- skip -->"); return; } else if (objSize == maxIteration && dynamicAttribute.Value.IndexOf("offset") > 0) { viewDetails.nextpage.url = "#"; viewDetails.pagesize = maxIteration - iteration + 1; } AliasReference aliasReference = new AliasReference { referenceObject = null, iteration = iteration, maxIteration = maxIteration }; if (!classNameAlias.ContainsKey(referenceName)) { classNameAlias.Add(referenceName, aliasReference); classNameAliasdepth.Add(depth, referenceName); } } else if (result.Token.Value == ACTIONS.InLoop) { string referenceName = result.Children[0].Children[0].Token.Value?.ToLower(); string referenceObject = result.Children[2].Children[0].Token.Value; var obj = evaluator.EvaluateExpression(referenceObject, entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out bool hasData, functionLog, isDetailsView, isNFSite); if (obj.GetType() == typeof(string) && obj == "") { node = HtmlCommentNode.CreateNode("<!-- skip -->"); return; } AliasReference aliasReference = new AliasReference(); aliasReference.referenceObject = referenceObject; aliasReference.iteration = 0; aliasReference.maxIteration = (int)evaluator.GetObjectSize(obj); if (!classNameAlias.ContainsKey(referenceName)) { classNameAlias.Add(referenceName, aliasReference); classNameAliasdepth.Add(depth, referenceName); } } }
/// <summary> /// Process nodes with k-script tags. /// </summary> public override void Process(ref HtmlNode node, HtmlAttribute dynamicAttribute, Dictionary <string, AliasReference> classNameAlias, Dictionary <int, string> classNameAliasdepth, int depth, string websiteId, ExpressionEvaluator evaluator, KEntity entity, dynamic websiteData, Models.Pagination viewDetails, string queryString, Dictionary <string, long> functionLog, bool isDetailsView = false, bool isNFSite = false, string developerId = null) { try { var apiUrl = node.GetAttributeValue("get-api", null); var input = node.GetAttributeValue("input", null); var headers = node.GetAttributeValue("headers", null)?.Trim()?.Trim('[')?.Trim(']'); string cacheEnabledStr = node.GetAttributeValue("cacheenabled", null); bool cacheEnabled = true; if (!string.IsNullOrEmpty(cacheEnabledStr)) { cacheEnabledStr = evaluator.EvaluateExpression(cacheEnabledStr, entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out bool hasData, functionLog, isDetailsView, isNFSite, developerId).ToString(); bool.TryParse(cacheEnabledStr, out cacheEnabled); } if (!string.IsNullOrEmpty(apiUrl)) { var tempUrl = apiUrl; var headerDict = new Dictionary <string, string>(); #region API ENDPOINT if (!string.IsNullOrEmpty(input)) { var tempInputArray = input.Split(','); var inputArray = input.Split(','); int count = 0; foreach (var elem in inputArray) { if (elem.Contains("]") || elem.Contains("[")) { var output = evaluator.EvaluateExpression(elem, entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out bool hasData, functionLog, isDetailsView, isNFSite, developerId).ToString(); node.SetAttributeValue("input", input.Replace(tempInputArray[count], output.Trim('\''))); tempUrl = tempUrl.Replace("{" + count + "}", output.Trim('\'')); } else { tempUrl = tempUrl.Replace("{" + count + "}", elem); } count++; } } node.SetAttributeValue("get-api", tempUrl); #endregion if (!string.IsNullOrEmpty(headers)) { var headersArray = Helper.TrimDelimiters(headers).Split(','); foreach (var header in headersArray) { var separator = header.Split(':'); if (!headerDict.ContainsKey(separator[0].Trim())) { headerDict.Add(separator[0].Trim().Trim('\''), separator[1].Trim().Trim('\'')); } } } var result = ApiHelper.GetResponseFromKScriptAsync(tempUrl, headerDict, cacheEnabled, websiteData?.rootaliasurl?.url?.Value, functionLog, websiteData?._id).GetAwaiter().GetResult(); //TODO: optimize this code if (result != null) { try { if (websiteData["_system"] == null) { websiteData["_system"] = new JObject(); } websiteData["_system"]["kresult"] = result; AliasReference aliasReference = new AliasReference { referenceObject = null, iteration = -1, maxIteration = -1 }; classNameAlias.Add("kresult", aliasReference); classNameAliasdepth.Add(depth, "kresult"); } catch { } try { node.Attributes.Remove("get-api"); node.Attributes.Remove("input"); node.Attributes.Remove("headers"); node.Attributes.Remove("cacheenabled"); } catch { } } } } catch (Exception ex) { } }
/// <summary> /// Process nodes with KDL tag. /// </summary> public override void Process(ref HtmlNode node, HtmlAttribute dynamicAttribute, Dictionary <string, AliasReference> classNameAlias, Dictionary <int, string> classNameAliasdepth, int depth, string websiteId, ExpressionEvaluator evaluator, KEntity entity, dynamic websiteData, Models.Pagination viewDetails, string queryString, Dictionary <string, long> functionLog, bool isDetailsView = false, bool isNFSite = false, string developerId = null) { var kdlValue = dynamicAttribute.Value; string rootUrlString = string.Format("{0}.rootaliasurl.url", entity?.EntityName?.ToLower()); if (kdlValue.IndexOf(rootUrlString) < 0) { kdlValue = String.Format("[[{0}]]{1}{2}", rootUrlString, (kdlValue.StartsWith("/")? "" : "/"), kdlValue); } var attributeValue = HtmlHelper.GetExpressionFromElement(kdlValue, 0); if (attributeValue != null && attributeValue.Any()) { List <string> customVariables = new List <string>(); List <string> objects = null; string dlObjects = ""; string[] baseObj; #region Parse and get all runtime variables foreach (var attr in attributeValue) { baseObj = null; try { objects = KitsuneSyntaxParser.Parser.GetObjects(Helper.TrimDelimiters(attr.Value)); foreach (var obj in objects) { baseObj = Helper.TrimDelimiters(obj).Split('.'); if (baseObj.Length == 1) { var baseClass = entity.Classes.FirstOrDefault(x => x.ClassType == KClassType.BaseClass && x.Name?.ToLower() == baseObj[0].ToLower()); if (baseClass == null) { if (!classNameAlias.ContainsKey(baseObj[0].ToLower())) { customVariables.Add(baseObj[0]); } } } else if ((obj.ToLower().IndexOf("k_obj_ind") > 0 && attr.Value == attributeValue[attributeValue.Count - 1].Value) || classNameAlias.ContainsKey(baseObj[0].ToLower())) { dlObjects = GetdlObject(baseObj); } } } catch { } } #endregion if (customVariables != null && customVariables.Any()) { string value = string.Empty; var dataPath = string.Empty; var custRegex = string.Empty; //Initialize custom variables form the url segments foreach (var customVariable in customVariables) { try { var dynamicVariable = customVariable.Trim(); if (!String.IsNullOrEmpty(dynamicVariable)) { dynamicVariable = customVariable.ToLower(); var splitTemp = kdlValue.ToLower().Split('/'); bool isEncoded = false; for (int i = 0; i < splitTemp.Length; i++) { if (splitTemp[i].Contains(dynamicVariable)) { custRegex = KitsuneCommonUtils.GenerateUrlPatternRegex(splitTemp[i], ""); dataPath = $"urlsegments[{i}]"; if (splitTemp[i].ToLower().Contains("urlencode()")) { isEncoded = true; } //dataPath = $"_system.request.urlsegments[{i}]"; break; } } value = string.Empty; if (!string.IsNullOrEmpty(dataPath)) { var httpRequestObject = websiteData["_system"]["request"]; value = ((string)httpRequestObject.SelectToken(dataPath))?.Trim('/'); if (!String.IsNullOrEmpty(value) && !String.IsNullOrEmpty(custRegex)) { value = new Regex(custRegex).Match(value)?.Groups[1]?.Value; } if (isEncoded) { value = HttpUtility.UrlPathEncode(value).Replace("-", " "); } } AliasReference aliasReference = new AliasReference(); aliasReference.iteration = -1; aliasReference.maxIteration = -1; aliasReference.referenceObject = value; if (!classNameAlias.ContainsKey(dynamicVariable)) { classNameAlias.Add(dynamicVariable, aliasReference); } } } catch { } } } if (dlObjects != "") { string referenceObjectKey; string baseObject = dlObjects.Split('.')[0]; if (classNameAlias.ContainsKey(baseObject)) { referenceObjectKey = classNameAlias[baseObject].referenceObject; } else { referenceObjectKey = dlObjects.Split(new string[] { "[k_obj_ind]" }, StringSplitOptions.None)[0]; } dynamic referenceObject = evaluator.EvaluateExpression(referenceObjectKey, entity, viewDetails, classNameAlias, websiteData, websiteData?._system?.kresult, queryString, out bool hasData, functionLog, isDetailsView, isNFSite, developerId); long objSize = evaluator.GetObjectSize(referenceObject); if (referenceObject.GetType() != typeof(string) && objSize > 0) { //Defaults to first object for nfsite preview. int objIndex = 0; for (int index = 0; index < objSize; index++) { dynamic element = evaluator.GetElementFromArray(referenceObject, index.ToString()); if (element?[queryString]?.Value?.ToString()?.ToLower() == viewDetails.currentpagenumber) { objIndex = index; break; } } //Required for new scenarios where custom objects are not replaced by compiler if (classNameAlias.ContainsKey(baseObject)) { referenceObjectKey += "[" + objIndex + "]"; classNameAlias.Remove(baseObject); classNameAlias.Add(baseObject, new AliasReference { referenceObject = referenceObjectKey, iteration = -1, maxIteration = -1 }); } //For backward compatibility using replacement else { AliasReference k_obj_ind_alias = new AliasReference { referenceObject = null, iteration = objIndex, maxIteration = objIndex }; classNameAlias.Add("k_obj_ind", k_obj_ind_alias); } } } } }