resolveFontFaceRules static method

void resolveFontFaceRules(
  1. CSSFontFaceRule fontFaceRule,
  2. double contextId,
  3. String? baseHref
)

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,
      sheetId: null,
    );

    _fontFaceRegistry.putIfAbsent(cleanFontFamily, () => []).add(descriptor);
  }
}