mirror of
https://github.com/sbrl/Pepperminty-Wiki.git
synced 2024-11-25 17:23:00 +00:00
Overhaul file preview/display to support multiple filetypes.
This commit is contained in:
parent
4e599569ed
commit
18012c82fe
5 changed files with 162 additions and 55 deletions
|
@ -17,6 +17,9 @@
|
||||||
- Fixed the downloader
|
- Fixed the downloader
|
||||||
- Fixed an issue with the recent changes page and redirects causing a large number of warnings
|
- Fixed an issue with the recent changes page and redirects causing a large number of warnings
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
- Test the etag code!
|
||||||
|
|
||||||
## v0.10
|
## v0.10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
104
build/index.php
104
build/index.php
|
@ -199,7 +199,11 @@ $settings->upload_allowed_file_types = [
|
||||||
"image/jpeg",
|
"image/jpeg",
|
||||||
"image/png",
|
"image/png",
|
||||||
"image/gif",
|
"image/gif",
|
||||||
"image/webp"
|
"image/webp",
|
||||||
|
"video/mp4",
|
||||||
|
"video/webm",
|
||||||
|
"audio/mp4",
|
||||||
|
"audio/mp3"
|
||||||
];
|
];
|
||||||
|
|
||||||
// The default file type for previews.
|
// The default file type for previews.
|
||||||
|
@ -2631,8 +2635,6 @@ register_module([
|
||||||
$output_mime = $_GET["type"];
|
$output_mime = $_GET["type"];
|
||||||
|
|
||||||
/// ETag handling ///
|
/// ETag handling ///
|
||||||
// TODO: Test this
|
|
||||||
error_log("Note to self: Please remember to test this etag code!");
|
|
||||||
// Generate the etag and send it to the client
|
// Generate the etag and send it to the client
|
||||||
$preview_etag = sha1("$output_mime|$target_size|$filepath|$mime_type");
|
$preview_etag = sha1("$output_mime|$target_size|$filepath|$mime_type");
|
||||||
$allheaders = getallheaders();
|
$allheaders = getallheaders();
|
||||||
|
@ -2653,68 +2655,118 @@ register_module([
|
||||||
}
|
}
|
||||||
/// ETag handling end ///
|
/// ETag handling end ///
|
||||||
|
|
||||||
$preview_image = new Imagick();
|
$preview = new Imagick();
|
||||||
switch(substr($mime_type, 0, strpos($mime_type, "/")))
|
switch(substr($mime_type, 0, strpos($mime_type, "/")))
|
||||||
{
|
{
|
||||||
case "image":
|
case "image":
|
||||||
$preview_image->readImage($filepath);
|
$preview->readImage($filepath);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "application":
|
case "application":
|
||||||
if($mime_type == "application/pdf")
|
if($mime_type == "application/pdf")
|
||||||
{
|
{
|
||||||
$preview_image = new imagick();
|
$preview = new imagick();
|
||||||
$preview_image->readImage("{$filepath}[0]");
|
$preview->readImage("{$filepath}[0]");
|
||||||
$preview_image->setResolution(300,300);
|
$preview->setResolution(300,300);
|
||||||
$preview_image->setImageColorspace(255);
|
$preview->setImageColorspace(255);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "video":
|
||||||
|
case "audio":
|
||||||
|
$im = errorimage("TODO: Proxy the video / audio through");
|
||||||
|
header("image/png");
|
||||||
|
imagepng($im);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
http_response_code(501);
|
http_response_code(501);
|
||||||
$preview_image = errorimage("Unrecognised file type '$mime_type'.");
|
$preview = errorimage("Unrecognised file type '$mime_type'.");
|
||||||
header("content-type: image/png");
|
header("content-type: image/png");
|
||||||
imagepng($preview_image);
|
imagepng($preview);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scale the image down to the target size
|
// Scale the image down to the target size
|
||||||
$preview_image->resizeImage($target_size, $target_size, imagick::FILTER_LANCZOS, 1, true);
|
$preview->resizeImage($target_size, $target_size, imagick::FILTER_LANCZOS, 1, true);
|
||||||
|
|
||||||
// Send the completed preview image to the user
|
// Send the completed preview image to the user
|
||||||
header("content-type: $output_mime");
|
header("content-type: $output_mime");
|
||||||
header("x-generation-time: " . (microtime(true) - $start_time) . "s");
|
header("x-generation-time: " . (microtime(true) - $start_time) . "s");
|
||||||
$preview_image->setImageFormat(substr($output_mime, strpos($output_mime, "/") + 1));
|
$preview->setImageFormat(substr($output_mime, strpos($output_mime, "/") + 1));
|
||||||
echo($preview_image->getImageBlob());
|
echo($preview->getImageBlob());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ██████ ██████ ███████ ██ ██ ██ ███████ ██ ██
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██████ ██████ █████ ██ ██ ██ █████ ██ █ ██
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██
|
||||||
|
* ██ ██ ██ ███████ ████ ██ ███████ ███ ███
|
||||||
|
*
|
||||||
|
* ██████ ██ ███████ ██████ ██ █████ ██ ██ ███████ ██████
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██ ██ ██ ███████ ██████ ██ ███████ ████ █████ ██████
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██████ ██ ███████ ██ ███████ ██ ██ ██ ███████ ██ ██
|
||||||
|
*/
|
||||||
page_renderer::register_part_preprocessor(function(&$parts) {
|
page_renderer::register_part_preprocessor(function(&$parts) {
|
||||||
global $pageindex, $env, $settings;
|
global $pageindex, $env, $settings;
|
||||||
// Todo add the preview to the top of the page here, but only if the current action is view and we are on a page that is a file
|
// Don't do anything if the action isn't view
|
||||||
|
if($env->action !== "view")
|
||||||
|
return;
|
||||||
|
|
||||||
if(isset($pageindex->{$env->page}->uploadedfile) and $pageindex->{$env->page}->uploadedfile == true)
|
if(isset($pageindex->{$env->page}->uploadedfile) and $pageindex->{$env->page}->uploadedfile == true)
|
||||||
{
|
{
|
||||||
// We are looking at a page that is paired with an uploaded file
|
// We are looking at a page that is paired with an uploaded file
|
||||||
$filepath = $pageindex->{$env->page}->uploadedfilepath;
|
$filepath = $pageindex->{$env->page}->uploadedfilepath;
|
||||||
$mime_type = $pageindex->{$env->page}->uploadedfilemime;
|
$mime_type = $pageindex->{$env->page}->uploadedfilemime;
|
||||||
$dimensions = getimagesize($env->storage_prefix . $filepath);
|
$dimensions = getimagesize($env->storage_prefix . $filepath);
|
||||||
|
$fileTypeDisplay = substr($mime_type, 0, strpos($mime_type, "/"));
|
||||||
|
$previewUrl = "?action=preview&size=$settings->default_preview_size&page=" . rawurlencode($env->page);
|
||||||
|
|
||||||
|
$preview_html = "";
|
||||||
|
|
||||||
|
error_log($fileTypeDisplay);
|
||||||
|
switch($fileTypeDisplay)
|
||||||
|
{
|
||||||
|
case "image":
|
||||||
$preview_sizes = [ 256, 512, 768, 1024, 1440 ];
|
$preview_sizes = [ 256, 512, 768, 1024, 1440 ];
|
||||||
$preview_html = "<figure class='preview'>
|
$preview_html .= "\t\t\t<figure class='preview'>
|
||||||
<img src='?action=preview&size=$settings->default_preview_size&page=" . rawurlencode($env->page) . "' />
|
<img src='$previewUrl' />
|
||||||
<nav class='image-controls'>
|
<nav class='image-controls'>
|
||||||
<ul><li><a href='" . ($env->storage_prefix == "./" ? $filepath : "?action=preview&size=original&page=" . rawurlencode($env->page)) . "'>🌄 Original image</a></li>
|
<ul><li><a href='" . ($env->storage_prefix == "./" ? $filepath : "?action=preview&size=original&page=" . rawurlencode($env->page)) . "'>🌄 Original image</a></li>
|
||||||
<li>Other Sizes: ";
|
<li>Other Sizes: ";
|
||||||
foreach($preview_sizes as $size)
|
foreach($preview_sizes as $size)
|
||||||
$preview_html .= "<a href='?action=preview&page=" . rawurlencode($env->page) . "&size=$size'>$size" . "px</a> ";
|
$preview_html .= "<a href='?action=preview&page=" . rawurlencode($env->page) . "&size=$size'>$size" . "px</a> ";
|
||||||
$preview_html .= "</li></ul></nav>
|
$preview_html .= "</li></ul></nav>
|
||||||
</figure>
|
</figure>";
|
||||||
<h2>File Information</h2>
|
break;
|
||||||
<table><tr><th>Name</th><td>" . str_replace("File/", "", $filepath) . "</td>
|
|
||||||
<tr><th>Type</th><td>$mime_type</td></tr>
|
case "video":
|
||||||
<tr><th>Size</th><td>" . human_filesize(filesize($filepath)) . "</td></tr>";
|
$preview_html .= "<video src='$previewUrl' controls preload='metadata'>Your browser doesn't support the HTML5 video tag, but you can still <a href='$previewUrl'>download it</a> if you'd like.</video>";
|
||||||
if(substr($mime_type, strpos($mime_type, "/")) == "image")
|
break;
|
||||||
$preview_html .= "<tr><th>Original dimensions</th><td>$dimensions[0] x $dimensions[1]</td></tr>";
|
}
|
||||||
$preview_html .= "<tr><th>Uploaded by</th><td>" . $pageindex->{$env->page}->lasteditor . "</td></tr></table>
|
|
||||||
<h2>Description</h2>";
|
$fileInfo = [];
|
||||||
|
$fileInfo["Name"] = str_replace("File/", "", $filepath);
|
||||||
|
$fileInfo["Type"] = $mime_type;
|
||||||
|
$fileInfo["Size"] = human_filesize(filesize($filepath));
|
||||||
|
switch($fileTypeDisplay)
|
||||||
|
{
|
||||||
|
case "image":
|
||||||
|
$fileInfo["Original dimensions"] = "$dimensions[0] x $dimensions[1]";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$fileInfo["Uploaded by"] = $pageindex->{$env->page}->lasteditor;
|
||||||
|
|
||||||
|
$preview_html .= "\t\t\t<h2>File Information</h2>
|
||||||
|
<table>";
|
||||||
|
foreach ($fileInfo as $displayName => $displayValue)
|
||||||
|
{
|
||||||
|
$preview_html .= "<tr><th>$displayName</th><td>$displayValue</td></tr>\n";
|
||||||
|
}
|
||||||
|
$preview_html .= "</table>";
|
||||||
|
|
||||||
$parts["{content}"] = str_replace("</h1>", "</h1>\n$preview_html", $parts["{content}"]);
|
$parts["{content}"] = str_replace("</h1>", "</h1>\n$preview_html", $parts["{content}"]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
"author": "Starbeamrainbowlabs",
|
"author": "Starbeamrainbowlabs",
|
||||||
"description": "Adds the ability to upload files to Pepperminty Wiki. Uploaded files act as pages and have the special 'File:' prefix.",
|
"description": "Adds the ability to upload files to Pepperminty Wiki. Uploaded files act as pages and have the special 'File:' prefix.",
|
||||||
"id": "feature-upload",
|
"id": "feature-upload",
|
||||||
"lastupdate": 1459973604,
|
"lastupdate": 1460046939,
|
||||||
"optional": false
|
"optional": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -216,8 +216,6 @@ register_module([
|
||||||
$output_mime = $_GET["type"];
|
$output_mime = $_GET["type"];
|
||||||
|
|
||||||
/// ETag handling ///
|
/// ETag handling ///
|
||||||
// TODO: Test this
|
|
||||||
error_log("Note to self: Please remember to test this etag code!");
|
|
||||||
// Generate the etag and send it to the client
|
// Generate the etag and send it to the client
|
||||||
$preview_etag = sha1("$output_mime|$target_size|$filepath|$mime_type");
|
$preview_etag = sha1("$output_mime|$target_size|$filepath|$mime_type");
|
||||||
$allheaders = getallheaders();
|
$allheaders = getallheaders();
|
||||||
|
@ -238,68 +236,118 @@ register_module([
|
||||||
}
|
}
|
||||||
/// ETag handling end ///
|
/// ETag handling end ///
|
||||||
|
|
||||||
$preview_image = new Imagick();
|
$preview = new Imagick();
|
||||||
switch(substr($mime_type, 0, strpos($mime_type, "/")))
|
switch(substr($mime_type, 0, strpos($mime_type, "/")))
|
||||||
{
|
{
|
||||||
case "image":
|
case "image":
|
||||||
$preview_image->readImage($filepath);
|
$preview->readImage($filepath);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "application":
|
case "application":
|
||||||
if($mime_type == "application/pdf")
|
if($mime_type == "application/pdf")
|
||||||
{
|
{
|
||||||
$preview_image = new imagick();
|
$preview = new imagick();
|
||||||
$preview_image->readImage("{$filepath}[0]");
|
$preview->readImage("{$filepath}[0]");
|
||||||
$preview_image->setResolution(300,300);
|
$preview->setResolution(300,300);
|
||||||
$preview_image->setImageColorspace(255);
|
$preview->setImageColorspace(255);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "video":
|
||||||
|
case "audio":
|
||||||
|
$im = errorimage("TODO: Proxy the video / audio through");
|
||||||
|
header("image/png");
|
||||||
|
imagepng($im);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
http_response_code(501);
|
http_response_code(501);
|
||||||
$preview_image = errorimage("Unrecognised file type '$mime_type'.");
|
$preview = errorimage("Unrecognised file type '$mime_type'.");
|
||||||
header("content-type: image/png");
|
header("content-type: image/png");
|
||||||
imagepng($preview_image);
|
imagepng($preview);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scale the image down to the target size
|
// Scale the image down to the target size
|
||||||
$preview_image->resizeImage($target_size, $target_size, imagick::FILTER_LANCZOS, 1, true);
|
$preview->resizeImage($target_size, $target_size, imagick::FILTER_LANCZOS, 1, true);
|
||||||
|
|
||||||
// Send the completed preview image to the user
|
// Send the completed preview image to the user
|
||||||
header("content-type: $output_mime");
|
header("content-type: $output_mime");
|
||||||
header("x-generation-time: " . (microtime(true) - $start_time) . "s");
|
header("x-generation-time: " . (microtime(true) - $start_time) . "s");
|
||||||
$preview_image->setImageFormat(substr($output_mime, strpos($output_mime, "/") + 1));
|
$preview->setImageFormat(substr($output_mime, strpos($output_mime, "/") + 1));
|
||||||
echo($preview_image->getImageBlob());
|
echo($preview->getImageBlob());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ██████ ██████ ███████ ██ ██ ██ ███████ ██ ██
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██████ ██████ █████ ██ ██ ██ █████ ██ █ ██
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██
|
||||||
|
* ██ ██ ██ ███████ ████ ██ ███████ ███ ███
|
||||||
|
*
|
||||||
|
* ██████ ██ ███████ ██████ ██ █████ ██ ██ ███████ ██████
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██ ██ ██ ███████ ██████ ██ ███████ ████ █████ ██████
|
||||||
|
* ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||||
|
* ██████ ██ ███████ ██ ███████ ██ ██ ██ ███████ ██ ██
|
||||||
|
*/
|
||||||
page_renderer::register_part_preprocessor(function(&$parts) {
|
page_renderer::register_part_preprocessor(function(&$parts) {
|
||||||
global $pageindex, $env, $settings;
|
global $pageindex, $env, $settings;
|
||||||
// Todo add the preview to the top of the page here, but only if the current action is view and we are on a page that is a file
|
// Don't do anything if the action isn't view
|
||||||
|
if($env->action !== "view")
|
||||||
|
return;
|
||||||
|
|
||||||
if(isset($pageindex->{$env->page}->uploadedfile) and $pageindex->{$env->page}->uploadedfile == true)
|
if(isset($pageindex->{$env->page}->uploadedfile) and $pageindex->{$env->page}->uploadedfile == true)
|
||||||
{
|
{
|
||||||
// We are looking at a page that is paired with an uploaded file
|
// We are looking at a page that is paired with an uploaded file
|
||||||
$filepath = $pageindex->{$env->page}->uploadedfilepath;
|
$filepath = $pageindex->{$env->page}->uploadedfilepath;
|
||||||
$mime_type = $pageindex->{$env->page}->uploadedfilemime;
|
$mime_type = $pageindex->{$env->page}->uploadedfilemime;
|
||||||
$dimensions = getimagesize($env->storage_prefix . $filepath);
|
$dimensions = getimagesize($env->storage_prefix . $filepath);
|
||||||
|
$fileTypeDisplay = substr($mime_type, 0, strpos($mime_type, "/"));
|
||||||
|
$previewUrl = "?action=preview&size=$settings->default_preview_size&page=" . rawurlencode($env->page);
|
||||||
|
|
||||||
|
$preview_html = "";
|
||||||
|
|
||||||
|
error_log($fileTypeDisplay);
|
||||||
|
switch($fileTypeDisplay)
|
||||||
|
{
|
||||||
|
case "image":
|
||||||
$preview_sizes = [ 256, 512, 768, 1024, 1440 ];
|
$preview_sizes = [ 256, 512, 768, 1024, 1440 ];
|
||||||
$preview_html = "<figure class='preview'>
|
$preview_html .= "\t\t\t<figure class='preview'>
|
||||||
<img src='?action=preview&size=$settings->default_preview_size&page=" . rawurlencode($env->page) . "' />
|
<img src='$previewUrl' />
|
||||||
<nav class='image-controls'>
|
<nav class='image-controls'>
|
||||||
<ul><li><a href='" . ($env->storage_prefix == "./" ? $filepath : "?action=preview&size=original&page=" . rawurlencode($env->page)) . "'>🌄 Original image</a></li>
|
<ul><li><a href='" . ($env->storage_prefix == "./" ? $filepath : "?action=preview&size=original&page=" . rawurlencode($env->page)) . "'>🌄 Original image</a></li>
|
||||||
<li>Other Sizes: ";
|
<li>Other Sizes: ";
|
||||||
foreach($preview_sizes as $size)
|
foreach($preview_sizes as $size)
|
||||||
$preview_html .= "<a href='?action=preview&page=" . rawurlencode($env->page) . "&size=$size'>$size" . "px</a> ";
|
$preview_html .= "<a href='?action=preview&page=" . rawurlencode($env->page) . "&size=$size'>$size" . "px</a> ";
|
||||||
$preview_html .= "</li></ul></nav>
|
$preview_html .= "</li></ul></nav>
|
||||||
</figure>
|
</figure>";
|
||||||
<h2>File Information</h2>
|
break;
|
||||||
<table><tr><th>Name</th><td>" . str_replace("File/", "", $filepath) . "</td>
|
|
||||||
<tr><th>Type</th><td>$mime_type</td></tr>
|
case "video":
|
||||||
<tr><th>Size</th><td>" . human_filesize(filesize($filepath)) . "</td></tr>";
|
$preview_html .= "<video src='$previewUrl' controls preload='metadata'>Your browser doesn't support the HTML5 video tag, but you can still <a href='$previewUrl'>download it</a> if you'd like.</video>";
|
||||||
if(substr($mime_type, strpos($mime_type, "/")) == "image")
|
break;
|
||||||
$preview_html .= "<tr><th>Original dimensions</th><td>$dimensions[0] x $dimensions[1]</td></tr>";
|
}
|
||||||
$preview_html .= "<tr><th>Uploaded by</th><td>" . $pageindex->{$env->page}->lasteditor . "</td></tr></table>
|
|
||||||
<h2>Description</h2>";
|
$fileInfo = [];
|
||||||
|
$fileInfo["Name"] = str_replace("File/", "", $filepath);
|
||||||
|
$fileInfo["Type"] = $mime_type;
|
||||||
|
$fileInfo["Size"] = human_filesize(filesize($filepath));
|
||||||
|
switch($fileTypeDisplay)
|
||||||
|
{
|
||||||
|
case "image":
|
||||||
|
$fileInfo["Original dimensions"] = "$dimensions[0] x $dimensions[1]";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$fileInfo["Uploaded by"] = $pageindex->{$env->page}->lasteditor;
|
||||||
|
|
||||||
|
$preview_html .= "\t\t\t<h2>File Information</h2>
|
||||||
|
<table>";
|
||||||
|
foreach ($fileInfo as $displayName => $displayValue)
|
||||||
|
{
|
||||||
|
$preview_html .= "<tr><th>$displayName</th><td>$displayValue</td></tr>\n";
|
||||||
|
}
|
||||||
|
$preview_html .= "</table>";
|
||||||
|
|
||||||
$parts["{content}"] = str_replace("</h1>", "</h1>\n$preview_html", $parts["{content}"]);
|
$parts["{content}"] = str_replace("</h1>", "</h1>\n$preview_html", $parts["{content}"]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,7 +196,11 @@ $settings->upload_allowed_file_types = [
|
||||||
"image/jpeg",
|
"image/jpeg",
|
||||||
"image/png",
|
"image/png",
|
||||||
"image/gif",
|
"image/gif",
|
||||||
"image/webp"
|
"image/webp",
|
||||||
|
"video/mp4",
|
||||||
|
"video/webm",
|
||||||
|
"audio/mp4",
|
||||||
|
"audio/mp3"
|
||||||
];
|
];
|
||||||
|
|
||||||
// The default file type for previews.
|
// The default file type for previews.
|
||||||
|
|
Loading…
Reference in a new issue