dataUrl.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. var isDataUrl = require('./isDataUrl');
  2. var trim = require('./trim');
  3. var endWith = require('./endWith');
  4. var startWith = require('./startWith');
  5. var contain = require('./contain');
  6. var decodeUriComponent = require('./decodeUriComponent');
  7. var defaults = require('./defaults');
  8. var isStr = require('./isStr');
  9. var convertBin = require('./convertBin');
  10. exports = {
  11. parse: function(dataUrl) {
  12. if (!isDataUrl(dataUrl)) {
  13. return null;
  14. }
  15. dataUrl = dataUrl.slice('data:'.length);
  16. var commaIdx = dataUrl.indexOf(',');
  17. var mime = trim(dataUrl.slice(0, commaIdx));
  18. var data = trim(dataUrl.slice(commaIdx + 1));
  19. var base64 = false;
  20. if (endWith(mime, ';base64')) {
  21. base64 = true;
  22. mime = mime.slice(0, -';base64'.length);
  23. }
  24. var charset = '';
  25. if (contain(mime, 'charset=')) {
  26. charset = mime.split('charset=')[1];
  27. mime = mime.split(';')[0];
  28. }
  29. if (!mime) {
  30. mime = 'text/plain';
  31. }
  32. if (!base64 && startWith(mime, 'text/') && contain(data, '%')) {
  33. data = decodeUriComponent(data);
  34. }
  35. return {
  36. data: data,
  37. mime: mime,
  38. charset: charset,
  39. base64: base64
  40. };
  41. },
  42. stringify: function(data, mime) {
  43. var options =
  44. arguments.length > 2 && arguments[2] !== undefined
  45. ? arguments[2]
  46. : {};
  47. defaults(options, {
  48. base64: true,
  49. charset: ''
  50. });
  51. var result = 'data:' + mime;
  52. if (options.charset && startWith(mime, 'text/')) {
  53. result += ';charset=' + options.charset;
  54. }
  55. if (!isStr(data)) {
  56. data = convertBin(data, 'base64');
  57. options.base64 = true;
  58. }
  59. if (options.base64) {
  60. result += ';base64';
  61. } else if (startWith(mime, 'text/') || !mime) {
  62. data = encodeURIComponent(data);
  63. }
  64. return result + ',' + data;
  65. }
  66. };
  67. module.exports = exports;