1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2024-12-13 22:00:27 +00:00

Help: Write the config file doc in English

This commit is contained in:
Timur Ismagilov 2021-11-30 21:20:09 +03:00
parent fbfbeb33cb
commit bc77619105
6 changed files with 286 additions and 209 deletions

63
help/en/config_file.myco Normal file
View File

@ -0,0 +1,63 @@
= Configuration file
//This article is intended for wiki administrators.//
The main way to configure your Mycorrhiza instance is through the **configuration file**. It is located at the root of your wiki structure and is called `config.ini`.
The file is generated automatically when you create a new wiki:
```
# Generate a new wiki
$ mycorrhiza bestWiki
...
# See what's inside
$ ls bestWiki
cache config.ini static wiki.git
```
The file is written in the [[https://en.wikipedia.org/wiki/INI_file | .ini format]].
== Example configuration
The auto-generated file is the best example (it has comments too).
Here's another example:
```ini
WikiName = My wiki
NaviTitleIcon = 🐑
[Hyphae]
HomeHypha = home
UserHypha = u
HeaderLinksHypha = header-links
[Network]
HTTPPort = 8080
URL = https://wiki
GeminiCertificatePath = /home/wiki/gemcerts
[Authorization]
UseRegistration = true
```
== Fields
=== Root section
* `WikiName`: //string//. The name your wiki has. It is shown in the header by default and in other places. **Default:** `Mycorrhiza Wiki`.
* `NaviTitleIcon`: //string//. The icon shown before the colon in the navigational titles above each hypha. You may want to use an emoji or HTML here. **Default:** `🍄` (mushroom emoji).
=== [Hyphae]
* `HomeHypha`: //string//. The name your home hypha has. **Default:** `home`.
* `UserHypha`: //string//. The name of the hypha that is parent of all user hyphae. **Default:** `u`.
* `HeaderLinkHypha`: //string//. The name of the hypha where you can configure the header. There is no default.
=== [Network]
* `HTTPPort`: //number//. What port is used for serving the web interface of Mycorrhiza. **Default:** `1737`.
* `URL`: //url//. What URL is used for Opengraph and Web feed in the web interface. There is no default and you really should set it to something.
=== [Authorization]
* `UseRegistration`: //boolean//. Whether you want unregistered visitors to be able to register themselves using the web form. **Default:** `false`.
* `LimitRegistration`: //number//. There cannot be more registered users than this number. If the number is zero, there is no limit. Makes sense only when `UseRegistration` is `true`. **Default:** `0`.
=== [CustomScripts]
You can specify URLs of JavaScript files you want to load.
* `CommonScripts`: //list of url//. Comma-separated list of unquoted URLs to JS files to load on //all// pages.
* `ViewScripts`: //list of urls//. Comma-separated list of unquoted URLs to JS files to load on //view// pages: `/hypha`, `/rev`.
* `EditScripts`: //list of urls//. Comma-separated list of unquoted URLs to JS files to load on the `/edit` page.

View File

@ -95,6 +95,7 @@ var localizations = map[string]string{
"en.edit.transclude": "Transclusion",
"en.edit.underline": "Underline",
"en.help.attachment": "Attachment",
"en.help.config_file": "Configuration file",
"en.help.configuration": "Configuration (for administrators)",
"en.help.empty_error_line_1": "Try finding a different entry that would help you.",
"en.help.empty_error_line_2a": "If you want to write this entry by yourself, consider",
@ -329,6 +330,7 @@ var localizations = map[string]string{
"ru.edit.transclude": "Трансклюзия",
"ru.edit.underline": "Подчеркивание",
"ru.help.attachment": "Вложение",
"ru.help.config_file": "Файл конфигурации",
"ru.help.configuration": "Конфигурация (для администраторов)",
"ru.help.empty_error_line_1": "Попробуйте поискать другую страницу, способную вам помочь.",
"ru.help.empty_error_line_2a": "Если вы хотите написать эту страницу сами, будем рады вашим правкам в ",

View File

@ -22,5 +22,6 @@
"configuration": "Configuration (for administrators)",
"lock": "Lock",
"whitelist": "Whitelist",
"telegram": "Telegram authorization"
"telegram": "Telegram authorization",
"config_file": "Configuration file"
}

View File

@ -22,5 +22,6 @@
"configuration": "Конфигурация (для администраторов)",
"lock": "Блокировка",
"whitelist": "Белый список",
"telegram": "Авторизация через Телеграм"
"telegram": "Авторизация через Телеграм",
"config_file": "Файл конфигурации"
}

View File

@ -181,6 +181,7 @@ It outputs a poorly formatted JSON, but it works and is valid.
</li>
<li>{%s lc.GetWithLocale(lang, "help.configuration") %}
<ul>
<li><a href="/help/{%s lang %}/config_file">{%s lc.GetWithLocale(lang, "help.config_file") %}</a></li>
<li><a href="/help/{%s lang %}/lock">{%s lc.GetWithLocale(lang, "help.lock") %}</a></li>
<li><a href="/help/{%s lang %}/whitelist">{%s lc.GetWithLocale(lang, "help.whitelist") %}</a></li>
<li><a href="/help/{%s lang %}/telegram">{%s lc.GetWithLocale(lang, "help.telegram") %}</a></li>

View File

@ -729,28 +729,37 @@ func streamhelpTopicsHTML(qw422016 *qt422016.Writer, lang string, lc *l18n.Local
//line views/stuff.qtpl:184
qw422016.E().S(lang)
//line views/stuff.qtpl:184
qw422016.N().S(`/config_file">`)
//line views/stuff.qtpl:184
qw422016.E().S(lc.GetWithLocale(lang, "help.config_file"))
//line views/stuff.qtpl:184
qw422016.N().S(`</a></li>
<li><a href="/help/`)
//line views/stuff.qtpl:185
qw422016.E().S(lang)
//line views/stuff.qtpl:185
qw422016.N().S(`/lock">`)
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
qw422016.E().S(lc.GetWithLocale(lang, "help.lock"))
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
qw422016.N().S(`</a></li>
<li><a href="/help/`)
//line views/stuff.qtpl:185
//line views/stuff.qtpl:186
qw422016.E().S(lang)
//line views/stuff.qtpl:185
//line views/stuff.qtpl:186
qw422016.N().S(`/whitelist">`)
//line views/stuff.qtpl:185
//line views/stuff.qtpl:186
qw422016.E().S(lc.GetWithLocale(lang, "help.whitelist"))
//line views/stuff.qtpl:185
//line views/stuff.qtpl:186
qw422016.N().S(`</a></li>
<li><a href="/help/`)
//line views/stuff.qtpl:186
//line views/stuff.qtpl:187
qw422016.E().S(lang)
//line views/stuff.qtpl:186
//line views/stuff.qtpl:187
qw422016.N().S(`/telegram">`)
//line views/stuff.qtpl:186
//line views/stuff.qtpl:187
qw422016.E().S(lc.GetWithLocale(lang, "help.telegram"))
//line views/stuff.qtpl:186
//line views/stuff.qtpl:187
qw422016.N().S(`</a></li>
<li>...</li>
</ul>
@ -758,91 +767,91 @@ func streamhelpTopicsHTML(qw422016 *qt422016.Writer, lang string, lc *l18n.Local
</ul>
</aside>
`)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
}
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
func writehelpTopicsHTML(qq422016 qtio422016.Writer, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
streamhelpTopicsHTML(qw422016, lang, lc)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
}
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
func helpTopicsHTML(lang string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
writehelpTopicsHTML(qb422016, lang, lc)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
return qs422016
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
}
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
func streamhelpTopicBadgeHTML(qw422016 *qt422016.Writer, lang, topic string) {
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
qw422016.N().S(`
<a class="help-topic-badge" href="/help/`)
//line views/stuff.qtpl:195
//line views/stuff.qtpl:196
qw422016.E().S(lang)
//line views/stuff.qtpl:195
//line views/stuff.qtpl:196
qw422016.N().S(`/`)
//line views/stuff.qtpl:195
//line views/stuff.qtpl:196
qw422016.E().S(topic)
//line views/stuff.qtpl:195
//line views/stuff.qtpl:196
qw422016.N().S(`">?</a>
`)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
}
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
func writehelpTopicBadgeHTML(qq422016 qtio422016.Writer, lang, topic string) {
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
streamhelpTopicBadgeHTML(qw422016, lang, topic)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
}
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
func helpTopicBadgeHTML(lang, topic string) string {
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
writehelpTopicBadgeHTML(qb422016, lang, topic)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
return qs422016
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
}
//line views/stuff.qtpl:198
//line views/stuff.qtpl:199
func StreamUserListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:198
//line views/stuff.qtpl:199
qw422016.N().S(`
<div class="layout">
<main class="main-width user-list">
<h1>`)
//line views/stuff.qtpl:201
//line views/stuff.qtpl:202
qw422016.E().S(lc.Get("ui.users_heading"))
//line views/stuff.qtpl:201
//line views/stuff.qtpl:202
qw422016.N().S(`</h1>
`)
//line views/stuff.qtpl:203
//line views/stuff.qtpl:204
var (
admins = make([]string, 0)
moderators = make([]string, 0)
@ -862,149 +871,149 @@ func StreamUserListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
sort.Strings(moderators)
sort.Strings(editors)
//line views/stuff.qtpl:221
//line views/stuff.qtpl:222
qw422016.N().S(`
<section>
<h2>`)
//line views/stuff.qtpl:223
//line views/stuff.qtpl:224
qw422016.E().S(lc.Get("ui.users_admins"))
//line views/stuff.qtpl:223
//line views/stuff.qtpl:224
qw422016.N().S(`</h2>
<ol>`)
//line views/stuff.qtpl:224
//line views/stuff.qtpl:225
for _, name := range admins {
//line views/stuff.qtpl:224
//line views/stuff.qtpl:225
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.N().S(`/`)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.E().S(name)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.N().S(`">`)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.E().S(name)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:226
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:227
}
//line views/stuff.qtpl:226
//line views/stuff.qtpl:227
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/stuff.qtpl:229
//line views/stuff.qtpl:230
qw422016.E().S(lc.Get("ui.users_moderators"))
//line views/stuff.qtpl:229
//line views/stuff.qtpl:230
qw422016.N().S(`</h2>
<ol>`)
//line views/stuff.qtpl:230
//line views/stuff.qtpl:231
for _, name := range moderators {
//line views/stuff.qtpl:230
//line views/stuff.qtpl:231
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.N().S(`/`)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.E().S(name)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.N().S(`">`)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.E().S(name)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:232
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:233
}
//line views/stuff.qtpl:232
//line views/stuff.qtpl:233
qw422016.N().S(`</ol>
</section>
<section>
<h2>`)
//line views/stuff.qtpl:235
//line views/stuff.qtpl:236
qw422016.E().S(lc.Get("ui.users_editors"))
//line views/stuff.qtpl:235
//line views/stuff.qtpl:236
qw422016.N().S(`</h2>
<ol>`)
//line views/stuff.qtpl:236
//line views/stuff.qtpl:237
for _, name := range editors {
//line views/stuff.qtpl:236
//line views/stuff.qtpl:237
qw422016.N().S(`
<li><a href="/hypha/`)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.N().S(`/`)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.E().S(name)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.N().S(`">`)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.E().S(name)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:238
qw422016.N().S(`</a></li>
`)
//line views/stuff.qtpl:238
//line views/stuff.qtpl:239
}
//line views/stuff.qtpl:238
//line views/stuff.qtpl:239
qw422016.N().S(`</ol>
</section>
</main>
</div>
`)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
}
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
func WriteUserListHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
StreamUserListHTML(qw422016, lc)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
}
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
func UserListHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
WriteUserListHTML(qb422016, lc)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
return qs422016
//line views/stuff.qtpl:242
//line views/stuff.qtpl:243
}
//line views/stuff.qtpl:244
//line views/stuff.qtpl:245
func StreamHyphaListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:244
//line views/stuff.qtpl:245
qw422016.N().S(`
<div class="layout">
<main class="main-width">
<h1>`)
//line views/stuff.qtpl:247
//line views/stuff.qtpl:248
qw422016.E().S(lc.Get("ui.list_heading"))
//line views/stuff.qtpl:247
//line views/stuff.qtpl:248
qw422016.N().S(`</h1>
<p>`)
//line views/stuff.qtpl:248
//line views/stuff.qtpl:249
qw422016.E().S(lc.GetPlural("ui.list_desc", hyphae.Count()))
//line views/stuff.qtpl:248
//line views/stuff.qtpl:249
qw422016.N().S(`</p>
<ul class="hypha-list">
`)
//line views/stuff.qtpl:251
//line views/stuff.qtpl:252
hyphaNames := make(chan string)
sortedHypha := hyphae.PathographicSort(hyphaNames)
for hypha := range hyphae.YieldExistingHyphae() {
@ -1012,252 +1021,252 @@ func StreamHyphaListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
}
close(hyphaNames)
//line views/stuff.qtpl:257
//line views/stuff.qtpl:258
qw422016.N().S(`
`)
//line views/stuff.qtpl:258
//line views/stuff.qtpl:259
for hyphaName := range sortedHypha {
//line views/stuff.qtpl:258
//line views/stuff.qtpl:259
qw422016.N().S(`
`)
//line views/stuff.qtpl:259
//line views/stuff.qtpl:260
hypha := hyphae.ByName(hyphaName)
//line views/stuff.qtpl:259
//line views/stuff.qtpl:260
qw422016.N().S(`
<li class="hypha-list__entry">
<a class="hypha-list__link" href="/hypha/`)
//line views/stuff.qtpl:261
//line views/stuff.qtpl:262
qw422016.E().S(hypha.Name)
//line views/stuff.qtpl:261
//line views/stuff.qtpl:262
qw422016.N().S(`">`)
//line views/stuff.qtpl:261
//line views/stuff.qtpl:262
qw422016.E().S(util.BeautifulName(hypha.Name))
//line views/stuff.qtpl:261
//line views/stuff.qtpl:262
qw422016.N().S(`</a>
`)
//line views/stuff.qtpl:262
//line views/stuff.qtpl:263
if hypha.BinaryPath != "" {
//line views/stuff.qtpl:262
//line views/stuff.qtpl:263
qw422016.N().S(`
<span class="hypha-list__amnt-type">`)
//line views/stuff.qtpl:263
//line views/stuff.qtpl:264
qw422016.E().S(filepath.Ext(hypha.BinaryPath)[1:])
//line views/stuff.qtpl:263
//line views/stuff.qtpl:264
qw422016.N().S(`</span>
`)
//line views/stuff.qtpl:264
//line views/stuff.qtpl:265
}
//line views/stuff.qtpl:264
//line views/stuff.qtpl:265
qw422016.N().S(`
</li>
`)
//line views/stuff.qtpl:266
//line views/stuff.qtpl:267
}
//line views/stuff.qtpl:266
//line views/stuff.qtpl:267
qw422016.N().S(`
</ul>
</main>
</div>
`)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
}
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
func WriteHyphaListHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
StreamHyphaListHTML(qw422016, lc)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
}
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
func HyphaListHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
WriteHyphaListHTML(qb422016, lc)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
return qs422016
//line views/stuff.qtpl:270
//line views/stuff.qtpl:271
}
//line views/stuff.qtpl:272
//line views/stuff.qtpl:273
func StreamAboutHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:272
//line views/stuff.qtpl:273
qw422016.N().S(`
<div class="layout">
<main class="main-width">
<section>
<h1>`)
//line views/stuff.qtpl:276
//line views/stuff.qtpl:277
qw422016.E().S(lc.Get("ui.about_title", &l18n.Replacements{"name": cfg.WikiName}))
//line views/stuff.qtpl:276
//line views/stuff.qtpl:277
qw422016.N().S(`</h1>
<ul>
<li><b>`)
//line views/stuff.qtpl:278
//line views/stuff.qtpl:279
qw422016.N().S(lc.Get("ui.about_version", &l18n.Replacements{"pre": "<a href=\"https://mycorrhiza.wiki\">", "post": "</a>"}))
//line views/stuff.qtpl:278
//line views/stuff.qtpl:279
qw422016.N().S(`</b> 1.7.0</li>
`)
//line views/stuff.qtpl:279
//line views/stuff.qtpl:280
if cfg.UseAuth {
//line views/stuff.qtpl:279
//line views/stuff.qtpl:280
qw422016.N().S(` <li><b>`)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:281
qw422016.E().S(lc.Get("ui.about_usercount"))
//line views/stuff.qtpl:280
//line views/stuff.qtpl:281
qw422016.N().S(`</b> `)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:281
qw422016.N().DUL(user.Count())
//line views/stuff.qtpl:280
//line views/stuff.qtpl:281
qw422016.N().S(`</li>
<li><b>`)
//line views/stuff.qtpl:281
//line views/stuff.qtpl:282
qw422016.E().S(lc.Get("ui.about_homepage"))
//line views/stuff.qtpl:281
//line views/stuff.qtpl:282
qw422016.N().S(`</b> <a href="/">`)
//line views/stuff.qtpl:281
//line views/stuff.qtpl:282
qw422016.E().S(cfg.HomeHypha)
//line views/stuff.qtpl:281
//line views/stuff.qtpl:282
qw422016.N().S(`</a></li>
<li><b>`)
//line views/stuff.qtpl:282
//line views/stuff.qtpl:283
qw422016.E().S(lc.Get("ui.about_admins"))
//line views/stuff.qtpl:282
//line views/stuff.qtpl:283
qw422016.N().S(`</b>`)
//line views/stuff.qtpl:282
//line views/stuff.qtpl:283
for i, username := range user.ListUsersWithGroup("admin") {
//line views/stuff.qtpl:283
//line views/stuff.qtpl:284
if i > 0 {
//line views/stuff.qtpl:283
//line views/stuff.qtpl:284
qw422016.N().S(`<span aria-hidden="true">, </span>
`)
//line views/stuff.qtpl:284
//line views/stuff.qtpl:285
}
//line views/stuff.qtpl:284
//line views/stuff.qtpl:285
qw422016.N().S(` <a href="/hypha/`)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.N().S(`/`)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.E().S(username)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.N().S(`">`)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.E().S(username)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.N().S(`</a>`)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
}
//line views/stuff.qtpl:285
//line views/stuff.qtpl:286
qw422016.N().S(`</li>
`)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:287
} else {
//line views/stuff.qtpl:286
//line views/stuff.qtpl:287
qw422016.N().S(` <li>`)
//line views/stuff.qtpl:287
//line views/stuff.qtpl:288
qw422016.E().S(lc.Get("ui.about_noauth"))
//line views/stuff.qtpl:287
//line views/stuff.qtpl:288
qw422016.N().S(`</li>
`)
//line views/stuff.qtpl:288
//line views/stuff.qtpl:289
}
//line views/stuff.qtpl:288
//line views/stuff.qtpl:289
qw422016.N().S(` </ul>
<p>`)
//line views/stuff.qtpl:290
//line views/stuff.qtpl:291
qw422016.N().S(lc.Get("ui.about_hyphae", &l18n.Replacements{"link": "<a href=\"/list\">/list</a>"}))
//line views/stuff.qtpl:290
//line views/stuff.qtpl:291
qw422016.N().S(`</p>
</section>
</main>
</div>
`)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
}
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
func WriteAboutHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
StreamAboutHTML(qw422016, lc)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
}
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
func AboutHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
WriteAboutHTML(qb422016, lc)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
return qs422016
//line views/stuff.qtpl:294
//line views/stuff.qtpl:295
}
//line views/stuff.qtpl:296
//line views/stuff.qtpl:297
func StreamCommonScripts(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:296
//line views/stuff.qtpl:297
qw422016.N().S(`
`)
//line views/stuff.qtpl:297
//line views/stuff.qtpl:298
for _, scriptPath := range cfg.CommonScripts {
//line views/stuff.qtpl:297
//line views/stuff.qtpl:298
qw422016.N().S(`
<script src="`)
//line views/stuff.qtpl:298
//line views/stuff.qtpl:299
qw422016.E().S(scriptPath)
//line views/stuff.qtpl:298
//line views/stuff.qtpl:299
qw422016.N().S(`"></script>
`)
//line views/stuff.qtpl:299
//line views/stuff.qtpl:300
}
//line views/stuff.qtpl:299
//line views/stuff.qtpl:300
qw422016.N().S(`
`)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
}
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
func WriteCommonScripts(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
StreamCommonScripts(qw422016)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
}
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
func CommonScripts() string {
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
WriteCommonScripts(qb422016)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
qs422016 := string(qb422016.B)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
return qs422016
//line views/stuff.qtpl:300
//line views/stuff.qtpl:301
}