extractOpenGraph method

List<StructuredDataExtractionResult> extractOpenGraph(
  1. String html
)

Extracts Open Graph data from HTML

Implementation

List<StructuredDataExtractionResult> extractOpenGraph(String html) {
  final document = html_parser.parse(html);
  final results = <StructuredDataExtractionResult>[];

  try {
    // Find all meta tags with property starting with "og:"
    final metaTags = document.querySelectorAll('meta[property^="og:"]');

    if (metaTags.isEmpty) {
      return results;
    }

    final data = <String, dynamic>{};

    for (final metaTag in metaTags) {
      final property = metaTag.attributes['property'];
      final content = metaTag.attributes['content'];

      if (property != null && content != null) {
        // Remove the "og:" prefix
        final key = property.substring(3);

        // Handle arrays (e.g., og:image, og:image:width, og:image:height)
        if (key.contains(':')) {
          final parts = key.split(':');
          final mainKey = parts[0];
          final subKey = parts.sublist(1).join(':');

          if (!data.containsKey(mainKey)) {
            data[mainKey] = <String, dynamic>{};
          } else if (data[mainKey] is! Map) {
            // If it's already a string, convert to a map with 'url' key
            data[mainKey] = {'url': data[mainKey]};
          }

          if (data[mainKey] is Map) {
            (data[mainKey] as Map<String, dynamic>)[subKey] = content;
          }
        } else {
          data[key] = content;
        }
      }
    }

    if (data.isNotEmpty) {
      // Add type information
      data['@type'] = 'OpenGraph';

      results.add(
        StructuredDataExtractionResult(
          type: StructuredDataType.openGraph,
          data: data,
          rawData: metaTags.map((e) => e.outerHtml).join('\n'),
        ),
      );
    }

    logger?.info('Extracted ${results.length} Open Graph items');
  } catch (e) {
    logger?.error('Error extracting Open Graph data: $e');
  }

  return results;
}