diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2020-04-12 19:38:19 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2020-04-12 19:38:19 +0900 |
| commit | f07047d1e89586a3bcaf36d6d2667e89e1a49d1e (patch) | |
| tree | 03986214247ed3750e780ac8568e4d4f38adbf5a /src | |
| parent | 12.30.0 (diff) | |
| download | sharkey-f07047d1e89586a3bcaf36d6d2667e89e1a49d1e.tar.gz sharkey-f07047d1e89586a3bcaf36d6d2667e89e1a49d1e.tar.bz2 sharkey-f07047d1e89586a3bcaf36d6d2667e89e1a49d1e.zip | |
AiScript関連
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/components/page/page.vue | 2 | ||||
| -rw-r--r-- | src/client/pages/page-editor/page-editor.script-block.vue | 2 | ||||
| -rw-r--r-- | src/client/pages/page-editor/page-editor.vue | 4 | ||||
| -rw-r--r-- | src/client/pages/scratchpad.vue | 20 | ||||
| -rw-r--r-- | src/client/scripts/aoiscript/evaluator.ts (renamed from src/client/scripts/aiscript/evaluator.ts) | 12 | ||||
| -rw-r--r-- | src/client/scripts/aoiscript/index.ts (renamed from src/client/scripts/aiscript/index.ts) | 2 | ||||
| -rw-r--r-- | src/client/scripts/aoiscript/type-checker.ts (renamed from src/client/scripts/aiscript/type-checker.ts) | 2 | ||||
| -rw-r--r-- | src/client/scripts/create-aiscript-env.ts | 28 | ||||
| -rw-r--r-- | src/client/store.ts | 2 | ||||
| -rw-r--r-- | src/docs/pages.ja-JP.md | 2 |
10 files changed, 44 insertions, 32 deletions
diff --git a/src/client/components/page/page.vue b/src/client/components/page/page.vue index b8f6fd2f95..977d384b30 100644 --- a/src/client/components/page/page.vue +++ b/src/client/components/page/page.vue @@ -10,7 +10,7 @@ import i18n from '../../i18n'; import { faHeart as faHeartS } from '@fortawesome/free-solid-svg-icons'; import { faHeart } from '@fortawesome/free-regular-svg-icons'; import XBlock from './page.block.vue'; -import { ASEvaluator } from '../../scripts/aiscript/evaluator'; +import { ASEvaluator } from '../../scripts/aoiscript/evaluator'; import { collectPageVars } from '../../scripts/collect-page-vars'; import { url } from '../../config'; diff --git a/src/client/pages/page-editor/page-editor.script-block.vue b/src/client/pages/page-editor/page-editor.script-block.vue index f56e848c39..4f30b7136b 100644 --- a/src/client/pages/page-editor/page-editor.script-block.vue +++ b/src/client/pages/page-editor/page-editor.script-block.vue @@ -59,7 +59,7 @@ import { v4 as uuid } from 'uuid'; import i18n from '../../i18n'; import XContainer from './page-editor.container.vue'; import MkTextarea from '../../components/ui/textarea.vue'; -import { isLiteralBlock, funcDefs, blockDefs } from '../../scripts/aiscript/index'; +import { isLiteralBlock, funcDefs, blockDefs } from '../../scripts/aoiscript/index'; export default Vue.extend({ i18n, diff --git a/src/client/pages/page-editor/page-editor.vue b/src/client/pages/page-editor/page-editor.vue index 04117b501f..b3350e0c63 100644 --- a/src/client/pages/page-editor/page-editor.vue +++ b/src/client/pages/page-editor/page-editor.vue @@ -98,8 +98,8 @@ import MkButton from '../../components/ui/button.vue'; import MkSelect from '../../components/ui/select.vue'; import MkSwitch from '../../components/ui/switch.vue'; import MkInput from '../../components/ui/input.vue'; -import { blockDefs } from '../../scripts/aiscript/index'; -import { ASTypeChecker } from '../../scripts/aiscript/type-checker'; +import { blockDefs } from '../../scripts/aoiscript/index'; +import { ASTypeChecker } from '../../scripts/aoiscript/type-checker'; import { url } from '../../config'; import { collectPageVars } from '../../scripts/collect-page-vars'; import { selectDriveFile } from '../../scripts/select-drive-file'; diff --git a/src/client/pages/scratchpad.vue b/src/client/pages/scratchpad.vue index 2178e35b9b..10292e60c6 100644 --- a/src/client/pages/scratchpad.vue +++ b/src/client/pages/scratchpad.vue @@ -31,6 +31,7 @@ import { AiScript, parse, utils, values } from '@syuilo/aiscript'; import i18n from '../i18n'; import MkContainer from '../components/ui/container.vue'; import MkButton from '../components/ui/button.vue'; +import { createAiScriptEnv } from '../scripts/create-aiscript-env'; export default Vue.extend({ i18n, @@ -71,24 +72,7 @@ export default Vue.extend({ methods: { async run() { this.logs = []; - const aiscript = new AiScript({ - dialog: values.FN_NATIVE(async ([title, text, type]) => { - await this.$root.dialog({ - type: type ? type.value : 'info', - title: title.value, - text: text.value, - }); - }), - confirm: values.FN_NATIVE(async ([title, text]) => { - const confirm = await this.$root.dialog({ - type: 'warning', - showCancelButton: true, - title: title.value, - text: text.value, - }); - return confirm.canceled ? values.FALSE : values.TRUE - }), - }, { + const aiscript = new AiScript(createAiScriptEnv(this), { in: (q) => { return new Promise(ok => { this.$root.dialog({ diff --git a/src/client/scripts/aiscript/evaluator.ts b/src/client/scripts/aoiscript/evaluator.ts index 5cdf5e0b84..2e952da404 100644 --- a/src/client/scripts/aiscript/evaluator.ts +++ b/src/client/scripts/aoiscript/evaluator.ts @@ -9,7 +9,7 @@ type Fn = { }; /** - * AiScript evaluator + * AoiScript evaluator */ export class ASEvaluator { private variables: Variable[]; @@ -51,7 +51,7 @@ export class ASEvaluator { if (pageVar !== undefined) { pageVar.value = value; } else { - throw new AiScriptError(`No such page var '${name}'`); + throw new AoiScriptError(`No such page var '${name}'`); } } @@ -206,14 +206,14 @@ export class ASEvaluator { const fnName = block.type; const fn = (funcs as any)[fnName]; if (fn == null) { - throw new AiScriptError(`No such function '${fnName}'`); + throw new AoiScriptError(`No such function '${fnName}'`); } else { return fn(...block.args.map(x => this.evaluate(x, scope))); } } } -class AiScriptError extends Error { +class AoiScriptError extends Error { public info?: any; constructor(message: string, info?: any) { @@ -223,7 +223,7 @@ class AiScriptError extends Error { // Maintains proper stack trace for where our error was thrown (only available on V8) if (Error.captureStackTrace) { - Error.captureStackTrace(this, AiScriptError); + Error.captureStackTrace(this, AoiScriptError); } } } @@ -256,7 +256,7 @@ class Scope { } } - throw new AiScriptError( + throw new AoiScriptError( `No such variable '${name}' in scope '${this.name}'`, { scope: this.layerdStates }); diff --git a/src/client/scripts/aiscript/index.ts b/src/client/scripts/aoiscript/index.ts index 8e7b1f052a..42d67b3fad 100644 --- a/src/client/scripts/aiscript/index.ts +++ b/src/client/scripts/aoiscript/index.ts @@ -1,5 +1,5 @@ /** - * AiScript + * AoiScript */ import { diff --git a/src/client/scripts/aiscript/type-checker.ts b/src/client/scripts/aoiscript/type-checker.ts index 817e549864..93b13c4bda 100644 --- a/src/client/scripts/aiscript/type-checker.ts +++ b/src/client/scripts/aoiscript/type-checker.ts @@ -8,7 +8,7 @@ type TypeError = { }; /** - * AiScript type checker + * AoiScript type checker */ export class ASTypeChecker { public variables: Variable[]; diff --git a/src/client/scripts/create-aiscript-env.ts b/src/client/scripts/create-aiscript-env.ts new file mode 100644 index 0000000000..75f402e13e --- /dev/null +++ b/src/client/scripts/create-aiscript-env.ts @@ -0,0 +1,28 @@ +import { utils, values } from '@syuilo/aiscript'; + +export function createAiScriptEnv(vm) { + return { + USER_ID: values.STR(vm.$store.state.i.id), + USER_USERNAME: values.STR(vm.$store.state.i.username), + 'Mk:dialog': values.FN_NATIVE(async ([title, text, type]) => { + await vm.$root.dialog({ + type: type ? type.value : 'info', + title: title.value, + text: text.value, + }); + }), + 'Mk:confirm': values.FN_NATIVE(async ([title, text]) => { + const confirm = await vm.$root.dialog({ + type: 'warning', + showCancelButton: true, + title: title.value, + text: text.value, + }); + return confirm.canceled ? values.FALSE : values.TRUE + }), + 'Mk:api': values.FN_NATIVE(async ([ep, param, token]) => { + const res = await vm.$root.api(ep.value, utils.valToJs(param), token || null); + return utils.jsToVal(res); + }), + }; +} diff --git a/src/client/store.ts b/src/client/store.ts index b2aea38391..14c8548602 100644 --- a/src/client/store.ts +++ b/src/client/store.ts @@ -138,7 +138,7 @@ export default () => new Vuex.Store({ const promise = new Promise((resolve, reject) => { // Append a credential if (ctx.getters.isSignedIn) (data as any).i = ctx.state.i.token; - if (token) (data as any).i = token; + if (token !== undefined) (data as any).i = token; // Send request fetch(endpoint.indexOf('://') > -1 ? endpoint : `${apiUrl}/${endpoint}`, { diff --git a/src/docs/pages.ja-JP.md b/src/docs/pages.ja-JP.md index 3804c5a5c2..a7311b95e6 100644 --- a/src/docs/pages.ja-JP.md +++ b/src/docs/pages.ja-JP.md @@ -7,4 +7,4 @@ ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。 -関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、AiScript標準で関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 +関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。 |