1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-04 18:19:54 +00:00

Migrate /edit to html/template

This commit is contained in:
Umar Getagazov 2022-08-19 22:24:59 +03:00 committed by bouncepaw
parent caa1bcf8bb
commit 4ede2783c5
7 changed files with 210 additions and 630 deletions

View File

@ -2,16 +2,51 @@ package hypview
import (
"embed"
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/viewutil"
"html/template"
"log"
"strings"
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/viewutil"
)
var (
//go:embed *.html
fs embed.FS
ruTranslation = `
{{define "editing hypha"}}Редактирование {{beautifulName .}}{{end}}
{{define "editing [[hypha]]"}}Редактирование <a href="/hypha/{{.}}">{{beautifulName .}}</a>{{end}}
{{define "you're creating a new hypha"}}Вы создаёте новую гифу.{{end}}
{{define "describe your changes"}}Опишите ваши правки{{end}}
{{define "save"}}Сохранить{{end}}
{{define "preview"}}Предпросмотр{{end}}
{{define "previewing hypha"}}Предпросмотр «{{beautifulName .}}»{{end}}
{{define "preview tip"}}Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:{{end}}
{{define "markup"}}Разметка{{end}}
{{define "link"}}Ссылка{{end}}
{{define "link title"}}Текст{{end}}
{{define "heading"}}Заголовок{{end}}
{{define "bold"}}Жирный{{end}}
{{define "italic"}}Курсив{{end}}
{{define "highlight"}}Выделение{{end}}
{{define "underline"}}Подчеркивание{{end}}
{{define "mono"}}Моноширинный{{end}}
{{define "super"}}Надстрочный{{end}}
{{define "sub"}}Подстрочный{{end}}
{{define "strike"}}Зачёркнутый{{end}}
{{define "rocket"}}Ссылка-ракета{{end}}
{{define "transclude"}}Трансклюзия{{end}}
{{define "hr"}}Гориз. черта{{end}}
{{define "code"}}Код-блок{{end}}
{{define "bullets"}}Маркир. список{{end}}
{{define "numbers"}}Нумер. список{{end}}
{{define "mycomarkup help"}}<a href="/help/en/mycomarkup" class="shy-link">Подробнее</a> о микоразметке{{end}}
{{define "actions"}}Действия{{end}}
{{define "current date"}}Текущая дата{{end}}
{{define "current time"}}Текущее время{{end}}
{{define "selflink"}}Ссылка на вас{{end}}
{{define "empty heading"}}Эта гифа не существует{{end}}
{{define "empty no rights"}}У вас нет прав для создания новых гиф. Вы можете:{{end}}
{{define "empty log in"}}Войти в свою учётную запись, если она у вас есть{{end}}
@ -37,6 +72,7 @@ var (
{{define "leave redirections"}}Оставить перенаправления{{end}}
`
chainNaviTitle viewutil.Chain
chainEditHypha viewutil.Chain
chainEmptyHypha viewutil.Chain
chainDeleteHypha viewutil.Chain
chainRenameHypha viewutil.Chain
@ -44,11 +80,35 @@ var (
func Init() {
chainNaviTitle = viewutil.CopyEnRuWith(fs, "view_navititle.html", "")
chainEditHypha = viewutil.CopyEnRuWith(fs, "view_edit.html", ruTranslation)
chainEmptyHypha = viewutil.CopyEnRuWith(fs, "view_empty_hypha.html", ruTranslation)
chainDeleteHypha = viewutil.CopyEnRuWith(fs, "view_delete.html", ruTranslation)
chainRenameHypha = viewutil.CopyEnRuWith(fs, "view_rename.html", ruTranslation)
}
type editData struct {
*viewutil.BaseData
HyphaName string
IsNew bool
Content string
Message string
Preview template.HTML
}
func EditHypha(meta viewutil.Meta, hyphaName string, isNew bool, content string, message string, preview template.HTML) {
viewutil.ExecutePage(meta, chainEditHypha, editData{
BaseData: &viewutil.BaseData{
Addr: "/edit/" + hyphaName,
EditScripts: cfg.EditScripts,
},
HyphaName: hyphaName,
IsNew: isNew,
Content: content,
Message: message,
Preview: preview,
})
}
type deleteRenameData struct {
*viewutil.BaseData
HyphaName string

View File

@ -1,123 +0,0 @@
{% import "fmt" %}
{% import "net/http" %}
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/l18n" %}
{% import "github.com/bouncepaw/mycorrhiza/user" %}
{% func Toolbar(u *user.User, lc *l18n.Localizer) %}
<aside class="edit-toolbar markup-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">{%s lc.Get("edit.markup")%}</h2>
<section class="edit-toolbar__buttons">
{% for _, el := range []struct{
class string
display string
}{
{"link", fmt.Sprintf("[[%s]]", lc.Get("edit.link"))},
{"titlelink", fmt.Sprintf("[[%s | %s]]", lc.Get("edit.link"), lc.Get("edit.link_title"))},
{"heading1", fmt.Sprintf("= %s", lc.Get("edit.heading"))},
{"heading2", fmt.Sprintf("== %s", lc.Get("edit.heading"))},
{"bold", fmt.Sprintf("<b>**%s**</b>", lc.Get("edit.bold"))},
{"italic", fmt.Sprintf("<i>//%s//</i>", lc.Get("edit.italic"))},
{"highlighted", fmt.Sprintf("<mark>++%s++</mark>", lc.Get("edit.highlight"))},
{"underline", fmt.Sprintf("<u>__%s__</u>", lc.Get("edit.underline"))},
{"monospace", fmt.Sprintf("<code>`%s`</code>", lc.Get("edit.mono"))},
{"lifted", fmt.Sprintf("<sup>^^%s^^</sup>", lc.Get("edit.super"))}, // inconsistent names: lifted, supertext. How cute ❤️
{"lowered", fmt.Sprintf("<sub>,,%s,,</sub>", lc.Get("edit.sub"))},
{"strikethrough", fmt.Sprintf("<strike>~~%s~~</strike>", lc.Get("edit.strike"))},
{"rocket", "=> " + lc.Get("edit.rocket")},
{"xcl", "<= " + lc.Get("edit.transclude")},
{"img", "<code>img {}</code>"},
{"table", "<code>table {}</code>"},
{"hr", lc.Get("edit.hr")},
{"codeblock", lc.Get("edit.code")},
{"bulletedlist", "* " + lc.Get("edit.bullets")},
{"numberedlist", "*. " + lc.Get("edit.numbers")},
} %}
<button class="btn edit-toolbar__btn edit-toolbar__{%s el.class %}">
{%s= el.display %}
</button>
{% endfor %}
</section>
<p class="edit-toolbar__ad">{%s= lc.Get("edit.help", &l18n.Replacements{"link": fmt.Sprintf("<a href=\"/help/en/mycomarkup\" target=\"_blank\" class=\"shy-link\">%s</a>", lc.Get("edit.help_link"))}) %}</p>
</aside>
<aside class="edit-toolbar action-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">{%s lc.Get("edit.actions")%}</h2>
<section class="edit-toolbar__buttons">
{% for _, el := range []struct{
class string
display string
}{
{"date", lc.Get("edit.date")},
{"time", lc.Get("edit.time")},
} %}
<button class="btn edit-toolbar__btn edit-toolbar__{%s el.class %}">
{%s= el.display %}
</button>
{% endfor %}
{% if u.Group != "anon" %}
<button class="btn edit-toolbar__btn edit-toolbar__user-link">
{%s lc.Get("edit.selflink") %}
</button>
{% endif %}
</section>
</aside>
<script src="/static/toolbar.js"></script>
{% endfunc %}
{% func Editor(rq *http.Request, hyphaName, textAreaFill, warning string) %}
{% code
lc := l18n.FromRequest(rq)
%}
<main class="main-width edit edit_no-preview">
<form method="post" class="edit-form"
action="/upload-text/{%s hyphaName %}">
<h1 class="edit__title">{%s= fmt.Sprintf(lc.Get("edit.title"), beautifulLink(hyphaName)) %}</h1>
{%s= warning %}
<textarea name="text" class="edit-form__textarea" autofocus>{%s textAreaFill %}</textarea>
<p class="edit-form__message-zone">
<input id="text" type="text" name="message" class="edit-form__message" placeholder="{%s lc.Get("edit.tag") %}" aria-label="{%s lc.Get("edit.tag") %}">
</p>
<p class="edit-form__buttons">
<button type="submit" name="action" class="btn btn_accent edit-form__save" value="Save">{%s lc.Get("edit.save") %}</button>
<button type="submit" name="action" class="btn edit-form__preview" value="Preview">{%s lc.Get("edit.preview") %}</button>
<a href="/hypha/{%s hyphaName %}" class="btn btn_weak">{%s lc.Get("ui.cancel") %}</a>
</p>
</form>
</main>
{%s= Toolbar(user.FromRequest(rq), lc) %}
{%= editScripts() %}
{% endfunc %}
{% func Preview(rq *http.Request, hyphaName, textAreaFill, message, warning string, renderedPage string) %}
{% code
lc := l18n.FromRequest(rq)
%}
<main class="main-width edit edit_with-preview">
<form method="post" class="edit-form"
action="/upload-text/{%s hyphaName %}">
<h1 class="edit__title">{%s= fmt.Sprintf(lc.Get("edit.title"), beautifulLink(hyphaName)) %}</h1>
{%s= warning %}
<textarea name="text" class="edit-form__textarea" autofocus>{%s textAreaFill %}</textarea>
<p class="edit-form__message-zone">
<input id="text" type="text" name="message" class="edit-form__message" placeholder="{%s lc.Get("edit.tag") %}" aria-label="{%s lc.Get("edit.tag") %}">
</p>
<p class="edit-form__buttons">
<button type="submit" name="action" class="btn btn_accent edit-form__save" value="Save">{%s lc.Get("edit.save") %}</button>
<button type="submit" name="action" class="btn edit-form__preview" value="Preview">{%s lc.Get("edit.preview") %}</button>
<a href="/hypha/{%s hyphaName %}" class="btn btn_weak">{%s lc.Get("ui.cancel") %}</a>
</p>
</form>
<p class="warning">{%s lc.Get("edit.preview_tip") %}</p>
<article class="edit__preview">{%s= renderedPage %}</article>
</main>
{%s= Toolbar(user.FromRequest(rq), lc) %}
{%= editScripts() %}
{% endfunc %}
{% func editScripts() %}
<script src="/static/editor.js"></script>
{% for _, scriptPath := range cfg.EditScripts %}
<script src="{%s scriptPath %}"></script>
{% endfor %}
{% endfunc %}

View File

@ -1,452 +0,0 @@
// Code generated by qtc from "mutators.qtpl". DO NOT EDIT.
// See https://github.com/valyala/quicktemplate for details.
//line hypview/mutators.qtpl:1
package hypview
//line hypview/mutators.qtpl:1
import "fmt"
//line hypview/mutators.qtpl:2
import "net/http"
//line hypview/mutators.qtpl:4
import "github.com/bouncepaw/mycorrhiza/cfg"
//line hypview/mutators.qtpl:5
import "github.com/bouncepaw/mycorrhiza/l18n"
//line hypview/mutators.qtpl:6
import "github.com/bouncepaw/mycorrhiza/user"
//line hypview/mutators.qtpl:8
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
//line hypview/mutators.qtpl:8
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
//line hypview/mutators.qtpl:8
func StreamToolbar(qw422016 *qt422016.Writer, u *user.User, lc *l18n.Localizer) {
//line hypview/mutators.qtpl:8
qw422016.N().S(`
<aside class="edit-toolbar markup-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">`)
//line hypview/mutators.qtpl:10
qw422016.E().S(lc.Get("edit.markup"))
//line hypview/mutators.qtpl:10
qw422016.N().S(`</h2>
<section class="edit-toolbar__buttons">
`)
//line hypview/mutators.qtpl:12
for _, el := range []struct {
class string
display string
}{
{"link", fmt.Sprintf("[[%s]]", lc.Get("edit.link"))},
{"titlelink", fmt.Sprintf("[[%s | %s]]", lc.Get("edit.link"), lc.Get("edit.link_title"))},
{"heading1", fmt.Sprintf("= %s", lc.Get("edit.heading"))},
{"heading2", fmt.Sprintf("== %s", lc.Get("edit.heading"))},
{"bold", fmt.Sprintf("<b>**%s**</b>", lc.Get("edit.bold"))},
{"italic", fmt.Sprintf("<i>//%s//</i>", lc.Get("edit.italic"))},
{"highlighted", fmt.Sprintf("<mark>++%s++</mark>", lc.Get("edit.highlight"))},
{"underline", fmt.Sprintf("<u>__%s__</u>", lc.Get("edit.underline"))},
{"monospace", fmt.Sprintf("<code>`%s`</code>", lc.Get("edit.mono"))},
{"lifted", fmt.Sprintf("<sup>^^%s^^</sup>", lc.Get("edit.super"))}, // inconsistent names: lifted, supertext. How cute ❤️
{"lowered", fmt.Sprintf("<sub>,,%s,,</sub>", lc.Get("edit.sub"))},
{"strikethrough", fmt.Sprintf("<strike>~~%s~~</strike>", lc.Get("edit.strike"))},
{"rocket", "=> " + lc.Get("edit.rocket")},
{"xcl", "<= " + lc.Get("edit.transclude")},
{"img", "<code>img {}</code>"},
{"table", "<code>table {}</code>"},
{"hr", lc.Get("edit.hr")},
{"codeblock", lc.Get("edit.code")},
{"bulletedlist", "* " + lc.Get("edit.bullets")},
{"numberedlist", "*. " + lc.Get("edit.numbers")},
} {
//line hypview/mutators.qtpl:36
qw422016.N().S(`
<button class="btn edit-toolbar__btn edit-toolbar__`)
//line hypview/mutators.qtpl:37
qw422016.E().S(el.class)
//line hypview/mutators.qtpl:37
qw422016.N().S(`">
`)
//line hypview/mutators.qtpl:38
qw422016.N().S(el.display)
//line hypview/mutators.qtpl:38
qw422016.N().S(`
</button>
`)
//line hypview/mutators.qtpl:40
}
//line hypview/mutators.qtpl:40
qw422016.N().S(`
</section>
<p class="edit-toolbar__ad">`)
//line hypview/mutators.qtpl:42
qw422016.N().S(lc.Get("edit.help", &l18n.Replacements{"link": fmt.Sprintf("<a href=\"/help/en/mycomarkup\" target=\"_blank\" class=\"shy-link\">%s</a>", lc.Get("edit.help_link"))}))
//line hypview/mutators.qtpl:42
qw422016.N().S(`</p>
</aside>
<aside class="edit-toolbar action-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">`)
//line hypview/mutators.qtpl:45
qw422016.E().S(lc.Get("edit.actions"))
//line hypview/mutators.qtpl:45
qw422016.N().S(`</h2>
<section class="edit-toolbar__buttons">
`)
//line hypview/mutators.qtpl:47
for _, el := range []struct {
class string
display string
}{
{"date", lc.Get("edit.date")},
{"time", lc.Get("edit.time")},
} {
//line hypview/mutators.qtpl:53
qw422016.N().S(`
<button class="btn edit-toolbar__btn edit-toolbar__`)
//line hypview/mutators.qtpl:54
qw422016.E().S(el.class)
//line hypview/mutators.qtpl:54
qw422016.N().S(`">
`)
//line hypview/mutators.qtpl:55
qw422016.N().S(el.display)
//line hypview/mutators.qtpl:55
qw422016.N().S(`
</button>
`)
//line hypview/mutators.qtpl:57
}
//line hypview/mutators.qtpl:57
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:58
if u.Group != "anon" {
//line hypview/mutators.qtpl:58
qw422016.N().S(`
<button class="btn edit-toolbar__btn edit-toolbar__user-link">
`)
//line hypview/mutators.qtpl:60
qw422016.E().S(lc.Get("edit.selflink"))
//line hypview/mutators.qtpl:60
qw422016.N().S(`
</button>
`)
//line hypview/mutators.qtpl:62
}
//line hypview/mutators.qtpl:62
qw422016.N().S(`
</section>
</aside>
<script src="/static/toolbar.js"></script>
`)
//line hypview/mutators.qtpl:66
}
//line hypview/mutators.qtpl:66
func WriteToolbar(qq422016 qtio422016.Writer, u *user.User, lc *l18n.Localizer) {
//line hypview/mutators.qtpl:66
qw422016 := qt422016.AcquireWriter(qq422016)
//line hypview/mutators.qtpl:66
StreamToolbar(qw422016, u, lc)
//line hypview/mutators.qtpl:66
qt422016.ReleaseWriter(qw422016)
//line hypview/mutators.qtpl:66
}
//line hypview/mutators.qtpl:66
func Toolbar(u *user.User, lc *l18n.Localizer) string {
//line hypview/mutators.qtpl:66
qb422016 := qt422016.AcquireByteBuffer()
//line hypview/mutators.qtpl:66
WriteToolbar(qb422016, u, lc)
//line hypview/mutators.qtpl:66
qs422016 := string(qb422016.B)
//line hypview/mutators.qtpl:66
qt422016.ReleaseByteBuffer(qb422016)
//line hypview/mutators.qtpl:66
return qs422016
//line hypview/mutators.qtpl:66
}
//line hypview/mutators.qtpl:68
func StreamEditor(qw422016 *qt422016.Writer, rq *http.Request, hyphaName, textAreaFill, warning string) {
//line hypview/mutators.qtpl:68
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:70
lc := l18n.FromRequest(rq)
//line hypview/mutators.qtpl:71
qw422016.N().S(`
<main class="main-width edit edit_no-preview">
<form method="post" class="edit-form"
action="/upload-text/`)
//line hypview/mutators.qtpl:74
qw422016.E().S(hyphaName)
//line hypview/mutators.qtpl:74
qw422016.N().S(`">
<h1 class="edit__title">`)
//line hypview/mutators.qtpl:75
qw422016.N().S(fmt.Sprintf(lc.Get("edit.title"), beautifulLink(hyphaName)))
//line hypview/mutators.qtpl:75
qw422016.N().S(`</h1>
`)
//line hypview/mutators.qtpl:76
qw422016.N().S(warning)
//line hypview/mutators.qtpl:76
qw422016.N().S(`
<textarea name="text" class="edit-form__textarea" autofocus>`)
//line hypview/mutators.qtpl:77
qw422016.E().S(textAreaFill)
//line hypview/mutators.qtpl:77
qw422016.N().S(`</textarea>
<p class="edit-form__message-zone">
<input id="text" type="text" name="message" class="edit-form__message" placeholder="`)
//line hypview/mutators.qtpl:79
qw422016.E().S(lc.Get("edit.tag"))
//line hypview/mutators.qtpl:79
qw422016.N().S(`" aria-label="`)
//line hypview/mutators.qtpl:79
qw422016.E().S(lc.Get("edit.tag"))
//line hypview/mutators.qtpl:79
qw422016.N().S(`">
</p>
<p class="edit-form__buttons">
<button type="submit" name="action" class="btn btn_accent edit-form__save" value="Save">`)
//line hypview/mutators.qtpl:82
qw422016.E().S(lc.Get("edit.save"))
//line hypview/mutators.qtpl:82
qw422016.N().S(`</button>
<button type="submit" name="action" class="btn edit-form__preview" value="Preview">`)
//line hypview/mutators.qtpl:83
qw422016.E().S(lc.Get("edit.preview"))
//line hypview/mutators.qtpl:83
qw422016.N().S(`</button>
<a href="/hypha/`)
//line hypview/mutators.qtpl:84
qw422016.E().S(hyphaName)
//line hypview/mutators.qtpl:84
qw422016.N().S(`" class="btn btn_weak">`)
//line hypview/mutators.qtpl:84
qw422016.E().S(lc.Get("ui.cancel"))
//line hypview/mutators.qtpl:84
qw422016.N().S(`</a>
</p>
</form>
</main>
`)
//line hypview/mutators.qtpl:88
qw422016.N().S(Toolbar(user.FromRequest(rq), lc))
//line hypview/mutators.qtpl:88
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:89
streameditScripts(qw422016)
//line hypview/mutators.qtpl:89
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:90
}
//line hypview/mutators.qtpl:90
func WriteEditor(qq422016 qtio422016.Writer, rq *http.Request, hyphaName, textAreaFill, warning string) {
//line hypview/mutators.qtpl:90
qw422016 := qt422016.AcquireWriter(qq422016)
//line hypview/mutators.qtpl:90
StreamEditor(qw422016, rq, hyphaName, textAreaFill, warning)
//line hypview/mutators.qtpl:90
qt422016.ReleaseWriter(qw422016)
//line hypview/mutators.qtpl:90
}
//line hypview/mutators.qtpl:90
func Editor(rq *http.Request, hyphaName, textAreaFill, warning string) string {
//line hypview/mutators.qtpl:90
qb422016 := qt422016.AcquireByteBuffer()
//line hypview/mutators.qtpl:90
WriteEditor(qb422016, rq, hyphaName, textAreaFill, warning)
//line hypview/mutators.qtpl:90
qs422016 := string(qb422016.B)
//line hypview/mutators.qtpl:90
qt422016.ReleaseByteBuffer(qb422016)
//line hypview/mutators.qtpl:90
return qs422016
//line hypview/mutators.qtpl:90
}
//line hypview/mutators.qtpl:92
func StreamPreview(qw422016 *qt422016.Writer, rq *http.Request, hyphaName, textAreaFill, message, warning string, renderedPage string) {
//line hypview/mutators.qtpl:92
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:94
lc := l18n.FromRequest(rq)
//line hypview/mutators.qtpl:95
qw422016.N().S(`
<main class="main-width edit edit_with-preview">
<form method="post" class="edit-form"
action="/upload-text/`)
//line hypview/mutators.qtpl:98
qw422016.E().S(hyphaName)
//line hypview/mutators.qtpl:98
qw422016.N().S(`">
<h1 class="edit__title">`)
//line hypview/mutators.qtpl:99
qw422016.N().S(fmt.Sprintf(lc.Get("edit.title"), beautifulLink(hyphaName)))
//line hypview/mutators.qtpl:99
qw422016.N().S(`</h1>
`)
//line hypview/mutators.qtpl:100
qw422016.N().S(warning)
//line hypview/mutators.qtpl:100
qw422016.N().S(`
<textarea name="text" class="edit-form__textarea" autofocus>`)
//line hypview/mutators.qtpl:101
qw422016.E().S(textAreaFill)
//line hypview/mutators.qtpl:101
qw422016.N().S(`</textarea>
<p class="edit-form__message-zone">
<input id="text" type="text" name="message" class="edit-form__message" placeholder="`)
//line hypview/mutators.qtpl:103
qw422016.E().S(lc.Get("edit.tag"))
//line hypview/mutators.qtpl:103
qw422016.N().S(`" aria-label="`)
//line hypview/mutators.qtpl:103
qw422016.E().S(lc.Get("edit.tag"))
//line hypview/mutators.qtpl:103
qw422016.N().S(`">
</p>
<p class="edit-form__buttons">
<button type="submit" name="action" class="btn btn_accent edit-form__save" value="Save">`)
//line hypview/mutators.qtpl:106
qw422016.E().S(lc.Get("edit.save"))
//line hypview/mutators.qtpl:106
qw422016.N().S(`</button>
<button type="submit" name="action" class="btn edit-form__preview" value="Preview">`)
//line hypview/mutators.qtpl:107
qw422016.E().S(lc.Get("edit.preview"))
//line hypview/mutators.qtpl:107
qw422016.N().S(`</button>
<a href="/hypha/`)
//line hypview/mutators.qtpl:108
qw422016.E().S(hyphaName)
//line hypview/mutators.qtpl:108
qw422016.N().S(`" class="btn btn_weak">`)
//line hypview/mutators.qtpl:108
qw422016.E().S(lc.Get("ui.cancel"))
//line hypview/mutators.qtpl:108
qw422016.N().S(`</a>
</p>
</form>
<p class="warning">`)
//line hypview/mutators.qtpl:111
qw422016.E().S(lc.Get("edit.preview_tip"))
//line hypview/mutators.qtpl:111
qw422016.N().S(`</p>
<article class="edit__preview">`)
//line hypview/mutators.qtpl:112
qw422016.N().S(renderedPage)
//line hypview/mutators.qtpl:112
qw422016.N().S(`</article>
</main>
`)
//line hypview/mutators.qtpl:114
qw422016.N().S(Toolbar(user.FromRequest(rq), lc))
//line hypview/mutators.qtpl:114
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:115
streameditScripts(qw422016)
//line hypview/mutators.qtpl:115
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:116
}
//line hypview/mutators.qtpl:116
func WritePreview(qq422016 qtio422016.Writer, rq *http.Request, hyphaName, textAreaFill, message, warning string, renderedPage string) {
//line hypview/mutators.qtpl:116
qw422016 := qt422016.AcquireWriter(qq422016)
//line hypview/mutators.qtpl:116
StreamPreview(qw422016, rq, hyphaName, textAreaFill, message, warning, renderedPage)
//line hypview/mutators.qtpl:116
qt422016.ReleaseWriter(qw422016)
//line hypview/mutators.qtpl:116
}
//line hypview/mutators.qtpl:116
func Preview(rq *http.Request, hyphaName, textAreaFill, message, warning string, renderedPage string) string {
//line hypview/mutators.qtpl:116
qb422016 := qt422016.AcquireByteBuffer()
//line hypview/mutators.qtpl:116
WritePreview(qb422016, rq, hyphaName, textAreaFill, message, warning, renderedPage)
//line hypview/mutators.qtpl:116
qs422016 := string(qb422016.B)
//line hypview/mutators.qtpl:116
qt422016.ReleaseByteBuffer(qb422016)
//line hypview/mutators.qtpl:116
return qs422016
//line hypview/mutators.qtpl:116
}
//line hypview/mutators.qtpl:118
func streameditScripts(qw422016 *qt422016.Writer) {
//line hypview/mutators.qtpl:118
qw422016.N().S(`
<script src="/static/editor.js"></script>
`)
//line hypview/mutators.qtpl:120
for _, scriptPath := range cfg.EditScripts {
//line hypview/mutators.qtpl:120
qw422016.N().S(`
<script src="`)
//line hypview/mutators.qtpl:121
qw422016.E().S(scriptPath)
//line hypview/mutators.qtpl:121
qw422016.N().S(`"></script>
`)
//line hypview/mutators.qtpl:122
}
//line hypview/mutators.qtpl:122
qw422016.N().S(`
`)
//line hypview/mutators.qtpl:123
}
//line hypview/mutators.qtpl:123
func writeeditScripts(qq422016 qtio422016.Writer) {
//line hypview/mutators.qtpl:123
qw422016 := qt422016.AcquireWriter(qq422016)
//line hypview/mutators.qtpl:123
streameditScripts(qw422016)
//line hypview/mutators.qtpl:123
qt422016.ReleaseWriter(qw422016)
//line hypview/mutators.qtpl:123
}
//line hypview/mutators.qtpl:123
func editScripts() string {
//line hypview/mutators.qtpl:123
qb422016 := qt422016.AcquireByteBuffer()
//line hypview/mutators.qtpl:123
writeeditScripts(qb422016)
//line hypview/mutators.qtpl:123
qs422016 := string(qb422016.B)
//line hypview/mutators.qtpl:123
qt422016.ReleaseByteBuffer(qb422016)
//line hypview/mutators.qtpl:123
return qs422016
//line hypview/mutators.qtpl:123
}

104
hypview/view_edit.html Normal file
View File

@ -0,0 +1,104 @@
{{define "toolbar"}}
<aside class="edit-toolbar markup-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">{{block "markup" .}}Markup{{end}}</h2>
<section class="edit-toolbar__buttons">
<button class="btn edit-toolbar__btn edit-toolbar__link">[[{{block "link" .}}Link{{end}}]]</button>
<button class="btn edit-toolbar__btn edit-toolbar__titlelink">[[{{template "link" .}} | {{block "link title" .}}Title{{end}}]]</button>
<button class="btn edit-toolbar__btn edit-toolbar__heading1">= {{block "heading" .}}Heading{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__heading2">== {{template "heading" .}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__bold"><b>**{{block "bold" .}}Bold{{end}}**</b></button>
<button class="btn edit-toolbar__btn edit-toolbar__italic"><i>//{{block "italic" .}}Italic{{end}}//</i></button>
<button class="btn edit-toolbar__btn edit-toolbar__highlighted"><mark>++{{block "highlight" .}}Highlight{{end}}++</mark></button>
<button class="btn edit-toolbar__btn edit-toolbar__underline"><u>__{{block "underline" .}}Underline{{end}}__</u></button>
<button class="btn edit-toolbar__btn edit-toolbar__monospace"><code>`{{block "mono" .}}Monospace{{end}}`</code></button>
<button class="btn edit-toolbar__btn edit-toolbar__lifted"><sup>^^{{block "super" .}}Supertext{{end}}^^</sup></button>
<button class="btn edit-toolbar__btn edit-toolbar__lowered"><sub>,,{{block "sub" .}}Subtext{{end}},,</sub></button>
<button class="btn edit-toolbar__btn edit-toolbar__strikethrough"><s>~~{{block "strike" .}}Strikethrough{{end}}~~</s></button>
<button class="btn edit-toolbar__btn edit-toolbar__rocket">=> {{block "rocket" .}}Rocketlink{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__xcl"><= {{block "transclude" .}}Transclusion{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__img"><code>img {}</code></button>
<button class="btn edit-toolbar__btn edit-toolbar__table"><code>table {}</code></button>
<button class="btn edit-toolbar__btn edit-toolbar__hr">{{block "hr" .}}Horizontal bar{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__codeblock">{{block "code" .}}Code block{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__bulletedlist">* {{block "bullets" .}}Bullet list{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__numberedlist">*. {{block "numbers" .}}Number list{{end}}</button>
</section>
<p class="edit-toolbar__help">
{{block "mycomarkup help" .}}
<a href="/help/en/mycomarkup" target="_blank" class="shy-link">Learn more</a> about mycomarkup
{{end}}
</p>
</aside>
<aside class="edit-toolbar action-toolbar layout-card">
<h2 class="edit-toolbar__title layout-card__title">{{block "actions" .}}Actions{{end}}</h2>
<section class="edit-toolbar__buttons">
<button class="btn edit-toolbar__btn edit-toolbar__date">{{block "current date" .}}Insert current date{{end}}</button>
<button class="btn edit-toolbar__btn edit-toolbar__time">{{block "current time" .}}Insert current time{{end}}</button>
{{if .Meta.U.Group | ne "anon"}}
<button class="btn edit-toolbar__btn edit-toolbar__user-link">{{block "selflink" .}}Link yourself{{end}}</button>
{{end}}
</section>
</aside>
<script src="/static/toolbar.js"></script>
{{end}}
{{define "editing hypha"}}Edit {{beautifulName .}}{{end}}
{{define "previewing hypha"}}Preview of {{beautifulName .}}{{end}}
{{define "title"}}
{{- if .Preview -}}
{{template "previewing hypha" .HyphaName}}
{{- else -}}
{{template "editing hypha" .HyphaName}}
{{- end -}}
{{end}}
{{define "body"}}
<main class="main-width edit {{if .Preview}}edit_with-preview{{else}}edit_no-preview{{end}}">
<form method="post" class="edit-form" action="/upload-text/{{.HyphaName}}">
<h1 class="edit__title">
{{block "editing [[hypha]]" .HyphaName}}
Edit <a href="/hypha/{{.}}">{{beautifulName .}}</a>
{{end}}
</h1>
{{if .IsNew}}
<p class="warning warning_new-hypha">
{{block "you're creating a new hypha" .}}You are creating a new hypha.{{end}}
</p>
{{end}}
<textarea name="text" class="edit-form__textarea" autofocus>{{.Content}}</textarea>
<p class="edit-form__message-zone">
<input
id="text"
type="text"
name="message"
class="edit-form__message"
value="{{.Message}}"
placeholder="{{block "describe your changes" .}}Describe your changes{{end}}"
aria-label="{{template "describe your changes" .}}">
</p>
<p class="edit-form__buttons">
<button type="submit" name="action" class="btn btn_accent edit-form__save" value="save">
{{template "save" .}}
</button>
<button type="submit" name="action" class="btn edit-form__preview" value="preview">
{{block "preview" .}}Preview{{end}}
</button>
<a href="/hypha/{{.HyphaName}}" class="btn btn_weak">
{{template "cancel" .}}
</a>
</p>
</form>
{{if .Preview}}
<p class="warning">
{{block "preview tip" .}}Note that the hypha hasn't been saved yet. Here's the preview:{{end}}
</p>
<article class="edit__preview">
{{.Preview}}
</article>
{{end}}
</main>
{{template "toolbar" .}}
<script src="/static/editor.js"></script>
{{range .EditScripts}}
<script src="{{.}}"></script>
{{end}}
{{end}}

View File

@ -99,7 +99,7 @@ textarea {font-size:16px; font-family: inherit; line-height: 150%; }
.edit-form p { margin: .25rem 0; }
.edit-form__message { width: 100%; margin: 0.25em 0; }
.edit-form__save { font-weight: bold; }
.edit-toolbar__buttons, .edit-toolbar__ad { margin: .5rem; }
.edit-toolbar__buttons, .edit-toolbar__help { margin: .5rem; }
.edit-form { height: 100%; display: flex; flex-direction: column; }
.icon {margin-right: .25rem; vertical-align: bottom; }

View File

@ -4,12 +4,13 @@ package viewutil
import (
"embed"
"fmt"
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/util"
"io/fs"
"log"
"strings"
"text/template" // TODO: save the world
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/util"
)
var (
@ -95,6 +96,7 @@ type BaseData struct {
HeadElements []string
HeaderLinks []HeaderLink
CommonScripts []string
EditScripts []string
Addr string
Title string // TODO: remove
Body string // TODO: remove
@ -119,6 +121,7 @@ func Base(meta Meta, title, body string, bodyAttributes map[string]string, headE
HeadElements: headElements,
HeaderLinks: HeaderLinks,
CommonScripts: cfg.CommonScripts,
EditScripts: cfg.EditScripts,
Body: body,
BodyAttributes: bodyAttributes,
})

View File

@ -2,12 +2,15 @@ package web
import (
"fmt"
"html/template"
"log"
"net/http"
"github.com/bouncepaw/mycomarkup/v5"
"github.com/bouncepaw/mycorrhiza/hypview"
"github.com/bouncepaw/mycorrhiza/mycoopts"
"github.com/bouncepaw/mycorrhiza/viewutil"
"log"
"net/http"
"github.com/bouncepaw/mycomarkup/v5/mycocontext"
@ -148,80 +151,65 @@ func handlerRename(w http.ResponseWriter, rq *http.Request) {
func handlerEdit(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
var (
hyphaName = util.HyphaNameFromRq(rq, "edit")
h = hyphae.ByName(hyphaName)
warning string
textAreaFill string
err error
u = user.FromRequest(rq)
lc = l18n.FromRequest(rq)
meta = viewutil.MetaFrom(w, rq)
u = user.FromRequest(rq)
lc = l18n.FromRequest(rq)
meta = viewutil.MetaFrom(w, rq)
hyphaName = util.HyphaNameFromRq(rq, "edit")
h = hyphae.ByName(hyphaName)
isNew bool
content string
err error
)
if err := shroom.CanEdit(u, h, lc); err != nil {
viewutil.HttpErr(meta, http.StatusInternalServerError, hyphaName, err.Error())
return
}
switch h.(type) {
case *hyphae.EmptyHypha:
warning = fmt.Sprintf(`<p class="warning warning_new-hypha">%s</p>`, lc.Get("edit.new_hypha"))
isNew = true
default:
textAreaFill, err = hyphae.FetchMycomarkupFile(h)
content, err = hyphae.FetchMycomarkupFile(h)
if err != nil {
log.Println(err)
viewutil.HttpErr(meta, http.StatusInternalServerError, hyphaName, lc.Get("ui.error_text_fetch"))
return
}
}
util.HTTP200Page(
w,
viewutil.Base(
meta,
fmt.Sprintf(lc.Get("edit.title"), util.BeautifulName(hyphaName)),
hypview.Editor(rq, hyphaName, textAreaFill, warning),
map[string]string{}))
hypview.EditHypha(meta, hyphaName, isNew, content, "", "")
}
// handlerUploadText uploads a new text part for the hypha.
func handlerUploadText(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
var (
u = user.FromRequest(rq)
meta = viewutil.MetaFrom(w, rq)
hyphaName = util.HyphaNameFromRq(rq, "upload-text")
h = hyphae.ByName(hyphaName)
textData = rq.PostFormValue("text")
action = rq.PostFormValue("action")
message = rq.PostFormValue("message")
u = user.FromRequest(rq)
lc = l18n.FromRequest(rq)
meta = viewutil.MetaFrom(w, rq)
_, isNew = h.(*hyphae.EmptyHypha)
textData = rq.PostFormValue("text")
action = rq.PostFormValue("action")
message = rq.PostFormValue("message")
)
if action != "Preview" {
if err := shroom.UploadText(h, []byte(textData), message, u); err != nil {
viewutil.HttpErr(meta, http.StatusForbidden, hyphaName, err.Error())
return
}
}
if action == "Preview" {
if action == "preview" {
ctx, _ := mycocontext.ContextFromStringInput(textData, mycoopts.MarkupOptions(hyphaName))
util.HTTP200Page(
w,
viewutil.Base(
meta,
fmt.Sprintf(lc.Get("edit.preview_title"), util.BeautifulName(hyphaName)),
hypview.Preview(
rq,
hyphaName,
textData,
message,
"",
mycomarkup.BlocksToHTML(ctx, mycomarkup.BlockTree(ctx))),
map[string]string{},
))
} else {
http.Redirect(w, rq, "/hypha/"+hyphaName, http.StatusSeeOther)
preview := template.HTML(mycomarkup.BlocksToHTML(ctx, mycomarkup.BlockTree(ctx)))
hypview.EditHypha(meta, hyphaName, isNew, textData, message, preview)
return
}
if err := shroom.UploadText(h, []byte(textData), message, u); err != nil {
viewutil.HttpErr(meta, http.StatusForbidden, hyphaName, err.Error())
return
}
http.Redirect(w, rq, "/hypha/"+hyphaName, http.StatusSeeOther)
}
// handlerUploadBinary uploads a new media for the hypha.