public abstract TResult Visit(FormatTextElement format);
private static FormatElement Parse(string format, ref int index, params char[] stopat) { FormatElement element = FormatNoContentElement.Element; while (index < format.Length) { switch (format[index]) { case '[': // Coloring element += ParseColor(format, ref index); break; case '?': // Conditional element += ParseCondition(format, ref index); break; case '@': // Listing/Function element += ParseFunction(format, ref index); break; case '$': // Variable element += ParseVariable(format, ref index); break; case '\\': if (format.Length == index + 1) { index++; } else { element += new FormatTextElement(format.Substring(index + 1, 1)); index += 2; } break; default: // Skip content var nextIndex = format.IndexOfAny(new char[] { '[', '?', '@', '$', '\\' }, index); if (nextIndex < 0) { nextIndex = format.Length; } var stopatIndex = format.IndexOfAny(stopat, index); if (stopatIndex < nextIndex && stopatIndex >= 0) { if (stopatIndex - index > 0) { element += new FormatTextElement(format.Substring(index, stopatIndex - index)); index = stopatIndex; } return(element); } else { element += new FormatTextElement(format.Substring(index, nextIndex - index)); index = nextIndex; } break; } } return(element); }