@atlaskit/editor-wikimarkup-transformer
Version:
Wiki markup transformer for JIRA and Confluence
94 lines (93 loc) • 4.76 kB
JavaScript
import { LINK_TEXT_REGEXP } from '../tokenize/link-text';
const defaultWidth = 200;
const defaultHeight = 183;
const clamp = (input, lower, upper) => {
if (upper !== undefined) {
input = input <= upper ? input : upper;
}
if (lower !== undefined) {
input = input >= lower ? input : lower;
}
return input;
};
export default function getMediaSingleNodeView(schema, filename, attrs, context = {}) {
var _context$defaults, _context$defaults$med, _context$defaults3, _context$defaults3$me;
const {
media,
mediaSingle
} = schema.nodes;
const {
link
} = schema.marks;
const mediaMarks = [];
let mediaNodeAttrs = {};
if ((context === null || context === void 0 ? void 0 : (_context$defaults = context.defaults) === null || _context$defaults === void 0 ? void 0 : (_context$defaults$med = _context$defaults.media) === null || _context$defaults$med === void 0 ? void 0 : _context$defaults$med.width) !== null) {
var _context$defaults$med2, _context$defaults2, _context$defaults2$me;
mediaNodeAttrs.width = (_context$defaults$med2 = context === null || context === void 0 ? void 0 : (_context$defaults2 = context.defaults) === null || _context$defaults2 === void 0 ? void 0 : (_context$defaults2$me = _context$defaults2.media) === null || _context$defaults2$me === void 0 ? void 0 : _context$defaults2$me.width) !== null && _context$defaults$med2 !== void 0 ? _context$defaults$med2 : defaultWidth;
}
if ((context === null || context === void 0 ? void 0 : (_context$defaults3 = context.defaults) === null || _context$defaults3 === void 0 ? void 0 : (_context$defaults3$me = _context$defaults3.media) === null || _context$defaults3$me === void 0 ? void 0 : _context$defaults3$me.height) !== null) {
var _context$defaults$med3, _context$defaults4, _context$defaults4$me;
mediaNodeAttrs.height = (_context$defaults$med3 = context === null || context === void 0 ? void 0 : (_context$defaults4 = context.defaults) === null || _context$defaults4 === void 0 ? void 0 : (_context$defaults4$me = _context$defaults4.media) === null || _context$defaults4$me === void 0 ? void 0 : _context$defaults4$me.height) !== null && _context$defaults$med3 !== void 0 ? _context$defaults$med3 : defaultHeight;
}
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const mediaSingleAttrs = {
layout: 'center'
};
if (attrs.width && attrs.width.endsWith('%')) {
const parsed = parseInt(attrs.width, 10);
if (!isNaN(parsed)) {
mediaSingleAttrs.width = clamp(parsed, 0, 100);
}
mediaNodeAttrs = {};
} else {
if (attrs.width) {
const parsed = parseInt(attrs.width, 10);
if (!isNaN(parsed)) {
mediaNodeAttrs.width = parsed;
}
}
if (attrs.height) {
const parsed = parseInt(attrs.height, 10);
if (!isNaN(parsed)) {
mediaNodeAttrs.height = parsed;
}
}
}
if (attrs.href) {
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
const href = attrs.href.replace(/^"(.+)"$/, '$1');
mediaMarks.push(link.create({
href
}));
}
if (attrs.alt) {
// strip wrapping quotes if they exist
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
const altText = attrs.alt.replace(/^"(.+)"$/, '$1');
mediaNodeAttrs.alt = altText;
}
if (filename.match(LINK_TEXT_REGEXP)) {
const externalMediaNode = media.createChecked({
type: 'external',
url: filename,
...mediaNodeAttrs
}, undefined, mediaMarks);
return mediaSingle.createChecked(mediaSingleAttrs, externalMediaNode);
} else {
var _context$conversion$m, _context$conversion, _context$conversion$m2, _context$conversion$m3;
// try to look up media ID from conversion context
const id = (_context$conversion$m = context === null || context === void 0 ? void 0 : (_context$conversion = context.conversion) === null || _context$conversion === void 0 ? void 0 : (_context$conversion$m2 = _context$conversion.mediaConversion) === null || _context$conversion$m2 === void 0 ? void 0 : (_context$conversion$m3 = _context$conversion$m2[filename]) === null || _context$conversion$m3 === void 0 ? void 0 : _context$conversion$m3.transform) !== null && _context$conversion$m !== void 0 ? _context$conversion$m : filename;
// try to look up collection from media context
const collection = context.hydration && context.hydration.media && context.hydration.media.targetCollectionId;
const mediaNode = media.createChecked({
id,
type: 'file',
collection: collection || '',
...mediaNodeAttrs
}, undefined, mediaMarks);
return mediaSingle.createChecked(mediaSingleAttrs, mediaNode);
}
}