feat: add boolean section support

This commit is contained in:
Hugo Pointcheval 2023-01-27 15:09:33 +01:00
parent 1d72075410
commit c47585a18e
Signed by: hugo
GPG Key ID: 3AAC487E131E00BC
2 changed files with 109 additions and 0 deletions

View File

@ -112,6 +112,7 @@ class Brickgen {
// Convert compilable values -> variables (in files)
FileSystem.convertCompilableVariablesInFolder(config, targetPath!);
FileSystem.convertBooleanVariablesInFolder(config, targetPath!);
Logger.info('Files content converted with variables.');
// Create `.gitkeep` in empty folders (to keep them in brick generation)

View File

@ -19,6 +19,7 @@ import 'dart:io';
import 'package:brick_generator/core/logger.dart';
import 'package:brick_generator/core/shell.dart';
import 'package:brick_generator/models/brick_config.dart';
import 'package:brick_generator/models/brick_variable_boolean.dart';
import 'package:brick_generator/models/brick_variable_string.dart';
import 'package:brick_generator/models/ignore_list.dart';
import 'package:path/path.dart';
@ -262,6 +263,113 @@ abstract class FileSystem {
});
}
static void convertBooleanVariablesInFolder(
BrickConfig config,
String targetPath,
) {
if (!FileSystemEntity.isDirectorySync(targetPath)) {
throw ArgumentError('Target must be a directory', 'targetPath');
}
Directory(targetPath)
.listSync(recursive: true)
.whereType<File>()
.forEach((file) {
String? contents;
try {
contents = file.readAsStringSync();
} catch (e) {
// Ignore decode error
return;
}
/// Defines differents prefixes used in comments in differents languages,
/// such as Dart, Yaml or Python for example.
final prefixes = [r'\/\/\/', '###'];
config.variables.whereType<BrickVariableBoolean>().forEach((variable) {
for (final prefix in prefixes) {
final trueGroups = RegExp(
'^' +
prefix +
r'\s*{{#(.*)}}\n((?:.*\n)*?)' +
prefix +
r'\s*{{\/(.*)}}',
multiLine: true,
);
final falseGroups = RegExp(
'^' +
prefix +
r'\s*{{\^(.*)}}\n((?:.*\n)*?)' +
prefix +
r'\s*{{\/(.*)}}',
multiLine: true,
);
final trueContents = contents?.replaceAllMapped(trueGroups, (match) {
if (match.group(1) == variable.name) {
// Match a bloc define by the variable
// Clean bloc content from his potential prefix
final cleaned = match.group(2)?.splitMapJoin(
'\n',
onMatch: (m) => '${m[0]}',
onNonMatch: (str) => str.replaceFirst(prefix, ''),
) ??
'';
Logger.debug(
'Boolean section `${variable.name}` (true) '
'converted in ${file.path} (match: $trueGroups)',
);
return '''
{{#${variable.name}}}
$cleaned
{{/${variable.name}}}
''';
} else {
return match[0] ?? '';
}
});
contents = trueContents;
final falseContents =
contents?.replaceAllMapped(falseGroups, (match) {
if (match.group(1) == variable.name) {
// Match a bloc define by the variable
// Clean bloc content from his potential prefix
final cleaned = match.group(2)?.splitMapJoin(
'\n',
onMatch: (m) => '${m[0]}',
onNonMatch: (str) => str.replaceFirst(prefix, ''),
) ??
'';
Logger.debug(
'Boolean section `${variable.name}` (false) '
'converted in ${file.path} (match: $falseGroups)',
);
return '''
{{^${variable.name}}}
$cleaned
{{/${variable.name}}}
''';
} else {
return match[0] ?? '';
}
});
contents = falseContents;
}
});
file.writeAsStringSync(contents!);
});
}
static void createGitKeepInEmptyFolders(String targetPath) {
if (!FileSystemEntity.isDirectorySync(targetPath)) {
throw ArgumentError('Target must be a directory', 'targetPath');