public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { var args = token.Arguments; if (args.Length != 2) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } //回数条件 var co = engine.Ride(args[0]); //繰り返し実行 object ret = null; for (var c = 0; c < (int)co; c++) { ret = engine.Ride(args[1]); if (ret is ReturnedObject) { break; } } return(ret); }
static void Exec(string code, string ret) { KarinEngine eng = new KarinEngine(); eng.SetFunction(new KarinFunction("console", args => { Console.WriteLine(args[0].ToString()); return(null); })); Stopwatch sw = new Stopwatch(); sw.Start(); string ans; bool ok; try { ans = "" + eng.Execute(code); ok = ans == ret; }catch (Exception ex) { ans = ex.Message; if (ex is KarinException) { ans += $"{Environment.NewLine}{(ex as KarinException).ScriptStackTrace}"; } ok = false; } sw.Stop(); Console.WriteLine($"{(ok?"OK":"NG")} : {ans} : {sw.ElapsedMilliseconds}ms"); }
public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { var args = token.Arguments; if (!(2 <= args.Length || args.Length <= 3)) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } //条件を演算 var sw = engine.Ride(args[0]); if (!(sw is bool)) { throw new KarinException($"{Name}関数の条件を評価できません。"); } //どちらかを実行 if ((bool)sw) { return(engine.Ride(args[1])); } else { return(args.Length == 3 ? engine.Ride(args[2]) : null); } }
public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { if (!((token.IsPipe && token.Arguments.Length == 0) || (!token.IsPipe && token.Arguments.Length == 1))) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } var arg = token.IsPipe ? pipedObj : engine.Ride(token.Arguments[0]); if (!(arg is string)) { throw new KarinException($"{Name}関数の引数が文字列ではありません。"); } var s = (string)arg; var sb = new StringBuilder(s.Length); int pre = 0; var ptn = new Regex(@"{\s*(\$\$?[^\s\$\{\}]+)\s*}"); foreach (Match m in ptn.Matches(s)) { var val = engine.Eval(m.Value); sb.Append(s.Substring(pre, m.Index - pre)); sb.Append(val); pre = m.Index + m.Length; } sb.Append(s.Substring(pre, s.Length - pre)); return(sb.ToString()); }
public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { var args = token.Arguments; if (args.Length != 2) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } object ret = null; while (true) { object loop = engine.Ride(args[0]); if (!(loop is bool)) { throw new KarinException($"{Name}関数の条件を評価できません。"); } if ((bool)loop == false) { break; } ret = engine.Ride(args[1]); if (ret is ReturnedObject) { break; } } return(ret); }
private void ResetEngine() { karin = new KarinEngine(); //load plugin var files = Directory.GetFiles($"{MyPath}/plugin", "*.dll"); foreach (var f in files) { karin.LoadPluginDll(f); } }
public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { if (token.Arguments.Length != 1) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } var ptn = new System.Text.RegularExpressions.Regex($@"{token.Name}\s*\[([\s\S]*)\]"); var mc = ptn.Match(token.Text); return(mc.Groups[1].Value); }
public object Execute(KarinEngine engine, FunctionToken token, object pipedObj) { if (!((token.IsPipe && token.Arguments.Length == 0) || (!token.IsPipe && token.Arguments.Length == 1))) { throw new KarinException($"{Name}関数の引数の数が不正です。"); } var s = token.IsPipe ? pipedObj : engine.Ride(token.Arguments[0]); if (!(s is string)) { throw new KarinException($"構文関数'{token.Name}'を実行できません。"); } return(engine.Eval((string)s)); }
static void ExecNg(string code) { KarinEngine eng = new KarinEngine(); string ans = ""; bool ok = false; try { eng.Execute(code); } catch (KarinException ex) { ans = ex.Message; ok = true; } catch (Exception ex) { ans = ex.Message; } Console.WriteLine($"{(ok ? "OK" : "NG")} : {ans}"); }
private void Window_Loaded(object sender, RoutedEventArgs e) { Shared.MyPath = System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); //設定読み込み Shared.Setting = (Setting)Bank.XMLReader.readXML(Shared.MyPath + "/Setting.xml", typeof(Setting)); //ロガー Shared.Logger = new Bank.LogFileWriter(); Shared.Logger.folder = Shared.MyPath + "/log"; Shared.Logger.name = ""; Shared.Logger.deleteTime = 7; Shared.Logger.deleteLog(); //アイテム読み込み ReloadItems(); //エンジン初期化 kourin = MyKourin.CreateEngine(); //ホットキー/クリップボード設定 HKSetter.HotKeyPressed += HotKeyPressed; CBChecker.ClipbordAppended += ClipbordAppended; ResetHotKey(); this.Top = Shared.Setting.PosY + (Shared.Setting.PosY < 0 ? System.Windows.SystemParameters.PrimaryScreenHeight : 0); this.Left = Shared.Setting.PosX + (Shared.Setting.PosX < 0 ? System.Windows.SystemParameters.PrimaryScreenWidth : 0); this.Height = 25; #if DEBUG this.Height = 50; #endif if (Shared.Setting.Minimum) { this.Hide(); } }
public static KarinEngine CreateEngine() { var kourin = new KarinEngine(); foreach (var dll in System.IO.Directory.GetFiles(Shared.MyPath + "\\Plugin")) { kourin.LoadPluginDll(dll); } //追加関数 //エコー状態の取得または設定をします。 //引数[0]: true/false kourin.SetFunction(new KarinFunction("ECHO", (args) => { if (args.Length == 0) { return(Echo); } else { Echo = (bool)args[0]; return(null); } })); //クリップボードのテキストを取得します。 kourin.SetFunction(new KarinFunction("CLIPBOARD", (args) => { return(System.Windows.Clipboard.GetText()); })); //出力に1行追加します。 kourin.SetFunction(new KarinFunction("PRINT", (args) => { if (Output == null) { return(null); } if (args.Length == 0) { return(null); } if (Output.Length > 0) { Output += Environment.NewLine; } Output += args[0].ToString(); return(null); })); //外部プロセスを実行します。 kourin.SetFunction(new KarinFunction("START", (args) => { if (args.Length == 0) { return(null); } var filename = args[0].ToString(); var argument = args.Length > 1 ? args[1].ToString() : null; var waitexit = args.Length > 2 ? (bool)args[2] : false; var administ = args.Length > 3 ? (bool)args[3] : false; var info = new System.Diagnostics.ProcessStartInfo(); info.FileName = filename; info.Arguments = argument; info.UseShellExecute = true; if (administ) { info.Verb = "RunAs"; } var p = System.Diagnostics.Process.Start(info); if (waitexit) { p.WaitForExit(); } return(null); })); //入力ダイアログを表示します。 kourin.SetFunction(new KarinFunction("InputDialog", (args) => { if (args.Length == 0) { return(null); } var wind = new InputDialog(); wind.Label1 = args.Length > 0 ? args[0].ToString() : null; wind.Label2 = args.Length > 1 ? args[1].ToString() : null; wind.Label3 = args.Length > 2 ? args[2].ToString() : null; var ret = wind.ShowDialog(); kourin.SetVariable("Input1", wind.Text1); kourin.SetVariable("Input2", wind.Text2); kourin.SetVariable("Input3", wind.Text3); return(ret.Value); })); //コレクションのインデクス位置のデータを返します。 kourin.SetFunction(new KarinFunction("ElementAt", (args) => { return((args[0] as IEnumerable <object>).ElementAt <object>((int)args[1])); })); //コレクションの要素数を返します。 kourin.SetFunction(new KarinFunction("COUNT", (args) => { return((args[0] as IEnumerable <object>).Count()); })); //文字列操作関連 //TRIMします。 kourin.SetFunction(new KarinFunction("TRIM", (args) => { return(args[0].ToString().Trim()); })); //Regex.Splitします。 kourin.SetFunction(new KarinFunction("SPLIT", (args) => { var r = new System.Text.RegularExpressions.Regex((string)args[1].ToString()); return(r.Split((string)args[0])); })); //Regex.Replacecします。 kourin.SetFunction(new KarinFunction("REPLACE", (args) => { var r = new System.Text.RegularExpressions.Regex((string)args[1].ToString()); return(r.Replace((string)args[0], (string)args[2])); })); //Substringします。 kourin.SetFunction(new KarinFunction("SUBSTRING", (args) => { return(((string)args[0]).Substring((int)args[1], (int)args[2])); })); //左Substringします。 kourin.SetFunction(new KarinFunction("LEFT", (args) => { var s = (string)args[0]; return(s.Substring(0, (int)args[1])); })); //右Substringします。 kourin.SetFunction(new KarinFunction("RIGHT", (args) => { var s = (string)args[0]; return(s.Substring(s.Length - (int)args[1], (int)args[1])); })); //Indexofします。 kourin.SetFunction(new KarinFunction("INDEXOF", (args) => { return(((string)args[0]).IndexOf((string)args[1])); })); //文字列の文字数を返します。 kourin.SetFunction(new KarinFunction("LEN", (args) => { return(((string)args[0]).Length); })); return(kourin); }