blob: 45c4b2103ad1f752409c937319881b001b741de3 [file] [log] [blame]
/**
* Parse Data URI scheme for attachement fields
* Afterwards the object has the parameters
* - contentType (defaults to text/plain)
* - base64 (if the data was base64 encoded)
* - isLink (if the contentType is application/x.korap-link)
* - param (as a map of arbitrary parameters)
* - payload (the URI decoded data)
*
* @author Nils Diewald
*/
"use strict";
define(function () {
const uriRE = new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$");
const mapRE = new RegExp("^ *([^=]+?) *= *(.+?) *$");
return {
/**
* Constructor
*/
create : function (url) {
return Object.create(this)._init(url);
},
// Parse URI scheme
_init : function (url) {
const t = this;
t.base64 = false;
t.isLink = false;
t.contentType = "text/plain";
// Decode
var url;
try {
url = decodeURIComponent(url);
} catch (e) {
t.payload = '[INVALID URI]';
return t;
}
if (!uriRE.exec(url))
return;
t.payload = RegExp.$2;
let map = {};
let start = 0;
// Split parameter map
RegExp.$1.split(/ *; */).map(function (item) {
const t = this;
// Check first parameter
if (!start++ && item.match(/^[-a-z0-9]+?\/.+$/)) {
t.contentType = item;
if (item === "application/x.korap-link")
t.isLink = true;
}
// Decode b64
else if (item.toLowerCase() == "base64") {
t.base64 = true;
t.payload = window.atob(t.payload);
}
// Parse arbitrary metadata
else if (mapRE.exec(item)) {
map[RegExp.$1] = RegExp.$2;
};
}.bind(t));
t.param = map;
return t;
},
/**
* Inline the attachement
* This should optimally be plugin-treatable
*/
inline : function () {
if (this.isLink) {
const title = this.param["title"] || this.payload;
const a = document.createElement('a');
a.setAttribute('href', this.payload);
a.setAttribute('rel', 'noopener noreferrer');
a.addT(title);
return a;
};
return document.createTextNode(this.payload);
}
}
});