/// <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); }