JGirault has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/311709

Change subject: Introduce map sidebar, for displaying map details and external 
map services.
......................................................................

Introduce map sidebar, for displaying map details
and external map services.

Bug: T131907
Change-Id: I6224ffb2ef2444fc32d4c801c262f5fae14690f8
---
M extension.json
M i18n/en.json
M i18n/qqq.json
M includes/DataModuleLinks.php
A lib/wmui-base.less
M modules/dialog/dialog.js
A modules/dialog/sidebar.js
M styles/kartographer.less
A templates/dialog-sidebar-globalservices.mustache
A templates/dialog-sidebar-mapdetails.mustache
10 files changed, 476 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Kartographer 
refs/changes/09/311709/1

diff --git a/extension.json b/extension.json
index 969f7ec..e47c2b8 100644
--- a/extension.json
+++ b/extension.json
@@ -195,16 +195,34 @@
                        "dependencies": [
                                "oojs-ui-windows",
                                "mediawiki.router",
-                               "ext.kartographer.box"
+                               "ext.kartographer.box",
+                               "ext.kartographer.extlinks"
                        ],
                        "scripts": [
                                "modules/dialog/closefullscreen_control.js",
+                               "modules/dialog/sidebar.js",
                                "modules/dialog/dialog.js",
                                "modules/dialog/index.js"
                        ],
                        "messages": [
-                               "kartographer-fullscreen-close"
+                               "kartographer-fullscreen-close",
+                               "kartographer-linktype-map",
+                               "kartographer-linktype-satellite",
+                               "kartographer-linktype-topo",
+                               "kartographer-linktype-other",
+                               "kartographer-sidebar-coordinates",
+                               "kartographer-sidebar-description",
+                               "kartographer-sidebar-geo-uri",
+                               "kartographer-sidebar-globalservices",
+                               "kartographer-sidebar-latitude",
+                               "kartographer-sidebar-longitude",
+                               "kartographer-sidebar-mapdetails",
+                               "kartographer-sidebar-service"
                        ],
+                       "templates": {
+                               "dialog-sidebar-mapdetails.mustache": 
"templates/dialog-sidebar-mapdetails.mustache",
+                               "dialog-sidebar-globalservices.mustache": 
"templates/dialog-sidebar-globalservices.mustache"
+                       },
                        "targets": [
                                "mobile",
                                "desktop"
diff --git a/i18n/en.json b/i18n/en.json
index cf69512..fa73c40 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -71,6 +71,14 @@
        "kartographer-link-wikimapia": "Wikimapia",
        "kartographer-link-wikiminiatlas": "WikiMiniAtlas",
        "kartographer-link-yandex-maps": "Yandex.Maps",
+       "kartographer-sidebar-coordinates": "Coordinates",
+       "kartographer-sidebar-description": "View this location in one of the 
services listed below. You can filter the list by map type:",
+       "kartographer-sidebar-geo-uri": "Geo URI",
+       "kartographer-sidebar-globalservices": "Global services",
+       "kartographer-sidebar-latitude": "Latitude",
+       "kartographer-sidebar-longitude": "Longitude",
+       "kartographer-sidebar-mapdetails": "Map details",
+       "kartographer-sidebar-service": "Service",
        "leafletdraw-draw-handlers-circle-radius": "Radius",
        "leafletdraw-draw-handlers-circle-tooltip-start": "Click and drag to 
draw a circle",
        "leafletdraw-draw-handlers-marker-tooltip-start": "Click map to place a 
marker",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 7b01d9c..7916fe7 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -74,6 +74,14 @@
        "kartographer-link-wikimapia": "{{optional}}Full screen map info 
sidebar - external service name",
        "kartographer-link-wikiminiatlas": "{{optional}}Full screen map info 
sidebar - external service name",
        "kartographer-link-yandex-maps": "{{optional}}Full screen map info 
sidebar - external service name",
+       "kartographer-sidebar-coordinates": "Full screen map info sidebar - 
Coordinates label",
+       "kartographer-sidebar-description": "Full screen map info sidebar - 
Text to indicate the links are external map services, at the same location, and 
the dropdown is to filter the list by map type.",
+       "kartographer-sidebar-geo-uri": "Full screen map info sidebar - Geo URI 
label",
+       "kartographer-sidebar-globalservices": "Full screen map info sidebar -  
Global services heading label",
+       "kartographer-sidebar-latitude": "Full screen map info sidebar - 
Latitude label",
+       "kartographer-sidebar-longitude": "Full screen map info sidebar - 
Longitude label",
+       "kartographer-sidebar-mapdetails": "Full screen map info sidebar - Map 
details heading label",
+       "kartographer-sidebar-service": "Full screen map info sidebar - Service 
table column label",
        "leafletdraw-draw-handlers-circle-radius": "Label for circle 
radius\n{{Identical|Radius}}",
        "leafletdraw-draw-handlers-circle-tooltip-start": "Tooltip for how to 
start drawing a circle",
        "leafletdraw-draw-handlers-marker-tooltip-start": "Tooltip for how to 
place a marker",
diff --git a/includes/DataModuleLinks.php b/includes/DataModuleLinks.php
index ce7ba1f..c1b8c5c 100644
--- a/includes/DataModuleLinks.php
+++ b/includes/DataModuleLinks.php
@@ -46,7 +46,8 @@
                        $service->name = $context->msg( 'kartographer-link-' . 
$service->name )->plain();
 
                        foreach ( $service->links as &$link ) {
-                               $link->type = $context->msg( 
'kartographer-linktype-' . $link->type )->plain();
+                               $type = $link->type;
+                               $service->$type = $link->url;
                        }
                }
 
diff --git a/lib/wmui-base.less b/lib/wmui-base.less
new file mode 100755
index 0000000..bcdf5da
--- /dev/null
+++ b/lib/wmui-base.less
@@ -0,0 +1,101 @@
+/**
+ * WikimediaUI base v0.5.0
+ * Wikimedia Foundation user interface base variables
+ */
+
+/* Colors */
+// WMUI color palette
+@wmui-color-base0:           #000;
+@wmui-color-base10:          #222;
+@wmui-color-base20:          #555a5f;
+@wmui-color-base30:          #7d8389;
+@wmui-color-base50:          #a2a9b1;
+@wmui-color-base60:          #c8ccd1;
+@wmui-color-base80:          #eaecf0;
+@wmui-color-base100:         #fff;
+
+@wmui-color-acct50:          #36c;
+
+@wmui-color-alrt50:          #c33;
+
+// Background Colors
+@background-color-base:      @wmui-color-base100;
+@background-color-code:      #f9f9f9;
+// Foreground Colors
+@color-base:                 @wmui-color-base10;
+@color-contrast:             @wmui-color-base100;
+// @color-link:              #222;
+@color-base-disabled:        @wmui-color-base30;
+// Primary Color and states
+@color-primary:              @wmui-color-acct50;
+@color-primary-hover:        #447ff5; // equals HSB 220°/72%/96%
+@color-primary-active:       #2a4b8d; // equals HSB 220°/70%/55%
+@color-primary-focus:        @color-primary;
+// Secondary Color and states (links only)
+@color-secondary:            #195a59;
+@color-secondary-hover:      #1c6665;
+@color-secondary-active:     #134645;
+@color-secondary-focus:      @color-secondary;
+// Destructive Color and states
+@color-destructive:          @wmui-color-alrt50;
+@color-destructive-hover:    #e53939; // equals HSB 0°/75%/90%
+@color-destructive-active:   #873636;
+@color-destructive-focus:    @color-destructive;
+// Colors RGBA including hex fallback on `#fff` for IE 6/7/8
+@color-highlighted:          rgba( 255, 182, 13, 0.4 );
+@color-highlighted-fallback: #ffe29e;
+// Opacity
+@opacity-base:               1;
+@opacity-base-disabled:      0.2;
+
+
+/* Positioning */
+// Z-Index
+@z-index-base:               0;
+
+
+/* Box Model properties */
+/* Max Widths */
+@max-width-button:           28.75em; // equivalent to `460px` at `16px` base, 
see T95367
+@max-width-input-inline:     100%;
+// Border
+@border-base:                1px solid @border-color-base;
+// Border Colors
+@border-color-base:          #222;
+@border-color-base-hover:    @color-primary;
+@border-color-base-disabled: @color-base-disabled;
+@border-color-heading:       #ccc;
+// Border Radius
+@border-radius-base:         2px;
+// Box Shadows
+@box-shadow-dialog:          0 0.15em 0 0 rgba( 0, 0, 0, 0.15 );
+@box-shadow-menu:            @box-shadow-dialog;
+
+
+/* Typography incl. print properties */
+// Font Families
+@font-family-base:           @font-family-sans;
+@font-family-heading-main:   @font-family-serif;
+@font-family-sans:           "Lato", "Helvetica Neue", "Helvetica", "Nimbus 
Sans L", "Arial", "Liberation Sans", sans-serif;
+@font-family-serif:          "Charter", "Linux Libertine", "Georgia", "Times", 
serif;
+// Line Heights
+@line-height-base:           1.6;
+@line-height-heading:        1.25;
+@text-decoration-link-hover: none;
+// Text Shadows
+@text-shadow-base:           0 1px 1px @color-contrast; // "coined" effect
+@text-shadow-base-disabled:  @text-shadow-base;
+
+
+/* Other Properties */
+// Cursors
+@cursor-base-disabled:       default;
+
+
+/* Animation & Transition */
+// Transitions
+@transition-base:            @transition-duration-base;
+@transition-long:            @transition-duration-long;
+// Transitions > Durations
+@transition-duration-base:   100ms;
+@transition-duration-long:   250ms;
diff --git a/modules/dialog/dialog.js b/modules/dialog/dialog.js
index 78e07a9..459fdd7 100644
--- a/modules/dialog/dialog.js
+++ b/modules/dialog/dialog.js
@@ -8,7 +8,7 @@
  * @class Kartographer.Dialog.DialogClass
  * @extends OO.ui.Dialog
  */
-module.Dialog = ( function ( $, mw, CloseFullScreenControl, kartobox, router ) 
{
+module.Dialog = ( function ( $, mw, SideBar, CloseFullScreenControl, kartobox, 
router ) {
 
        /**
         * @constructor
@@ -30,10 +30,40 @@
        /* Methods */
 
        MapDialog.prototype.initialize = function () {
+               var dialog = this;
+
                // Parent method
                MapDialog.super.prototype.initialize.apply( this, arguments );
 
+               mw.loader.using( 'oojs-ui-widgets' ).done( function () {
+                       $( function () {
+
+                               // Create footer toggle button
+                               var button = dialog.$mapDetailsButton = new 
OO.ui.ToggleButtonWidget( {
+                                               label: 'More details',
+                                               icon: 'info',
+                                               iconTitle: 'Details'
+                                       } );
+
+                               // Add the button to the footer
+                               dialog.$foot
+                                       .addClass( 
'mw-kartographer-mapDialog-foot' )
+                                       .append( button.$element );
+
+                               button.on( 'change', dialog.toggleSideBar, 
null, dialog );
+                       } );
+               } );
                this.map = null;
+               this.sideBar = new SideBar( { dialog: this } );
+       };
+
+       MapDialog.prototype.toggleSideBar = function ( open ) {
+               open = ( typeof open === 'undefined' ) ? 
!this.$mapDetailsButton.value : open;
+
+               if ( this.$mapDetailsButton.value !== open ) {
+                       this.$mapDetailsButton.setValue( open );
+               }
+               this.sideBar.toggle( open );
        };
 
        MapDialog.prototype.getActionProcess = function ( action ) {
@@ -127,6 +157,7 @@
                                        this.map.remove();
                                        this.map = null;
                                }
+                               this.$body.empty();
                        }, this );
        };
 
@@ -137,6 +168,7 @@
 } )(
        jQuery,
        mediaWiki,
+       module.SideBar,
        module.CloseFullScreenControl,
        require( 'ext.kartographer.box' ),
        require( 'mediawiki.router' )
diff --git a/modules/dialog/sidebar.js b/modules/dialog/sidebar.js
new file mode 100644
index 0000000..85ea724
--- /dev/null
+++ b/modules/dialog/sidebar.js
@@ -0,0 +1,171 @@
+/* globals module */
+/**
+ * Side pane for displaying map details and other services.
+ *
+ * @class Kartographer.Dialog.SideBarClass
+ * @extends OO.ui.Dialog
+ */
+module.SideBar = ( function ( $, mw ) {
+
+       /**
+        * @constructor
+        * @type {Kartographer.Dialog.SideBarClass}
+        */
+       var SideBar = function ( options ) {
+                       this.$el = null;
+                       this.dialog = options.dialog;
+               },
+               MODULE_NAME = 'ext.kartographer.dialog';
+
+       SideBar.prototype.renderMapDetails = function ( data ) {
+               return mw.template.get( MODULE_NAME, 
'dialog-sidebar-mapdetails.mustache' ).render(
+                       $.extend( {
+                               LBL_COORDINATES: mw.msg( 
'kartographer-sidebar-coordinates' ),
+                               LBL_GEO_URI: mw.msg( 
'kartographer-sidebar-geo-uri' ),
+                               LBL_LATITUDE: mw.msg( 
'kartographer-sidebar-latitude' ),
+                               LBL_LONGITUDE: mw.msg( 
'kartographer-sidebar-longitude' ),
+                               LBL_MAP_DETAILS: mw.msg( 
'kartographer-sidebar-mapdetails' ),
+                               SERVICE_OSM: mw.msg( 
'kartographer-link-open-street-map' ),
+                               SERVICE_GOOGLE_MAPS: mw.msg( 
'kartographer-link-google-maps' )
+                       }, data )
+               );
+       };
+
+       SideBar.prototype.renderGlobalServices = function ( data ) {
+               var services = mw.config.get( 'wgKartographerExternalLinks' 
).services,
+                       pane = this,
+                       filtered = [];
+
+               $.each( services, function ( key, service ) {
+                       if ( !service[ data.selectedType ] ) {
+                               return;
+                       }
+
+                       filtered.push( {
+                               name: service.name,
+                               featured: !!service.featured,
+                               linkLabel: mw.msg( 'kartographer-linktype-' + 
data.selectedType ),
+                               link: pane.formatLink( service[ 
data.selectedType ], data )
+                       } );
+               } );
+
+               return mw.template.get( MODULE_NAME, 
'dialog-sidebar-globalservices.mustache' ).render(
+                       $.extend( {
+                               services: filtered,
+                               LBL_GLOBAL_SERVICES: mw.msg( 
'kartographer-sidebar-globalservices' ),
+                               LBL_SERVICE: mw.msg( 
'kartographer-sidebar-service' )
+                       }, data )
+               );
+       };
+
+       SideBar.prototype.formatLink = function ( url, data ) {
+               var link = url.replace( new RegExp( '{latdegdec}', 'g' ), 
data.latitude );
+               link = link.replace( new RegExp( '{londegdec}', 'g' ), 
data.longitude );
+               link = link.replace( new RegExp( '{osmzoom}', 'g' ), data.zoom 
);
+               link = link.replace( new RegExp( '{zoom}', 'g' ), data.zoom ); 
// ??
+               link = link.replace( new RegExp( '{titlee}', 'g' ), 
mw.config.get( 'wgTitle' ) );
+               link = link.replace( new RegExp( '{pagenamee}', 'g' ), 
mw.config.get( 'wgPageName' ) );
+               // link = link.replace( new RegExp( '{fov}', 'g' ), null );  ???
+               // link = link.replace( new RegExp( '{span}', 'g' ), null );  
???
+               link = link.replace( new RegExp( '{language}', 'g' ), 
mw.config.get( 'wgContentLanguage' ) || mw.config.get( 'wgUserLanguage' ) );
+               return link;
+       };
+
+       SideBar.prototype.createFilterDropdown = function () {
+               var dropdown = new OO.ui.DropdownWidget( {
+                       label: 'Select a map type',
+                       menu: {
+                               items: [
+                                       new OO.ui.MenuOptionWidget( {
+                                               data: 'map',
+                                               label: mw.msg( 
'kartographer-linktype-map' ),
+                                               title: mw.msg( 
'kartographer-linktype-map' )
+                                       } ),
+                                       new OO.ui.MenuOptionWidget( {
+                                               data: 'satellite',
+                                               label: mw.msg( 
'kartographer-linktype-satellite' ),
+                                               title: mw.msg( 
'kartographer-linktype-satellite' )
+                                       } ),
+                                       new OO.ui.MenuOptionWidget( {
+                                               data: 'topo',
+                                               label: mw.msg( 
'kartographer-linktype-topo' ),
+                                               title: mw.msg( 
'kartographer-linktype-topo' )
+                                       } ),
+                                       new OO.ui.MenuOptionWidget( {
+                                               data: 'other',
+                                               label: mw.msg( 
'kartographer-linktype-other' ),
+                                               title: mw.msg( 
'kartographer-linktype-other' )
+                                       } )
+                               ]
+                       }
+               } );
+               return dropdown;
+       };
+
+       SideBar.prototype.toggle = function ( open ) {
+
+               var pane = this,
+                       $body = pane.dialog.$body,
+                       $sideBar = $( '<div 
class="mw-kartographer-mapDialog-side-pane">' ),
+                       // map position
+                       position = pane.dialog.map.getMapPosition(),
+                       scaled = pane.dialog.map.getScaleLatLng( 
position.center.lat, position.center.lng ),
+                       // widgets
+                       closeButton,
+                       dropdown,
+                       // containers
+                       $mapDetailsContainer = $( '<div>' ).addClass( 
'mw-kartographer-mapdetails' ),
+                       $filterContainer = $( '<div>' ).addClass( 
'mw-kartographer-filterservices' ),
+                       $descriptionContainer = $( '<div>' ).addClass( 
'mw-kartographer-description' ),
+                       $servicesContainer = $( '<div>' ).addClass( 
'mw-kartographer-globalservices' );
+
+               if ( this.$el ) {
+                       this.$el.remove();
+                       this.$el = null;
+               }
+               if ( !open ) {
+                       return;
+               }
+
+               // Filter dropdown
+               dropdown = pane.createFilterDropdown();
+               dropdown.getMenu().on( 'select', function ( item ) {
+                       $servicesContainer.html( pane.renderGlobalServices( {
+                               latitude: scaled[ 0 ],
+                               longitude: scaled[ 1 ],
+                               zoom: position.zoom,
+                               selectedType: item.getData()
+                       } ) );
+               } );
+               dropdown.getMenu().selectItemByData( 'map' );
+
+               // Add close button to side pane
+               closeButton = new OO.ui.ButtonWidget( {
+                       icon: 'close',
+                       title: mw.msg( 'kartographer-fullscreen-close' ),
+                       framed: false,
+                       classes: [ 'mw-kartographer-mapDialog-closeButton' ]
+               } ).connect( this, { click: pane.dialog.toggleSideBar.bind( 
pane.dialog, false ) } );
+
+               // Render the side pane
+               $sideBar.empty().append(
+                       closeButton.$element,
+                       $mapDetailsContainer.append( pane.renderMapDetails( {
+                               latitude: scaled[ 0 ],
+                               longitude: scaled[ 1 ],
+                               zoom: position.zoom
+                       } ) ),
+                       $descriptionContainer.append( mw.msg( 
'kartographer-sidebar-description' ) ),
+                       $filterContainer.append( dropdown.$element ),
+                       $servicesContainer
+               );
+
+               this.$el = $sideBar;
+               $body.append( $sideBar );
+       };
+
+       return SideBar;
+} )(
+       jQuery,
+       mediaWiki
+);
diff --git a/styles/kartographer.less b/styles/kartographer.less
index 43e8ca0..7a85195 100644
--- a/styles/kartographer.less
+++ b/styles/kartographer.less
@@ -1,7 +1,7 @@
 .mw-kartographer-mapDialog-map {
        position: absolute;
        top: 0;
-       bottom: 0;
+       bottom: 4.75em;
        left: 0;
        right: 0;
        z-index: 1;
@@ -97,3 +97,95 @@
 .mw-kartographer-container.mw-kartographer-full {
        width: 100%;
 }
+
+/* Temporary import from wmui-base.less */
+/* https://phabricator.wikimedia.org/diffusion/WMUI/ */
+
+@wmui-color-base60:          #c8ccd1;
+@wmui-color-base80:          #eaecf0;
+@wmui-color-base100:         #fff;
+@background-color-base:      @wmui-color-base100;
+@border-color-base:          #222;
+@border-base:                1px solid @border-color-base;
+
+.mw-kartographer-mapDialog-foot {
+       text-align: right;
+       padding: 1em;
+       height: 4.5em;
+       background-color: @background-color-base;
+       border-top: @border-base;
+}
+
+.mw-kartographer-mapDialog-side-pane {
+       position: absolute;
+       right: 0;
+       top: 0;
+       bottom: 4.5em;
+       z-index: 2;
+       width: 320px;
+       box-sizing: border-box;
+       background-color: @background-color-base;
+       padding: 3em 2em 1em;
+       overflow-y: scroll;
+
+       table {
+               width: 100%;
+               border-collapse: collapse;
+
+               th,
+               td {
+                       text-align: center;
+                       padding: 0.5em 1em;
+                       font-size: 90%;
+               }
+
+               tr {
+                       background-color: @wmui-color-base80;
+               }
+
+               tr:not(:first-child) {
+                       th {
+                               font-weight: normal;
+                       }
+               }
+
+               tr th:first-child {
+                       width: 70%;
+                       text-align: left;
+               }
+
+               tr:first-child {
+                       background-color: @wmui-color-base60;
+               }
+
+               tr:nth-child(even) {
+                       background-color: @wmui-color-base100;
+               }
+       }
+
+       .mw-kartographer-mapDialog-closeButton {
+               position: absolute;
+               top: 10px;
+               right: 10px;
+               margin-right: 0;
+
+               .oo-ui-buttonElement-button {
+                       border: 0;
+               }
+       }
+}
+
+.mw-kartographer-description,
+.mw-kartographer-mapdetails {
+       margin-bottom: 1.5em;
+}
+
+.mw-kartographer-filterservices {
+       margin-bottom: 1em;
+}
+
+.mw-kartographer-mapDialog-side-pane .mw-kartographer-globalservices 
tr.featured {
+       background-color: #fef6e7;
+       border-top: 1px solid #fc3;
+       border-bottom: 1px solid #fc3;
+}
diff --git a/templates/dialog-sidebar-globalservices.mustache 
b/templates/dialog-sidebar-globalservices.mustache
new file mode 100644
index 0000000..796e4a7
--- /dev/null
+++ b/templates/dialog-sidebar-globalservices.mustache
@@ -0,0 +1,19 @@
+<h2>{{LBL_GLOBAL_SERVICES}}</h2>
+
+<table>
+    <tbody>
+    <tr>
+        <th>{{LBL_SERVICE}}</th>
+        <td></td>
+    </tr>
+    {{#services}}
+    <tr{{#featured}} class="featured"{{/featured}}>
+        <th>{{name}}
+        </th>
+        <td>
+            <a rel="nofollow" class="external free" 
href="{{link}}">{{linkLabel}}</a>
+        </td>
+    </tr>
+    {{/services}}
+    </tbody>
+</table>
\ No newline at end of file
diff --git a/templates/dialog-sidebar-mapdetails.mustache 
b/templates/dialog-sidebar-mapdetails.mustache
new file mode 100644
index 0000000..e03c071
--- /dev/null
+++ b/templates/dialog-sidebar-mapdetails.mustache
@@ -0,0 +1,21 @@
+<h2>{{LBL_MAP_DETAILS}}</h2>
+
+<table>
+    <tbody>
+    <tr>
+        <th>{{LBL_COORDINATES}}</th>
+        <td>
+                <span class="geo">
+                    <span class="latitude" 
title="{{LBL_LATITUDE}}">{{latitude}}</span>,
+                    <span class="longitude" 
title="{{LBL_LONGITUDE}}">{{longitude}}</span>
+                </span>
+        </td>
+    </tr>
+    <tr>
+        <th>{{LBL_GEO_URI}}</th>
+        <td>
+            <a rel="nofollow" class="external free" 
href="geo:{{latitude}},{{longitude}}">geo:{{latitude}},{{longitude}}</a>
+        </td>
+    </tr>
+    </tbody>
+</table>

-- 
To view, visit https://gerrit.wikimedia.org/r/311709
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6224ffb2ef2444fc32d4c801c262f5fae14690f8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Kartographer
Gerrit-Branch: master
Gerrit-Owner: JGirault <julien.inbox.w...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to