MediaWiki-Docker/Extension/VisualEditor

This page instructs you to install Extension:VisualEditor inside MediaWiki-Docker. All commands should be run in the directory where you installed MediaWiki. All mentioned files are also located there.

Install MediaWiki-Docker

edit

Follow the Quickstart instructions at MediaWiki-Docker page. Once MediaWiki is running and available at http://localhost:8080, then continue with instructions on this page.

Clone the repository and its dependencies

edit
git clone "https://gerrit.wikimedia.org/r/mediawiki/skins/Vector" skins/Vector
git clone "https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor" extensions/VisualEditor

cd extensions/VisualEditor
git submodule update --init

Modify LocalSettings.php

edit

If not already there, add this to the end of LocalSettings.php.

wfLoadSkin( 'Vector' );
wfLoadExtension( 'VisualEditor' );

$PARSOID_INSTALL_DIR = 'vendor/wikimedia/parsoid'; # bundled copy
#$PARSOID_INSTALL_DIR = '/my/path/to/git/checkout/of/Parsoid';

// For developers: ensure Parsoid is executed from $PARSOID_INSTALL_DIR,
// (not the version included in mediawiki-core by default)
// Must occur *before* wfLoadExtension()
if ( $PARSOID_INSTALL_DIR !== 'vendor/wikimedia/parsoid' ) {
    // AutoLoader::registerNamespaces was added in MW 1.39
    AutoLoader::registerNamespaces( [
        // Keep this in sync with the "autoload" clause in
        // $PARSOID_INSTALL_DIR/composer.json
        'Wikimedia\\Parsoid\\' => "$PARSOID_INSTALL_DIR/src",
    ] );
}

wfLoadExtension( 'Parsoid', "$PARSOID_INSTALL_DIR/extension.json" );

# Manually configure Parsoid
$wgVisualEditorParsoidAutoConfig = false;
$wgParsoidSettings = [
    'useSelser' => true,
    'rtTestMode' => false,
    'linting' => false,
];
$wgVirtualRestConfig['modules']['parsoid'] = [
    'url' => 'http://host.docker.internal:8080' . $wgScriptPath . '/rest.php',
];

Run maintenance scripts

edit
docker compose exec mediawiki php maintenance/run.php update.php

Troubleshooting

edit

If you receive one of the following errors in the browser, try the remedies prescribed below.

"Uncaught ExtensionDependencyError"

edit

If you receive an error message in the browser similar to the following

Fatal error: Uncaught ExtensionDependencyError: VisualEditor is not compatible with the current MediaWiki core (version 1.39.4), it requires: >= 1.41. in /var/www/html/w/includes/registration/ExtensionRegistry.php:432 Stack trace: #0 /var/www/html/w/includes/registration/ExtensionRegistry.php(276): ExtensionRegistry->readFromQueue() #1 /var/www/html/w/includes/Setup.php(278): ExtensionRegistry->loadFromQueue() #2 /var/www/html/w/includes/WebStart.php(86): require_once('...') #3 /var/www/html/w/index.php(44): require('...') #4 {main} thrown in /var/www/html/w/includes/registration/ExtensionRegistry.php on line 432

perform these steps to check out a compatible branch of the extension (in this example, REL1_39)

cd extensions/VisualEditor
git checkout -tb REL1_39 origin/REL1_39

and refresh the page to try again.

"Error contacting the Parsoid/RESTBase server"

edit

If you receive the following error when attempting to use VisualEditor for the first time

Error contacting the Parsoid/RESTBase server: (curl error: 7) Couldn't connect to server

you will most likely need to replace the Parsoid config setting 'url' => 'http://host.docker.internal:8080' in your LocalSettings.php with the internal IP of the container running the web server. For example:

$wgVirtualRestConfig['modules']['parsoid'] = [
    'url' => 'http://172.17.0.1:8080' . $wgScriptPath . '/rest.php',
];

If you have jq installed, this command will return the appropriate information:

docker network inspect mediawiki_default | jq '.[].Containers[] | select(.Name | test("web"))'
The network name mediawiki_default comes from the output of docker network inspect. (I think) it is inferred from the docker-compose.yml, and may be subject to change.

Example output:

{
  "Name": "mediawiki_mediawiki-web_1",
  "EndpointID": "29155dfdac8e4194d4100bdaf5ddbe91ee0e66f52842145985ce6aa6e894c563",
  "MacAddress": "e0:e0:e0:e0:e0:e0",
  "IPv4Address": "172.17.0.1/16",
  "IPv6Address": ""
}