Ejemplo n.º 1
0
        public bool handleBlock(cape.DynamicMap vars, System.Collections.Generic.List <string> tag, System.Collections.Generic.List <object> data, cape.StringBuilder result, System.Collections.Generic.List <cape.File> includeDirs)
        {
            if (tag == null)
            {
                return(false);
            }
            var tagname = cape.Vector.get(tag, 0);

            if (cape.String.isEmpty(tagname))
            {
                return(false);
            }
            if (object.Equals(tagname, "for"))
            {
                var varname = cape.Vector.get(tag, 1);
                var inword  = cape.Vector.get(tag, 2);
                var origvar = substituteVariables(cape.Vector.get(tag, 3), vars);
                if (cape.String.isEmpty(varname) || cape.String.isEmpty(origvar) || !(object.Equals(inword, "in")))
                {
                    cape.Log.error(logContext, "Invalid for tag: `" + cape.String.combine(tag, ' ') + "'");
                    return(false);
                }
                var index = 0;
                vars.set("__for_first", (object)"true");
                var vv = getVariableValueVector(vars, origvar);
                if (vv != null)
                {
                    var n = 0;
                    var m = vv.Count;
                    for (n = 0; n < m; n++)
                    {
                        var o = vv[n];
                        if (o != null)
                        {
                            if (index % 2 == 0)
                            {
                                vars.set("__for_parity", (object)"even");
                            }
                            else
                            {
                                vars.set("__for_parity", (object)"odd");
                            }
                            vars.set(varname, o);
                            if (doExecute(data, vars, result, includeDirs) == false)
                            {
                                return(false);
                            }
                            if (index == 0)
                            {
                                vars.set("__for_first", (object)"false");
                            }
                            index++;
                        }
                    }
                }
                vars.remove("__for_first");
                vars.remove("__for_parity");
                return(true);
            }
            if (object.Equals(tagname, "if"))
            {
                var lvalue = cape.Vector.get(tag, 1);
                if (object.Equals(lvalue, null))
                {
                    return(true);
                }
                var @operator = cape.Vector.get(tag, 2);
                if (object.Equals(@operator, null))
                {
                    var varval = getVariableValue(vars, lvalue);
                    if (varval == null)
                    {
                        return(true);
                    }
                    if (varval is cape.VectorObject <object> )
                    {
                        if (cape.Vector.isEmpty(((cape.VectorObject <object>)varval).toVector()))
                        {
                            return(true);
                        }
                    }
                    if (varval is cape.DynamicMap)
                    {
                        var value = (cape.DynamicMap)varval;
                        if (value.getCount() < 1)
                        {
                            return(true);
                        }
                    }
                    if (varval is string)
                    {
                        if (cape.String.isEmpty((string)varval))
                        {
                            return(true);
                        }
                    }
                    if (varval is cape.StringObject)
                    {
                        if (cape.String.isEmpty(((cape.StringObject)varval).toString()))
                        {
                            return(true);
                        }
                    }
                    if (doExecute(data, vars, result, includeDirs) == false)
                    {
                        return(false);
                    }
                    return(true);
                }
                lvalue = substituteVariables(lvalue, vars);
                var rvalue = cape.Vector.get(tag, 3);
                if (!(object.Equals(rvalue, null)))
                {
                    rvalue = substituteVariables(rvalue, vars);
                }
                if (object.Equals(lvalue, null) || cape.String.isEmpty(@operator) || object.Equals(rvalue, null))
                {
                    cape.Log.error(logContext, "Invalid if tag: `" + cape.String.combine(tag, ' ') + "'");
                    return(false);
                }
                if (object.Equals(@operator, "==") || object.Equals(@operator, "=") || object.Equals(@operator, "is"))
                {
                    if (!(object.Equals(rvalue, lvalue)))
                    {
                        return(true);
                    }
                    if (doExecute(data, vars, result, includeDirs) == false)
                    {
                        return(false);
                    }
                    return(true);
                }
                if (object.Equals(@operator, "!=") || object.Equals(@operator, "not"))
                {
                    if (object.Equals(rvalue, lvalue))
                    {
                        return(true);
                    }
                    if (doExecute(data, vars, result, includeDirs) == false)
                    {
                        return(false);
                    }
                    return(true);
                }
                cape.Log.error(logContext, "Unknown operator `" + @operator + "' in if tag: `" + cape.String.combine(tag, ' ') + "'");
                return(false);
            }
            return(false);
        }