1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-10-30 03:36:16 +00:00

Add some styling to help

Now it looks more like usual hyphae
This commit is contained in:
Timur Ismagilov 2021-07-12 14:58:20 +05:00
parent 3e13d6a4db
commit bea80887f4
6 changed files with 346 additions and 148 deletions

View File

@ -1,4 +1,4 @@
# Attachment
# Help: Attachment
In hyphae, an **attachment** is some content represented by something that is not [[/help/en/mycomarkup | Mycomarkup]]. Usually, an image, a video, or an audio.
## Supported attachment types

View File

@ -1,5 +1,5 @@
# Hypha
**Hypha** (//plural:// hyphae) is the main content unit used in Mycorrhiza Wiki.
# Help: Hypha
A **hypha** (//plural:// hyphae) is the main content unit used in Mycorrhiza Wiki.
## The structure of hypha
A hypha consists of two parts:

View File

@ -1,9 +1,12 @@
# Help
This is Mycorrhiza Wiki built-in documentation.
Hope you are doing well ☺️
Here are the topics covered by the documentation:
* [[/help/en/hypha | Hypha]]
** [[/help/en/attachment | Attachment]]
See the section on the right (if you are on computer) or below (if you are on mobile) to see what topics are covered by the documentation.
Thanks for reading!
Thanks for reading!
----
You might want to contribute to the documentation. Open a pull-request on [[https://github.com/bouncepaw/mycorrhiza | GitHub]] if you know how to.

View File

@ -44,6 +44,42 @@
</html>
{% endfunc %}
{% func HelpHTML(content string) %}
<div class="layout">
<main class="main-width help">
<article>
{%s= content %}
</article>
</main>
{%s= helpTopicsHTML() %}
</div>
{% endfunc %}
{% func HelpEmptyErrorHTML() %}
<h1>This entry does not exist!</h1>
<p>Try finding a different entry that would help you.</p>
<p>If you want to write this entry by yourself, consider <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">contributing</a> to Mycorrhiza Wiki directly.</p>
{% endfunc %}
{% func helpTopicsHTML() %}
<aside class="help-topics layout-card">
<h2 class="layout-card__title">Help topics</h2>
<ul>
<li>
<a href="/help/en/index">Main</a>
</li>
<li>
<a href="/help/en/hypha">Hypha</a>
<ul>
<li>
<a href="/help/en/attachment">Attachment</a>
</li>
</ul
</li>
</ul>
</aside>
{% endfunc %}
{% func UserListHTML() %}
<div class="layout">
<main class="main-width user-list">

View File

@ -142,14 +142,151 @@ func BaseHTML(title, body string, u *user.User, headElements ...string) string {
}
//line views/stuff.qtpl:47
func StreamUserListHTML(qw422016 *qt422016.Writer) {
func StreamHelpHTML(qw422016 *qt422016.Writer, content string) {
//line views/stuff.qtpl:47
qw422016.N().S(`
<div class="layout">
<main class="main-width help">
<article>
`)
//line views/stuff.qtpl:51
qw422016.N().S(content)
//line views/stuff.qtpl:51
qw422016.N().S(`
</article>
</main>
`)
//line views/stuff.qtpl:54
qw422016.N().S(helpTopicsHTML())
//line views/stuff.qtpl:54
qw422016.N().S(`
</div>
`)
//line views/stuff.qtpl:56
}
//line views/stuff.qtpl:56
func WriteHelpHTML(qq422016 qtio422016.Writer, content string) {
//line views/stuff.qtpl:56
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:56
StreamHelpHTML(qw422016, content)
//line views/stuff.qtpl:56
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:56
}
//line views/stuff.qtpl:56
func HelpHTML(content string) string {
//line views/stuff.qtpl:56
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:56
WriteHelpHTML(qb422016, content)
//line views/stuff.qtpl:56
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:56
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:56
return qs422016
//line views/stuff.qtpl:56
}
//line views/stuff.qtpl:58
func StreamHelpEmptyErrorHTML(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:58
qw422016.N().S(`
<h1>This entry does not exist!</h1>
<p>Try finding a different entry that would help you.</p>
<p>If you want to write this entry by yourself, consider <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">contributing</a> to Mycorrhiza Wiki directly.</p>
`)
//line views/stuff.qtpl:62
}
//line views/stuff.qtpl:62
func WriteHelpEmptyErrorHTML(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:62
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:62
StreamHelpEmptyErrorHTML(qw422016)
//line views/stuff.qtpl:62
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:62
}
//line views/stuff.qtpl:62
func HelpEmptyErrorHTML() string {
//line views/stuff.qtpl:62
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:62
WriteHelpEmptyErrorHTML(qb422016)
//line views/stuff.qtpl:62
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:62
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:62
return qs422016
//line views/stuff.qtpl:62
}
//line views/stuff.qtpl:64
func streamhelpTopicsHTML(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:64
qw422016.N().S(`
<aside class="help-topics layout-card">
<h2 class="layout-card__title">Help topics</h2>
<ul>
<li>
<a href="/help/en/index">Main</a>
</li>
<li>
<a href="/help/en/hypha">Hypha</a>
<ul>
<li>
<a href="/help/en/attachment">Attachment</a>
</li>
</ul
</li>
</ul>
</aside>
`)
//line views/stuff.qtpl:81
}
//line views/stuff.qtpl:81
func writehelpTopicsHTML(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:81
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:81
streamhelpTopicsHTML(qw422016)
//line views/stuff.qtpl:81
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:81
}
//line views/stuff.qtpl:81
func helpTopicsHTML() string {
//line views/stuff.qtpl:81
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:81
writehelpTopicsHTML(qb422016)
//line views/stuff.qtpl:81
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:81
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:81
return qs422016
//line views/stuff.qtpl:81
}
//line views/stuff.qtpl:83
func StreamUserListHTML(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:83
qw422016.N().S(`
<div class="layout">
<main class="main-width user-list">
<h1>List of users</h1>
`)
//line views/stuff.qtpl:52
//line views/stuff.qtpl:88
var (
admins = make([]string, 0)
moderators = make([]string, 0)
@ -166,345 +303,345 @@ func StreamUserListHTML(qw422016 *qt422016.Writer) {
}
}
//line views/stuff.qtpl:67
//line views/stuff.qtpl:103
qw422016.N().S(`
<section>
<h2>Admins</h2>
<ol>`)
//line views/stuff.qtpl:70
//line views/stuff.qtpl:106
for _, name := range admins {
//line views/stuff.qtpl:70
//line views/stuff.qtpl:106
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.N().S(`/`)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.E().S(name)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.N().S(`">`)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.E().S(name)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:107
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:72
//line views/stuff.qtpl:108
}
//line views/stuff.qtpl:72
//line views/stuff.qtpl:108
qw422016.N().S(`</ol>
</section>
<section>
<h2>Moderators</h2>
<ol>`)
//line views/stuff.qtpl:76
//line views/stuff.qtpl:112
for _, name := range moderators {
//line views/stuff.qtpl:76
//line views/stuff.qtpl:112
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.N().S(`/`)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.E().S(name)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.N().S(`">`)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.E().S(name)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:113
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:78
//line views/stuff.qtpl:114
}
//line views/stuff.qtpl:78
//line views/stuff.qtpl:114
qw422016.N().S(`</ol>
</section>
<section>
<h2>Editors</h2>
<ol>`)
//line views/stuff.qtpl:82
//line views/stuff.qtpl:118
for _, name := range editors {
//line views/stuff.qtpl:82
//line views/stuff.qtpl:118
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.N().S(`/`)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.E().S(name)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.N().S(`">`)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.E().S(name)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:119
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:84
//line views/stuff.qtpl:120
}
//line views/stuff.qtpl:84
//line views/stuff.qtpl:120
qw422016.N().S(`</ol>
</section>
</main>
</div>
`)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
}
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
func WriteUserListHTML(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
StreamUserListHTML(qw422016)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
}
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
func UserListHTML() string {
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
WriteUserListHTML(qb422016)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
return qs422016
//line views/stuff.qtpl:88
//line views/stuff.qtpl:124
}
//line views/stuff.qtpl:90
//line views/stuff.qtpl:126
func StreamHyphaListHTML(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:90
//line views/stuff.qtpl:126
qw422016.N().S(`
<div class="layout">
<main class="main-width">
<h1>List of hyphae</h1>
<p>This wiki has `)
//line views/stuff.qtpl:94
//line views/stuff.qtpl:130
qw422016.N().D(hyphae.Count())
//line views/stuff.qtpl:94
//line views/stuff.qtpl:130
qw422016.N().S(` hyphae.</p>
<ul class="hypha-list">
`)
//line views/stuff.qtpl:96
//line views/stuff.qtpl:132
for h := range hyphae.YieldExistingHyphae() {
//line views/stuff.qtpl:96
//line views/stuff.qtpl:132
qw422016.N().S(`
<li class="hypha-list__entry">
<a class="hypha-list__link" href="/hypha/`)
//line views/stuff.qtpl:98
//line views/stuff.qtpl:134
qw422016.E().S(h.Name)
//line views/stuff.qtpl:98
//line views/stuff.qtpl:134
qw422016.N().S(`">`)
//line views/stuff.qtpl:98
//line views/stuff.qtpl:134
qw422016.E().S(util.BeautifulName(h.Name))
//line views/stuff.qtpl:98
//line views/stuff.qtpl:134
qw422016.N().S(`</a>
`)
//line views/stuff.qtpl:99
//line views/stuff.qtpl:135
if h.BinaryPath != "" {
//line views/stuff.qtpl:99
//line views/stuff.qtpl:135
qw422016.N().S(`
<span class="hypha-list__amnt-type">`)
//line views/stuff.qtpl:100
//line views/stuff.qtpl:136
qw422016.E().S(filepath.Ext(h.BinaryPath)[1:])
//line views/stuff.qtpl:100
//line views/stuff.qtpl:136
qw422016.N().S(`</span>
`)
//line views/stuff.qtpl:101
//line views/stuff.qtpl:137
}
//line views/stuff.qtpl:101
//line views/stuff.qtpl:137
qw422016.N().S(`
</li>
`)
//line views/stuff.qtpl:103
//line views/stuff.qtpl:139
}
//line views/stuff.qtpl:103
//line views/stuff.qtpl:139
qw422016.N().S(`
</ul>
</main>
</div>
`)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
}
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
func WriteHyphaListHTML(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
StreamHyphaListHTML(qw422016)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
}
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
func HyphaListHTML() string {
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
WriteHyphaListHTML(qb422016)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
return qs422016
//line views/stuff.qtpl:107
//line views/stuff.qtpl:143
}
//line views/stuff.qtpl:109
//line views/stuff.qtpl:145
func StreamAboutHTML(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:109
//line views/stuff.qtpl:145
qw422016.N().S(`
<div class="layout">
<main class="main-width">
<section>
<h1>About `)
//line views/stuff.qtpl:113
//line views/stuff.qtpl:149
qw422016.E().S(cfg.WikiName)
//line views/stuff.qtpl:113
//line views/stuff.qtpl:149
qw422016.N().S(`</h1>
<ul>
<li><b><a href="https://mycorrhiza.wiki">Mycorrhiza Wiki</a> version:</b> 1.3.0</li>
`)
//line views/stuff.qtpl:116
//line views/stuff.qtpl:152
if cfg.UseAuth {
//line views/stuff.qtpl:116
//line views/stuff.qtpl:152
qw422016.N().S(` <li><b>User count:</b> `)
//line views/stuff.qtpl:117
//line views/stuff.qtpl:153
qw422016.N().DUL(user.Count())
//line views/stuff.qtpl:117
//line views/stuff.qtpl:153
qw422016.N().S(`</li>
<li><b>Home page:</b> <a href="/">`)
//line views/stuff.qtpl:118
//line views/stuff.qtpl:154
qw422016.E().S(cfg.HomeHypha)
//line views/stuff.qtpl:118
//line views/stuff.qtpl:154
qw422016.N().S(`</a></li>
<li><b>Administrators:</b>`)
//line views/stuff.qtpl:119
//line views/stuff.qtpl:155
for i, username := range user.ListUsersWithGroup("admin") {
//line views/stuff.qtpl:120
//line views/stuff.qtpl:156
if i > 0 {
//line views/stuff.qtpl:120
//line views/stuff.qtpl:156
qw422016.N().S(`<span aria-hidden="true">, </span>
`)
//line views/stuff.qtpl:121
//line views/stuff.qtpl:157
}
//line views/stuff.qtpl:121
//line views/stuff.qtpl:157
qw422016.N().S(` <a href="/hypha/`)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.N().S(`/`)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.E().S(username)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.N().S(`">`)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.E().S(username)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.N().S(`</a>`)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
}
//line views/stuff.qtpl:122
//line views/stuff.qtpl:158
qw422016.N().S(`</li>
`)
//line views/stuff.qtpl:123
//line views/stuff.qtpl:159
} else {
//line views/stuff.qtpl:123
//line views/stuff.qtpl:159
qw422016.N().S(` <li>This wiki does not use authorization</li>
`)
//line views/stuff.qtpl:125
//line views/stuff.qtpl:161
}
//line views/stuff.qtpl:125
//line views/stuff.qtpl:161
qw422016.N().S(` </ul>
<p>See <a href="/list">/list</a> for information about hyphae on this wiki.</p>
</section>
</main>
</div>
`)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
}
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
func WriteAboutHTML(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
StreamAboutHTML(qw422016)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
}
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
func AboutHTML() string {
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
WriteAboutHTML(qb422016)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
return qs422016
//line views/stuff.qtpl:131
//line views/stuff.qtpl:167
}
//line views/stuff.qtpl:133
//line views/stuff.qtpl:169
func StreamCommonScripts(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:133
//line views/stuff.qtpl:169
qw422016.N().S(`
`)
//line views/stuff.qtpl:134
//line views/stuff.qtpl:170
for _, scriptPath := range cfg.CommonScripts {
//line views/stuff.qtpl:134
//line views/stuff.qtpl:170
qw422016.N().S(`
<script src="`)
//line views/stuff.qtpl:135
//line views/stuff.qtpl:171
qw422016.E().S(scriptPath)
//line views/stuff.qtpl:135
//line views/stuff.qtpl:171
qw422016.N().S(`"></script>
`)
//line views/stuff.qtpl:136
//line views/stuff.qtpl:172
}
//line views/stuff.qtpl:136
//line views/stuff.qtpl:172
qw422016.N().S(`
`)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
}
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
func WriteCommonScripts(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
StreamCommonScripts(qw422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
}
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
func CommonScripts() string {
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
WriteCommonScripts(qb422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
return qs422016
//line views/stuff.qtpl:137
//line views/stuff.qtpl:173
}

View File

@ -9,6 +9,7 @@ import (
"log"
"math/rand"
"net/http"
"strings"
"github.com/bouncepaw/mycorrhiza/cfg"
"github.com/bouncepaw/mycorrhiza/files"
@ -39,9 +40,24 @@ func handlerHelp(w http.ResponseWriter, rq *http.Request) {
}
content, err := help.Get(rq.URL.Path[6:]) // Drop /help/
if err != nil && strings.HasPrefix(err.Error(), "open") {
w.WriteHeader(http.StatusNotFound)
_, _ = io.WriteString(
w,
views.BaseHTML("Entry not found",
views.HelpHTML(views.HelpEmptyErrorHTML()),
user.FromRequest(rq)),
)
return
}
if err != nil {
// TODO: proper error reporting that makes sense
httpErr(w, http.StatusForbidden, cfg.HomeHypha, err.Error(), err.Error())
w.WriteHeader(http.StatusInternalServerError)
_, _ = io.WriteString(
w,
views.BaseHTML(err.Error(),
views.HelpHTML(err.Error()),
user.FromRequest(rq)),
)
return
}
@ -50,7 +66,13 @@ func handlerHelp(w http.ResponseWriter, rq *http.Request) {
ast := mycomarkup.BlockTree(ctx)
result := mycomarkup.BlocksToHTML(ctx, ast)
// TODO: styled output idk
_, _ = io.WriteString(w, result)
w.WriteHeader(http.StatusOK)
_, _ = io.WriteString(
w,
views.BaseHTML("Help",
views.HelpHTML(result),
user.FromRequest(rq)),
)
}
// handlerList shows a list of all hyphae in the wiki in random order.