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<_Font> fonts = [];
for(int i = 0; i < functions.length; i ++) {
CSSFunctionalNotation notation = functions[i];
if (notation.name == 'url') {
String tmp_src = notation.args[0];
tmp_src = removeQuotationMark(tmp_src);
if (tmp_src.startsWith('data')) {
String tmp_content = tmp_src.split(';').last;
if (tmp_content.startsWith('base64')) {
String base64 = tmp_src.split(',').last;
try {
Uint8List decoded = base64Decode(base64);
if (decoded.isNotEmpty) {
fonts.add(_Font.content(decoded));
}
} catch(e) {}
}
} else {
String formatFromExt = tmp_src.split('.').last;
fonts.add(_Font(tmp_src, formatFromExt));
}
}
}
_Font? 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);
}
}