fixes highlighting for tags inside comment, needs improvement

This commit is contained in:
Amy Wu 2015-11-25 10:03:25 -08:00 committed by Don Ho
parent 7b2b640357
commit e37354842d
2 changed files with 34 additions and 7 deletions

View File

@ -143,7 +143,7 @@ bool XmlMatchedTagsHighlighter::getXmlMatchedTagsPos(XmlMatchedTagsPos &xmlTags)
openFound = findText("<", searchStartPoint, 0, 0);
styleAt = _pEditView->execute(SCI_GETSTYLEAT, openFound.start);
searchStartPoint = openFound.start - 1;
} while (openFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING) && searchStartPoint > 0);
} while (openFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING || insideComment(openFound.start)) && searchStartPoint > 0);
if (openFound.success && styleAt != SCE_H_CDATA)
{
@ -155,7 +155,7 @@ bool XmlMatchedTagsHighlighter::getXmlMatchedTagsPos(XmlMatchedTagsPos &xmlTags)
closeFound = findText(">", searchStartPoint, caret, 0);
styleAt = _pEditView->execute(SCI_GETSTYLEAT, closeFound.start);
searchStartPoint = closeFound.end;
} while (closeFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING) && searchStartPoint <= caret);
} while (closeFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING || insideComment(closeFound.start)) && searchStartPoint <= caret);
if (!closeFound.success)
{
@ -282,7 +282,7 @@ bool XmlMatchedTagsHighlighter::getXmlMatchedTagsPos(XmlMatchedTagsPos &xmlTags)
std::string tagName;
nextChar = _pEditView->execute(SCI_GETCHARAT, position);
// Checking for " or ' is actually wrong here, but it means it works better with invalid XML
while(position < docLength && !isWhitespace(nextChar) && nextChar != '/' && nextChar != '>' && nextChar != '\"' && nextChar != '\'')
while(position < docLength && !isWhitespace(nextChar) && nextChar != '/' && nextChar != '>' && nextChar != '\"' && nextChar != '\'' && !insideComment(position))
{
tagName.push_back((char)nextChar);
++position;
@ -381,6 +381,33 @@ bool XmlMatchedTagsHighlighter::getXmlMatchedTagsPos(XmlMatchedTagsPos &xmlTags)
return tagFound;
}
bool XmlMatchedTagsHighlighter::insideComment(int pos) {
bool foundComment = false;
int cur = pos-1;
int nextChar, nextChar2, nextChar3;
//int styleAt = _pEditView->execute(SCI_GETSTYLEAT, pos);
while (cur > 3 && !foundComment) {
nextChar = _pEditView->execute(SCI_GETCHARAT, cur);
if (nextChar == '-') {
nextChar2 = _pEditView->execute(SCI_GETCHARAT, cur-1);
if (nextChar2 == '-') {
nextChar3 = _pEditView->execute(SCI_GETCHARAT, cur-2);
if (nextChar3 == '!') {
foundComment = true;
break;
}
}
}
else if (nextChar == '>') {
// check if it's closing comment tag
if (_pEditView->execute(SCI_GETCHARAT, cur-2) == '-' && _pEditView->execute(SCI_GETCHARAT, cur-1) == '-')
return false;
}
cur--;
}
return foundComment;
}
XmlMatchedTagsHighlighter::FindResult XmlMatchedTagsHighlighter::findOpenTag(const std::string& tagName, int start, int end)
{
@ -402,7 +429,7 @@ XmlMatchedTagsHighlighter::FindResult XmlMatchedTagsHighlighter::findOpenTag(con
{
nextChar = _pEditView->execute(SCI_GETCHARAT, result.end);
styleAt = _pEditView->execute(SCI_GETSTYLEAT, result.start);
if (styleAt != SCE_H_CDATA && styleAt != SCE_H_DOUBLESTRING && styleAt != SCE_H_SINGLESTRING)
if (styleAt != SCE_H_CDATA && styleAt != SCE_H_DOUBLESTRING && styleAt != SCE_H_SINGLESTRING && !insideComment(result.start))
{
// We've got an open tag for this tag name (i.e. nextChar was space or '>')
// Now we need to find the end of the start tag.
@ -472,7 +499,7 @@ int XmlMatchedTagsHighlighter::findCloseAngle(int startPosition, int endPosition
{
int style = _pEditView->execute(SCI_GETSTYLEAT, closeAngle.start);
// As long as we're not in an attribute ( <TAGNAME attrib="val>ue"> is VALID XML. )
if (style != SCE_H_DOUBLESTRING && style != SCE_H_SINGLESTRING)
if (style != SCE_H_DOUBLESTRING && style != SCE_H_SINGLESTRING && !insideComment(closeAngle.start))
{
returnPosition = closeAngle.start;
isValidClose = true;
@ -521,7 +548,7 @@ XmlMatchedTagsHighlighter::FindResult XmlMatchedTagsHighlighter::findCloseTag(co
searchStart = result.start - 1;
}
if (styleAt != SCE_H_CDATA && styleAt != SCE_H_SINGLESTRING && styleAt != SCE_H_DOUBLESTRING) // If what we found was in CDATA section, it's not a valid tag.
if (styleAt != SCE_H_CDATA && styleAt != SCE_H_SINGLESTRING && styleAt != SCE_H_DOUBLESTRING && !insideComment(result.start)) // If what we found was in CDATA section, it's not a valid tag.
{
// Common case - '>' follows the tag name directly
if (nextChar == '>')

View File

@ -63,7 +63,7 @@ private:
// Allowed whitespace characters in XML
bool isWhitespace(int ch) { return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'; }
bool insideComment(int p); // added by Amy
FindResult findText(const char *text, int start, int end, int flags = 0);
FindResult findOpenTag(const std::string& tagName, int start, int end);
FindResult findCloseTag(const std::string& tagName, int start, int end);