Akron | a0ea3c3 | 2018-12-14 18:33:48 +0100 | [diff] [blame] | 1 | /** |
| 2 | * Parse Data URI scheme for attachement fields |
| 3 | * Afterwards the object has the parameters |
| 4 | * - contentType (defaults to text/plain) |
| 5 | * - base64 (if the data was base64 encoded) |
| 6 | * - isLink (if the contentType is application/x.korap-link) |
| 7 | * - param (as a map of arbitrary parameters) |
| 8 | * - payload (the URI decoded data) |
| 9 | * |
| 10 | * @author Nils Diewald |
| 11 | */ |
| 12 | define(function () { |
Akron | d3bb85b | 2019-02-08 10:15:13 +0100 | [diff] [blame] | 13 | const uriRE = new RegExp("^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$"); |
Akron | a0ea3c3 | 2018-12-14 18:33:48 +0100 | [diff] [blame] | 14 | const mapRE = new RegExp("^ *([^=]+?) *= *(.+?) *$"); |
| 15 | |
| 16 | return { |
| 17 | |
| 18 | /** |
| 19 | * Constructor |
| 20 | */ |
| 21 | create : function (url) { |
| 22 | return Object.create(this)._init(url); |
| 23 | }, |
| 24 | |
| 25 | // Parse URI scheme |
| 26 | _init : function (url) { |
| 27 | |
| 28 | // Decode |
| 29 | url = decodeURIComponent(url); |
| 30 | |
| 31 | if (!uriRE.exec(url)) |
| 32 | return; |
| 33 | |
| 34 | this.payload = RegExp.$2; |
| 35 | |
| 36 | let map = {}; |
| 37 | let start = 0; |
| 38 | this.base64 = false; |
| 39 | this.isLink = false; |
| 40 | this.contentType = "text/plain"; |
| 41 | |
| 42 | // Split parameter map |
| 43 | RegExp.$1.split(/ *; */).map(function (item) { |
| 44 | |
| 45 | // Check first parameter |
| 46 | if (!start++ && item.match(/^[-a-z0-9]+?\/.+$/)) { |
| 47 | this.contentType = item; |
| 48 | |
| 49 | if (item === "application/x.korap-link") |
| 50 | this.isLink = true; |
| 51 | } |
| 52 | |
| 53 | // Decode b64 |
| 54 | else if (item.toLowerCase() == "base64") { |
| 55 | this.base64 = true; |
| 56 | this.payload = window.atob(this.payload); |
| 57 | } |
| 58 | |
| 59 | // Parse arbitrary metadata |
| 60 | else if (mapRE.exec(item)) { |
| 61 | map[RegExp.$1] = RegExp.$2; |
| 62 | }; |
| 63 | }.bind(this)); |
| 64 | |
| 65 | this.param = map; |
| 66 | return this; |
| 67 | }, |
| 68 | |
| 69 | /** |
| 70 | * Inline the attachement |
| 71 | * This should optimally be plugin-treatable |
| 72 | */ |
| 73 | inline : function () { |
| 74 | if (this.isLink) { |
| 75 | let title = this.param["title"] || this.payload; |
| 76 | let a = document.createElement('a'); |
| 77 | a.setAttribute('href', this.payload); |
| 78 | a.setAttribute('rel', 'noopener noreferrer'); |
| 79 | a.addT(title); |
| 80 | return a; |
| 81 | }; |
| 82 | |
| 83 | return document.createTextNode(this.payload); |
| 84 | } |
| 85 | } |
| 86 | }); |