run method

  1. @override
FutureOr<TaskController> run(
  1. TaskController controller
)
override

Implementation

@override
FutureOr<TaskController> run(controller) async {
  final slide = controller.slide;

  final matches = _mermaidBlockRegex.allMatches(slide.data);

  if (matches.isEmpty) return controller;
  final replacements = <({int start, int end, String markdown})>[];

  for (final Match match in matches) {
    final mermaidSyntax = match.group(1);

    if (mermaidSyntax == null) continue;

    final mermaidFile = SlideAsset.mermaid(mermaidSyntax);

    if (!await mermaidFile.exists()) {
      // Process the mermaid syntax to generate an image file
      final imageData = await mermaidService.generateImage(mermaidSyntax);

      if (imageData != null) {
        await mermaidFile.writeAsBytes(imageData);
      }
    }

    // If file existeed or was create it then replace it
    if (await mermaidFile.exists()) {
      controller.markNeeded(mermaidFile);

      replacements.add((
        start: match.start,
        end: match.end,
        markdown: '![Mermaid Diagram](${mermaidFile.path})',
      ));
    }
  }

  var replacedData = slide.data;

  // Apply replacements in reverse order
  for (var replacement in replacements.reversed) {
    final (
      :start,
      :end,
      :markdown,
    ) = replacement;

    replacedData = replacedData.replaceRange(start, end, markdown);
  }

  return controller.copyWith(
    slide: slide.copyWith(data: replacedData),
  );
}