Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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);
                }
            }
        }
Beispiel #3
0
        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) {
            }
        }
Beispiel #5
0
        /// <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);
                        }
                    }
                }
            }
        }