String (String text) { myIsOpeningTag = true; int openTag = text.indexOf('<', myIndex); if (openTag == -1) { return null; } while (text.charAt(openTag + 1) == '<') { openTag++; } if (text.charAt(openTag + 1) == '/') { myIsOpeningTag = false; openTag++; } if (!isValidTagFirstChar(text.charAt(openTag + 1))) { myIndex = openTag + 1; return ""; } int closeTag = text.indexOf('>', openTag + 1); if (closeTag == -1) return null; int i = text.indexOf('<', openTag + 1); if (i != -1 && i < closeTag) { myIndex = i; return ""; } final String tagName = text.substring(openTag + 1, closeTag); if (myIsOpeningTag) { myStartOffset = openTag + tagName.length() + 2; if (myTags != null && myTags.containsKey(tagName) || myInlineElements != null && myInlineElements.containsKey(StringUtil.substringBefore(tagName, " "))) { mySkipped.add(TextRange.from(openTag, tagName.length() + 2)); } } else { myEndOffset = openTag - 1; if (myTags != null && myTags.containsKey(tagName)) { mySkipped.add(TextRange.from(openTag - 1, tagName.length() + 3)); } } myIndex = Math.max(myStartOffset, myEndOffset + 1); return tagName; }