resolveFontFaceRules static method
Implementation
static void resolveFontFaceRules(CSSFontFaceRule fontFaceRule, double contextId, String? baseHref) {
CSSStyleDeclaration declaration = fontFaceRule.declarations;
String fontFamily = declaration.getPropertyValue('fontFamily');
String url = declaration.getPropertyValue('src');
String fontWeightStr = declaration.getPropertyValue('fontWeight');
String fontStyleStr = declaration.getPropertyValue('fontStyle');
if (fontFamily.isNotEmpty && url.isNotEmpty && CSSFunction.isFunction(url)) {
// Parse font weight
FontWeight fontWeight = _parseFontWeight(fontWeightStr);
// Parse font style
FontStyle fontStyle = fontStyleStr == 'italic' ? FontStyle.italic : FontStyle.normal;
List<CSSFunctionalNotation> functions = CSSFunction.parseFunction(url);
List<FontSource> fonts = [];
for(int i = 0; i < functions.length; i ++) {
CSSFunctionalNotation notation = functions[i];
if (notation.name == 'url') {
String tmpSrc = notation.args[0];
tmpSrc = removeQuotationMark(tmpSrc);
if (tmpSrc.startsWith('data')) {
String tmpContent = tmpSrc.split(';').last;
if (tmpContent.startsWith('base64')) {
String base64 = tmpSrc.split(',').last;
try {
Uint8List decoded = base64Decode(base64);
if (decoded.isNotEmpty) {
fonts.add(FontSource.content(decoded));
}
} catch (e) {
// Ignore invalid base64 font data.
}
}
} else {
String formatFromExt = tmpSrc.split('.').last;
fonts.add(FontSource(tmpSrc, formatFromExt));
}
}
}
FontSource? targetFont = fonts.firstWhereOrNull((f) {
return supportedFonts.contains(f.format);
});
if (targetFont == null) return;
// Store font descriptor for lazy loading
String cleanFontFamily = removeQuotationMark(fontFamily);
// Prefer property-specific baseHref if present (e.g., from imported CSS)
String? srcBaseHref = declaration.getPropertyBaseHref('src') ?? baseHref;
FontFaceDescriptor descriptor = FontFaceDescriptor(
fontFamily: cleanFontFamily,
fontWeight: fontWeight,
fontStyle: fontStyle,
font: targetFont,
contextId: contextId,
baseHref: srcBaseHref,
);
_fontFaceRegistry.putIfAbsent(cleanFontFamily, () => []).add(descriptor);
}
}