diff --git a/src/phpGPX/Models/Extensions.php b/src/phpGPX/Models/Extensions.php index 5eb37fa..61e3f28 100644 --- a/src/phpGPX/Models/Extensions.php +++ b/src/phpGPX/Models/Extensions.php @@ -7,6 +7,7 @@ namespace phpGPX\Models; use phpGPX\Helpers\SerializationHelper; +use phpGPX\Models\Extensions\StyleExtension; use phpGPX\Models\Extensions\TrackPointExtension; /** @@ -23,6 +24,13 @@ class Extensions implements Summarizable */ public $trackPointExtension; + /** + * GPX Style Extension v2 + * @see 'http://www.topografix.com/GPX/gpx_style/0/2/' + * @var StyleExtension + */ + public $styleExtension; + /** * @var [] */ @@ -36,6 +44,7 @@ public function toArray() { return [ 'trackpoint' => SerializationHelper::serialize($this->trackPointExtension), + 'line' => SerializationHelper::serialize($this->styleExtension), 'unsupported' => $this->unsupported, ]; } diff --git a/src/phpGPX/Models/Extensions/StyleExtension.php b/src/phpGPX/Models/Extensions/StyleExtension.php new file mode 100644 index 0000000..dd75d5c --- /dev/null +++ b/src/phpGPX/Models/Extensions/StyleExtension.php @@ -0,0 +1,74 @@ + SerializationHelper::stringOrNull($this->color), + 'opacity' => SerializationHelper::floatOrNull($this->opacity), + 'width' => SerializationHelper::floatOrNull($this->width), + // 'pattern' => SerializationHelper::stringOrNull($this->pattern), + 'linecap' => SerializationHelper::stringOrNull($this->linecap), + // 'dasharray' => SerializationHelper::stringOrNull($this->dasharray), + // 'extensions' => SerializationHelper::stringOrNull($this->extensions), + ]; + } +} diff --git a/src/phpGPX/Parsers/ExtensionParser.php b/src/phpGPX/Parsers/ExtensionParser.php index 4b6154b..6655a88 100644 --- a/src/phpGPX/Parsers/ExtensionParser.php +++ b/src/phpGPX/Parsers/ExtensionParser.php @@ -7,7 +7,9 @@ namespace phpGPX\Parsers; use phpGPX\Models\Extensions; +use phpGPX\Models\Extensions\StyleExtension; use phpGPX\Models\Extensions\TrackPointExtension; +use phpGPX\Parsers\Extensions\StyleExtensionParser; use phpGPX\Parsers\Extensions\TrackPointExtensionParser; /** @@ -39,6 +41,12 @@ public static function parse($nodes) $extensions->trackPointExtension = TrackPointExtensionParser::parse($node); } break; + case StyleExtension::EXTENSION_NAMESPACE: + $node = $nodes->children($namespace)->{StyleExtension::EXTENSION_NAME}; + if (!empty($node)) { + $extensions->styleExtension = StyleExtensionParser::parse($node); + } + break; default: foreach ($nodes->children($namespace) as $child_key => $value) { $extensions->unsupported[$key ? "$key:$child_key" : "$child_key"] = (string) $value; @@ -64,6 +72,11 @@ public static function toXML(Extensions $extensions, \DOMDocument &$document) $node->appendChild($child); } + if (null !== $extensions->styleExtension) { + $child = StyleExtensionParser::toXML($extensions->styleExtension, $document); + $node->appendChild($child); + } + if (!empty($extensions->unsupported)) { foreach ($extensions->unsupported as $key => $value) { $child = $document->createElement($key, $value); diff --git a/src/phpGPX/Parsers/Extensions/StyleExtensionParser.php b/src/phpGPX/Parsers/Extensions/StyleExtensionParser.php new file mode 100644 index 0000000..ca6d41f --- /dev/null +++ b/src/phpGPX/Parsers/Extensions/StyleExtensionParser.php @@ -0,0 +1,83 @@ + [ + 'name' => 'color', + 'type' => 'string' + ], + 'opacity' => [ + 'name' => 'opacity', + 'type' => 'float' + ], + 'width' => [ + 'name' => 'width', + 'type' => 'float' + ], + 'pattern' => [ + 'name' => 'pattern', + 'type' => 'string' + ], + 'linecap' => [ + 'name' => 'linecap', + 'type' => 'string' + ], + ]; + + /** + * @param \SimpleXMLElement $node + * @return StyleExtension + */ + public static function parse($node) + { + $extension = new StyleExtension(); + + foreach (self::$attributeMapper as $key => $attribute) { + $extension->{$attribute['name']} = isset($node->$key) ? $node->$key : null; + if (!is_null($extension->{$attribute['name']})) { + settype($extension->{$attribute['name']}, $attribute['type']); + } + } + + return $extension; + } + + /** + * @param StyleExtension $extension + * @param \DOMDocument $document + * @return \DOMElement + */ + public static function toXML(StyleExtension $extension, \DOMDocument &$document) + { + $node = $document->createElement("gpxstyle:line"); + + ExtensionParser::$usedNamespaces[StyleExtension::EXTENSION_NAME] = [ + 'namespace' => StyleExtension::EXTENSION_NAMESPACE, + 'xsd' => StyleExtension::EXTENSION_NAMESPACE_XSD, + 'name' => StyleExtension::EXTENSION_NAME, + 'prefix' => StyleExtension::EXTENSION_NAMESPACE_PREFIX + ]; + + foreach (self::$attributeMapper as $key => $attribute) { + if (!is_null($extension->{$attribute['name']})) { + $child = $document->createElement( + sprintf("%s:%s", StyleExtension::EXTENSION_NAMESPACE_PREFIX, $key), + $extension->{$attribute['name']} + ); + $node->appendChild($child); + } + } + + return $node; + } +} diff --git a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.json b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.json index 4cbd70b..874c77c 100644 --- a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.json +++ b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.json @@ -9,5 +9,11 @@ "course": null, "bearing": null }, + "line": { + "color": "FF0000", + "opacity": 0.5, + "width": 1, + "linecap": "square" + }, "unsupported": [] } diff --git a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.php b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.php index 352b0e6..587f2d2 100644 --- a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.php +++ b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.php @@ -3,6 +3,7 @@ namespace UnitTests\phpGPX\Parsers; use phpGPX\Models\Extensions; +use phpGPX\Models\Extensions\StyleExtension; use phpGPX\Models\Extensions\TrackPointExtension; use phpGPX\Parsers\ExtensionParser; @@ -27,8 +28,15 @@ public static function createTestInstance() $trackpoint->hr = (float) 152; $trackpoint->heartRate = (float) 152; + $style = new StyleExtension(); + $style->color = (string) "FF0000"; + $style->opacity = (float) 0.5; + $style->width = (float) 1; + $style->linecap = (string) "square"; + $extensions = new Extensions(); $extensions->trackPointExtension = $trackpoint; + $extensions->styleExtension = $style; return $extensions; } @@ -46,6 +54,7 @@ public function testParse() $this->assertEquals($this->testModelInstance->unsupported, $extensions->unsupported); $this->assertEquals($this->testModelInstance->trackPointExtension, $extensions->trackPointExtension); + $this->assertEquals($this->testModelInstance->styleExtension, $extensions->styleExtension); $this->assertEquals($this->testModelInstance->toArray(), $extensions->toArray()); } @@ -71,8 +80,9 @@ public function testToXML() $attributes = [ 'xmlns' => 'http://www.topografix.com/GPX/1/1', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd', + 'xsi:schemaLocation' => 'http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.topografix.com/GPX/gpx_style/0/2 http://www.topografix.com/GPX/gpx_style/0/2.xsd', 'xmlns:gpxtpx' => 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1', + 'xmlns:gpxstyle' => 'http://www.topografix.com/GPX/gpx_style/0/2', 'xmlns:gpxx' => 'http://www.garmin.com/xmlschemas/GpxExtensions/v3', ]; diff --git a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.xml b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.xml index 17f0b8b..cb08a2e 100644 --- a/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.xml +++ b/tests/UnitTests/phpGPX/Parsers/ExtensionParserTest.xml @@ -1,9 +1,15 @@ - + 14 152 + + FF0000 + 0.5 + 1 + square +