{"version":3,"file":"loadWebFont.mjs","sources":["../../../src/loader/parsers/loadWebFont.ts"],"sourcesContent":["import { extensions, ExtensionType, settings, utils } from 'pixijs/core';\nimport { checkDataUrl } from '../../utils/checkDataUrl';\nimport { checkExtension } from '../../utils/checkExtension';\nimport { LoaderParserPriority } from './LoaderParser';\n\nimport type { LoadAsset } from '../types';\nimport type { LoaderParser } from './LoaderParser';\n\nconst validWeights = [\n    'normal', 'bold',\n    '100', '200', '300', '400', '500', '600', '700', '800', '900',\n];\nconst validFontExtensions = ['.ttf', '.otf', '.woff', '.woff2'];\nconst validFontMIMEs = [\n    'font/ttf',\n    'font/otf',\n    'font/woff',\n    'font/woff2',\n];\n\nexport type LoadFontData = {\n    family: string;\n    display: string;\n    featureSettings: string;\n    stretch: string;\n    style: string;\n    unicodeRange: string;\n    variant: string;\n    weights: string[];\n};\n\n/**\n * Return font face name from a file name\n * Ex.: 'fonts/tital-one.woff' turns into 'Titan One'\n * @param url - File url\n */\nexport function getFontFamilyName(url: string): string\n{\n    const ext = utils.path.extname(url);\n    const name = utils.path.basename(url, ext);\n\n    // Replace dashes by white spaces\n    const nameWithSpaces = name.replace(/(-|_)/g, ' ');\n\n    // Upper case first character of each word\n    const nameTitleCase = nameWithSpaces.toLowerCase()\n        .split(' ')\n        .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n        .join(' ');\n\n    return nameTitleCase;\n}\n\n/** Web font loader plugin */\nexport const loadWebFont = {\n    extension: {\n        type: ExtensionType.LoadParser,\n        priority: LoaderParserPriority.Low,\n    },\n\n    test(url: string): boolean\n    {\n        return checkDataUrl(url, validFontMIMEs) || checkExtension(url, validFontExtensions);\n    },\n\n    async load(url: string, options?: LoadAsset<LoadFontData>): Promise<FontFace | FontFace[]>\n    {\n        const fonts = settings.ADAPTER.getFontFaceSet();\n\n        if (fonts)\n        {\n            const fontFaces: FontFace[] = [];\n            const name = options.data?.family ?? getFontFamilyName(url);\n            const weights = options.data?.weights?.filter((weight) => validWeights.includes(weight)) ?? ['normal'];\n            const data = options.data ?? {};\n\n            for (let i = 0; i < weights.length; i++)\n            {\n                const weight = weights[i];\n\n                const font = new FontFace(name, `url(${encodeURI(url)})`, {\n                    ...data,\n                    weight,\n                });\n\n                await font.load();\n\n                fonts.add(font);\n\n                fontFaces.push(font);\n            }\n\n            return fontFaces.length === 1 ? fontFaces[0] : fontFaces;\n        }\n\n        // #if _DEBUG\n        console.warn('[loadWebFont] FontFace API is not supported. Skipping loading font');\n        // #endif\n\n        return null;\n    },\n\n    unload(font: FontFace | FontFace[]): void\n    {\n        (Array.isArray(font) ? font : [font])\n            .forEach((t) => settings.ADAPTER.getFontFaceSet().delete(t));\n    }\n} as LoaderParser<FontFace | FontFace[]>;\n\nextensions.add(loadWebFont);\n"],"names":[],"mappings":"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"}