Files
nothoughts/node_modules/pixi.js/lib/scene/text-bitmap/asset/bitmapFontTextParser.mjs
2025-08-04 18:57:35 +02:00

97 lines
2.9 KiB
JavaScript

"use strict";
const bitmapFontTextParser = {
test(data) {
return typeof data === "string" && data.startsWith("info face=");
},
parse(txt) {
const items = txt.match(/^[a-z]+\s+.+$/gm);
const rawData = {
info: [],
common: [],
page: [],
char: [],
chars: [],
kerning: [],
kernings: [],
distanceField: []
};
for (const i in items) {
const name = items[i].match(/^[a-z]+/gm)[0];
const attributeList = items[i].match(/[a-zA-Z]+=([^\s"']+|"([^"]*)")/gm);
const itemData = {};
for (const i2 in attributeList) {
const split = attributeList[i2].split("=");
const key = split[0];
const strValue = split[1].replace(/"/gm, "");
const floatValue = parseFloat(strValue);
const value = isNaN(floatValue) ? strValue : floatValue;
itemData[key] = value;
}
rawData[name].push(itemData);
}
const font = {
chars: {},
pages: [],
lineHeight: 0,
fontSize: 0,
fontFamily: "",
distanceField: null,
baseLineOffset: 0
};
const [info] = rawData.info;
const [common] = rawData.common;
const [distanceField] = rawData.distanceField ?? [];
if (distanceField) {
font.distanceField = {
range: parseInt(distanceField.distanceRange, 10),
type: distanceField.fieldType
};
}
font.fontSize = parseInt(info.size, 10);
font.fontFamily = info.face;
font.lineHeight = parseInt(common.lineHeight, 10);
const page = rawData.page;
for (let i = 0; i < page.length; i++) {
font.pages.push({
id: parseInt(page[i].id, 10) || 0,
file: page[i].file
});
}
const map = {};
font.baseLineOffset = font.lineHeight - parseInt(common.base, 10);
const char = rawData.char;
for (let i = 0; i < char.length; i++) {
const charNode = char[i];
const id = parseInt(charNode.id, 10);
let letter = charNode.letter ?? charNode.char ?? String.fromCharCode(id);
if (letter === "space")
letter = " ";
map[id] = letter;
font.chars[letter] = {
id,
// texture deets..
page: parseInt(charNode.page, 10) || 0,
x: parseInt(charNode.x, 10),
y: parseInt(charNode.y, 10),
width: parseInt(charNode.width, 10),
height: parseInt(charNode.height, 10),
xOffset: parseInt(charNode.xoffset, 10),
yOffset: parseInt(charNode.yoffset, 10),
xAdvance: parseInt(charNode.xadvance, 10),
kerning: {}
};
}
const kerning = rawData.kerning || [];
for (let i = 0; i < kerning.length; i++) {
const first = parseInt(kerning[i].first, 10);
const second = parseInt(kerning[i].second, 10);
const amount = parseInt(kerning[i].amount, 10);
font.chars[map[second]].kerning[map[first]] = amount;
}
return font;
}
};
export { bitmapFontTextParser };
//# sourceMappingURL=bitmapFontTextParser.mjs.map