Exemplo n.º 1
0
        //────────────────────────────────────────
        #endregion



        #region アクション
        //────────────────────────────────────────

        public string Perform(out bool isError, TextdropareaImpl textdroparea1, TextdropareaImpl textdroparea2, Log_Reports log_Reports)
        {
            Log_Method log_Method = new Log_MethodImpl();

            log_Method.BeginMethod(Info_SpeedCoder.Name_Library, this, "Perform", log_Reports);


            isError = false;
            this.ListDefinitionParameterline.Clear();


            StringBuilder result = new StringBuilder();
            string        template;

            if (1 <= textdroparea1.ListFilepath.Count)
            {
                if (System.IO.File.Exists(textdroparea1.ListFilepath[0]))
                {
                    template = System.IO.File.ReadAllText(textdroparea1.ListFilepath[0], Encoding.UTF8);
                }
                else
                {
                    template = "";
                }
            }
            else
            {
                template = "";
            }
            //log_Method.WriteDebug_ToConsole("template=[" + template + "]");

            string argumentfile;

            if (1 <= textdroparea2.ListFilepath.Count)
            {
                if (System.IO.File.Exists(textdroparea2.ListFilepath[0]))
                {
                    argumentfile = System.IO.File.ReadAllText(textdroparea2.ListFilepath[0], Encoding.UTF8);
                }
                else
                {
                    argumentfile = "";
                }
            }
            else if ("" != textdroparea2.DroppedText)
            {
                argumentfile = textdroparea2.DroppedText;
            }
            else
            {
                argumentfile = "";
            }
            //log_Method.WriteDebug_ToConsole("input=[" + input + "]");


            //テンプレートの解析
            string bracketBegin = ""; //デフォルトでは「<<<<」で説明。正規表現で利用されている魔法の文字([]+*?$等色々)は使わないこと。
            string bracketEnd   = ""; //デフォルトでは「>>>>」で説明。正規表現で利用されている魔法の文字([]+*?$等色々)は使わないこと。
            {
                this.ListDefinitionParameterline.Clear();
                int phase = 0;
                //  0: 「<<<<タイトルここから>>>>」を探す。その間無視。
                //  1: 「<<<<タイトルここまで>>>>」が出てくるまでがタイトル。
                //  2: 「<<<<説明ここから>>>>」が出てくるまで探す。その間無視。
                //  3: 「<<<<説明ここまで>>>>」が出てくるまでが説明。
                //  4: 「<<<<反復入力行セット定義ここから>>>>」を探す。その間無視。
                //  5: 「<<<<反復入力行セット定義ここまで>>>>」が出てくるまでがタイトル。
                //  6: 「<<<<テンプレートここから>>>>」を探す。その間無視。
                //  7: 「<<<<テンプレートここまで>>>>」が出てくるまでがタイトル。
                //  8: 「<<<<オプションここから>>>>」を探す。その間無視。
                //  9: 「<<<<オプションここまで>>>>」が出てくるまでがタイトル。
                // 10: 終了します。
                string[] symbols = null;

                StringBuilder sbTitle             = new StringBuilder();
                StringBuilder sbExplain           = new StringBuilder();
                int           previousParamNumber = 0;
                StringBuilder sbTemplate          = new StringBuilder();
                string[]      lines      = template.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                int           numberLine = 1;
                foreach (string line in lines)
                {
                    if (3 <= numberLine)
                    {
                        if (null == symbols)
                        {
                            symbols = new string[]
                            {
                                bracketBegin + "タイトルここから" + bracketEnd,
                                bracketBegin + "タイトルここまで" + bracketEnd,
                                bracketBegin + "説明ここから" + bracketEnd,
                                bracketBegin + "説明ここまで" + bracketEnd,
                                bracketBegin + "反復入力行セット定義ここから" + bracketEnd,
                                bracketBegin + "反復入力行セット定義ここまで" + bracketEnd,
                                bracketBegin + "テンプレートここから" + bracketEnd,
                                bracketBegin + "テンプレートここまで" + bracketEnd,
                                bracketBegin + "オプションここから" + bracketEnd,
                                bracketBegin + "オプションここまで" + bracketEnd
                            };
                        }

                        switch (phase)
                        {
                        case 0:
                            //「<<<<タイトルここから>>>>」
                        {
                            if (symbols[0] == line.Trim())
                            {
                                phase = 1;
                                //log_Method.WriteDebug_ToConsole("(0a) line=[" + line + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("(0b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 1:
                            //「<<<<タイトルここまで>>>>」
                        {
                            if (symbols[1] == line.Trim())
                            {
                                phase = 2;
                                //log_Method.WriteDebug_ToConsole("(1a) line=[" + line + "]");
                            }
                            else
                            {
                                if (0 < sbTitle.Length)
                                {
                                    //文字をつなげる場合は、改行を入れます。
                                    sbTitle.Append(Environment.NewLine);
                                }
                                sbTitle.Append(line);
                                //最後に改行が付いていないようにします。

                                //log_Method.WriteDebug_ToConsole("(1b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 2:
                            //「<<<<説明ここから>>>>」
                        {
                            if (symbols[2] == line.Trim())
                            {
                                phase = 3;
                                //log_Method.WriteDebug_ToConsole("(2a) line=[" + line + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("(2b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 3:
                            //「<<<<説明ここまで>>>>」
                        {
                            if (symbols[3] == line.Trim())
                            {
                                phase = 4;
                                //log_Method.WriteDebug_ToConsole("(3a) line=[" + line + "]");
                            }
                            else
                            {
                                if (0 < sbExplain.Length)
                                {
                                    //文字をつなげる場合は、改行を入れます。
                                    sbExplain.Append(Environment.NewLine);
                                }
                                sbExplain.Append(line);
                                //最後に改行が付いていないようにします。
                                //log_Method.WriteDebug_ToConsole("(3b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 4:
                            //「<<<<反復入力行セット定義ここから>>>>」
                        {
                            if (symbols[4] == line.Trim())
                            {
                                phase = 5;
                                //log_Method.WriteDebug_ToConsole("(4a) line=[" + line + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("(4b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 5:
                        {
                            //「<<<<反復入力行セット定義ここまで>>>>」
                            if (symbols[5] == line.Trim())
                            {
                                phase = 6;
                                //log_Method.WriteDebug_ToConsole("(5a) line=[" + line + "]");
                            }
                            else
                            {
                                DefinitionParameterlineImpl definition = new DefinitionParameterlineImpl();
                                definition.Parse(out isError, line, previousParamNumber);
                                if (isError)
                                {
                                    //エラー
                                    //log_Method.WriteDebug_ToConsole(definition.Comment);
                                    result.Append(definition.Comment);
                                    goto gt_EndMethod;
                                }
                                this.ListDefinitionParameterline.Add(definition);
                                //log_Method.WriteDebug_ToConsole("(5b) line=[" + line + "] numberDefinitionline=[" + numberDefinitionline + "] パースしたか? 変数名=[" + definition.NameParameter + "]");
                                previousParamNumber = definition.NumberLine;
                            }
                        }
                        break;

                        case 6:
                            //「<<<<テンプレートここから>>>>」
                        {
                            if (symbols[6] == line.Trim())
                            {
                                phase = 7;
                                //log_Method.WriteDebug_ToConsole("(6a) line=[" + line + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("(6b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 7:
                            //「<<<<テンプレートここまで>>>>」
                        {
                            if (symbols[7] == line.Trim())
                            {
                                phase = 8;
                                //log_Method.WriteDebug_ToConsole("(7a) line=[" + line + "]");
                            }
                            else
                            {
                                if (0 < sbTemplate.Length)
                                {
                                    //文字をつなげる場合は、改行を入れます。
                                    sbTemplate.Append(Environment.NewLine);
                                }
                                sbTemplate.Append(line);
                                //最後に改行が付いていないようにします。
                                //log_Method.WriteDebug_ToConsole("(7b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 8:
                            //「<<<<オプションここから>>>>」
                        {
                            if (symbols[8] == line.Trim())
                            {
                                phase = 9;
                                //log_Method.WriteDebug_ToConsole("(6a) line=[" + line + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("(6b) line=[" + line + "]");
                            }
                        }
                        break;

                        case 9:
                            //「<<<<オプションここまで>>>>」
                        {
                            if (symbols[9] == line.Trim())
                            {
                                phase = 10;
                                //log_Method.WriteDebug_ToConsole("(9a) line=[" + line + "]");
                            }
                            else
                            {
                                OptionlineTemplateImpl optionline = new OptionlineTemplateImpl();
                                optionline.Parse(line);
                                this.DictionaryOptionline.Add(optionline.NameOption, optionline);
                                //log_Method.WriteDebug_ToConsole("(9b) line=[" + line + "] オプションのはず。名=[" + optionline.NameOption + "] 値=[" + optionline.Value + "] コメント=[" + optionline.Comment + "]");
                            }
                        }
                        break;

                        default:
                        {
                            //log_Method.WriteDebug_ToConsole("(8) line=[" + line + "]");
                            goto gt_EndLoop;
                        }
                        }
                    }
                    else if (1 == numberLine)
                    {
                        bracketBegin = line.Trim();
                        //log_Method.WriteDebug_ToConsole("(1行目) line=[" + line + "]");
                    }
                    else if (2 == numberLine)
                    {
                        bracketEnd = line.Trim();
                        //log_Method.WriteDebug_ToConsole("(2行目) line=[" + line + "]");
                    }


                    numberLine++;
                }
gt_EndLoop:

                this.Title    = sbTitle.ToString().TrimEnd('\r', '\n');    //末尾の改行をchompします。
                this.Explain  = sbTitle.ToString().TrimEnd('\r', '\n');    //末尾の改行をchompします。
                this.Template = sbTemplate.ToString().TrimEnd('\r', '\n'); //末尾の改行をchompします。
            }

            //入力値をセットに分ける。
            //最後の改行はカットします。
            int sizeOfSet = 0;//0スタート配列のサイズ。セットの最後の番号。1セット目は 0。

            {
                string[] argumentlines = argumentfile.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                //log_Method.WriteDebug_ToConsole("lines.Count=[" + argumentlines.Length + "]");
                int paramsBySet = this.ListDefinitionParameterline.Count;
                //log_Method.WriteDebug_ToConsole("paramsBySet=[" + paramsBySet + "]");

                //引数を定義している場合。
                if (0 < paramsBySet)
                {
                    // 定義部の先頭行を0とした行番号。
                    int rowDefinition = 0;
                    // 入力部の先頭行を0とした行番号。
                    int rowArgument = 0;


                    int sizeArgumentlines = argumentlines.Length;
                    while (rowArgument < sizeArgumentlines)
                    {
                        string argumentline = argumentlines[rowArgument].TrimEnd('\r', '\n');//行末の改行をchompします。
                        if ((rowArgument + 1) == sizeArgumentlines && "" == argumentline)
                        {
                            //最後の改行は無かったことにします。

                            if (0 < rowDefinition)
                            {
                                //中途半端なところで引数セットが終わった。
                                sizeOfSet++;
                                rowDefinition = 0;
                                //log_Method.WriteDebug_ToConsole("★6★行番号(" + indexArgumentline + "/" + sizeArgumentlines + "):(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。★最後の改行は無かったことにしますが、端数があるのでセットは1つ増やします。sizeOfSet=[" + sizeOfSet + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("★1★行番号(" + indexArgumentline + "/" + sizeArgumentlines + "):(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。★最後の改行は無かったことにします。sizeOfSet=[" + sizeOfSet + "]");
                            }

                            break;
                        }
                        else
                        {
                            DefinitionParameterlineImpl currentParam = this.ListDefinitionParameterline[rowDefinition];
                            int previousNumberLine = currentParam.NumberLine;

                            currentParam.AddArgumentline(argumentline);
                            //log_Method.WriteDebug_ToConsole("★2★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");

                            for (; (rowDefinition + 1) < paramsBySet; rowDefinition++)
                            {
                                DefinitionParameterlineImpl nextParam = this.ListDefinitionParameterline[rowDefinition + 1];
                                if (previousNumberLine == nextParam.NumberLine)
                                {
                                    //同じ行番号が続いていれば。

                                    nextParam.AddArgumentline(argumentline);
                                    //log_Method.WriteDebug_ToConsole("★3★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");
                                }
                                else
                                {
                                    //同じ行番号は続いていない。
                                    //log_Method.WriteDebug_ToConsole("★5★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): ★break。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");
                                    break;
                                }
                            }
                        }

                        rowDefinition++;
                        if (paramsBySet <= rowDefinition)
                        {
                            //引数が1セット分終わった。
                            sizeOfSet++;
                            rowDefinition = 0;
                            //log_Method.WriteDebug_ToConsole("★4★引数が1セット分終わった。sizeOfSet=[" + sizeOfSet + "]");
                        }

                        rowArgument++;
                    }
                    //log_Method.WriteDebug_ToConsole("★7★ループから抜けた。引数リストの要素数にインデックスの数が達したので。indexArgumentline=[" + indexArgumentline + "] sizeArgumentlines=[" + sizeArgumentlines + "] sizeOfSet=[" + sizeOfSet + "]");

                    if (sizeOfSet == 0 && sizeArgumentlines < this.ListDefinitionParameterline.Count)
                    {
                        //log_Method.WriteDebug_ToConsole("★8★ sizeOfSetが0で、入力引数の数が、定義引数の数にそもそも足りていなければ、sizeOfSetを1にします。 前sizeOfSet=[" + sizeOfSet + "]");
                        sizeOfSet = 1;
                    }
                }
            }
            //gt_EndLoop_Input:

            //「定義セット」の数だけ、繰り返してテンプレートを適用します。
            {
                //一行につなげるかどうか。
                bool isSingleline;
                {
                    OptionlineTemplateImpl optionOneline;
                    if (this.DictionaryOptionline.TryGetValue("SingleLine", out optionOneline))
                    {
                        bool temp;
                        if (bool.TryParse(optionOneline.Value, out temp))
                        {
                            isSingleline = temp;
                        }
                        else
                        {
                            isSingleline = false;
                        }
                    }
                    else
                    {
                        isSingleline = false;
                    }
                }
                //log_Method.WriteDebug_ToConsole("isSingleline=[" + isSingleline + "]");

                if (!textdroparea1.IsDropped)
                {
                    result.Append("次は、左上の青い欄にテンプレートもドラッグ&ドロップしてください。");
                    result.Append(Environment.NewLine);
                    result.Append("(エンコーディングは UTF-8 にするのも忘れずに)");
                }
                else if (!textdroparea2.IsDropped)
                {
                    result.Append("次は、右上の緑色の欄にインプットもドラッグ&ドロップしてください。");
                    result.Append(Environment.NewLine);
                    result.Append("(エンコーディングは UTF-8 にするのも忘れずに)");
                }
                else if (0 == this.ListDefinitionParameterline.Count)
                {
                    //エラー
                    result.Append("インプットエラー:「反復入力行セット定義」のセット数が 0 件でした。");
                    isError = true;
                }
                else
                {
                    //log_Method.WriteDebug_ToConsole("sizeOfSet=[" + sizeOfSet + "]");
                    for (int currentSet = 0; currentSet < sizeOfSet; currentSet++)
                    {
                        string resultText = this.Template;
                        int    countParam = this.ListDefinitionParameterline.Count;
                        //log_Method.WriteDebug_ToConsole("countParam=[" + countParam + "]");
                        for (int paramNum = 0; paramNum < countParam; paramNum++)
                        {
                            DefinitionParameterlineImpl parameterline = this.ListDefinitionParameterline[paramNum];

                            string nameParam    = parameterline.NameParameter;
                            string matchPattern = bracketBegin + nameParam + bracketEnd;
                            //log_Method.WriteDebug_ToConsole("matchPattern=[" + matchPattern + "] nameParam=[" + nameParam + "]");
                            Regex replacer = new Regex(matchPattern, RegexOptions.Compiled & RegexOptions.Multiline);

                            string argument;
                            if (currentSet < parameterline.CountArgumentlines())
                            {
                                argument = parameterline.GetArgumentBySet(currentSet, log_Reports);
                            }
                            else
                            {
                                //エラー
                                argument = "★★★★エラー:引数の数が1セット分に足りない。セット数(" + (currentSet + 1) + "/" + (sizeOfSet + 1) + ") 引数番号[" + paramNum + "]入力argumentなし=(" + parameterline.CountArgumentlines() + ")★★★★";
                                isError  = true;
                            }
                            resultText = replacer.Replace(resultText, argument);
                            //log_Method.WriteDebug_ToConsole("matchPattern=[" + matchPattern + "]を→argument=[" + argument + "]に置換しました。currentSet=[" + currentSet + "]/[" + sizeOfSet + "] paramNum=[" + paramNum + "]/[" + countParam + "] resultText=[" + resultText + "]");
                        }

                        result.Append(resultText);
                        if (isSingleline)
                        {
                            //改行を入れません。
                            //log_Method.WriteDebug_ToConsole("★改行を入れません。");
                        }
                        else
                        {
                            //log_Method.WriteDebug_ToConsole("★改行をいれました。isSingleline=[" + isSingleline + "]");
                            result.Append(Environment.NewLine);
                        }
                    }
                }
            }

            goto gt_EndMethod;
            //
gt_EndMethod:
            log_Method.EndMethod(log_Reports);
            return(result.ToString());
        }
Exemplo n.º 2
0
        //────────────────────────────────────────
        public string Perform(out bool isError, TextdropareaImpl textdroparea1, TextdropareaImpl textdroparea2, Log_Reports log_Reports)
        {
            Log_Method log_Method = new Log_MethodImpl();
            log_Method.BeginMethod(Info_SpeedCoder.Name_Library, this, "Perform", log_Reports);

            isError = false;
            this.ListDefinitionParameterline.Clear();

            StringBuilder result = new StringBuilder();
            string template;
            if (1 <= textdroparea1.ListFilepath.Count)
            {
                if (System.IO.File.Exists(textdroparea1.ListFilepath[0]))
                {
                    template = System.IO.File.ReadAllText(textdroparea1.ListFilepath[0], Encoding.UTF8);
                }
                else
                {
                    template = "";
                }
            }
            else
            {
                template = "";
            }
            //log_Method.WriteDebug_ToConsole("template=[" + template + "]");

            string argumentfile;
            if (1 <= textdroparea2.ListFilepath.Count)
            {
                if (System.IO.File.Exists(textdroparea2.ListFilepath[0]))
                {
                    argumentfile = System.IO.File.ReadAllText(textdroparea2.ListFilepath[0], Encoding.UTF8);
                }
                else
                {
                    argumentfile = "";
                }
            }
            else if ("" != textdroparea2.DroppedText)
            {
                argumentfile = textdroparea2.DroppedText;
            }
            else
            {
                argumentfile = "";
            }
            //log_Method.WriteDebug_ToConsole("input=[" + input + "]");

            //テンプレートの解析
            string bracketBegin = "";//デフォルトでは「<<<<」で説明。正規表現で利用されている魔法の文字([]+*?$等色々)は使わないこと。
            string bracketEnd = "";//デフォルトでは「>>>>」で説明。正規表現で利用されている魔法の文字([]+*?$等色々)は使わないこと。
            {
                this.ListDefinitionParameterline.Clear();
                int phase = 0;
                //  0: 「<<<<タイトルここから>>>>」を探す。その間無視。
                //  1: 「<<<<タイトルここまで>>>>」が出てくるまでがタイトル。
                //  2: 「<<<<説明ここから>>>>」が出てくるまで探す。その間無視。
                //  3: 「<<<<説明ここまで>>>>」が出てくるまでが説明。
                //  4: 「<<<<反復入力行セット定義ここから>>>>」を探す。その間無視。
                //  5: 「<<<<反復入力行セット定義ここまで>>>>」が出てくるまでがタイトル。
                //  6: 「<<<<テンプレートここから>>>>」を探す。その間無視。
                //  7: 「<<<<テンプレートここまで>>>>」が出てくるまでがタイトル。
                //  8: 「<<<<オプションここから>>>>」を探す。その間無視。
                //  9: 「<<<<オプションここまで>>>>」が出てくるまでがタイトル。
                // 10: 終了します。
                string[] symbols = null;

                StringBuilder sbTitle = new StringBuilder();
                StringBuilder sbExplain = new StringBuilder();
                int previousParamNumber = 0;
                StringBuilder sbTemplate = new StringBuilder();
                string[] lines = template.Split(new string[] {Environment.NewLine },StringSplitOptions.None);
                int numberLine = 1;
                foreach (string line in lines)
                {

                    if (3 <= numberLine)
                    {
                        if(null==symbols)
                        {
                            symbols = new string[]
                            {
                                bracketBegin + "タイトルここから" + bracketEnd,
                                bracketBegin + "タイトルここまで" + bracketEnd,
                                bracketBegin + "説明ここから" + bracketEnd,
                                bracketBegin + "説明ここまで" + bracketEnd,
                                bracketBegin + "反復入力行セット定義ここから" + bracketEnd,
                                bracketBegin + "反復入力行セット定義ここまで" + bracketEnd,
                                bracketBegin + "テンプレートここから" + bracketEnd,
                                bracketBegin + "テンプレートここまで" + bracketEnd,
                                bracketBegin + "オプションここから" + bracketEnd,
                                bracketBegin + "オプションここまで" + bracketEnd
                            };
                        }

                        switch (phase)
                        {
                            case 0:
                                //「<<<<タイトルここから>>>>」
                                {
                                    if (symbols[0] == line.Trim())
                                    {
                                        phase = 1;
                                        //log_Method.WriteDebug_ToConsole("(0a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        //log_Method.WriteDebug_ToConsole("(0b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 1:
                                //「<<<<タイトルここまで>>>>」
                                {
                                    if (symbols[1] == line.Trim())
                                    {
                                        phase = 2;
                                        //log_Method.WriteDebug_ToConsole("(1a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        if (0 < sbTitle.Length)
                                        {
                                            //文字をつなげる場合は、改行を入れます。
                                            sbTitle.Append(Environment.NewLine);
                                        }
                                        sbTitle.Append(line);
                                        //最後に改行が付いていないようにします。

                                        //log_Method.WriteDebug_ToConsole("(1b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 2:
                                //「<<<<説明ここから>>>>」
                                {
                                    if (symbols[2] == line.Trim())
                                    {
                                        phase = 3;
                                        //log_Method.WriteDebug_ToConsole("(2a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        //log_Method.WriteDebug_ToConsole("(2b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 3:
                                //「<<<<説明ここまで>>>>」
                                {
                                    if (symbols[3] == line.Trim())
                                    {
                                        phase = 4;
                                        //log_Method.WriteDebug_ToConsole("(3a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        if (0 < sbExplain.Length)
                                        {
                                            //文字をつなげる場合は、改行を入れます。
                                            sbExplain.Append(Environment.NewLine);
                                        }
                                        sbExplain.Append(line);
                                        //最後に改行が付いていないようにします。
                                        //log_Method.WriteDebug_ToConsole("(3b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 4:
                                //「<<<<反復入力行セット定義ここから>>>>」
                                {
                                    if (symbols[4] == line.Trim())
                                    {
                                        phase = 5;
                                        //log_Method.WriteDebug_ToConsole("(4a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        //log_Method.WriteDebug_ToConsole("(4b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 5:
                                {
                                    //「<<<<反復入力行セット定義ここまで>>>>」
                                    if (symbols[5] == line.Trim())
                                    {
                                        phase = 6;
                                        //log_Method.WriteDebug_ToConsole("(5a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        DefinitionParameterlineImpl definition = new DefinitionParameterlineImpl();
                                        definition.Parse(out isError, line, previousParamNumber);
                                        if (isError)
                                        {
                                            //エラー
                                            //log_Method.WriteDebug_ToConsole(definition.Comment);
                                            result.Append(definition.Comment);
                                            goto gt_EndMethod;
                                        }
                                        this.ListDefinitionParameterline.Add(definition);
                                        //log_Method.WriteDebug_ToConsole("(5b) line=[" + line + "] numberDefinitionline=[" + numberDefinitionline + "] パースしたか? 変数名=[" + definition.NameParameter + "]");
                                        previousParamNumber = definition.NumberLine;
                                    }
                                }
                                break;
                            case 6:
                                //「<<<<テンプレートここから>>>>」
                                {
                                    if (symbols[6] == line.Trim())
                                    {
                                        phase = 7;
                                        //log_Method.WriteDebug_ToConsole("(6a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        //log_Method.WriteDebug_ToConsole("(6b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 7:
                                //「<<<<テンプレートここまで>>>>」
                                {
                                    if (symbols[7] == line.Trim())
                                    {
                                        phase = 8;
                                        //log_Method.WriteDebug_ToConsole("(7a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        if (0<sbTemplate.Length)
                                        {
                                            //文字をつなげる場合は、改行を入れます。
                                            sbTemplate.Append(Environment.NewLine);
                                        }
                                        sbTemplate.Append(line);
                                        //最後に改行が付いていないようにします。
                                        //log_Method.WriteDebug_ToConsole("(7b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 8:
                                //「<<<<オプションここから>>>>」
                                {
                                    if (symbols[8] == line.Trim())
                                    {
                                        phase = 9;
                                        //log_Method.WriteDebug_ToConsole("(6a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        //log_Method.WriteDebug_ToConsole("(6b) line=[" + line + "]");
                                    }
                                }
                                break;
                            case 9:
                                //「<<<<オプションここまで>>>>」
                                {
                                    if (symbols[9] == line.Trim())
                                    {
                                        phase = 10;
                                        //log_Method.WriteDebug_ToConsole("(9a) line=[" + line + "]");
                                    }
                                    else
                                    {
                                        OptionlineTemplateImpl optionline = new OptionlineTemplateImpl();
                                        optionline.Parse( line);
                                        this.DictionaryOptionline.Add(optionline.NameOption,optionline);
                                        //log_Method.WriteDebug_ToConsole("(9b) line=[" + line + "] オプションのはず。名=[" + optionline.NameOption + "] 値=[" + optionline.Value + "] コメント=[" + optionline.Comment + "]");
                                    }
                                }
                                break;
                            default:
                                {
                                    //log_Method.WriteDebug_ToConsole("(8) line=[" + line + "]");
                                    goto gt_EndLoop;
                                }
                        }
                    }
                    else if (1 == numberLine)
                    {
                        bracketBegin = line.Trim();
                        //log_Method.WriteDebug_ToConsole("(1行目) line=[" + line + "]");
                    }
                    else if (2 == numberLine)
                    {
                        bracketEnd = line.Trim();
                        //log_Method.WriteDebug_ToConsole("(2行目) line=[" + line + "]");
                    }

                    numberLine++;
                }
            gt_EndLoop:

                this.Title = sbTitle.ToString().TrimEnd('\r', '\n');//末尾の改行をchompします。
                this.Explain = sbTitle.ToString().TrimEnd('\r', '\n');//末尾の改行をchompします。
                this.Template = sbTemplate.ToString().TrimEnd('\r','\n');//末尾の改行をchompします。
            }

            //入力値をセットに分ける。
            //最後の改行はカットします。
            int sizeOfSet = 0;//0スタート配列のサイズ。セットの最後の番号。1セット目は 0。
            {
                string[] argumentlines = argumentfile.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                //log_Method.WriteDebug_ToConsole("lines.Count=[" + argumentlines.Length + "]");
                int paramsBySet = this.ListDefinitionParameterline.Count;
                //log_Method.WriteDebug_ToConsole("paramsBySet=[" + paramsBySet + "]");

                //引数を定義している場合。
                if (0 < paramsBySet)
                {
                    // 定義部の先頭行を0とした行番号。
                    int rowDefinition = 0;
                    // 入力部の先頭行を0とした行番号。
                    int rowArgument = 0;

                    int sizeArgumentlines = argumentlines.Length;
                    while ( rowArgument<sizeArgumentlines)
                    {
                        string argumentline = argumentlines[rowArgument].TrimEnd('\r', '\n');//行末の改行をchompします。
                        if ((rowArgument+1) == sizeArgumentlines && "" == argumentline)
                        {
                            //最後の改行は無かったことにします。

                            if (0 < rowDefinition)
                            {
                                //中途半端なところで引数セットが終わった。
                                sizeOfSet++;
                                rowDefinition = 0;
                                //log_Method.WriteDebug_ToConsole("★6★行番号(" + indexArgumentline + "/" + sizeArgumentlines + "):(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。★最後の改行は無かったことにしますが、端数があるのでセットは1つ増やします。sizeOfSet=[" + sizeOfSet + "]");
                            }
                            else
                            {
                                //log_Method.WriteDebug_ToConsole("★1★行番号(" + indexArgumentline + "/" + sizeArgumentlines + "):(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。★最後の改行は無かったことにします。sizeOfSet=[" + sizeOfSet + "]");
                            }

                            break;
                        }
                        else
                        {
                            DefinitionParameterlineImpl currentParam = this.ListDefinitionParameterline[rowDefinition];
                            int previousNumberLine = currentParam.NumberLine;

                            currentParam.AddArgumentline(argumentline);
                            //log_Method.WriteDebug_ToConsole("★2★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");

                            for (; (rowDefinition + 1) < paramsBySet; rowDefinition++)
                            {
                                DefinitionParameterlineImpl nextParam = this.ListDefinitionParameterline[rowDefinition+1];
                                if (previousNumberLine == nextParam.NumberLine)
                                {
                                    //同じ行番号が続いていれば。

                                    nextParam.AddArgumentline(argumentline);
                                    //log_Method.WriteDebug_ToConsole("★3★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): line=[" + argumentline + "]を引数リストに追加。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");
                                }
                                else
                                {
                                    //同じ行番号は続いていない。
                                    //log_Method.WriteDebug_ToConsole("★5★" + indexArgumentline + ":(" + parameterIndex + "/" + paramsBySet + "): ★break。size(" + currentParam.CountArgumentlines() + ") sizeOfSet=[" + sizeOfSet + "]");
                                    break;
                                }
                            }
                        }

                        rowDefinition++;
                        if (paramsBySet <= rowDefinition)
                        {
                            //引数が1セット分終わった。
                            sizeOfSet++;
                            rowDefinition = 0;
                            //log_Method.WriteDebug_ToConsole("★4★引数が1セット分終わった。sizeOfSet=[" + sizeOfSet + "]");
                        }

                        rowArgument++;
                    }
                    //log_Method.WriteDebug_ToConsole("★7★ループから抜けた。引数リストの要素数にインデックスの数が達したので。indexArgumentline=[" + indexArgumentline + "] sizeArgumentlines=[" + sizeArgumentlines + "] sizeOfSet=[" + sizeOfSet + "]");

                    if (sizeOfSet==0 && sizeArgumentlines < this.ListDefinitionParameterline.Count)
                    {
                        //log_Method.WriteDebug_ToConsole("★8★ sizeOfSetが0で、入力引数の数が、定義引数の数にそもそも足りていなければ、sizeOfSetを1にします。 前sizeOfSet=[" + sizeOfSet + "]");
                        sizeOfSet = 1;
                    }
                }
            }
            //gt_EndLoop_Input:

            //「定義セット」の数だけ、繰り返してテンプレートを適用します。
            {
                //一行につなげるかどうか。
                bool isSingleline;
                {
                    OptionlineTemplateImpl optionOneline;
                    if (this.DictionaryOptionline.TryGetValue("SingleLine", out optionOneline))
                    {
                        bool temp;
                        if (bool.TryParse(optionOneline.Value, out temp))
                        {
                            isSingleline = temp;
                        }
                        else
                        {
                            isSingleline = false;
                        }
                    }
                    else
                    {
                        isSingleline = false;
                    }
                }
                //log_Method.WriteDebug_ToConsole("isSingleline=[" + isSingleline + "]");

                if (!textdroparea1.IsDropped)
                {
                    result.Append("次は、左上の青い欄にテンプレートもドラッグ&ドロップしてください。");
                    result.Append(Environment.NewLine);
                    result.Append("(エンコーディングは UTF-8 にするのも忘れずに)");
                }
                else if (!textdroparea2.IsDropped)
                {
                    result.Append("次は、右上の緑色の欄にインプットもドラッグ&ドロップしてください。");
                    result.Append(Environment.NewLine);
                    result.Append("(エンコーディングは UTF-8 にするのも忘れずに)");
                }
                else if (0 == this.ListDefinitionParameterline.Count)
                {
                    //エラー
                    result.Append("インプットエラー:「反復入力行セット定義」のセット数が 0 件でした。");
                    isError = true;
                }
                else
                {
                    //log_Method.WriteDebug_ToConsole("sizeOfSet=[" + sizeOfSet + "]");
                    for (int currentSet = 0; currentSet < sizeOfSet; currentSet++)
                    {
                        string resultText = this.Template;
                        int countParam = this.ListDefinitionParameterline.Count;
                        //log_Method.WriteDebug_ToConsole("countParam=[" + countParam + "]");
                        for (int paramNum = 0; paramNum < countParam; paramNum++)
                        {
                            DefinitionParameterlineImpl parameterline = this.ListDefinitionParameterline[paramNum];

                            string nameParam = parameterline.NameParameter;
                            string matchPattern = bracketBegin + nameParam + bracketEnd;
                            //log_Method.WriteDebug_ToConsole("matchPattern=[" + matchPattern + "] nameParam=[" + nameParam + "]");
                            Regex replacer = new Regex(matchPattern, RegexOptions.Compiled & RegexOptions.Multiline);

                            string argument;
                            if (currentSet < parameterline.CountArgumentlines())
                            {
                                argument = parameterline.GetArgumentBySet(currentSet,log_Reports);
                            }
                            else
                            {
                                //エラー
                                argument = "★★★★エラー:引数の数が1セット分に足りない。セット数(" + (currentSet+1) + "/" + (sizeOfSet+1) + ") 引数番号[" + paramNum + "]入力argumentなし=(" + parameterline.CountArgumentlines() + ")★★★★";
                                isError = true;
                            }
                            resultText = replacer.Replace(resultText, argument);
                            //log_Method.WriteDebug_ToConsole("matchPattern=[" + matchPattern + "]を→argument=[" + argument + "]に置換しました。currentSet=[" + currentSet + "]/[" + sizeOfSet + "] paramNum=[" + paramNum + "]/[" + countParam + "] resultText=[" + resultText + "]");
                        }

                        result.Append(resultText);
                        if (isSingleline)
                        {
                            //改行を入れません。
                            //log_Method.WriteDebug_ToConsole("★改行を入れません。");
                        }
                        else
                        {
                            //log_Method.WriteDebug_ToConsole("★改行をいれました。isSingleline=[" + isSingleline + "]");
                            result.Append(Environment.NewLine);
                        }
                    }
                }
            }

            goto gt_EndMethod;
            //
            gt_EndMethod:
            log_Method.EndMethod(log_Reports);
            return result.ToString();
        }