Пример #1
0
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="id">パラメータID。</param>
        /// <param name="displayName">表示名。</param>
        /// <param name="digits">小数部の桁数。</param>
        /// <param name="defaultValue">既定値。</param>
        /// <param name="minValue">最小許容値。</param>
        /// <param name="maxValue">最大許容値。</param>
        public ParameterInfo(
            TId id,
            string displayName,
            int digits           = 0,
            decimal defaultValue = 0,
            decimal minValue     = 0,
            decimal maxValue     = decimal.MaxValue)
        {
            ArgumentValidation.IsEqualsOrGreaterThan(digits, 0, nameof(digits));
            if (minValue > maxValue)
            {
                throw new ArgumentException(@"minValue > maxValue");
            }
            ArgumentValidation.IsWithinRange(
                defaultValue,
                minValue,
                maxValue,
                nameof(defaultValue));

            this.Id           = id;
            this.DisplayName  = displayName;
            this.Digits       = digits;
            this.DefaultValue = defaultValue;
            this.MinValue     = minValue;
            this.MaxValue     = maxValue;
        }
Пример #2
0
        /// <summary>
        /// ファイルパスをVOICEROID2の連番ファイルパスに変更する。
        /// </summary>
        /// <param name="filePath">ファイルパス。 null や空文字列であってはならない。</param>
        /// <param name="index">連番インデックス。負数であってはならない。</param>
        /// <returns>連番ファイルパス。</returns>
        /// <remarks>
        /// 拡張子種別を問わず、拡張子の直前に ("-" + index) を挿入する。
        /// </remarks>
        public static string ToSequential(string filePath, int index)
        {
            ArgumentValidation.IsNotNullOrEmpty(filePath, nameof(filePath));
            ArgumentValidation.IsEqualsOrGreaterThan(index, 0, nameof(index));

            return
                (Path.Combine(
                     Path.GetDirectoryName(filePath),
                     Path.GetFileNameWithoutExtension(filePath) +
                     @"-" +
                     index +
                     Path.GetExtension(filePath)));
        }
Пример #3
0
        /// <summary>
        /// 行頭のインデントを最小幅分だけ除去した文字列を作成する。
        /// </summary>
        /// <param name="source">対象文字列。</param>
        /// <param name="tabWidth">タブ文字幅。 1 以上でなければならない。</param>
        /// <param name="newLine">改行文字列。通常は既定値 "\n" のままで問題ない。</param>
        /// <returns>作成した文字列。</returns>
        public static string StripIndent(
            this string source,
            int tabWidth   = 4,
            string newLine = "\n")
        {
            ArgumentValidation.IsNotNull(source, nameof(source));
            ArgumentValidation.IsEqualsOrGreaterThan(tabWidth, 1, nameof(tabWidth));
            ArgumentValidation.IsNotNull(newLine, nameof(newLine));

            // 改行で分割
            var lines = source.Split(new[] { newLine }, StringSplitOptions.None);

            if (lines.Length <= 0)
            {
                return(source);
            }

            // 最小インデント幅決定
            var lineIndents =
                lines
                .Select(
                    line =>
                    line
                    .TakeWhile(c => c == ' ' || c == '\t')
                    .Sum(c => (c == ' ') ? 1 : tabWidth))
                .Where(indent => indent > 0);

            if (!lineIndents.Any())
            {
                return(source);
            }
            var minIndent = lineIndents.Min();

            // インデントを除去
            for (int li = 0; li < lines.Length; ++li)
            {
                var line = lines[li];

                int indent = 0, pos = 0;
                for (; indent < minIndent; ++pos)
                {
                    var c = line[pos];
                    if (c == ' ')
                    {
                        ++indent;
                    }
                    else if (c == '\t')
                    {
                        indent += tabWidth;
                    }
                    else
                    {
                        break;
                    }
                }

                if (pos > 0)
                {
                    line = line.Substring(pos);

                    // タブ文字幅によって除去しすぎたならば半角スペースを補填
                    if (indent > minIndent)
                    {
                        line = (new string(' ', indent - minIndent)) + line;
                    }

                    lines[li] = line;
                }
            }

            return(string.Join(newLine, lines));
        }