{"version":3,"file":"bitmapFontTextParser.mjs","sources":["../../../../src/scene/text-bitmap/asset/bitmapFontTextParser.ts"],"sourcesContent":["import type { BitmapFontData, RawCharData } from '../AbstractBitmapFont';\n\n/**\n * Internal data format used to convert to BitmapFontData.\n * @private\n */\nexport interface BitmapFontRawData\n{\n    info: {\n        face: string;\n        size: string;\n    }[];\n    common: { lineHeight: string, base: string }[];\n    page: {\n        id: string;\n        file: string;\n    }[];\n    chars: {\n        count: number;\n    }[];\n    char: {\n        id: string\n        page: string\n        xoffset: string\n        yoffset: string\n        xadvance: string,\n        x: string\n        y: string\n        width: string\n        height: string\n        letter?: string\n        char?: string\n    }[];\n    kernings?: {\n        count: number;\n    }[];\n    kerning?: {\n        first: string;\n        second: string;\n        amount: string;\n    }[];\n    distanceField?: {\n        fieldType: 'sdf' | 'msdf' | 'none';\n        distanceRange: string;\n    }[]\n}\n\nexport const bitmapFontTextParser = {\n    test(data: string | XMLDocument | BitmapFontData): boolean\n    {\n        return typeof data === 'string' && data.startsWith('info face=');\n    },\n\n    parse(txt: string): BitmapFontData\n    {\n        // Retrieve data item\n        const items = txt.match(/^[a-z]+\\s+.+$/gm);\n        const rawData: BitmapFontRawData = {\n            info: [],\n            common: [],\n            page: [],\n            char: [],\n            chars: [],\n            kerning: [],\n            kernings: [],\n            distanceField: [],\n        };\n\n        for (const i in items)\n        {\n            // Extract item name\n            const name = items[i].match(/^[a-z]+/gm)[0] as keyof BitmapFontRawData;\n\n            // Extract item attribute list as string ex.: \"width=10\"\n            const attributeList = items[i].match(/[a-zA-Z]+=([^\\s\"']+|\"([^\"]*)\")/gm);\n\n            // Convert attribute list into an object\n            const itemData: any = {};\n\n            for (const i in attributeList)\n            {\n                // Split key-value pairs\n                const split = attributeList[i].split('=');\n                const key = split[0];\n\n                // Remove eventual quotes from value\n                const strValue = split[1].replace(/\"/gm, '');\n\n                // Try to convert value into float\n                const floatValue = parseFloat(strValue);\n\n                // Use string value case float value is NaN\n                const value = isNaN(floatValue) ? strValue : floatValue;\n\n                itemData[key] = value;\n            }\n\n            // Push current item to the resulting data\n            rawData[name].push(itemData);\n        }\n\n        const font: BitmapFontData = {\n            chars: {},\n            pages: [],\n            lineHeight: 0,\n            fontSize: 0,\n            fontFamily: '',\n            distanceField: null,\n            baseLineOffset: 0,\n        };\n\n        const [info] = rawData.info;\n        const [common] = rawData.common;\n        const [distanceField] = rawData.distanceField ?? [];\n\n        if (distanceField)\n        {\n            font.distanceField = {\n                range: parseInt(distanceField.distanceRange, 10),\n                type: distanceField.fieldType\n            };\n        }\n\n        font.fontSize = parseInt(info.size, 10);\n        font.fontFamily = info.face;\n        font.lineHeight = parseInt(common.lineHeight, 10);\n\n        const page = rawData.page;\n\n        for (let i = 0; i < page.length; i++)\n        {\n            font.pages.push({\n                id: parseInt(page[i].id, 10) || 0,\n                file: page[i].file,\n            });\n        }\n\n        const map: Record<string, string> = {};\n\n        font.baseLineOffset = font.lineHeight - parseInt(common.base, 10);\n\n        const char = rawData.char;\n\n        for (let i = 0; i < char.length; i++)\n        {\n            const charNode = char[i];\n            const id = parseInt(charNode.id, 10);\n\n            let letter = charNode.letter ?? charNode.char ?? String.fromCharCode(id);\n\n            if (letter === 'space')letter = ' ';\n\n            map[id] = letter;\n\n            font.chars[letter] = {\n                id,\n                // texture deets..\n                page: parseInt(charNode.page, 10) || 0,\n                x: parseInt(charNode.x, 10),\n                y: parseInt(charNode.y, 10),\n                width: parseInt(charNode.width, 10),\n                height: parseInt(charNode.height, 10),\n                xOffset: parseInt(charNode.xoffset, 10),\n                yOffset: parseInt(charNode.yoffset, 10),\n                xAdvance: parseInt(charNode.xadvance, 10),\n                kerning: {},\n            } as RawCharData;\n        }\n\n        const kerning = rawData.kerning || [];\n\n        for (let i = 0; i < kerning.length; i++)\n        {\n            const first = parseInt(kerning[i].first, 10);\n            const second = parseInt(kerning[i].second, 10);\n            const amount = parseInt(kerning[i].amount, 10);\n\n            font.chars[map[second]].kerning[map[first]] = amount;\n        }\n\n        return font;\n    }\n};\n"],"names":["i"],"mappings":"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"}