diff --git a/lib/Polyline.php b/lib/Polyline.php index 692e128..3202e84 100755 --- a/lib/Polyline.php +++ b/lib/Polyline.php @@ -3,7 +3,7 @@ /** * Polyline * - * PHP Version 5.3 + * PHP Version 5.2 (forked) * * A simple class to handle polyline-encoding for Google Maps * @@ -41,112 +41,113 @@ * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 * @link https://github.com/emcconville/google-map-polyline-encoding-tool */ -class Polyline -{ - /** - * Default precision level of 1e-5. - * - * Overwrite this property in extended class to adjust precision of numbers. - * !!!CAUTION!!! - * 1) Adjusting this value will not guarantee that third party - * libraries will understand the change. - * 2) Float point arithmetic IS NOT real number arithmetic. PHP's internal - * float precision may contribute to undesired rounding. - * - * @var int $precision - */ - protected static $precision = 5; +class Polyline { - /** - * Apply Google Polyline algorithm to list of points. - * - * @param array $points List of points to encode. Can be a list of tuples, - * or a flat on dimensional array. - * - * @return string encoded string - */ - final public static function encode( $points ) - { - $points = self::flatten($points); - $encodedString = ''; - $index = 0; - $previous = array(0,0); - foreach ( $points as $number ) { - $number = (float)($number); - $number = (int)round($number * pow(10, static::$precision)); - $diff = $number - $previous[$index % 2]; - $previous[$index % 2] = $number; - $number = $diff; - $index++; - $number = ($number < 0) ? ~($number << 1) : ($number << 1); - $chunk = ''; - while ( $number >= 0x20 ) { - $chunk .= chr((0x20 | ($number & 0x1f)) + 63); - $number >>= 5; - } - $chunk .= chr($number + 63); - $encodedString .= $chunk; - } - return $encodedString; - } + /** + * Default precision level of 1e-5. + * + * Overwrite this property in extended class to adjust precision of numbers. + * !!!CAUTION!!! + * 1) Adjusting this value will not guarantee that third party + * libraries will understand the change. + * 2) Float point arithmetic IS NOT real number arithmetic. PHP's internal + * float precision may contribute to undesired rounding. + * + * @var int $precision + */ + protected static $precision = 5; - /** - * Reverse Google Polyline algorithm on encoded string. - * - * @param string $string Encoded string to extract points from. - * - * @return array points - */ - final public static function decode( $string ) - { - $points = array(); - $index = $i = 0; - $previous = array(0,0); - while ($i < strlen($string)) { - $shift = $result = 0x00; - do { - $bit = ord(substr($string, $i++)) - 63; - $result |= ($bit & 0x1f) << $shift; - $shift += 5; - } while ($bit >= 0x20); + // To remove PHP 5.3 requirement. + protected static $flatten = array(); - $diff = ($result & 1) ? ~($result >> 1) : ($result >> 1); - $number = $previous[$index % 2] + $diff; - $previous[$index % 2] = $number; - $index++; - $points[] = $number * 1 / pow(10, static::$precision); - } - return $points; - } + /** + * Apply Google Polyline algorithm to list of points. + * + * @param array $points List of points to encode. Can be a list of tuples, + * or a flat on dimensional array. + * + * @return string encoded string + */ + final public static function encode( $points ) { + $points = self::flatten( $points ); + $encoded_string = ''; + $index = 0; + $previous = array( 0, 0 ); + foreach ( $points as $number ) { + $number = (float) $number; + $number = (int) round( $number * pow( 10, static::$precision ) ); + $diff = $number - $previous[ $index % 2 ]; - /** - * Reduce multi-dimensional to single list - * - * @param array $array Subject array to flatten. - * - * @return array flattened - */ - final public static function flatten( $array ) - { - $flatten = array(); - array_walk_recursive( - $array, // @codeCoverageIgnore - function ($current) use (&$flatten) { - $flatten[] = $current; - } - ); - return $flatten; - } + $previous[ $index % 2 ] = $number; - /** - * Concat list into pairs of points - * - * @param array $list One-dimensional array to segment into list of tuples. - * - * @return array pairs - */ - final public static function pair( $list ) - { - return is_array($list) ? array_chunk($list, 2) : array(); - } + $number = $diff; + $index++; + $number = ( $number < 0 ) ? ~( $number << 1 ) : ( $number << 1 ); + $chunk = ''; + while ( $number >= 0x20 ) { + $chunk .= chr( ( 0x20 | ( $number & 0x1f ) ) + 63 ); + $number >>= 5; + } + $chunk .= chr( $number + 63 ); + $encoded_string .= $chunk; + } + return $encoded_string; + } + + /** + * Reverse Google Polyline algorithm on encoded string. + * + * @param string $string Encoded string to extract points from. + * + * @return array points + */ + final public static function decode( $string ) { + $points = array(); + $index = $i = 0; + $previous = array( 0, 0 ); + while ( $i < strlen( $string ) ) { + $shift = $result = 0x00; + do { + $bit = ord( substr( $string, $i++ ) ) - 63; + $result |= ( $bit & 0x1f ) << $shift; + $shift += 5; + } while ( $bit >= 0x20 ); + + $diff = ( $result & 1 ) ? ~( $result >> 1 ) : ( $result >> 1 ); + $number = $previous[ $index % 2 ] + $diff; + + $previous[ $index % 2 ] = $number; + $index++; + $points[] = $number * 1 / pow( 10, static::$precision ); + } + return $points; + } + + /** + * Reduce multi-dimensional to single list + * + * @param array $array Subject array to flatten. + * + * @return array flattened + */ + final public static function flatten( $array ) { + self::$flatten = array(); + array_walk_recursive( $array, array( 'Polyline', 'flatten_callback' ) ); + return self::$flatten; + } + + final public static function flatten_callback( $value ) { + self::$flatten[] = $value; + } + + /** + * Concat list into pairs of points + * + * @param array $list One-dimensional array to segment into list of tuples. + * + * @return array pairs + */ + final public static function pair( $list ) { + return is_array( $list ) ? array_chunk( $list, 2 ) : array(); + } } diff --git a/lib/RouteShortcode.class.php b/lib/RouteShortcode.class.php index cd5667c..23cfc12 100644 --- a/lib/RouteShortcode.class.php +++ b/lib/RouteShortcode.class.php @@ -19,14 +19,14 @@ class WPStrava_RouteShortcode { 'map_width' => '480', 'map_height' => '320', 'athlete_token' => WPStrava::get_instance()->settings->get_default_token(), - 'markers' => false, + 'markers' => false, ); extract( shortcode_atts( $defaults, $atts ) ); - $strava_som = WPStrava_SOM::get_som( $som ); - $route = WPStrava::get_instance()->routes; - $route_details = $route->getRoute( $id ); + $strava_som = WPStrava_SOM::get_som( $som ); + $route = WPStrava::get_instance()->routes; + $route_details = $route->get_route( $id ); //sanitize width & height $map_width = str_replace( '%', '', $map_width ); @@ -66,9 +66,6 @@ class WPStrava_RouteShortcode { public static function print_scripts() { if ( self::$add_script ) { wp_enqueue_style( 'wp-strava-style' ); - - //wp_print_scripts('google-maps'); - //wp_print_scripts('wp-strava-script'); } } } diff --git a/lib/Routes.class.php b/lib/Routes.class.php index fd2f664..573030f 100644 --- a/lib/Routes.class.php +++ b/lib/Routes.class.php @@ -3,18 +3,17 @@ * Routes is a class wrapper for the Strava REST API functions. */ -class WPStrava_Routes -{ - const ROUTES_URL = 'http://app.strava.com/routes/'; +class WPStrava_Routes { + const ROUTES_URL = 'http://app.strava.com/routes/'; - /** - * Get single route by ID. - * - * @param int $route_id ID of activity to retrieve. - * @return object stdClass representing this route. - * @author Daniel Lintott - */ - public function getRoute($route_id ) { - return WPStrava::get_instance()->get_api()->get( "routes/{$route_id}" ); - } // getRouteDetails -} \ No newline at end of file + /** + * Get single route by ID. + * + * @param int $route_id ID of activity to retrieve. + * @return object stdClass representing this route. + * @author Daniel Lintott + */ + public function get_route( $route_id ) { + return WPStrava::get_instance()->get_api()->get( "routes/{$route_id}" ); + } +} diff --git a/lib/StaticMap.class.php b/lib/StaticMap.class.php index b213f15..cefe939 100644 --- a/lib/StaticMap.class.php +++ b/lib/StaticMap.class.php @@ -1,7 +1,5 @@ settings->gmaps_key; @@ -24,34 +23,49 @@ class WPStrava_StaticMap { return ''; } - $url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:"; - $url_len = strlen( $url ); + $url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:"; + $url_len = strlen( $url ); $max_chars = 1865; + $polyline = ''; if ( ! empty( $ride->map->polyline ) && ( $url_len + strlen( $ride->map->polyline ) < $max_chars ) ) { - $url .= $ride->map->polyline; - $points = self::decode_polyline($ride->map->polyline); + $polyline = $ride->map->polyline; } elseif ( ! empty( $ride->map->summary_polyline ) ) { - $url .= $ride->map->summary_polyline; - $points = self::decode_polyline($ride->map->summary_polyline); + $polyline = $ride->map->summary_polyline; } + $url .= $polyline; - if ($markers) { - $markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] . - '&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1]; - $url .= $markers; - } + if ( $markers ) { + $points = self::decode_start_finish( $polyline ); + $markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] . + '&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1]; + $url .= $markers; + } return ""; } - private static function decode_polyline($enc) { - $points = Polyline::decode($enc); - $points = Polyline::pair($points); - $start = $points[0]; - $finish = $points[count($points)-1]; + /** + * From an encoded polyline, get the start and finish points for + * the purposes of displaying start and finish markers. + * + * @static + * @see https://developers.google.com/maps/documentation/utilities/polylinealgorithm + * @access private + * @param string $enc Encoded polyline. + * @return array with indexes of start & finish containing lat/lon for each. + */ + private static function decode_start_finish( $enc ) { + require_once WPSTRAVA_PLUGIN_DIR . 'lib/Polyline.php'; + $points = Polyline::decode( $enc ); + $points = Polyline::pair( $points ); + $start = $points[0]; + $finish = $points[ count( $points ) - 1 ]; - return array('start' => $start, 'finish' => $finish); - } + return array( + 'start' => $start, + 'finish' => $finish, + ); + } } diff --git a/readme.txt b/readme.txt index b58a9c8..1fd6cb3 100755 --- a/readme.txt +++ b/readme.txt @@ -38,12 +38,16 @@ Strava Latest Map - shows map of latest activity with option to limit latest map == Changelog == += 1.3.0 = +Added [route] shortcode and start/finish https://github.com/cmanon/wp-strava/pull/10/ +Fixed error with /rides link (should be /activities). https://wordpress.org/support/topic/problem-with-link-4/ + = 1.2.0 = -Added multi-athlete configuration. +Added multi-athlete configuration. https://wordpress.org/support/topic/multi-strava-user/ Additional transitions from Ride -> Activity. Updated setup instructions to reflect latest Strava API set up process. -Backwards Compatibility - removed PHP 5.3+ specific operator (should work with PHP 5.2 now - versions 1.1 and 1.1.1 don't). -Reworked error reporting and formatting. +Backwards Compatibility - removed PHP 5.3+ specific operator (should work with PHP 5.2 now - versions 1.1 and 1.1.1 don't). https://wordpress.org/support/topic/version-1-1-broken/ +Reworked error reporting and formatting. https://wordpress.org/support/topic/updating-settings-failure/#post-9764942 = 1.1.1 = Changes to better support translations through https://translate.wordpress.org. @@ -52,15 +56,15 @@ Cleaned up formatting. = 1.1 = Added [activity] shortcode to deprecate [ride] in the future. Fixed static method call error in shortcode. -Added title to Strava Latest Map Widget. +Added title to Strava Latest Map Widget. https://wordpress.org/support/topic/change-widget-title-from-latest-ride-to-latest-run-or-something-else/ Added Lance Willett to contributors. Added target="_blank" to widget hrefs. -Added Google Maps Key to settings (required for map images). +Added Google Maps Key to settings (required for map images). https://wordpress.org/support/topic/the-google-maps-api-server-rejected-your-request-3/ Added cache clear option to remove transient & image data. Cleaned up formatting. = 1.0 = -Change to Strava API V3. +Change to Strava API V3. https://wordpress.org/support/topic/does-not-work-354/ Switch ride shortcode to use static map. = 0.70 = @@ -73,7 +77,7 @@ Fixed several bugs. Added feature to show athlete name/link to the widget if the search option is by club. = 0.61 = -Added option to select unit of measurements on the widget. +Added option to select unit of measurements on the widget. https://wordpress.org/support/topic/feature-request-runs-in-minkm/ = 0.6 = Initial version.