Ejemplo n.º 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);
        }
Ejemplo n.º 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);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// KAGタグの情報をエディタドキュメント情報から取得し返す
        /// </summary>
        /// <param name="document">エディタのドキュメント情報</param>
        /// <param name="lineNumber">行番号</param>
        /// <param name="colNumber">カーソル位置を表す桁番号</param>
        /// <returns>KAGタグ情報(見つからなかったときはnullを返す)</returns>
        public static KagTagKindInfo GetTagKind(string lineText, int colNumber)
        {
            if (string.IsNullOrEmpty(lineText))
            {
                return(null);
            }

            if (colNumber < lineText.Length)
            {
                lineText = lineText.Substring(0, colNumber);
            }
            if (KagUtility.ExistLineHead(lineText, ';'))
            {
                return(null);                   //コメント行のとき
            }
            if (KagUtility.ExistLineHead(lineText, '*'))
            {
                return(null);                   //ラベル行のとき
            }

            KagTagKindInfo info = KagUtility.GetTagKind(lineText);

            return(info);
        }