Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }