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; } } } } }
/// <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; } } } } }