示例#1
0
        public void Parse(string data, ref TemplateElementContainer parent)
        {
            var newMemberReference = new MemberReference(parent)
            {
                Member = data
            };

            parent.Children.Add(newMemberReference);
        }
        private void ParseTagData(string tagData, ref TemplateElementContainer parent)
        {
            if (tagData.StartsWith("#"))
            {
                var memberReference = new MemberReference(parent)
                {
                    Member = tagData.Substring(1)
                };
                parent.Children.Add(memberReference);
                return;
            }
            else if (tagData.StartsWith("//"))
            {
                // Ignore comment
                return;
            }

            var keyword = GetKeyWord(tagData);

            switch (keyword)
            {
            case KeyWords.Break:
                new BreakParser().Parse(tagData, ref parent);
                break;

            case KeyWords.Input:
                new InputParser().Parse(tagData, ref parent);
                break;

            case KeyWords.Name:
                new NameParser().Parse(tagData, ref parent);
                break;

            case KeyWords.ForEach:
                new ForEachParser().Parse(tagData, ref parent);
                break;

            case KeyWords.Call:
                new CallParser().Parse(tagData, ref parent);
                break;

            case KeyWords.End:
                new EndParser().Parse(tagData, ref parent);
                break;

            case KeyWords.If:
            case KeyWords.Else:

            case KeyWords.Case:
            case KeyWords.When:
            case KeyWords.Default:
                break;

            default:
                throw new InvalidOperationException($"Keyword: {keyword} not implemented.");
            }
        }
        private void ParseData(string templateData, TemplateElementContainer template)
        {
            const string tagStart = "<@";
            const string tagEnd   = "@>";

            var index  = 0;
            var parent = template;

            while (index < templateData.Length)
            {
                var s = templateData.IndexOf(tagStart, index);
                var e = s;

                if (s < 0)
                {
                    var literal = new LiteralText(parent)
                    {
                        Text = templateData.Substring(index).Trim('\n', '\r')
                    };
                    if (!string.IsNullOrWhiteSpace(literal.Text))
                    {
                        parent.Children.Add(literal);
                    }
                    index = templateData.Length;
                    continue;
                }

                if (s >= 0 && s > index)
                {
                    var literal = new LiteralText(parent)
                    {
                        Text = templateData.Substring(index, s - index).Trim('\n', '\r')
                    };

                    if (!string.IsNullOrWhiteSpace(literal.Text))
                    {
                        parent.Children.Add(literal);
                    }
                }

                e = templateData.IndexOf(tagEnd, s);
                if (e == -1)
                {
                    throw new InvalidOperationException($"Missing end {tagEnd}");
                }

                var tagData = templateData.Substring(s + tagStart.Length, e - s - tagStart.Length).Trim();
                ParseTagData(tagData, ref parent);

                index = e + tagEnd.Length;
            }
        }
        public void Parse(string data, ref TemplateElementContainer parent)
        {
            var regex = @"name\s(?<name>.*)";

            var match = Regex.Match(data, regex);

            if (!match.Success)
            {
                throw new InvalidOperationException($"Unable to parse name epxression: {data}");
            }

            var newName = new NameElement(parent)
            {
                Name = match.Groups["name"].Value,
            };

            parent.Children.Add(newName);
        }
        public void Parse(string data, ref TemplateElementContainer parent)
        {
            var regex = @"call\(\s*(?<property>.*)\s*\)";

            var match = Regex.Match(data, regex);

            if (!match.Success)
            {
                throw new InvalidOperationException($"Unable to parse call epxression: {data}");
            }

            var newCall = new CallElement(parent)
            {
                TypeReference = match.Groups["property"].Value
            };

            parent.Children.Add(newCall);
        }
        public void Parse(string data, ref TemplateElementContainer parent)
        {
            var regex = @"input\s(?<type>.*)\sas\s(?<alias>.*)";

            var match = Regex.Match(data, regex);

            if (!match.Success)
            {
                throw new InvalidOperationException($"Unable to parse input epxression: {data}");
            }

            var newInput = new InputElement(parent)
            {
                Type  = match.Groups["type"].Value,
                Alias = match.Groups["alias"].Value
            };

            parent.Children.Add(newInput);
        }
        public void Parse(string data, ref TemplateElementContainer parent)
        {
            var regex = @"foreach\(\s*(?<identifier>.*)\s+in\s+(?<source>.*)\s*\)";

            var match = Regex.Match(data, regex);

            if (!match.Success)
            {
                throw new InvalidOperationException($"Unable to parse foreach epxression: {data}");
            }

            var newForeach = new ForEachElement(parent)
            {
                Identifier      = match.Groups["identifier"].Value,
                SourceReference = match.Groups["source"].Value
            };

            parent.Children.Add(newForeach);

            parent = newForeach;
        }
 public void Parse(string data, ref TemplateElementContainer parent)
 {
     parent = parent?.Parent as TemplateElementContainer;
 }
 public void Parse(string data, ref TemplateElementContainer parent)
 {
     parent.Children.Add(new BreakElement(parent));
 }