Esempio n. 1
0
        public Tokenizer(string input)
        {
            input  = Preprocess(input);
            reader = new SimpleStringReader(input);

            while (HasInput())
            {
                if (DiscardWhiteSpace())
                {
                    continue;
                }

                if (IsCurrentStringStart())
                {
                    ReadString();
                }
                else if (IsCurrentSingleCharSymbol())
                {
                    ReadSingleChar();
                }
                else
                {
                    ReadAtom();
                }
            }
        }
            private static IEnumerable <Token> GetTokens(string text)
            {
                var rdr = new SimpleStringReader(text);

                rdr.SkipWhiteSpace();

                while (!rdr.Eof)
                {
                    var ch = rdr.Peek();
                    if (ch == '-' || ch == '+' || ch == '.' || char.IsDigit(ch))
                    {
                        var p = rdr.Position;
                        rdr.Consume();
                        while (char.IsDigit(rdr.Peek()))
                        {
                            rdr.Consume();
                        }
                        if (ch != '.' && rdr.Peek() == '.')
                        {
                            rdr.Consume();
                            while (char.IsDigit(rdr.Peek()))
                            {
                                rdr.Consume();
                            }
                        }

                        ch = rdr.Peek();
                        if (ch == 'e' || ch == 'E')
                        {
                            rdr.Consume();
                            ch = rdr.Peek();
                            if (ch == '-' || ch == '+')
                            {
                                rdr.Consume();
                            }
                            while (char.IsDigit(rdr.Peek()))
                            {
                                rdr.Consume();
                            }
                        }

                        yield return(new Token(TokenType.Number, rdr.GetString(p)));
                    }
                    else if (ch == ',')
                    {
                        rdr.Consume();
                    }
                    else /*if (char.IsLetter(ch))*/
                    {
                        var p = rdr.Position;
                        rdr.Consume();
                        yield return(new Token(TokenType.String, rdr.GetString(p)));
                    }

                    /*else
                     * rdr.Consume();*/

                    rdr.SkipWhiteSpace();
                }
            }
Esempio n. 3
0
        private static char GetUnicode(SimpleStringReader sr, int maxDigits)
        {
            int code = 0;

            for (int cnt = 0; cnt < maxDigits; cnt++)
            {
                var digitCode = sr.Peek();
                if (digitCode >= (int)'0' && digitCode <= (int)'9')
                {
                    digitCode = digitCode - (int)'0';
                }
                else if (digitCode >= (int)'a' && digitCode <= (int)'f')
                {
                    digitCode = digitCode - (int)'a' + 10;
                }
                else if (digitCode >= (int)'A' && digitCode <= (int)'F')
                {
                    digitCode = digitCode - (int)'A' + 10;
                }
                else
                {
                    break;
                }

                sr.Read();
                code = code * 16 + digitCode;
            }

            return((char)code);
        }
Esempio n. 4
0
        private static string ParseParameterValue(SimpleStringReader sr)
        {
            int ch;

            var nameBuf = new StringBuilder();

            while ((ch = sr.Peek()) != -1)
            {
                if (ch == ':' || ch == '}')
                {
                    break;
                }

                if (ch == '\\')
                {
                    // skip the backslash
                    sr.Read();

                    // append next character
                    nameBuf.Append((char)sr.Read());
                    continue;
                }

                nameBuf.Append((char)ch);
                sr.Read();
            }

            return(nameBuf.ToString());
        }
Esempio n. 5
0
        /// <summary>
        /// Parses the specified condition string and turns it into
        /// <see cref="ConditionExpression"/> tree.
        /// </summary>
        /// <param name="stringReader">The string reader.</param>
        /// <param name="configurationItemFactories">Instance of <see cref="ConfigurationItemFactory"/> used to resolve references to condition methods and layout renderers.</param>
        /// <returns>
        /// The root of the expression syntax tree which can be used to get the value of the condition in a specified context.
        /// </returns>
        internal static ConditionExpression ParseExpression(SimpleStringReader stringReader, ConfigurationItemFactory configurationItemFactories)
        {
            var parser = new ConditionParser(stringReader, configurationItemFactories);
            ConditionExpression expression = parser.ParseExpression();

            return(expression);
        }
Esempio n. 6
0
        /// <summary>
        /// https://github.com/NLog/NLog/issues/3194
        /// </summary>
        public void DebugView_CurrentState(string input, int position, string expectedDone, char expectedCurrent, string expectedTodo)
        {
            var reader = new SimpleStringReader(input);

            reader.Position = position;
            Assert.Equal(
                SimpleStringReader.BuildCurrentState(expectedDone, expectedCurrent, expectedTodo),
                reader.CurrentState);
        }
 public static void Read(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor)
 {
     try
     {
         new JavascriptMemberExpressionReader(reader, visitor).ReadMemberName();
     }
     catch (Exception error)
     {
         throw Errors.FailedToReadJavascriptMemberExpression(error.Message);
     }
 }
 public static void Read(SimpleStringReader reader, IRangeSubstitutionVisitor visitor)
 {
     try
     {
         new RangeSubstitutionReader(reader, visitor).Read();
     }
     catch (Exception error)
     {
         throw Errors.FailedToReadSubstituion(error.Message);
     }
 }
 public static void Read(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor)
 {
     try
     {
         new JavascriptMemberExpressionReader(reader, visitor).ReadMemberName();
     }
     catch (Exception error)
     {
         throw Errors.FailedToReadJavascriptMemberExpression(error.Message);
     }
 }
 public static void Read(SimpleStringReader reader, IRangeSubstitutionVisitor visitor)
 {
     try
     {
         new RangeSubstitutionReader(reader, visitor).Read();
     }
     catch (Exception error)
     {
         throw Errors.FailedToReadSubstituion(error.Message);
     }
 }
Esempio n. 11
0
        private static string ParseParameterName(SimpleStringReader sr)
        {
            int ch;
            int nestLevel = 0;

            var nameBuf = new StringBuilder();

            while ((ch = sr.Peek()) != -1)
            {
                if ((ch == '=' || ch == '}' || ch == ':') && nestLevel == 0)
                {
                    break;
                }

                if (ch == '$')
                {
                    sr.Read();
                    nameBuf.Append('$');
                    if (sr.Peek() == '{')
                    {
                        nameBuf.Append('{');
                        nestLevel++;
                        sr.Read();
                    }

                    continue;
                }

                if (ch == '}')
                {
                    nestLevel--;
                }

                if (ch == '\\')
                {
                    sr.Read();

                    // issue#3193
                    if (nestLevel != 0)
                    {
                        nameBuf.Append((char)ch);
                    }
                    // append next character
                    nameBuf.Append((char)sr.Read());
                    continue;
                }

                nameBuf.Append((char)ch);
                sr.Read();
            }

            return(nameBuf.ToString());
        }
        private static string ParseParameterValue(SimpleStringReader sr)
        {
            var simpleValue = sr.ReadUntilMatch(ch => EndOfLayout(ch) || ch == '\\');

            if (sr.Peek() == '\\')
            {
                var nameBuf = new StringBuilder();
                nameBuf.Append(simpleValue);
                ParseParameterUnicodeValue(sr, nameBuf);
                return(nameBuf.ToString());
            }

            return(simpleValue);
        }
Esempio n. 13
0
        private static string ParseLayoutRendererName(SimpleStringReader sr)
        {
            int ch;

            var nameBuf = new StringBuilder();

            while ((ch = sr.Peek()) != -1)
            {
                if (ch == ':' || ch == '}')
                {
                    break;
                }

                nameBuf.Append((char)ch);
                sr.Read();
            }

            return(nameBuf.ToString());
        }
Esempio n. 14
0
        /// <summary>
        /// Parse a string containing an HEX representation to a byte-array
        /// </summary>
        /// <param name="source">The source string containing HEX characters.</param>
        /// <returns>The resulting byte-array</returns>
        /// <remarks>
        ///     <para>The conversion does not care about character casing.</para>
        ///     <para>Any character off the HEX-set is treated as separator.</para>
        ///     <para>The HEX-chars can be even without any separator (i.e. packed),
        ///     however the conversion consider character pairs.</para>
        /// </remarks>
        /// <example>Sample behavior of the conversion:
        ///     <code>
        ///     byte[] b = ByteArrayHelpers.FromHex("0 zz@ q1 23 04 567 8! 9 abcdef");
        ///
        ///     for (int i = 0; i &lt; b.Length; i++)
        ///     {
        ///         Console.Write(b[i].ToString() + " ");
        ///     }
        ///     Console.WriteLine();
        ///
        ///     </code>
        ///     Yields the result:
        ///     <code>
        ///     0 1 35 4 86 7 8 9 171 205 239
        ///     </code>
        /// </example>
        /// <seealso cref="ToHex"/>
        public static byte[] FromHex(string source)
        {
            if (_tblfromhex == null)
            {
                InitFromHexConverter();
            }

            //create a string reader to consume input chars
            var reader = new SimpleStringReader(source);

            //create a writer to accumulate the resulting bytes
            var writer = new ByteArrayWriter();

            //consume characters until the end of string
            int nibble = 0;
            int digit  = 0;
            int code;

            while ((code = reader.GetNext()) >= 0)
            {
                if (code > 0)
                {
                    digit = (digit << 8) | (code - 1);
                    nibble++;
                }
                else if (nibble > 0)
                {
                    nibble = 2;
                }

                if (nibble == 2)
                {
                    writer.WriteByte((byte)digit);
                    digit  = 0;
                    nibble = 0;
                }
            }

            return(writer.ToByteArray());
        }
 private JavascriptMemberExpressionReader(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor)
 {
     this.reader = reader;
     this.visitor = visitor;
 }
 private RangeSubstitutionReader(SimpleStringReader reader, IRangeSubstitutionVisitor visitor)
 {
     this.reader  = reader;
     this.visitor = visitor;
 }
Esempio n. 17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConditionTokenizer"/> class.
 /// </summary>
 /// <param name="stringReader">The string reader.</param>
 public ConditionTokenizer(SimpleStringReader stringReader)
 {
     this.stringReader = stringReader;
     this.TokenType    = ConditionTokenType.BeginningOfInput;
     this.GetNextToken();
 }
Esempio n. 18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConditionParser"/> class.
 /// </summary>
 /// <param name="stringReader">The string reader.</param>
 /// <param name="configurationItemFactory">Instance of <see cref="ConfigurationItemFactory"/> used to resolve references to condition methods and layout renderers.</param>
 private ConditionParser(SimpleStringReader stringReader, ConfigurationItemFactory configurationItemFactory)
 {
     _configurationItemFactory = configurationItemFactory;
     _tokenizer = new ConditionTokenizer(stringReader);
 }
Esempio n. 19
0
        internal static LayoutRenderer[] CompileLayout(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr, bool isNested, out string text)
        {
            var result     = new List <LayoutRenderer>();
            var literalBuf = new StringBuilder();

            int ch;

            var p0 = sr.Position;

            while ((ch = sr.Peek()) != -1)
            {
                if (isNested && (ch == '}' || ch == ':'))
                {
                    break;
                }

                sr.Read();

                if (ch == '$' && sr.Peek() == '{')
                {
                    if (literalBuf.Length > 0)
                    {
                        result.Add(new LiteralLayoutRenderer(literalBuf.ToString()));
                        literalBuf.Length = 0;
                    }

                    var newLayoutRenderer = ParseLayoutRenderer(configurationItemFactory, sr);
                    if (CanBeConvertedToLiteral(newLayoutRenderer))
                    {
                        newLayoutRenderer = ConvertToLiteral(newLayoutRenderer);
                    }

                    // layout renderer
                    result.Add(newLayoutRenderer);
                }
                else
                {
                    literalBuf.Append((char)ch);
                }
            }

            if (literalBuf.Length > 0)
            {
                result.Add(new LiteralLayoutRenderer(literalBuf.ToString()));
                literalBuf.Length = 0;
            }

            var p1 = sr.Position;

            MergeLiterals(result);
            text = sr.Substring(p0, p1);

            return(result.ToArray());
        }
        private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader stringReader, bool?throwConfigExceptions)
        {
            int ch = stringReader.Read();

            Debug.Assert(ch == '{', "'{' expected in layout specification");

            string name           = ParseLayoutRendererName(stringReader);
            var    layoutRenderer = GetLayoutRenderer(configurationItemFactory, name, throwConfigExceptions);

            Dictionary <Type, LayoutRenderer> wrappers        = null;
            List <LayoutRenderer>             orderedWrappers = null;

            ch = stringReader.Read();
            while (ch != -1 && ch != '}')
            {
                string parameterName = ParseParameterName(stringReader).Trim();
                if (stringReader.Peek() == '=')
                {
                    stringReader.Read(); // skip the '='
                    PropertyInfo   propertyInfo;
                    LayoutRenderer parameterTarget = layoutRenderer;

                    if (!PropertyHelper.TryGetPropertyInfo(layoutRenderer, parameterName, out propertyInfo))
                    {
                        if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out var wrapperType))
                        {
                            wrappers        = wrappers ?? new Dictionary <Type, LayoutRenderer>();
                            orderedWrappers = orderedWrappers ?? new List <LayoutRenderer>();
                            if (!wrappers.TryGetValue(wrapperType, out var wrapperRenderer))
                            {
                                wrapperRenderer       = configurationItemFactory.AmbientProperties.CreateInstance(parameterName);
                                wrappers[wrapperType] = wrapperRenderer;
                                orderedWrappers.Add(wrapperRenderer);
                            }

                            if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out propertyInfo))
                            {
                                propertyInfo = null;
                            }
                            else
                            {
                                parameterTarget = wrapperRenderer;
                            }
                        }
                    }

                    if (propertyInfo == null)
                    {
                        var value = ParseParameterValue(stringReader);
                        if (!string.IsNullOrEmpty(parameterName) || !StringHelpers.IsNullOrWhiteSpace(value))
                        {
                            // TODO NLog 5.0 Should throw exception when invalid configuration (Check throwConfigExceptions)
                            InternalLogger.Warn("Skipping unrecognized property '{0}={1}` for ${{{2}}} ({3})", parameterName, value, name, layoutRenderer?.GetType());
                        }
                    }
                    else
                    {
                        if (typeof(Layout).IsAssignableFrom(propertyInfo.PropertyType))
                        {
                            LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, stringReader, throwConfigExceptions, true, out var txt);

                            var nestedLayout = new SimpleLayout(renderers, txt, configurationItemFactory);
                            propertyInfo.SetValue(parameterTarget, nestedLayout, null);
                        }
                        else if (typeof(ConditionExpression).IsAssignableFrom(propertyInfo.PropertyType))
                        {
                            var conditionExpression = ConditionParser.ParseExpression(stringReader, configurationItemFactory);
                            propertyInfo.SetValue(parameterTarget, conditionExpression, null);
                        }
                        else
                        {
                            string value = ParseParameterValue(stringReader);
                            PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory);
                        }
                    }
                }
                else
                {
                    SetDefaultPropertyValue(configurationItemFactory, layoutRenderer, parameterName);
                }

                ch = stringReader.Read();
            }

            if (orderedWrappers != null)
            {
                layoutRenderer = ApplyWrappers(configurationItemFactory, layoutRenderer, orderedWrappers);
            }

            return(layoutRenderer);
        }
Esempio n. 21
0
        private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr)
        {
            int ch = sr.Read();

            Debug.Assert(ch == '{', "'{' expected in layout specification");

            string         name = ParseLayoutRendererName(sr);
            LayoutRenderer lr;

            try
            {
                lr = configurationItemFactory.LayoutRenderers.CreateInstance(name);
            }
            catch (Exception ex)
            {
                if (LogManager.ThrowConfigExceptions ?? LogManager.ThrowExceptions)
                {
                    throw;
                }
                InternalLogger.Error(ex, "Error parsing layout {0} will be ignored.", name);
                //replace with emptys
                lr = new LiteralLayoutRenderer(string.Empty);
            }

            var wrappers        = new Dictionary <Type, LayoutRenderer>();
            var orderedWrappers = new List <LayoutRenderer>();

            ch = sr.Read();
            while (ch != -1 && ch != '}')
            {
                string parameterName = ParseParameterName(sr).Trim();
                if (sr.Peek() == '=')
                {
                    sr.Read(); // skip the '='
                    PropertyInfo   pi;
                    LayoutRenderer parameterTarget = lr;

                    if (!PropertyHelper.TryGetPropertyInfo(lr, parameterName, out pi))
                    {
                        Type wrapperType;

                        if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out wrapperType))
                        {
                            LayoutRenderer wrapperRenderer;

                            if (!wrappers.TryGetValue(wrapperType, out wrapperRenderer))
                            {
                                wrapperRenderer       = configurationItemFactory.AmbientProperties.CreateInstance(parameterName);
                                wrappers[wrapperType] = wrapperRenderer;
                                orderedWrappers.Add(wrapperRenderer);
                            }

                            if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out pi))
                            {
                                pi = null;
                            }
                            else
                            {
                                parameterTarget = wrapperRenderer;
                            }
                        }
                    }

                    if (pi == null)
                    {
                        ParseParameterValue(sr);
                    }
                    else
                    {
                        if (typeof(Layout).IsAssignableFrom(pi.PropertyType))
                        {
                            var              nestedLayout = new SimpleLayout();
                            string           txt;
                            LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, sr, true, out txt);

                            nestedLayout.SetRenderers(renderers, txt);
                            pi.SetValue(parameterTarget, nestedLayout, null);
                        }
                        else if (typeof(ConditionExpression).IsAssignableFrom(pi.PropertyType))
                        {
                            var conditionExpression = ConditionParser.ParseExpression(sr, configurationItemFactory);
                            pi.SetValue(parameterTarget, conditionExpression, null);
                        }
                        else
                        {
                            string value = ParseParameterValue(sr);
                            PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory);
                        }
                    }
                }
                else
                {
                    // what we've just read is not a parameterName, but a value
                    // assign it to a default property (denoted by empty string)
                    PropertyInfo pi;

                    if (PropertyHelper.TryGetPropertyInfo(lr, string.Empty, out pi))
                    {
                        if (typeof(SimpleLayout) == pi.PropertyType)
                        {
                            pi.SetValue(lr, new SimpleLayout(parameterName), null);
                        }
                        else
                        {
                            string value = parameterName;
                            PropertyHelper.SetPropertyFromString(lr, pi.Name, value, configurationItemFactory);
                        }
                    }
                    else
                    {
                        InternalLogger.Warn("{0} has no default property", lr.GetType().FullName);
                    }
                }

                ch = sr.Read();
            }

            lr = ApplyWrappers(configurationItemFactory, lr, orderedWrappers);

            return(lr);
        }
Esempio n. 22
0
        private static string ParseParameterValue(SimpleStringReader sr)
        {
            int ch;

            var nameBuf = new StringBuilder();

            while ((ch = sr.Peek()) != -1)
            {
                if (ch == ':' || ch == '}')
                {
                    break;
                }

                // Code in this condition was replaced
                // to support escape codes e.g. '\r' '\n' '\u003a',
                // which can not be used directly as they are used as tokens by the parser
                // All escape codes listed in the following link were included
                // in addition to "\{", "\}", "\:" which are NLog specific:
                // https://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-character-escape-sequences-are-available.aspx
                if (ch == '\\')
                {
                    // skip the backslash
                    sr.Read();

                    var nextChar = (char)sr.Peek();

                    switch (nextChar)
                    {
                    case ':':
                    case '{':
                    case '}':
                    case '\'':
                    case '"':
                    case '\\':
                        sr.Read();
                        nameBuf.Append(nextChar);
                        break;

                    case '0':
                        sr.Read();
                        nameBuf.Append('\0');
                        break;

                    case 'a':
                        sr.Read();
                        nameBuf.Append('\a');
                        break;

                    case 'b':
                        sr.Read();
                        nameBuf.Append('\b');
                        break;

                    case 'f':
                        sr.Read();
                        nameBuf.Append('\f');
                        break;

                    case 'n':
                        sr.Read();
                        nameBuf.Append('\n');
                        break;

                    case 'r':
                        sr.Read();
                        nameBuf.Append('\r');
                        break;

                    case 't':
                        sr.Read();
                        nameBuf.Append('\t');
                        break;

                    case 'u':
                        sr.Read();
                        var uChar = GetUnicode(sr, 4);     // 4 digits
                        nameBuf.Append(uChar);
                        break;

                    case 'U':
                        sr.Read();
                        var UChar = GetUnicode(sr, 8);     // 8 digits
                        nameBuf.Append(UChar);
                        break;

                    case 'x':
                        sr.Read();
                        var xChar = GetUnicode(sr, 4);     // 1-4 digits
                        nameBuf.Append(xChar);
                        break;

                    case 'v':
                        sr.Read();
                        nameBuf.Append('\v');
                        break;
                    }

                    continue;
                }

                nameBuf.Append((char)ch);
                sr.Read();
            }

            return(nameBuf.ToString());
        }
Esempio n. 23
0
        private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader stringReader, bool?throwConfigExceptions)
        {
            int ch = stringReader.Read();

            Debug.Assert(ch == '{', "'{' expected in layout specification");

            string name           = ParseLayoutRendererName(stringReader);
            var    layoutRenderer = GetLayoutRenderer(configurationItemFactory, name, throwConfigExceptions);

            var wrappers        = new Dictionary <Type, LayoutRenderer>();
            var orderedWrappers = new List <LayoutRenderer>();

            ch = stringReader.Read();
            while (ch != -1 && ch != '}')
            {
                string parameterName = ParseParameterName(stringReader).Trim();
                if (stringReader.Peek() == '=')
                {
                    stringReader.Read(); // skip the '='
                    PropertyInfo   propertyInfo;
                    LayoutRenderer parameterTarget = layoutRenderer;

                    if (!PropertyHelper.TryGetPropertyInfo(layoutRenderer, parameterName, out propertyInfo))
                    {
                        Type wrapperType;

                        if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out wrapperType))
                        {
                            LayoutRenderer wrapperRenderer;

                            if (!wrappers.TryGetValue(wrapperType, out wrapperRenderer))
                            {
                                wrapperRenderer       = configurationItemFactory.AmbientProperties.CreateInstance(parameterName);
                                wrappers[wrapperType] = wrapperRenderer;
                                orderedWrappers.Add(wrapperRenderer);
                            }

                            if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out propertyInfo))
                            {
                                propertyInfo = null;
                            }
                            else
                            {
                                parameterTarget = wrapperRenderer;
                            }
                        }
                    }

                    if (propertyInfo == null)
                    {
                        ParseParameterValue(stringReader);
                    }
                    else
                    {
                        if (typeof(Layout).IsAssignableFrom(propertyInfo.PropertyType))
                        {
                            var              nestedLayout = new SimpleLayout();
                            string           txt;
                            LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, stringReader, throwConfigExceptions, true, out txt);

                            nestedLayout.SetRenderers(renderers, txt);
                            propertyInfo.SetValue(parameterTarget, nestedLayout, null);
                        }
                        else if (typeof(ConditionExpression).IsAssignableFrom(propertyInfo.PropertyType))
                        {
                            var conditionExpression = ConditionParser.ParseExpression(stringReader, configurationItemFactory);
                            propertyInfo.SetValue(parameterTarget, conditionExpression, null);
                        }
                        else
                        {
                            string value = ParseParameterValue(stringReader);
                            PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory);
                        }
                    }
                }
                else
                {
                    SetDefaultPropertyValue(configurationItemFactory, layoutRenderer, parameterName);
                }

                ch = stringReader.Read();
            }

            layoutRenderer = ApplyWrappers(configurationItemFactory, layoutRenderer, orderedWrappers);

            return(layoutRenderer);
        }
 private static string ParseLayoutRendererName(SimpleStringReader sr)
 {
     return(sr.ReadUntilMatch(ch => EndOfLayout(ch)));
 }
 private JavascriptMemberExpressionReader(SimpleStringReader reader, IJavascriptMemberExpressionVisitor visitor)
 {
     this.reader  = reader;
     this.visitor = visitor;
 }
Esempio n. 26
0
        internal static LayoutRenderer[] CompileLayout(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr, bool?throwConfigExceptions, bool isNested, out string text)
        {
            var result     = new List <LayoutRenderer>();
            var literalBuf = new StringBuilder();

            int ch;

            int p0 = sr.Position;

            while ((ch = sr.Peek()) != -1)
            {
                if (isNested)
                {
                    //possible escape char `\`
                    if (ch == '\\')
                    {
                        sr.Read();
                        var nextChar = sr.Peek();

                        //escape chars
                        if (EndOfLayout(nextChar))
                        {
                            //read next char and append
                            sr.Read();
                            literalBuf.Append((char)nextChar);
                        }
                        else
                        {
                            //don't treat \ as escape char and just read it
                            literalBuf.Append('\\');
                        }
                        continue;
                    }

                    if (EndOfLayout(ch))
                    {
                        //end of innerlayout.
                        // `}` is when double nested inner layout.
                        // `:` when single nested layout
                        break;
                    }
                }

                sr.Read();

                //detect `${` (new layout-renderer)
                if (ch == '$' && sr.Peek() == '{')
                {
                    //stash already found layout-renderer.
                    AddLiteral(literalBuf, result);

                    LayoutRenderer newLayoutRenderer = ParseLayoutRenderer(configurationItemFactory, sr, throwConfigExceptions);
                    if (CanBeConvertedToLiteral(newLayoutRenderer))
                    {
                        newLayoutRenderer = ConvertToLiteral(newLayoutRenderer);
                    }

                    // layout renderer
                    result.Add(newLayoutRenderer);
                }
                else
                {
                    literalBuf.Append((char)ch);
                }
            }

            AddLiteral(literalBuf, result);

            int p1 = sr.Position;

            MergeLiterals(result);
            text = sr.Substring(p0, p1);

            return(result.ToArray());
        }
 private RangeSubstitutionReader(SimpleStringReader reader, IRangeSubstitutionVisitor visitor)
 {
     this.reader = reader;
     this.visitor = visitor;
 }