diff --git a/app/lib/phast/System.inc.php b/app/lib/phast/System.inc.php index 14664c2..9bdb702 100644 --- a/app/lib/phast/System.inc.php +++ b/app/lib/phast/System.inc.php @@ -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) {