jenkins-bot has submitted this change and it was merged.

Change subject: Use marker styles
......................................................................


Use marker styles

Bug: T129507
Change-Id: Ieb1aa8a14c7ee83593d31fba9eb399c5adef2010
---
M extension.json
M includes/Tag/MapLink.php
M includes/Tag/TagHandler.php
M styles/kartographer.less
M tests/parserTests.txt
5 files changed, 118 insertions(+), 14 deletions(-)

Approvals:
  Yurik: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/extension.json b/extension.json
index 007238b..35898af 100644
--- a/extension.json
+++ b/extension.json
@@ -205,7 +205,8 @@
                "KartographerSrcsetScales": [1.3, 1.5, 2, 2.6, 3],
                "KartographerMapServer": "https://maps.wikimedia.org";,
                "KartographerIconServer": "https://maps.wikimedia.org";,
-               "KartographerFrameMode": "interactive"
+               "KartographerFrameMode": "interactive",
+               "KartographerUseMarkerStyle": true
        },
        "TrackingCategories": [
                "kartographer-tracking-category",
diff --git a/includes/Tag/MapLink.php b/includes/Tag/MapLink.php
index abe0793..31472c3 100644
--- a/includes/Tag/MapLink.php
+++ b/includes/Tag/MapLink.php
@@ -13,17 +13,19 @@
        protected $tag = 'maplink';
 
        protected function render() {
-               $counter = $this->counter;
-               if ( is_numeric( $counter ) ) {
-                       $counter = 
$this->parser->getTargetLanguage()->formatNum( $counter );
-               }
+               // @todo: Mapbox markers don't support localized numbers yet
                $text = $this->getText( 'text', null, '/\S+/' );
                if ( $text === null ) {
-                       $text = $counter ?: CoordFormatter::format( $this->lat, 
$this->lon, $this->language );
+                       $text = $this->counter ?: CoordFormatter::format( 
$this->lat, $this->lon, $this->language );
                }
                $text = $this->parser->recursiveTagParse( $text, $this->frame );
-               $attrs = $this->getDefaultAttributes();
+               $style = $this->extractMarkerCss();
+
+               $attrs = $this->getDefaultAttributes( $style );
                $attrs['class'] .= ' mw-kartographer-link';
+               if ( $style ) {
+                       $attrs['class'] .= ' mw-kartographer-autostyled';
+               }
                $attrs['data-style'] = $this->mapStyle;
                $attrs['data-zoom'] = $this->zoom;
                $attrs['data-lat'] = $this->lat;
@@ -35,4 +37,24 @@
 
                return Html::rawElement( 'a', $attrs, $text );
        }
+
+       /**
+        * Extracts CSS style to be used by the link from GeoJSON
+        * @return string
+        */
+       private function extractMarkerCss() {
+               global $wgKartographerUseMarkerStyle;
+
+               if ( $wgKartographerUseMarkerStyle
+                       && $this->markerProperties
+                       && property_exists( $this->markerProperties, 
'marker-color' )
+               ) {
+                       preg_match( '/^#?(([0-9a-fA-F]{3}){1,2})$/', 
$this->markerProperties->{'marker-color'}, $m );
+                       if ( $m && $m[2] ) {
+                               return "background: #{$m[2]};";
+                       }
+               }
+
+               return '';
+       }
 }
diff --git a/includes/Tag/TagHandler.php b/includes/Tag/TagHandler.php
index 819f7c2..1f1d855 100644
--- a/includes/Tag/TagHandler.php
+++ b/includes/Tag/TagHandler.php
@@ -50,7 +50,7 @@
        protected $mapStyle;
 
        /** @var string */
-       protected $style;
+       protected $style = '';
 
        /** @var string name of the group, or null for private */
        protected $groupName;
@@ -69,6 +69,9 @@
 
        /** @var Language */
        protected $language;
+
+       /** @var stdClass */
+       protected $markerProperties;
 
        /**
         * Entry point for all tags
@@ -161,12 +164,14 @@
 
        /**
         * Returns default HTML attributes of the outermost tag of the output
+        * @param string $extraStyle
         * @return string[]
         */
-       protected function getDefaultAttributes() {
+       protected function getDefaultAttributes( $extraStyle = '' ) {
                $attrs = [ 'class' => 'mw-kartographer', 'mw-data' => 
'interface' ];
-               if ( $this->style ) {
-                       $attrs['style'] = $this->style;
+               $style = trim( "{$extraStyle} {$this->style}" );
+               if ( $style ) {
+                       $attrs['style'] = $style;
                }
                return $attrs;
        }
@@ -261,7 +266,10 @@
                // For all GeoJSON items whose marker-symbol value begins with 
'-counter' and '-letter',
                // recursively replace them with an automatically incremented 
marker icon.
                $counters = $output->getExtensionData( 'kartographer_counters' 
) ?: new stdClass();
-               $this->counter = $this->doCountersRecursive( $this->geometries, 
$counters );
+               $marker = $this->doCountersRecursive( $this->geometries, 
$counters );
+               if ( $marker ) {
+                       list( $this->counter, $this->markerProperties ) = 
$marker;
+               }
                $output->setExtensionData( 'kartographer_counters', $counters );
 
                if ( $this->groupName === null ) {
@@ -316,7 +324,7 @@
        /**
         * @param $values
         * @param stdClass $counters counter-name -> integer
-        * @return bool|string returns the very first counter value that has 
been used
+        * @return bool|array [ marker, marker properties ]
         */
        private function doCountersRecursive( $values, &$counters ) {
                $firstMarker = false;
@@ -342,7 +350,7 @@
                                        $item->properties->{'marker-symbol'} = 
$marker;
                                        if ( $firstMarker === false ) {
                                                // GeoJSON is in lowercase, but 
the letter is shown as uppercase
-                                               $firstMarker = mb_strtoupper( 
$marker );
+                                               $firstMarker = [ mb_strtoupper( 
$marker ), $item->properties ];
                                        }
                                }
                        }
diff --git a/styles/kartographer.less b/styles/kartographer.less
index 8f534f1..3b0cdb1 100644
--- a/styles/kartographer.less
+++ b/styles/kartographer.less
@@ -17,3 +17,7 @@
 a.mw-kartographer-link {
        cursor: pointer;
 }
+
+.mw-kartographer-autostyled {
+       color: white;
+}
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index 91f124e..ba13d00 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -133,3 +133,72 @@
 <a class="mw-kartographer mw-kartographer-link" mw-data="interface" style="/* 
insecure input */" data-style="osm-intl" data-zoom="10" data-lat="10" 
data-lon="20"><span style="/* insecure input */">foo</span></a>
 </p>
 !! end
+
+!! test
+Marker styles
+!! input
+<maplink latitude=10 longitude=20 zoom=13>[
+{
+       "type": "Feature",
+       "geometry": {
+               "type": "Point",
+               "coordinates": [1, 2]
+       }
+},
+{
+"type": "Feature",
+       "geometry": {
+               "type": "Point",
+               "coordinates": [-122.3988, 37.8013]
+       },
+       "properties": {
+               "marker-symbol": "-letter",
+               "marker-color": "#abc"
+       }
+},
+{
+"type": "Feature",
+       "geometry": {
+               "type": "Point",
+               "coordinates": [-122.3988, 37.8013]
+       },
+       "properties": {
+               "marker-symbol": "-number",
+               "marker-color": "#DDEEFF"
+       }
+}
+]</maplink>
+
+<maplink latitude=10 longitude=20 zoom=13 style="border: yellow;">
+{
+"type": "Feature",
+       "geometry": {
+               "type": "Point",
+               "coordinates": [-122.3988, 37.8013]
+       },
+       "properties": {
+               "marker-symbol": "-number",
+               "marker-color": "fff"
+       }
+}
+</maplink>
+
+<maplink latitude=10 longitude=20 zoom=13>
+{
+"type": "Feature",
+       "geometry": {
+               "type": "Point",
+               "coordinates": [-122.3988, 37.8013]
+       },
+       "properties": {
+               "marker-symbol": "-number",
+               "marker-color": "something bad"
+       }
+}
+</maplink>
+!! result
+<p><a class="mw-kartographer mw-kartographer-link mw-kartographer-autostyled" 
mw-data="interface" style="background: #abc;" data-style="osm-intl" 
data-zoom="13" data-lat="10" data-lon="20" 
data-overlays="[&quot;_19a72be79a2653cf0eeccdba3776a568873e8865&quot;]">A</a>
+</p><p><a class="mw-kartographer mw-kartographer-link 
mw-kartographer-autostyled" mw-data="interface" style="background: #fff; 
border: yellow;" data-style="osm-intl" data-zoom="13" data-lat="10" 
data-lon="20" 
data-overlays="[&quot;_348b58ab5ba1db004b387561db7d945cdf90cea0&quot;]">2</a>
+</p><p><a class="mw-kartographer mw-kartographer-link" mw-data="interface" 
data-style="osm-intl" data-zoom="13" data-lat="10" data-lon="20" 
data-overlays="[&quot;_737b28c57ddefefdb1da5a25bc09425dd124b6b6&quot;]">3</a>
+</p>
+!! end
\ No newline at end of file

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ieb1aa8a14c7ee83593d31fba9eb399c5adef2010
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Kartographer
Gerrit-Branch: master
Gerrit-Owner: MaxSem <maxsem.w...@gmail.com>
Gerrit-Reviewer: MaxSem <maxsem.w...@gmail.com>
Gerrit-Reviewer: Yurik <yu...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to