예제 #1
0
        private void InsertElement(RenderBatch batch, ContainerNode parent, int childIndex, ArraySegment <RenderTreeFrame> frames, RenderTreeFrame frame, int frameIndex)
        {
            // Note: we don't handle SVG here
            var newElement = new ElementNode(frame.ElementName);

            var inserted = false;

            // Apply attributes
            for (var i = frameIndex + 1; i < frameIndex + frame.ElementSubtreeLength; i++)
            {
                var descendantFrame = batch.ReferenceFrames.Array[i];
                if (descendantFrame.FrameType == RenderTreeFrameType.Attribute)
                {
                    ApplyAttribute(batch, newElement, descendantFrame);
                }
                else
                {
                    parent.InsertLogicalChild(newElement, childIndex);
                    inserted = true;

                    // As soon as we see a non-attribute child, all the subsequent child frames are
                    // not attributes, so bail out and insert the remnants recursively
                    InsertFrameRange(batch, newElement, 0, frames, i, frameIndex + frame.ElementSubtreeLength);
                    break;
                }
            }

            // this element did not have any children, so it's not inserted yet.
            if (!inserted)
            {
                parent.InsertLogicalChild(newElement, childIndex);
            }
        }
예제 #2
0
        private void InsertText(ContainerNode parent, int childIndex, RenderTreeFrame frame)
        {
            var textContent = frame.TextContent;
            var newTextNode = new TextNode(textContent);

            parent.InsertLogicalChild(newTextNode, childIndex);
        }