diff options
Diffstat (limited to 'src/fields/ScriptField.ts')
-rw-r--r-- | src/fields/ScriptField.ts | 68 |
1 files changed, 14 insertions, 54 deletions
diff --git a/src/fields/ScriptField.ts b/src/fields/ScriptField.ts index c84eb7d88..85cd73dfe 100644 --- a/src/fields/ScriptField.ts +++ b/src/fields/ScriptField.ts @@ -40,38 +40,9 @@ const scriptSchema = createSimpleSchema({ }); async function deserializeScript(script: ScriptField) { - //console.log("Scripting = " + script.script.originalScript) - if (script.script.originalScript === 'copyDragFactory(this.dragFactory)') { - return (script as any).script = (ScriptField.GetCopyOfDragFactory ?? (ScriptField.GetCopyOfDragFactory = ScriptField.MakeFunction('copyDragFactory(this.dragFactory)')))?.script; - } - if (script.script.originalScript.startsWith("renameAlias")) { // === 'renameAlias(this)') { - return (script as any).script = (ScriptField.RenameAlias as Opt<ScriptField>)?.script; - } - if (script.script.originalScript.startsWith("copyField") && script.script.originalScript.endsWith("annotations\"")) { - return (script as any).script = ScriptField.GetAnnoCopyField(script.script.originalScript.replace(/.*\["([^"]*)/, "$1"))?.script; - } - if (script.script.originalScript.startsWith("copyField") && script.script.originalScript.endsWith("sidebar\"")) { - return (script as any).script = ScriptField.GetSidebarCopyField(script.script.originalScript.replace(/.*\["([^"]*)/, "$1"))?.script; - } - if (script.script.originalScript === 'links(self)') { - return (script as any).script = (ScriptField.LinksSelf as Opt<ScriptField>)?.script; - } - if (script.script.originalScript === 'openOnRight(copyDragFactory(this.dragFactory))') { - return (script as any).script = (ScriptField.OpenOnRight ?? (ScriptField.OpenOnRight = ComputedField.MakeFunction('openOnRight(copyDragFactory(this.dragFactory))')))?.script; - } - if (script.script.originalScript === 'deiconifyView(self)') { - return (script as any).script = (ScriptField.DeiconifyView ?? (ScriptField.DeiconifyView = ComputedField.MakeFunction('deiconifyView(self)')))?.script; - } - if (script.script.originalScript === 'convertToButtons(dragData)') { - return (script as any).script = (ScriptField.ConvertToButtons ?? (ScriptField.ConvertToButtons = ComputedField.MakeFunction('convertToButtons(dragData)', { dragData: "DocumentDragData" })))?.script; - } - if (script.script.originalScript === 'IsNoviceMode()') { - return (script as any).script = (ScriptField.NoviceMode as Opt<ScriptField>)?.script; - } - if (script.script.originalScript === `selectMainMenu(self)`) { - return (script as any).script = (ScriptField.SelectMenu ?? (ScriptField.SelectMenu = ComputedField.MakeFunction('selectMainMenu(self)')))?.script; - } const captures: ProxyField<Doc> = (script as any).captures; + const cache = captures ? undefined : ScriptField.GetScriptFieldCache(script.script.originalScript); + if (cache) return (script as any).script = cache; if (captures) { const doc = (await captures.value())!; const captured: any = {}; @@ -85,6 +56,7 @@ async function deserializeScript(script: ScriptField) { throw new Error("Couldn't compile loaded script"); } (script as any).script = comp; + !captures && ScriptField._scriptFieldCache.set(script.script.originalScript, comp); if (script.setterscript) { const compset = CompileScript(script.setterscript?.originalScript, script.setterscript.options); if (!compset.compiled) { @@ -105,27 +77,9 @@ export class ScriptField extends ObjectField { @serializable(autoObject()) private captures?: ProxyField<Doc>; - public static GetCopyOfDragFactory: Opt<ScriptField>; - public static _annoCopyField: Map<string, Opt<ScriptField>> = new Map(); - public static GetAnnoCopyField(field: string) { - if (!this._annoCopyField.get(field)) this._annoCopyField.set(field, ComputedField.MakeFunction(`copyField(this["${field}-"+urlHash(this["${field}"]?.url?.toString())+"-annotations"`)) - return this._annoCopyField.get(field)?.[Copy]; - } - public static _sidebarCopyField: Map<string, Opt<ScriptField>> = new Map(); - public static GetSidebarCopyField(field: string) { - if (!this._sidebarCopyField.get(field)) this._sidebarCopyField.set(field, ComputedField.MakeFunction(`copyField(this["${field}-"+urlHash(this["${field}"]?.url?.toString())+"-sidebar"`)) - return this._sidebarCopyField.get(field)?.[Copy]; - } - public static _renameAlias: Opt<ScriptField>; - public static get RenameAlias() { return (this._renameAlias ?? (this._renameAlias = ComputedField.MakeFunction('renameAlias(this)'))); } - public static _linksSelf: Opt<ScriptField>; - public static get LinksSelf() { return (this._linksSelf ?? (this._linksSelf = ComputedField.MakeFunction('links(self)'))); } - public static OpenOnRight: Opt<ScriptField>; - public static DeiconifyView: Opt<ScriptField>; - public static ConvertToButtons: Opt<ScriptField>; - public static _noviceMode: Opt<ScriptField>; - public static get NoviceMode() { return (this._noviceMode ?? (this._noviceMode = ComputedField.MakeFunction("IsNoviceMode()"))); } - public static SelectMenu: Opt<ScriptField>; + public static _scriptFieldCache: Map<string, Opt<CompiledScript>> = new Map(); + public static GetScriptFieldCache(field: string) { return this._scriptFieldCache.get(field); } + constructor(script: CompiledScript, setterscript?: CompiledScript) { super(); @@ -174,7 +128,13 @@ export class ScriptField extends ObjectField { } public static CompileScript(script: string, params: object = {}, addReturn = false, capturedVariables?: { [name: string]: Field }) { const compiled = CompileScript(script, { - params: { this: Doc?.name || "Doc", self: Doc?.name || "Doc", _last_: "any", ...params }, + params: { + this: Doc?.name || "Doc", // this is the doc that executes the script + self: Doc?.name || "Doc", // self is the root doc of the doc that executes the script + _last_: "any", // _last_ is the previous value of a computed field when it is being triggered to re-run. + _readOnly_: "boolean", // _readOnly_ is set when a computed field is executed to indicate that it should not have mobx side-effects. used for checking the value of a set function (see FontIconBox) + ...params + }, typecheck: false, editable: true, addReturn: addReturn, @@ -199,7 +159,7 @@ export class ComputedField extends ScriptField { _lastComputedResult: any; //TODO maybe add an observable cache based on what is passed in for doc, considering there shouldn't really be that many possible values for doc value = computedFn((doc: Doc) => this._valueOutsideReaction(doc)); - _valueOutsideReaction = (doc: Doc) => this._lastComputedResult = this.script.run({ this: doc, self: Cast(doc.rootDocument, Doc, null) || doc, _last_: this._lastComputedResult }, console.log).result; + _valueOutsideReaction = (doc: Doc) => this._lastComputedResult = this.script.run({ this: doc, self: Cast(doc.rootDocument, Doc, null) || doc, _last_: this._lastComputedResult, _readOnly_: true }, console.log).result; [Copy](): ObjectField { |