secluded/content/posts/documenting-with-mediawiki.md

226 lines
10 KiB
Markdown

---
title: "Documenting With MediaWiki"
description: "Setting up MediaWiki to efficiently write quality documentation"
cover: /assets/pngs/mediawiki.png
date: 2020-06-04T12:23:34-04:00
categories:
- Technology
tags:
- MediaWiki
- Documentation
- Writing
- Efficiency
- 100 Days To Offload
toc: true
---
Much to my chagrin, I've hardly posted anything at all the past couple
of weeks. This is partly due to university summer classes starting and
partly due to me putting some work into [NixNet's
documentation.](https://docs.nixnet.services) After listening to
[Episode 4 of 2.5 Admins,](https://2.5admins.com/2-5-admins-04/) I
decided to change some things up with my infrastructure planning and,
instead of automating all the things, document it first. Only after
writing extensive documentation will I look into automating *portions*
my setup, like hardening a server directly following installation. To
that end, I've decided to use
[MediaWiki.](https://www.mediawiki.org/wiki/MediaWiki)
After [downloading](https://www.mediawiki.org/wiki/Download) and
[installing](https://www.mediawiki.org/wiki/Manual:Installation_guide)
MediaWiki, a very straightforward process,[^1] the next step is
configuring it. There is of course [a
guide](https://www.mediawiki.org/wiki/Manual:System_administration) but
I think it can be useful to see someone else's configuration to get
ideas from as well, especially considering how many extensions there
are. I won't go through *all* of the settings, just the maybe less
obvious ones.
## URLs
The first thing in `LocalSettings.php` is `$wgScriptPath`. Different wikis take vastly different approaches for this. Some fill that variable with `"/w"` (default), some with `"/view"`, and some with something entirely different. [Wikipedia](https://wikipedia.org/wiki/MediaWiki) and all of its children use `"/wiki"`. While well and good, the default configuration will have your URLs appearing as `example.com/wiki/index.php?title=<page>` and this is bad practise for SEO; if you want your pages easily discoverable, the URLs need to be a bit shorter. The easiest way I've found to do this is add all of six lines to my NGINX config and set `$wgScriptPath` to `""` (an empty string).
```text
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
```
The snippet above tells NGINX to rewrite all of your site's base URLs
and remove `index.php?title=` from them. This is a similar approach to
what [Mozilla](https://wiki.mozilla.org/Main_Page) has done. The result
is cleaner URLs that comply with SEO best practises and a setup that
avoids [moving MediaWiki to the site's
root.](https://www.mediawiki.org/wiki/Manual:Wiki_in_site_root_directory)
## Mobile view
I see a *lot* of MediaWiki instances without a good mobile version and,
other than keeping the number of extensions down, I don't really
understand why. Setting it up is incredibly easy and gives everyone a
*much* better experience. The [Minerva
Neue](https://www.mediawiki.org/wiki/Special:MyLanguage/Skin:Minerva_Neue)
skin is designed specifically for use on mobile devices and is also much
more aggressive about optimisation. Though editing is a terrible
experience, it also looks great on desktop. The
[MobileFrontend](https://www.mediawiki.org/wiki/Extension:MobileFrontend)
extension is used to detect the reader's device and serve them either
the configured desktop skin or Minerva Neue. You *could* serve a
different skin on mobile but I've found that Minerva Neue looks the best
by far.
To set them up, you'll need to download [the
skin](https://www.mediawiki.org/wiki/Special:SkinDistributor/MinervaNeue)
and [the
extension.](https://www.mediawiki.org/wiki/Special:ExtensionDistributor/MobileFrontend)
From there, you'll need to add a few lines to your config file. On a
side note, I love how dynamic MediaWiki can be, especially with
downloads; providing a copy/paste extraction command that doesn't use
wildcards and puts it in the correct directory is *awesome*.
``` php
# I recommend putting this with the rest of your extensions
wfLoadExtension( 'MobileFrontend' );
# These can go wherever you want but together is better
$wgMFDefaultSkinClass = 'SkinMinerva';
$wgMFAutodetectMobileView = true;
```
With the skin and extension in place and those lines in your config,
save and reload and there should be a link at the bottom of your wiki
called `Mobile view`. Click it and you'll see Minerva! On a phone,
MobileFrontend will automatically serve it but you can force your
default theme by clicking `Desktop view` in the same location.
![Screenshot of the mobile versions of my MediaWiki instance. The left
uses Minerva Neue and the right uses Vector. The left has buttons and
icons that are much larger and easier to tap making for better
accessibility. Though the text is readable, the touch targets are much
too small navigation is hell](/assets/pngs/mediawiki-skins.png)
## Discussion pages
The default discussion page for MediaWiki works but, unless you're
already used to it, it can be quite odd for new people. That's where the
[StructuredDiscussions](https://www.mediawiki.org/wiki/Structured_Discussions)
extension comes in. Here's a comparison of before and after enabling it.
![side-by-side screenshot of my wiki before and after enabling the
extension. the left really is just the default content editor. it's like
giving someone a text editor on a server and asking them to have a
conversation with someone else by editing the same file and saving it to
see replies. the right side is with the extension enabled and gives
buttons to browse by topic and a field to create a new topic. it's very
similar to github's issue tracker, for example, but without the ability
to sort by tags](/assets/pngs/talk-before-after.png)
As I said, the left works but most people wouldn't know what to do when
given the default MediaWiki editor and it raises the barrier for entry.
The right is *much* more user-friendly and works exactly how one would
expect. StructuredDiscussions does have a few dependencies but they're
easy to add. [Echo](https://www.mediawiki.org/wiki/Extension:Echo) is
for notifications and the others are included by default. After
[installing
it,](https://www.mediawiki.org/wiki/Special:ExtensionDistributor/Echo)
and
[StructuredDiscussions,](https://www.mediawiki.org/wiki/Special:ExtensionDistributor/Flow)
add the following lines to your `LocalSettings.php`.
``` php
# With the rest of your extensions
wfLoadExtension( 'Echo' );
wfLoadExtension( 'Flow' );
```
Running the following commands is necessary because MediaWiki's database
needs modification to support the extension. General talk pages are
`--ns=1` and `User:Talk` pages are `--ns=3`. If you only want Structured
Discussions enabled for one of them, only run that one. I personally
recommend doing it for all.
``` text
php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=revision
php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=archive
php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=page
php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=revision
php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=archive
php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=page
```
After that, add these to actually enable the extension. To temporarily
disable it, you can comment them out but I don't know how that will
affect talk pages that already exist.
``` php
# Flow (discussions) configuration
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';
```
## Subpages
One of the features I'll be making heavy use of for my [Privacy
Policies](https://docs.nixnet.services/Category:Privacy_policies) and
[Terms of
Service](https://docs.nixnet.services/Category:Terms_of_Service) pages
is [Subpages.](https://www.mediawiki.org/wiki/Help:Subpages) This allows
you to create pages entitled `Parent/Child` and the child automatically
links back to the parent at the top. This can be seen in
[Mozilla](https://wiki.mozilla.org/Apps/Security/Other) and [Arch
Linux's](https://wiki.archlinux.org/index.php/Firefox/Privacy) wikis
right under the header and [in mine as
well.](https://docs.nixnet.services/DNS/Privacy) Enabling it is quite
simple; just add the following line to your config.
``` php
## Enable subpages for all namespaces
$wgNamespacesWithSubpages[NS_MAIN] = true;
```
## Syntax highlighting
The final configuration change I've made (so far) has been to enable
syntax highlighting in the default editor with
[CodeMirror.](https://www.mediawiki.org/wiki/Extension:CodeMirror) After
[installing
it,](https://www.mediawiki.org/wiki/Special:ExtensionDistributor/CodeMirror)
add these lines to your config and you're done!
``` php
# Place with the other extensions as always
wfLoadExtension( 'CodeMirror' );
# Enables it by default but allows users to disable it
$wgDefaultUserOptions['usecodemirror'] = 1;
```
![screenshot of the mediawiki editor. headers are larger, code blocks
are highlighted, links blue with link text black so it's easy to pick
out, etc. In all, it's a much nicer
experience.](/assets/pngs/mediawiki-highlight.png)
## Editing in Vim
The final tip I have is that you can edit pretty much *any* MediaWiki
instance in Vim, including Wikipedia itself, with [a simple
plugin.](https://github.com/aquach/vim-mediawiki-editor) The only
drawback I've found is that, unless you store your password in your
config, you'll have to enter it every time you close and reopen Vim. You
can also give Vim [Wikitext syntax
highlighting](https://en.wikipedia.org/wiki/Help:Text_editor_support#Vim)
for creating MediaWiki pages when offline. A few days ago, my wiki was
completely offline while taking a disk image backup but I still wrote
the majority of the [libvirt](https://docs.nixnet.services/Libvirt) and
[Debian](https://docs.nixnet.services/Debian) pages while I waited and
the highlighting was really nice.
---
This was posted as part of
[#100DaysToOffload,](https://100daystooffload.com/) an [awesome
idea](https://fosstodon.org/@kev/104053977554016690) from [Kev
Quirk.](https://kevq.uk/) If you want to participate, just write
something every day for 100 days and post a link on social media with
the hashtag!
[^1]: If you're having issues, feel free to contact me and I'll help
where I can.