Support attachements in metadata fields (fixes #77)

Change-Id: Ia5be6ec851ef318d89b115ac814663dc32da3484
diff --git a/dev/js/spec/matchSpec.js b/dev/js/spec/matchSpec.js
index b27ddbd..04e188e 100644
--- a/dev/js/spec/matchSpec.js
+++ b/dev/js/spec/matchSpec.js
@@ -9,6 +9,7 @@
         'match/treeitem',
         'match/treearc',
         'buttongroup/menu',
+        'match/attachement',
         'hint/foundries/cnx',
         'hint/foundries/mate'], function (
           matchClass,
@@ -19,7 +20,8 @@
           infoClass,
           matchTreeItemClass,
           matchRelClass,
-          matchTreeMenuClass) {
+          matchTreeMenuClass,
+          attachementClass) {
 
   var available = [
     'base/s=spans',
@@ -77,7 +79,14 @@
         "opennlp\/morpho",
         "opennlp\/sentences"
       ]
-    }
+    },
+    {
+      "@type": "koral:field",
+      "key": "xlink",
+      "type": "type:attachement",
+      "value": "data:application/x.korap-link;title=Cool,https://de.wikipedia.org/wiki/Beispiel"
+    },
+
   ];
 
 
@@ -741,7 +750,18 @@
 		  expect(mel.children[2].children[1].children[1].tagName).toEqual('DIV');
 		  expect(mel.children[2].children[1].children[1].firstChild.nodeValue).toEqual('film');		 
 	  }); 
-  
+
+    it('attachements should be formatted', function(){
+		  //type:attachement
+      expect(mel.children[3].children[1].getAttribute('data-type')).toEqual('type:attachement')
+		  expect(mel.children[3].children[1].classList.contains('metakeyvalues')).toBeFalsy;
+		  expect(mel.children[3].children[0].firstChild.nodeValue).toEqual('xlink');
+		  expect(mel.children[3].children[1].firstChild.textContent).toEqual('Cool');
+		  expect(mel.children[3].children[1].firstChild.tagName).toEqual('A');
+      expect(mel.children[3].children[1].firstChild.getAttribute('href')).toEqual('https://de.wikipedia.org/wiki/Beispiel');
+	  }); 
+ 
+    
   
 	  // Meta information should be sorted alphabetically
     it('should be alphabetically sorted', function(){
@@ -750,7 +770,58 @@
   	  var c = mel.children[2].children[0].firstChild.nodeValue;
   	  expect(a.localeCompare(b)).toBe(-1);
   	  expect(b.localeCompare(c)).toBe(-1);
-    });  
+    });
+
+
+    it('should handle attachements', function () {
+      let uri = attachementClass.create("data:text/plain;title=new,Hallo");
+      expect(uri.contentType).toEqual("text/plain");
+
+      expect(uri.payload).toEqual("Hallo");
+      expect(uri.base64).toBeFalsy();
+      expect(uri.isLink).toBeFalsy();
+      expect(uri.param["title"]).toEqual("new");
+
+      uri = attachementClass.create("data:application/x.korap-link,https://de.wikipedia.org/wiki/Beispiel");
+      expect(uri.contentType).toEqual("application/x.korap-link");
+      expect(uri.payload).toEqual("https://de.wikipedia.org/wiki/Beispiel");
+      expect(uri.base64).toBeFalsy();
+      expect(uri.isLink).toBeTruthy();
+      expect(uri.inline().textContent).toEqual("https://de.wikipedia.org/wiki/Beispiel");
+      expect(uri.inline().nodeType).toEqual(1);
+      expect(uri.inline().tagName).toEqual("A");
+      expect(uri.inline().getAttribute("rel")).toEqual("noopener noreferrer");
+
+
+      uri = attachementClass.create("data:application/x.korap-link;title=Das ist ein Titel,https://de.wikipedia.org/wiki/Beispiel");
+      expect(uri.contentType).toEqual("application/x.korap-link");
+      expect(uri.payload).toEqual("https://de.wikipedia.org/wiki/Beispiel");
+      expect(uri.base64).toBeFalsy();
+      expect(uri.isLink).toBeTruthy();
+      expect(uri.inline().textContent).toEqual("Das ist ein Titel");
+      expect(uri.inline().nodeType).toEqual(1);
+      expect(uri.inline().tagName).toEqual("A");
+      expect(uri.inline().getAttribute("rel")).toEqual("noopener noreferrer");
+
+      
+      uri = attachementClass.create("data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D");
+      expect(uri.contentType).toEqual("text/plain");
+      expect(uri.payload).toEqual("Hello, World!");
+      expect(uri.base64).toBeTruthy();
+      expect(uri.isLink).toBeFalsy();
+      expect(uri.inline().nodeType).toEqual(3);
+      expect(uri.inline().textContent).toEqual("Hello, World!");
+
+      uri = attachementClass.create("data:text/plain;title= new ; subTitle = old ;base64,SGVsbG8sIFdvcmxkIQ%3D%3D");
+      expect(uri.contentType).toEqual("text/plain");
+      expect(uri.payload).toEqual("Hello, World!");
+      expect(uri.param["title"]).toEqual("new");
+      expect(uri.param["subTitle"]).toEqual("old");
+      expect(uri.base64).toBeTruthy();
+      expect(uri.isLink).toBeFalsy();
+      expect(uri.inline().nodeType).toEqual(3);
+      expect(uri.inline().textContent).toEqual("Hello, World!");
+    });
   });
   // table = view.toTable();
   // table.sortBy('');