You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
96 lines
2.5 KiB
import 'dart:io';
|
|
import 'parse_arguments.dart';
|
|
import 'expressions/expressions.dart';
|
|
|
|
String? exp;
|
|
late String mode;
|
|
late String flavor;
|
|
|
|
enum STATE {
|
|
none,
|
|
notMatch,
|
|
caching,
|
|
replace,
|
|
}
|
|
|
|
void main(List<String> arguments) {
|
|
print("Running default pre_script.");
|
|
var args = parse(arguments);
|
|
mode = args.mode;
|
|
flavor = args.flavor;
|
|
|
|
var rootDir = Directory('./');
|
|
rootDir.listSync().forEach(walkPath);
|
|
}
|
|
|
|
File? file;
|
|
StringBuffer sb = StringBuffer();
|
|
StringBuffer tmp = StringBuffer();
|
|
STATE state = STATE.none;
|
|
RegExp re = RegExp(r'// #\{\{(.+)\}\}');
|
|
|
|
Match? ma;
|
|
bool modified = false;
|
|
|
|
const evaluator = const ExpressionEvaluator();
|
|
|
|
void walkPath(FileSystemEntity path) {
|
|
var stat = path.statSync();
|
|
if (stat.type == FileSystemEntityType.directory) {
|
|
Directory(path.path).listSync().forEach(walkPath);
|
|
} else if (stat.type == FileSystemEntityType.file) {
|
|
file = File(path.path);
|
|
sb.clear();
|
|
modified = false;
|
|
try {
|
|
file!.readAsLinesSync().forEach((line) {
|
|
ma = re.firstMatch(line);
|
|
if (ma != null) {
|
|
modified = true;
|
|
exp = ma!.group(1);
|
|
if (exp == "default") {
|
|
// 默认代码块开始
|
|
if (tmp.isNotEmpty) {
|
|
sb.write(tmp);
|
|
state = STATE.replace;
|
|
} else {
|
|
state = STATE.none;
|
|
}
|
|
} else if (exp == "end") {
|
|
// 默认代码块结束
|
|
state = STATE.none;
|
|
tmp.clear();
|
|
} else {
|
|
if (evaluator.eval(
|
|
Expression.parse(exp!), {'mode': mode, 'flavor': flavor})) {
|
|
// 匹配到
|
|
tmp.clear();
|
|
state = STATE.caching;
|
|
} else {
|
|
state = STATE.notMatch;
|
|
}
|
|
}
|
|
} else {
|
|
// none状态时直接将line写入sb
|
|
if (state == STATE.none) {
|
|
sb.writeln(line);
|
|
}
|
|
// 缓存中状态,将用于替换的内容移除注释后写入缓存
|
|
else if (state == STATE.caching)
|
|
tmp.writeln(line.replaceFirst('// ', ''));
|
|
// 这样就跳过了没有匹配上的替换代码块和默认内容
|
|
}
|
|
});
|
|
if (modified) {
|
|
// file!.renameSync(path.path + '.bak');
|
|
// File(path.path).writeAsStringSync(sb.toString(), flush: true);
|
|
print(sb.toString());
|
|
}
|
|
} catch (e) {
|
|
if (!(e is FileSystemException)) {
|
|
rethrow;
|
|
}
|
|
}
|
|
}
|
|
}
|