public RefConcatStringVariable(StringVariable variable, IEnumerable <char> stringDelimiters) : base(variable) { List <char> delimiters = stringDelimiters.ToList(); List <ConcatString> strings = new List <ConcatString>(); string text = variable.Value; int index = 0; while (index < text.Length) { string delimiter, word; // 区切り文字を数えて切り取る int delimiterBeginIndex = index; while (index < text.Length && delimiters.Contains(text[index])) { index++; } delimiter = text.Substring(delimiterBeginIndex, index - delimiterBeginIndex); // 非区切り文字を数えて切り取る int wordBeginIndex = index; while (index < text.Length && !delimiters.Contains(text[index])) { index++; } word = text.Substring(wordBeginIndex, index - wordBeginIndex); strings.Add(new ConcatString(delimiter, word)); } _strings = strings; }
public override bool GetIndexedValue(int index, out ScriptVariable value) { value = null; if (index < 0 || index > this.Value.Length) { return(false); } value = new StringVariable(this.Value.Substring(index, 1)); return(true); }
public void getOccuranceOfVariablesAux(IDictionary <ScriptVariable, int> map, IList <RefScriptVariable> variables, ScriptVariableType targetTypes, VariableNamedState ignoreState, ICollection <ScriptVariable> ignoreVariables) { foreach (var variable in variables) { if (variable.SatisfiesNamedState(ignoreState)) { continue; } if (variable.Value == null) { continue; } if (!variable.Value.IsTypeOf(targetTypes)) { continue; } if (!ignoreVariables.Contains(variable.Value)) { if (!map.ContainsKey(variable.Value)) { map[variable.Value] = 0; } map[variable.Value]++; } RefListVariable list = variable as RefListVariable; RefConcatStringVariable concat = variable as RefConcatStringVariable; if (list != null) { getOccuranceOfVariablesAux(map, list.List, targetTypes, ignoreState, ignoreVariables); } else if (concat != null) { if (concat.Strings.Count == 1 && concat.Strings[0].Word == concat.Value.ToString()) { continue; } foreach (var c in concat.Strings) { if (c.SatisfiesNamedState(ignoreState)) { continue; } StringVariable strVar = new StringVariable(c.Word); if (!ignoreVariables.Contains(strVar)) { if (!map.ContainsKey(strVar)) { map[strVar] = 0; } map[strVar]++; } } } } }
/// <summary> /// 変数の値の型に応じて名前付きスクリプト変数を作成します /// </summary> /// <param name="variable">変数の値</param> /// <param name="stringDelimiter">文字列を分割する区切り文字</param> /// <returns></returns> public static RefScriptVariable Create(ScriptVariable value, IEnumerable <char> stringDelimiter) { StringVariable str = value as StringVariable; if (str != null) { return(new RefConcatStringVariable(str, stringDelimiter)); } ListVariable list = value as ListVariable; if (list != null) { return(new RefListVariable(list, stringDelimiter)); } return(new RefScriptVariable(value)); }