示例#1
0
 private static void BuildQuery(NameValueCollection nv, PipeValue obj, string prefix)
 {
     if (prefix != null && obj.IsArray)
     {
         PipeValuePropertyEnumerator enumerator = obj.GetEnumerator();
         while (enumerator.MoveNext())
         {
             if (Regex.IsMatch(prefix, @"\[\]$"))
             {
                 nv.Add(prefix, enumerator.CurrentValue.ToString());
             }
             else
             {
                 BuildQuery(nv, enumerator.CurrentValue, prefix + "[" + (enumerator.CurrentValue.Type == PipeValueType.Object && (bool)enumerator.CurrentValue ? enumerator.CurrentKey : "") + "]");
             }
         }
     }
     else if (obj.Type == PipeValueType.Object)
     {
         PipeValuePropertyEnumerator enumerator = obj.GetEnumerator();
         while (enumerator.MoveNext())
         {
             BuildQuery(nv, enumerator.CurrentValue, prefix != null ? prefix + "[" + enumerator.CurrentKey + "]" : enumerator.CurrentKey);
         }
     }
     else
     {
         nv.Add(prefix, obj.ToString());
     }
 }
示例#2
0
        public static PipeValue FormatPrintf(PipeValue value, PipeValue format)
        {
            StringBuilder sb = new StringBuilder();

            switch (value.Type)
            {
            case PipeValueType.String:
                sb.EnsureCapacity(((string)value).Length);
                _snwprintf_s(sb, (IntPtr)sb.MaxCapacity, (IntPtr)32, format.ToString(), (string)value);
                break;

            case PipeValueType.Number:
                sb.EnsureCapacity(100);
                _snwprintf_s(sb, (IntPtr)100, (IntPtr)32, format.ToString(), (double)value);
                break;

            default:
                sb.EnsureCapacity(100);
                _snwprintf_s(sb, (IntPtr)100, (IntPtr)32, format.ToString(), value.ToString());
                break;
            }
            return(sb.ToString());
        }
示例#3
0
        public static PipeValue FormatDate(PipeValue timestamp, PipeValue format)
        {
            DateTime d;

            if (timestamp.Type == PipeValueType.String)
            {
                DateTime.TryParse(timestamp.ToString(), out d);
            }
            else
            {
                d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(timestamp.ToDouble());
            }
            return(d.ToLocalTime().ToString((string)format));
        }
        private object Evaluate()
        {
            StringBuilder sb = new StringBuilder();

            try {
                int i = 0;
                int e = tokens.Count;
                while (i < e)
                {
                    Token t = tokens[i++];
                    switch (t.Type)
                    {
                    case TokenType.OP_EVAL:
                        EvaluateToken et        = (EvaluateToken)t;
                        int           prevCount = evalCount;
                        PipeValue     result    = et.Expression.Evaluate(this);
                        if (result.IsEvallable)
                        {
                            string str = result.Type == PipeValueType.Object ? JsonConvert.SerializeObject(result) : result.ToString();
                            if (evalCount != prevCount || et.SuppressHtmlEncode)
                            {
                                sb.Append(str);
                            }
                            else
                            {
                                sb.Append(HttpUtility.HtmlEncode(str));
                            }
                        }
                        break;

                    case TokenType.OP_ITER:
                        IterationToken it       = (IterationToken)t;
                        IEnumerator    iterable = it.Expression.Evaluate(this).GetEnumerator();
                        PushObjectStack(iterable);
                        if (!iterable.MoveNext())
                        {
                            i = it.Index;
                        }
                        break;

                    case TokenType.OP_ITER_END:
                        IterationEndToken iet = (IterationEndToken)t;
                        if (!((IEnumerator)objStack.Peek().Value).MoveNext())
                        {
                            PopObjectStack();
                        }
                        else
                        {
                            i = iet.Index;
                        }
                        break;

                    case TokenType.OP_TEST:
                        ConditionToken ct = (ConditionToken)t;
                        if (!(bool)ct.Expression.Evaluate(this) ^ ct.Negate)
                        {
                            i = ct.Index;
                        }
                        break;

                    case TokenType.OP_JUMP:
                        i = ((BranchToken)t).Index;
                        break;

                    default:
                        OutputToken ot = (OutputToken)t;
                        if (this.Options.OutputXml)
                        {
                            XmlElement      currentElm = xmlStack.Peek();
                            HtmlOutputToken ht         = (HtmlOutputToken)ot;
                            switch (t.Type)
                            {
                            case TokenType.HTMLOP_ELEMENT_START:
                                FlushOutput(sb, currentElm);
                                xmlStack.Push(currentElm.OwnerDocument.CreateElement(ht.TagName));
                                currentElm.AppendChild(xmlStack.Peek());
                                break;

                            case TokenType.HTMLOP_ELEMENT_END:
                                FlushOutput(sb, currentElm);
                                xmlStack.Pop();
                                break;

                            case TokenType.HTMLOP_ATTR_END:
                                XmlAttribute attr = currentElm.OwnerDocument.CreateAttribute(ht.AttributeName);
                                attr.Value = sb.ToString();
                                currentElm.Attributes.Append(attr);
                                sb.Clear();
                                break;

                            case TokenType.HTMLOP_TEXT:
                                sb.Append(ht.Text);
                                break;
                            }
                        }
                        else
                        {
                            sb.Append(ot.Value);
                            i = ot.Index;
                        }
                        break;
                    }
                }
            } finally {
                evalCount = (evalCount + 1) & 0xFFFF;
            }
            if (this.Options.OutputXml)
            {
                FlushOutput(sb, xmlStack.Peek());
                return(xmlStack.Peek());
            }
            return(Regex.Replace(sb.ToString(), @"^\s+(?=<)|(>)\s+(<|$)", m => m.Groups[1].Value + m.Groups[2].Value));
        }