create method

  1. @override
Component? create(
  1. Node node,
  2. NodesBuilder builder
)
override

Creates a component for the given node, or returns null.

Implementation

@override
Component? create(Node node, NodesBuilder builder) {
  if (node
      case ElementNode(tag: 'Code' || 'CodeBlock', :final children, :final attributes) ||
          ElementNode(tag: 'pre', children: [ElementNode(tag: 'code', :final children, :final attributes)])) {
    var language = attributes['language'];
    if (language == null && (attributes['class']?.startsWith('language-') ?? false)) {
      language = attributes['class']!.substring('language-'.length);
    }

    if (!_initialized) {
      Highlighter.initialize(['dart']);
      for (final entry in grammars.entries) {
        Highlighter.addLanguage(entry.key, entry.value);
      }
      _initialized = true;
    }

    return AsyncBuilder(
      builder: (context) async {
        final highlighter = Highlighter(
          language: language ?? defaultLanguage,
          theme: theme ?? (_defaultTheme ??= await HighlighterTheme.loadDarkTheme()),
        );

        return _CodeBlock(source: children?.map((c) => c.innerText).join(' ') ?? '', highlighter: highlighter);
      },
    );
  }
  return null;
}