public override void SyntaxHighlight(Range range)
        {
            base.SyntaxHighlight(range);
            var stack = new Stack <XmlFoldingTag>();
            var id    = 0;
            var fctb  = range.tb;

            //extract opening and closing tags (exclude open-close tags: <TAG/>)
            foreach (var r in range.GetRanges(XMLFoldingRegex))
            {
                var tagName = r.Text;
                var iLine   = r.Start.iLine;
                //if it is opening tag...
                if (tagName[0] != '/')
                {
                    // ...push into stack
                    var tag = new XmlFoldingTag {
                        Name = tagName, id = id++, startLine = r.Start.iLine
                    };
                    stack.Push(tag);
                    // if this line has no markers - set marker
                    if (string.IsNullOrEmpty(fctb[iLine].FoldingStartMarker))
                    {
                        fctb[iLine].FoldingStartMarker = tag.Marker;
                    }
                }
                else
                {
                    //if it is closing tag - pop from stack
                    if (stack.Count > 0)
                    {
                        var tag = stack.Pop();
                        //compare line number
                        if (iLine == tag.startLine)
                        {
                            //remove marker, because same line can not be folding
                            if (fctb[iLine].FoldingStartMarker == tag.Marker) //was it our marker?
                            {
                                fctb[iLine].FoldingStartMarker = null;
                            }
                        }
                        else
                        {
                            //set end folding marker
                            if (string.IsNullOrEmpty(fctb[iLine].FoldingEndMarker))
                            {
                                fctb[iLine].FoldingEndMarker = tag.Marker;
                            }
                        }
                    }
                }
            }
        }
 private void XmlFolding(Range range)
 {
     var stack = new Stack<XmlFoldingTag>();
     var id = 0;
     var fctb = range.tb;
     //extract opening and closing tags (exclude open-close tags: <TAG/>)
     foreach (var r in range.GetRanges(XMLFoldingRegex))
     {
         var tagName = r.Text;
         var iLine = r.Start.iLine;
         //if it is opening tag...
         if (tagName[0] != '/')
         {
             // ...push into stack
             var tag = new XmlFoldingTag { Name = tagName, id = id++, startLine = r.Start.iLine };
             stack.Push(tag);
             // if this line has no markers - set marker
             if (string.IsNullOrEmpty(fctb[iLine].FoldingStartMarker))
                 fctb[iLine].FoldingStartMarker = tag.Marker;
         }
         else
         {
             //if it is closing tag - pop from stack
             if (stack.Count > 0)
             {
                 var tag = stack.Pop();
                 //compare line number
                 if (iLine == tag.startLine)
                 {
                     //remove marker, because same line can not be folding
                     if (fctb[iLine].FoldingStartMarker == tag.Marker) //was it our marker?
                         fctb[iLine].FoldingStartMarker = null;
                 }
                 else
                 {
                     //set end folding marker
                     if (string.IsNullOrEmpty(fctb[iLine].FoldingEndMarker))
                         fctb[iLine].FoldingEndMarker = tag.Marker;
                 }
             }
         }
     }
 }
Beispiel #3
0
        /// <summary>
        /// Highlights XML code
        /// </summary>
        /// <param name="range"></param>
        public virtual void XMLSyntaxHighlight(Range range)
        {
            range.tb.CommentPrefix = null;
            range.tb.LeftBracket = '<';
            range.tb.RightBracket = '>';
            range.tb.LeftBracket2 = '(';
            range.tb.RightBracket2 = ')';
            range.tb.AutoIndentCharsPatterns = @"";
            //clear style of changed range
            range.ClearStyle(CommentStyle, XmlTagBracketStyle, XmlTagNameStyle, XmlAttributeStyle, XmlAttributeValueStyle,
                             XmlEntityStyle, XmlCDataStyle);

            //
            if (XMLTagRegex == null)
            {
                InitXMLRegex();
            }

            //xml CData
            range.SetStyle(XmlCDataStyle, XMLCDataRegex);

            //comment highlighting
            range.SetStyle(CommentStyle, XMLCommentRegex1);
            range.SetStyle(CommentStyle, XMLCommentRegex2);

            //tag brackets highlighting
            range.SetStyle(XmlTagBracketStyle, XMLTagRegex);

            //tag name
            range.SetStyle(XmlTagNameStyle, XMLTagNameRegex);

            //end of tag
            range.SetStyle(XmlTagNameStyle, XMLEndTagRegex);

            //attributes
            range.SetStyle(XmlAttributeStyle, XMLAttrRegex);

            //attribute values
            range.SetStyle(XmlAttributeValueStyle, XMLAttrValRegex);

            //xml entity
            range.SetStyle(XmlEntityStyle, XMLEntityRegex);

            //clear folding markers
            range.ClearFoldingMarkers();

            //set folding markers
            //
            var stack = new Stack<XmlFoldingTag>();
            var id = 0;
            var fctb = range.tb;
            //extract opening and closing tags (exclude open-close tags: <TAG/>)
            foreach (var r in range.GetRanges(XMLFoldingRegex))
            {
                var tagName = r.Text;
                var iLine = r.Start.iLine;
                //if it is opening tag...
                if (tagName[0] != '/')
                {
                    // ...push into stack
                    var tag = new XmlFoldingTag { Name = tagName, id = id++, startLine = r.Start.iLine };
                    stack.Push(tag);
                    // if this line has no markers - set marker
                    if (string.IsNullOrEmpty(fctb[iLine].FoldingStartMarker))
                        fctb[iLine].FoldingStartMarker = tag.Marker;
                }
                else
                {
                    //if it is closing tag - pop from stack
                    if (stack.Count > 0)
                    {
                        var tag = stack.Pop();
                        //compare line number
                        if (iLine == tag.startLine)
                        {
                            //remove marker, because same line can not be folding
                            if (fctb[iLine].FoldingStartMarker == tag.Marker)//was it our marker?
                                fctb[iLine].FoldingStartMarker = null;
                        }
                        else
                        {
                            //set end folding marker
                            if (string.IsNullOrEmpty(fctb[iLine].FoldingEndMarker))
                                fctb[iLine].FoldingEndMarker = tag.Marker;
                        }
                    }
                }
            }
        }