This commit is contained in:
Michael Becker 2023-12-19 20:57:03 -05:00
parent bcb79777a6
commit defa62be46

View File

@ -765,6 +765,75 @@
return $str;
}
public static function ParsePathVariablesIntoPage(&$actualPage, &$pathVars)
{
$actualPages = array();
$actualPage = null;
$pathVars = null;
foreach (System::$Parser->Pages as $page)
{
if (!$page->Enabled) continue;
/*
// this is simple, but only works if all path parts are within the //s...
// for example, it fails on d/{onevar}/xxx/{somevar}.htmld
// because {somevar} is not entirely within // like {onevar} is
$pathParts = explode("/", $page->FileName);
$pathPartCount = count($pathParts);
$found = true;
for ($i = 0; $i < $pathPartCount; $i++)
{
$pathPart = $pathParts[$i];
if (stripos($pathPart, "$(") == 0 && stripos($pathPart, ")") == strlen($pathPart) - 1)
{
$pathVarName = substr($pathPart, 2, strlen($pathPart) - 3);
$pathVars[$pathVarName] = $actualPathParts[$i];
}
else if (stripos($pathPart, "{") == 0 && stripos($pathPart, "}") == strlen($pathPart) - 1)
{
$pathVarName = substr($pathPart, 1, strlen($pathPart) - 2);
$pathVars[$pathVarName] = $actualPathParts[$i];
}
else
{
$app = "";
if (isset($actualPathParts[$i])) $app = $actualPathParts[$i];
if ($app != $pathPart && (!($app == "" && $pathPart == "")))
{
// a literal path string is broken; we can't use this
$found = false;
break;
}
}
}
*/
$vars = System::ParsePathVariables($page->FileName, System::GetVirtualPathString());
if ($vars !== false)
{
if ($page !== null)
{
$actualPages[] = $page;
}
}
}
// FIXME : find the "best match" for the given route
$qs = new QuickSort();
$sortedPages = $qs->Sort($actualPages, function($left, $right)
{
$leftStr = System::__ReplaceAny($left->FileName, "{", "}" , "?");
$rightStr = System::__ReplaceAny($right->FileName, "{", "}" , "?");
$val = strlen($leftStr) > strlen($rightStr);
return $val;
});
$actualPage = $sortedPages[0];
$pathVars = System::ParsePathVariables($actualPage->FileName, System::GetVirtualPathString());
return true;
}
/**
* Parses a path in the form /static/routes/{with}/dynamic/{variables}.htmld
* /static/routes/glbakdlsfjoaisf/dynamic/fds.htmld
@ -772,7 +841,7 @@
* If the route matches, returns an array of the resulting path vars.
* If the route does not match, returns FALSE.
*/
private static function ParsePathStr(string $template, string $pathstr)
public static function ParsePathVariables(string $template, string $pathstr)
{
$l = strlen($template);
@ -994,68 +1063,9 @@
$i = 0;
$actualPage = null;
$actualPages = array();
$pathVarsVars = array();
$sortedPages = null;
foreach (System::$Parser->Pages as $page)
{
if (!$page->Enabled) continue;
/*
// this is simple, but only works if all path parts are within the //s...
// for example, it fails on d/{onevar}/xxx/{somevar}.htmld
// because {somevar} is not entirely within // like {onevar} is
$pathParts = explode("/", $page->FileName);
$pathPartCount = count($pathParts);
$found = true;
for ($i = 0; $i < $pathPartCount; $i++)
{
$pathPart = $pathParts[$i];
if (stripos($pathPart, "$(") == 0 && stripos($pathPart, ")") == strlen($pathPart) - 1)
{
$pathVarName = substr($pathPart, 2, strlen($pathPart) - 3);
$pathVars[$pathVarName] = $actualPathParts[$i];
}
else if (stripos($pathPart, "{") == 0 && stripos($pathPart, "}") == strlen($pathPart) - 1)
{
$pathVarName = substr($pathPart, 1, strlen($pathPart) - 2);
$pathVars[$pathVarName] = $actualPathParts[$i];
}
else
{
$app = "";
if (isset($actualPathParts[$i])) $app = $actualPathParts[$i];
if ($app != $pathPart && (!($app == "" && $pathPart == "")))
{
// a literal path string is broken; we can't use this
$found = false;
break;
}
}
}
*/
// FIXME : find the "best match" for the given route
$qs = new QuickSort();
$vars = System::ParsePathStr($page->FileName, System::GetVirtualPathString());
if ($vars !== false)
{
$actualPages[] = $page;
}
}
$sortedPages = $qs->Sort($actualPages, function($left, $right)
{
return strlen(System::__ReplaceAny($left->FileName, "{", "}" , "?")) > strlen(System::__ReplaceAny($right->FileName, "{", "}" , "?"));
});
$actualPage = $sortedPages[0];
$pathVars = System::ParsePathStr($actualPage->FileName, System::GetVirtualPathString());
if ($actualPage != null)
if (System::ParsePathVariablesIntoPage( $actualPage, $pathVars ))
{
foreach ($pathVars as $key => $value)
{