private void OutputBody(FragmentBody body, TextPosition bodyPosition)
 {
     bodyPosition.Offset = Writer.Position;
     foreach (var f in body.FragmentList)
     {
         OutputFragment(f, bodyPosition);
     }
     bodyPosition.Length = Writer.Position - bodyPosition.Offset; //bodyPosition.Length;
 }
예제 #2
0
        private void CheckFragment(FragmentType fragmentType, FragmentBody fragmentBody)
        {
            Contract.Ensures(Fragment != null);
            if (FragmentExists)
            {
                return;
            }

            var fragmentName = fragmentBody.FragmentName(fragmentType);

            switch (fragmentType)
            {
            case FragmentType.Profile:
                Fragment = fragmentBody.AddProfile();
                break;

            case FragmentType.Text:
                Fragment = fragmentBody.AddText(fragmentName);
                break;

            case FragmentType.Placeholder:
                Fragment = fragmentBody.AddPlaceholder(fragmentName);
                break;

            case FragmentType.Segment:
                var segmentParams = ((GenSegmentParams)this);
                Fragment = fragmentBody.AddSegment(segmentParams.ClassName, segmentParams.Cardinality.ToString());
                break;

            case FragmentType.Annotation:
                Fragment = fragmentBody.AddAnnotation();
                break;

            case FragmentType.Block:
                Fragment = fragmentBody.AddBlock();
                break;

            case FragmentType.Lookup:
                Fragment = fragmentBody.AddLookup();
                break;

            case FragmentType.Condition:
                Fragment = fragmentBody.AddCondition();
                break;

            case FragmentType.Function:
                Fragment = fragmentBody.AddFunction();
                break;

            case FragmentType.TextBlock:
                Fragment = fragmentBody.AddTextBlock();
                break;

            default:
                throw new ArgumentOutOfRangeException("fragmentType");
            }
        }
예제 #3
0
        public void CreateBodyChildTrees(TreeNodeCollection items, FragmentBody container)
        {
            var i = 0;

            while (i < container.FragmentList.Count)
            {
                var fragment = container.FragmentList[i];
                var node     = CreateFragmentTree(fragment);
                items.Add(node);
                i++;
            }
        }
예제 #4
0
        internal void ScanPartialBody(int classId, GenSegBody body, GenContainerFragmentBase parentContainer, ContainerFragment containerFragment, out TokenType t)
        {
            FragmentBody = IsPrimary ? containerFragment.Body() : containerFragment.SecondaryBody();
            GenTextBlock textBlock = null;
            var          s         = Scan.ScanText();

            if (Scan.Eof)
            {
                if (s.Length > 0)
                {
                    GenCompactProfileParser.AddText(parentContainer, FragmentBody, ref textBlock, s, GenDataDef, IsPrimary);
                }
                t = TokenType.Unknown;
                return;
            }

            if (s.Length > 0)
            {
                GenCompactProfileParser.AddText(parentContainer, FragmentBody, ref textBlock, s, GenDataDef, IsPrimary);
            }

            t = Scan.ScanTokenType();
            while (!Scan.Eof && t != TokenType.Close && t != TokenType.Secondary && t != TokenType.Unknown)
            {
                if (t != TokenType.Name && textBlock != null)
                {
                    textBlock = null;
                }
                var frag = GenCompactProfileParser.ScanFragment(classId, ref t, out s, parentContainer, FragmentBody, ref textBlock, IsPrimary);
                if (t != TokenType.Name)
                {
                    AddFragment(body, frag);
                }
                if (s.Length > 0)
                {
                    GenCompactProfileParser.AddText(parentContainer, FragmentBody, ref textBlock, s, GenDataDef, IsPrimary);
                }
                t = Scan.ScanTokenType();
            }
        }
 internal static void AddText(GenContainerFragmentBase parentContainer, FragmentBody fragmentBody, ref GenTextBlock textBlock, string s, GenDataDef genDataDef, bool isPrimary)
 {
     CheckTextBlock(parentContainer, ref textBlock, genDataDef, isPrimary);
     textBlock.Body.Add(
         new GenTextFragment(new GenTextFragmentParams(genDataDef, textBlock, s)));
 }
        private void ScanBlockParams(GenSegBody body, GenContainerFragmentBase parentContainer, Function function,
                                     FragmentBody fragmentBody)
        {
            Scan.ScanWhile(ScanReader.WhiteSpace);

            if (Scan.CheckChar(Scan.Delimiter))
            {
                Scan.SkipChar();
            }
            var t = Scan.ScanTokenType();

            while (t != TokenType.Close)
            {
                string s;
                if (t != TokenType.Unknown && t != TokenType.Name)
                {
                    // Parameter starts with a delimiter
                    if (t != TokenType.Close && t != TokenType.Unknown)
                    {
                        // Scan contained block
                        GenTextBlock textBlock = null;
                        var          frag      = ScanFragment(GenDataDef.CurrentClassId, ref t, out s, parentContainer, fragmentBody,
                                                              ref textBlock, true);
                        body.Add(frag ?? textBlock);

                        // Skip blank parameter separators
                        s = s.TrimStart();
                        if (s != "")
                        {
                            body.Add(
                                new GenTextFragment(new GenTextFragmentParams(GenDataDef, parentContainer,
                                                                              s)));
                        }
                        t = Scan.ScanTokenType();
                    }
                }
                else
                {
                    // Parameter starts without a delimiter
                    var block = new GenBlock(new GenFragmentParams(GenDataDef, parentContainer));

                    s = Scan.CheckChar('\'') ? Scan.ScanQuotedString() : Scan.ScanUntil(_parameterSeparator);

                    while (Scan.CheckChar(' '))
                    {
                        Scan.SkipChar();
                    }

                    // Scan for Text and Placeholders
                    var i = s.IndexOf(Scan.Delimiter);
                    while (i != -1)
                    {
                        var w = s.Substring(0, i - 1); // Text up to first delimiter
                        s = s.Substring(i + 1);        // Text after first delimeter
                        if (s != "")
                        {
                            // Some text after the first delimiter
                            i = s.IndexOf(Scan.Delimiter); // Position of next delimiter
                            if (i != -1)
                            {
                                if (w != "")
                                {
                                    // Add Text up to first delimiter
                                    block.Body.Add(
                                        new GenTextFragment(new GenTextFragmentParams(GenDataDef,
                                                                                      parentContainer, w)));
                                }
                                w = s.Substring(0, i - 1); // Text between initial two delimiters
                                block.Body.Add(
                                    new GenPlaceholderFragment(new GenPlaceholderFragmentParams(GenDataDef, parentContainer, GenDataDef.GetId(w))));

                                s = s.Substring(i + 1);
                                i = s.IndexOf(Scan.Delimiter);
                            }
                            else
                            {
                                // No matching delimiter: output delimiter with text
                                block.Body.Add(
                                    new GenTextFragment(new GenTextFragmentParams(GenDataDef,
                                                                                  parentContainer, w + Scan.Delimiter + s)));
                                s = "";
                            }
                        }
                        else
                        {
                            // No text after initial delimiter: output delimiter with text
                            block.Body.Add(
                                new GenTextFragment(new GenTextFragmentParams(GenDataDef, parentContainer,
                                                                              w + Scan.Delimiter)));
                            i = -1;
                        }
                    }

                    if (s != "" || block.Body.Count == 0)
                    {
                        // Text without placeholders
                        block.Body.Add(
                            new GenTextFragment(new GenTextFragmentParams(GenDataDef, block, s)));
                    }

                    body.Add(block);

                    if (Scan.CheckChar(Scan.Delimiter))
                    {
                        Scan.SkipChar();
                    }

                    t = Scan.ScanTokenType();
                }
            }

            if (t == TokenType.Close)
            {
                Scan.SkipChar();
            }
        }
        internal GenFragment ScanFragment(int classId, ref TokenType nextToken, out string s, GenContainerFragmentBase parentContainer, FragmentBody fragmentBody, ref GenTextBlock textBlock, bool isPrimary)
        {
            Contract.Ensures(Contract.OldValue(nextToken) == TokenType.Name ||
                             Contract.Result <GenFragment>() != null);
            var         oldToken = nextToken;
            GenFragment frag     = null;

            s = "";
            switch (oldToken)
            {
            case TokenType.Segment:
                frag = ScanSegment(parentContainer, isPrimary);
                break;

            case TokenType.Block:
                frag = ScanBlock(classId, parentContainer, isPrimary);
                break;

            case TokenType.Lookup:
                frag = ScanLookup(parentContainer, isPrimary);
                break;

            case TokenType.Condition:
                frag = ScanCondition(classId, parentContainer, isPrimary);
                break;

            case TokenType.Function:
                frag = ScanFunction(parentContainer, isPrimary);
                break;

            case TokenType.Name:
                ScanPlaceholder(parentContainer, ref textBlock, isPrimary);
                break;

            case TokenType.Annotation:
                frag = ScanAnnotation(classId, parentContainer, isPrimary);
                break;

            default:
                OutputText(parentContainer, isPrimary, "Unknown token type: " + nextToken);
                throw new GeneratorException("Unknown token type: " + nextToken + "; " + Scan.Buffer);
            }
            s = Scan.ScanText();
            return(frag);
        }