1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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;
|