parse method
path
- absolute path to the .arb file
Implementation
ARBContent parse(String path) {
logger.info('Parse file $path');
final file = File(path);
if (!file.existsSync()) {
logger.warning('File $path does not exist');
return ARBContent.empty();
}
final fileLen = file.lengthSync();
if (fileLen == 0) {
logger.warning('File $path is empty');
return ARBContent.empty();
}
final fileLines = file.readAsLinesSync();
final buff = StringBuffer();
int lineNum = 0;
List<int> lineBreaks = [];
for (final fileLine in fileLines) {
if (fileLine == '{' || fileLine == '}') {
buff.writeln(fileLine);
lineNum++;
continue;
}
if (fileLine.startsWith('@@')) {
lineNum++;
buff.writeln(fileLine);
continue;
}
if (fileLine.isEmpty) {
lineBreaks.add(lineNum++);
continue;
}
buff.writeln(fileLine);
lineNum++;
}
if (lineBreaks.isNotEmpty) {
logger.info('Line breaks at $lineBreaks');
}
final fileContent = buff.toString();
final jsonData = jsonDecode(fileContent) as Map<String, dynamic>;
logger.info('Found ${jsonData.length} json entries');
Map<String, ARBItem> items = {};
Map<String, ARBAttribute> attributes = {};
Map<String, dynamic> annotations = {};
int i = 0;
for (final json in jsonData.entries) {
if (json.key.startsWith('@@')) {
logger.warning('Found attribute ${json.key} - ${json.value}');
final attributeKey = json.key.substring(2, json.key.length);
attributes[attributeKey] = ARBAttribute(
number: i,
key: attributeKey,
value: json.value,
);
i++;
continue;
}
if (json.key.contains('@')) {
annotations[json.key.replaceAll('@', '')] = json.value;
continue;
}
final value = json.value;
final plurals = _parsePlurals(value);
final selects = _parseSelects(value);
final item = ARBItem(
number: i,
key: json.key,
value: json.value,
plurals: plurals,
selects: selects,
annotation: null,
);
items[item.key] = item;
i++;
}
for (final annotation in annotations.entries) {
final exist = items[annotation.key]!;
final arbAnnotation = ARBItemAnnotation.fromJson(annotation.value);
items[annotation.key] = exist.cloneWith(
annotation: arbAnnotation,
);
}
for (final item in items.values) {
if (item.annotation != null) {
continue;
}
final allSpecialData = [...item.plurals, ...item.selects];
final textWithoutSpecialData = _getTextWithoutSpecialData(
item.value,
allSpecialData,
);
final shouldContainAnnotation = item.hasPlurals ||
item.hasSelects ||
_hasCorrectOpenCloseCurlyBraces(textWithoutSpecialData);
if (!shouldContainAnnotation) {
continue;
}
final allPlaceholders =
_parsePlaceholdersFromText(textWithoutSpecialData);
final arbAnnotation = ARBItemAnnotation.fromData(
allSpecialData,
allPlaceholders,
);
items[item.key] = item.cloneWith(
annotation: arbAnnotation,
);
}
return ARBContent(
items.values.toList(),
attributes: attributes.values.toList(),
lineBreaks: lineBreaks,
);
}