parseTemplateAreas static method
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,
);
}