Cofem/lib/page.php
2024-02-24 09:16:21 +01:00

222 lines
7.0 KiB
PHP

<?php
require_once "lib/dynamic_style.php";
require_once "lib/script_data.php";
function renderDynamicPage($page_file): array
{
return require $page_file;
}
function parsePageTag($input): array
{
// Define the pattern for the tag
$pattern = '/<page\s+([^>]+)><\/page>/i';
// Check if the pattern matches the input
if (preg_match($pattern, $input, $matches)) {
// Extract parameters
$parameters = [];
if (preg_match_all('/(\w+)="([^"]+)"/', $matches[1], $paramMatches, PREG_SET_ORDER)) {
foreach ($paramMatches as $paramMatch) {
$parameters[$paramMatch[1]] = $paramMatch[2];
}
}
// Remove the tag from the input
$output = preg_replace($pattern, '', $input, 1);
return ['parameters' => $parameters, 'output' => $output];
}
// If no match is found, return the original input
return ['parameters' => [], 'output' => $input];
}
function renderPage($page_name = null, $site_name = null): array
{
global $routerConfig;
global $routerRequest;
if(!$site_name) {
$site_name = $routerRequest["site_name"];
}
if(!$page_name){
$page_name = $routerRequest["page_name"];
}
$dynamic_page_file = $routerConfig["page_dir"] . $site_name . "/" . $page_name . ".php";
$page_file = $routerConfig["page_dir"] . $site_name . "/" . $page_name . ".html";
if (file_exists($dynamic_page_file)){
$pageMetadata = renderDynamicPage($dynamic_page_file);
$page = $pageMetadata["output"];
}
elseif (file_exists($page_file)){
$page_tmp = file_get_contents($page_file);
$pageMetadata = parsePageTag($page_tmp);
$page = $pageMetadata["output"];
}
else{
$page_tmp = file_get_contents($routerConfig["template_dir"] . "404.html");
$pageMetadata = parsePageTag($page_tmp);
$page = $pageMetadata["output"];
http_response_code(404);
}
if(!empty($pageMetadata["parameters"]["minimal_permission_level"])){
$page_required_permission = intval($pageMetadata["parameters"]["minimal_permission_level"]);
}
else{
$page_required_permission = $routerConfig["page"]["default_permissions"];
}
if(!empty($pageMetadata["parameters"]["secret"])){
$origSecret = $pageMetadata["parameters"]["secret"];
if ($origSecret == "yes"){
$is_secret_page = 1;
}
elseif ($origSecret == "no"){
$is_secret_page = 0;
}
else{
$is_secret_page = $routerConfig["page"]["default_secret"];
}
}
else{
$is_secret_page = $routerConfig["page"]["default_secret"];
}
if($page_required_permission > $_SESSION["privilege_level"]){
if($is_secret_page == 1) {
$page_tmp = file_get_contents($routerConfig["template_dir"] . "404.html");
$pageMetadata = parsePageTag($page_tmp);
$page = $pageMetadata["output"];
http_response_code(404);
}
else{
$page_tmp = file_get_contents($routerConfig["template_dir"] . "403.html");
$pageMetadata = parsePageTag($page_tmp);
$page = $pageMetadata["output"];
http_response_code(403);
}
}
$page = str_replace("__DEFAULT_LINK__", "/" . $routerConfig["default_site"] . "/" . $routerConfig["default_page"], $page);
if(!is_string($page)){
$page = "";
}
if(!empty($pageMetadata["parameters"]["page_title"])){
$page_title = $pageMetadata["parameters"]["page_title"];
}
else{
$page_title = $page_name;
}
return [
"PageContent" => $page,
"PageName" => $page_name,
"SiteName" => $site_name,
"PageTitle" => $page_title,
];
}
function getPage($site_name_in = null, $page_name_in = null): string
{
$page_tmp = renderPage($page_name_in, $site_name_in);
$page = $page_tmp["PageContent"];
$page_name = $page_tmp["PageName"];
$site_name = $page_tmp["SiteName"];
global $routerConfig;
$skeleton = file_get_contents($routerConfig["template_dir"] . "skeleton.html");
$footer = file_get_contents($routerConfig["template_dir"] . "footer.html");
$page_title = $page_tmp["PageTitle"];
$dynamic_style = doDynamicStyling();
$dynamic_script_data = [
"currentPage" => $page_name,
"currentSite" => $site_name,
"currentTitle" => $page_title,
"defaultPage" => $routerConfig["default_page"],
"defaultSite" => $routerConfig["default_site"],
"UserInfo_Privileges" => $_SESSION["privilege_level"],
];
if(isLoggedIn()){
$dynamic_script_data += [
"UserInfo_FirstName" => $_SESSION["first_name"],
"UserInfo_LastName" => $_SESSION["last_name"],
"UserInfo_Nickname" => $_SESSION["nickname"],
"UserInfo_Email" => $_SESSION["email"],
"UserInfo_MinecraftNick" => $_SESSION["minecraft_nickname"],
];
}
$dynamic_script = generateScriptData($dynamic_script_data);
$navigation = generateNavigation();
$seo = array();
if(!empty($pageMetadata["parameters"]["author"])){
$seo["author"] = htmlspecialchars($pageMetadata["parameters"]["author"]);
}
else{
$seo["author"] = $routerConfig["seo"]["author"];
}
if(!empty($pageMetadata["parameters"]["description"])){
$seo["description"] = htmlspecialchars($pageMetadata["parameters"]["description"]);
}
else{
$seo["description"] = $routerConfig["seo"]["description"];
}
if(!empty($pageMetadata["parameters"]["keywords"])){
$seo["keywords"] = $routerConfig["seo"]["keywords"] . ", " . htmlspecialchars($pageMetadata["parameters"]["keywords"]);
}
else{
$seo["keywords"] = $routerConfig["seo"]["keywords"];
}
$seo["generator"] = $routerConfig["seo"]["generator"];
$seo["robots"] = $routerConfig["seo"]["robots"];
$seo_stuff = "";
foreach ($seo as $key => $value){
$seo_stuff .= "<meta name='$key' content='$value'>\n";
}
$out = $skeleton;
$out = str_replace("__TEMPLATE__NAV__", $navigation, $out);
$out = str_replace("__TEMPLATE__PAGE__", $page, $out);
$out = str_replace("__TEMPLATE__FOOTER__", $footer, $out);
$out = str_replace("__TEMPLATE__DYNAMIC__SCRIPT__", $dynamic_script, $out);
$out = str_replace("__TEMPLATE__DYNAMIC__STYLE__", $dynamic_style, $out);
$out = str_replace("__TEMPLATE_SEO_STUFF__", $seo_stuff, $out);
if($routerConfig["inlining"]) {
require_once "lib/inliner.php";
$out = inlineLocalStylesFromHref($out);
$out = inlineScriptFromSrc($out);
}
return str_replace("__TEMPLATE_PAGE_TITLE__", $page_title, $out);
}
function getPageEndpoint($page_name, $site_name) :array
{
$page_location = "/" . $site_name . "/" . $page_name;
$page_tmp = renderPage($page_name, $site_name);
return [
"Status" => "Success",
"Page" => $page_tmp["PageContent"],
"PageLocation" => $page_location,
];
}