feat: add boolean section support
This commit is contained in:
parent
1d72075410
commit
c47585a18e
@ -112,6 +112,7 @@ class Brickgen {
|
|||||||
|
|
||||||
// Convert compilable values -> variables (in files)
|
// Convert compilable values -> variables (in files)
|
||||||
FileSystem.convertCompilableVariablesInFolder(config, targetPath!);
|
FileSystem.convertCompilableVariablesInFolder(config, targetPath!);
|
||||||
|
FileSystem.convertBooleanVariablesInFolder(config, targetPath!);
|
||||||
Logger.info('Files content converted with variables.');
|
Logger.info('Files content converted with variables.');
|
||||||
|
|
||||||
// Create `.gitkeep` in empty folders (to keep them in brick generation)
|
// Create `.gitkeep` in empty folders (to keep them in brick generation)
|
||||||
|
@ -19,6 +19,7 @@ import 'dart:io';
|
|||||||
import 'package:brick_generator/core/logger.dart';
|
import 'package:brick_generator/core/logger.dart';
|
||||||
import 'package:brick_generator/core/shell.dart';
|
import 'package:brick_generator/core/shell.dart';
|
||||||
import 'package:brick_generator/models/brick_config.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/brick_variable_string.dart';
|
||||||
import 'package:brick_generator/models/ignore_list.dart';
|
import 'package:brick_generator/models/ignore_list.dart';
|
||||||
import 'package:path/path.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) {
|
static void createGitKeepInEmptyFolders(String targetPath) {
|
||||||
if (!FileSystemEntity.isDirectorySync(targetPath)) {
|
if (!FileSystemEntity.isDirectorySync(targetPath)) {
|
||||||
throw ArgumentError('Target must be a directory', 'targetPath');
|
throw ArgumentError('Target must be a directory', 'targetPath');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user