Skip to content

Latest commit

 

History

History
99 lines (79 loc) · 4.17 KB

output2.md

File metadata and controls

99 lines (79 loc) · 4.17 KB

Sure, here's a Flutter function that takes two inputs: inputBaseFolder and outputBaseFolder. It replicates all files and folders from inputBaseFolder to outputBaseFolder, processing HTML files by replacing the includes with content from the snippets folder.

First, let's define the replaceIncludes function, which is responsible for processing the HTML content as described in the previous implementation.

Then, we'll define the main function to handle the directory traversal and file copying.

import 'dart:io';
import 'dart:async';

// Function to replace includes in HTML content
Future<String> replaceIncludes(String htmlContent) async {
  // Define a regular expression to find includes like <!--#include file="filename.html"-->
  final includeRegex = RegExp(r'<!--#include file="(.+?)"-->');

  // Find all matches in the HTML content
  final matches = includeRegex.allMatches(htmlContent);

  // Iterate over all matches
  for (final match in matches) {
    // Extract the filename from the match
    final filename = match.group(1);

    if (filename != null) {
      // Construct the path to the snippet file
      final snippetPath = 'snippets/$filename';

      // Read the contents of the snippet file
      try {
        final snippetContent = await File(snippetPath).readAsString();

        // Replace the include directive with the contents of the snippet file
        htmlContent = htmlContent.replaceFirst(match.group(0)!, snippetContent);
      } catch (e) {
        print('Error reading file $snippetPath: $e');
        // Handle the error as needed
      }
    }
  }

  return htmlContent;
}

// Function to replicate the folder structure and files
Future<void> replicateFolder(String inputBaseFolder, String outputBaseFolder) async {
  final inputDirectory = Directory(inputBaseFolder);
  final outputDirectory = Directory(outputBaseFolder);

  if (!await outputDirectory.exists()) {
    await outputDirectory.create(recursive: true);
  }

  await for (var entity in inputDirectory.list(recursive: true)) {
    final relativePath = entity.path.replaceFirst(inputBaseFolder, '');
    final newPath = '$outputBaseFolder$relativePath';

    if (entity is Directory) {
      final newDirectory = Directory(newPath);
      if (!await newDirectory.exists()) {
        await newDirectory.create(recursive: true);
      }
    } else if (entity is File) {
      if (entity.path.endsWith('.html')) {
        final htmlContent = await entity.readAsString();
        final processedContent = await replaceIncludes(htmlContent);
        final newFile = File(newPath);
        await newFile.writeAsString(processedContent);
      } else {
        await entity.copy(newPath);
      }
    }
  }
}

void main() async {
  final inputBaseFolder = 'path/to/inputBaseFolder';
  final outputBaseFolder = 'path/to/outputBaseFolder';

  await replicateFolder(inputBaseFolder, outputBaseFolder);
  print('Replication complete.');
}

Explanation:

  1. replaceIncludes Function: This function takes HTML content as input, finds the include directives, and replaces them with the content from the corresponding snippet files.
  2. replicateFolder Function: This function replicates the directory structure and files from inputBaseFolder to outputBaseFolder.
    • Directory Creation: It checks if the target directory exists and creates it if necessary.
    • Recursive Listing: It iterates through all files and directories in inputBaseFolder recursively.
    • Relative Path Calculation: It calculates the relative path of each file/directory to maintain the same structure in outputBaseFolder.
    • Directory Handling: It creates directories in the output folder as needed.
    • File Handling: If the file is an HTML file, it processes it using replaceIncludes; otherwise, it copies the file as-is.
  3. Main Function: This demonstrates how to call the replicateFolder function with example input and output folder paths.

Notes:

  • Ensure that the snippets folder is correctly located relative to your project directory.
  • This function handles directories and files recursively.
  • Error handling is minimal for simplicity; you may want to add more robust error handling depending on your use case.