//──────────────────────────────────────── private void Usercontrol_Canvas_DragDrop(object sender, DragEventArgs e) { Log_Method log_Method = new Log_MethodImpl(); Log_Reports log_Reports = new Log_ReportsImpl(log_Method); log_Method.BeginMethod(Info_SpeedCoder.Name_Library, this, "Usercontrol_Canvas_DragDrop", log_Reports); Point locationMouse = this.PointToClient(new Point(e.X, e.Y)); bool isDropped = false; if (e.Data.GetDataPresent(DataFormats.FileDrop)) { // ファイルドロップ TextdropareaImpl droppedArea = null; string[] fileNames = (string[])e.Data.GetData(DataFormats.FileDrop, false); if (this.Textdroparea1.Bounds.Contains(locationMouse.X, locationMouse.Y)) { droppedArea = this.Textdroparea1; } if (this.Textdroparea2.Bounds.Contains(locationMouse.X, locationMouse.Y)) { droppedArea = this.Textdroparea2; } if (null != droppedArea) { droppedArea.IsDropped = true; droppedArea.Clear(); //log_Method.WriteDebug_ToConsole("ファイルをドロップした。 fileNames.length=[" + fileNames.Length + "]"); foreach (string fileName in fileNames) { droppedArea.ListFilepath.Add(fileName); //log_Method.WriteDebug_ToConsole("fileName=[" + fileName + "]"); } isDropped = true; } else { //log_Method.WriteDebug_ToConsole("ファイルをドロップしたが、枠には入っていない。 fileNames.length=[" + fileNames.Length + "]"); } } else if (e.Data.GetDataPresent(DataFormats.StringFormat)) { // 文字列として読み取れる形式のデータがドロップされた場合、 // テキストボックスに、その文字列データを表示します。 string droppedText = (string)e.Data.GetData(typeof(string)); TextdropareaImpl droppedArea = null; if (this.Textdroparea1.Bounds.Contains(locationMouse.X, locationMouse.Y)) { droppedArea = this.Textdroparea1; } if (this.Textdroparea2.Bounds.Contains(locationMouse.X, locationMouse.Y)) { droppedArea = this.Textdroparea2; } if (null != droppedArea) { droppedArea.IsDropped = true; droppedArea.Clear(); droppedArea.DroppedText = droppedText; isDropped = true; } } else { //log_Method.WriteDebug_ToConsole("ファイル以外のものをドロップした。"); } if (isDropped) { //log_Method.WriteDebug_ToConsole("ドロップがあったとき。"); SpeedCodingImpl speedCoding = new SpeedCodingImpl(); bool isError; string result = speedCoding.Perform(out isError, this.Textdroparea1, this.Textdroparea2, log_Reports); this.textBox1.Text = result; if (isError) { this.textBox1.ForeColor = Color.Red; } else { this.textBox1.ForeColor = SystemColors.ControlText; } this.Refresh(); } //log_Method.WriteDebug_ToConsole("locationMouse.X=[" + locationMouse.X + "] .Y=[" + locationMouse.Y + "]"); //log_Method.WriteDebug_ToConsole("this.Textdroparea1.Bounds=[" + this.Textdroparea1.Bounds.X + "][" + this.Textdroparea1.Bounds.Y + "][" + this.Textdroparea1.Bounds.Width + "][" + this.Textdroparea1.Bounds.Height + "]"); //log_Method.WriteDebug_ToConsole("this.Textdroparea2.Bounds=[" + this.Textdroparea2.Bounds.X + "][" + this.Textdroparea2.Bounds.Y + "][" + this.Textdroparea2.Bounds.Width + "][" + this.Textdroparea2.Bounds.Height + "]"); log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── 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(); }
//──────────────────────────────────────── #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()); }
//──────────────────────────────────────── private void Usercontrol_Canvas_Load(object sender, EventArgs e) { this.Textdroparea1 = new TextdropareaImpl(); this.Textdroparea1.Bounds = new Rectangle(10, 10, 280, 140); this.Textdroparea1.ForegroundBrush = Brushes.Blue; this.Textdroparea1.BackgroundBrush = Brushes.SkyBlue; this.Textdroparea1.BorderPen = Pens.Blue; this.Textdroparea1.BackgroundMessage = "Template"; this.Textdroparea1.ListMessageA.Add("ここにテンプレートを書いたテキストファイル(.txt)を"); this.Textdroparea1.ListMessageA.Add("ドラッグ&ドロップしてください。"); this.Textdroparea1.ListMessageA.Add("(エンコーディングは UTF-8 にしてください)"); this.Textdroparea1.ListMessageB.Add("テンプレートを書いたテキストファイル"); this.Textdroparea1.Font = this.Font; this.Textdroparea2 = new TextdropareaImpl(); this.Textdroparea2.Bounds = new Rectangle(300, 10, 280, 140); this.Textdroparea2.ForegroundBrush = Brushes.Green; this.Textdroparea2.BackgroundBrush = Brushes.GreenYellow; this.Textdroparea2.BorderPen = Pens.Green; this.Textdroparea2.BackgroundMessage = "Argument"; this.Textdroparea2.ListMessageA.Add("ここに入力引数を書いたテキストファイル(.txt)を"); this.Textdroparea2.ListMessageA.Add("ドラッグ&ドロップしてください。"); this.Textdroparea2.ListMessageA.Add("(エンコーディングは UTF-8 にしてください)"); this.Textdroparea2.ListMessageB.Add("入力引数を書いたテキストファイル"); this.Textdroparea2.Font = this.Font; }