Theme
using Microsoft.AspNetCore.Http.Features;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using Taiizor.Starterkit.Enum;
using Taiizor.Starterkit.Interface;
namespace Taiizor.Starterkit.Extension
{
public class Theme : ITheme
{
private string _modeDefault = "system";
private string _localeDefault = "en-GB";
private bool _modeSwitchEnabled = true;
private bool _localeSwitchEnabled = true;
private DirectionEnum _direction;
private readonly SortedDictionary<string, string[]> _htmlClasses = new SortedDictionary<string, string[]>();
private readonly SortedDictionary<string, SortedDictionary<string, string>> _htmlAttributes = new SortedDictionary<string, SortedDictionary<string, string>>();
private readonly List<string> _jsFiles = new List<string>();
private readonly List<string> _cssFiles = new List<string>();
private readonly List<string> _fontFiles = new List<string>();
private readonly List<string> _vendorFiles = new List<string>();
public void AddHtmlAttribute(string scope, string attributeName, string attributeValue)
{
SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>();
if (_htmlAttributes.ContainsKey(scope))
sortedDictionary = _htmlAttributes[scope];
sortedDictionary[attributeName] = attributeValue;
_htmlAttributes[scope] = sortedDictionary;
}
public void AddHtmlClass(string scope, string className)
{
List<string> list = new List<string>();
if (_htmlClasses.TryGetValue(scope, out string[] value))
list = value.ToList();
list.Add(className);
_htmlClasses[scope] = list.ToArray();
}
public string PrintHtmlAttributes(string scope)
{
List<string> list = new List<string>();
if (_htmlAttributes.TryGetValue(scope, out SortedDictionary<string, string> value)) {
foreach (KeyValuePair<string, string> item2 in value) {
string item = item2.Key + "=\"" + item2.Value + "\"";
list.Add(item);
}
return string.Join(" ", list);
}
return null;
}
public string PrintHtmlClasses(string scope)
{
if (_htmlClasses.TryGetValue(scope, out string[] value))
return string.Join(" ", value);
return null;
}
public string GetSvgIcon(string path, string classNames)
{
DefaultInterpolatedStringHandler val = default(DefaultInterpolatedStringHandler);
val..ctor(11, 3);
val.AppendLiteral("./wwwroot/");
val.AppendFormatted(ThemeSettings.Config.AssetsDir);
val.AppendLiteral("/");
val.AppendFormatted(ThemeSettings.Config.SvgDir);
val.AppendFormatted(path);
string text = val.ToStringAndClear();
string text2 = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 100 100\"><rect width=\"100\" height=\"100\" fill=\"#FF9900\" rx=\"4\" ry=\"4\"/><rect width=\"50\" height=\"50\" fill=\"#FFB13B\" rx=\"4\" ry=\"4\"/><rect width=\"50\" height=\"50\" x=\"50\" y=\"50\" fill=\"#de8500\" rx=\"4\" ry=\"4\"/><g fill=\"#ff9900\"><circle cx=\"50\" cy=\"18.4\" r=\"18.4\"/><circle cx=\"72.4\" cy=\"27.6\" r=\"18.4\"/><circle cx=\"81.6\" cy=\"50\" r=\"18.4\"/><circle cx=\"72.4\" cy=\"72.4\" r=\"18.4\"/><circle cx=\"50\" cy=\"81.6\" r=\"18.4\"/><circle cx=\"27.6\" cy=\"72.4\" r=\"18.4\"/><circle cx=\"18.4\" cy=\"50\" r=\"18.4\"/><circle cx=\"27.6\" cy=\"27.6\" r=\"18.4\"/></g><path d=\"M63.086 18.385c0-7.227-5.859-13.086-13.1-13.086-7.235 0-13.096 5.859-13.096 13.086-5.1-5.11-13.395-5.11-18.497 0-5.119 5.12-5.119 13.408 0 18.524-7.234 0-13.103 5.859-13.103 13.085 0 7.23 5.87 13.098 13.103 13.098-5.119 5.11-5.119 13.395 0 18.515 5.102 5.104 13.397 5.104 18.497 0 0 7.228 5.86 13.083 13.096 13.083 7.24 0 13.1-5.855 13.1-13.083 5.118 5.104 13.416 5.104 18.513 0 5.101-5.12 5.101-13.41 0-18.515 7.216 0 13.081-5.869 13.081-13.098 0-7.227-5.865-13.085-13.081-13.085 5.101-5.119 5.101-13.406 0-18.524-5.097-5.11-13.393-5.11-18.513 0z\"/><path fill=\"#ffffff\" d=\"M55.003 23.405v14.488L65.26 27.64c0-1.812.691-3.618 2.066-5.005 2.78-2.771 7.275-2.771 10.024 0 2.771 2.766 2.771 7.255 0 10.027-1.377 1.375-3.195 2.072-5.015 2.072L62.101 44.982H76.59c1.29-1.28 3.054-2.076 5.011-2.076 3.9 0 7.078 3.179 7.078 7.087 0 3.906-3.178 7.088-7.078 7.088-1.957 0-3.721-.798-5.011-2.072H62.1l10.229 10.244c1.824 0 3.642.694 5.015 2.086 2.774 2.759 2.774 7.25 0 10.01-2.75 2.774-7.239 2.774-10.025 0-1.372-1.372-2.064-3.192-2.064-5.003L55 62.094v14.499c1.271 1.276 2.084 3.054 2.084 5.013 0 3.906-3.177 7.077-7.098 7.077-3.919 0-7.094-3.167-7.094-7.077 0-1.959.811-3.732 2.081-5.013V62.094L34.738 72.346c0 1.812-.705 3.627-2.084 5.003-2.769 2.772-7.251 2.772-10.024 0-2.775-2.764-2.775-7.253 0-10.012 1.377-1.39 3.214-2.086 5.012-2.086l10.257-10.242H23.414c-1.289 1.276-3.072 2.072-5.015 2.072-3.917 0-7.096-3.18-7.096-7.088s3.177-7.087 7.096-7.087c1.94 0 3.725.796 5.015 2.076h14.488L27.646 34.736c-1.797 0-3.632-.697-5.012-2.071-2.775-2.772-2.775-7.26 0-10.027 2.773-2.771 7.256-2.771 10.027 0 1.375 1.386 2.083 3.195 2.083 5.005l10.235 10.252V23.407c-1.27-1.287-2.082-3.053-2.082-5.023 0-3.908 3.175-7.079 7.096-7.079 3.919 0 7.097 3.168 7.097 7.079-.002 1.972-.816 3.735-2.087 5.021z\"/><g><path fill=\"#000000\" d=\"M5.3 50h89.38v40q0 5-5 5H10.3q-5 0-5-5Z\"/><path fill=\"#3f3f3f\" d=\"M14.657 54.211h71.394c2.908 0 5.312 2.385 5.312 5.315v17.91c-27.584-3.403-54.926-8.125-82.011-7.683V59.526c.001-2.93 2.391-5.315 5.305-5.315z\"/><path fill=\"#ffffff\" stroke=\"#000000\" stroke-width=\".5035\" d=\"M18.312 72.927c-2.103-2.107-3.407-5.028-3.407-8.253 0-6.445 5.223-11.672 11.666-11.672 6.446 0 11.667 5.225 11.667 11.672h-6.832c0-2.674-2.168-4.837-4.835-4.837-2.663 0-4.838 2.163-4.838 4.837 0 1.338.549 2.536 1.415 3.42.883.874 2.101 1.405 3.423 1.405v.012c3.232 0 6.145 1.309 8.243 3.416 2.118 2.111 3.424 5.034 3.424 8.248 0 6.454-5.221 11.68-11.667 11.68-6.442 0-11.666-5.222-11.666-11.68h6.828c0 2.679 2.175 4.835 4.838 4.835 2.667 0 4.835-2.156 4.835-4.835 0-1.329-.545-2.527-1.429-3.407-.864-.88-2.082-1.418-3.406-1.418-3.23 0-6.142-1.314-8.259-3.423zM61.588 53.005l-8.244 39.849h-6.85l-8.258-39.849h6.846l4.838 23.337 4.835-23.337zM73.255 69.513h11.683v11.664c0 6.452-5.226 11.678-11.669 11.678-6.441 0-11.666-5.226-11.666-11.678V64.676h-.017C61.586 58.229 66.827 53 73.253 53c6.459 0 11.683 5.225 11.683 11.676h-6.849c0-2.674-2.152-4.837-4.834-4.837-2.647 0-4.82 2.163-4.82 4.837v16.501c0 2.675 2.173 4.837 4.82 4.837 2.682 0 4.834-2.162 4.834-4.827V76.348h-4.834l.002-6.835z\"/></g></svg>";
if (File.Exists(text))
text2 = File.ReadAllText(text);
val..ctor(22, 2);
val.AppendLiteral("<span class=\"");
val.AppendFormatted(classNames);
val.AppendLiteral("\">");
val.AppendFormatted(text2);
val.AppendLiteral("</span>");
return val.ToStringAndClear();
}
public void SetDomain(string flag)
{
ThemeSettings.Config.Domain = flag;
}
public string GetDomain()
{
return ThemeSettings.Config.Domain;
}
public void SetExceptionHandler(string flag)
{
ThemeSettings.Config.ExceptionHandler = flag;
}
public string GetExceptionHandler()
{
return ThemeSettings.Config.ExceptionHandler;
}
public void SetMapFallbackPage(string flag)
{
ThemeSettings.Config.MapFallbackPage = flag;
}
public string GetMapFallbackPage()
{
return ThemeSettings.Config.MapFallbackPage;
}
public void SetVersion(string flag)
{
ThemeSettings.Config.Version = flag;
}
public string GetVersion()
{
return ThemeSettings.Config.Version;
}
public void SetAssetVersion(bool flag)
{
ThemeSettings.Config.Assets.Version = flag;
}
public bool GetAssetVersion()
{
return ThemeSettings.Config.Assets.Version;
}
public void SetUri(string flag)
{
ThemeSettings.Config.Uri = flag;
}
public string GetUri()
{
return ThemeSettings.Config.Uri;
}
public void SetLocaleSwitch(bool flag)
{
_localeSwitchEnabled = flag;
}
public bool IsLocaleSwitchEnabled()
{
return _localeSwitchEnabled;
}
public void SetLocale(string flag)
{
if (GetLocale() != flag) {
CultureInfo.CurrentCulture = new CultureInfo(flag);
CultureInfo.CurrentUICulture = new CultureInfo(flag);
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(flag);
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo(flag);
}
}
public string GetLocale()
{
return CultureInfo.CurrentCulture.Name;
}
public string GetLocaleLower()
{
return GetLocale().ToLowerInvariant();
}
public string GetLocaleReplace()
{
return GetLocale().Replace("-", "_");
}
public void SetLocaleDefault(string flag)
{
_localeDefault = flag;
}
public string GetLocaleDefault()
{
return _localeDefault;
}
public string GetLocaleDefaultLower()
{
return _localeDefault.ToLowerInvariant();
}
public string GetLocaleDefaultReplace()
{
return _localeDefault.Replace("-", "_");
}
public void SetModeSwitch(bool flag)
{
_modeSwitchEnabled = flag;
}
public bool IsModeSwitchEnabled()
{
return _modeSwitchEnabled;
}
public void SetModeDefault(string flag)
{
_modeDefault = flag;
}
public string GetModeDefault()
{
return _modeDefault;
}
public void SetDirection(DirectionEnum direction)
{
_direction = direction;
}
public DirectionEnum GetDirection()
{
return _direction;
}
public bool IsRtlDirection()
{
return _direction == DirectionEnum.RTL;
}
public string GetAssetPath(string path)
{
return "/" + ThemeSettings.Config.AssetsDir + path;
}
public string GetPartials(string path)
{
return ThemeSettings.Config.PartialsDir + "/" + path;
}
public string GetLayout(string path)
{
return ThemeSettings.Config.LayoutDir + "/" + path;
}
public string GetPages(string path)
{
return ThemeSettings.Config.PagesDir + "/" + path;
}
public string ExtendCssFilename(string path)
{
if (IsRtlDirection())
path = path.Replace(".css", ".rtl.css");
return path;
}
public Dictionary<string, Dictionary<string, string>> GetSocialMedias()
{
Dictionary<string, Dictionary<string, string>> dictionary = new Dictionary<string, Dictionary<string, string>>();
PropertyInfo[] properties = ThemeSettings.Config.SocialMedia.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in properties) {
if (!dictionary.ContainsKey(propertyInfo.Name)) {
object value = propertyInfo.GetValue(ThemeSettings.Config.SocialMedia);
if (value != null) {
Dictionary<string, string> obj = value as Dictionary<string, string>;
obj.TryGetValue("Url", out string value2);
obj.TryGetValue("Alt", out string value3);
obj.TryGetValue("Icon", out string value4);
obj.TryGetValue("Line", out string value5);
dictionary.Add(propertyInfo.Name, new Dictionary<string, string> {
{
"Url",
value2
},
{
"Alt",
value3
},
{
"Icon",
value4
},
{
"Line",
value5
}
});
}
}
}
return dictionary;
}
public string GetSocialMedia(string name, MediaEnum type)
{
if (GetSocialMedias().TryGetValue(name, out Dictionary<string, string> value) && value.TryGetValue(type.ToString(), out string value2))
return value2;
return "";
}
public ThemeCompression GetCompression()
{
return ThemeSettings.Config.Compression;
}
public ThemeCompressionLevel GetCompressionLevel()
{
return ThemeSettings.Config.Compression.Level;
}
public string GetCompressionLevelGzip()
{
return ThemeSettings.Config.Compression.Level.Gzip;
}
public CompressionLevel GetCompressionLevelGzipType()
{
return ThemeSettings.Config.Compression.Level.GzipType;
}
public string GetCompressionLevelBrotli()
{
return ThemeSettings.Config.Compression.Level.Brotli;
}
public CompressionLevel GetCompressionLevelBrotliType()
{
return ThemeSettings.Config.Compression.Level.BrotliType;
}
public string GetCompressionLevelDeflate()
{
return ThemeSettings.Config.Compression.Level.Deflate;
}
public CompressionLevel GetCompressionLevelDeflateType()
{
return ThemeSettings.Config.Compression.Level.DeflateType;
}
public ThemeCompressionResponse GetCompressionResponse()
{
return ThemeSettings.Config.Compression.Response;
}
public bool GetCompressionResponseEnableHttps()
{
return ThemeSettings.Config.Compression.Response.EnableHttps;
}
public string[] GetCompressionResponseMimeTypes()
{
return ThemeSettings.Config.Compression.Response.MimeTypes;
}
public ThemeCompressionStaticFile GetCompressionStaticFile()
{
return ThemeSettings.Config.Compression.StaticFile;
}
public string GetCompressionStaticFileMode()
{
return ThemeSettings.Config.Compression.StaticFile.Mode;
}
public HttpsCompressionMode GetCompressionStaticFileModeType()
{
return ThemeSettings.Config.Compression.StaticFile.ModeType;
}
public bool GetCompressionStaticFileChange()
{
return ThemeSettings.Config.Compression.StaticFile.Change;
}
public string GetCompressionStaticFileMaxAge()
{
return ThemeSettings.Config.Compression.StaticFile.MaxAge;
}
public TimeSpan GetCompressionStaticFileMaxAgeSpan()
{
return ThemeSettings.Config.Compression.StaticFile.MaxAgeSpan;
}
public int GetCompressionStaticFileMaxAgeSecond()
{
return ThemeSettings.Config.Compression.StaticFile.MaxAgeSecond;
}
public Dictionary<string, string> GetCompressionStaticFileHeaders()
{
return ThemeSettings.Config.Compression.StaticFile.Headers;
}
public string[] GetCompressionStaticFileExtensions()
{
return ThemeSettings.Config.Compression.StaticFile.Extensions;
}
public string GetCompressionStaticFileCacheControl()
{
return ThemeSettings.Config.Compression.StaticFile.CacheControl;
}
public string GetCompressionStaticFileCacheControlFormat()
{
return ThemeSettings.Config.Compression.StaticFile.CacheControlFormat;
}
public Dictionary<string, Dictionary<string, string>> GetLanguages()
{
return ThemeSettings.Config.Languages.List;
}
public KeyValuePair<string, string> GetLanguages(string lang)
{
if (GetLanguages().TryGetValue(lang, out Dictionary<string, string> value))
return value.First();
return new KeyValuePair<string, string>(ThemeSettings.Config.Languages.UnknownName, ThemeSettings.Config.Languages.DefaultFlag);
}
public List<string> GetLangActiveLang()
{
return ThemeSettings.Config.Languages.ActiveLang;
}
public string GetLangUnknownName()
{
return ThemeSettings.Config.Languages.UnknownName;
}
public string GetLangUnknownLang()
{
return ThemeSettings.Config.Languages.UnknownLang;
}
public string GetLangDefaultFlag()
{
return ThemeSettings.Config.Languages.DefaultFlag;
}
public string GetLangCookieName()
{
return ThemeSettings.Config.Languages.CookieName;
}
public bool IsLangLocale(string lang)
{
if (GetLanguages(lang).Key == GetLocale())
return true;
return false;
}
public bool IsLangLocaleDefault(string lang)
{
if (GetLanguages(lang).Key == GetLocaleDefault())
return true;
return false;
}
public bool IsLangActiveLang(string lang)
{
if (GetLanguages().ContainsKey(lang)) {
KeyValuePair<string, string> languages = GetLanguages(lang);
if (GetLangActiveLang().Contains(languages.Key))
return true;
}
return false;
}
public string GetManifest()
{
return GetAssetPath(ThemeSettings.Config.Assets.Manifest);
}
public string GetFavicon()
{
return GetAssetPath(ThemeSettings.Config.Assets.Favicon);
}
public string[] GetJavascripts()
{
return ThemeSettings.Config.Assets.Js.ToArray();
}
public string[] GetFonts()
{
return ThemeSettings.Config.Assets.Font.ToArray();
}
public string[] GetCss()
{
return ThemeSettings.Config.Assets.Css.ToArray();
}
public string[] GetGlobalAssets(TypeEnum type)
{
List<string> list = new List<string>();
List<string> list2 = new List<string>();
switch (type) {
case TypeEnum.Js:
list = ThemeSettings.Config.Assets.Js;
break;
case TypeEnum.Css:
list = ThemeSettings.Config.Assets.Css;
break;
case TypeEnum.Font:
list = ThemeSettings.Config.Assets.Font;
break;
}
if (list.Any()) {
foreach (string item in list) {
switch (type) {
case TypeEnum.Js:
list2.Add(GetAssetPath(item));
break;
case TypeEnum.Css:
list2.Add(GetAssetPath(ExtendCssFilename(item)));
break;
case TypeEnum.Font:
list2.Add((item.Contains("https://") || item.Contains("http://")) ? item : GetAssetPath(item));
break;
}
}
}
return list2.ToArray();
}
public void AddVendors(string[] vendors)
{
foreach (string item in vendors) {
if (!_vendorFiles.Contains(item))
_vendorFiles.Add(item);
}
}
public void AddVendor(string vendor)
{
if (!_vendorFiles.Contains(vendor))
_vendorFiles.Add(vendor);
}
public void AddJavascriptFile(string file)
{
if (!_jsFiles.Contains(file))
_jsFiles.Add(file);
}
public void AddFontFile(string file)
{
if (!_fontFiles.Contains(file))
_fontFiles.Add(file);
}
public void AddCssFile(string file)
{
if (!_cssFiles.Contains(file))
_cssFiles.Add(file);
}
public string[] GetJavascriptFiles()
{
return _jsFiles.ToArray();
}
public string[] GetFontFiles()
{
return _fontFiles.ToArray();
}
public string[] GetCssFiles()
{
return _cssFiles.ToArray();
}
public void ClearJavascriptFiles()
{
_jsFiles.Clear();
}
public void ClearFontFiles()
{
_fontFiles.Clear();
}
public void ClearCssFiles()
{
_cssFiles.Clear();
}
public string[] GetVendors(TypeEnum type)
{
Dictionary<string, ThemeVendors> vendors = ThemeSettings.Config.Vendors;
List<string> list = new List<string>();
if (_vendorFiles.Any()) {
foreach (string vendorFile in _vendorFiles) {
if (vendors.TryGetValue(vendorFile, out ThemeVendors value)) {
List<string> list2 = new List<string>();
switch (type) {
case TypeEnum.Js:
if (value.Js != null && value.Js.Any())
list2.AddRange(value.Js);
break;
case TypeEnum.Css:
if (value.Css != null && value.Css.Any())
list2.AddRange(value.Css);
break;
case TypeEnum.Font:
if (value.Font != null && value.Font.Any())
list2.AddRange(value.Font);
break;
}
if (list2.Any()) {
foreach (string item2 in list2) {
string item = (item2.Contains("https://") || item2.Contains("http://")) ? item2 : GetAssetPath(item2);
list.Add(item);
}
}
}
}
}
return list.ToArray();
}
public string GetAttributeValue(string scope, string attributeName)
{
if (_htmlAttributes.TryGetValue(scope, out SortedDictionary<string, string> value)) {
if (value.TryGetValue(attributeName, out string value2))
return value2;
return "";
}
return "";
}
}
}