/// <summary> /// 項目の文字長に関する警告を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// 項目の文字長に関する警告を返します。 /// </returns> private List <ReplacingNameWarning> GetLengthWarnings(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); warnings.AddRange(GetOverlengthWarnings(property)); warnings.AddRange(GetUnderlengthWarnings(property)); return(warnings); }
/// <summary> /// 処理に必要な情報の入力をビューに要求します。 /// </summary> /// <param name="property">入力を要求するプロパティ。</param> private void SetProperty(ReplacingNameWarning.Property property) { var retry = true; while (retry) { switch (property) { case ReplacingNameWarning.Property.FilePath: Model.FilePath = View.Require("ファイルパス"); break; case ReplacingNameWarning.Property.OldFirstName: Model.OldFirstName = View.Require("古い1番目の名前"); break; case ReplacingNameWarning.Property.NewFirstName: Model.NewFirstName = View.Require("新しい1番目の名前"); break; case ReplacingNameWarning.Property.OldSecondName: Model.OldSecondName = View.Require("古い2番目の名前"); break; case ReplacingNameWarning.Property.NewSecondName: Model.NewSecondName = View.Require("新しい2番目の名前"); break; default: return; } var warnings = Model.GetWarnings().Where(x => x.TargetProperty == property); //許容できないエラー var notAllowed = warnings.Where(x => x.Level == ReplacingNameWarning.WarningLevel.NotAllowed); if (notAllowed.Count() > 0) { View.ShowWarning(notAllowed.First().Message); continue; } //警告すべきエラー var notRecomended = warnings.Where(x => x.Level == ReplacingNameWarning.WarningLevel.NotRecomended); if (notRecomended.Count() > 0) { retry = !ConfirmAllWarnings(notRecomended); continue; } //入力を確定 retry = false; } }
/// <summary> /// 項目が最小文字長より少ない場合の警告を取得する。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns>警告。</returns> private List <ReplacingNameWarning> GetUnderlengthWarnings(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); var value = GetValue(property); if (value.Length < 1) { warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotAllowed, Message = "1文字以上で入力してください。" }); } return(warnings); }
/// <summary> /// 項目が最大文字長を超えている場合の警告を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// 項目の最大文字長超過の警告を返します。 /// </returns> private List <ReplacingNameWarning> GetOverlengthWarnings(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); var value = GetValue(property); var maxLength = GetMaxLength(property); if (value.Length > maxLength) { warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotAllowed, Message = string.Format("{0}文字以内で入力してください。", maxLength) }); } return(warnings); }
/// <summary> /// 警告プロパティに対応した最大文字長を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// プロパティの最大文字長を返します。 /// </returns> private int GetMaxLength(ReplacingNameWarning.Property property) { var maxLength = 0; switch (property) { case ReplacingNameWarning.Property.OldFirstName: case ReplacingNameWarning.Property.NewFirstName: maxLength = 10; break; case ReplacingNameWarning.Property.OldSecondName: case ReplacingNameWarning.Property.NewSecondName: maxLength = 19; break; } return(maxLength); }
/// <summary> /// 文字化けに関する警告を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// 文字化けの発生が見込まれる場合、警告を返します。 /// </returns> private List <ReplacingNameWarning> GetTextCorruptionWarnings(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); switch (property) { case ReplacingNameWarning.Property.OldFirstName: case ReplacingNameWarning.Property.NewFirstName: addWarningIfLengthsAreNotSame(this.OldFirstName, this.NewFirstName); break; case ReplacingNameWarning.Property.OldSecondName: case ReplacingNameWarning.Property.NewSecondName: addWarningIfLengthsAreNotSame(this.OldSecondName, this.NewSecondName); break; } return(warnings); void addWarningIfLengthsAreNotSame(string value1, string value2) { if (string.IsNullOrEmpty(value1) || string.IsNullOrEmpty(value2)) { return; } if (value1.Length != value2.Length) { var message = "置換前後の名前の文字数が異なります。" + "名前が正しく表示されないことがあります。"; warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotRecomended, Message = message }); } } }
/// <summary> /// ファイルの置換対象が存在しない・複数存在する場合の警告を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// 置換対象に関する警告を返します。 /// </returns> private List <ReplacingNameWarning> GetUnintentionalReplacingWarnings(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); var value = GetValue(property); if (this.FileContents == null) { // ファイルパスの指定前に反映しない return(warnings); } var count = this.FileContents.Count(value); if (count == 0) { var message = string.Format("[{0}]は対象のファイル内に存在しません。", this.OldFirstName); warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotRecomended, Message = message }); } else if (count > 1) { var message = string.Format( "[{0}]は{1}箇所で発見される表現です。" + "このまま処理するとファイルが破損する恐れがあります。", this.OldFirstName, count); warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotRecomended, Message = message }); } return(warnings); }
/// <summary> /// 警告プロパティに対応した内容を取得します。 /// </summary> /// <param name="property">対象プロパティ。</param> /// <returns> /// プロパティの内容を返します。 /// </returns> private string GetValue(ReplacingNameWarning.Property property) { var value = string.Empty; switch (property) { case ReplacingNameWarning.Property.OldFirstName: value = this.OldFirstName; break; case ReplacingNameWarning.Property.NewFirstName: value = this.NewFirstName; break; case ReplacingNameWarning.Property.OldSecondName: value = this.OldSecondName; break; case ReplacingNameWarning.Property.NewSecondName: value = this.NewSecondName; break; } return(value ?? string.Empty); }
/// <summary> /// 置換対象の組合せで、意図しない置換が行われる場合の警告を取得します。 /// </summary> /// <remarks> /// 置換処理は2番目の名前から行われる関係上、2番目の置換対象に1番目の内容を含んでいると /// 本来1番目として置換されるべき表現が2番目の置換時に処理され、1番目の置換が行われません。 /// </remarks> /// <param name="property">対象プロパティ。</param> /// <returns> /// 意図しない置換が発生する場合、警告を返します。 /// </returns> private List <ReplacingNameWarning> GetUnintentionalReplaceingWarningsBetweenOlds(ReplacingNameWarning.Property property) { var warnings = new List <ReplacingNameWarning>(); if (string.IsNullOrEmpty(this.OldFirstName) || string.IsNullOrEmpty(this.OldSecondName) || this.FileContents == null) { // 判定に必要な要素が指定される前に判定しない return(warnings); } var firstBytes = Encoding.Unicode.GetBytes(this.OldFirstName); var countFirstIncludingSecond = firstBytes.Count(this.OldSecondName); var countFileIncludingFirst = this.FileContents.Count(this.OldFirstName); if (countFirstIncludingSecond > 1 && countFileIncludingFirst > 0) { var message = "古い1番目の名前は2番目の名前を含んでいます。" + "意図しない名称の置換が行われる可能性があります。"; warnings.Add(new ReplacingNameWarning() { TargetProperty = property, Level = ReplacingNameWarning.WarningLevel.NotRecomended, Message = message }); } return(warnings); }