private int[] Parse(string text, OnText OnTextCallback, OnTag OnTagCallback)
    {
        List <int> result   = new List <int>();
        int        startPos = 0;
        int        tagPos   = text.IndexOf("[");

        while (tagPos >= 0)
        {
            // find end tag
            int endPos = text.IndexOf("]", tagPos + 1);
            if (endPos < 0)
            {
                break;
            }

            // add text before
            if (tagPos != startPos)
            {
                if (OnTextCallback != null)
                {
                    string t = text.Substring(startPos, tagPos - startPos);
                    OnTextCallback(t, startPos);
                }
            }

            string tag = text.Substring(tagPos + 1, endPos - tagPos - 1);

            if (OnTagCallback != null)
            {
                result.Add(tagPos);
                OnTagCallback(tag, tagPos);
            }

            startPos = endPos + 1;
            tagPos   = text.IndexOf("[", startPos);
        }

        if (OnTextCallback != null)
        {
            string t = text.Substring(startPos, text.Length - startPos);
            OnTextCallback(t, startPos);
        }

        return(result.ToArray());
    }
    private int[] Parse(string text, OnText OnTextCallback, OnTag OnTagCallback)
    {
        List<int> result = new List<int>();
        int startPos = 0;
        int tagPos = text.IndexOf("[");
        while (tagPos >= 0)
        {
            // find end tag
            int endPos = text.IndexOf("]", tagPos + 1);
            if (endPos < 0) break;

            // add text before
            if (tagPos != startPos)
            {
                if (OnTextCallback != null)
                {
                    string t = text.Substring(startPos, tagPos - startPos);
                    OnTextCallback(t, startPos);
                }
            }

            string tag = text.Substring(tagPos + 1, endPos - tagPos - 1);

            if (OnTagCallback != null)
            {
                result.Add(tagPos);
                OnTagCallback(tag, tagPos);
            }

            startPos = endPos + 1;
            tagPos = text.IndexOf("[", startPos);
        }

        if (OnTextCallback != null)
        {
            string t = text.Substring(startPos, text.Length - startPos);
            OnTextCallback(t, startPos);
        }

        return result.ToArray();
    }