parse method

ARBContent parse(
  1. String path
)

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.contains('@@locale')) {
      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, dynamic> annotations = {};

  String? locale;
  int i = 0;
  for (final json in jsonData.entries) {
    if (json.key == '@@locale') {
      logger.warning('Found locale entry ${json.value}');
      locale = json.value;
      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(),
    locale: locale,
    lineBreaks: lineBreaks,
  );
}