/// <summary> /// 属性名リストを取得する /// </summary> /// <param name="info">現在位置の入力情報</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>マクロ名リスト</returns> public static KagMacroAttr GetKagMacroAttr(string attrName, KagTagKindInfo info, KagMacro[] macroList) { //マクロを取得 KagMacro macro = KagUtility.GetKagMacro(info.TagName, macroList); if (macro == null) { return(null); //マクロが見つからない } //属性を取得 Dictionary <string, KagMacroAttr> table = new Dictionary <string, KagMacroAttr>(); table = getAttrNameListFromMacro(macro, macroList, table, 0); //属性を検索する KagMacroAttr attr = null; if (table.ContainsKey(attrName)) { attr = table[attrName]; } return(attr); }
/// <summary> /// 指定したマクロ名の説明を取得する /// </summary> /// <param name="info"></param> /// <param name="macroName"></param> /// <returns></returns> private static string getTagComment(string macroName) { KagMacro macro = KagUtility.GetKagMacro(macroName); if (macro == null) { return(""); } return(macro.Comment); }
/// <summary> /// マクロ属性リストを解析し、マクロオブジェクトに格納する /// </summary> /// <param name="macro">格納先マクロオブジェクト</param> /// <param name="tagName">タグ名</param> /// <param name="attrList">属性リスト</param> private void setMacro(ref KagMacro macro, string tagName, Dictionary <string, string> attrList) { if (tagName == "macro") { //マクロタグの時はname属性値を取得する foreach (string key in attrList.Keys) { if (key == "name") { if (attrList[key] != "") { macro.Name = attrList[key]; //Debug.WriteLine("macro.Name=" + macro.Name); } return; } } } else { //そのほかのタグ名の時は属性を取得する foreach (string key in attrList.Keys) { if (key == "*") { //省略属性を持つタグ名を追加 macro.AddAsteriskTagName(tagName); } else { string attrName = getMacroAttrName(attrList[key]); if (attrName != "") { //属性値があるのでセットする KagMacroAttr attr = new KagMacroAttr(); attr.Name = attrName; //Debug.WriteLine("attr.Name=" + attr.Name); string attrDef = getMacroAttrDef(attrList[key]); if (attrDef != "") { attr.DefaultValue = attrDef; //属性値があるのでセットする //Debug.WriteLine("attr.DefaultValue=" + attr.DefaultValue); } //属性を追加 macro.AddAttr(attr); } } } } }
/// <summary> /// マクロを追加する /// </summary> /// <param name="macro">追加するマクロオブジェクト</param> public void AddMacro(KagMacro macro) { if (macro == null || macro.Name == null || macro.Name == "") { return; //何もしない } if (m_macroTable.ContainsKey(macro.Name)) { m_macroTable.Remove(macro.Name); //すでに存在するときは一端削除する } m_macroTable.Add(macro.Name, macro); }
/// <summary> /// マクロを構文解析しオブジェクトを生成する /// </summary> /// <param name="token">マクロ内容すべてを含むトークン</param> private KagMacro paserMacro(Token macroToken) { KagMacro macro = new KagMacro(); macro.FilePath = m_cu.FilePath; macro.LineNumber = macroToken.Line; //マクロ内を解析し、マクロ属性を取得する TextReader reader; using (reader = new StringReader(macroToken.Val)) { KagMacroLexer macroLexer = new KagMacroLexer(reader); Token token; while ((token = macroLexer.NextToken()) != null) { switch (token.Kind) { case KagTokens.MacroAttr: object obj = token.Obj; if (obj is Dictionary <string, string> ) { setMacro(ref macro, token.Val, (Dictionary <string, string>)obj); } break; case KagTokens.MacroName: break; case KagTokens.AsteriskTag: break; } } } //マクロコメントを解析し対応する属性にセットする using (reader = new StringReader(macroToken.Comment)) { while (reader.Peek() > -1) { parseMAcroCommentLine(ref macro, reader.ReadLine()); } } return(macro); }
/// <summary> /// マクロコメントを解析し該当するマクロにセットする /// </summary> /// <param name="macro">セットするマクロ</param> /// <param name="line">マクロコメント行文字列</param> private void parseMAcroCommentLine(ref KagMacro macro, string line) { if (line == null || line.StartsWith(";;") == false) { return; //マクロコメントではない } line = line.Remove(0, 2); //";;"を削除する int pos = line.IndexOf('='); if (pos != -1) //見つかったとき { KagMacroAttr attr = macro.GetMacroAttr(line.Substring(0, pos)); if (attr != null) //属性が見つかったとき { if (pos + 1 < line.Length) //=の後ろに文字があるとき { int commaPos = line.IndexOf(',', pos + 1); if (commaPos != -1) { attr.Comment = line.Substring(pos + 1, commaPos - (pos + 1)).Replace("\\n", "\n"); //属性コメントセット if (commaPos + 1 < line.Length) //コンマの後ろに文字があるとき { attr.ValueType = line.Substring(commaPos + 1).Trim(); //属性値タイプセット } //Debug.WriteLine("属性コメント=" + attr.Comment); //Debug.WriteLine("属性値タイプ=" + attr.ValueType); } else { attr.Comment = line.Substring(pos + 1).Trim().Replace("\\n", "\n"); //属性コメントセット //Debug.WriteLine("属性コメント=" + attr.Comment); } return; //属性コメントが取得できたので終了 } } } //属性コメントではないときはそのままタグコメントとして格納する macro.Comment += line.Replace("\\n", "\n") + "\r\n"; //Debug.WriteLine("マクロコメント=" + line); return; }
/// <summary> /// マクロオブジェクトを取得する /// 存在しないときはnullを返す /// </summary> /// <param name="macroName">取得するマクロ名</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>マクロオブジェクト</returns> public static KagMacro GetKagMacro(string macroName, KagMacro[] macroList) { if (macroName == "" || macroList == null) { return(null); } KagMacro macro = null; foreach (KagMacro m in macroList) { if (macroName == m.Name) { macro = m; break; } } return(macro); }
/// <summary> /// マクロオブジェクトから属性名リストを取得する /// *再帰する /// </summary> /// <param name="macro">取得するマクロオブジェクト</param> /// <param name="macroList">マクロ情報リスト</param> /// <param name="table">取得した属性名を格納するテーブル</param> /// <returns>取得した属性名テーブル(tableをそのまま返す)</returns> private static Dictionary <string, KagMacroAttr> getAttrNameListFromMacro(KagMacro macro , KagMacro[] macroList, Dictionary <string, KagMacroAttr> table, int reverseCount) { if (reverseCount > MAX_REVERSE_COUNT) { //再帰回数がオーバーしているときは何もせずに終了する return(table); } reverseCount++; //通常のマクロ属性を追加 foreach (KagMacroAttr attr in macro.AttrTable.Values) { if (table.ContainsKey(attr.Name) == false) { //存在しないときだけ追加する table.Add(attr.Name, attr); } } //全省略マクロ属性を追加 KagMacro asterMacro = null; foreach (string macroName in macro.AsteriskTagList) { asterMacro = KagUtility.GetKagMacro(macroName, macroList); if (asterMacro == null) { continue; //このマクロは飛ばす } //自分自身を呼び出し table = getAttrNameListFromMacro(asterMacro, macroList, table, reverseCount); } return(table); }