diff --git a/build.sh b/build.sh index 29252129..f38a139f 100644 --- a/build.sh +++ b/build.sh @@ -11,5 +11,3 @@ npm run build # Embed the assets using rice rice embed-go -cd ./plugins -rice embed-go diff --git a/caddy/hugo/setup.go b/caddy/hugo/hugo.go similarity index 99% rename from caddy/hugo/setup.go rename to caddy/hugo/hugo.go index df28c921..7da39d58 100644 --- a/caddy/hugo/setup.go +++ b/caddy/hugo/hugo.go @@ -18,8 +18,6 @@ import ( // setup configures a new FileManager middleware instance. func setup(c *caddy.Controller) error { - plugins.RegisterHugo() - configs, err := parse(c) if err != nil { return err diff --git a/cmd/filemanager/main.go b/cmd/filemanager/main.go index 51fd93e9..6848c36a 100644 --- a/cmd/filemanager/main.go +++ b/cmd/filemanager/main.go @@ -76,8 +76,6 @@ func setupViper() { } func main() { - plugins.RegisterHugo() - setupViper() flag.Parse() diff --git a/plugins/hugo.go b/plugins/hugo.go index 340626bf..2a70a051 100644 --- a/plugins/hugo.go +++ b/plugins/hugo.go @@ -10,20 +10,14 @@ import ( "strings" "time" - rice "github.com/GeertJohan/go.rice" "github.com/hacdias/filemanager" "github.com/hacdias/varutils" "github.com/robfig/cron" ) -var ( - ErrHugoNotFound = errors.New("It seems that tou don't have 'hugo' on your PATH") - ErrUnsupportedFileType = errors.New("The type of the provided file isn't supported for this action") -) - -func RegisterHugo() { +func init() { filemanager.RegisterPlugin("hugo", filemanager.Plugin{ - JavaScript: rice.MustFindBox("./assets/").MustString("hugo.js"), + JavaScript: hugoJavaScript, CommandEvents: []string{"before_publish", "after_publish"}, Permissions: []filemanager.Permission{ { @@ -35,6 +29,11 @@ func RegisterHugo() { }) } +var ( + ErrHugoNotFound = errors.New("It seems that tou don't have 'hugo' on your PATH") + ErrUnsupportedFileType = errors.New("The type of the provided file isn't supported for this action") +) + // Hugo is a hugo (https://gohugo.io) plugin. type Hugo struct { // Website root @@ -49,6 +48,7 @@ type Hugo struct { CleanPublic bool `name:"Clean Public"` } +// Find finds the hugo executable in the path. func (h *Hugo) Find() error { var err error if h.Exe, err = exec.LookPath("hugo"); err != nil { diff --git a/plugins/assets/hugo.js b/plugins/hugo.js.go similarity index 92% rename from plugins/assets/hugo.js rename to plugins/hugo.js.go index 2d61e0f3..e65f2a83 100644 --- a/plugins/assets/hugo.js +++ b/plugins/hugo.js.go @@ -1,4 +1,6 @@ -'use strict'; +package plugins + +const hugoJavaScript = `'use strict'; (function () { if (window.plugins === undefined || window.plugins === null) { @@ -10,8 +12,8 @@ return new Promise((resolve, reject) => { let request = new window.XMLHttpRequest() - request.open('POST', `${data.store.state.baseURL}/api/hugo${url}`, true) - request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`) + request.open('POST', data.store.state.baseURL + "/api/hugo" + url, true) + request.setRequestHeader('Authorization', "Bearer " + data.store.state.jwt) request.setRequestHeader('Regenerate', 'true') request.onload = () => { @@ -32,8 +34,8 @@ return new Promise((resolve, reject) => { let request = new window.XMLHttpRequest() - request.open('POST', `${data.store.state.baseURL}/api/hugo${url}`, true) - request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`) + request.open('POST', data.store.state.baseURL + "/api/hugo" + url, true) + request.setRequestHeader('Authorization',"Bearer " + data.store.state.jwt) request.setRequestHeader('Archetype', encodeURIComponent(type)) request.onload = () => { @@ -54,8 +56,8 @@ return new Promise((resolve, reject) => { let request = new window.XMLHttpRequest() - request.open('POST', `${data.store.state.baseURL}/api/hugo${file}`, true) - request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`) + request.open('POST', data.store.state.baseURL + "/api/hugo" + file, true) + request.setRequestHeader('Authorization', "Bearer " + data.store.state.jwt) request.setRequestHeader('Schedule', date) request.onload = () => { @@ -222,4 +224,4 @@ } ] }) -})() +})()` diff --git a/plugins/rice-box.go b/plugins/rice-box.go deleted file mode 100644 index 7db09f42..00000000 --- a/plugins/rice-box.go +++ /dev/null @@ -1,41 +0,0 @@ -package plugins - -import ( - "github.com/GeertJohan/go.rice/embedded" - "time" -) - -func init() { - - // define files - file2 := &embedded.EmbeddedFile{ - Filename: `hugo.js`, - FileModTime: time.Unix(1501319450, 0), - Content: string("'use strict';\n\n(function () {\n if (window.plugins === undefined || window.plugins === null) {\n window.plugins = []\n }\n\n let regenerate = function (data, url) {\n url = data.api.removePrefix(url)\n\n return new Promise((resolve, reject) => {\n let request = new window.XMLHttpRequest()\n request.open('POST', `${data.store.state.baseURL}/api/hugo${url}`, true)\n request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`)\n request.setRequestHeader('Regenerate', 'true')\n\n request.onload = () => {\n if (request.status === 200) {\n resolve()\n } else {\n reject(request.responseText)\n }\n }\n\n request.onerror = (error) => reject(error)\n request.send()\n })\n }\n\n let newArchetype = function (data, url, type) {\n url = data.api.removePrefix(url)\n\n return new Promise((resolve, reject) => {\n let request = new window.XMLHttpRequest()\n request.open('POST', `${data.store.state.baseURL}/api/hugo${url}`, true)\n request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`)\n request.setRequestHeader('Archetype', encodeURIComponent(type))\n\n request.onload = () => {\n if (request.status === 200) {\n resolve(request.getResponseHeader('Location'))\n } else {\n reject(request.responseText)\n }\n }\n\n request.onerror = (error) => reject(error)\n request.send()\n })\n }\n\n let schedule = function (data, file, date) {\n file = data.api.removePrefix(file)\n\n return new Promise((resolve, reject) => {\n let request = new window.XMLHttpRequest()\n request.open('POST', `${data.store.state.baseURL}/api/hugo${file}`, true)\n request.setRequestHeader('Authorization', `Bearer ${data.store.state.jwt}`)\n request.setRequestHeader('Schedule', date)\n\n request.onload = () => {\n if (request.status === 200) {\n resolve(request.getResponseHeader('Location'))\n } else {\n reject(request.responseText)\n }\n }\n\n request.onerror = (error) => reject(error)\n request.send()\n })\n }\n\n window.plugins.push({\n name: 'hugo',\n credits: 'With a flavour of Hugo.',\n header: {\n visible: [\n {\n if: function (data, route) {\n return (data.store.state.req.kind === 'editor' &&\n !data.store.state.loading &&\n data.store.state.user.allowEdit &\n data.store.state.user.permissions.allowPublish)\n },\n click: function (event, data, route) {\n event.preventDefault()\n document.getElementById('save-button').click()\n // TODO: wait for save to finish?\n data.buttons.loading('publish')\n\n regenerate(data, route.path)\n .then(() => {\n data.buttons.done('publish')\n data.store.commit('showSuccess', 'Post published!')\n data.store.commit('setReload', true)\n })\n .catch((error) => {\n data.buttons.done('publish')\n data.store.commit('showError', error)\n })\n },\n id: 'publish-button',\n icon: 'send',\n name: 'Publish'\n }\n ],\n hidden: [\n {\n if: function (data, route) {\n return (data.store.state.req.kind === 'editor' &&\n !data.store.state.loading &&\n data.store.state.req.metadata !== undefined &&\n data.store.state.req.metadata !== null &&\n data.store.state.user.permissions.allowPublish)\n },\n click: function (event, data, route) {\n document.getElementById('save-button').click()\n data.store.commit('showHover', 'schedule')\n },\n id: 'schedule-button',\n icon: 'alarm',\n name: 'Schedule'\n }\n ]\n },\n sidebar: [\n {\n click: function (event, data, route) {\n data.router.push({ path: '/files/settings' })\n },\n icon: 'settings',\n name: 'Hugo Settings'\n },\n {\n click: function (event, data, route) {\n data.store.commit('showHover', 'new-archetype')\n },\n if: function (data, route) {\n return data.store.state.user.allowNew\n },\n icon: 'merge_type',\n name: 'Hugo New'\n } /* ,\n {\n click: function (event, data, route) {\n console.log('evt')\n },\n icon: 'remove_red_eye',\n name: 'Preview'\n } */\n ],\n prompts: [\n {\n name: 'new-archetype',\n title: 'New file',\n description: 'Create a new post based on an archetype. Your file will be created on content folder.',\n inputs: [\n {\n type: 'text',\n name: 'file',\n placeholder: 'File name'\n },\n {\n type: 'text',\n name: 'archetype',\n placeholder: 'Archetype'\n }\n ],\n ok: 'Create',\n submit: function (event, data, route) {\n event.preventDefault()\n\n let file = event.currentTarget.querySelector('[name=\"file\"]').value\n let type = event.currentTarget.querySelector('[name=\"archetype\"]').value\n if (type === '') type = 'default'\n\n data.store.commit('closeHovers')\n\n newArchetype(data, '/' + file, type)\n .then((url) => {\n data.router.push({ path: url })\n })\n .catch(error => {\n data.store.commit('showError', error)\n })\n }\n },\n {\n name: 'schedule',\n title: 'Schedule',\n description: 'Pick a date and time to schedule the publication of this post.',\n inputs: [\n {\n type: 'datetime-local',\n name: 'date',\n placeholder: 'Date'\n }\n ],\n ok: 'Schedule',\n submit: function (event, data, route) {\n event.preventDefault()\n data.buttons.loading('schedule')\n\n let date = event.currentTarget.querySelector('[name=\"date\"]').value\n if (date === '') {\n data.buttons.done('schedule')\n data.store.commit('showError', 'The date must not be empty.')\n return\n }\n\n schedule(data, route.path, date)\n .then(() => {\n data.buttons.done('schedule')\n data.store.commit('showSuccess', 'Post scheduled!')\n })\n .catch((error) => {\n data.buttons.done('schedule')\n data.store.commit('showError', error)\n })\n }\n }\n ]\n })\n})()\n"), - } - - // define dirs - dir1 := &embedded.EmbeddedDir{ - Filename: ``, - DirModTime: time.Unix(1501318911, 0), - ChildFiles: []*embedded.EmbeddedFile{ - file2, // hugo.js - - }, - } - - // link ChildDirs - dir1.ChildDirs = []*embedded.EmbeddedDir{} - - // register embeddedBox - embedded.RegisterEmbeddedBox(`./assets/`, &embedded.EmbeddedBox{ - Name: `./assets/`, - Time: time.Unix(1501318911, 0), - Dirs: map[string]*embedded.EmbeddedDir{ - "": dir1, - }, - Files: map[string]*embedded.EmbeddedFile{ - "hugo.js": file2, - }, - }) -}