Extension:Graph

The Graph extension allows a  tag to describe data visualizations (demo) in a JSON format that renders a Vega-based graph.

General info

 * Migrating to Vega 2.0
 * See demo page for many samples and usage tricks
 * TechTalk Video - a WMF tech talk discussing Graph extension, including a great demo of Lyra editor (also installed on labs).
 * You may also be interested in some of the Vega future capabilities (Keynote by Jeffrey Heer).
 * Guide - General recommendations on how to use graphs in Wiki.
 * Vega for devs - best place of all Vega resources
 * Interactive Tutorial

Known bugs & limitations

 * Total Graphs per page cannot be more than 64KB T100942.
 * Graph extension bugs
 * Graphoid service bugs

Internals
When parsing, the Graph extension expands all template parameters/expressions, and stores the complete graph definitions in the graph_specs page property, using graph hashes for IDs. This means you can easily locate a wiki's graphs with either Special:PageWithProps or [//www.mediawiki.org/w/api.php?action=query&list=pageswithprop&continue=&formatversion=2&pwppropname=graph_specs the action API].

The graph extension adds HTML to the page where graphs should go, a  containing an   tag. Sample: The &lt;img> tag's  attribute points to the, which provides a [//www.mediawiki.org/api/rest_v1/page/graph/png/Extension%3AGraph%2FDemo/1686336/d243aa924db2f82926e0f317217fcce591fe8cd4.png static image of the graph].

If the Graph extension is configured for interactivity, and if the client browser has JavaScript enabled and is not a legacy browser to which ResourceLoader does not ship JavaScript, then the client browser renders graphs on the fly. The Graph extension adds an  ResourceLoader JavaScript module to the page that includes the Vega library, and puts the JSON of graph definitions into a JavaScript   variable named. Once the client has loaded this module, the Vega JavaScript library populates each &lt;div> with an HTML canvas and draws the graph in it, replacing the static image. , Wikimedia wikis only enable this interactive rendering for edit preview.

You can configure the Graph extension to always use just the &lt;img> tag, and not add the Vega libraries or graph definition JSON. This mode will not work during editing, since  do not get updated until after the save. Once saved, the Graphoid service will be able to access the new graph definition via the action API.

Security Features
can be configured to disallow referencing untrusted data sources (e.g. Wikimedia only allows data from the Wikimedia sites). It can also send extra headers whenever accessing external data, e.g. Treat-as-Untrusted header that MediaWiki uses to prevent CSRF attacks.

License
Vega library is distributed under a modified BSD license acceptable under for us to use. This appears to be a copy of the BSD license, with some minor (acceptable) modifications. It's not a problem for us to use it, although ideally they would not make changes like this to the license. It's better if people do not make these changes to their license, to avoid confusion (like this) about whether the license is safe for open-source use.

wgGraphDataDomains
A list of domains (strings) that the vega code is allowed to pull data from, or false for no restrictions. An empty list disables any external data (inline only). Empty list by default.
 * NOTE: Setting this value to anything other than 'false' will also enable safe mode formula/filter evaluation

wgGraphUrlBlacklist
A list of regular expressions (JavaScript regex). All data URLs will be matched against this list, and the URL will be used only if it does not match any of the given regexes. false (default) to disable.

wgGraphIsTrusted
If false (default), passes Treat-as-Untrusted:1 header with all graph data requests

wgGraphImgServiceUrl
A format string to form a backend service request URL for the &lt;img> tag. For example: Would produce this URL: //graphoid.wikimedia.org/mediawiki.org/v1/png/Extension:Graph/0/be66c7016b9de3188ef6a585950f10dc83239837.png /{domain}/v1/png/{title}/{revid}/{hash}.png

Parameters will be supplied in this order: 1=server, 2=title, 3=revid, 4=graph-hash-id. All parameters will be escaped with rawurlencode. If the value is false (default), no urls will be generated

wgGraphImgServiceAlways
If true, and wgGraphImgServiceUrl is set, renders all graphs on the backend as static images if possible

Enabling Graph namespace
To store graph definitions as standalone pages in their own namespace, configure JsonConfig.

Graphoid service
Graphoid is a node.js  service that converts a graph definition into a static PNG image using the same Vega library code that runs in advanced browsers. The service is available on the Wikimedia cluster at graphoid.wikimedia.org.

You can install it yourself: The service URLs contain the domain of the page (for example mediawiki.org), service version (v1), the title of the page with the graph (PageTitle), revision ID of the page (12345, but could be 0 for current), and a hash ID of the graph itself (also used in HTML page to identify graph definition), for example: http://localhost:19000/mediawiki.org/v1/PageTitle/12345/a64b022a8fa5b7fc5e40a2c95cd0a114b2ae1174.png http://graphoid.wikimedia.org/mediawiki.org/v1/png/Extension:Graph/0/be66c7016b9de3188ef6a585950f10dc83239837.png You configure the Graph extension to use the Graphoid service in LocalSettings.php with a line like You can further configure the service via its config file.

VisualEditor module
Since summer 2015, the Graph extension also comes with a module (ext.graph.VisualEditor) which enables graph editing within VisualEditor.

This module was a result of a Google Summer of Code 2015 project. See here for more details.

This module allows users to see graphs within VisualEditor, as opposed to alien extension nodes. Furthermore, users can open up a dialog to edit a graph's type, data and padding. The UI also offers a way to edit a graph's raw JSON specification within VE without having to switch to the classic wikitext editor, in case more advanced users want to tweak settings not supported by the UI.

This first step serves as a stepping stone for many possibilities with graph editing within VisualEditor, and there are a lot of ways in which the module can be improved and expanded.