1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2025-04-25 12:03:12 +00:00

Misc: Move more stuff here, including title search

This commit is contained in:
Timur Ismagilov 2022-04-02 11:00:10 +03:00
parent 5bf3808039
commit cc01a3551d
12 changed files with 604 additions and 695 deletions

View File

@ -34,6 +34,7 @@ func InitHandlers(rtr *mux.Router) {
rtr.HandleFunc("/favicon.ico", func(w http.ResponseWriter, rq *http.Request) { rtr.HandleFunc("/favicon.ico", func(w http.ResponseWriter, rq *http.Request) {
http.Redirect(w, rq, "/static/favicon.ico", http.StatusSeeOther) http.Redirect(w, rq, "/static/favicon.ico", http.StatusSeeOther)
}) })
rtr.HandleFunc("/title-search/", handlerTitleSearch)
initViews() initViews()
} }
@ -142,3 +143,17 @@ func handlerRobotsTxt(w http.ResponseWriter, rq *http.Request) {
} }
_ = file.Close() _ = file.Close()
} }
func handlerTitleSearch(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
_ = rq.ParseForm()
var (
query = rq.FormValue("q")
results []string
)
for hyphaName := range shroom.YieldHyphaNamesContainingString(query) {
results = append(results, hyphaName)
}
w.WriteHeader(http.StatusOK)
viewTitleSearch(viewutil.MetaFrom(w, rq), query, results)
}

View File

@ -0,0 +1,16 @@
{{define "search:"}}Search: {{.}}{{end}}
{{define "title"}}{{template "search:" .Query}}{{end}}
{{define "body"}}
<div class="layout"><main class="main-width title-search">
<h1>{{block "search results for" .Query}}Search results for {{.}}{{end}}</h1>
<p>{{block "search desc" .}}Every hypha name has been compared with the query. Hyphae that have matched the query are listed below.{{end}}</p>
<ul class="title-search__results">
{{range .Results}}
<li class="title-search__entry">
<a class="title-search__link wikilink" href="/hypha/{%s hyphaName %}">{{beautifulName .}}</a>
</li>
{{end}}
</ul>
</main>
</div>
{{end}}

View File

@ -12,10 +12,13 @@ import (
var ( var (
//go:embed *html //go:embed *html
fs embed.FS fs embed.FS
chainList viewutil.Chain chainList, chainTitleSearch viewutil.Chain
ruTranslation = ` ruTranslation = `
{{define "list of hyphae"}}Список гиф{{end}} {{define "list of hyphae"}}Список гиф{{end}}
{{define "search:"}}Поиск:{{end}}
{{define "search results for"}}Результаты поиска для «{{.}}»{{end}}
{{define "search desc"}}Название каждой из существующих гиф сопоставлено с запросом. Подходящие гифы приведены ниже.{{end}}
` `
) )
@ -24,6 +27,9 @@ func initViews() {
chainList = viewutil. chainList = viewutil.
En(viewutil.CopyEnWith(fs, "view_list.html")). En(viewutil.CopyEnWith(fs, "view_list.html")).
Ru(m(viewutil.CopyRuWith(fs, "view_list.html").Parse(ruTranslation))) Ru(m(viewutil.CopyRuWith(fs, "view_list.html").Parse(ruTranslation)))
chainTitleSearch = viewutil.
En(viewutil.CopyEnWith(fs, "view_title_search.html")).
Ru(m(viewutil.CopyRuWith(fs, "view_title_search.html").Parse(ruTranslation)))
} }
type listDatum struct { type listDatum struct {
@ -67,3 +73,23 @@ func viewList(meta viewutil.Meta) {
log.Println(err) log.Println(err)
} }
} }
type titleSearchData struct {
viewutil.BaseData
Query string
Results []string
}
func viewTitleSearch(meta viewutil.Meta, query string, results []string) {
if err := chainTitleSearch.Get(meta).ExecuteTemplate(meta.W, "page", titleSearchData{
BaseData: viewutil.BaseData{
Meta: meta,
HeaderLinks: cfg.HeaderLinks,
CommonScripts: cfg.CommonScripts,
},
Query: query,
Results: results,
}); err != nil {
log.Println(err)
}
}

View File

@ -7,7 +7,7 @@ import (
"github.com/bouncepaw/mycorrhiza/util" "github.com/bouncepaw/mycorrhiza/util"
) )
// YieldHyphaNamesContainingString picks hyphae with have a string in their title, sorts and iterates over them. // YieldHyphaNamesContainingString picks hyphae with have a string in their title, sorts and iterates over them in alphabetical order.
func YieldHyphaNamesContainingString(query string) <-chan string { func YieldHyphaNamesContainingString(query string) <-chan string {
query = util.CanonicalName(strings.TrimSpace(query)) query = util.CanonicalName(strings.TrimSpace(query))
out := make(chan string) out := make(chan string)

View File

@ -1,6 +1,8 @@
{% import "net/http" %} {% import "net/http" %}
{% import "sort" %}
{% import "github.com/bouncepaw/mycorrhiza/cfg" %} {% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/l18n" %} {% import "github.com/bouncepaw/mycorrhiza/l18n" %}
{% import "github.com/bouncepaw/mycorrhiza/user" %}
{% func Register(rq *http.Request) %} {% func Register(rq *http.Request) %}
{% code {% code
@ -148,3 +150,63 @@ Telegram auth widget was requested by Yogurt. As you can see, we don't offer use
</body> </body>
</html> </html>
{% endfunc %} {% endfunc %}
{% code
var userListL10n = map[string]l10nEntry{
"heading": en("List of users").ru("Список пользователей"),
"administrators": en("Administrators").ru("Администраторы"),
"moderators": en("Moderators").ru("Модераторы"),
"editors": en("Editors").ru("Редакторы"),
}
%}
{% func UserList(lc *l18n.Localizer) %}
<div class="layout">
<main class="main-width user-list">
{% code
var get = func(key string) string {
return userListL10n[key].get(lc.Locale)
}
var (
admins = make([]string, 0)
moderators = make([]string, 0)
editors = make([]string, 0)
)
for u := range user.YieldUsers() {
switch u.Group {
// What if we place the users into sorted slices?
case "admin":
admins = append(admins, u.Name)
case "moderator":
moderators = append(moderators, u.Name)
case "editor", "trusted":
editors = append(editors, u.Name)
}
}
sort.Strings(admins)
sort.Strings(moderators)
sort.Strings(editors)
%}
<h1>{%s get("heading") %}</h1>
<section>
<h2>{%s get("administrators") %}</h2>
<ol>{% for _, name := range admins %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
<section>
<h2>{%s get("moderators") %}</h2>
<ol>{% for _, name := range moderators %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
<section>
<h2>{%s get("editors") %}</h2>
<ol>{% for _, name := range editors %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
</main>
</div>
{% endfunc %}

View File

@ -8,517 +8,523 @@ package views
import "net/http" import "net/http"
//line views/auth.qtpl:2 //line views/auth.qtpl:2
import "github.com/bouncepaw/mycorrhiza/cfg" import "sort"
//line views/auth.qtpl:3 //line views/auth.qtpl:3
import "github.com/bouncepaw/mycorrhiza/cfg"
//line views/auth.qtpl:4
import "github.com/bouncepaw/mycorrhiza/l18n" import "github.com/bouncepaw/mycorrhiza/l18n"
//line views/auth.qtpl:5 //line views/auth.qtpl:5
import "github.com/bouncepaw/mycorrhiza/user"
//line views/auth.qtpl:7
import ( import (
qtio422016 "io" qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate" qt422016 "github.com/valyala/quicktemplate"
) )
//line views/auth.qtpl:5 //line views/auth.qtpl:7
var ( var (
_ = qtio422016.Copy _ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer _ = qt422016.AcquireByteBuffer
) )
//line views/auth.qtpl:5 //line views/auth.qtpl:7
func StreamRegister(qw422016 *qt422016.Writer, rq *http.Request) { func StreamRegister(qw422016 *qt422016.Writer, rq *http.Request) {
//line views/auth.qtpl:5 //line views/auth.qtpl:7
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/auth.qtpl:7 //line views/auth.qtpl:9
lc := l18n.FromRequest(rq) lc := l18n.FromRequest(rq)
//line views/auth.qtpl:8 //line views/auth.qtpl:10
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width"> <main class="main-width">
<section> <section>
`) `)
//line views/auth.qtpl:12 //line views/auth.qtpl:14
if cfg.AllowRegistration { if cfg.AllowRegistration {
//line views/auth.qtpl:12 //line views/auth.qtpl:14
qw422016.N().S(` qw422016.N().S(`
<form class="modal" method="post" action="/register?`) <form class="modal" method="post" action="/register?`)
//line views/auth.qtpl:13 //line views/auth.qtpl:15
qw422016.E().S(rq.URL.RawQuery) qw422016.E().S(rq.URL.RawQuery)
//line views/auth.qtpl:13 //line views/auth.qtpl:15
qw422016.N().S(`" id="register-form" enctype="multipart/form-data" autocomplete="off"> qw422016.N().S(`" id="register-form" enctype="multipart/form-data" autocomplete="off">
<fieldset class="modal__fieldset"> <fieldset class="modal__fieldset">
<legend class="modal__title">`) <legend class="modal__title">`)
//line views/auth.qtpl:15 //line views/auth.qtpl:17
qw422016.E().S(lc.Get("auth.register_header", &l18n.Replacements{"name": cfg.WikiName})) qw422016.E().S(lc.Get("auth.register_header", &l18n.Replacements{"name": cfg.WikiName}))
//line views/auth.qtpl:15 //line views/auth.qtpl:17
qw422016.N().S(`</legend> qw422016.N().S(`</legend>
<label for="register-form__username">`) <label for="register-form__username">`)
//line views/auth.qtpl:17 //line views/auth.qtpl:19
qw422016.E().S(lc.Get("auth.username")) qw422016.E().S(lc.Get("auth.username"))
//line views/auth.qtpl:17 //line views/auth.qtpl:19
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="text" required autofocus id="login-form__username" name="username"> <input type="text" required autofocus id="login-form__username" name="username">
<br> <br>
<label for="login-form__password">`) <label for="login-form__password">`)
//line views/auth.qtpl:21 //line views/auth.qtpl:23
qw422016.E().S(lc.Get("auth.password")) qw422016.E().S(lc.Get("auth.password"))
//line views/auth.qtpl:21 //line views/auth.qtpl:23
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="password" required name="password"> <input type="password" required name="password">
<p>`) <p>`)
//line views/auth.qtpl:24 //line views/auth.qtpl:26
qw422016.E().S(lc.Get("auth.password_tip")) qw422016.E().S(lc.Get("auth.password_tip"))
//line views/auth.qtpl:24 //line views/auth.qtpl:26
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p>`) <p>`)
//line views/auth.qtpl:25 //line views/auth.qtpl:27
qw422016.E().S(lc.Get("auth.cookie_tip")) qw422016.E().S(lc.Get("auth.cookie_tip"))
//line views/auth.qtpl:25 //line views/auth.qtpl:27
qw422016.N().S(`</p> qw422016.N().S(`</p>
<button class="btn" type="submit" value="Register">`) <button class="btn" type="submit" value="Register">`)
//line views/auth.qtpl:26 //line views/auth.qtpl:28
qw422016.E().S(lc.Get("auth.register_button")) qw422016.E().S(lc.Get("auth.register_button"))
//line views/auth.qtpl:26 //line views/auth.qtpl:28
qw422016.N().S(`</button> qw422016.N().S(`</button>
<a class="btn btn_weak" href="/`) <a class="btn btn_weak" href="/`)
//line views/auth.qtpl:27 //line views/auth.qtpl:29
qw422016.E().S(rq.URL.RawQuery) qw422016.E().S(rq.URL.RawQuery)
//line views/auth.qtpl:27 //line views/auth.qtpl:29
qw422016.N().S(`">`) qw422016.N().S(`">`)
//line views/auth.qtpl:27 //line views/auth.qtpl:29
qw422016.E().S(lc.Get("ui.cancel")) qw422016.E().S(lc.Get("ui.cancel"))
//line views/auth.qtpl:27 //line views/auth.qtpl:29
qw422016.N().S(`</a> qw422016.N().S(`</a>
</fieldset> </fieldset>
</form> </form>
`) `)
//line views/auth.qtpl:30 //line views/auth.qtpl:32
streamtelegramWidget(qw422016, lc) streamtelegramWidget(qw422016, lc)
//line views/auth.qtpl:30 //line views/auth.qtpl:32
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/auth.qtpl:31 //line views/auth.qtpl:33
} else if cfg.UseAuth { } else if cfg.UseAuth {
//line views/auth.qtpl:31 //line views/auth.qtpl:33
qw422016.N().S(` qw422016.N().S(`
<p>`) <p>`)
//line views/auth.qtpl:32 //line views/auth.qtpl:34
qw422016.E().S(lc.Get("auth.noregister")) qw422016.E().S(lc.Get("auth.noregister"))
//line views/auth.qtpl:32 //line views/auth.qtpl:34
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p><a href="/`) <p><a href="/`)
//line views/auth.qtpl:33 //line views/auth.qtpl:35
qw422016.E().S(rq.URL.RawQuery) qw422016.E().S(rq.URL.RawQuery)
//line views/auth.qtpl:33 //line views/auth.qtpl:35
qw422016.N().S(`">← `) qw422016.N().S(`">← `)
//line views/auth.qtpl:33 //line views/auth.qtpl:35
qw422016.E().S(lc.Get("auth.go_back")) qw422016.E().S(lc.Get("auth.go_back"))
//line views/auth.qtpl:33 //line views/auth.qtpl:35
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
`) `)
//line views/auth.qtpl:34 //line views/auth.qtpl:36
} else { } else {
//line views/auth.qtpl:34 //line views/auth.qtpl:36
qw422016.N().S(` qw422016.N().S(`
<p>`) <p>`)
//line views/auth.qtpl:35 //line views/auth.qtpl:37
qw422016.E().S(lc.Get("auth.noauth")) qw422016.E().S(lc.Get("auth.noauth"))
//line views/auth.qtpl:35 //line views/auth.qtpl:37
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p><a href="/`) <p><a href="/`)
//line views/auth.qtpl:36 //line views/auth.qtpl:38
qw422016.E().S(rq.URL.RawQuery) qw422016.E().S(rq.URL.RawQuery)
//line views/auth.qtpl:36 //line views/auth.qtpl:38
qw422016.N().S(`">← `) qw422016.N().S(`">← `)
//line views/auth.qtpl:36 //line views/auth.qtpl:38
qw422016.E().S(lc.Get("auth.go_back")) qw422016.E().S(lc.Get("auth.go_back"))
//line views/auth.qtpl:36 //line views/auth.qtpl:38
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
`) `)
//line views/auth.qtpl:37 //line views/auth.qtpl:39
} }
//line views/auth.qtpl:37 //line views/auth.qtpl:39
qw422016.N().S(` qw422016.N().S(`
</section> </section>
</main> </main>
</div> </div>
`) `)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
} }
//line views/auth.qtpl:41 //line views/auth.qtpl:43
func WriteRegister(qq422016 qtio422016.Writer, rq *http.Request) { func WriteRegister(qq422016 qtio422016.Writer, rq *http.Request) {
//line views/auth.qtpl:41 //line views/auth.qtpl:43
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
StreamRegister(qw422016, rq) StreamRegister(qw422016, rq)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
} }
//line views/auth.qtpl:41 //line views/auth.qtpl:43
func Register(rq *http.Request) string { func Register(rq *http.Request) string {
//line views/auth.qtpl:41 //line views/auth.qtpl:43
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:41 //line views/auth.qtpl:43
WriteRegister(qb422016, rq) WriteRegister(qb422016, rq)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:41 //line views/auth.qtpl:43
return qs422016 return qs422016
//line views/auth.qtpl:41 //line views/auth.qtpl:43
} }
//line views/auth.qtpl:43 //line views/auth.qtpl:45
func StreamLogin(qw422016 *qt422016.Writer, lc *l18n.Localizer) { func StreamLogin(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:43 //line views/auth.qtpl:45
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width"> <main class="main-width">
<section> <section>
`) `)
//line views/auth.qtpl:47 //line views/auth.qtpl:49
if cfg.UseAuth { if cfg.UseAuth {
//line views/auth.qtpl:47 //line views/auth.qtpl:49
qw422016.N().S(` qw422016.N().S(`
<form class="modal" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on"> <form class="modal" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on">
<fieldset class="modal__fieldset"> <fieldset class="modal__fieldset">
<legend class="modal__title">`) <legend class="modal__title">`)
//line views/auth.qtpl:50 //line views/auth.qtpl:52
qw422016.E().S(lc.Get("auth.login_header", &l18n.Replacements{"name": cfg.WikiName})) qw422016.E().S(lc.Get("auth.login_header", &l18n.Replacements{"name": cfg.WikiName}))
//line views/auth.qtpl:50 //line views/auth.qtpl:52
qw422016.N().S(`</legend> qw422016.N().S(`</legend>
<label for="login-form__username">`) <label for="login-form__username">`)
//line views/auth.qtpl:51 //line views/auth.qtpl:53
qw422016.E().S(lc.Get("auth.username")) qw422016.E().S(lc.Get("auth.username"))
//line views/auth.qtpl:51 //line views/auth.qtpl:53
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="text" required autofocus id="login-form__username" name="username" autocomplete="username"> <input type="text" required autofocus id="login-form__username" name="username" autocomplete="username">
<br> <br>
<label for="login-form__password">`) <label for="login-form__password">`)
//line views/auth.qtpl:55 //line views/auth.qtpl:57
qw422016.E().S(lc.Get("auth.password")) qw422016.E().S(lc.Get("auth.password"))
//line views/auth.qtpl:55 //line views/auth.qtpl:57
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="password" required name="password" autocomplete="current-password"> <input type="password" required name="password" autocomplete="current-password">
<p>`) <p>`)
//line views/auth.qtpl:58 //line views/auth.qtpl:60
qw422016.E().S(lc.Get("auth.cookie_tip")) qw422016.E().S(lc.Get("auth.cookie_tip"))
//line views/auth.qtpl:58 //line views/auth.qtpl:60
qw422016.N().S(`</p> qw422016.N().S(`</p>
<button class="btn" type="submit" value="Log in">`) <button class="btn" type="submit" value="Log in">`)
//line views/auth.qtpl:59 //line views/auth.qtpl:61
qw422016.E().S(lc.Get("auth.login_button")) qw422016.E().S(lc.Get("auth.login_button"))
//line views/auth.qtpl:59 //line views/auth.qtpl:61
qw422016.N().S(`</button> qw422016.N().S(`</button>
<a class="btn btn_weak" href="/">`) <a class="btn btn_weak" href="/">`)
//line views/auth.qtpl:60 //line views/auth.qtpl:62
qw422016.E().S(lc.Get("ui.cancel")) qw422016.E().S(lc.Get("ui.cancel"))
//line views/auth.qtpl:60 //line views/auth.qtpl:62
qw422016.N().S(`</a> qw422016.N().S(`</a>
</fieldset> </fieldset>
</form> </form>
`) `)
//line views/auth.qtpl:63 //line views/auth.qtpl:65
streamtelegramWidget(qw422016, lc) streamtelegramWidget(qw422016, lc)
//line views/auth.qtpl:63 //line views/auth.qtpl:65
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/auth.qtpl:64 //line views/auth.qtpl:66
} else { } else {
//line views/auth.qtpl:64 //line views/auth.qtpl:66
qw422016.N().S(` qw422016.N().S(`
<p>`) <p>`)
//line views/auth.qtpl:65 //line views/auth.qtpl:67
qw422016.E().S(lc.Get("auth.noauth")) qw422016.E().S(lc.Get("auth.noauth"))
//line views/auth.qtpl:65 //line views/auth.qtpl:67
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p><a class="btn btn_weak" href="/"> `) <p><a class="btn btn_weak" href="/"> `)
//line views/auth.qtpl:66 //line views/auth.qtpl:68
qw422016.E().S(lc.Get("auth.go_home")) qw422016.E().S(lc.Get("auth.go_home"))
//line views/auth.qtpl:66 //line views/auth.qtpl:68
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
`) `)
//line views/auth.qtpl:67 //line views/auth.qtpl:69
} }
//line views/auth.qtpl:67 //line views/auth.qtpl:69
qw422016.N().S(` qw422016.N().S(`
</section> </section>
</main> </main>
</div> </div>
`) `)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
} }
//line views/auth.qtpl:71 //line views/auth.qtpl:73
func WriteLogin(qq422016 qtio422016.Writer, lc *l18n.Localizer) { func WriteLogin(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:71 //line views/auth.qtpl:73
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
StreamLogin(qw422016, lc) StreamLogin(qw422016, lc)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
} }
//line views/auth.qtpl:71 //line views/auth.qtpl:73
func Login(lc *l18n.Localizer) string { func Login(lc *l18n.Localizer) string {
//line views/auth.qtpl:71 //line views/auth.qtpl:73
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:71 //line views/auth.qtpl:73
WriteLogin(qb422016, lc) WriteLogin(qb422016, lc)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:71 //line views/auth.qtpl:73
return qs422016 return qs422016
//line views/auth.qtpl:71 //line views/auth.qtpl:73
} }
// Telegram auth widget was requested by Yogurt. As you can see, we don't offer user administrators control over it. Of course we don't. // Telegram auth widget was requested by Yogurt. As you can see, we don't offer user administrators control over it. Of course we don't.
//line views/auth.qtpl:74 //line views/auth.qtpl:76
func streamtelegramWidget(qw422016 *qt422016.Writer, lc *l18n.Localizer) { func streamtelegramWidget(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:74 //line views/auth.qtpl:76
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/auth.qtpl:75 //line views/auth.qtpl:77
if cfg.TelegramEnabled { if cfg.TelegramEnabled {
//line views/auth.qtpl:75 //line views/auth.qtpl:77
qw422016.N().S(` qw422016.N().S(`
<p class="telegram-notice">`) <p class="telegram-notice">`)
//line views/auth.qtpl:76 //line views/auth.qtpl:78
qw422016.E().S(lc.Get("auth.telegram_tip")) qw422016.E().S(lc.Get("auth.telegram_tip"))
//line views/auth.qtpl:76 //line views/auth.qtpl:78
qw422016.N().S(`</p> qw422016.N().S(`</p>
<script async src="https://telegram.org/js/telegram-widget.js?15" data-telegram-login="`) <script async src="https://telegram.org/js/telegram-widget.js?15" data-telegram-login="`)
//line views/auth.qtpl:77 //line views/auth.qtpl:79
qw422016.E().S(cfg.TelegramBotName) qw422016.E().S(cfg.TelegramBotName)
//line views/auth.qtpl:77 //line views/auth.qtpl:79
qw422016.N().S(`" data-size="medium" data-userpic="false" data-auth-url="`) qw422016.N().S(`" data-size="medium" data-userpic="false" data-auth-url="`)
//line views/auth.qtpl:77 //line views/auth.qtpl:79
qw422016.E().S(cfg.URL) qw422016.E().S(cfg.URL)
//line views/auth.qtpl:77 //line views/auth.qtpl:79
qw422016.N().S(`/telegram-login"></script> qw422016.N().S(`/telegram-login"></script>
`) `)
//line views/auth.qtpl:78 //line views/auth.qtpl:80
} }
//line views/auth.qtpl:78 //line views/auth.qtpl:80
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
} }
//line views/auth.qtpl:79 //line views/auth.qtpl:81
func writetelegramWidget(qq422016 qtio422016.Writer, lc *l18n.Localizer) { func writetelegramWidget(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:79 //line views/auth.qtpl:81
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
streamtelegramWidget(qw422016, lc) streamtelegramWidget(qw422016, lc)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
} }
//line views/auth.qtpl:79 //line views/auth.qtpl:81
func telegramWidget(lc *l18n.Localizer) string { func telegramWidget(lc *l18n.Localizer) string {
//line views/auth.qtpl:79 //line views/auth.qtpl:81
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:79 //line views/auth.qtpl:81
writetelegramWidget(qb422016, lc) writetelegramWidget(qb422016, lc)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:79 //line views/auth.qtpl:81
return qs422016 return qs422016
//line views/auth.qtpl:79 //line views/auth.qtpl:81
} }
//line views/auth.qtpl:81 //line views/auth.qtpl:83
func StreamLoginError(qw422016 *qt422016.Writer, err string, lc *l18n.Localizer) { func StreamLoginError(qw422016 *qt422016.Writer, err string, lc *l18n.Localizer) {
//line views/auth.qtpl:81 //line views/auth.qtpl:83
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width"> <main class="main-width">
<section> <section>
`) `)
//line views/auth.qtpl:85 //line views/auth.qtpl:87
switch err { switch err {
//line views/auth.qtpl:86 //line views/auth.qtpl:88
case "unknown username": case "unknown username":
//line views/auth.qtpl:86 //line views/auth.qtpl:88
qw422016.N().S(` qw422016.N().S(`
<p class="error">`) <p class="error">`)
//line views/auth.qtpl:87 //line views/auth.qtpl:89
qw422016.E().S(lc.Get("auth.error_username")) qw422016.E().S(lc.Get("auth.error_username"))
//line views/auth.qtpl:87 //line views/auth.qtpl:89
qw422016.N().S(`</p> qw422016.N().S(`</p>
`) `)
//line views/auth.qtpl:88 //line views/auth.qtpl:90
case "wrong password": case "wrong password":
//line views/auth.qtpl:88 //line views/auth.qtpl:90
qw422016.N().S(` qw422016.N().S(`
<p class="error">`) <p class="error">`)
//line views/auth.qtpl:89 //line views/auth.qtpl:91
qw422016.E().S(lc.Get("auth.error_password")) qw422016.E().S(lc.Get("auth.error_password"))
//line views/auth.qtpl:89 //line views/auth.qtpl:91
qw422016.N().S(`</p> qw422016.N().S(`</p>
`) `)
//line views/auth.qtpl:90 //line views/auth.qtpl:92
default: default:
//line views/auth.qtpl:90 //line views/auth.qtpl:92
qw422016.N().S(` qw422016.N().S(`
<p class="error">`) <p class="error">`)
//line views/auth.qtpl:91 //line views/auth.qtpl:93
qw422016.E().S(err) qw422016.E().S(err)
//line views/auth.qtpl:91 //line views/auth.qtpl:93
qw422016.N().S(`</p> qw422016.N().S(`</p>
`) `)
//line views/auth.qtpl:92 //line views/auth.qtpl:94
} }
//line views/auth.qtpl:92 //line views/auth.qtpl:94
qw422016.N().S(` qw422016.N().S(`
<p><a href="/login"> `) <p><a href="/login"> `)
//line views/auth.qtpl:93 //line views/auth.qtpl:95
qw422016.E().S(lc.Get("auth.try_again")) qw422016.E().S(lc.Get("auth.try_again"))
//line views/auth.qtpl:93 //line views/auth.qtpl:95
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
</section> </section>
</main> </main>
</div> </div>
`) `)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
} }
//line views/auth.qtpl:97 //line views/auth.qtpl:99
func WriteLoginError(qq422016 qtio422016.Writer, err string, lc *l18n.Localizer) { func WriteLoginError(qq422016 qtio422016.Writer, err string, lc *l18n.Localizer) {
//line views/auth.qtpl:97 //line views/auth.qtpl:99
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
StreamLoginError(qw422016, err, lc) StreamLoginError(qw422016, err, lc)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
} }
//line views/auth.qtpl:97 //line views/auth.qtpl:99
func LoginError(err string, lc *l18n.Localizer) string { func LoginError(err string, lc *l18n.Localizer) string {
//line views/auth.qtpl:97 //line views/auth.qtpl:99
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:97 //line views/auth.qtpl:99
WriteLoginError(qb422016, err, lc) WriteLoginError(qb422016, err, lc)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:97 //line views/auth.qtpl:99
return qs422016 return qs422016
//line views/auth.qtpl:97 //line views/auth.qtpl:99
} }
//line views/auth.qtpl:99 //line views/auth.qtpl:101
func StreamLogout(qw422016 *qt422016.Writer, can bool, lc *l18n.Localizer) { func StreamLogout(qw422016 *qt422016.Writer, can bool, lc *l18n.Localizer) {
//line views/auth.qtpl:99 //line views/auth.qtpl:101
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width"> <main class="main-width">
<section> <section>
`) `)
//line views/auth.qtpl:103 //line views/auth.qtpl:105
if can { if can {
//line views/auth.qtpl:103 //line views/auth.qtpl:105
qw422016.N().S(` qw422016.N().S(`
<h1>`) <h1>`)
//line views/auth.qtpl:104 //line views/auth.qtpl:106
qw422016.E().S(lc.Get("auth.logout_header")) qw422016.E().S(lc.Get("auth.logout_header"))
//line views/auth.qtpl:104 //line views/auth.qtpl:106
qw422016.N().S(`</h1> qw422016.N().S(`</h1>
<form method="POST" action="/logout"> <form method="POST" action="/logout">
<input class="btn btn_accent" type="submit" value="`) <input class="btn btn_accent" type="submit" value="`)
//line views/auth.qtpl:106 //line views/auth.qtpl:108
qw422016.E().S(lc.Get("auth.logout_button")) qw422016.E().S(lc.Get("auth.logout_button"))
//line views/auth.qtpl:106 //line views/auth.qtpl:108
qw422016.N().S(`"/> qw422016.N().S(`"/>
<a class="btn btn_weak" href="/">`) <a class="btn btn_weak" href="/">`)
//line views/auth.qtpl:107 //line views/auth.qtpl:109
qw422016.E().S(lc.Get("auth.go_home")) qw422016.E().S(lc.Get("auth.go_home"))
//line views/auth.qtpl:107 //line views/auth.qtpl:109
qw422016.N().S(`</a> qw422016.N().S(`</a>
</form> </form>
`) `)
//line views/auth.qtpl:109 //line views/auth.qtpl:111
} else { } else {
//line views/auth.qtpl:109 //line views/auth.qtpl:111
qw422016.N().S(` qw422016.N().S(`
<p>`) <p>`)
//line views/auth.qtpl:110 //line views/auth.qtpl:112
qw422016.E().S(lc.Get("auth.logout_anon")) qw422016.E().S(lc.Get("auth.logout_anon"))
//line views/auth.qtpl:110 //line views/auth.qtpl:112
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p><a href="/login">`) <p><a href="/login">`)
//line views/auth.qtpl:111 //line views/auth.qtpl:113
qw422016.E().S(lc.Get("auth.login_title")) qw422016.E().S(lc.Get("auth.login_title"))
//line views/auth.qtpl:111 //line views/auth.qtpl:113
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
<p><a href="/"> `) <p><a href="/"> `)
//line views/auth.qtpl:112 //line views/auth.qtpl:114
qw422016.E().S(lc.Get("auth.go_home")) qw422016.E().S(lc.Get("auth.go_home"))
//line views/auth.qtpl:112 //line views/auth.qtpl:114
qw422016.N().S(`</a></p> qw422016.N().S(`</a></p>
`) `)
//line views/auth.qtpl:113 //line views/auth.qtpl:115
} }
//line views/auth.qtpl:113 //line views/auth.qtpl:115
qw422016.N().S(` qw422016.N().S(`
</section> </section>
</main> </main>
</div> </div>
`) `)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
} }
//line views/auth.qtpl:117 //line views/auth.qtpl:119
func WriteLogout(qq422016 qtio422016.Writer, can bool, lc *l18n.Localizer) { func WriteLogout(qq422016 qtio422016.Writer, can bool, lc *l18n.Localizer) {
//line views/auth.qtpl:117 //line views/auth.qtpl:119
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
StreamLogout(qw422016, can, lc) StreamLogout(qw422016, can, lc)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
} }
//line views/auth.qtpl:117 //line views/auth.qtpl:119
func Logout(can bool, lc *l18n.Localizer) string { func Logout(can bool, lc *l18n.Localizer) string {
//line views/auth.qtpl:117 //line views/auth.qtpl:119
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:117 //line views/auth.qtpl:119
WriteLogout(qb422016, can, lc) WriteLogout(qb422016, can, lc)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:117 //line views/auth.qtpl:119
return qs422016 return qs422016
//line views/auth.qtpl:117 //line views/auth.qtpl:119
} }
//line views/auth.qtpl:119 //line views/auth.qtpl:121
func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) { func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:119 //line views/auth.qtpl:121
qw422016.N().S(` qw422016.N().S(`
<!doctype html> <!doctype html>
<html> <html>
@ -526,9 +532,9 @@ func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>🔒 `) <title>🔒 `)
//line views/auth.qtpl:125 //line views/auth.qtpl:127
qw422016.E().S(lc.Get("auth.lock_title")) qw422016.E().S(lc.Get("auth.lock_title"))
//line views/auth.qtpl:125 //line views/auth.qtpl:127
qw422016.N().S(`</title> qw422016.N().S(`</title>
<link rel="shortcut icon" href="/static/favicon.ico"> <link rel="shortcut icon" href="/static/favicon.ico">
<link rel="stylesheet" href="/static/style.css"> <link rel="stylesheet" href="/static/style.css">
@ -538,68 +544,237 @@ func StreamLock(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
<section class="locked-notice__message"> <section class="locked-notice__message">
<p class="locked-notice__lock">🔒</p> <p class="locked-notice__lock">🔒</p>
<h1 class="locked-notice__title">`) <h1 class="locked-notice__title">`)
//line views/auth.qtpl:133 //line views/auth.qtpl:135
qw422016.E().S(lc.Get("auth.lock_title")) qw422016.E().S(lc.Get("auth.lock_title"))
//line views/auth.qtpl:133 //line views/auth.qtpl:135
qw422016.N().S(`</h1> qw422016.N().S(`</h1>
<form class="locked-notice__login-form" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on"> <form class="locked-notice__login-form" method="post" action="/login" id="login-form" enctype="multipart/form-data" autocomplete="on">
<label for="login-form__username">`) <label for="login-form__username">`)
//line views/auth.qtpl:135 //line views/auth.qtpl:137
qw422016.E().S(lc.Get("auth.username")) qw422016.E().S(lc.Get("auth.username"))
//line views/auth.qtpl:135 //line views/auth.qtpl:137
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="text" required autofocus id="login-form__username" name="username" autocomplete="username"> <input type="text" required autofocus id="login-form__username" name="username" autocomplete="username">
<br> <br>
<label for="login-form__password">`) <label for="login-form__password">`)
//line views/auth.qtpl:139 //line views/auth.qtpl:141
qw422016.E().S(lc.Get("auth.password")) qw422016.E().S(lc.Get("auth.password"))
//line views/auth.qtpl:139 //line views/auth.qtpl:141
qw422016.N().S(`</label> qw422016.N().S(`</label>
<br> <br>
<input type="password" required name="password" autocomplete="current-password"> <input type="password" required name="password" autocomplete="current-password">
<br> <br>
<button class="btn" type="submit" value="Log in">`) <button class="btn" type="submit" value="Log in">`)
//line views/auth.qtpl:143 //line views/auth.qtpl:145
qw422016.E().S(lc.Get("auth.login_button")) qw422016.E().S(lc.Get("auth.login_button"))
//line views/auth.qtpl:143 //line views/auth.qtpl:145
qw422016.N().S(`</button> qw422016.N().S(`</button>
</form> </form>
`) `)
//line views/auth.qtpl:145 //line views/auth.qtpl:147
streamtelegramWidget(qw422016, lc) streamtelegramWidget(qw422016, lc)
//line views/auth.qtpl:145 //line views/auth.qtpl:147
qw422016.N().S(` qw422016.N().S(`
</section> </section>
</main> </main>
</body> </body>
</html> </html>
`) `)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
} }
//line views/auth.qtpl:150 //line views/auth.qtpl:152
func WriteLock(qq422016 qtio422016.Writer, lc *l18n.Localizer) { func WriteLock(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:150 //line views/auth.qtpl:152
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
StreamLock(qw422016, lc) StreamLock(qw422016, lc)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
} }
//line views/auth.qtpl:150 //line views/auth.qtpl:152
func Lock(lc *l18n.Localizer) string { func Lock(lc *l18n.Localizer) string {
//line views/auth.qtpl:150 //line views/auth.qtpl:152
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:150 //line views/auth.qtpl:152
WriteLock(qb422016, lc) WriteLock(qb422016, lc)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:150 //line views/auth.qtpl:152
return qs422016 return qs422016
//line views/auth.qtpl:150 //line views/auth.qtpl:152
}
//line views/auth.qtpl:155
var userListL10n = map[string]l10nEntry{
"heading": en("List of users").ru("Список пользователей"),
"administrators": en("Administrators").ru("Администраторы"),
"moderators": en("Moderators").ru("Модераторы"),
"editors": en("Editors").ru("Редакторы"),
}
//line views/auth.qtpl:163
func StreamUserList(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:163
qw422016.N().S(`
<div class="layout">
<main class="main-width user-list">
`)
//line views/auth.qtpl:167
var get = func(key string) string {
return userListL10n[key].get(lc.Locale)
}
var (
admins = make([]string, 0)
moderators = make([]string, 0)
editors = make([]string, 0)
)
for u := range user.YieldUsers() {
switch u.Group {
// What if we place the users into sorted slices?
case "admin":
admins = append(admins, u.Name)
case "moderator":
moderators = append(moderators, u.Name)
case "editor", "trusted":
editors = append(editors, u.Name)
}
}
sort.Strings(admins)
sort.Strings(moderators)
sort.Strings(editors)
//line views/auth.qtpl:190
qw422016.N().S(`
<h1>`)
//line views/auth.qtpl:191
qw422016.E().S(get("heading"))
//line views/auth.qtpl:191
qw422016.N().S(`</h1>
<section>
<h2>`)
//line views/auth.qtpl:193
qw422016.E().S(get("administrators"))
//line views/auth.qtpl:193
qw422016.N().S(`</h2>
<ol>`)
//line views/auth.qtpl:194
for _, name := range admins {
//line views/auth.qtpl:194
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/auth.qtpl:195
qw422016.E().S(cfg.UserHypha)
//line views/auth.qtpl:195
qw422016.N().S(`/`)
//line views/auth.qtpl:195
qw422016.E().S(name)
//line views/auth.qtpl:195
qw422016.N().S(`">`)
//line views/auth.qtpl:195
qw422016.E().S(name)
//line views/auth.qtpl:195
qw422016.N().S(`</a></li>
`)
//line views/auth.qtpl:196
}
//line views/auth.qtpl:196
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/auth.qtpl:199
qw422016.E().S(get("moderators"))
//line views/auth.qtpl:199
qw422016.N().S(`</h2>
<ol>`)
//line views/auth.qtpl:200
for _, name := range moderators {
//line views/auth.qtpl:200
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/auth.qtpl:201
qw422016.E().S(cfg.UserHypha)
//line views/auth.qtpl:201
qw422016.N().S(`/`)
//line views/auth.qtpl:201
qw422016.E().S(name)
//line views/auth.qtpl:201
qw422016.N().S(`">`)
//line views/auth.qtpl:201
qw422016.E().S(name)
//line views/auth.qtpl:201
qw422016.N().S(`</a></li>
`)
//line views/auth.qtpl:202
}
//line views/auth.qtpl:202
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/auth.qtpl:205
qw422016.E().S(get("editors"))
//line views/auth.qtpl:205
qw422016.N().S(`</h2>
<ol>`)
//line views/auth.qtpl:206
for _, name := range editors {
//line views/auth.qtpl:206
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/auth.qtpl:207
qw422016.E().S(cfg.UserHypha)
//line views/auth.qtpl:207
qw422016.N().S(`/`)
//line views/auth.qtpl:207
qw422016.E().S(name)
//line views/auth.qtpl:207
qw422016.N().S(`">`)
//line views/auth.qtpl:207
qw422016.E().S(name)
//line views/auth.qtpl:207
qw422016.N().S(`</a></li>
`)
//line views/auth.qtpl:208
}
//line views/auth.qtpl:208
qw422016.N().S(`</ol>
</section>
</main>
</div>
`)
//line views/auth.qtpl:212
}
//line views/auth.qtpl:212
func WriteUserList(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/auth.qtpl:212
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/auth.qtpl:212
StreamUserList(qw422016, lc)
//line views/auth.qtpl:212
qt422016.ReleaseWriter(qw422016)
//line views/auth.qtpl:212
}
//line views/auth.qtpl:212
func UserList(lc *l18n.Localizer) string {
//line views/auth.qtpl:212
qb422016 := qt422016.AcquireByteBuffer()
//line views/auth.qtpl:212
WriteUserList(qb422016, lc)
//line views/auth.qtpl:212
qs422016 := string(qb422016.B)
//line views/auth.qtpl:212
qt422016.ReleaseByteBuffer(qb422016)
//line views/auth.qtpl:212
return qs422016
//line views/auth.qtpl:212
} }

View File

@ -4,21 +4,6 @@
{% import "github.com/bouncepaw/mycorrhiza/util" %} {% import "github.com/bouncepaw/mycorrhiza/util" %}
{% import "github.com/bouncepaw/mycorrhiza/l18n" %} {% import "github.com/bouncepaw/mycorrhiza/l18n" %}
{% func TitleSearch(query string, generator func(string) <-chan string, lc *l18n.Localizer) %}
<div class="layout">
<main class="main-width title-search">
<h1>{%s lc.Get("ui.search_results_query", &l18n.Replacements{"query": query})%}</h1>
<p>{%s lc.Get("ui.search_results_desc")%}</p>
<ul class="title-search__results">
{% for hyphaName := range generator(query) %}
<li class="title-search__entry">
<a class="title-search__link wikilink" href="/hypha/{%s hyphaName %}">{%s util.BeautifulName(hyphaName) %}</a>
</li>
{% endfor %}
</main>
</div>
{% endfunc %}
{% func Backlinks(hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) %} {% func Backlinks(hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) %}
<div class="layout"> <div class="layout">
<main class="main-width backlinks"> <main class="main-width backlinks">

View File

@ -30,83 +30,13 @@ var (
) )
//line views/stuff.qtpl:7 //line views/stuff.qtpl:7
func StreamTitleSearch(qw422016 *qt422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:7
qw422016.N().S(`
<div class="layout">
<main class="main-width title-search">
<h1>`)
//line views/stuff.qtpl:10
qw422016.E().S(lc.Get("ui.search_results_query", &l18n.Replacements{"query": query}))
//line views/stuff.qtpl:10
qw422016.N().S(`</h1>
<p>`)
//line views/stuff.qtpl:11
qw422016.E().S(lc.Get("ui.search_results_desc"))
//line views/stuff.qtpl:11
qw422016.N().S(`</p>
<ul class="title-search__results">
`)
//line views/stuff.qtpl:13
for hyphaName := range generator(query) {
//line views/stuff.qtpl:13
qw422016.N().S(`
<li class="title-search__entry">
<a class="title-search__link wikilink" href="/hypha/`)
//line views/stuff.qtpl:15
qw422016.E().S(hyphaName)
//line views/stuff.qtpl:15
qw422016.N().S(`">`)
//line views/stuff.qtpl:15
qw422016.E().S(util.BeautifulName(hyphaName))
//line views/stuff.qtpl:15
qw422016.N().S(`</a>
</li>
`)
//line views/stuff.qtpl:17
}
//line views/stuff.qtpl:17
qw422016.N().S(`
</main>
</div>
`)
//line views/stuff.qtpl:20
}
//line views/stuff.qtpl:20
func WriteTitleSearch(qq422016 qtio422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:20
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:20
StreamTitleSearch(qw422016, query, generator, lc)
//line views/stuff.qtpl:20
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:20
}
//line views/stuff.qtpl:20
func TitleSearch(query string, generator func(string) <-chan string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:20
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:20
WriteTitleSearch(qb422016, query, generator, lc)
//line views/stuff.qtpl:20
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:20
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:20
return qs422016
//line views/stuff.qtpl:20
}
//line views/stuff.qtpl:22
func StreamBacklinks(qw422016 *qt422016.Writer, hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) { func StreamBacklinks(qw422016 *qt422016.Writer, hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:22 //line views/stuff.qtpl:7
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width backlinks"> <main class="main-width backlinks">
<h1>`) <h1>`)
//line views/stuff.qtpl:25 //line views/stuff.qtpl:10
qw422016.N().S(lc.Get( qw422016.N().S(lc.Get(
"ui.backlinks_heading", "ui.backlinks_heading",
&l18n.Replacements{ &l18n.Replacements{
@ -117,220 +47,220 @@ func StreamBacklinks(qw422016 *qt422016.Writer, hyphaName string, generator func
), ),
}, },
)) ))
//line views/stuff.qtpl:34 //line views/stuff.qtpl:19
qw422016.N().S(`</h1> qw422016.N().S(`</h1>
<p>`) <p>`)
//line views/stuff.qtpl:35 //line views/stuff.qtpl:20
qw422016.E().S(lc.Get("ui.backlinks_desc")) qw422016.E().S(lc.Get("ui.backlinks_desc"))
//line views/stuff.qtpl:35 //line views/stuff.qtpl:20
qw422016.N().S(`</p> qw422016.N().S(`</p>
<ul class="backlinks__list"> <ul class="backlinks__list">
`) `)
//line views/stuff.qtpl:37 //line views/stuff.qtpl:22
for hyphaName := range generator(hyphaName) { for hyphaName := range generator(hyphaName) {
//line views/stuff.qtpl:37 //line views/stuff.qtpl:22
qw422016.N().S(` qw422016.N().S(`
<li class="backlinks__entry"> <li class="backlinks__entry">
<a class="backlinks__link wikilink" href="/hypha/`) <a class="backlinks__link wikilink" href="/hypha/`)
//line views/stuff.qtpl:39 //line views/stuff.qtpl:24
qw422016.E().S(hyphaName) qw422016.E().S(hyphaName)
//line views/stuff.qtpl:39 //line views/stuff.qtpl:24
qw422016.N().S(`">`) qw422016.N().S(`">`)
//line views/stuff.qtpl:39 //line views/stuff.qtpl:24
qw422016.E().S(util.BeautifulName(hyphaName)) qw422016.E().S(util.BeautifulName(hyphaName))
//line views/stuff.qtpl:39 //line views/stuff.qtpl:24
qw422016.N().S(`</a> qw422016.N().S(`</a>
</li> </li>
`) `)
//line views/stuff.qtpl:41 //line views/stuff.qtpl:26
} }
//line views/stuff.qtpl:41 //line views/stuff.qtpl:26
qw422016.N().S(` qw422016.N().S(`
</ul> </ul>
</main> </main>
</div> </div>
`) `)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
} }
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
func WriteBacklinks(qq422016 qtio422016.Writer, hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) { func WriteBacklinks(qq422016 qtio422016.Writer, hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
StreamBacklinks(qw422016, hyphaName, generator, lc) StreamBacklinks(qw422016, hyphaName, generator, lc)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
} }
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
func Backlinks(hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) string { func Backlinks(hyphaName string, generator func(string) <-chan string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
WriteBacklinks(qb422016, hyphaName, generator, lc) WriteBacklinks(qb422016, hyphaName, generator, lc)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
return qs422016 return qs422016
//line views/stuff.qtpl:45 //line views/stuff.qtpl:30
} }
//line views/stuff.qtpl:47 //line views/stuff.qtpl:32
func StreamHelp(qw422016 *qt422016.Writer, content, lang string, lc *l18n.Localizer) { func StreamHelp(qw422016 *qt422016.Writer, content, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:47 //line views/stuff.qtpl:32
qw422016.N().S(` qw422016.N().S(`
<div class="layout"> <div class="layout">
<main class="main-width help"> <main class="main-width help">
<article> <article>
`) `)
//line views/stuff.qtpl:51 //line views/stuff.qtpl:36
qw422016.N().S(content) qw422016.N().S(content)
//line views/stuff.qtpl:51 //line views/stuff.qtpl:36
qw422016.N().S(` qw422016.N().S(`
</article> </article>
</main> </main>
`) `)
//line views/stuff.qtpl:54 //line views/stuff.qtpl:39
qw422016.N().S(helpTopics(lang, lc)) qw422016.N().S(helpTopics(lang, lc))
//line views/stuff.qtpl:54 //line views/stuff.qtpl:39
qw422016.N().S(` qw422016.N().S(`
</div> </div>
`) `)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
} }
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
func WriteHelp(qq422016 qtio422016.Writer, content, lang string, lc *l18n.Localizer) { func WriteHelp(qq422016 qtio422016.Writer, content, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
StreamHelp(qw422016, content, lang, lc) StreamHelp(qw422016, content, lang, lc)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
} }
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
func Help(content, lang string, lc *l18n.Localizer) string { func Help(content, lang string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
WriteHelp(qb422016, content, lang, lc) WriteHelp(qb422016, content, lang, lc)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
return qs422016 return qs422016
//line views/stuff.qtpl:56 //line views/stuff.qtpl:41
} }
//line views/stuff.qtpl:58 //line views/stuff.qtpl:43
func StreamHelpEmptyError(qw422016 *qt422016.Writer, lc *l18n.Localizer) { func StreamHelpEmptyError(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:58 //line views/stuff.qtpl:43
qw422016.N().S(` qw422016.N().S(`
<h1>`) <h1>`)
//line views/stuff.qtpl:59 //line views/stuff.qtpl:44
qw422016.E().S(lc.Get("help.empty_error_title")) qw422016.E().S(lc.Get("help.empty_error_title"))
//line views/stuff.qtpl:59 //line views/stuff.qtpl:44
qw422016.N().S(`</h1> qw422016.N().S(`</h1>
<p>`) <p>`)
//line views/stuff.qtpl:60 //line views/stuff.qtpl:45
qw422016.E().S(lc.Get("help.empty_error_line_1")) qw422016.E().S(lc.Get("help.empty_error_line_1"))
//line views/stuff.qtpl:60 //line views/stuff.qtpl:45
qw422016.N().S(`</p> qw422016.N().S(`</p>
<p>`) <p>`)
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.E().S(lc.Get("help.empty_error_line_2a")) qw422016.E().S(lc.Get("help.empty_error_line_2a"))
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.N().S(` <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">`) qw422016.N().S(` <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">`)
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.E().S(lc.Get("help.empty_error_link")) qw422016.E().S(lc.Get("help.empty_error_link"))
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.N().S(`</a> `) qw422016.N().S(`</a> `)
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.E().S(lc.Get("help.empty_error_line_2b")) qw422016.E().S(lc.Get("help.empty_error_line_2b"))
//line views/stuff.qtpl:61 //line views/stuff.qtpl:46
qw422016.N().S(`</p> qw422016.N().S(`</p>
`) `)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
} }
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
func WriteHelpEmptyError(qq422016 qtio422016.Writer, lc *l18n.Localizer) { func WriteHelpEmptyError(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
StreamHelpEmptyError(qw422016, lc) StreamHelpEmptyError(qw422016, lc)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
} }
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
func HelpEmptyError(lc *l18n.Localizer) string { func HelpEmptyError(lc *l18n.Localizer) string {
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
WriteHelpEmptyError(qb422016, lc) WriteHelpEmptyError(qb422016, lc)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
return qs422016 return qs422016
//line views/stuff.qtpl:62 //line views/stuff.qtpl:47
} }
//line views/stuff.qtpl:64 //line views/stuff.qtpl:49
func streamcommonScripts(qw422016 *qt422016.Writer) { func streamcommonScripts(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:64 //line views/stuff.qtpl:49
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/stuff.qtpl:65 //line views/stuff.qtpl:50
for _, scriptPath := range cfg.CommonScripts { for _, scriptPath := range cfg.CommonScripts {
//line views/stuff.qtpl:65 //line views/stuff.qtpl:50
qw422016.N().S(` qw422016.N().S(`
<script src="`) <script src="`)
//line views/stuff.qtpl:66 //line views/stuff.qtpl:51
qw422016.E().S(scriptPath) qw422016.E().S(scriptPath)
//line views/stuff.qtpl:66 //line views/stuff.qtpl:51
qw422016.N().S(`"></script> qw422016.N().S(`"></script>
`) `)
//line views/stuff.qtpl:67 //line views/stuff.qtpl:52
} }
//line views/stuff.qtpl:67 //line views/stuff.qtpl:52
qw422016.N().S(` qw422016.N().S(`
`) `)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
} }
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
func writecommonScripts(qq422016 qtio422016.Writer) { func writecommonScripts(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
qw422016 := qt422016.AcquireWriter(qq422016) qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
streamcommonScripts(qw422016) streamcommonScripts(qw422016)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
qt422016.ReleaseWriter(qw422016) qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
} }
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
func commonScripts() string { func commonScripts() string {
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
qb422016 := qt422016.AcquireByteBuffer() qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
writecommonScripts(qb422016) writecommonScripts(qb422016)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
qs422016 := string(qb422016.B) qs422016 := string(qb422016.B)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
qt422016.ReleaseByteBuffer(qb422016) qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
return qs422016 return qs422016
//line views/stuff.qtpl:68 //line views/stuff.qtpl:53
} }

View File

@ -1,64 +0,0 @@
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/l18n" %}
{% import "github.com/bouncepaw/mycorrhiza/user" %}
{% import "sort" %}
{% code
var hyphaListL10n = map[string]l10nEntry{
"heading": en("List of users").ru("Список пользователей"),
"administrators": en("Administrators").ru("Администраторы"),
"moderators": en("Moderators").ru("Модераторы"),
"editors": en("Editors").ru("Редакторы"),
}
%}
{% func UserList(lc *l18n.Localizer) %}
<div class="layout">
<main class="main-width user-list">
{% code
var get = func(key string) string {
return hyphaListL10n[key].get(lc.Locale)
}
var (
admins = make([]string, 0)
moderators = make([]string, 0)
editors = make([]string, 0)
)
for u := range user.YieldUsers() {
switch u.Group {
// What if we place the users into sorted slices?
case "admin":
admins = append(admins, u.Name)
case "moderator":
moderators = append(moderators, u.Name)
case "editor", "trusted":
editors = append(editors, u.Name)
}
}
sort.Strings(admins)
sort.Strings(moderators)
sort.Strings(editors)
%}
<h1>{%s get("heading") %}</h1>
<section>
<h2>{%s get("administrators") %}</h2>
<ol>{% for _, name := range admins %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
<section>
<h2>{%s get("moderators") %}</h2>
<ol>{% for _, name := range moderators %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
<section>
<h2>{%s get("editors") %}</h2>
<ol>{% for _, name := range editors %}
<li><a href="/hypha/{%s cfg.UserHypha %}/{%s name %}">{%s name %}</a></li>
{% endfor %}</ol>
</section>
</main>
</div>
{% endfunc %}

View File

@ -1,199 +0,0 @@
// Code generated by qtc from "user_list.qtpl". DO NOT EDIT.
// See https://github.com/valyala/quicktemplate for details.
//line views/user_list.qtpl:1
package views
//line views/user_list.qtpl:1
import "github.com/bouncepaw/mycorrhiza/cfg"
//line views/user_list.qtpl:2
import "github.com/bouncepaw/mycorrhiza/l18n"
//line views/user_list.qtpl:3
import "github.com/bouncepaw/mycorrhiza/user"
//line views/user_list.qtpl:4
import "sort"
//line views/user_list.qtpl:6
import (
qtio422016 "io"
qt422016 "github.com/valyala/quicktemplate"
)
//line views/user_list.qtpl:6
var (
_ = qtio422016.Copy
_ = qt422016.AcquireByteBuffer
)
//line views/user_list.qtpl:7
var hyphaListL10n = map[string]l10nEntry{
"heading": en("List of users").ru("Список пользователей"),
"administrators": en("Administrators").ru("Администраторы"),
"moderators": en("Moderators").ru("Модераторы"),
"editors": en("Editors").ru("Редакторы"),
}
//line views/user_list.qtpl:15
func StreamUserList(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/user_list.qtpl:15
qw422016.N().S(`
<div class="layout">
<main class="main-width user-list">
`)
//line views/user_list.qtpl:19
var get = func(key string) string {
return hyphaListL10n[key].get(lc.Locale)
}
var (
admins = make([]string, 0)
moderators = make([]string, 0)
editors = make([]string, 0)
)
for u := range user.YieldUsers() {
switch u.Group {
// What if we place the users into sorted slices?
case "admin":
admins = append(admins, u.Name)
case "moderator":
moderators = append(moderators, u.Name)
case "editor", "trusted":
editors = append(editors, u.Name)
}
}
sort.Strings(admins)
sort.Strings(moderators)
sort.Strings(editors)
//line views/user_list.qtpl:42
qw422016.N().S(`
<h1>`)
//line views/user_list.qtpl:43
qw422016.E().S(get("heading"))
//line views/user_list.qtpl:43
qw422016.N().S(`</h1>
<section>
<h2>`)
//line views/user_list.qtpl:45
qw422016.E().S(get("administrators"))
//line views/user_list.qtpl:45
qw422016.N().S(`</h2>
<ol>`)
//line views/user_list.qtpl:46
for _, name := range admins {
//line views/user_list.qtpl:46
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/user_list.qtpl:47
qw422016.E().S(cfg.UserHypha)
//line views/user_list.qtpl:47
qw422016.N().S(`/`)
//line views/user_list.qtpl:47
qw422016.E().S(name)
//line views/user_list.qtpl:47
qw422016.N().S(`">`)
//line views/user_list.qtpl:47
qw422016.E().S(name)
//line views/user_list.qtpl:47
qw422016.N().S(`</a></li>
`)
//line views/user_list.qtpl:48
}
//line views/user_list.qtpl:48
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/user_list.qtpl:51
qw422016.E().S(get("moderators"))
//line views/user_list.qtpl:51
qw422016.N().S(`</h2>
<ol>`)
//line views/user_list.qtpl:52
for _, name := range moderators {
//line views/user_list.qtpl:52
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/user_list.qtpl:53
qw422016.E().S(cfg.UserHypha)
//line views/user_list.qtpl:53
qw422016.N().S(`/`)
//line views/user_list.qtpl:53
qw422016.E().S(name)
//line views/user_list.qtpl:53
qw422016.N().S(`">`)
//line views/user_list.qtpl:53
qw422016.E().S(name)
//line views/user_list.qtpl:53
qw422016.N().S(`</a></li>
`)
//line views/user_list.qtpl:54
}
//line views/user_list.qtpl:54
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/user_list.qtpl:57
qw422016.E().S(get("editors"))
//line views/user_list.qtpl:57
qw422016.N().S(`</h2>
<ol>`)
//line views/user_list.qtpl:58
for _, name := range editors {
//line views/user_list.qtpl:58
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/user_list.qtpl:59
qw422016.E().S(cfg.UserHypha)
//line views/user_list.qtpl:59
qw422016.N().S(`/`)
//line views/user_list.qtpl:59
qw422016.E().S(name)
//line views/user_list.qtpl:59
qw422016.N().S(`">`)
//line views/user_list.qtpl:59
qw422016.E().S(name)
//line views/user_list.qtpl:59
qw422016.N().S(`</a></li>
`)
//line views/user_list.qtpl:60
}
//line views/user_list.qtpl:60
qw422016.N().S(`</ol>
</section>
</main>
</div>
`)
//line views/user_list.qtpl:64
}
//line views/user_list.qtpl:64
func WriteUserList(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/user_list.qtpl:64
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/user_list.qtpl:64
StreamUserList(qw422016, lc)
//line views/user_list.qtpl:64
qt422016.ReleaseWriter(qw422016)
//line views/user_list.qtpl:64
}
//line views/user_list.qtpl:64
func UserList(lc *l18n.Localizer) string {
//line views/user_list.qtpl:64
qb422016 := qt422016.AcquireByteBuffer()
//line views/user_list.qtpl:64
WriteUserList(qb422016, lc)
//line views/user_list.qtpl:64
qs422016 := string(qb422016.B)
//line views/user_list.qtpl:64
qt422016.ReleaseByteBuffer(qb422016)
//line views/user_list.qtpl:64
return qs422016
//line views/user_list.qtpl:64
}

View File

@ -1,36 +0,0 @@
package web
import (
"github.com/bouncepaw/mycorrhiza/viewutil"
"io"
"net/http"
"github.com/gorilla/mux"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/shroom"
"github.com/bouncepaw/mycorrhiza/util"
"github.com/bouncepaw/mycorrhiza/views"
)
func initSearch(r *mux.Router) {
r.HandleFunc("/title-search/", handlerTitleSearch)
}
func handlerTitleSearch(w http.ResponseWriter, rq *http.Request) {
util.PrepareRq(rq)
_ = rq.ParseForm()
var (
query = rq.FormValue("q")
lc = l18n.FromRequest(rq)
)
w.WriteHeader(http.StatusOK)
_, _ = io.WriteString(
w,
views.Base(
viewutil.MetaFrom(w, rq),
lc.Get("ui.title_search_title", &l18n.Replacements{"query": query}),
views.TitleSearch(query, shroom.YieldHyphaNamesContainingString, lc),
),
)
}

View File

@ -47,7 +47,6 @@ func Handler() http.Handler {
initMutators(wikiRouter) initMutators(wikiRouter)
initHistory(wikiRouter) initHistory(wikiRouter)
initHelp(wikiRouter) initHelp(wikiRouter)
initSearch(wikiRouter)
initBacklinks(wikiRouter) initBacklinks(wikiRouter)
categories.InitHandlers(wikiRouter) categories.InitHandlers(wikiRouter)
misc.InitHandlers(wikiRouter) misc.InitHandlers(wikiRouter)