Exemple #1
0
        public bool createFunc_work(string state, ref List <string> lines)
        {
            if (lines == null)
            {
                return(false);
            }

            for (var i = 0; i < lines.Count; i++)
            {
                var tstate      = state;
                var line        = lines[i];
                var targetvalue = RegexUtil.Get1stMatch(@"\[\[.*?\]\]", line);
                if (string.IsNullOrEmpty(targetvalue))
                {
                    continue;
                }
                var tmp_targetvalue = targetvalue;
                // ::STATE_NAMEの取得
                if (tmp_targetvalue.StartsWith("[[::"))
                {
                    tstate = RegexUtil.Get1stMatch(@"^" + RegexUtil.VARNAME_PATTERN, tmp_targetvalue.Substring(4));
                    if (string.IsNullOrEmpty(tstate))
                    {
                        continue;
                    }

                    tmp_targetvalue = tmp_targetvalue.Substring(4);
                    if (string.IsNullOrEmpty(tmp_targetvalue))
                    {
                        continue;
                    }
                    tmp_targetvalue = tmp_targetvalue.Substring(tstate.Length);
                    if (string.IsNullOrEmpty(tmp_targetvalue))
                    {
                        continue;
                    }
                    if (tmp_targetvalue[0] != ':') // [[::STATE:ITEM]]となるのが正しい
                    {
                        continue;
                    }
                    tmp_targetvalue = tmp_targetvalue.Substring(1);
                    tmp_targetvalue = "[[" + tmp_targetvalue; //以降が期待する [[item]]の形
                }

                var name      = RegexUtil.Get1stMatch(@"[\!0-9a-zA-Z_\-]+", tmp_targetvalue);
                var macroname = string.Empty;
                var linenum   = -1;
                var argnum    = -1;
                var num_colon = StringUtil.CountChar(tmp_targetvalue, ':');
                if (num_colon >= 1)
                {
                    try {
                        var linenumstr = RegexUtil.GetNthMatch(@":\d+", tmp_targetvalue, 1);
                        linenumstr = linenumstr.Substring(1);
                        linenum    = int.Parse(linenumstr);
                    } catch (SystemException e)
                    {
                        throw new SystemException("Unpexected! {09F04A64-E5DE-4692-8784-1D0A493715D7} " + e.Message + "\n" + line);
                    }
                }
                if (num_colon >= 2)
                {
                    try {
                        var argnumstr = RegexUtil.GetNthMatch(@":\d+", tmp_targetvalue, 2);
                        argnumstr = argnumstr.Substring(1);
                        argnum    = int.Parse(argnumstr);
                    } catch (SystemException e)
                    {
                        throw new SystemException("Unpexected! {68DE5327-ECE6-4241-A2E3-CF9F87C9F5F1} " + e.Message + "\n" + line);
                    }
                }
                bool?b_loweCamel_or_upper = null;
                if (tmp_targetvalue.Contains(">>lc"))
                {
                    b_loweCamel_or_upper = true;
                }
                if (tmp_targetvalue.Contains(">>uc"))
                {
                    b_loweCamel_or_upper = false;
                }
                macroname = name;
                if (tmp_targetvalue.Contains("->@"))
                {
                    macroname = RegexUtil.Get1stMatch(@"->@.+?]", tmp_targetvalue);
                    macroname = macroname.Substring(3);
                    macroname = macroname.Substring(0, macroname.Length - 1);
                    if (argnum != -1)
                    {
                        throw new SystemException("Macro cannot use with argnument number. { 68DE5327 - ECE6 - 4241 - A2E3 - CF9F87C9F5F1 } \n" + line);
                    }

                    {//nameの語尾に - があるケースがあった。targetvalueの ->のインデックスまではnameとする。
                        var s       = (string)tmp_targetvalue;
                        var idx     = s.IndexOf("->@");
                        var newname = s.Substring(0, idx);
                        name = newname.TrimStart('[');
                    }
                }
                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }
                var val = getString2(tstate, name);
                if (!string.IsNullOrEmpty(val) && linenum >= 0)
                {
                    var tmplines = StringUtil.SplitTrimEnd(val, StringUtil._0a[0]);
                    val = linenum < tmplines.Count ? tmplines[linenum] : string.Empty;
                }
                if (!string.IsNullOrEmpty(val) && argnum >= 0)
                {
                    var args = StringUtil.SplittComma_And_ApiArges(val);
                    val = argnum < args.Count ? args[argnum] : string.Empty;
                }
                if (b_loweCamel_or_upper != null)
                {
                    var upper_or_lower = !((bool)b_loweCamel_or_upper);
                    val = StringUtil.convert_to_camel_word(val, upper_or_lower);
                }

                if (name == "brcond") //コンディションの改行対応
                {
                    if (!string.IsNullOrEmpty(val))
                    {
                        if (!string.IsNullOrEmpty(BRANCHEDIT_NEWLINECHAR))
                        {
                            val = val.Replace(BRANCHEDIT_NEWLINECHAR, Environment.NewLine);
                        }
                    }
                }

                var replacevalue  = val;
                var replacevalue3 = get_line_macro_value(macroname, replacevalue); // @stateマクロがあれば、各行に適用する

                var tmplines2 = StringUtil.ReplaceWordsInLine(line, targetvalue, replacevalue3);

                lines.RemoveAt(i);
                lines.InsertRange(i, tmplines2);
                return(true);
            }
            return(false);
        }