structure changes
This commit is contained in:
parent
3f36200862
commit
1375038a66
14
Gruntfile.js
14
Gruntfile.js
|
@ -8,11 +8,11 @@ module.exports = function(grunt) {
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
watch: {
|
watch: {
|
||||||
sass: {
|
sass: {
|
||||||
files: ['assets/src/css/**/*.css'],
|
files: ['assets/public_src/css/**/*.css'],
|
||||||
tasks: ['concat', 'cssmin']
|
tasks: ['concat', 'cssmin']
|
||||||
},
|
},
|
||||||
js: {
|
js: {
|
||||||
files: ['assets/src/js/**/*.js'],
|
files: ['assets/public_src/js/**/*.js'],
|
||||||
tasks: ['uglify:main']
|
tasks: ['uglify:main']
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -24,7 +24,7 @@ module.exports = function(grunt) {
|
||||||
'node_modules/animate.css/source/bouncing_entrances/bounceInRight.css',
|
'node_modules/animate.css/source/bouncing_entrances/bounceInRight.css',
|
||||||
'node_modules/animate.css/source/fading_entrances/fadeIn.css',
|
'node_modules/animate.css/source/fading_entrances/fadeIn.css',
|
||||||
'node_modules/animate.css/source/fading_exits/fadeOut.css',
|
'node_modules/animate.css/source/fading_exits/fadeOut.css',
|
||||||
'assets/src/css/main.css'
|
'assets/public_src/css/main.css'
|
||||||
],
|
],
|
||||||
dest: 'temp/css/main.css',
|
dest: 'temp/css/main.css',
|
||||||
},
|
},
|
||||||
|
@ -35,7 +35,7 @@ module.exports = function(grunt) {
|
||||||
expand: true,
|
expand: true,
|
||||||
flatten: true,
|
flatten: true,
|
||||||
src: ['node_modules/font-awesome/fonts/**'],
|
src: ['node_modules/font-awesome/fonts/**'],
|
||||||
dest: 'assets/fonts'
|
dest: 'assets/public/fonts'
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -48,7 +48,7 @@ module.exports = function(grunt) {
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'temp/css/',
|
cwd: 'temp/css/',
|
||||||
src: ['*.css', '!*.min.css'],
|
src: ['*.css', '!*.min.css'],
|
||||||
dest: 'assets/css/',
|
dest: 'assets/public/css/',
|
||||||
ext: '.min.css'
|
ext: '.min.css'
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ module.exports = function(grunt) {
|
||||||
uglify: {
|
uglify: {
|
||||||
plugins: {
|
plugins: {
|
||||||
files: {
|
files: {
|
||||||
'assets/js/plugins.min.js': ['node_modules/jquery/dist/jquery.min.js',
|
'assets/public/js/plugins.min.js': ['node_modules/jquery/dist/jquery.min.js',
|
||||||
'node_modules/perfect-scrollbar/dist/js/min/perfect-scrollbar.jquery.min.js',
|
'node_modules/perfect-scrollbar/dist/js/min/perfect-scrollbar.jquery.min.js',
|
||||||
'node_modules/showdown/dist/showdown.min.js',
|
'node_modules/showdown/dist/showdown.min.js',
|
||||||
'node_modules/noty/js/noty/packaged/jquery.noty.packaged.min.js',
|
'node_modules/noty/js/noty/packaged/jquery.noty.packaged.min.js',
|
||||||
|
@ -67,7 +67,7 @@ module.exports = function(grunt) {
|
||||||
},
|
},
|
||||||
main: {
|
main: {
|
||||||
files: {
|
files: {
|
||||||
'assets/js/app.min.js': ['assets/src/js/**/*.js']
|
'assets/public/js/app.min.js': ['assets/src/js/**/*.js']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 357 KiB |
|
@ -5,7 +5,6 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/tools/hugo"
|
|
||||||
"github.com/mholt/caddy/caddy/setup"
|
"github.com/mholt/caddy/caddy/setup"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,7 +26,7 @@ func ParseHugo(c *setup.Controller) (*Config, error) {
|
||||||
Git: false,
|
Git: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
conf.Hugo = hugo.GetPath()
|
conf.Hugo = GetPath()
|
||||||
|
|
||||||
for c.Next() {
|
for c.Next() {
|
||||||
args := c.RemainingArgs()
|
args := c.RemainingArgs()
|
||||||
|
|
|
@ -0,0 +1,211 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/hacdias/caddy-hugo/tools/files"
|
||||||
|
"github.com/mitchellh/go-homedir"
|
||||||
|
"github.com/pivotal-golang/archiver/extractor"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
version = "0.15"
|
||||||
|
baseurl = "https://github.com/spf13/hugo/releases/download/v" + version + "/"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
caddy, bin, temp, hugo, tempfile, zipname, exename string
|
||||||
|
sha256Hash = map[string]string{
|
||||||
|
"hugo_0.15_darwin_386.zip": "f9b7353f9b64e7aece5f7981e5aa97dc4b31974ce76251edc070e77691bc03e2",
|
||||||
|
"hugo_0.15_darwin_amd64.zip": "aeecd6a12d86ab920f5b04e9486474bbe478dc246cdc2242799849b84c61c6f1",
|
||||||
|
"hugo_0.15_dragonfly_amd64.zip": "e380343789f2b2e0c366c8e1eeb251ccd90eea53dac191ff85d8177b130e53bc",
|
||||||
|
"hugo_0.15_freebsd_386.zip": "98f9210bfa3dcb48bd154879ea1cfe1b0ed8a3d891fdeacbdb4c3fc69b72aac4",
|
||||||
|
"hugo_0.15_freebsd_amd64.zip": "aa6a3028899e76e6920b9b5a64c29e14017ae34120efa67276e614e3a69cb100",
|
||||||
|
"hugo_0.15_freebsd_arm.zip": "de52e1b07caf778bdc3bdb07f39119cd5a1739c8822ebe311cd4f667c43588ac",
|
||||||
|
"hugo_0.15_linux_386.tar.gz": "af28c4cbb16db765535113f361a38b2249c634ce2d3798dcf5b795de6e4b7ecf",
|
||||||
|
"hugo_0.15_linux_amd64.tar.gz": "32a6335bd76f72867efdec9306a8a7eb7b9498a2e0478105efa96c1febadb09b",
|
||||||
|
"hugo_0.15_linux_arm.tar.gz": "886dd1a843c057a46c541011183dd558469250580e81450eedbd1a4d041e9234",
|
||||||
|
"hugo_0.15_netbsd_386.zip": "6245f5db16b33a09466f149d5b7b68a7899d6d624903de9e7e70c4b6ea869a72",
|
||||||
|
"hugo_0.15_netbsd_amd64.zip": "103ea8d81d2a3d707c05e3dd68c98fcf8146ddd36b49bf0e65d9874cee230c88",
|
||||||
|
"hugo_0.15_netbsd_arm.zip": "9c9b5cf4ea3b6169be1b5fc924251a247d9c140dd8a45aa5175031878585ff0a",
|
||||||
|
"hugo_0.15_openbsd_386.zip": "81dfdb3048a27a61b249650241fe4e8da1eda31a3a7311c615eb419f1cdd06b1",
|
||||||
|
"hugo_0.15_openbsd_amd64.zip": "e7447cde0dd7628b05b25b86938018774d8db8156ab1330b364e0e2c6501ad87",
|
||||||
|
"hugo_0.15_windows_386_32-bit-only.zip": "0a72f9a1a929f36c0e52fb1c6272b4d37a2bd1a6bd19ce57a6e7b6803b434756",
|
||||||
|
"hugo_0.15_windows_amd64.zip": "9f03602e48ae2199e06431d7436fb3b9464538c0d44aac9a76eb98e1d4d5d727",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetPath retrives the Hugo path for the user or install it if it's not found
|
||||||
|
func GetPath() string {
|
||||||
|
initializeVariables()
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// Check if Hugo is already on $PATH
|
||||||
|
if hugo, err := exec.LookPath("hugo"); err == nil {
|
||||||
|
return hugo
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if Hugo is on $HOME/.caddy/bin
|
||||||
|
if _, err = os.Stat(hugo); err == nil {
|
||||||
|
return hugo
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Unable to find Hugo on your computer.")
|
||||||
|
|
||||||
|
// Create the neccessary folders
|
||||||
|
os.MkdirAll(caddy, 0774)
|
||||||
|
os.Mkdir(bin, 0774)
|
||||||
|
|
||||||
|
if temp, err = ioutil.TempDir("", "caddy-hugo"); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadHugo()
|
||||||
|
checkSHA256()
|
||||||
|
|
||||||
|
fmt.Print("Unzipping... ")
|
||||||
|
|
||||||
|
// Unzip or Ungzip the file
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "darwin", "windows":
|
||||||
|
zp := extractor.NewZip()
|
||||||
|
err = zp.Extract(tempfile, temp)
|
||||||
|
default:
|
||||||
|
gz := extractor.NewTgz()
|
||||||
|
err = gz.Extract(tempfile, temp)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("done.")
|
||||||
|
|
||||||
|
var exetorename string
|
||||||
|
|
||||||
|
err = filepath.Walk(temp, func(path string, f os.FileInfo, err error) error {
|
||||||
|
if f.Name() == exename {
|
||||||
|
exetorename = path
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
// Copy the file
|
||||||
|
fmt.Print("Moving Hugo executable... ")
|
||||||
|
err = files.CopyFile(exetorename, hugo)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Chmod(hugo, 0755)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("done.")
|
||||||
|
fmt.Println("Hugo installed at " + hugo)
|
||||||
|
defer os.RemoveAll(temp)
|
||||||
|
return hugo
|
||||||
|
}
|
||||||
|
|
||||||
|
func initializeVariables() {
|
||||||
|
exename = "hugo_" + version + "_" + runtime.GOOS + "_" + runtime.GOARCH
|
||||||
|
zipname = exename
|
||||||
|
|
||||||
|
homedir, err := homedir.Dir()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
caddy = filepath.Join(homedir, ".caddy")
|
||||||
|
bin = filepath.Join(caddy, "bin")
|
||||||
|
hugo = filepath.Join(bin, "hugo")
|
||||||
|
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "darwin":
|
||||||
|
zipname += ".zip"
|
||||||
|
case "windows":
|
||||||
|
// At least for v0.15 version
|
||||||
|
if runtime.GOARCH == "386" {
|
||||||
|
zipname += "32-bit-only"
|
||||||
|
}
|
||||||
|
|
||||||
|
zipname += ".zip"
|
||||||
|
exename += ".exe"
|
||||||
|
hugo += ".exe"
|
||||||
|
default:
|
||||||
|
zipname += ".tar.gz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func downloadHugo() {
|
||||||
|
tempfile = filepath.Join(temp, zipname)
|
||||||
|
|
||||||
|
fmt.Print("Downloading Hugo from GitHub releases... ")
|
||||||
|
|
||||||
|
// Create the file
|
||||||
|
out, err := os.Create(tempfile)
|
||||||
|
out.Chmod(0774)
|
||||||
|
if err != nil {
|
||||||
|
defer os.RemoveAll(temp)
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
defer out.Close()
|
||||||
|
|
||||||
|
// Get the data
|
||||||
|
resp, err := http.Get(baseurl + zipname)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("An error ocurred while downloading. If this error persists, try downloading Hugo from \"https://github.com/spf13/hugo/releases/\" and put the executable in " + bin + " and rename it to 'hugo' or 'hugo.exe' if you're on Windows.")
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// Writer the body to file
|
||||||
|
_, err = io.Copy(out, resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("downloaded.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkSHA256() {
|
||||||
|
fmt.Print("Checking SHA256...")
|
||||||
|
|
||||||
|
hasher := sha256.New()
|
||||||
|
f, err := os.Open(tempfile)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if _, err := io.Copy(hasher, f); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if hex.EncodeToString(hasher.Sum(nil)) != sha256Hash[zipname] {
|
||||||
|
fmt.Println("can't verify SHA256.")
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("checked!")
|
||||||
|
}
|
13
hugo.go
13
hugo.go
|
@ -1,6 +1,6 @@
|
||||||
//go:generate go get github.com/jteeuwen/go-bindata
|
//go:generate go get github.com/jteeuwen/go-bindata
|
||||||
//go:generate go install github.com/jteeuwen/go-bindata/go-bindata
|
//go:generate go install github.com/jteeuwen/go-bindata/go-bindata
|
||||||
//go:generate go-bindata -pkg assets -o assets/assets.go templates/ assets/css/ assets/js/ assets/fonts/
|
//go:generate go-bindata -prefix assets/ -pkg assets -o routes/assets/assets.go assets/templates/ assets/public/...
|
||||||
|
|
||||||
// Package hugo makes the bridge between the static website generator Hugo
|
// Package hugo makes the bridge between the static website generator Hugo
|
||||||
// and the webserver Caddy, also providing an administrative user interface.
|
// and the webserver Caddy, also providing an administrative user interface.
|
||||||
|
@ -14,13 +14,14 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/assets"
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
|
"github.com/hacdias/caddy-hugo/routes/assets"
|
||||||
"github.com/hacdias/caddy-hugo/routes/browse"
|
"github.com/hacdias/caddy-hugo/routes/browse"
|
||||||
"github.com/hacdias/caddy-hugo/routes/editor"
|
"github.com/hacdias/caddy-hugo/routes/editor"
|
||||||
"github.com/hacdias/caddy-hugo/routes/git"
|
"github.com/hacdias/caddy-hugo/routes/git"
|
||||||
"github.com/hacdias/caddy-hugo/tools/commands"
|
"github.com/hacdias/caddy-hugo/tools/commands"
|
||||||
"github.com/hacdias/caddy-hugo/tools/hugo"
|
"github.com/hacdias/caddy-hugo/tools/hugo"
|
||||||
|
"github.com/hacdias/caddy-hugo/tools/server"
|
||||||
"github.com/mholt/caddy/caddy/setup"
|
"github.com/mholt/caddy/caddy/setup"
|
||||||
"github.com/mholt/caddy/middleware"
|
"github.com/mholt/caddy/middleware"
|
||||||
)
|
)
|
||||||
|
@ -79,10 +80,10 @@ func (h CaddyHugo) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error
|
||||||
|
|
||||||
// If the length of the components string is less than one, the variable
|
// If the length of the components string is less than one, the variable
|
||||||
// page will always be "admin"
|
// page will always be "admin"
|
||||||
if len(utils.ParseComponents(r)) > 1 {
|
if len(server.ParseURLComponents(r)) > 1 {
|
||||||
page = utils.ParseComponents(r)[1]
|
page = server.ParseURLComponents(r)[1]
|
||||||
} else {
|
} else {
|
||||||
page = utils.ParseComponents(r)[0]
|
page = server.ParseURLComponents(r)[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the page isn't "assets" neither "edit", it should always put a
|
// If the page isn't "assets" neither "edit", it should always put a
|
||||||
|
@ -145,7 +146,7 @@ func (h CaddyHugo) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error
|
||||||
// Whenever the header "X-Regenerate" is true, the website should be
|
// Whenever the header "X-Regenerate" is true, the website should be
|
||||||
// regenerated. Used in edit and settings, for example.
|
// regenerated. Used in edit and settings, for example.
|
||||||
if r.Header.Get("X-Regenerate") == "true" {
|
if r.Header.Get("X-Regenerate") == "true" {
|
||||||
go utils.Run(h.Config, false)
|
go hugo.Run(h.Config, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/utils"
|
"github.com/hacdias/caddy-hugo/tools/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DELETE handles the delete requests on browse pages
|
// DELETE handles the delete requests on browse pages
|
||||||
|
@ -32,17 +32,17 @@ func DELETE(w http.ResponseWriter, r *http.Request, c *config.Config) (int, erro
|
||||||
|
|
||||||
// Check for errors
|
// Check for errors
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, nil)
|
}, 500, nil)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "File not found.",
|
"message": "File not found.",
|
||||||
}, 404, nil)
|
}, 404, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": message,
|
"message": message,
|
||||||
}, 200, nil)
|
}, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/templates"
|
"github.com/hacdias/caddy-hugo/tools/templates"
|
||||||
|
"github.com/hacdias/caddy-hugo/tools/variables"
|
||||||
"github.com/mholt/caddy/middleware"
|
"github.com/mholt/caddy/middleware"
|
||||||
"github.com/mholt/caddy/middleware/browse"
|
"github.com/mholt/caddy/middleware/browse"
|
||||||
)
|
)
|
||||||
|
@ -15,7 +16,7 @@ import (
|
||||||
func GET(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error) {
|
func GET(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error) {
|
||||||
functions := template.FuncMap{
|
functions := template.FuncMap{
|
||||||
"CanBeEdited": templates.CanBeEdited,
|
"CanBeEdited": templates.CanBeEdited,
|
||||||
"Defined": templates.Defined,
|
"Defined": variables.Defined,
|
||||||
}
|
}
|
||||||
|
|
||||||
tpl, err := templates.Get(r, functions, "browse")
|
tpl, err := templates.Get(r, functions, "browse")
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/commands"
|
"github.com/hacdias/caddy-hugo/tools/commands"
|
||||||
"github.com/hacdias/caddy-hugo/tools/utils"
|
"github.com/hacdias/caddy-hugo/tools/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
// POST handles the POST method on browse page. It's used to create new files,
|
// POST handles the POST method on browse page. It's used to create new files,
|
||||||
|
@ -37,13 +37,13 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
// Check if filename and archetype are specified in
|
// Check if filename and archetype are specified in
|
||||||
// the request
|
// the request
|
||||||
if _, ok := info["filename"]; !ok {
|
if _, ok := info["filename"]; !ok {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Filename not specified.",
|
"message": "Filename not specified.",
|
||||||
}, 500, nil)
|
}, 500, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := info["archetype"]; !ok {
|
if _, ok := info["archetype"]; !ok {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Archtype not specified.",
|
"message": "Archtype not specified.",
|
||||||
}, 500, nil)
|
}, 500, nil)
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := commands.Run(c.Hugo, args, c.Path); err != nil {
|
if err := commands.Run(c.Hugo, args, c.Path); err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
@ -84,14 +84,14 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"location": url,
|
"location": url,
|
||||||
"message": "File created.",
|
"message": "File created.",
|
||||||
}, 200, nil)
|
}, 200, nil)
|
||||||
|
@ -101,7 +101,7 @@ func upload(w http.ResponseWriter, r *http.Request, c *config.Config) (int, erro
|
||||||
// Parse the multipart form in the request
|
// Parse the multipart form in the request
|
||||||
err := r.ParseMultipartForm(100000)
|
err := r.ParseMultipartForm(100000)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ func upload(w http.ResponseWriter, r *http.Request, c *config.Config) (int, erro
|
||||||
// Open the first file
|
// Open the first file
|
||||||
var infile multipart.File
|
var infile multipart.File
|
||||||
if infile, err = hdr.Open(); nil != err {
|
if infile, err = hdr.Open(); nil != err {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
@ -121,14 +121,14 @@ func upload(w http.ResponseWriter, r *http.Request, c *config.Config) (int, erro
|
||||||
// Create the file
|
// Create the file
|
||||||
var outfile *os.File
|
var outfile *os.File
|
||||||
if outfile, err = os.Create(c.Path + r.URL.Path + hdr.Filename); nil != err {
|
if outfile, err = os.Create(c.Path + r.URL.Path + hdr.Filename); nil != err {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the file content
|
// Copy the file content
|
||||||
if _, err = io.Copy(outfile, infile); nil != err {
|
if _, err = io.Copy(outfile, infile); nil != err {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
@ -137,5 +137,5 @@ func upload(w http.ResponseWriter, r *http.Request, c *config.Config) (int, erro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.RespondJSON(w, nil, 200, nil)
|
return server.RespondJSON(w, nil, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/utils"
|
"github.com/hacdias/caddy-hugo/tools/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PUT handles the HTTP PUT request for all /admin/browse related requests.
|
// PUT handles the HTTP PUT request for all /admin/browse related requests.
|
||||||
|
@ -31,7 +31,7 @@ func PUT(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
// Check if filename and archetype are specified in
|
// Check if filename and archetype are specified in
|
||||||
// the request
|
// the request
|
||||||
if _, ok := info["filename"]; !ok {
|
if _, ok := info["filename"]; !ok {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Filename not specified.",
|
"message": "Filename not specified.",
|
||||||
}, 400, nil)
|
}, 400, nil)
|
||||||
}
|
}
|
||||||
|
@ -44,12 +44,12 @@ func PUT(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
|
|
||||||
// Renames the file/folder
|
// Renames the file/folder
|
||||||
if err := os.Rename(old, new); err != nil {
|
if err := os.Rename(old, new); err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Something went wrong.",
|
"message": "Something went wrong.",
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "File renamed.",
|
"message": "File renamed.",
|
||||||
}, 200, nil)
|
}, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/frontmatter"
|
"github.com/hacdias/caddy-hugo/tools/frontmatter"
|
||||||
"github.com/hacdias/caddy-hugo/tools/templates"
|
"github.com/hacdias/caddy-hugo/tools/templates"
|
||||||
|
"github.com/hacdias/caddy-hugo/tools/variables"
|
||||||
"github.com/spf13/hugo/parser"
|
"github.com/spf13/hugo/parser"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -110,8 +111,8 @@ func GET(w http.ResponseWriter, r *http.Request, c *config.Config, filename stri
|
||||||
// Create the functions map, then the template, check for erros and
|
// Create the functions map, then the template, check for erros and
|
||||||
// execute the template if there aren't errors
|
// execute the template if there aren't errors
|
||||||
functions := template.FuncMap{
|
functions := template.FuncMap{
|
||||||
"SplitCapitalize": templates.SplitCapitalize,
|
"SplitCapitalize": variables.SplitCapitalize,
|
||||||
"Defined": templates.Defined,
|
"Defined": variables.Defined,
|
||||||
}
|
}
|
||||||
|
|
||||||
tpl, err := templates.Get(r, functions, "editor", "frontmatter")
|
tpl, err := templates.Get(r, functions, "editor", "frontmatter")
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/commands"
|
"github.com/hacdias/caddy-hugo/tools/hugo"
|
||||||
"github.com/robfig/cron"
|
"github.com/robfig/cron"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
"github.com/spf13/hugo/parser"
|
"github.com/spf13/hugo/parser"
|
||||||
|
@ -144,7 +144,7 @@ func parseCompleteFile(r *http.Request, c *config.Config, rawFile map[string]int
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
go commands.Run(c, false)
|
go hugo.Run(c, false)
|
||||||
})
|
})
|
||||||
scheduler.Start()
|
scheduler.Start()
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,14 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/hacdias/caddy-hugo/tools/utils"
|
"github.com/hacdias/caddy-hugo/tools/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
// POST handles the POST method on GIT page which is only an API.
|
// POST handles the POST method on GIT page which is only an API.
|
||||||
func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error) {
|
func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error) {
|
||||||
// Check if git is installed on the computer
|
// Check if git is installed on the computer
|
||||||
if _, err := exec.LookPath("git"); err != nil {
|
if _, err := exec.LookPath("git"); err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Git is not installed on your computer.",
|
"message": "Git is not installed on your computer.",
|
||||||
}, 400, nil)
|
}, 400, nil)
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
|
|
||||||
// Check if command was sent
|
// Check if command was sent
|
||||||
if _, ok := info["command"]; !ok {
|
if _, ok := info["command"]; !ok {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Command not specified.",
|
"message": "Command not specified.",
|
||||||
}, 400, nil)
|
}, 400, nil)
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": "Command not specified.",
|
"message": "Command not specified.",
|
||||||
}, 400, nil)
|
}, 400, nil)
|
||||||
}
|
}
|
||||||
|
@ -53,12 +53,12 @@ func POST(w http.ResponseWriter, r *http.Request, c *config.Config) (int, error)
|
||||||
output, err := cmd.CombinedOutput()
|
output, err := cmd.CombinedOutput()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": err.Error(),
|
"message": err.Error(),
|
||||||
}, 500, err)
|
}, 500, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.RespondJSON(w, map[string]string{
|
return server.RespondJSON(w, map[string]string{
|
||||||
"message": string(output),
|
"message": string(output),
|
||||||
}, 200, nil)
|
}, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RunCommand executes an external command
|
// Run executes an external command
|
||||||
func Run(command string, args []string, path string) error {
|
func Run(command string, args []string, path string) error {
|
||||||
cmd := exec.Command(command, args...)
|
cmd := exec.Command(command, args...)
|
||||||
cmd.Dir = path
|
cmd.Dir = path
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/tools/types"
|
"github.com/hacdias/caddy-hugo/tools/variables"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
"github.com/spf13/hugo/parser"
|
"github.com/spf13/hugo/parser"
|
||||||
)
|
)
|
||||||
|
@ -60,9 +60,9 @@ func rawToPretty(config interface{}, parent *frontmatter) interface{} {
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, element := range cnf {
|
for name, element := range cnf {
|
||||||
if types.IsMap(element) {
|
if variables.IsMap(element) {
|
||||||
objects = append(objects, handleObjects(element, parent, name))
|
objects = append(objects, handleObjects(element, parent, name))
|
||||||
} else if types.IsSlice(element) {
|
} else if variables.IsSlice(element) {
|
||||||
arrays = append(arrays, handleArrays(element, parent, name))
|
arrays = append(arrays, handleArrays(element, parent, name))
|
||||||
} else {
|
} else {
|
||||||
if name == "title" && parent.Name == mainName {
|
if name == "title" && parent.Name == mainName {
|
||||||
|
|
|
@ -1,48 +1,11 @@
|
||||||
package hugo
|
package hugo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/config"
|
"github.com/hacdias/caddy-hugo/config"
|
||||||
"github.com/mitchellh/go-homedir"
|
"github.com/hacdias/caddy-hugo/tools/commands"
|
||||||
"github.com/pivotal-golang/archiver/extractor"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
version = "0.15"
|
|
||||||
baseurl = "https://github.com/spf13/hugo/releases/download/v" + version + "/"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
caddy, bin, temp, hugo, tempfile, zipname, exename string
|
|
||||||
sha256Hash = map[string]string{
|
|
||||||
"hugo_0.15_darwin_386.zip": "f9b7353f9b64e7aece5f7981e5aa97dc4b31974ce76251edc070e77691bc03e2",
|
|
||||||
"hugo_0.15_darwin_amd64.zip": "aeecd6a12d86ab920f5b04e9486474bbe478dc246cdc2242799849b84c61c6f1",
|
|
||||||
"hugo_0.15_dragonfly_amd64.zip": "e380343789f2b2e0c366c8e1eeb251ccd90eea53dac191ff85d8177b130e53bc",
|
|
||||||
"hugo_0.15_freebsd_386.zip": "98f9210bfa3dcb48bd154879ea1cfe1b0ed8a3d891fdeacbdb4c3fc69b72aac4",
|
|
||||||
"hugo_0.15_freebsd_amd64.zip": "aa6a3028899e76e6920b9b5a64c29e14017ae34120efa67276e614e3a69cb100",
|
|
||||||
"hugo_0.15_freebsd_arm.zip": "de52e1b07caf778bdc3bdb07f39119cd5a1739c8822ebe311cd4f667c43588ac",
|
|
||||||
"hugo_0.15_linux_386.tar.gz": "af28c4cbb16db765535113f361a38b2249c634ce2d3798dcf5b795de6e4b7ecf",
|
|
||||||
"hugo_0.15_linux_amd64.tar.gz": "32a6335bd76f72867efdec9306a8a7eb7b9498a2e0478105efa96c1febadb09b",
|
|
||||||
"hugo_0.15_linux_arm.tar.gz": "886dd1a843c057a46c541011183dd558469250580e81450eedbd1a4d041e9234",
|
|
||||||
"hugo_0.15_netbsd_386.zip": "6245f5db16b33a09466f149d5b7b68a7899d6d624903de9e7e70c4b6ea869a72",
|
|
||||||
"hugo_0.15_netbsd_amd64.zip": "103ea8d81d2a3d707c05e3dd68c98fcf8146ddd36b49bf0e65d9874cee230c88",
|
|
||||||
"hugo_0.15_netbsd_arm.zip": "9c9b5cf4ea3b6169be1b5fc924251a247d9c140dd8a45aa5175031878585ff0a",
|
|
||||||
"hugo_0.15_openbsd_386.zip": "81dfdb3048a27a61b249650241fe4e8da1eda31a3a7311c615eb419f1cdd06b1",
|
|
||||||
"hugo_0.15_openbsd_amd64.zip": "e7447cde0dd7628b05b25b86938018774d8db8156ab1330b364e0e2c6501ad87",
|
|
||||||
"hugo_0.15_windows_386_32-bit-only.zip": "0a72f9a1a929f36c0e52fb1c6272b4d37a2bd1a6bd19ce57a6e7b6803b434756",
|
|
||||||
"hugo_0.15_windows_amd64.zip": "9f03602e48ae2199e06431d7436fb3b9464538c0d44aac9a76eb98e1d4d5d727",
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Run is used to run the static website generator
|
// Run is used to run the static website generator
|
||||||
|
@ -60,7 +23,7 @@ func Run(c *config.Config, force bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := RunCommand(c.Hugo, c.Args, c.Path); err != nil {
|
if err := commands.Run(c.Hugo, c.Args, c.Path); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,185 +36,3 @@ func stringInSlice(a string, list []string) (bool, int) {
|
||||||
}
|
}
|
||||||
return false, 0
|
return false, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPath retrives the Hugo path for the user or install it if it's not found
|
|
||||||
func GetPath() string {
|
|
||||||
initializeVariables()
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// Check if Hugo is already on $PATH
|
|
||||||
if hugo, err := exec.LookPath("hugo"); err == nil {
|
|
||||||
return hugo
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if Hugo is on $HOME/.caddy/bin
|
|
||||||
if _, err = os.Stat(hugo); err == nil {
|
|
||||||
return hugo
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("Unable to find Hugo on your computer.")
|
|
||||||
|
|
||||||
// Create the neccessary folders
|
|
||||||
os.MkdirAll(caddy, 0774)
|
|
||||||
os.Mkdir(bin, 0774)
|
|
||||||
|
|
||||||
if temp, err = ioutil.TempDir("", "caddy-hugo"); err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
downloadHugo()
|
|
||||||
checkSHA256()
|
|
||||||
|
|
||||||
fmt.Print("Unzipping... ")
|
|
||||||
|
|
||||||
// Unzip or Ungzip the file
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin", "windows":
|
|
||||||
zp := extractor.NewZip()
|
|
||||||
err = zp.Extract(tempfile, temp)
|
|
||||||
default:
|
|
||||||
gz := extractor.NewTgz()
|
|
||||||
err = gz.Extract(tempfile, temp)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("done.")
|
|
||||||
|
|
||||||
var exetorename string
|
|
||||||
|
|
||||||
err = filepath.Walk(temp, func(path string, f os.FileInfo, err error) error {
|
|
||||||
if f.Name() == exename {
|
|
||||||
exetorename = path
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
// Copy the file
|
|
||||||
fmt.Print("Moving Hugo executable... ")
|
|
||||||
r, err := os.Open(exetorename)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer r.Close()
|
|
||||||
|
|
||||||
w, err := os.Create(hugo)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer w.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(w, r)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = os.Chmod(hugo, 0755)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("done.")
|
|
||||||
fmt.Println("Hugo installed at " + hugo)
|
|
||||||
defer os.RemoveAll(temp)
|
|
||||||
return hugo
|
|
||||||
}
|
|
||||||
|
|
||||||
func initializeVariables() {
|
|
||||||
exename = "hugo_" + version + "_" + runtime.GOOS + "_" + runtime.GOARCH
|
|
||||||
zipname = exename
|
|
||||||
|
|
||||||
homedir, err := homedir.Dir()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
caddy = filepath.Join(homedir, ".caddy")
|
|
||||||
bin = filepath.Join(caddy, "bin")
|
|
||||||
hugo = filepath.Join(bin, "hugo")
|
|
||||||
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin":
|
|
||||||
zipname += ".zip"
|
|
||||||
case "windows":
|
|
||||||
// At least for v0.15 version
|
|
||||||
if runtime.GOARCH == "386" {
|
|
||||||
zipname += "32-bit-only"
|
|
||||||
}
|
|
||||||
|
|
||||||
zipname += ".zip"
|
|
||||||
exename += ".exe"
|
|
||||||
hugo += ".exe"
|
|
||||||
default:
|
|
||||||
zipname += ".tar.gz"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func downloadHugo() {
|
|
||||||
tempfile = filepath.Join(temp, zipname)
|
|
||||||
|
|
||||||
fmt.Print("Downloading Hugo from GitHub releases... ")
|
|
||||||
|
|
||||||
// Create the file
|
|
||||||
out, err := os.Create(tempfile)
|
|
||||||
out.Chmod(0774)
|
|
||||||
if err != nil {
|
|
||||||
defer os.RemoveAll(temp)
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
defer out.Close()
|
|
||||||
|
|
||||||
// Get the data
|
|
||||||
resp, err := http.Get(baseurl + zipname)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("An error ocurred while downloading. If this error persists, try downloading Hugo from \"https://github.com/spf13/hugo/releases/\" and put the executable in " + bin + " and rename it to 'hugo' or 'hugo.exe' if you're on Windows.")
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
// Writer the body to file
|
|
||||||
_, err = io.Copy(out, resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("downloaded.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkSHA256() {
|
|
||||||
fmt.Print("Checking SHA256...")
|
|
||||||
|
|
||||||
hasher := sha256.New()
|
|
||||||
f, err := os.Open(tempfile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
if _, err := io.Copy(hasher, f); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if hex.EncodeToString(hasher.Sum(nil)) != sha256Hash[zipname] {
|
|
||||||
fmt.Println("can't verify SHA256.")
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("checked!")
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RespondJSON
|
||||||
|
func RespondJSON(w http.ResponseWriter, message map[string]string, code int, err error) (int, error) {
|
||||||
|
msg, msgErr := json.Marshal(message)
|
||||||
|
|
||||||
|
if msgErr != nil {
|
||||||
|
return 500, msgErr
|
||||||
|
}
|
||||||
|
|
||||||
|
if code == 500 && err != nil {
|
||||||
|
err = errors.New(message["message"])
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(code)
|
||||||
|
w.Write(msg)
|
||||||
|
return 0, err
|
||||||
|
}
|
|
@ -1,14 +1,12 @@
|
||||||
package utils
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseComponents parses the components of an URL creating an array
|
// ParseURLComponents parses the components of an URL creating an array
|
||||||
func ParseComponents(r *http.Request) []string {
|
func ParseURLComponents(r *http.Request) []string {
|
||||||
//The URL that the user queried.
|
//The URL that the user queried.
|
||||||
path := r.URL.Path
|
path := r.URL.Path
|
||||||
path = strings.TrimSpace(path)
|
path = strings.TrimSpace(path)
|
||||||
|
@ -26,20 +24,3 @@ func ParseComponents(r *http.Request) []string {
|
||||||
components := strings.Split(path, "/")
|
components := strings.Split(path, "/")
|
||||||
return components
|
return components
|
||||||
}
|
}
|
||||||
|
|
||||||
func RespondJSON(w http.ResponseWriter, message map[string]string, code int, err error) (int, error) {
|
|
||||||
msg, msgErr := json.Marshal(message)
|
|
||||||
|
|
||||||
if msgErr != nil {
|
|
||||||
return 500, msgErr
|
|
||||||
}
|
|
||||||
|
|
||||||
if code == 500 && err != nil {
|
|
||||||
err = errors.New(message["message"])
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
w.WriteHeader(code)
|
|
||||||
w.Write(msg)
|
|
||||||
return 0, err
|
|
||||||
}
|
|
|
@ -1,15 +1,12 @@
|
||||||
package templates
|
package templates
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"html/template"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"text/template"
|
||||||
|
|
||||||
"github.com/hacdias/caddy-hugo/assets"
|
"github.com/hacdias/caddy-hugo/routes/assets"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CanBeEdited checks if the extension of a file is supported by the editor
|
// CanBeEdited checks if the extension of a file is supported by the editor
|
||||||
|
@ -34,36 +31,6 @@ func CanBeEdited(filename string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defined checks if variable is defined in a struct
|
|
||||||
func Defined(data interface{}, field string) bool {
|
|
||||||
t := reflect.Indirect(reflect.ValueOf(data)).Type()
|
|
||||||
|
|
||||||
if t.Kind() != reflect.Struct {
|
|
||||||
log.Print("Non-struct type not allowed.")
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
_, b := t.FieldByName(field)
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dict allows to send more than one variable into a template
|
|
||||||
func Dict(values ...interface{}) (map[string]interface{}, error) {
|
|
||||||
if len(values)%2 != 0 {
|
|
||||||
return nil, errors.New("invalid dict call")
|
|
||||||
}
|
|
||||||
dict := make(map[string]interface{}, len(values)/2)
|
|
||||||
for i := 0; i < len(values); i += 2 {
|
|
||||||
key, ok := values[i].(string)
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("dict keys must be strings")
|
|
||||||
}
|
|
||||||
dict[key] = values[i+1]
|
|
||||||
}
|
|
||||||
|
|
||||||
return dict, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get is used to get a ready to use template based on the url and on
|
// Get is used to get a ready to use template based on the url and on
|
||||||
// other sent templates
|
// other sent templates
|
||||||
func Get(r *http.Request, functions template.FuncMap, templates ...string) (*template.Template, error) {
|
func Get(r *http.Request, functions template.FuncMap, templates ...string) (*template.Template, error) {
|
||||||
|
@ -104,39 +71,3 @@ func Get(r *http.Request, functions template.FuncMap, templates ...string) (*tem
|
||||||
|
|
||||||
return tpl, nil
|
return tpl, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var splitCapitalizeExceptions = map[string]string{
|
|
||||||
"youtube": "YouTube",
|
|
||||||
"github": "GitHub",
|
|
||||||
"googleplus": "Google Plus",
|
|
||||||
"linkedin": "LinkedIn",
|
|
||||||
}
|
|
||||||
|
|
||||||
// SplitCapitalize splits a string by its uppercase letters and capitalize the
|
|
||||||
// first letter of the string
|
|
||||||
func SplitCapitalize(name string) string {
|
|
||||||
if val, ok := splitCapitalizeExceptions[strings.ToLower(name)]; ok {
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
var words []string
|
|
||||||
l := 0
|
|
||||||
for s := name; s != ""; s = s[l:] {
|
|
||||||
l = strings.IndexFunc(s[1:], unicode.IsUpper) + 1
|
|
||||||
if l <= 0 {
|
|
||||||
l = len(s)
|
|
||||||
}
|
|
||||||
words = append(words, s[:l])
|
|
||||||
}
|
|
||||||
|
|
||||||
name = ""
|
|
||||||
|
|
||||||
for _, element := range words {
|
|
||||||
name += element + " "
|
|
||||||
}
|
|
||||||
|
|
||||||
name = strings.ToLower(name[:len(name)-1])
|
|
||||||
name = strings.ToUpper(string(name[0])) + name[1:]
|
|
||||||
|
|
||||||
return name
|
|
||||||
}
|
|
||||||
|
|
|
@ -75,31 +75,3 @@ func TestDefined(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type testSplitCapitalize struct {
|
|
||||||
name string
|
|
||||||
result string
|
|
||||||
}
|
|
||||||
|
|
||||||
var testSplitCapitalizeCases = []testSplitCapitalize{
|
|
||||||
{"loremIpsum", "Lorem ipsum"},
|
|
||||||
{"LoremIpsum", "Lorem ipsum"},
|
|
||||||
{"loremipsum", "Loremipsum"},
|
|
||||||
{"YouTube", "YouTube"},
|
|
||||||
{"GitHub", "GitHub"},
|
|
||||||
{"GooglePlus", "Google Plus"},
|
|
||||||
{"Facebook", "Facebook"},
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSplitCapitalize(t *testing.T) {
|
|
||||||
for _, pair := range testSplitCapitalizeCases {
|
|
||||||
v := SplitCapitalize(pair.name)
|
|
||||||
if v != pair.result {
|
|
||||||
t.Error(
|
|
||||||
"For", pair.name,
|
|
||||||
"expected", pair.result,
|
|
||||||
"got", v,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
package variables
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
var splitCapitalizeExceptions = map[string]string{
|
||||||
|
"youtube": "YouTube",
|
||||||
|
"github": "GitHub",
|
||||||
|
"googleplus": "Google Plus",
|
||||||
|
"linkedin": "LinkedIn",
|
||||||
|
}
|
||||||
|
|
||||||
|
// SplitCapitalize splits a string by its uppercase letters and capitalize the
|
||||||
|
// first letter of the string
|
||||||
|
func SplitCapitalize(name string) string {
|
||||||
|
if val, ok := splitCapitalizeExceptions[strings.ToLower(name)]; ok {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
var words []string
|
||||||
|
l := 0
|
||||||
|
for s := name; s != ""; s = s[l:] {
|
||||||
|
l = strings.IndexFunc(s[1:], unicode.IsUpper) + 1
|
||||||
|
if l <= 0 {
|
||||||
|
l = len(s)
|
||||||
|
}
|
||||||
|
words = append(words, s[:l])
|
||||||
|
}
|
||||||
|
|
||||||
|
name = ""
|
||||||
|
|
||||||
|
for _, element := range words {
|
||||||
|
name += element + " "
|
||||||
|
}
|
||||||
|
|
||||||
|
name = strings.ToLower(name[:len(name)-1])
|
||||||
|
name = strings.ToUpper(string(name[0])) + name[1:]
|
||||||
|
|
||||||
|
return name
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package variables
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
type testSplitCapitalize struct {
|
||||||
|
name string
|
||||||
|
result string
|
||||||
|
}
|
||||||
|
|
||||||
|
var testSplitCapitalizeCases = []testSplitCapitalize{
|
||||||
|
{"loremIpsum", "Lorem ipsum"},
|
||||||
|
{"LoremIpsum", "Lorem ipsum"},
|
||||||
|
{"loremipsum", "Loremipsum"},
|
||||||
|
{"YouTube", "YouTube"},
|
||||||
|
{"GitHub", "GitHub"},
|
||||||
|
{"GooglePlus", "Google Plus"},
|
||||||
|
{"Facebook", "Facebook"},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSplitCapitalize(t *testing.T) {
|
||||||
|
for _, pair := range testSplitCapitalizeCases {
|
||||||
|
v := SplitCapitalize(pair.name)
|
||||||
|
if v != pair.result {
|
||||||
|
t.Error(
|
||||||
|
"For", pair.name,
|
||||||
|
"expected", pair.result,
|
||||||
|
"got", v,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package types
|
package variables
|
||||||
|
|
||||||
import "reflect"
|
import "reflect"
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package variables
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"log"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Defined checks if variable is defined in a struct
|
||||||
|
func Defined(data interface{}, field string) bool {
|
||||||
|
t := reflect.Indirect(reflect.ValueOf(data)).Type()
|
||||||
|
|
||||||
|
if t.Kind() != reflect.Struct {
|
||||||
|
log.Print("Non-struct type not allowed.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
_, b := t.FieldByName(field)
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dict allows to send more than one variable into a template
|
||||||
|
func Dict(values ...interface{}) (map[string]interface{}, error) {
|
||||||
|
if len(values)%2 != 0 {
|
||||||
|
return nil, errors.New("invalid dict call")
|
||||||
|
}
|
||||||
|
dict := make(map[string]interface{}, len(values)/2)
|
||||||
|
for i := 0; i < len(values); i += 2 {
|
||||||
|
key, ok := values[i].(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("dict keys must be strings")
|
||||||
|
}
|
||||||
|
dict[key] = values[i+1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict, nil
|
||||||
|
}
|
Loading…
Reference in New Issue