UNPKG

@bonniernews/abbe-api-utils

Version:

Utilities for converting to Abbe article format

157 lines (156 loc) 4.86 kB
"use strict"; 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;