153 lines
5.6 KiB
Plaintext
153 lines
5.6 KiB
Plaintext
@namespace Oqtane.UI
|
|
@inject IJSRuntime JSRuntime
|
|
@inject NavigationManager NavigationManager
|
|
@inject SiteState SiteState
|
|
|
|
@DynamicComponent
|
|
|
|
@code {
|
|
[CascadingParameter] PageState PageState { get; set; }
|
|
|
|
RenderFragment DynamicComponent { get; set; }
|
|
|
|
protected override void OnParametersSet()
|
|
{
|
|
// handle page redirection
|
|
if (!string.IsNullOrEmpty(PageState.Page.Url))
|
|
{
|
|
NavigationManager.NavigateTo(PageState.Page.Url);
|
|
return;
|
|
}
|
|
|
|
// set page title
|
|
if (!string.IsNullOrEmpty(PageState.Page.Title))
|
|
{
|
|
SiteState.Properties.PageTitle = PageState.Page.Title;
|
|
}
|
|
else
|
|
{
|
|
SiteState.Properties.PageTitle = PageState.Site.Name + " - " + PageState.Page.Name;
|
|
}
|
|
|
|
// set page head content
|
|
var headcontent = "";
|
|
// favicon
|
|
var favicon = "favicon.ico";
|
|
if (PageState.Site.FaviconFileId != null)
|
|
{
|
|
favicon = Utilities.FileUrl(PageState.Alias, PageState.Site.FaviconFileId.Value);
|
|
}
|
|
headcontent += $"<link id=\"app-favicon\" rel=\"shortcut icon\" type=\"image/x-icon\" href=\"{favicon}\" />\n";
|
|
// stylesheets
|
|
foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet))
|
|
{
|
|
var url = (resource.Url.Contains("://")) ? resource.Url : PageState.Alias.BaseUrl + resource.Url;
|
|
headcontent += CreateLink(url, resource.Integrity, resource.CrossOrigin) + "\n";
|
|
}
|
|
// head content
|
|
if (!string.IsNullOrEmpty(PageState.Site.HeadContent))
|
|
{
|
|
headcontent += PageState.Site.HeadContent + "\n";
|
|
}
|
|
if (!string.IsNullOrEmpty(PageState.Page.HeadContent))
|
|
{
|
|
headcontent += PageState.Page.HeadContent + "\n";
|
|
}
|
|
SiteState.Properties.HeadContent = headcontent;
|
|
|
|
DynamicComponent = builder =>
|
|
{
|
|
var themeType = Type.GetType(PageState.Page.ThemeType);
|
|
builder.OpenComponent(0, themeType);
|
|
builder.CloseComponent();
|
|
};
|
|
}
|
|
|
|
private string CreateLink(string url, string integrity, string crossorigin)
|
|
{
|
|
return "<link rel=\"stylesheet\" href=\"" + url + "\"" + (!string.IsNullOrEmpty(integrity) ? " integrity=\"" + integrity + "\"" : "") + (!string.IsNullOrEmpty(crossorigin) ? " crossorigin=\"" + crossorigin + "\"" : "") + " type=\"text/css\"/>";
|
|
}
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (!firstRender)
|
|
{
|
|
if (!string.IsNullOrEmpty(PageState.Page.HeadContent) && PageState.Page.HeadContent.Contains("<script"))
|
|
{
|
|
await InjectScripts(PageState.Page.HeadContent, "head");
|
|
}
|
|
if (!string.IsNullOrEmpty(PageState.Page.BodyContent) && PageState.Page.BodyContent.Contains("<script"))
|
|
{
|
|
await InjectScripts(PageState.Page.BodyContent, "body");
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task InjectScripts(string content, string location)
|
|
{
|
|
// inject scripts into page dynamically
|
|
var interop = new Interop(JSRuntime);
|
|
var scripts = new List<object>();
|
|
var count = 0;
|
|
var index = content.IndexOf("<script");
|
|
while (index >= 0)
|
|
{
|
|
var script = content.Substring(index, content.IndexOf("</script>", index) + 9 - index);
|
|
// get script attributes
|
|
var attributes = script.Substring(0, script.IndexOf(">")).Replace("\"", "").Split(" ");
|
|
string id = "";
|
|
string src = "";
|
|
string integrity = "";
|
|
string crossorigin = "";
|
|
string type = "";
|
|
foreach (var attribute in attributes)
|
|
{
|
|
if (attribute.Contains("="))
|
|
{
|
|
var value = attribute.Split("=");
|
|
switch (value[0])
|
|
{
|
|
case "id":
|
|
id = value[1];
|
|
break;
|
|
case "src":
|
|
src = value[1];
|
|
break;
|
|
case "integrity":
|
|
integrity = value[1];
|
|
break;
|
|
case "crossorigin":
|
|
crossorigin = value[1];
|
|
break;
|
|
case "type":
|
|
type = value[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// inject script
|
|
if (!string.IsNullOrEmpty(src))
|
|
{
|
|
src = (src.Contains("://")) ? src : PageState.Alias.BaseUrl + src;
|
|
scripts.Add(new { href = src, bundle = "", integrity = integrity, crossorigin = crossorigin, es6module = (type == "module"), location = location });
|
|
}
|
|
else
|
|
{
|
|
// inline script must have an id attribute
|
|
if (id == "")
|
|
{
|
|
count += 1;
|
|
id = $"page{PageState.Page.PageId}-script{count}";
|
|
}
|
|
index = script.IndexOf(">") + 1;
|
|
await interop.IncludeScript(id, "", "", "", "", script.Substring(index, script.IndexOf("</script>") - index), location);
|
|
}
|
|
index = content.IndexOf("<script", index + 1);
|
|
}
|
|
if (scripts.Any())
|
|
{
|
|
await interop.IncludeScripts(scripts.ToArray());
|
|
}
|
|
}
|
|
}
|