Fix editor with preset parameters

This commit is contained in:
Jan-Lukas Else 2023-04-15 18:46:12 +02:00
parent b5e41b1ceb
commit c89302b2ab
4 changed files with 74 additions and 85 deletions

140
editor.go
View File

@ -2,7 +2,6 @@ package main
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
@ -11,6 +10,7 @@ import (
"strings"
"time"
"github.com/carlmjohnson/requests"
"go.goblog.app/app/pkgs/bufferpool"
"go.goblog.app/app/pkgs/contenttype"
"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) {
if action := r.FormValue("editoraction"); action != "" {
switch action {
case "loadupdate":
post, err := a.getPost(r.FormValue("path"))
if err != nil {
a.serveError(w, r, err.Error(), 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 "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)
switch action := r.FormValue("editoraction"); action {
case "loadupdate":
post, err := a.getPost(r.FormValue("path"))
if err != nil {
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 "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) {

4
go.mod
View File

@ -108,8 +108,8 @@ require (
github.com/pelletier/go-toml/v2 v2.0.7 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rs/xid v1.4.0 // indirect
github.com/rs/zerolog v1.29.0 // indirect
github.com/rs/xid v1.5.0 // indirect
github.com/rs/zerolog v1.29.1 // indirect
github.com/snabb/diagio v1.0.4 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect

9
go.sum
View File

@ -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-20200629203442-efcf912fb354/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/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=
@ -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/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/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w=
github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
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/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=

6
ui.go
View File

@ -915,14 +915,14 @@ func (a *goBlog) renderPost(hb *htmlbuilder.HtmlBuilder, rd *renderData) {
hb.WriteElementClose("form")
// Delete
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", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "delete"), "class", "confirm", "data-confirmmessage", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "confirmdelete"))
hb.WriteElementClose("form")
// Undelete
if p.Deleted() {
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", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "undelete"))
hb.WriteElementClose("form")
@ -1356,7 +1356,7 @@ func (a *goBlog) renderEditor(hb *htmlbuilder.HtmlBuilder, rd *renderData) {
hb.WriteElementClose("h2")
_ = a.renderMarkdownToWriter(hb, a.editorPostDesc(rd.Blog), false)
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(
"input", "id", "templatebtn", "type", "button",
"value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "editorusetemplate"),