UNPKG

@cf-wasm/og

Version:

Generate Open Graph Images dynamically from HTML/CSS without a browser.

73 lines (72 loc) 2.88 kB
const require_maps = require("./maps.cjs"); const require_cache = require("./cache.cjs"); const require_errors = require("./errors.cjs"); //#region src/core/emoji.ts /** Apis for loading emoji svg */ const EMOJI_APIS = { openmoji: (code) => `https://cdn.jsdelivr.net/npm/@svgmoji/openmoji@2.0.0/svg/${code.toUpperCase()}.svg`, blobmoji: (code) => `https://cdn.jsdelivr.net/npm/@svgmoji/blob@2.0.0/svg/${code.toUpperCase()}.svg`, noto: (code) => `https://cdn.jsdelivr.net/gh/svgmoji/svgmoji/packages/svgmoji__noto/svg/${code.toUpperCase()}.svg`, twemoji: (code) => `https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/${code.toLowerCase()}.svg`, fluent: (code) => `https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/${code.toLowerCase()}_color.svg`, fluentFlat: (code) => `https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/${code.toLowerCase()}_flat.svg` }; function toCodePoint(unicodeSurrogates) { const r = []; let c = 0; let p = 0; let i = 0; while (i < unicodeSurrogates.length) { c = unicodeSurrogates.charCodeAt(i); i += 1; if (p) { r.push((65536 + (p - 55296 << 10) + (c - 56320)).toString(16)); p = 0; } else if (55296 <= c && c <= 56319) p = c; else r.push(c.toString(16)); } return r.join("-"); } const U200D = String.fromCharCode(8205); const UFE0Fg = /\uFE0F/g; function getIconCode(char) { return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, "") : char); } /** Default emoji type */ const DEFAULT_EMOJI_TYPE = "twemoji"; /** * A helper function for loading emoji svg * * @param code The emoji code * @param type The {@link EmojiType} * @param cacheStore The Cache to be used for caching svg responses * * @returns The emoji's svg as string */ async function loadEmoji(code, type) { const apiType = !type || !EMOJI_APIS[type] ? DEFAULT_EMOJI_TYPE : type; const api = EMOJI_APIS[apiType]; const svgUrl = api(code); const fromMap = require_maps.EMOJI_CACHE_MAP.get(svgUrl); if (fromMap) return fromMap; const response = await require_cache.cache.serve(svgUrl, () => fetch(svgUrl).then((res) => { if (!res.ok) throw new require_errors.FetchError(`Response was not successful (status: \`${res.status}\`, statusText: \`${res.statusText}\`)`, { response: res }); return res; }).catch((e) => { throw new require_errors.FetchError(`An error ocurred while fetching \`${svgUrl}\``, { cause: e, response: e instanceof require_errors.FetchError ? e.response : void 0 }); })); response.headers.set("content-type", "text/xml"); const svgCode = await response.text(); require_maps.EMOJI_CACHE_MAP.set(svgUrl, svgCode); return svgCode; } //#endregion exports.DEFAULT_EMOJI_TYPE = DEFAULT_EMOJI_TYPE; exports.EMOJI_APIS = EMOJI_APIS; exports.getIconCode = getIconCode; exports.loadEmoji = loadEmoji; exports.toCodePoint = toCodePoint; //# sourceMappingURL=emoji.cjs.map