MaxSem has uploaded a new change for review.

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

Change subject: WIP: tag split
......................................................................

WIP: tag split

Change-Id: I68614aa620fbbf166c00977f98f720387b9047de
---
M includes/Hooks.php
A includes/Tag/MapData.php
A includes/Tag/MapFrame.php
A includes/Tag/MapLink.php
R includes/Tag/TagHandler.php
5 files changed, 127 insertions(+), 55 deletions(-)


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

diff --git a/includes/Hooks.php b/includes/Hooks.php
index 0815d8f..4dd9ff7 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -20,7 +20,7 @@
         * @return bool
         */
        public static function onParserFirstCallInit( Parser $parser ) {
-               $parser->setHook( 'maps', 
'Kartographer\TagHandler::handleMapsTag' );
+               $parser->setHook( 'mapframe', 
'Kartographer\TagHandler::handleMapsTag' );
                return true;
        }
 
diff --git a/includes/Tag/MapData.php b/includes/Tag/MapData.php
new file mode 100644
index 0000000..469352b
--- /dev/null
+++ b/includes/Tag/MapData.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace Kartographer\Tag;
+
+
+class MapData extends TagHandler {
+
+}
diff --git a/includes/Tag/MapFrame.php b/includes/Tag/MapFrame.php
new file mode 100644
index 0000000..118abe0
--- /dev/null
+++ b/includes/Tag/MapFrame.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Kartographer\Tag;
+
+
+class MapFrame extends TagHandler {
+       private $width;
+       private $height;
+
+       protected function parseArgs() {
+               $this->parseMapArgs();
+               // @todo: should these have defaults?
+               $this->width = $this->getInt( 'width' );
+               $this->height = $this->getInt( 'height' );
+       }
+}
diff --git a/includes/Tag/MapLink.php b/includes/Tag/MapLink.php
new file mode 100644
index 0000000..97fba78
--- /dev/null
+++ b/includes/Tag/MapLink.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace Kartographer\Tag;
+
+
+class MapLink extends TagHandler {
+
+}
diff --git a/includes/TagHandler.php b/includes/Tag/TagHandler.php
similarity index 81%
rename from includes/TagHandler.php
rename to includes/Tag/TagHandler.php
index 8282080..23cb4d4 100644
--- a/includes/TagHandler.php
+++ b/includes/Tag/TagHandler.php
@@ -7,17 +7,29 @@
  * @author Yuri Astrakhan
  */
 
-namespace Kartographer;
+namespace Kartographer\Tag;
 
 use FormatJson;
 use Html;
+use Kartographer\SimpleStyleSanitizer;
 use Parser;
 use ParserOutput;
 use PPFrame;
 use Status;
 use stdClass;
 
-class TagHandler {
+abstract class TagHandler {
+       /** @var Status */
+       protected $status;
+
+       /** @var stdClass[] */
+       protected $geometries;
+
+       /** @var Parser */
+       protected $parser;
+
+       protected $args;
+
        /**
         * @param string $input
         * @param array $args
@@ -25,35 +37,19 @@
         * @param PPFrame $frame
         * @return string
         */
-       public static function handleMapsTag(
-               /** @noinspection PhpUnusedParameterInspection */
+       public function handleMapsTag(
                $input, array $args, Parser $parser, PPFrame $frame
        ) {
-               global $wgKartographerStyles, $wgKartographerDfltStyle;
                $output = $parser->getOutput();
                $output->addModuleStyles( 'ext.kartographer' );
 
-               if ( $input !== '' && $input !== null ) {
-                       $status = FormatJson::parse( $input, 
FormatJson::TRY_FIXING | FormatJson::STRIP_COMMENTS );
-                       $value = false;
-                       if ( $status->isOK() ) {
-                               $value = self::validateContent( $status );
-                               if ( $value && !is_array( $value ) ) {
-                                       $value = array( $value );
-                               }
-                               $sanitizer = new SimpleStyleSanitizer( $parser, 
$frame );
-                               $sanitizer->sanitize( $value );
-                       }
-               } else {
-                       $status = Status::newGood();
-                       $value = array();
-               }
+               $this->status = Status::newGood();
+               $this->args = $args;
 
-               $mode = self::validateEnum( $status, $args, 'mode', false, 
'static' );
-               if ( !in_array( $mode, array( 'interactive', 'static', 'data', 
'link' ) ) ) {
-                       $status->fatal( 'kartographer-error-bad_attr', 'mode' );
-                       return self::reportError( $output, $status );
-               }
+               $this->parseGeometries( $input, $parser, $frame );
+               $this->parseArgs();
+
+
 
                $width = $height = $groups = $liveId = null;
                $group = isset( $args['group'] ) ? $args['group'] : '*';
@@ -195,6 +191,74 @@
                return $html;
        }
 
+       protected function parseGeometries( $input, Parser $parser, PPFrame 
$frame ) {
+               if ( $input !== '' && $input !== null ) {
+                       $status = FormatJson::parse( $input, 
FormatJson::TRY_FIXING | FormatJson::STRIP_COMMENTS );
+                       if ( $status->isOK() ) {
+                               $json = $status->getValue();
+                               if ( $json && !is_array( $json ) ) {
+                                       $json = array( $json );
+                               }
+                               $status = $this->validateContent( $json );
+                               $sanitizer = new SimpleStyleSanitizer( $parser, 
$frame );
+                               $sanitizer->sanitize( $json );
+                               $this->geometries = $json;
+                       }
+               } else {
+                       $status = Status::newGood();
+               }
+               $this->status->merge( $status );
+
+               return $status->isOK();
+       }
+
+       protected abstract function parseArgs();
+
+       protected function parseMapArgs() {
+               global $wgKartographerStyles, $wgKartographerDfltStyle;
+
+               $this->lat = $this->getFloat( 'latitude' );
+               $this->lon = $this->getFloat( 'longitude' );
+               $this->zoom = $this->getInt( 'zoom' );
+               $regexp = '/^(' . implode( '|', $wgKartographerStyles ) . ')$/';
+               $this->style = $this->getAndValidate( 'style', 
$wgKartographerDfltStyle, $regexp );
+       }
+
+       protected function getInt( $name, $default = false ) {
+               $value = $this->getAndValidate( $name, $default, '/^-?[0-9]+$/' 
);
+               if ( $value !== false ) {
+                       $value = intval( $value );
+               }
+
+               return $value;
+       }
+
+       protected function getFloat( $name, $default = false ) {
+               $value = $this->getAndValidate( $name, $default, 
'/^-?[0-9]*\.?[0-9]+$/' );
+               if ( $value !== false ) {
+                       $value = floatval( $value );
+               }
+
+               return $value;
+       }
+
+
+       protected function getAndValidate( $name, $default, $regexp ) {
+               if ( !isset( $this->args[$name] ) ) {
+                       if ( $default === false ) {
+                               $this->status->fatal( 
'kartographer-error-bad_attr', $name );
+                       }
+                       return $default;
+               }
+               $value = $this->args[$name];
+               if ( !preg_match( $regexp, $value ) ) {
+                       $value = false;
+                       $this->status->fatal( 'kartographer-error-bad_attr', 
$name );
+               }
+
+               return $value;
+       }
+
        /**
         * Handles the last step of parse process
         * @param Parser $parser
@@ -218,25 +282,6 @@
         * @param Status $status
         * @param array $args
         * @param string $value
-        * @param bool $isInt
-        * @return float|int|false
-        */
-       private static function validateNumber( $status, $args, $value, $isInt 
) {
-               if ( isset( $args[$value] ) ) {
-                       $v = $args[$value];
-                       $pattern = $isInt ? '/^[0-9]+$/' : 
'/^[-+]?[0-9]*\.?[0-9]+$/';
-                       if ( preg_match( $pattern, $v ) ) {
-                               return $isInt ? intval( $v ) : floatval( $v );
-                       }
-               }
-               $status->fatal( 'kartographer-error-bad_attr', $value );
-               return false;
-       }
-
-       /**
-        * @param Status $status
-        * @param array $args
-        * @param string $value
         * @param array|bool|false $set
         * @param string|bool|false $default
         * @return string|false
@@ -254,21 +299,16 @@
        }
 
        /**
-        * @param Status $status
+        * @param mixed $json
         * @return mixed
         */
-       private static function validateContent( $status ) {
-               $value = $status->getValue();
-
+       private function validateContent( $json ) {
                // The content must be a non-associative array of values or an 
object
-               if ( $value instanceof stdClass ) {
-                       $value = array ( $value );
-               } elseif ( !is_array( $value ) ) {
-                       $status->fatal( 'kartographer-error-bad_data' );
-                       return false;
+               if ( !is_array( $json ) ) {
+                       return Status::newFatal( 'kartographer-error-bad_data' 
);
                }
 
-               return $value;
+               return Status::newGood();
        }
 
        /**

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I68614aa620fbbf166c00977f98f720387b9047de
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Kartographer
Gerrit-Branch: master
Gerrit-Owner: MaxSem <maxsem.w...@gmail.com>

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

Reply via email to