@bonniernews/abbe-api-utils
Version:
Utilities for converting to Abbe article format
157 lines (156 loc) • 4.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createQuote = exports.createImageCollection = exports.createEmbed = exports.createImage = exports.createStyledText = exports.createTextBlock = exports.createHeadlineBlock = exports.createPreambleBlock = exports.createTitleBlock = void 0;
const types_1 = require("./types/types");
const utils_1 = require("./utils");
const createTitleBlock = (text) => {
return {
...(0, utils_1.initBlock)(),
text,
type: types_1.BlockType.TITLE,
};
};
exports.createTitleBlock = createTitleBlock;
const createPreambleBlock = (text) => {
return {
...(0, utils_1.initBlock)(),
text,
type: types_1.BlockType.PREAMBLE,
};
};
exports.createPreambleBlock = createPreambleBlock;
const createHeadlineBlock = (text) => {
return {
...(0, utils_1.initBlock)(),
text,
type: types_1.BlockType.HEADLINE,
};
};
exports.createHeadlineBlock = createHeadlineBlock;
const createTextBlock = (text) => {
return {
...(0, utils_1.initBlock)(),
text,
};
};
exports.createTextBlock = createTextBlock;
const createEntityRangeItem = (link, key) => {
return {
offset: link.position.offset,
length: link.position.length,
key,
};
};
const createEntityMapItem = (link) => {
if (!link.url) {
throw new Error(`Missing url for link style: ${JSON.stringify(link)}`);
}
return {
type: "LINK",
mutability: "MUTABLE",
data: {
url: link.url,
href: link.url,
},
};
};
const createEntityRanges = (styles, nextEntityMapIndex) => {
const linkStyles = styles.filter((s) => s.style === types_1.Style.LINK);
const entityRanges = linkStyles.map((link, i) => createEntityRangeItem(link, nextEntityMapIndex + i));
const entityMap = linkStyles.reduce((obj, link, i) => {
obj[nextEntityMapIndex + i] = createEntityMapItem(link);
return obj;
}, {});
return { entityRanges, entityMap };
};
const createStyledText = (text, styles, nextEntityMapIndex) => {
(0, utils_1.validateStyle)(text, styles);
const inlineStyleRanges = (0, utils_1.createInlineStyleRanges)(styles);
const { entityRanges, entityMap } = createEntityRanges(styles, nextEntityMapIndex);
return {
block: {
...(0, utils_1.initBlock)(),
text,
entityRanges,
inlineStyleRanges,
},
entityMap,
};
};
exports.createStyledText = createStyledText;
const createImageData = (image, key) => {
var _a;
return ({
type: "image",
blockKey: key || (0, utils_1.initBlock)().key,
caption: image.caption,
mediaPath: "",
photoAuthors: (_a = image.photoAuthor) !== null && _a !== void 0 ? _a : "",
imageUuid: image.uuid,
softCrops: !(0, utils_1.objectIsEmpty)(image.softCrops) ? image.softCrops : undefined,
});
};
const createImage = (image) => {
const initialBlock = (0, utils_1.initBlock)();
return {
...initialBlock,
type: types_1.BlockType.IMAGE,
data: createImageData(image, initialBlock.key),
};
};
exports.createImage = createImage;
const createEmbed = ({ embedUuid, externalId, }) => {
const initialBlock = (0, utils_1.initBlock)();
const blockKey = initialBlock.key;
return {
...initialBlock,
type: types_1.BlockType.EMBED,
data: {
type: "embed-plugin",
blockKey,
externalId: externalId,
embedUuid,
},
};
};
exports.createEmbed = createEmbed;
const createImageCollection = (images) => {
const initialBlock = (0, utils_1.initBlock)();
const mediaCollection = images.map((image) => ({
...createImageData(image),
}));
return {
...initialBlock,
type: types_1.BlockType.IMAGE_COLLECTION,
data: {
type: "mediaCollection",
blockKey: initialBlock.key,
mediaCollection,
},
};
};
exports.createImageCollection = createImageCollection;
const createQuote = (text, author) => {
const blocks = [];
const quoteBlock = {
...(0, utils_1.initBlock)(),
type: types_1.BlockType.QUOTE,
text,
};
blocks.push(quoteBlock);
if (author) {
const authorText = `- ${author}`;
const style = [
{
style: types_1.Style.ITALIC,
position: { offset: 0, length: authorText.length },
},
];
const { block } = (0, exports.createStyledText)(authorText, style, 0);
const emptyBlock = (0, exports.createTextBlock)("");
blocks.push(block);
blocks.push(emptyBlock);
}
return blocks;
};
exports.createQuote = createQuote;