@wordpress/block-library
Version:
Block library for the WordPress editor.
220 lines (207 loc) • 5.91 kB
JavaScript
import { createElement } from "@wordpress/element";
/**
* External dependencies
*/
import { includes } from 'lodash';
/**
* WordPress dependencies
*/
import { __, _x } from '@wordpress/i18n';
import { createBlobURL } from '@wordpress/blob';
import { createBlock } from '@wordpress/blocks';
import { select } from '@wordpress/data';
import { RichText } from '@wordpress/block-editor';
/**
* Internal dependencies
*/
import edit from './edit';
import icon from './icon';
export var name = 'core/file';
export var settings = {
title: __('File'),
description: __('Add a link to a downloadable file.'),
icon: icon,
category: 'common',
keywords: [__('document'), __('pdf')],
attributes: {
id: {
type: 'number'
},
href: {
type: 'string'
},
fileName: {
type: 'string',
source: 'html',
selector: 'a:not([download])'
},
// Differs to the href when the block is configured to link to the attachment page
textLinkHref: {
type: 'string',
source: 'attribute',
selector: 'a:not([download])',
attribute: 'href'
},
// e.g. `_blank` when the block is configured to open in a new tab
textLinkTarget: {
type: 'string',
source: 'attribute',
selector: 'a:not([download])',
attribute: 'target'
},
showDownloadButton: {
type: 'boolean',
default: true
},
downloadButtonText: {
type: 'string',
source: 'html',
selector: 'a[download]',
default: _x('Download', 'button label')
}
},
supports: {
align: true
},
transforms: {
from: [{
type: 'files',
isMatch: function isMatch(files) {
return files.length > 0;
},
// We define a lower priorty (higher number) than the default of 10. This
// ensures that the File block is only created as a fallback.
priority: 15,
transform: function transform(files) {
var blocks = [];
files.forEach(function (file) {
var blobURL = createBlobURL(file); // File will be uploaded in componentDidMount()
blocks.push(createBlock('core/file', {
href: blobURL,
fileName: file.name,
textLinkHref: blobURL
}));
});
return blocks;
}
}, {
type: 'block',
blocks: ['core/audio'],
transform: function transform(attributes) {
return createBlock('core/file', {
href: attributes.src,
fileName: attributes.caption,
textLinkHref: attributes.src,
id: attributes.id
});
}
}, {
type: 'block',
blocks: ['core/video'],
transform: function transform(attributes) {
return createBlock('core/file', {
href: attributes.src,
fileName: attributes.caption,
textLinkHref: attributes.src,
id: attributes.id
});
}
}, {
type: 'block',
blocks: ['core/image'],
transform: function transform(attributes) {
return createBlock('core/file', {
href: attributes.url,
fileName: attributes.caption,
textLinkHref: attributes.url,
id: attributes.id
});
}
}],
to: [{
type: 'block',
blocks: ['core/audio'],
isMatch: function isMatch(_ref) {
var id = _ref.id;
if (!id) {
return false;
}
var _select = select('core'),
getMedia = _select.getMedia;
var media = getMedia(id);
return !!media && includes(media.mime_type, 'audio');
},
transform: function transform(attributes) {
return createBlock('core/audio', {
src: attributes.href,
caption: attributes.fileName,
id: attributes.id
});
}
}, {
type: 'block',
blocks: ['core/video'],
isMatch: function isMatch(_ref2) {
var id = _ref2.id;
if (!id) {
return false;
}
var _select2 = select('core'),
getMedia = _select2.getMedia;
var media = getMedia(id);
return !!media && includes(media.mime_type, 'video');
},
transform: function transform(attributes) {
return createBlock('core/video', {
src: attributes.href,
caption: attributes.fileName,
id: attributes.id
});
}
}, {
type: 'block',
blocks: ['core/image'],
isMatch: function isMatch(_ref3) {
var id = _ref3.id;
if (!id) {
return false;
}
var _select3 = select('core'),
getMedia = _select3.getMedia;
var media = getMedia(id);
return !!media && includes(media.mime_type, 'image');
},
transform: function transform(attributes) {
return createBlock('core/image', {
url: attributes.href,
caption: attributes.fileName,
id: attributes.id
});
}
}]
},
edit: edit,
save: function save(_ref4) {
var attributes = _ref4.attributes;
var href = attributes.href,
fileName = attributes.fileName,
textLinkHref = attributes.textLinkHref,
textLinkTarget = attributes.textLinkTarget,
showDownloadButton = attributes.showDownloadButton,
downloadButtonText = attributes.downloadButtonText;
return href && createElement("div", null, !RichText.isEmpty(fileName) && createElement("a", {
href: textLinkHref,
target: textLinkTarget,
rel: textLinkTarget ? 'noreferrer noopener' : false
}, createElement(RichText.Content, {
value: fileName
})), showDownloadButton && createElement("a", {
href: href,
className: "wp-block-file__button",
download: true
}, createElement(RichText.Content, {
value: downloadButtonText
})));
}
};
//# sourceMappingURL=index.js.map