Пример #1
0
 public StringLiteralPart(StringLiteralPartType type, string data, int index)
 {
     Type = type;
     Data = data;
     Index = index;
     Length = data.Length;
 }
Пример #2
0
 public StringLiteralPart(StringLiteralPartType type, string data, int index)
 {
     Type   = type;
     Data   = data;
     Index  = index;
     Length = data.Length;
 }
Пример #3
0
        private string GetModelValue(IModelValueProviderFactory factory, IDictionary<string, object> documentHost, object model, StringLiteralPartType type, string data)
        {
            Type modelType = model != null ? model.GetType() : null;

            object value;
            switch (type)
            {
                case StringLiteralPartType.Encoded:
                    //get the valuetype
                    if (factory.Get(modelType).GetValue(documentHost, model, data, out value))
                    {
                        return System.Net.WebUtility.HtmlEncode(value.ToString());
                    }
                    break;
                case StringLiteralPartType.Raw:
                    if (factory.Get(modelType).GetValue(documentHost, model, data, out value))
                    {
                        return value.ToString();
                    }
                    break;
            }

            //default type is string literal
            return data;
        }
Пример #4
0
        private string GetModelValue(IModelValueProviderFactory factory, object model, StringLiteralPartType type, string data)
        {
            switch (type)
            {
                case StringLiteralPartType.Encoded:
                    return System.Net.WebUtility.HtmlEncode((string)factory.Get(model.GetType()).GetValue(model, Parrot.Infrastructure.ValueType.Property, data));
                case StringLiteralPartType.Raw:
                    return (string)factory.Get(model.GetType()).GetValue(model, Parrot.Infrastructure.ValueType.Property, data);
            }

            //default type is string literal
            return data;
        }
Пример #5
0
        public void StringLiteralParserTests(string delimiter, StringLiteralPartType encoding)
        {
            var parts = new StringLiteral(String.Format("\"this {0}is awesome {0}right\"", delimiter)).Values;

            Assert.AreEqual(4, parts.Count);
            Assert.AreEqual(StringLiteralPartType.Literal, parts[0].Type);
            Assert.AreEqual(encoding, parts[1].Type);
            Assert.AreEqual(StringLiteralPartType.Literal, parts[2].Type);
            Assert.AreEqual(encoding, parts[1].Type);

            Assert.AreEqual("this ", parts[0].Data);
            Assert.AreEqual("is", parts[1].Data);
            Assert.AreEqual(" awesome ", parts[2].Data);
            Assert.AreEqual("right", parts[3].Data);

            parts = new StringLiteral(String.Format("\"this contains a {0} but not a keyword\"", delimiter)).Values;
            Assert.AreEqual(1, parts.Count);
            Assert.AreEqual(StringLiteralPartType.Literal, parts[0].Type);

            parts = new StringLiteral(String.Format("\"{0}keyword_only\"", delimiter)).Values;
            Assert.AreEqual(1, parts.Count);
            Assert.AreEqual(encoding, parts[0].Type);
            Assert.AreEqual("keyword_only", parts[0].Data);

            parts = new StringLiteral(String.Format("\"{0}keyword_first followed by more words\"", delimiter)).Values;
            Assert.AreEqual(2, parts.Count);
            Assert.AreEqual(encoding, parts[0].Type);
            Assert.AreEqual(StringLiteralPartType.Literal, parts[1].Type);

            parts = new StringLiteral(String.Format("\"{0}keyword.with.dot\"", delimiter)).Values;
            Assert.AreEqual(1, parts.Count);
            Assert.AreEqual(encoding, parts[0].Type);
            Assert.AreEqual("keyword.with.dot", parts[0].Data);

            parts = new StringLiteral(String.Format("\"this is an {0}{0} escaped colon\"", delimiter)).Values;
            Assert.AreEqual(1, parts.Count);
            Assert.AreEqual(String.Format("this is an {0} escaped colon", delimiter), parts[0].Data);

            parts = new StringLiteral(String.Format("\"{0}keyword_only_endsin. a dot\"", delimiter)).Values;
            Assert.AreEqual(2, parts.Count);
            Assert.AreEqual(encoding, parts[0].Type);
            Assert.AreEqual(StringLiteralPartType.Literal, parts[1].Type);
            Assert.AreEqual("keyword_only_endsin", parts[0].Data);
            Assert.AreEqual(". a dot", parts[1].Data);
        }
Пример #6
0
            public void StringLiteralParserTests(string delimiter, StringLiteralPartType encoding)
            {
                var parts = new StringLiteral(new MemoryHost(), string.Format("\"this {0}is awesome {0}right\"", delimiter)).Values;

                Assert.AreEqual(4, parts.Count);
                Assert.AreEqual(StringLiteralPartType.Literal, parts[0].Type);
                Assert.AreEqual(encoding, parts[1].Type);
                Assert.AreEqual(StringLiteralPartType.Literal, parts[2].Type);
                Assert.AreEqual(encoding, parts[1].Type);

                Assert.AreEqual("this ", parts[0].Data);
                Assert.AreEqual("is", parts[1].Data);
                Assert.AreEqual(" awesome ", parts[2].Data);
                Assert.AreEqual("right", parts[3].Data);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"this contains a {0} but not a keyword\"", delimiter)).Values;
                Assert.AreEqual(1, parts.Count);
                Assert.AreEqual(StringLiteralPartType.Literal, parts[0].Type);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"{0}keyword_only\"", delimiter)).Values;
                Assert.AreEqual(1, parts.Count);
                Assert.AreEqual(encoding, parts[0].Type);
                Assert.AreEqual("keyword_only", parts[0].Data);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"{0}keyword_first followed by more words\"", delimiter)).Values;
                Assert.AreEqual(2, parts.Count);
                Assert.AreEqual(encoding, parts[0].Type);
                Assert.AreEqual(StringLiteralPartType.Literal, parts[1].Type);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"{0}keyword.with.dot\"", delimiter)).Values;
                Assert.AreEqual(1, parts.Count);
                Assert.AreEqual(encoding, parts[0].Type);
                Assert.AreEqual("keyword.with.dot", parts[0].Data);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"this is an {0}{0} escaped colon\"", delimiter)).Values;
                Assert.AreEqual(1, parts.Count);
                Assert.AreEqual(string.Format("this is an {0} escaped colon", delimiter), parts[0].Data);

                parts = new StringLiteral(new MemoryHost(), string.Format("\"{0}keyword_only_endsin. a dot\"", delimiter)).Values;
                Assert.AreEqual(2, parts.Count);
                Assert.AreEqual(encoding, parts[0].Type);
                Assert.AreEqual(StringLiteralPartType.Literal, parts[1].Type);
                Assert.AreEqual("keyword_only_endsin", parts[0].Data);
                Assert.AreEqual(". a dot", parts[1].Data);
            }
Пример #7
0
        private List <StringLiteralPart> Parse(string source)
        {
            List <StringLiteralPart> parts = new List <StringLiteralPart>(128);

            int tempCounter = 0;

            char[] c = new char[source.Length];

            for (int i = 0; i < source.Length; i++)
            {
                if (source[i] == '@' || source[i] == '=')
                {
                    char comparer = source[i];
                    StringLiteralPartType comparerType = comparer == '@'
                                                             ? StringLiteralPartType.Encoded
                                                             : StringLiteralPartType.Raw;

                    i += 1;
                    //look ahead by 1
                    if (source[Math.Min(source.Length - 1, i)] == comparer)
                    {
                        //it's a single "@" escaped
                        c[tempCounter++] = comparer;
                    }
                    else if (IsIdentifierHead(source[i]))
                    {
                        //build a new word

                        if (tempCounter > 0)
                        {
                            parts.Add(new StringLiteralPart(StringLiteralPartType.Literal, new string(c, 0, tempCounter), i - tempCounter));
                        }

                        tempCounter = 0;

                        var word = new StringBuilder();
                        //check for non-identifier character
                        //read until non-identifier character
                        for (; i < source.Length; i++, tempCounter++)
                        {
                            if (!IsIdTail(source[i]))
                            {
                                break;
                            }

                            word.Append(source[i]);
                        }

                        if (word[word.Length - 1] == '.')
                        {
                            word.Length -= 1;
                            parts.Add(new StringLiteralPart(comparerType, word.ToString(), i - tempCounter));
                            tempCounter      = 0;
                            c[tempCounter++] = '.';
                        }
                        else
                        {
                            parts.Add(new StringLiteralPart(comparerType, word.ToString(), i - tempCounter));
                            tempCounter = 0;
                        }

                        if (i < source.Length)
                        {
                            c[tempCounter++] = source[i];
                        }
                    }
                    else
                    {
                        c[tempCounter++] = comparer;
                        i -= 1;
                    }
                }
                else
                {
                    c[tempCounter++] = source[i];
                }
            }

            if (tempCounter > 0)
            {
                parts.Add(new StringLiteralPart(StringLiteralPartType.Literal, new string(c, 0, tempCounter), source.Length - tempCounter));
            }

            return(parts);
        }
Пример #8
0
        private string GetModelValue(IModelValueProviderFactory factory, object model, StringLiteralPartType type, string data)
        {
            switch (type)
            {
            case StringLiteralPartType.Encoded:
                return(System.Net.WebUtility.HtmlEncode((string)factory.Get(model.GetType()).GetValue(model, Parrot.Infrastructure.ValueType.Property, data)));

            case StringLiteralPartType.Raw:
                return((string)factory.Get(model.GetType()).GetValue(model, Parrot.Infrastructure.ValueType.Property, data));
            }

            //default type is string literal
            return(data);
        }
Пример #9
0
        private string GetModelValue(IModelValueProviderFactory factory, IDictionary <string, object> documentHost, object model, StringLiteralPartType type, string data)
        {
            Type modelType = model != null?model.GetType() : null;

            object value;

            switch (type)
            {
            case StringLiteralPartType.Encoded:
                //get the valuetype
                if (factory.Get(modelType).GetValue(documentHost, model, data, out value))
                {
                    return(System.Net.WebUtility.HtmlEncode(value.ToString()));
                }
                break;

            case StringLiteralPartType.Raw:
                if (factory.Get(modelType).GetValue(documentHost, model, data, out value))
                {
                    return(value.ToString());
                }
                break;
            }

            //default type is string literal
            return(data);
        }