diff --git a/assets/assets.qtpl b/assets/assets.qtpl
index a3a56f6..d334fa5 100644
--- a/assets/assets.qtpl
+++ b/assets/assets.qtpl
@@ -10,6 +10,10 @@ Usage of %s:
{% cat "default.css" %}
{% endfunc %}
+{% func ToolbarJS() %}
+{% cat "toolbar.js" %}
+{% endfunc %}
+
Next three are from https://remixicon.com/
{% func IconHTTP() %}
{% cat "icon/http-protocol-icon.svg" %}
diff --git a/assets/assets.qtpl.go b/assets/assets.qtpl.go
index fb79b57..6ff02ce 100644
--- a/assets/assets.qtpl.go
+++ b/assets/assets.qtpl.go
@@ -414,136 +414,186 @@ func DefaultCSS() string {
//line assets/assets.qtpl:11
}
+//line assets/assets.qtpl:13
+func StreamToolbarJS(qw422016 *qt422016.Writer) {
+//line assets/assets.qtpl:13
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:14
+ qw422016.N().S(`const editTextarea = document.getElementsByClassName('edit-form__textarea')[0]
+
+function insertTextAtCursor(text, el = editTextarea) {
+ const [start, end] = [el.selectionStart, el.selectionEnd];
+ el.setRangeText(text, start, end, 'select');
+}
+
+function insertDate() {
+ let date = new Date().toISOString().split('T')[0]
+ insertTextAtCursor(date)
+}
+`)
+//line assets/assets.qtpl:14
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:15
+}
+
+//line assets/assets.qtpl:15
+func WriteToolbarJS(qq422016 qtio422016.Writer) {
+//line assets/assets.qtpl:15
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line assets/assets.qtpl:15
+ StreamToolbarJS(qw422016)
+//line assets/assets.qtpl:15
+ qt422016.ReleaseWriter(qw422016)
+//line assets/assets.qtpl:15
+}
+
+//line assets/assets.qtpl:15
+func ToolbarJS() string {
+//line assets/assets.qtpl:15
+ qb422016 := qt422016.AcquireByteBuffer()
+//line assets/assets.qtpl:15
+ WriteToolbarJS(qb422016)
+//line assets/assets.qtpl:15
+ qs422016 := string(qb422016.B)
+//line assets/assets.qtpl:15
+ qt422016.ReleaseByteBuffer(qb422016)
+//line assets/assets.qtpl:15
+ return qs422016
+//line assets/assets.qtpl:15
+}
+
// Next three are from https://remixicon.com/
-//line assets/assets.qtpl:14
+//line assets/assets.qtpl:18
func StreamIconHTTP(qw422016 *qt422016.Writer) {
-//line assets/assets.qtpl:14
+//line assets/assets.qtpl:18
qw422016.N().S(`
`)
-//line assets/assets.qtpl:15
+//line assets/assets.qtpl:19
qw422016.N().S(`
`)
-//line assets/assets.qtpl:15
- qw422016.N().S(`
-`)
-//line assets/assets.qtpl:16
-}
-
-//line assets/assets.qtpl:16
-func WriteIconHTTP(qq422016 qtio422016.Writer) {
-//line assets/assets.qtpl:16
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line assets/assets.qtpl:16
- StreamIconHTTP(qw422016)
-//line assets/assets.qtpl:16
- qt422016.ReleaseWriter(qw422016)
-//line assets/assets.qtpl:16
-}
-
-//line assets/assets.qtpl:16
-func IconHTTP() string {
-//line assets/assets.qtpl:16
- qb422016 := qt422016.AcquireByteBuffer()
-//line assets/assets.qtpl:16
- WriteIconHTTP(qb422016)
-//line assets/assets.qtpl:16
- qs422016 := string(qb422016.B)
-//line assets/assets.qtpl:16
- qt422016.ReleaseByteBuffer(qb422016)
-//line assets/assets.qtpl:16
- return qs422016
-//line assets/assets.qtpl:16
-}
-
-//line assets/assets.qtpl:18
-func StreamIconGemini(qw422016 *qt422016.Writer) {
-//line assets/assets.qtpl:18
- qw422016.N().S(`
-`)
//line assets/assets.qtpl:19
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:20
+}
+
+//line assets/assets.qtpl:20
+func WriteIconHTTP(qq422016 qtio422016.Writer) {
+//line assets/assets.qtpl:20
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line assets/assets.qtpl:20
+ StreamIconHTTP(qw422016)
+//line assets/assets.qtpl:20
+ qt422016.ReleaseWriter(qw422016)
+//line assets/assets.qtpl:20
+}
+
+//line assets/assets.qtpl:20
+func IconHTTP() string {
+//line assets/assets.qtpl:20
+ qb422016 := qt422016.AcquireByteBuffer()
+//line assets/assets.qtpl:20
+ WriteIconHTTP(qb422016)
+//line assets/assets.qtpl:20
+ qs422016 := string(qb422016.B)
+//line assets/assets.qtpl:20
+ qt422016.ReleaseByteBuffer(qb422016)
+//line assets/assets.qtpl:20
+ return qs422016
+//line assets/assets.qtpl:20
+}
+
+//line assets/assets.qtpl:22
+func StreamIconGemini(qw422016 *qt422016.Writer) {
+//line assets/assets.qtpl:22
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:23
qw422016.N().S(`
`)
-//line assets/assets.qtpl:19
- qw422016.N().S(`
-`)
-//line assets/assets.qtpl:20
-}
-
-//line assets/assets.qtpl:20
-func WriteIconGemini(qq422016 qtio422016.Writer) {
-//line assets/assets.qtpl:20
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line assets/assets.qtpl:20
- StreamIconGemini(qw422016)
-//line assets/assets.qtpl:20
- qt422016.ReleaseWriter(qw422016)
-//line assets/assets.qtpl:20
-}
-
-//line assets/assets.qtpl:20
-func IconGemini() string {
-//line assets/assets.qtpl:20
- qb422016 := qt422016.AcquireByteBuffer()
-//line assets/assets.qtpl:20
- WriteIconGemini(qb422016)
-//line assets/assets.qtpl:20
- qs422016 := string(qb422016.B)
-//line assets/assets.qtpl:20
- qt422016.ReleaseByteBuffer(qb422016)
-//line assets/assets.qtpl:20
- return qs422016
-//line assets/assets.qtpl:20
-}
-
-//line assets/assets.qtpl:22
-func StreamIconMailto(qw422016 *qt422016.Writer) {
-//line assets/assets.qtpl:22
- qw422016.N().S(`
-`)
//line assets/assets.qtpl:23
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:24
+}
+
+//line assets/assets.qtpl:24
+func WriteIconGemini(qq422016 qtio422016.Writer) {
+//line assets/assets.qtpl:24
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line assets/assets.qtpl:24
+ StreamIconGemini(qw422016)
+//line assets/assets.qtpl:24
+ qt422016.ReleaseWriter(qw422016)
+//line assets/assets.qtpl:24
+}
+
+//line assets/assets.qtpl:24
+func IconGemini() string {
+//line assets/assets.qtpl:24
+ qb422016 := qt422016.AcquireByteBuffer()
+//line assets/assets.qtpl:24
+ WriteIconGemini(qb422016)
+//line assets/assets.qtpl:24
+ qs422016 := string(qb422016.B)
+//line assets/assets.qtpl:24
+ qt422016.ReleaseByteBuffer(qb422016)
+//line assets/assets.qtpl:24
+ return qs422016
+//line assets/assets.qtpl:24
+}
+
+//line assets/assets.qtpl:26
+func StreamIconMailto(qw422016 *qt422016.Writer) {
+//line assets/assets.qtpl:26
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:27
qw422016.N().S(`
`)
-//line assets/assets.qtpl:23
- qw422016.N().S(`
-`)
-//line assets/assets.qtpl:24
-}
-
-//line assets/assets.qtpl:24
-func WriteIconMailto(qq422016 qtio422016.Writer) {
-//line assets/assets.qtpl:24
- qw422016 := qt422016.AcquireWriter(qq422016)
-//line assets/assets.qtpl:24
- StreamIconMailto(qw422016)
-//line assets/assets.qtpl:24
- qt422016.ReleaseWriter(qw422016)
-//line assets/assets.qtpl:24
-}
-
-//line assets/assets.qtpl:24
-func IconMailto() string {
-//line assets/assets.qtpl:24
- qb422016 := qt422016.AcquireByteBuffer()
-//line assets/assets.qtpl:24
- WriteIconMailto(qb422016)
-//line assets/assets.qtpl:24
- qs422016 := string(qb422016.B)
-//line assets/assets.qtpl:24
- qt422016.ReleaseByteBuffer(qb422016)
-//line assets/assets.qtpl:24
- return qs422016
-//line assets/assets.qtpl:24
-}
-
-// This is a modified version of https://www.svgrepo.com/svg/232085/rat
-
-//line assets/assets.qtpl:27
-func StreamIconGopher(qw422016 *qt422016.Writer) {
//line assets/assets.qtpl:27
qw422016.N().S(`
`)
//line assets/assets.qtpl:28
+}
+
+//line assets/assets.qtpl:28
+func WriteIconMailto(qq422016 qtio422016.Writer) {
+//line assets/assets.qtpl:28
+ qw422016 := qt422016.AcquireWriter(qq422016)
+//line assets/assets.qtpl:28
+ StreamIconMailto(qw422016)
+//line assets/assets.qtpl:28
+ qt422016.ReleaseWriter(qw422016)
+//line assets/assets.qtpl:28
+}
+
+//line assets/assets.qtpl:28
+func IconMailto() string {
+//line assets/assets.qtpl:28
+ qb422016 := qt422016.AcquireByteBuffer()
+//line assets/assets.qtpl:28
+ WriteIconMailto(qb422016)
+//line assets/assets.qtpl:28
+ qs422016 := string(qb422016.B)
+//line assets/assets.qtpl:28
+ qt422016.ReleaseByteBuffer(qb422016)
+//line assets/assets.qtpl:28
+ return qs422016
+//line assets/assets.qtpl:28
+}
+
+// This is a modified version of https://www.svgrepo.com/svg/232085/rat
+
+//line assets/assets.qtpl:31
+func StreamIconGopher(qw422016 *qt422016.Writer) {
+//line assets/assets.qtpl:31
+ qw422016.N().S(`
+`)
+//line assets/assets.qtpl:32
qw422016.N().S(`
`)
-//line assets/assets.qtpl:28
+//line assets/assets.qtpl:32
qw422016.N().S(`
`)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
}
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
func WriteIconGopher(qq422016 qtio422016.Writer) {
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
qw422016 := qt422016.AcquireWriter(qq422016)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
StreamIconGopher(qw422016)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
qt422016.ReleaseWriter(qw422016)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
}
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
func IconGopher() string {
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
qb422016 := qt422016.AcquireByteBuffer()
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
WriteIconGopher(qb422016)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
qs422016 := string(qb422016.B)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
qt422016.ReleaseByteBuffer(qb422016)
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
return qs422016
-//line assets/assets.qtpl:29
+//line assets/assets.qtpl:33
}
diff --git a/assets/toolbar.js b/assets/toolbar.js
new file mode 100644
index 0000000..a528e73
--- /dev/null
+++ b/assets/toolbar.js
@@ -0,0 +1,11 @@
+const editTextarea = document.getElementsByClassName('edit-form__textarea')[0]
+
+function insertTextAtCursor(text, el = editTextarea) {
+ const [start, end] = [el.selectionStart, el.selectionEnd];
+ el.setRangeText(text, start, end, 'select');
+}
+
+function insertDate() {
+ let date = new Date().toISOString().split('T')[0]
+ insertTextAtCursor(date)
+}
diff --git a/main.go b/main.go
index b9ff7d1..e5b8953 100644
--- a/main.go
+++ b/main.go
@@ -117,6 +117,12 @@ func handlerStyle(w http.ResponseWriter, rq *http.Request) {
}
}
+func handlerToolbar(w http.ResponseWriter, rq *http.Request) {
+ log.Println(rq.URL)
+ w.Header().Set("Content-Type", "text/javascript;charset=utf-8")
+ w.Write([]byte(assets.ToolbarJS()))
+}
+
func handlerIcon(w http.ResponseWriter, rq *http.Request) {
iconName := strings.TrimPrefix(rq.URL.Path, "/static/icon/")
if iconName == "https" {
@@ -199,6 +205,7 @@ func main() {
http.ServeFile(w, rq, WikiDir+"/static/favicon.ico")
})
http.HandleFunc("/static/common.css", handlerStyle)
+ http.HandleFunc("/static/toolbar.js", handlerToolbar)
http.HandleFunc("/static/icon/", handlerIcon)
http.HandleFunc("/robots.txt", handlerRobotsTxt)
http.HandleFunc("/", func(w http.ResponseWriter, rq *http.Request) {
diff --git a/views/mutators.qtpl b/views/mutators.qtpl
index ff7cbf0..dfcc049 100644
--- a/views/mutators.qtpl
+++ b/views/mutators.qtpl
@@ -7,9 +7,12 @@
Edit {%s util.BeautifulName(hyphaName) %}
{%s= warning %}
+
Note that the hypha is not saved yet. You can preview the changes ↓