From dd1d0d1cb87e91702069377f7d4d637112cd01e0 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 29 Feb 2024 10:09:19 -0500 Subject: [PATCH] optimize ParseParameters to use native Uri class --- Oqtane.Client/Modules/Admin/Pages/Add.razor | 6 +- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 6 +- Oqtane.Shared/Shared/Utilities.cs | 121 +++++++++---------- 3 files changed, 62 insertions(+), 71 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 38faa1f4..b803e30a 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -384,9 +384,7 @@ _path = _name; } - var fragment = (_path.Contains("?")) ? _path.Substring(_path.IndexOf("?")) : ""; - fragment = (_path.Contains("#")) ? _path.Substring(_path.IndexOf("#")) : ""; - _path = (!string.IsNullOrEmpty(fragment)) ? _path.Replace(fragment, "") : _path; + (_path, string parameters) = Utilities.ParsePath(_path); if (_path.Contains("/")) { @@ -412,7 +410,7 @@ page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); } } - page.Path += fragment; + page.Path += parameters; } else { diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index cc5c593d..884aece1 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -526,9 +526,7 @@ _path = _name; } - var fragment = (_path.Contains("?")) ? _path.Substring(_path.IndexOf("?")) : ""; - fragment = (_path.Contains("#")) ? _path.Substring(_path.IndexOf("#")) : ""; - _path = (!string.IsNullOrEmpty(fragment)) ? _path.Replace(fragment, "") : _path; + (_path, string parameters) = Utilities.ParsePath(_path); if (_path.Contains("/")) { @@ -554,7 +552,7 @@ _page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); } } - _page.Path += fragment; + _page.Path += parameters; } else { diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index 134b229d..8d7e3d97 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -20,88 +20,83 @@ namespace Oqtane.Shared return $"{type.Namespace}, {assemblyName}"; } - public static (string UrlParameters, string Querystring, string Anchor) ParseParameters(string parameters) + public static (string UrlParameters, string Querystring, string Fragment) ParseParameters(string url) { + // /path/urlparameters // /urlparameters /urlparameters?Id=1 /urlparameters#5 /urlparameters?Id=1#5 /urlparameters?reload#5 - // Id=1 Id=1#5 reload#5 reload - // #5 - var urlparameters = string.Empty; - var querystring = string.Empty; - var anchor = string.Empty; - - if (parameters.Contains('#')) + if (!url.StartsWith("/")) // paths always start with "/" { - anchor = parameters.Split('#').Last(); - parameters = parameters.Replace("#" + anchor, ""); + url = ((!url.StartsWith("#")) ? "/?" : "/") + url; + } + url = ((!url.Contains("://")) ? Constants.PackageRegistryUrl : "") + url; + + var uri = new Uri(url); + var querystring = uri.Query.Replace("?", ""); + var fragment = uri.Fragment.Replace("#", ""); + var urlparameters = uri.LocalPath; + urlparameters = (urlparameters == "/") ? "" : urlparameters; + + if (urlparameters.Contains(Constants.UrlParametersDelimiter)) + { + urlparameters = urlparameters.Substring(urlparameters.IndexOf(Constants.UrlParametersDelimiter) + 1); } - if (parameters.Contains('?')) - { - urlparameters = parameters.Split('?').First(); - querystring = parameters.Replace(urlparameters + "?", ""); - } - else if (parameters.Contains('/')) - { - urlparameters = parameters; - } - else - { - querystring = parameters; - } - - return (urlparameters, querystring, anchor); + return (urlparameters, querystring, fragment); } - private static (string Path, string Parameters) ParsePath(string path, string parameters) + public static (string Path, string Parameters) ParsePath(string url) { - if (!string.IsNullOrEmpty(path)) + url = (!url.StartsWith("/") ? "/" : "") + url; + + (string path, string querystring, string fragment) = ParseParameters(url); + + var uriBuilder = new UriBuilder { - if (path.Contains('?')) - { - parameters = "?" + path.Split('?').Last(); - path = path.Split('?').First(); - } - if (path.Contains('#')) - { - parameters = "#" + path.Split('#').Last(); - path = path.Split('#').First(); - } - } - return (path, parameters); + Path = path, + Query = querystring, + Fragment = fragment + }; + + return (uriBuilder.Path, uriBuilder.Uri.Query + uriBuilder.Uri.Fragment); } public static string NavigateUrl(string alias, string path, string parameters) { - string urlparameters; - string querystring; - string anchor; - - // parse path (in case parameters are embedded in path) - (path, parameters) = ParsePath(path, parameters); - // parse parameters - (urlparameters, querystring, anchor) = ParseParameters(parameters); - if (!string.IsNullOrEmpty(urlparameters)) + if (!string.IsNullOrEmpty(parameters)) { - if (urlparameters.StartsWith("/")) urlparameters = urlparameters.Remove(0, 1); - path += $"/{Constants.UrlParametersDelimiter}/{urlparameters}"; + // parse path + (path, _) = ParsePath(path); + + // parse parameters + (string urlparameters, string querystring, string fragment) = ParseParameters(parameters); + + // add urlparameters to path + if (!string.IsNullOrEmpty(urlparameters)) + { + if (urlparameters.StartsWith("/")) urlparameters = urlparameters.Remove(0, 1); + path += $"/{Constants.UrlParametersDelimiter}/{urlparameters}"; + } + + // build url + var uriBuilder = new UriBuilder + { + Path = !string.IsNullOrEmpty(alias) + ? (!string.IsNullOrEmpty(path)) ? $"{alias}{path}": $"{alias}" + : $"{path}", + Query = querystring, + Fragment = fragment + }; + path = uriBuilder.Uri.PathAndQuery; + } + else + { + path = ((!string.IsNullOrEmpty(alias)) ? alias + "/" : "") + path; } - // build url - var uriBuilder = new UriBuilder - { - Path = !string.IsNullOrEmpty(alias) - ? (!string.IsNullOrEmpty(path)) - ? $"{alias}/{path}" - : $"{alias}" - : $"{path}", - Query = querystring, - }; - - anchor = string.IsNullOrEmpty(anchor) ? "" : "#" + anchor; - return uriBuilder.Uri.PathAndQuery + anchor; + return path; } public static string EditUrl(string alias, string path, int moduleid, string action, string parameters)