parseTemplateAreas static method

GridTemplateAreasDefinition? parseTemplateAreas(
  1. String value
)

Implementation

static GridTemplateAreasDefinition? parseTemplateAreas(String value) {
  final String trimmed = value.trim();
  if (trimmed.isEmpty || trimmed.toLowerCase() == 'none') {
    return const GridTemplateAreasDefinition(
      areas: <String, GridTemplateAreaRect>{},
      rowCount: 0,
      columnCount: 0,
      cssText: 'none',
    );
  }

  final RegExp rowPattern = RegExp(r'"([^"]*)"');
  final List<RegExpMatch> matches = rowPattern.allMatches(trimmed).toList();
  if (matches.isEmpty) return null;

  final List<List<String>> rows = <List<String>>[];
  for (final RegExpMatch match in matches) {
    final String rowText = match.group(1)!;
    final String normalized = rowText.trim();
    if (normalized.isEmpty) return null;
    final List<String> tokens =
        normalized.split(RegExp(r'\s+')).map((token) => token.trim()).where((token) => token.isNotEmpty).toList();
    if (tokens.isEmpty) return null;
    rows.add(tokens);
  }

  final int columnCount = rows.first.length;
  if (columnCount == 0) return null;
  for (final List<String> tokens in rows) {
    if (tokens.length != columnCount) return null;
  }

  final Map<String, _GridAreaBuilder> builders = <String, _GridAreaBuilder>{};
  for (int r = 0; r < rows.length; r++) {
    final List<String> tokens = rows[r];
    for (int c = 0; c < tokens.length; c++) {
      final String name = tokens[c];
      if (name == '.' || name.isEmpty) continue;
      final _GridAreaBuilder builder = builders.putIfAbsent(name, () => _GridAreaBuilder(r + 1, c + 1));
      builder.include(r + 1, c + 1);
    }
  }

  final Map<String, GridTemplateAreaRect> rects = <String, GridTemplateAreaRect>{};
  for (final MapEntry<String, _GridAreaBuilder> entry in builders.entries) {
    final _GridAreaBuilder builder = entry.value;
    for (int r = builder.minRow; r <= builder.maxRow; r++) {
      for (int c = builder.minCol; c <= builder.maxCol; c++) {
        if (rows[r - 1][c - 1] != entry.key) {
          return null;
        }
      }
    }
    rects[entry.key] =
        GridTemplateAreaRect(builder.minRow, builder.maxRow + 1, builder.minCol, builder.maxCol + 1);
  }

  return GridTemplateAreasDefinition(
    areas: rects,
    rowCount: rows.length,
    columnCount: columnCount,
    cssText: trimmed,
  );
}