mirror of https://github.com/jlelse/GoBlog
Fix editor with preset parameters
This commit is contained in:
parent
b5e41b1ceb
commit
c89302b2ab
140
editor.go
140
editor.go
|
@ -2,7 +2,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/carlmjohnson/requests"
|
||||||
"go.goblog.app/app/pkgs/bufferpool"
|
"go.goblog.app/app/pkgs/bufferpool"
|
||||||
"go.goblog.app/app/pkgs/contenttype"
|
"go.goblog.app/app/pkgs/contenttype"
|
||||||
"go.goblog.app/app/pkgs/htmlbuilder"
|
"go.goblog.app/app/pkgs/htmlbuilder"
|
||||||
|
@ -86,83 +86,71 @@ func (a *goBlog) createMarkdownPreview(w io.Writer, blog string, markdown io.Rea
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *goBlog) serveEditorPost(w http.ResponseWriter, r *http.Request) {
|
func (a *goBlog) serveEditorPost(w http.ResponseWriter, r *http.Request) {
|
||||||
if action := r.FormValue("editoraction"); action != "" {
|
switch action := r.FormValue("editoraction"); action {
|
||||||
switch action {
|
case "loadupdate":
|
||||||
case "loadupdate":
|
post, err := a.getPost(r.FormValue("path"))
|
||||||
post, err := a.getPost(r.FormValue("path"))
|
if err != nil {
|
||||||
if err != nil {
|
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
||||||
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
a.render(w, r, a.renderEditor, &renderData{
|
|
||||||
Data: &editorRenderData{
|
|
||||||
presetParams: parsePresetPostParamsFromQuery(r),
|
|
||||||
updatePostUrl: a.fullPostURL(post),
|
|
||||||
updatePostContent: a.postToMfItem(post).Properties.Content[0],
|
|
||||||
},
|
|
||||||
})
|
|
||||||
case "updatepost":
|
|
||||||
buf := bufferpool.Get()
|
|
||||||
defer bufferpool.Put(buf)
|
|
||||||
err := json.NewEncoder(buf).Encode(map[string]any{
|
|
||||||
"action": actionUpdate,
|
|
||||||
"url": r.FormValue("url"),
|
|
||||||
"replace": map[string][]string{
|
|
||||||
"content": {
|
|
||||||
r.FormValue("content"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "", buf)
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req.Header.Set(contentType, contenttype.JSON)
|
|
||||||
a.editorMicropubPost(w, req, false)
|
|
||||||
case "upload":
|
|
||||||
a.editorMicropubPost(w, r, true)
|
|
||||||
case "tts":
|
|
||||||
parsedURL, err := url.Parse(r.FormValue("url"))
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
post, err := a.getPost(parsedURL.Path)
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = a.createPostTTSAudio(post); err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
http.Redirect(w, r, post.Path, http.StatusFound)
|
|
||||||
case "helpgpx":
|
|
||||||
file, _, err := r.FormFile("file")
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
gpx, err := io.ReadAll(a.min.Get().Reader(contenttype.XML, file))
|
|
||||||
if err != nil {
|
|
||||||
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
w.Header().Set(contentType, contenttype.TextUTF8)
|
|
||||||
_ = yaml.NewEncoder(w).Encode(map[string]string{
|
|
||||||
"gpx": string(gpx),
|
|
||||||
})
|
|
||||||
default:
|
|
||||||
a.serveError(w, r, "Unknown editoraction", http.StatusBadRequest)
|
|
||||||
}
|
}
|
||||||
return
|
a.render(w, r, a.renderEditor, &renderData{
|
||||||
|
Data: &editorRenderData{
|
||||||
|
presetParams: parsePresetPostParamsFromQuery(r),
|
||||||
|
updatePostUrl: a.fullPostURL(post),
|
||||||
|
updatePostContent: a.postToMfItem(post).Properties.Content[0],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
case "createpost", "updatepost":
|
||||||
|
reqBody := map[string]any{}
|
||||||
|
if action == "updatepost" {
|
||||||
|
reqBody["action"] = actionUpdate
|
||||||
|
reqBody["url"] = r.FormValue("url")
|
||||||
|
reqBody["replace"] = map[string][]string{"content": {r.FormValue("content")}}
|
||||||
|
} else {
|
||||||
|
reqBody["type"] = []string{"h-entry"}
|
||||||
|
reqBody["properties"] = map[string][]string{"content": {r.FormValue("content")}}
|
||||||
|
}
|
||||||
|
req, _ := requests.URL("").BodyJSON(reqBody).Request(r.Context())
|
||||||
|
a.editorMicropubPost(w, req, false)
|
||||||
|
case "upload":
|
||||||
|
a.editorMicropubPost(w, r, true)
|
||||||
|
case "delete", "undelete":
|
||||||
|
req, _ := requests.URL("").Method(http.MethodPost).ContentType(contenttype.WWWForm).Param("action", action).Param("url", r.FormValue("url")).Request(r.Context())
|
||||||
|
a.editorMicropubPost(w, req, false)
|
||||||
|
case "tts":
|
||||||
|
parsedURL, err := url.Parse(r.FormValue("url"))
|
||||||
|
if err != nil {
|
||||||
|
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
post, err := a.getPost(parsedURL.Path)
|
||||||
|
if err != nil {
|
||||||
|
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = a.createPostTTSAudio(post); err != nil {
|
||||||
|
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
http.Redirect(w, r, post.Path, http.StatusFound)
|
||||||
|
case "helpgpx":
|
||||||
|
file, _, err := r.FormFile("file")
|
||||||
|
if err != nil {
|
||||||
|
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gpx, err := io.ReadAll(a.min.Get().Reader(contenttype.XML, file))
|
||||||
|
if err != nil {
|
||||||
|
a.serveError(w, r, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set(contentType, contenttype.TextUTF8)
|
||||||
|
_ = yaml.NewEncoder(w).Encode(map[string]string{
|
||||||
|
"gpx": string(gpx),
|
||||||
|
})
|
||||||
|
default:
|
||||||
|
a.serveError(w, r, "Unknown or missing editoraction", http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
a.editorMicropubPost(w, r, false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *goBlog) editorMicropubPost(w http.ResponseWriter, r *http.Request, media bool) {
|
func (a *goBlog) editorMicropubPost(w http.ResponseWriter, r *http.Request, media bool) {
|
||||||
|
|
4
go.mod
4
go.mod
|
@ -108,8 +108,8 @@ require (
|
||||||
github.com/pelletier/go-toml/v2 v2.0.7 // indirect
|
github.com/pelletier/go-toml/v2 v2.0.7 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/rs/xid v1.4.0 // indirect
|
github.com/rs/xid v1.5.0 // indirect
|
||||||
github.com/rs/zerolog v1.29.0 // indirect
|
github.com/rs/zerolog v1.29.1 // indirect
|
||||||
github.com/snabb/diagio v1.0.4 // indirect
|
github.com/snabb/diagio v1.0.4 // indirect
|
||||||
github.com/spf13/afero v1.9.5 // indirect
|
github.com/spf13/afero v1.9.5 // indirect
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
|
9
go.sum
9
go.sum
|
@ -81,7 +81,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866 h1:8Cji9JDEuYibvDQrWHvc42r9/HxjlD2kahN67LECXFk=
|
github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866 h1:8Cji9JDEuYibvDQrWHvc42r9/HxjlD2kahN67LECXFk=
|
||||||
github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
||||||
|
@ -350,10 +350,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
|
||||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||||
github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
|
|
||||||
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w=
|
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
|
||||||
github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
|
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
|
github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc=
|
||||||
|
github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU=
|
||||||
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
|
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
|
||||||
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
|
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
|
||||||
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=
|
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=
|
||||||
|
|
6
ui.go
6
ui.go
|
@ -915,14 +915,14 @@ func (a *goBlog) renderPost(hb *htmlbuilder.HtmlBuilder, rd *renderData) {
|
||||||
hb.WriteElementClose("form")
|
hb.WriteElementClose("form")
|
||||||
// Delete
|
// Delete
|
||||||
hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor"))
|
hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor"))
|
||||||
hb.WriteElementOpen("input", "type", "hidden", "name", "action", "value", "delete")
|
hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "delete")
|
||||||
hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical)
|
hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical)
|
||||||
hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "delete"), "class", "confirm", "data-confirmmessage", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "confirmdelete"))
|
hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "delete"), "class", "confirm", "data-confirmmessage", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "confirmdelete"))
|
||||||
hb.WriteElementClose("form")
|
hb.WriteElementClose("form")
|
||||||
// Undelete
|
// Undelete
|
||||||
if p.Deleted() {
|
if p.Deleted() {
|
||||||
hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor"))
|
hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor"))
|
||||||
hb.WriteElementOpen("input", "type", "hidden", "name", "action", "value", "undelete")
|
hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "undelete")
|
||||||
hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical)
|
hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical)
|
||||||
hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "undelete"))
|
hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "undelete"))
|
||||||
hb.WriteElementClose("form")
|
hb.WriteElementClose("form")
|
||||||
|
@ -1356,7 +1356,7 @@ func (a *goBlog) renderEditor(hb *htmlbuilder.HtmlBuilder, rd *renderData) {
|
||||||
hb.WriteElementClose("h2")
|
hb.WriteElementClose("h2")
|
||||||
_ = a.renderMarkdownToWriter(hb, a.editorPostDesc(rd.Blog), false)
|
_ = a.renderMarkdownToWriter(hb, a.editorPostDesc(rd.Blog), false)
|
||||||
hb.WriteElementOpen("form", "method", "post", "class", "fw p")
|
hb.WriteElementOpen("form", "method", "post", "class", "fw p")
|
||||||
hb.WriteElementOpen("input", "type", "hidden", "name", "h", "value", "entry")
|
hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "createpost")
|
||||||
hb.WriteElementOpen(
|
hb.WriteElementOpen(
|
||||||
"input", "id", "templatebtn", "type", "button",
|
"input", "id", "templatebtn", "type", "button",
|
||||||
"value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "editorusetemplate"),
|
"value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "editorusetemplate"),
|
||||||
|
|
Loading…
Reference in New Issue