private void ProcessState(int st, string nodeText, bool inString, ref FilterEditorState state, ref int startNodeName, ref int startAtt, int i) { switch (state) { case FilterEditorState.BeforeNodeName: if (!char.IsWhiteSpace(nodeText, i)) { startNodeName = i; state = FilterEditorState.InNodeName; } break; case FilterEditorState.InNodeName: if (char.IsWhiteSpace(nodeText, i)) { txtFilter.Select(startNodeName + st, i - startNodeName + 1); txtFilter.SelectionColor = HcNode; state = FilterEditorState.AfterNodeName; } break; case FilterEditorState.AfterNodeName: if (!char.IsWhiteSpace(nodeText, i)) { startAtt = i; state = FilterEditorState.InAttribute; } break; case FilterEditorState.InAttribute: if (char.IsWhiteSpace(nodeText, i) || nodeText[i] == '=') { txtFilter.Select(startAtt + st, i - startAtt + 1); txtFilter.SelectionColor = HcAttribute; state = FilterEditorState.InString; } break; case FilterEditorState.InString: if (nodeText[i] == '"' && !inString) { state = FilterEditorState.AfterNodeName; } break; } }
private void HighlightRrt() { var selStart = txtFilter.SelectionStart; var selLength = txtFilter.SelectionLength; int k = 0; string str = txtFilter.Text; int st = 0; int en = 0; int lasten = -1; while (k < str.Length) { st = str.IndexOf('<', k); if (st < 0) { break; } if (lasten > 0) { txtFilter.Select(lasten + 1, st - lasten - 1); txtFilter.SelectionColor = HcInnerText; } en = str.IndexOf('>', st + 1); if (en < 0) { break; } k = en + 1; lasten = en; if (str[st + 1] == '!') { txtFilter.Select(st + 1, en - st - 1); txtFilter.SelectionColor = HcComment; continue; } string nodeText = str.Substring(st + 1, en - st - 1); bool inString = false; int lastSt = -1; FilterEditorState state = FilterEditorState.BeforeNodeName; int startNodeName = 0, startAtt = 0; ProcessEachNodeText(st, nodeText, ref inString, ref lastSt, ref state, ref startNodeName, ref startAtt); if (state == FilterEditorState.InNodeName) { txtFilter.Select(st + 1, nodeText.Length); txtFilter.SelectionColor = HcNode; } } // reset selection txtFilter.Select(selStart, selLength); }
private void ProcessEachNodeText(int st, string nodeText, ref bool inString, ref int lastSt, ref FilterEditorState state, ref int startNodeName, ref int startAtt) { for (int i = 0; i < nodeText.Length; ++i) { if (nodeText[i] == '"') { inString = !inString; } if (inString && nodeText[i] == '"') { lastSt = i; } else if (nodeText[i] == '"') { txtFilter.Select(lastSt + st + 2, i - lastSt - 1); txtFilter.SelectionColor = HcString; } ProcessState(st, nodeText, inString, ref state, ref startNodeName, ref startAtt, i); } }