/* * * OttoJS Plugin Module * Copyright Azareal 2016 - 2019 * */ package common import ( "errors" "github.com/robertkrimen/otto" ) type OttoPluginLang struct { vm *otto.Otto plugins map[string]*otto.Script vars map[string]*otto.Object } func init() { pluginLangs["ottojs"] = &OttoPluginLang{ plugins: make(map[string]*otto.Script), vars: make(map[string]*otto.Object), } } func (js *OttoPluginLang) Init() (err error) { js.vm = otto.New() js.vars["current_page"], err = js.vm.Object(`var current_page = {}`) return err } func (js *OttoPluginLang) GetName() string { return "ottojs" } func (js *OttoPluginLang) GetExts() []string { return []string{".js"} } func (js *OttoPluginLang) AddPlugin(meta PluginMeta) (plugin *Plugin, err error) { script, err := js.vm.Compile("./extend/"+meta.UName+"/"+meta.Main, nil) if err != nil { return nil, err } var pluginInit = func(plugin *Plugin) error { retValue, err := js.vm.Run(script) if err != nil { return err } if retValue.IsString() { ret, err := retValue.ToString() if err != nil { return err } if ret != "" { return errors.New(ret) } } return nil } plugin = new(Plugin) plugin.UName = meta.UName plugin.Name = meta.Name plugin.Author = meta.Author plugin.URL = meta.URL plugin.Settings = meta.Settings plugin.Tag = meta.Tag plugin.Type = "ottojs" plugin.Init = pluginInit // TODO: Implement plugin life cycle events buildPlugin(plugin) plugin.Data = script return plugin, nil } /*func (js *OttoPluginLang) addHook(hook string, plugin string) { hooks[hook] = func(data interface{}) interface{} { switch d := data.(type) { case Page: currentPage := js.vars["current_page"] currentPage.Set("Title", d.Title) case TopicPage: case ProfilePage: case Reply: default: log.Print("Not a valid JS datatype") } } }*/