Example #1
0
        /// <summary>
        /// KAGタグの情報をライン行文字列から取得し返す
        /// </summary>
        /// <param name="line">情報を取得するタグ情報</param>
        /// <returns>タグ情報</returns>
        public static KagTagKindInfo GetTagKind(string line)
        {
            KagTagKindInfo info = new KagTagKindInfo();

            bool startFlag      = true;         //先頭の時true
            bool stringModeFlag = false;        //文字列中("")のときtrue

            for (int i = 0; i < line.Length; i++)
            {
                if (line[i] == '[')
                {
                    startFlag = false;
                    if (stringModeFlag == false && info.Kind == KagCompletionData.Kind.Unknown)
                    {
                        info.Kind      = KagCompletionData.Kind.KagTagName;
                        info.TagName   = "";
                        info.AttrName  = "";
                        info.AttrValue = "";
                        info.AttrTable.Clear();
                    }
                }
                else if (line[i] == '@')
                {
                    if (startFlag)
                    {
                        startFlag      = false;
                        info.Kind      = KagCompletionData.Kind.KagTagName;
                        info.TagName   = "";
                        info.AttrName  = "";
                        info.AttrValue = "";
                        info.AttrTable.Clear();
                    }
                }
                else if (line[i] == ']')
                {
                    startFlag = false;
                    if (stringModeFlag == false)
                    {
                        info.Kind      = KagCompletionData.Kind.Unknown;
                        info.TagName   = "";
                        info.AttrValue = "";
                        info.AttrValue = "";
                    }
                }
                else if (line[i] == ' ')
                {
                    startFlag = false;
                    switch (info.Kind)
                    {
                    case KagCompletionData.Kind.KagTagName:
                    case KagCompletionData.Kind.AttrName:
                    case KagCompletionData.Kind.AttrValue:
                        if (stringModeFlag == false)
                        {
                            info.Kind = KagCompletionData.Kind.AttrName;
                            info.AddAttrTable(info.AttrName, info.AttrValue);
                            info.AttrName  = "";
                            info.AttrValue = "";
                        }
                        break;

                    default:
                        break;
                    }
                }
                else if (line[i] == '=')
                {
                    startFlag = false;
                    switch (info.Kind)
                    {
                    case KagCompletionData.Kind.AttrName:
                        info.Kind = KagCompletionData.Kind.AttrValue;
                        info.AddAttrTable(info.AttrName, info.AttrValue);
                        info.AttrValue = "";
                        break;

                    default:
                        break;
                    }
                }
                else if (line[i] == '"')
                {
                    startFlag = false;
                    if (i != 0 && line[i - 1] == '\\')                          //"がエスケープされているとき
                    {
                        continue;
                    }

                    stringModeFlag = !stringModeFlag;                           //フラグを反転させる
                }
                else if (line[i] == '\t')
                {
                    //何もしない
                }
                else
                {
                    startFlag = false;
                    switch (info.Kind)
                    {
                    case KagCompletionData.Kind.KagTagName:
                        info.TagName += line[i];
                        break;

                    case KagCompletionData.Kind.AttrName:
                        info.AttrName += line[i];
                        break;

                    case KagCompletionData.Kind.AttrValue:
                        info.AttrValue += line[i];
                        break;
                    }
                }
            }

            if (info.Kind == KagCompletionData.Kind.AttrName ||
                info.Kind == KagCompletionData.Kind.AttrValue)
            {
                info.AddAttrTable(info.AttrName, info.AttrValue);
            }
            info.StrMode = stringModeFlag;
            return(info);
        }