updates on editor
Former-commit-id: 2928727a06a94c0ea87ed821a472ae662df803d1 [formerly 098bc4234803078aba013f6312d179158194fffb] [formerly d2bb681fe62ba87a29b9866e291fb975489cd3fc [formerly 3d25185a557dab1fa529499572c0e6d5bf187ca1]] Former-commit-id: 288ccb95466fbd234d278886800e1d27c54fa8dd [formerly 78c473865b085e97cf435cb230e2afa85559aba0] Former-commit-id: c5dc56f4d6198c9c306c01573e1a1af5f1827c3a
This commit is contained in:
@@ -15,7 +15,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/hacdias/filemanager"
|
||||
. "github.com/hacdias/filemanager"
|
||||
"github.com/mholt/caddy"
|
||||
"github.com/mholt/caddy/caddyhttp/httpserver"
|
||||
)
|
||||
@@ -27,18 +27,22 @@ func init() {
|
||||
})
|
||||
}
|
||||
|
||||
// FileManager is an http.Handler that can show a file listing when
|
||||
// directories in the given paths are specified.
|
||||
type FileManager struct {
|
||||
type plugin struct {
|
||||
Next httpserver.Handler
|
||||
Configs []*filemanager.FileManager
|
||||
Configs []*config
|
||||
}
|
||||
|
||||
type config struct {
|
||||
*FileManager
|
||||
baseURL string
|
||||
webDavURL string
|
||||
}
|
||||
|
||||
// ServeHTTP determines if the request is for this plugin, and if all prerequisites are met.
|
||||
func (f FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
|
||||
func (f plugin) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
|
||||
for i := range f.Configs {
|
||||
// Checks if this Path should be handled by File Manager.
|
||||
if !httpserver.Path(r.URL.Path).Matches(f.Configs[i].BaseURL) {
|
||||
if !httpserver.Path(r.URL.Path).Matches(f.Configs[i].baseURL) {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -56,21 +60,21 @@ func setup(c *caddy.Controller) error {
|
||||
}
|
||||
|
||||
httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
|
||||
return FileManager{Configs: configs, Next: next}
|
||||
return plugin{Configs: configs, Next: next}
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
func parse(c *caddy.Controller) ([]*config, error) {
|
||||
var (
|
||||
configs []*filemanager.FileManager
|
||||
configs []*config
|
||||
err error
|
||||
)
|
||||
|
||||
for c.Next() {
|
||||
var (
|
||||
m = filemanager.New(".")
|
||||
m = &config{FileManager: New(".")}
|
||||
u = m.User
|
||||
name = ""
|
||||
)
|
||||
@@ -79,7 +83,7 @@ func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
|
||||
m.SetPrefixURL(strings.TrimSuffix(caddyConf.Addr.Path, "/"))
|
||||
m.Commands = []string{"git", "svn", "hg"}
|
||||
m.Rules = append(m.Rules, &filemanager.Rule{
|
||||
m.Rules = append(m.Rules, &Rule{
|
||||
Regex: true,
|
||||
Allow: false,
|
||||
Regexp: regexp.MustCompile("\\/\\..+"),
|
||||
@@ -89,18 +93,19 @@ func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
args := c.RemainingArgs()
|
||||
|
||||
if len(args) > 0 {
|
||||
m.baseURL = args[0]
|
||||
m.webDavURL = "/webdav"
|
||||
m.SetBaseURL(args[0])
|
||||
m.SetWebDavURL("/webdav")
|
||||
}
|
||||
|
||||
for c.NextBlock() {
|
||||
switch c.Val() {
|
||||
case "before_save":
|
||||
if m.BeforeSave, err = makeCommand(c); err != nil {
|
||||
if m.BeforeSave, err = makeCommand(c, m); err != nil {
|
||||
return configs, err
|
||||
}
|
||||
case "after_save":
|
||||
if m.AfterSave, err = makeCommand(c); err != nil {
|
||||
if m.AfterSave, err = makeCommand(c, m); err != nil {
|
||||
return configs, err
|
||||
}
|
||||
case "webdav":
|
||||
@@ -108,6 +113,7 @@ func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
return configs, c.ArgErr()
|
||||
}
|
||||
|
||||
m.webDavURL = "c.Val()"
|
||||
m.SetWebDavURL(c.Val())
|
||||
case "show":
|
||||
if !c.NextArg() {
|
||||
@@ -185,7 +191,7 @@ func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
ruleType += "_r"
|
||||
}
|
||||
|
||||
rule := &filemanager.Rule{
|
||||
rule := &Rule{
|
||||
Allow: ruleType == "allow" || ruleType == "allow_r",
|
||||
Regex: ruleType == "allow_r" || ruleType == "block_r",
|
||||
}
|
||||
@@ -215,14 +221,16 @@ func parse(c *caddy.Controller) ([]*filemanager.FileManager, error) {
|
||||
}
|
||||
}
|
||||
|
||||
m.baseURL = strings.TrimSuffix(m.baseURL, "/")
|
||||
m.webDavURL = strings.TrimSuffix(m.webDavURL, "/")
|
||||
configs = append(configs, m)
|
||||
}
|
||||
|
||||
return configs, nil
|
||||
}
|
||||
|
||||
func makeCommand(c *caddy.Controller) (filemanager.Command, error) {
|
||||
fn := func(r *http.Request, c *filemanager.FileManager, u *filemanager.User) error { return nil }
|
||||
func makeCommand(c *caddy.Controller, m *config) (Command, error) {
|
||||
fn := func(r *http.Request, c *FileManager, u *User) error { return nil }
|
||||
|
||||
args := c.RemainingArgs()
|
||||
if len(args) == 0 {
|
||||
@@ -241,8 +249,8 @@ func makeCommand(c *caddy.Controller) (filemanager.Command, error) {
|
||||
return fn, c.Err(err.Error())
|
||||
}
|
||||
|
||||
fn = func(r *http.Request, c *filemanager.FileManager, u *filemanager.User) error {
|
||||
path := strings.Replace(r.URL.Path, c.WebDavURL, "", 1)
|
||||
fn = func(r *http.Request, c *FileManager, u *User) error {
|
||||
path := strings.Replace(r.URL.Path, m.baseURL+m.webDavURL, "", 1)
|
||||
path = u.Scope() + "/" + path
|
||||
path = filepath.Clean(path)
|
||||
|
||||
52
caddy/hugo/README.md
Normal file
52
caddy/hugo/README.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# hugo - a caddy plugin
|
||||
|
||||
[](https://caddy.community)
|
||||
|
||||
hugo fills the gap between Hugo and the browser. [Hugo](http://gohugo.io/) is an easy and fast static website generator. This plugin fills the gap between Hugo and the end-user, providing you a web interface to manage the whole website.
|
||||
|
||||
Using this plugin, you won't need to have your own computer to edit posts, neither regenerate your static website, because you can do all of that just through your browser.
|
||||
|
||||
**Requirements:** you need to have the hugo executable in your PATH. You can download it from its [official page](http://gohugo.io).
|
||||
|
||||
### Syntax
|
||||
|
||||
```
|
||||
hugo [directory] [admin] {
|
||||
clean_public [true|false]
|
||||
before_publish command
|
||||
after_publish command
|
||||
flag name [value]
|
||||
# other file manager compatible options
|
||||
}
|
||||
```
|
||||
|
||||
All of the options above are optional.
|
||||
|
||||
* **directory** is the folder where the commands are going to be executed. By default, it is the current working directory. Default: `./`.
|
||||
* **admin** is the path where you will find your administration interface. Default: `/admin`.
|
||||
* **clean_public** sets if the `public` folder should be removed before generating the website again. Default: `true`.
|
||||
* **before_publish** and **after_publish** allow you to set a custom command to be executed before publishing and after publishing a post/page. The placeholder `{path}` can be used and it will be replaced by the file path.
|
||||
* **name** refers to the Hugo available flags. Please use their long form without `--` in the beginning. If no **value** is set, it will be evaluated as `true`.
|
||||
|
||||
In spite of these options, you can also use the [filemanager](https://caddyserver.com/docs/http.filemanager) so you can have more control about what can be acceded, the permissions of each user, and so on.
|
||||
|
||||
This directive should be used with [root](https://caddyserver.com/docs/root), [basicauth](https://caddyserver.com/docs/basicauth) and [errors](https://caddyserver.com/docs/errors) middleware to have the best experience. See the examples to know more.
|
||||
|
||||
### Examples
|
||||
|
||||
If you don't already have an Hugo website, don't worry. This plugin will auto-generate it for you. But that's not everything. It is recommended that you take a look at Hugo [documentation](http://gohugo.io/themes/overview/) to learn more about themes, content types, and so on.
|
||||
|
||||
A simple Caddyfile to use with Hugo static website generator:
|
||||
|
||||
```
|
||||
root public # the folder where Hugo generates the website
|
||||
basicauth /admin user pass # protect the admin area using HTTP basic auth
|
||||
hugo # enable the admin panel
|
||||
```
|
||||
|
||||
### Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
1
caddy/hugo/hugo.go
Normal file
1
caddy/hugo/hugo.go
Normal file
@@ -0,0 +1 @@
|
||||
package hugo
|
||||
42
caddy/hugo/hugo.js
Normal file
42
caddy/hugo/hugo.js
Normal file
@@ -0,0 +1,42 @@
|
||||
'use strict'
|
||||
|
||||
if (window.plugins === undefined || window.plugins === null) {
|
||||
window.plugins = []
|
||||
}
|
||||
|
||||
window.plugins.append({
|
||||
sidebar: [
|
||||
{
|
||||
click: function (event) {
|
||||
console.log('evt')
|
||||
},
|
||||
icon: 'settings_applications',
|
||||
name: 'Settings'
|
||||
},
|
||||
{
|
||||
click: function (event) {
|
||||
console.log('evt')
|
||||
},
|
||||
icon: 'remove_red_eye',
|
||||
name: 'Preview'
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
|
||||
/*
|
||||
{{ define "sidebar-addon" }}
|
||||
<a class="action" href="{{ .BaseURL }}/content/">
|
||||
<i class="material-icons">subject</i>
|
||||
<span>Posts and Pages</span>
|
||||
</a>
|
||||
<a class="action" href="{{ .BaseURL }}/themes/">
|
||||
<i class="material-icons">format_paint</i>
|
||||
<span>Themes</span>
|
||||
</a>
|
||||
<a class="action" href="{{ .BaseURL }}/settings/">
|
||||
<i class="material-icons">settings</i>
|
||||
<span>Settings</span>
|
||||
</a>
|
||||
{{ end }}
|
||||
*/
|
||||
Reference in New Issue
Block a user