mirror of
https://github.com/itflow-org/itflow
synced 2026-07-25 09:47:15 +00:00
Removed unused legacy functions and split the functions into their own file and use function.php to call them
This commit is contained in:
168
functions/files.php
Normal file
168
functions/files.php
Normal file
@@ -0,0 +1,168 @@
|
||||
<?php
|
||||
|
||||
// Filesystem and embedded-image helpers
|
||||
// Split from the former monolithic functions.php
|
||||
|
||||
|
||||
function removeDirectory($path) {
|
||||
if (!file_exists($path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$files = glob($path . '/*');
|
||||
foreach ($files as $file) {
|
||||
is_dir($file) ? removeDirectory($file) : unlink($file);
|
||||
}
|
||||
rmdir($path);
|
||||
}
|
||||
|
||||
function copyDirectory($src, $dst) {
|
||||
if (!is_dir($src)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_dir($dst)) {
|
||||
mkdir($dst, 0775, true);
|
||||
}
|
||||
|
||||
$items = scandir($src);
|
||||
foreach ($items as $item) {
|
||||
if ($item === '.' || $item === '..') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$srcPath = $src . '/' . $item;
|
||||
$dstPath = $dst . '/' . $item;
|
||||
|
||||
if (is_dir($srcPath)) {
|
||||
copyDirectory($srcPath, $dstPath);
|
||||
} else {
|
||||
copy($srcPath, $dstPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function mkdirMissing($dir) {
|
||||
if (!is_dir($dir)) {
|
||||
mkdir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
function saveBase64Images(string $html, string $baseFsPath, string $baseWebPath, int $ownerId): string {
|
||||
// Normalize paths
|
||||
$baseFsPath = rtrim($baseFsPath, '/\\') . '/';
|
||||
$baseWebPath = rtrim($baseWebPath, '/\\') . '/';
|
||||
|
||||
$targetDir = $baseFsPath . $ownerId . "/";
|
||||
|
||||
$folderCreated = false; // <-- NEW FLAG
|
||||
$savedAny = false; // <-- Track if ANY images processed
|
||||
|
||||
libxml_use_internal_errors(true);
|
||||
$dom = new DOMDocument();
|
||||
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);
|
||||
libxml_clear_errors();
|
||||
|
||||
$imgs = $dom->getElementsByTagName('img');
|
||||
|
||||
foreach ($imgs as $img) {
|
||||
$src = $img->getAttribute('src');
|
||||
|
||||
// Match base64 images
|
||||
if (preg_match('/^data:image\/([a-zA-Z0-9+]+);base64,(.*)$/s', $src, $matches)) {
|
||||
|
||||
$savedAny = true; // <-- We are actually saving at least 1 image
|
||||
|
||||
// Create folder ONLY when needed
|
||||
if (!$folderCreated) {
|
||||
if (!is_dir($targetDir)) {
|
||||
mkdir($targetDir, 0775, true);
|
||||
}
|
||||
$folderCreated = true;
|
||||
}
|
||||
|
||||
$mimeType = strtolower($matches[1]);
|
||||
$base64 = $matches[2];
|
||||
|
||||
$binary = base64_decode($base64);
|
||||
if ($binary === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Extension mapping
|
||||
switch ($mimeType) {
|
||||
case 'jpeg':
|
||||
case 'jpg': $ext = 'jpg'; break;
|
||||
case 'png': $ext = 'png'; break;
|
||||
case 'gif': $ext = 'gif'; break;
|
||||
case 'webp': $ext = 'webp'; break;
|
||||
default: $ext = 'png';
|
||||
}
|
||||
|
||||
// Secure random filename
|
||||
$uid = bin2hex(random_bytes(16));
|
||||
$filename = "img_{$uid}.{$ext}";
|
||||
|
||||
$filePath = $targetDir . $filename;
|
||||
|
||||
if (file_put_contents($filePath, $binary) !== false) {
|
||||
$webPath = "/" . $baseWebPath . $ownerId . "/" . $filename;
|
||||
$img->setAttribute('src', $webPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If no images were processed, return original HTML immediately
|
||||
if (!$savedAny) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
// Extract body content only
|
||||
$body = $dom->getElementsByTagName('body')->item(0);
|
||||
|
||||
if ($body) {
|
||||
$innerHTML = '';
|
||||
foreach ($body->childNodes as $child) {
|
||||
$innerHTML .= $dom->saveHTML($child);
|
||||
}
|
||||
return $innerHTML;
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
function cleanupUnusedImages(string $html, string $folderFsPath, string $folderWebPath) {
|
||||
|
||||
$folderFsPath = rtrim($folderFsPath, '/\\') . '/';
|
||||
$folderWebPath = rtrim($folderWebPath, '/\\') . '/';
|
||||
|
||||
if (!is_dir($folderFsPath)) {
|
||||
return; // no folder = nothing to delete
|
||||
}
|
||||
|
||||
// 1. Get all files currently on disk
|
||||
$filesOnDisk = glob($folderFsPath . "*");
|
||||
|
||||
// 2. Find all <img src="">
|
||||
preg_match_all('/<img[^>]+src=["\']([^"\']+)["\']/i', $html, $matches);
|
||||
$htmlImagePaths = $matches[1] ?? [];
|
||||
|
||||
// Normalize paths: keep only filenames belonging to this template folder
|
||||
$referencedFiles = [];
|
||||
|
||||
foreach ($htmlImagePaths as $src) {
|
||||
if (strpos($src, $folderWebPath) !== false) {
|
||||
$filename = basename($src);
|
||||
$referencedFiles[] = $filename;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Delete any physical file not referenced in the HTML
|
||||
foreach ($filesOnDisk as $filePath) {
|
||||
$filename = basename($filePath);
|
||||
|
||||
if (!in_array($filename, $referencedFiles)) {
|
||||
unlink($filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user