]> git.street.me.uk Git - andy/gpx.git/commitdiff
Add extensions for GPX type
authorAndy Street <andy@street.me.uk>
Wed, 19 Dec 2018 18:48:47 +0000 (18:48 +0000)
committerAndy Street <andy@street.me.uk>
Wed, 19 Dec 2018 18:48:47 +0000 (18:48 +0000)
docs/samples/full-1.0.gpx
docs/samples/full-1.1.gpx
src/libgpx/gpx.php
src/libgpx/gpxreader.php
src/libgpx/gpxwriter.php

index ab9c5f61adb2da772e2811dbb6724aef0e704631..86381c533a11df0d60971ed289dc2ef92ccb2961 100644 (file)
@@ -61,4 +61,5 @@
       <trkpt lat="3.0" lon="3.0"/>
     </trkseg>
   </trk>
+  <custom:checkedBy>Jane Doe</custom:checkedBy>
 </gpx>
index 414a45ca0082b9083a4e1b86785feb213529f09f..a061ed8b30e9f92959b2327ead7ddab8c583820e 100644 (file)
@@ -95,4 +95,7 @@
       <trkpt lat="3.0" lon="3.0"/>\r
     </trkseg>\r
   </trk>\r
+  <extensions>\r
+    <custom:checkedBy>Jane Doe</custom:checkedBy>\r
+  </extensions>\r
 </gpx>\r
index f71f7f1a4f528e8211886df648764f4159075a76..61e9e58db098aeb26e4636026bd387a88b1b2624 100644 (file)
@@ -120,6 +120,13 @@ class GPX implements Geographic
    */
   protected $tracks;
 
+  /**
+   * A list of XML snippets describing unsupported elements.
+   *
+   * @var TypedDoublyLinkedList (string)
+   */
+  protected $extensions;
+
   /**
    * Fetch the name of the program that created the GPX file.
    *
@@ -323,6 +330,19 @@ class GPX implements Geographic
     return $this->tracks;
   }
 
+  /**
+   * Fetch a list of protocol extensions as raw XML.
+   *
+   * @param boolean $create Create the list if it does not already exist.
+   * @return TypedDoublyLinkedList A list of protocol extensions.
+   */
+  public function getExtensions(bool $create = true)
+  {
+    if ($create && $this->extensions === null)
+      $this->extensions = new TypedDoublyLinkedList('string');
+    return $this->extensions;
+  }
+
   /**
    * Fetch a bounding box that covers the feature.
    *
index 4df8d1dd9b5f7a9957be0f78dc49a3f4ace35f41..8e9c615b7638092b38a85a0198795e9e580a197c 100644 (file)
@@ -193,6 +193,9 @@ class GPXReader
       $struct['elements']['metadata'] = function ($gpx) {
         $this->readMetadata($gpx);
       };
+      $struct['elements']['extensions'] = function ($gpx) {
+        $this->readExtension($gpx->getExtensions());
+      };
     } else {
       $struct['elements']['name'] = function ($gpx) {
         $gpx->setName($this->readXSDString());
@@ -249,6 +252,10 @@ class GPXReader
           $keywords[] = trim($word);
       };
       $struct['elements']['bounds'] = false;
+      $struct['extensions'] = function ($gpx) {
+        $gpx->getExtensions()[] = $this->xml->readOuterXML();
+        $this->xml->next();
+      };
     }
 
     $this->readStruct($struct, $result);
index 1e7878cfe0d68d758346166cb830d90627ab05aa..567a7718e71eded630eb4892bd43c645c28bc59d 100644 (file)
@@ -251,6 +251,16 @@ class GPXWriter
         $this->writeTrack($track, $xml);
       }
     }
+    $extensions = $gpx->getExtensions(false);
+    if ($extensions !== null && !$extensions->isEmpty()) {
+      if ($this->format == '1.1')
+        $xml->startElement('extensions');
+      foreach ($extensions as $extension) {
+        $xml->writeRaw($extension);
+      }
+      if ($this->format == '1.1')
+        $xml->endElement();
+    }
     $xml->endElement();
     $xml->endDocument();
     $xml->flush();