fromJson static method

Mode fromJson(
  1. String json
)

Converts a TextMate grammar JSON string into a re_highlight Mode.

TextMate grammars use scope names (e.g. keyword.control.dart, string.quoted.double) which must be mapped to highlight.js class names (keyword, string, comment, number, etc.) that re_highlight themes understand.

Implementation

static Mode fromJson(String json) {
  final decoded = jsonDecode(json) as Map<String, dynamic>;

  final repository = <String, dynamic>{};
  if (decoded.containsKey('repository')) {
    final repo = decoded['repository'] as Map<String, dynamic>;
    repo.forEach((key, value) {
      repository[key] = value;
    });
  }

  final keywordSets = <String, Set<String>>{};
  _collectKeywords(repository, keywordSets);

  final root = Mode(
    name: decoded['name'] as String?,
    aliases: decoded.containsKey('aliases')
        ? (decoded['aliases'] as List).cast<String>()
        : null,
  );

  if (keywordSets.isNotEmpty) {
    final keywordsMap = <String, dynamic>{};
    keywordsMap['\$pattern'] = r'[A-Za-z_]\w*|__\w+__';
    keywordSets.forEach((category, words) {
      keywordsMap[category] = words.toList();
    });
    root.keywords = keywordsMap;
  }

  final contains = <Mode>[];
  _buildStandardContains(repository, contains);
  root.contains = contains.isNotEmpty ? contains : null;

  return root;
}