예제 #1
0
        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);
        }
예제 #2
0
        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");
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        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());
        }
예제 #5
0
        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);
        }
예제 #6
0
        private void ResetEngine()
        {
            karin = new KarinEngine();

            //load plugin
            var files = Directory.GetFiles($"{MyPath}/plugin", "*.dll");

            foreach (var f in files)
            {
                karin.LoadPluginDll(f);
            }
        }
예제 #7
0
        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);
        }
예제 #8
0
        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));
        }
예제 #9
0
        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}");
        }
예제 #10
0
        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();
            }
        }
예제 #11
0
        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);
        }