예제 #1
0
        /// <summary>
        /// 개체를 생성할 때 인수로 넘긴 Template 문자열을 리턴함.
        /// 만약 DataTable을 가져와서 변수 값을 변경했거나, ReplaceInner나 ReplaceOuter를 이용해서 변수 값을 변경했다면
        /// 변경된 값이 적용된 Template 문자열을 리턴함.
        /// </summary>
        /// <param name="UseInner">true: 둘러싼 태그를 보존하고 그 안의 변수만 값으로 대체함. false: 둘러싼 태그와 변수를 값으로 대체함.</param>
        /// <returns>변경된 값이 적용된 최종 문자열</returns>
        /// <example>
        /// 다음은 두 개의 행을 가진 Title, Name 필드의 값을 각각 변경하는 과정입니다.
        /// 첫번째 행의 Title 필드는 초기값이 "알립니다1."에서 "회식 있음"으로 변경되었고,
        /// 두번째 행의 Title 필드는 최기값이 "알립니다2."에서 "퇴근했음"으로 변경되었습니다.
        /// <code>
        /// string sTmpMult = "<!--Title.Begin-->알립니다1.<!--Title.End--><!--Name.Begin-->관리자1<!--Name.End-->\r\n"
        ///				+ "<!--Title.Begin-->알립니다2.<!--Title.End--><!--Name.Begin-->관리자2<!--Name.End-->";
        /// CTemplate TmpMult = new CTemplate(sTmpMult, "Title", "Name");
        ///
        /// DataTable dtTmpMult = TmpMult.DataTable;
        ///
        /// CVarInfo vi = null;
        ///
        /// vi = (CVarInfo)dtTmpMult.Rows[0]["Title"];
        /// vi.OuterText = "회식 있음";
        /// vi = (CVarInfo)dtTmpMult.Rows[0]["Name"];
        /// vi.OuterText = "이순신";
        ///
        /// vi = (CVarInfo)dtTmpMult.Rows[1]["Title"];
        /// vi.OuterText = "퇴근했음";
        /// vi = (CVarInfo)dtTmpMult.Rows[1]["Name"];
        /// vi.OuterText = "홍길동";
        ///
        /// string sMultOuter = TmpMult.GetTemplate();
        /// Console.WriteLine(sMultOuter);
        /// //--결과
        /// //회식 있음이순신
        /// //퇴근했음홍길동
        /// </code>
        /// </example>
        public string GetTemplate(bool UseInner)
        {
            string        Template = this.mTemplate;
            StringBuilder sbNew    = new StringBuilder();

            int PosPrev = 0;

            foreach (DataRow dr in this.mdt.Rows)
            {
                foreach (DataColumn dc in this.mdt.Columns)
                {
                    CVarInfo vi = (CVarInfo)dr[dc];

                    if (!UseInner)
                    {
                        sbNew.Append(Template.Substring(PosPrev, (vi.PosOuterStart - PosPrev)));
                        sbNew.Append(vi.OuterText);
                        PosPrev = vi.PosOuterEnd + 1;
                    }
                    else
                    {
                        sbNew.Append(Template.Substring(PosPrev, (vi.PosInnerStart - PosPrev)));
                        sbNew.Append(vi.InnerText);
                        PosPrev = vi.PosInnerEnd + 1;
                    }
                }
            }

            sbNew.Append(Template.Substring(PosPrev));

            return(sbNew.ToString());
        }
예제 #2
0
        /// <summary>
        /// 개체를 생성할 때 인수로 넘긴 Template 문자열에
        /// aVarName을 이름으로 하는 태그 안의 값을 aValue의 값으로 변경해서 리턴함.
        /// 순서대로 변경됨. 즉, aVarName 배열의 첫번째 값은 aValue 배열의 첫번째 값과 대응됨.
        /// </summary>
        /// <param name="RowIndex">같은 이름의 변수가 여러 개일 때 0부터 매겨지는 변수의 순서</param>
        /// <param name="aValue">변수 안에 입력될 실제 값</param>
        /// <example>
        /// 다음은 CTemplate 개체를 생성하고 ReplaceInner를 이용해서 태그 안의 값만 변경하는 방법입니다.
        /// <code>
        /// string sTmp = "<!--Title.Begin-->알립니다.<!--Title.End--><!--Name.Begin-->관리자<!--Name.End-->\r\n"
        ///				   + "<!--Title.Begin-->알립니다2.<!--Title.End--><!--Name.Begin-->관리자2<!--Name.End-->";
        /// CTemplate Tmp = new CTemplate(sTmp, "Title", "Name");
        ///
        /// Tmp.ReplaceInner(0, "퇴근했음", "홍길동");
        /// Tmp.ReplaceInner(1, "출근했음", "이순신");
        /// Console.WriteLine(Tmp.GetTemplate(true));
        /// --결과
        /// <!--Title.Begin-->퇴근했음<!--Title.End--><!--Name.Begin-->홍길동<!--Name.End-->
        /// <!--Title.Begin-->출근했음<!--Title.End--><!--Name.Begin-->이순신<!--Name.End-->
        /// </code>
        /// </example>
        public void ReplaceInner(int RowIndex, params string[] aValue)
        {
            if ((RowIndex + 1) > mdt.Rows.Count)
            {
                string Msg = "Template 안의 변수 개수가 " + mdt.Rows.Count.ToString() + "이므로"
                             + " RowIndex 값: " + RowIndex.ToString() + "은 허용되지 않습니다.";
                throw new Exception(Msg);
            }

            for (int cl = 0, cl2 = this.maVarName.Length; cl < cl2; cl++)
            {
                CVarInfo vi = (CVarInfo)this.mdt.Rows[RowIndex][this.maVarName[cl]];
                vi.InnerText = aValue[cl];
            }
        }
예제 #3
0
        private DataTable GetVarInfo(string Template, string[] aVarName)
        {
            DataTable dt = new DataTable();

            for (int i = 0, i2 = aVarName.Length; i < i2; i++)
            {
                dt.Columns.Add(aVarName[i], typeof(CVarInfo));
            }

            //Template의 규칙은 <!--VarName.Begin-->내용<!--VarName.End-->임.
            int  PosBegin = -1, PosEnd = -1;
            bool IsFirstLine = true;

            while (true)
            {
                CVarInfo[] avi     = new CVarInfo[dt.Columns.Count];
                bool       IsFound = false;
                for (int cl = 0, i2 = dt.Columns.Count; cl < i2; cl++)
                {
                    string VarName = dt.Columns[cl].ColumnName;

                    string Begin = "<!--" + VarName + ".Begin-->";
                    string End   = "<!--" + VarName + ".End-->";

                    //태그 안에 태그가 있을 수 있으므로 이전 Begin 위치 다음부터 현재 Begin을 찾음.
                    int Pos = IsFirstLine ? (PosBegin + 1) : (PosBegin + Begin.Length);
                    PosBegin = Template.IndexOf(Begin, Pos, StringComparison.CurrentCultureIgnoreCase);
                    if (PosBegin == -1)
                    {
                        if (IsFirstLine)
                        {
                            throw new Exception(Begin + " 태그가 없거나 첫번째 위치에 " + Begin + " 태그가 존재하지 않습니다.");
                        }

                        break;
                    }

                    PosEnd = Template.IndexOf(End, PosBegin + 1, StringComparison.CurrentCultureIgnoreCase);
                    if (PosEnd == -1)
                    {
                        throw new Exception(Begin + " 태그가 있으나 " + End + " 태그가 없습니다.");
                    }
                    PosEnd = PosEnd + End.Length - 1;

                    avi[cl]               = new CVarInfo();
                    avi[cl].Key           = VarName;
                    avi[cl].OuterText     = Template.Substring(PosBegin, PosEnd - PosBegin + 1);
                    avi[cl].InnerText     = avi[cl].OuterText.Substring(Begin.Length, avi[cl].OuterText.Length - Begin.Length - End.Length);
                    avi[cl].PosOuterStart = PosBegin;
                    avi[cl].PosOuterEnd   = PosEnd;
                    avi[cl].PosInnerStart = PosBegin + Begin.Length;
                    avi[cl].PosInnerEnd   = PosEnd - End.Length;

                    IsFound = true;
                }
                IsFirstLine = false;

                if (IsFound)
                {
                    dt.Rows.Add(avi);
                }
                else
                {
                    break;
                }
            }

            return(dt);
        }
예제 #4
0
        /// <summary>
        /// 개체를 생성할 때 인수로 넘긴 Template 문자열 안의 <paramref name="VarName"/>을 이름으로 하는
        /// 태그 안의 값을 리턴함.
        /// </summary>
        /// <param name="VarName">태그의 이름(&lt;--Name.Begin--&gt;홍길동&lt;--Name.End--&gt;에서 Name을 뜻함)</param>
        /// <returns><paramref name="VarName"/> 태그 안의 문자열 값</returns>
        /// <example>
        /// 다음은 GetInner를 이용해서 Exam1 태그의 값들을 모두 가져온 후,
        /// Q1, Q2 태그의 값을 변경하고,
        /// 변경된 Q1, Q2 태그의 값을 이용해 Exam1 태그의 값을 변경하는 과정입니다.
        /// <code>
        /// string sTmpMain = "<!--Exam1.Begin-->\r\n"
        ///				 + "	<!--Q1.Begin-->한라산<!--Q1.End-->\r\n"
        ///				 + "	<!--Q2.Begin-->백두산<!--Q2.End-->\r\n"
        ///				 +"<!--Exam1.End-->";
        /// CTemplate TmpMain = new CTemplate(sTmpMain, "Exam1");
        ///
        /// string sTmpSub = TmpMain.GetInner("Exam1");
        /// Console.WriteLine(sTmpSub);
        /// //--결과
        /// //	<!--Q1.Begin-->한라산<!--Q1.End-->
        /// //	<!--Q2.Begin-->백두산<!--Q2.End-->
        ///
        /// CTemplate TmpSub = new CTemplate(sTmpSub, new string[] { "Q1", "Q2" });
        /// sTmpSub = TmpSub.ReplaceOuter(new string[] { "두만강", "낙동강" });
        /// Console.WriteLine(sTmpSub);
        /// //--결과
        /// //	두만강
        /// //	낙동강
        ///
        /// sTmpMain = TmpMain.ReplaceInner(sTmpSub);
        /// Console.WriteLine(sTmpMain);
        /// //--결과
        /// //<!--Exam1.Begin-->
        /// //	두만강
        /// //	낙동강
        /// //<!--Exam1.End-->
        /// </code>
        /// </example>
        public string GetInner(string VarName)
        {
            CVarInfo vi = (CVarInfo)this.mdt.Rows[0][VarName];

            return(vi.InnerText);
        }