Yurik has uploaded a new change for review.

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

Change subject: (WIP) "shapred" external data support
......................................................................

(WIP) "shapred" external data support

Change-Id: I933fdb5de26e905e6e7fa6e3dbfd0293c9267b53
---
M i18n/en.json
M i18n/qqq.json
M includes/SimpleStyleParser.php
M schemas/geojson.json
4 files changed, 79 insertions(+), 42 deletions(-)


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

diff --git a/i18n/en.json b/i18n/en.json
index 04d61d9..9d22bf3 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -28,6 +28,7 @@
        "kartographer-error-bad_data": "The JSON content is not valid 
GeoJSON+simplestyle",
        "kartographer-error-latlon": "Either both \"latitude\" and 
\"longitude\" parameters should be supplied or neither of them",
        "kartographer-error-service-name": "Invalid cartographic service 
\"$1\"",
+       "kartographer-error-title": "Title \"$1\" is not a valid map data page",
        "kartographer-tracking-category": 
"{{#switch:{{NAMESPACE}}|{{ns:File}}=Files|#default=Pages}} with maps",
        "kartographer-tracking-category-desc": "The page includes a map",
        "kartographer-coord-combined": "$1 $2",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index eb386fd..c55c2b3 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -32,6 +32,7 @@
        "kartographer-error-bad_data": "This error is shown if the content of 
the tag is syntactically valid JSON however it does not adhere to GeoJSON and 
simplestyle specifications",
        "kartographer-error-latlon": "Error shown by <maplink> or 
<mapframe> when certain parameters are incorrect",
        "kartographer-error-service-name": "Error shown by <maplink> or 
<mapframe>. Parameters:\n* $1 - service name.",
+       "kartographer-error-title": "Error shown by <maplink> or 
<mapframe>. Parameters:\n* $1 - page title.",
        "kartographer-tracking-category": "Name of the tracking category",
        "kartographer-tracking-category-desc": "Description on 
[[Special:TrackingCategories]] for the 
{{msg-mw|kartographer-tracking-category}} tracking category.",
        "kartographer-coord-combined": "{{optional}}\nJoins two parts of 
geogrpahical coordinates. $1 and $2 are latitude and longitude, respectively.",
diff --git a/includes/SimpleStyleParser.php b/includes/SimpleStyleParser.php
index d773ef2..bc5a8b0 100644
--- a/includes/SimpleStyleParser.php
+++ b/includes/SimpleStyleParser.php
@@ -3,6 +3,8 @@
 namespace Kartographer;
 
 use FormatJson;
+use JsonConfig\JCMapDataContent;
+use JsonConfig\JCSingleton;
 use JsonSchema\Validator;
 use MediaWiki\MediaWikiServices;
 use Parser;
@@ -15,8 +17,6 @@
  */
 class SimpleStyleParser {
        private static $parsedProps = [ 'title', 'description' ];
-
-       private static $services = [ 'geoshape', 'geoline', 'geomask' ];
 
        /** @var Parser */
        private $parser;
@@ -204,38 +204,59 @@
         * @return Status
         */
        private function normalizeExternalData( &$object ) {
-               if ( !in_array( $object->service, self::$services ) ) {
-                       return Status::newFatal( 
'kartographer-error-service-name', $object->service );
-               }
 
                $ret = (object)[
                        'type' => 'ExternalData',
                        'service' => $object->service,
                ];
 
-               $query = [
-                       'getgeojson' => 1
-               ];
+               switch ( $object->service ) {
+                       default:
+                               return Status::newFatal( 
'kartographer-error-service-name', $object->service );
 
-               if ( property_exists( $object, 'ids' ) ) {
-                       $query['ids'] = is_array( $object->ids )
-                               ? join( ',', $object->ids )
-                               : preg_replace( '/\s*,\s*/', ',', $object->ids 
);
-               }
-               if ( property_exists( $object, 'query' ) ) {
-                       $query['query'] = $object->query;
-               }
+                       case 'geoshape':
+                       case 'geoline':
+                       case 'geomask':
+                               $query = [ 'getgeojson' => 1 ];
+                               if ( property_exists( $object, 'ids' ) ) {
+                                       $query['ids'] =
+                                               is_array( $object->ids ) ? 
join( ',', $object->ids )
+                                                       : preg_replace( 
'/\s*,\s*/', ',', $object->ids );
+                               }
+                               if ( property_exists( $object, 'query' ) ) {
+                                       $query['query'] = $object->query;
+                               }
+                               // 'geomask' service is the same as inverted 
geoshape service
+                               // Kartotherian does not support it, request it 
as geoshape
+                               $service = $object->service === 'geomask' ? 
'geoshape' : $object->service;
 
-               // 'geomask' service is the same as inverted geoshape service
-               // Kartotherian does not support it, request it as geoshape
-               $service = $object->service === 'geomask' ? 'geoshape' : 
$object->service;
-               $ret->url = "{$this->mapService}/{$service}?" . wfArrayToCgi( 
$query );
-               if ( property_exists( $object, 'properties' ) ) {
-                       $ret->properties = $object->properties;
+                               $ret->url = "{$this->mapService}/{$service}?" . 
wfArrayToCgi( $query );
+                               if ( property_exists( $object, 'properties' ) ) 
{
+                                       $ret->properties = $object->properties;
+                               }
+                               break;
+
+                       case 'shared':
+                               if ( !class_exists( 'JsonConfig\\JCSingleton' ) 
) {
+                                       return Status::newFatal( 
'kartographer-error-service-name', $object->service );
+                               }
+                               $jct = JCSingleton::parseTitle( $object->title, 
NS_DATA );
+                               if ( !$jct || JCSingleton::getContentClass( 
$jct->getConfig()->model ) !==
+                                                         
JCMapDataContent::class
+                               ) {
+                                       return Status::newFatal( 
'kartographer-error-title', $object->title );
+                               }
+                               $query = [
+                                       'format' => 'json',
+                                       'formatversion' => '2',
+                                       'action' => 'jsondata',
+                                       'title' => $jct->getText(),
+                               ];
+                               $ret->url = wfExpandUrl( "/w/api.php?" . 
wfArrayToCgi( $query ) );
+                               break;
                }
 
                $object = $ret;
-
                return Status::newGood();
        }
 
diff --git a/schemas/geojson.json b/schemas/geojson.json
index e750152..64d4bc3 100644
--- a/schemas/geojson.json
+++ b/schemas/geojson.json
@@ -157,30 +157,44 @@
                        "description": "WMF extension - reference to external 
geometries",
                        "required": [ "type", "service" ],
 
-                       "anyOf": [
-                               { "required": [ "query" ] },
-                               { "required": [ "ids" ] }
+                       "oneOf": [
+                               {
+                                       "required": [ "title" ],
+                                       "properties": {
+                                               "service": { "enum": [ "shared" 
] },
+                                               "title": { "type": "string" }
+                                       }
+                               },
+                               {
+                                       "anyOf": [
+                                               { "required": [ "query" ] },
+                                               { "required": [ "ids" ] }
+                                       ],
+                                       "properties": {
+                                               "service": { "enum": [ 
"geoshape", "geoline", "geomask" ] },
+                                               "query": { "type": "string" },
+                                               "ids": {
+                                                       "oneOf": [
+                                                               {
+                                                                       "type": 
"array",
+                                                                       
"items": {
+                                                                               
"type": "string",
+                                                                               
"pattern": "^Q[1-9]\\d{0,19}$"
+                                                                       }
+                                                               },
+                                                               {
+                                                                       "type": 
"string",
+                                                                       
"pattern": "^Q[1-9]\\d{0,19}(\\s*,\\s*Q[1-9]\\d{0,19})*$"
+                                                               }
+                                                       ]
+                                               }
+                                       }
+                               }
                        ],
 
                        "properties": {
                                "type": { "enum": [ "ExternalData" ] },
                                "service": { "type": "string" },
-                               "query": { "type": "string" },
-                               "ids": {
-                                       "oneOf": [
-                                               {
-                                                       "type": "array",
-                                                       "items": {
-                                                               "type": 
"string",
-                                                               "pattern": 
"^Q[1-9]\\d{0,19}$"
-                                                       }
-                                               },
-                                               {
-                                                       "type": "string",
-                                                       "pattern": 
"^Q[1-9]\\d{0,19}(\\s*,\\s*Q[1-9]\\d{0,19})*$"
-                                               }
-                                       ]
-                               },
                                "properties": { "$ref": 
"#/definitions/simplestyle" }
                        }
                },

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I933fdb5de26e905e6e7fa6e3dbfd0293c9267b53
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Kartographer
Gerrit-Branch: master
Gerrit-Owner: Yurik <yu...@wikimedia.org>

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

Reply via email to