69 lines
2.1 KiB
JavaScript
69 lines
2.1 KiB
JavaScript
var isDataUrl = require('./isDataUrl');
|
|
var trim = require('./trim');
|
|
var endWith = require('./endWith');
|
|
var startWith = require('./startWith');
|
|
var contain = require('./contain');
|
|
var decodeUriComponent = require('./decodeUriComponent');
|
|
var defaults = require('./defaults');
|
|
var isStr = require('./isStr');
|
|
var convertBin = require('./convertBin');
|
|
exports = {
|
|
parse: function(dataUrl) {
|
|
if (!isDataUrl(dataUrl)) {
|
|
return null;
|
|
}
|
|
dataUrl = dataUrl.slice('data:'.length);
|
|
var commaIdx = dataUrl.indexOf(',');
|
|
var mime = trim(dataUrl.slice(0, commaIdx));
|
|
var data = trim(dataUrl.slice(commaIdx + 1));
|
|
var base64 = false;
|
|
if (endWith(mime, ';base64')) {
|
|
base64 = true;
|
|
mime = mime.slice(0, -';base64'.length);
|
|
}
|
|
var charset = '';
|
|
if (contain(mime, 'charset=')) {
|
|
charset = mime.split('charset=')[1];
|
|
mime = mime.split(';')[0];
|
|
}
|
|
if (!mime) {
|
|
mime = 'text/plain';
|
|
}
|
|
if (!base64 && startWith(mime, 'text/') && contain(data, '%')) {
|
|
data = decodeUriComponent(data);
|
|
}
|
|
return {
|
|
data: data,
|
|
mime: mime,
|
|
charset: charset,
|
|
base64: base64
|
|
};
|
|
},
|
|
stringify: function(data, mime) {
|
|
var options =
|
|
arguments.length > 2 && arguments[2] !== undefined
|
|
? arguments[2]
|
|
: {};
|
|
defaults(options, {
|
|
base64: true,
|
|
charset: ''
|
|
});
|
|
var result = 'data:' + mime;
|
|
if (options.charset && startWith(mime, 'text/')) {
|
|
result += ';charset=' + options.charset;
|
|
}
|
|
if (!isStr(data)) {
|
|
data = convertBin(data, 'base64');
|
|
options.base64 = true;
|
|
}
|
|
if (options.base64) {
|
|
result += ';base64';
|
|
} else if (startWith(mime, 'text/') || !mime) {
|
|
data = encodeURIComponent(data);
|
|
}
|
|
return result + ',' + data;
|
|
}
|
|
};
|
|
|
|
module.exports = exports;
|