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<_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);
  }
}