diff --git a/LuYao.Toolkit.Core/AppHelper.cs b/LuYao.Toolkit.Core/AppHelper.cs new file mode 100644 index 0000000..2c6edf3 --- /dev/null +++ b/LuYao.Toolkit.Core/AppHelper.cs @@ -0,0 +1,19 @@ +using System; +using System.Reflection; + +namespace LuYao.Toolkit +{ + public static class AppHelper + { + public static Type ViewModelTypeResolver(Type viewType, params Assembly[] assemblies) + { + var name = $"{viewType.FullName}ViewModel"; + foreach (var assembly in assemblies) + { + var type = assembly.GetType(name); + if (type != null) return type; + } + return null; + } + } +} diff --git a/LuYao.Toolkit.Core/BuildFunctionsReport.linq b/LuYao.Toolkit.Core/BuildFunctionsReport.linq new file mode 100644 index 0000000..442684d --- /dev/null +++ b/LuYao.Toolkit.Core/BuildFunctionsReport.linq @@ -0,0 +1,43 @@ + + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\netstandard2.0\LuYao.Common.dll + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\netstandard2.0\LuYao.Toolkit.Core.dll + LuYao.Toolkit.Channels + HtmlAgilityPack + + +var channels = Channel.Channels; +var html = new HtmlAgilityPack.HtmlDocument(); +var body = html.CreateElement("body"); +html.DocumentNode.AppendChild(body); +body.AppendChild(html.CreateTextNode(Environment.NewLine)); +foreach (var item in channels) +{ + body.AppendChild(html.CreateComment("")); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + var h3 = html.CreateElement("h3"); + h3.AppendChild(html.CreateTextNode(item.Title)); + body.AppendChild(h3); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + body.AppendChild(html.CreateComment("")); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + + + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + body.AppendChild(html.CreateComment("")); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + var ul = html.CreateElement("ul"); + body.AppendChild(ul); + foreach (var func in item.Items) + { + ul.AppendChild(html.CreateTextNode(Environment.NewLine)); + var li = html.CreateElement("li"); + li.AppendChild(html.CreateTextNode(func.Title)); + ul.AppendChild(li); + } + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + body.AppendChild(html.CreateComment("")); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); + body.AppendChild(html.CreateTextNode(Environment.NewLine)); +} + +html.DocumentNode.InnerHtml.Dump(); \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Channels/Channel.Converts.cs b/LuYao.Toolkit.Core/Channels/Channel.Converts.cs new file mode 100644 index 0000000..464eecc --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Converts.cs @@ -0,0 +1,213 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static ConvertsChannel Converts { get; } = new ConvertsChannel(); + public class ConvertsChannel : Channel + { + public FunctionItem UnixTimestamp { get; } + public FunctionItem RsaKeyConvert { get; } + public FunctionItem IndentJson { get; } + public FunctionItem IndentXml { get; } + public FunctionItem HexConvert { get; } + public FunctionItem TranslateXmlByXsl { get; } + public FunctionItem TranslateJsonByJs { get; } + public FunctionItem TranslateJsonByLiquid { get; } + public FunctionItem ColorConverter { get; } + public FunctionItem JsonToCSharp { get; } + public FunctionItem JsonToCsv { get; } + public FunctionItem PostmanConverter { get; } + public FunctionItem YamlToJson { get; } + + public ConvertsChannel() : base(nameof(Converts), "格式转换", Icons.CogTransfer) + { + this.UnixTimestamp = new FunctionItem(this, Guid.Parse("F9FF43A6C1C64DB4A296241061656868"), nameof(UnixTimestamp)) + { + Title = "Unix 时间戳转换", + Icon = Icons.Alarm, + Description = "Unix 时间戳转换可以把Unix时间转成北京时间。", + View = Views.ViewNames.Channels.Converters.UnixTimestamp, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "UnixShiJianChuoZhuanHuan", "UnixSJCZH" }, + }; + + this.RsaKeyConvert = new FunctionItem(this, Guid.Parse("E1760524FC2F4434AF2EFAA5184C046E"), nameof(RsaKeyConvert)) + { + Title = "RSA 密钥格式转换", + Icon = Icons.KeyChange, + Description = "RSA 私钥格式转换工具,支持 PKCS#1 、PKCS#8 私钥格式相互转换。", + View = Views.ViewNames.Channels.Converters.RsaKeyConvert, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "rsaMiYaoGeShiZhuanHuan", "RsaMYGSZH", "MYZH", "MiYaoZhuanHuan" }, + }; + + this.IndentJson = new FunctionItem(this, Guid.Parse("3D3FA103F8D84067BA0FDAE3DD356C6D"), nameof(IndentJson)) + { + Title = "JSON 格式化", + Icon = Icons.LanguageJavascript, + Description = "支持对 JSON 字符串美化、压缩、转义等功能。", + View = Views.ViewNames.Channels.Converters.IndentJson, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "JsonGeShiHua", "JsonGSH" }, + }; + + this.IndentXml = new FunctionItem(this, Guid.Parse("B8665B3060FC4BEF982F2D3C39764A69"), nameof(IndentXml)) + { + Title = "XML 格式化", + Icon = Icons.Xml, + Description = "支持对 XML 字符串美化、压缩等功能。", + View = Views.ViewNames.Channels.Converters.IndentXml, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "XmlGeShiHua", "XmlGSH" }, + }; + + this.HexConvert = new FunctionItem(this, Guid.Parse("BCA1AA0C8E5545B5A51D37116EF07BF7"), nameof(HexConvert)) + { + Title = "进制转换", + Icon = Icons.Numeric, + Description = "支持在2~36进制之间进行任意转换。", + View = Views.ViewNames.Channels.Converters.HexConvert, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "JinZhiZhuanHuan", "JZZH" }, + }; + + this.TranslateXmlByXsl = new FunctionItem(this, Guid.Parse("ECBBC27B95CE48CFB27E2E91FCE3C82F"), nameof(TranslateXmlByXsl)) + { + Title = "XSLT 转换", + Icon = Icons.Xml, + Description = "可以将 XML 数据档转换为另外的 XML 或其它格式,如 HTML 网页,纯文字。", + View = Views.ViewNames.Channels.Converters.TranslateXmlByXsl, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "XSLTZhuanHuan", "XSLTZH" }, + }; + + this.TranslateJsonByJs = new FunctionItem(this, Guid.Parse("F732A4D50D3C4A87AD681DD2D75B6C26"), nameof(TranslateJsonByJs)) + { + Title = "JSON 转换", + Icon = Icons.LanguageJavascript, + Description = "可以将 JSON 数据档通过 JavaScript 转换为另外的 JSON 或其它格式。", + View = Views.ViewNames.Channels.Converters.TranslateJsonByJs, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "JSONZhuanHuan", "JSONZH" }, + }; + + this.TranslateJsonByLiquid = new FunctionItem(this, Guid.Parse("F18B557AEE614BAABE2942F98570C42F"), nameof(TranslateJsonByLiquid)) + { + Title = "Liquid 转换", + Icon = Icons.LiquidSpot, + Description = "可以将 JSON 数据档通过 Liquid 转换为其它格式。", + View = Views.ViewNames.Channels.Converters.TranslateJsonByLiquid, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "LiquidZhuanHuan", "LiquidZH" }, + }; + + this.ColorConverter = new FunctionItem(this, Guid.Parse("B528E5B0C66548BAB5CBB8D210312E8C"), nameof(ColorConverter)) + { + Title = "RGB 颜色转换", + Icon = Icons.ColorHelper, + Description = "RGB颜色和16进制色互转。", + View = Views.ViewNames.Channels.Converters.ColorConverter, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "RGBYanSeZhuanHuan", "RGBYSZH" }, + }; + + this.JsonToCSharp = new FunctionItem(this, Guid.Parse("6CBE22DCF367401CAFE331CA5B3843DA"), nameof(JsonToCSharp)) + { + Title = "JSON 转 C# 实体类", + Icon = Icons.AccountConvert, + Description = "将 JSON 对象转换为相对应的 C# 实体类", + View = Views.ViewNames.Channels.Converters.JsonToCSharp, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "JSONZhuanC#ShiTiLei", "JSONZCSTL" }, + }; + + this.JsonToCsv = new FunctionItem(this, Guid.Parse("0A62665513684D9DB560A4C5E1BD3EFE"), nameof(JsonToCsv)) + { + Title = "JSON 转 CSV", + Icon = Icons.MicrosoftExcel, + Description = "将 JSON 转换为 CSV 数据", + View = Views.ViewNames.Channels.Converters.JsonToCsv, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "JSONZhuanCSV", "JSONZCSV" }, + }; + + this.PostmanConverter = new FunctionItem(this, Guid.Parse("AC92D3CB1CEA46D2A263401B2D8E2577"), nameof(PostmanConverter)) + { + Title = "Postman 数据转换", + Icon = Icons.Web, + Description = "Postman 参数格式互转", + View = Views.ViewNames.Channels.Converters.PostmanConverter, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "PostmanShuJuZhuanHuan", "PostmanSJZH" }, + }; + + this.YamlToJson = new FunctionItem(this, Guid.Parse("78C9651CF6E5470E801CAE043ADBC0CB"), nameof(YamlToJson)) + { + Title = "Yaml 转 Json", + Icon = Icons.CodeJson, + Description = "Yaml 和 Json 格式转换", + View = Views.ViewNames.Channels.Converters.YamlToJson, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "YamlZhuanJson", "Yaml", "Json" }, + }; + + this.Items = new[] + { + UnixTimestamp, + RsaKeyConvert, + IndentJson, + IndentXml, + HexConvert, + TranslateXmlByXsl, + TranslateJsonByJs, + TranslateJsonByLiquid, + ColorConverter, + JsonToCSharp, + JsonToCsv, + PostmanConverter, + YamlToJson, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.CrossBorder.cs b/LuYao.Toolkit.Core/Channels/Channel.CrossBorder.cs new file mode 100644 index 0000000..c0a170d --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.CrossBorder.cs @@ -0,0 +1,33 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static CrossBorderChannel CrossBorder { get; } = new CrossBorderChannel(); + public class CrossBorderChannel : Channel + { + public FunctionItem MercadoToWorldFirst { get; } + + public CrossBorderChannel() : base(nameof(CrossBorder), "跨境电商", Icons.Shopping) + { + this.MercadoToWorldFirst = new FunctionItem(this, Guid.Parse("846209761E14421BB59B068225443F31"), nameof(MercadoToWorldFirst)) + { + Title = "美客多转万里汇", + Icon = Icons.MicrosoftExcel, + Description = "将美客多订单报表转为万里汇所需 Excel", + View = Views.ViewNames.Channels.CrossBorder.MercadoToWorldFirst, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "MeiKeDuo", "MKD", "Mercado", "WanLiHui", "WLH" }, + }; + + this.Items = new[] + { + MercadoToWorldFirst, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Encodings.cs b/LuYao.Toolkit.Core/Channels/Channel.Encodings.cs new file mode 100644 index 0000000..8e906ce --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Encodings.cs @@ -0,0 +1,123 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static EncodingsChannel Encodings { get; } = new EncodingsChannel(); + public class EncodingsChannel : Channel + { + public FunctionItem StringZipper { get; } + public FunctionItem UrlEncode { get; } + public FunctionItem HtmlEncode { get; } + public FunctionItem Ascii85Encode { get; } + public FunctionItem Base64Encode { get; } + public FunctionItem Base62Encode { get; } + public FunctionItem Base16Encode { get; } + + public EncodingsChannel() : base(nameof(Encodings), "编码互转", Icons.Altimeter) + { + this.StringZipper = new FunctionItem(this, Guid.Parse("C20499BE2E874AB193B14E59B97A84B4"), nameof(StringZipper)) + { + Title = "文本压缩", + Icon = Icons.Package, + Description = "将字符串压缩后再进行编码,以减少带宽占用。", + View = Views.ViewNames.Channels.Encodings.StringZipper, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "WenBenYaSuo", "WBYS" }, + }; + + this.UrlEncode = new FunctionItem(this, Guid.Parse("6206D4C38FAC4750848595D22DE565E1"), nameof(UrlEncode)) + { + Title = "URL 编码", + Icon = Icons.Web, + Description = "为了让包含中文的URL可以使用,您可以使用本工具对中文进行UrlEncode编码。", + View = Views.ViewNames.Channels.Encodings.UrlEncode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "URLBianMa", "URLBM" }, + }; + + this.HtmlEncode = new FunctionItem(this, Guid.Parse("8ADFDB01B0C742408E405999EEA813B7"), nameof(HtmlEncode)) + { + Title = "HTML 编码", + Icon = Icons.LanguageHtml5, + Description = "对html字符串进行HtmlEncode编码与HtmlDecode解码。", + View = Views.ViewNames.Channels.Encodings.HtmlEncode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "HTMLBianMa", "HTMLBM" }, + }; + + this.Ascii85Encode = new FunctionItem(this, Guid.Parse("BAE9969570D64055AAE5B357BF42E804"), nameof(Ascii85Encode)) + { + Title = "ASCII85 编码", + Icon = Icons.Altimeter, + Description = "ASCII85 编码解码,可以指定字符串编码。", + View = Views.ViewNames.Channels.Encodings.Ascii85Encode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ASCII85BianMa", "ASCII85BM" }, + }; + + this.Base64Encode = new FunctionItem(this, Guid.Parse("ED00FB68A01E458C9122EE976D0036AA"), nameof(Base64Encode)) + { + Title = "BASE64 编码", + Icon = Icons.Altimeter, + Description = "Base64 编码解码,可以指定字符串编码。", + View = Views.ViewNames.Channels.Encodings.Base64Encode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "Base64BianMa", "Base64BM" }, + }; + + this.Base62Encode = new FunctionItem(this, Guid.Parse("3B78E3A4A1E749CBA151B24C147ECAC2"), nameof(Base62Encode)) + { + Title = "BASE62 编码", + Icon = Icons.Altimeter, + Description = "Base62 编码解码,可以指定字符串编码。", + View = Views.ViewNames.Channels.Encodings.Base62Encode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "Base62BianMa", "Base62BM" }, + }; + + this.Base16Encode = new FunctionItem(this, Guid.Parse("B018FD5E66374039A5A37BB3F57F3630"), nameof(Base16Encode)) + { + Title = "BASE16 编码", + Icon = Icons.Altimeter, + Description = "Base16 编码解码,可以指定字符串编码。", + View = Views.ViewNames.Channels.Encodings.Base16Encode, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "Base16BianMa", "Base16BM" }, + }; + + this.Items = new[] + { + StringZipper, + UrlEncode, + HtmlEncode, + Ascii85Encode, + Base64Encode, + Base62Encode, + Base16Encode, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Files.cs b/LuYao.Toolkit.Core/Channels/Channel.Files.cs new file mode 100644 index 0000000..f3fceaf --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Files.cs @@ -0,0 +1,48 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static FilesChannel Files { get; } = new FilesChannel(); + public class FilesChannel : Channel + { + public FunctionItem DetectFileEncodeing { get; } + public FunctionItem HashFile { get; } + + public FilesChannel() : base(nameof(Files), "文件处理", Icons.File) + { + this.DetectFileEncodeing = new FunctionItem(this, Guid.Parse("5AA7E19C47DE41D7BC7FE0C8FD2EF56F"), nameof(DetectFileEncodeing)) + { + Title = "编码识别", + Icon = Icons.TextRecognition, + Description = "文本文件编码识别", + View = Views.ViewNames.Channels.Files.DetectFileEncodeing, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "BianMaShiBie", "BMSB", "Encoding" }, + }; + + this.HashFile = new FunctionItem(this, Guid.Parse("D7CE1BB56ECA4DBA952B2BE96DD8E967"), nameof(HashFile)) + { + Title = "文件校验", + Icon = Icons.HandSaw, + Description = "获取文件校验值", + View = Views.ViewNames.Channels.Files.HashFile, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "WenJianJiaoYan", "WJJY", "Hash", "MD5", "SHA1", "SHA256", "SHA512" }, + }; + + this.Items = new[] + { + DetectFileEncodeing, + HashFile, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Gens.cs b/LuYao.Toolkit.Core/Channels/Channel.Gens.cs new file mode 100644 index 0000000..a578e14 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Gens.cs @@ -0,0 +1,108 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static GensChannel Gens { get; } = new GensChannel(); + public class GensChannel : Channel + { + public FunctionItem GenGuid { get; } + public FunctionItem GenPassword { get; } + public FunctionItem GenAesKey { get; } + public FunctionItem GenRsaKey { get; } + public FunctionItem GenXCodeEntity { get; } + public FunctionItem GenLinesByRange { get; } + + public GensChannel() : base(nameof(Gens), "数据生成", Icons.Refresh) + { + this.GenGuid = new FunctionItem(this, Guid.Parse("E135CA55B356496D910B7A95BBC552D3"), nameof(GenGuid)) + { + Title = "生成 GUID", + Icon = Icons.Earth, + Description = "生成随机 Guid", + View = Views.ViewNames.Channels.Gens.GenGuid, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ShengChengGuid", "SCGuid" }, + }; + + this.GenPassword = new FunctionItem(this, Guid.Parse("CFD68DBC4D054968A9C859FA358F2152"), nameof(GenPassword)) + { + Title = "生成密码", + Icon = Icons.FormTextboxPassword, + Description = "生成随机密码", + View = Views.ViewNames.Channels.Gens.GenPassword, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ShengChengMiMa", "SCMM" }, + }; + + this.GenAesKey = new FunctionItem(this, Guid.Parse("23A02AD776D74772B88919707B4E00F3"), nameof(GenAesKey)) + { + Title = "生成 AES 密钥", + Icon = Icons.Key, + Description = "生成随机 AES 密钥", + View = Views.ViewNames.Channels.Gens.GenAesKey, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ShengChengAesMiYao", "SCAESMY" }, + }; + + this.GenRsaKey = new FunctionItem(this, Guid.Parse("A5DB45C57100451F8847AA79C9EDEC9F"), nameof(GenRsaKey)) + { + Title = "生成 RSA 密钥", + Icon = Icons.KeyPlus, + Description = "生成随机 RSA 密钥", + View = Views.ViewNames.Channels.Gens.GenRsaKey, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ShengChengRsaMiYao", "SCRSAMY" }, + }; + + this.GenXCodeEntity = new FunctionItem(this, Guid.Parse("629FE6AC348840459F46FB59E195FA47"), nameof(GenXCodeEntity)) + { + Title = "生成 XCode 实体", + Icon = Icons.Clover, + Description = "通过 XML 文件生成 XCode 实体", + View = Views.ViewNames.Channels.Gens.GenXCodeEntity, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ShengChengXCodeShiTi", "SCXCodeST" }, + }; + + this.GenLinesByRange = new FunctionItem(this, Guid.Parse("E8972DB2AECD4C88B2EB3038AF7CF835"), nameof(GenLinesByRange)) + { + Title = "模板批量生成", + Icon = Icons.FormatLineStyle, + Description = "通过一个数字范围和字符串模板生成一批字符串,常用于分表系统的迁移语句编写。", + View = Views.ViewNames.Channels.Gens.GenLinesByRange, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "MuBanPiLiangShengCheng", "MBPLSC" }, + }; + + this.Items = new[] + { + GenGuid, + GenPassword, + GenAesKey, + GenRsaKey, + GenXCodeEntity, + GenLinesByRange, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Images.cs b/LuYao.Toolkit.Core/Channels/Channel.Images.cs new file mode 100644 index 0000000..f73ce60 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Images.cs @@ -0,0 +1,78 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static ImagesChannel Images { get; } = new ImagesChannel(); + public class ImagesChannel : Channel + { + public FunctionItem ImageToIcon { get; } + public FunctionItem GifSplitter { get; } + public FunctionItem ImageToBase64 { get; } + public FunctionItem Base64ToImage { get; } + + public ImagesChannel() : base(nameof(Images), "图片处理", Icons.Image) + { + this.ImageToIcon = new FunctionItem(this, Guid.Parse("5CF336BBB79548F88231ECFCACC0918F"), nameof(ImageToIcon)) + { + Title = "图片转图标", + Icon = Icons.Emoticon, + Description = "将图片转为 Icon 格式", + View = Views.ViewNames.Channels.Images.ImageToIcon, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "TuPianZhuanTuBiao", "TPZTB" }, + }; + + this.GifSplitter = new FunctionItem(this, Guid.Parse("7D335ED73BCA47C9A57E2E08BC760268"), nameof(GifSplitter)) + { + Title = "Gif 分割", + Icon = Icons.FileGifBox, + Description = "分割gif图片,可用于gif图片的打印,制作翻页动画册子。", + View = Views.ViewNames.Channels.Images.GifSplitter, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "GifFenGe", "GIFFG" }, + }; + + this.ImageToBase64 = new FunctionItem(this, Guid.Parse("43FB2B33182A486E9F75533DF81B363E"), nameof(ImageToBase64)) + { + Title = "图片转 Base64", + Icon = Icons.FileImageOutline, + Description = "图片转换成base64编码工具", + View = Views.ViewNames.Channels.Images.ImageToBase64, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "TuPianZhuanBase64", "TPZBase64", "DataUrl" }, + }; + + this.Base64ToImage = new FunctionItem(this, Guid.Parse("653EC3972B5B4697B2F663D7F36497A8"), nameof(Base64ToImage)) + { + Title = "Base64 转图片", + Icon = Icons.FileImageOutline, + Description = "Base64编码图片还原为图片的工具", + View = Views.ViewNames.Channels.Images.Base64ToImage, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "Base64ZhuanTuPian", "Base64ZTP", "DataUrl" }, + }; + + this.Items = new[] + { + ImageToIcon, + GifSplitter, + ImageToBase64, + Base64ToImage, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Networks.cs b/LuYao.Toolkit.Core/Channels/Channel.Networks.cs new file mode 100644 index 0000000..a98fada --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Networks.cs @@ -0,0 +1,153 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static NetworksChannel Networks { get; } = new NetworksChannel(); + public class NetworksChannel : Channel + { + public FunctionItem IPLookup { get; } + public FunctionItem Ping { get; } + public FunctionItem Whois { get; } + public FunctionItem UserAgentParser { get; } + public FunctionItem UrlAnalyzer { get; } + public FunctionItem RemoteDesktopManager { get; } + public FunctionItem TrafficMonitor { get; } + public FunctionItem HttpProxyChecker { get; } + public FunctionItem PortProxy { get; } + + public NetworksChannel() : base(nameof(Networks), "网络工具", Icons.Magnet) + { + this.IPLookup = new FunctionItem(this, Guid.Parse("AC449F65DF5D49D086604AAC55E3101D"), nameof(IPLookup)) + { + Title = "IP 查询", + Icon = Icons.IpNetwork, + Description = "本工具可以获取当前的IP地址,输入IP可以查询对应的归属地、地理位置信息。可以精确到运营商和国家、省市级别。", + View = Views.ViewNames.Channels.Networks.IPLookup, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "IPChaXun", "IPCX" }, + }; + + this.Ping = new FunctionItem(this, Guid.Parse("11561511804445D6948691190488EF7E"), nameof(Ping)) + { + Title = "Ping 检测", + Icon = Icons.Speedometer, + Description = "通过该工具可以 Ping 服务器以检测服务器响应速度。", + View = Views.ViewNames.Channels.Networks.Ping, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "PINGJianCe", "PINGJC" }, + }; + + this.Whois = new FunctionItem(this, Guid.Parse("CD05842B0AAF487DA23EBD4CEE84EABC"), nameof(Whois)) + { + Title = "Whois 信息查询", + Icon = Icons.CardAccountDetailsOutline, + Description = "域名注册信息查询", + View = Views.ViewNames.Channels.Networks.Whois, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "WhoisXinXiChaXun", "WhoisXXCX" }, + }; + + this.UserAgentParser = new FunctionItem(this, Guid.Parse("6514BB9F8DD34418A5167F6C89473469"), nameof(UserAgentParser)) + { + Title = "User Agent 解析", + Icon = Icons.Web, + Description = "通过UA分析出浏览器名称、浏览器版本号、浏览器渲染引擎、浏览器操作系统等信息。", + View = Views.ViewNames.Channels.Networks.UserAgentParser, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "UserAgentJieXi", "UserAgentJieXi", "UAJX" }, + }; + + this.UrlAnalyzer = new FunctionItem(this, Guid.Parse("2E9F578A754E459F9216A670AEE26DE0"), nameof(UrlAnalyzer)) + { + Title = "URL 分析器", + Icon = Icons.Abacus, + Description = "获取一个 URL 地址的详细信息", + View = Views.ViewNames.Channels.Networks.UrlAnalyzer, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "URLFenXiQi", "URLFXQ" }, + }; + + this.RemoteDesktopManager = new FunctionItem(this, Guid.Parse("0B8C2033F49D4C28A1D488AE256EBD2D"), nameof(RemoteDesktopManager)) + { + Title = "远程桌面", + Icon = Icons.RemoteDesktop, + Description = "简易远程桌面管理工具", + View = Views.ViewNames.Channels.Networks.RemoteDesktopManager, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = false, + Keywords = new string[] { "YuanChengZhuoMian", "YCZM", "RDP", "RDO", "RDM" }, + }; + + this.TrafficMonitor = new FunctionItem(this, Guid.Parse("A16B2AD7913146FAB522B5147AE0222E"), nameof(TrafficMonitor)) + { + Title = "流量监控", + Icon = Icons.Wan, + Description = "查看程序的网络流量", + View = Views.ViewNames.Channels.Networks.TrafficMonitor, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = false, + Keywords = new string[] { "LiuLiangJianKong", "LLJK" }, + }; + + this.HttpProxyChecker = new FunctionItem(this, Guid.Parse("3DC849233B1E4FF1A8ADA09ECB30933B"), nameof(HttpProxyChecker)) + { + Title = "HTTP 代理检测", + Icon = Icons.WebCheck, + Description = "测试 HTTP 代理服务器是否正常工作", + View = Views.ViewNames.Channels.Networks.HttpProxyChecker, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "HTTPDaiLiJianCe", "HTTPDLJC", "HttpProxyChecker" }, + }; + + this.PortProxy = new FunctionItem(this, Guid.Parse("D980814A28E94C7E930A3021EDD0D14C"), nameof(PortProxy)) + { + Title = "端口转发", + Icon = Icons.Trackpad, + Description = "端口转发配置工具,基于 netsh 。", + View = Views.ViewNames.Channels.Networks.PortProxy.Index, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = false, + Keywords = new string[] { "DuanKouZhuanFa", "DKZF", "PORT", "PROXY", "NETSH" }, + }; + + this.Items = new[] + { + IPLookup, + Ping, + Whois, + UserAgentParser, + UrlAnalyzer, + RemoteDesktopManager, + TrafficMonitor, + HttpProxyChecker, + PortProxy, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Other.cs b/LuYao.Toolkit.Core/Channels/Channel.Other.cs new file mode 100644 index 0000000..e631be8 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Other.cs @@ -0,0 +1,33 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static OtherChannel Other { get; } = new OtherChannel(); + public class OtherChannel : Channel + { + public FunctionItem SystemToolkit { get; } + + public OtherChannel() : base(nameof(Other), "其他工具", Icons.Puzzle) + { + this.SystemToolkit = new FunctionItem(this, Guid.Parse("D8F1C1B5B3674EB6AE1BDB05EF15BC16"), nameof(SystemToolkit)) + { + Title = "系统工具", + Icon = Icons.MicrosoftWindows, + Description = "Windows 系统工具", + View = Views.ViewNames.Channels.Other.SystemToolkit, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = false, + Keywords = new string[] { "XiTongGongJu", "XTGJ" }, + }; + + this.Items = new[] + { + SystemToolkit, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.Texts.cs b/LuYao.Toolkit.Core/Channels/Channel.Texts.cs new file mode 100644 index 0000000..44a5ae5 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.Texts.cs @@ -0,0 +1,138 @@ +using System; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static TextsChannel Texts { get; } = new TextsChannel(); + public class TextsChannel : Channel + { + public FunctionItem GoogleTranslate { get; } + public FunctionItem TextJoin { get; } + public FunctionItem LogReader { get; } + public FunctionItem FullHalfConvert { get; } + public FunctionItem CsvReader { get; } + public FunctionItem RegexEvaluator { get; } + public FunctionItem YoudaoDictionary { get; } + public FunctionItem HashCalculator { get; } + + public TextsChannel() : base(nameof(Texts), "文字工具", Icons.FormatText) + { + this.GoogleTranslate = new FunctionItem(this, Guid.Parse("FDFA4822F6C94B6DAC9A2C7AF37DC407"), nameof(GoogleTranslate)) + { + Title = "谷歌翻译", + Icon = Icons.Translate, + Description = "Google 的免费翻译服务可提供简体中文和另外 100 多种语言之间的互译功能。", + View = Views.ViewNames.Channels.Texts.GoogleTranslate, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "GuGeFanYi", "GGFY" }, + }; + + this.TextJoin = new FunctionItem(this, Guid.Parse("E6D432D4FA63469F983B3DC2D7A08A1B"), nameof(TextJoin)) + { + Title = "多行拼接", + Icon = Icons.FormatLineStyle, + Description = "多用于拼接 SQL 中的 IN 语句参数", + View = Views.ViewNames.Channels.Texts.TextJoin, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "DuoHangPinJie", "DHPJ" }, + }; + + this.LogReader = new FunctionItem(this, Guid.Parse("6CF8B81E3D7541C7B4D50069AA6DC29D"), nameof(LogReader)) + { + Title = "日志查看器", + Icon = Icons.SearchWeb, + Description = "用于查看不断输出的日志", + View = Views.ViewNames.Channels.Texts.LogReader, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "RiZhiChaKanQi", "RZCKQ" }, + }; + + this.FullHalfConvert = new FunctionItem(this, Guid.Parse("7571EB70555C41428343CC086DCB5A33"), nameof(FullHalfConvert)) + { + Title = "全角半角转换", + Icon = Icons.CircleHalfFull, + Description = "全角占两个字节,全角是一种电脑字符,且每个全角字符占用两个标准字符(或半角字符)位置。半角占一个字节,全角半角转换工具,很方便的将全角字符和半角字符相互切换。", + View = Views.ViewNames.Channels.Texts.FullHalfConvert, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "QuanJiaoBanJiaoZhuanHuan", "QJBJZH", "BanJiaoZhuanHuan", "QuanJiaoZhuanHuan", "QJZH", "BJZH" }, + }; + + this.CsvReader = new FunctionItem(this, Guid.Parse("7571EB70555C41428343CC086DCB5A33"), nameof(CsvReader)) + { + Title = "CSV 查看器", + Icon = Icons.MicrosoftExcel, + Description = "用于预览 CSV 文件", + View = Views.ViewNames.Channels.Texts.CsvReader, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "CSVChaKanQi", "CSVCKQ" }, + }; + + this.RegexEvaluator = new FunctionItem(this, Guid.Parse("7349B31A354440B4AD76C677D90D8D04"), nameof(RegexEvaluator)) + { + Title = "正则测试", + Icon = Icons.Regex, + Description = "正则表达式测试工具", + View = Views.ViewNames.Channels.Texts.RegexEvaluator, + IsNew = false, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "ZhengZeCeShi", "ZZCS", "regex" }, + }; + + this.YoudaoDictionary = new FunctionItem(this, Guid.Parse("6D80E543C4274281BF7BB46ACDF54A87"), nameof(YoudaoDictionary)) + { + Title = "有道词典", + Icon = Icons.Bookshelf, + Description = "英汉词典", + View = Views.ViewNames.Channels.Texts.YoudaoDictionary, + IsNew = false, + UseNetwork = true, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "YouDaoCiDian", "YDCD" }, + }; + + this.HashCalculator = new FunctionItem(this, Guid.Parse("4ABD65D372644199B78B6F2F60C829E8"), nameof(HashCalculator)) + { + Title = "哈希计算器", + Icon = Icons.Calculator, + Description = "计算文本的哈希值,支持 HMAC 算法。", + View = Views.ViewNames.Channels.Texts.HashCalculator, + IsNew = true, + UseNetwork = false, + IsDocument = false, + Multiboxing = true, + Keywords = new string[] { "HaXiJiSuanQi", "HXJSQ", "MD5", "SHA1", "HMAC" }, + }; + + this.Items = new[] + { + GoogleTranslate, + TextJoin, + LogReader, + FullHalfConvert, + CsvReader, + RegexEvaluator, + YoudaoDictionary, + HashCalculator, + }; + } + } +} diff --git a/LuYao.Toolkit.Core/Channels/Channel.cs b/LuYao.Toolkit.Core/Channels/Channel.cs new file mode 100644 index 0000000..06df482 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/Channel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace LuYao.Toolkit.Channels; + +public partial class Channel +{ + public static bool TryGetItem(Guid id, out FunctionItem item) + { + return FunctionItem._maps.TryGetValue(id, out item); + } + static Channel() + { + Channels = new Channel[] + { + Gens, + Networks, + Converts, + Texts, + Encodings, + Files, + Images, + CrossBorder, + Other + }; + } + private Channel(string name, string title, string icon) + { + Name = name; + Title = title; + Icon = icon; + } + + public string Name { get; } + public string Title { get; } + public string Icon { get; } + public IReadOnlyList Items { get; private set; } + public static IReadOnlyList Channels { get; } +} diff --git a/LuYao.Toolkit.Core/Channels/FunctionItem.cs b/LuYao.Toolkit.Core/Channels/FunctionItem.cs new file mode 100644 index 0000000..63a9866 --- /dev/null +++ b/LuYao.Toolkit.Core/Channels/FunctionItem.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; + +namespace LuYao.Toolkit.Channels; + +public partial class FunctionItem +{ + internal static readonly Dictionary _maps = new Dictionary(); + internal static readonly NameValueCollection _keywords = new NameValueCollection(); + public FunctionItem(Channel channel, Guid id, string name) + { + lock (_maps) _maps[id] = this; + Channel = channel; + Id = id; + Name = name; + } + public Channel Channel { get; } + public Guid Id { get; } + public string Name { get; } + public string Title { get; internal set; } + public string Icon { get; internal set; } + public string Description { get; internal set; } + public string View { get; internal set; } + public bool IsNew { get; internal set; } + public bool UseNetwork { get; internal set; } + public bool IsDocument { get; internal set; } + public bool Multiboxing { get; internal set; } = true; + public IReadOnlyCollection Keywords { get; internal set; } + public static IReadOnlyList Search(string keyword, int limit) + { + if (string.IsNullOrWhiteSpace(keyword)) return Array.Empty(); + if (_keywords.Count == 0) + { + lock (_keywords) + { + if (_keywords.Count == 0) + { + foreach (var item in _maps.Values) + { + var id = item.Id.ToString(); + _keywords.Add(item.Title, id); + if (item.Keywords == null || item.Keywords.Count == 0) continue; + foreach (var k in item.Keywords) + { + _keywords.Add(k, id); + } + } + } + } + } + var keys = new List(); + foreach (var key in _keywords.AllKeys) + { + if (key.IndexOf(keyword, StringComparison.InvariantCultureIgnoreCase) < 0) continue; + keys.Add(key); + } + if (keys.Count <= 0) return Array.Empty(); + keys.Sort(static (x, y) => x.Length - y.Length); + var ret = new List(keys.Count); + var set = new SortedSet(); + foreach (var key in keys) + { + if (ret.Count >= limit) break; + foreach (var id in _keywords.GetValues(key)) + { + if (Channel.TryGetItem(Guid.Parse(id), out var item)) + { + if (set.Contains(item.Id)) continue; + ret.Add(item); + set.Add(item.Id); + } + } + } + return ret; + } +} diff --git "a/LuYao.Toolkit.Core/Channels/\351\207\215\346\226\260\347\224\237\346\210\220 Channel.linq" "b/LuYao.Toolkit.Core/Channels/\351\207\215\346\226\260\347\224\237\346\210\220 Channel.linq" new file mode 100644 index 0000000..bb49845 --- /dev/null +++ "b/LuYao.Toolkit.Core/Channels/\351\207\215\346\226\260\347\224\237\346\210\220 Channel.linq" @@ -0,0 +1,85 @@ + + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Common.dll + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Common.pdb + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Common.xml + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Toolkit.Core.deps.json + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Toolkit.Core.dll + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\net7.0\LuYao.Toolkit.Core.pdb + LuYao.Toolkit.Channels + Newtonsoft.Json + + +void Main() +{ + //Channel.Channels.Dump(); + var dir = Path.GetDirectoryName(Util.CurrentQueryPath); + foreach (var chl in Channel.Channels) + { + var fn = Path.Combine(dir, $"Channel.{chl.Name}.cs"); + Console.WriteLine(fn); + var sb = new StringBuilder(); + sb.AppendLine("using System;"); + sb.AppendLine(); + sb.AppendLine("namespace LuYao.Toolkit.Channels;"); + sb.AppendLine(); + sb.AppendLine("public partial class Channel"); + sb.AppendLine("{"); + sb.AppendFormat(" public static {0}Channel {0} {{ get; }} = new {0}Channel();", chl.Name); + sb.AppendLine(); + + sb.AppendLine($" public class {chl.Name}Channel : Channel"); + sb.AppendLine(" {"); + + foreach (var item in chl.Items) + { + sb.AppendLine($" public FunctionItem {(item.Name)} {{ get; }}"); + } + sb.AppendLine(); + + sb.AppendLine($" public {chl.Name}Channel() : base(nameof({chl.Name}), {JsonConvert.SerializeObject(chl.Title)}, Icons.{chl.Icon})"); + sb.AppendLine(" {"); + + foreach (var item in chl.Items) + { + sb.AppendLine($" this.{(item.Name)} = new FunctionItem(this, Guid.Parse(\"{item.Id.ToString("N").ToUpper()}\"), nameof({item.Name}))"); + sb.AppendLine(" {"); + sb.AppendLine($" Title = {JsonConvert.SerializeObject(item.Title)},"); + sb.AppendLine($" Icon = Icons.{(item.Icon)},"); + sb.AppendLine($" Description = {JsonConvert.SerializeObject(item.Description)},"); + sb.AppendLine($" View = Views.ViewNames.{(item.View)},"); + sb.AppendLine($" IsNew = {(item.IsNew ? "true" : "false")},"); + sb.AppendLine($" UseNetwork = {(item.UseNetwork ? "true" : "false")},"); + sb.AppendLine($" IsDocument = {(item.IsDocument ? "true" : "false")},"); + sb.AppendLine($" Multiboxing = {(item.Multiboxing ? "true" : "false")},"); + sb.AppendLine($" Keywords = new string[] {{ {(GetKeywords(item))} }},"); + sb.AppendLine(" };"); + sb.AppendLine(); + } + + sb.AppendLine(" this.Items = new[]"); + sb.AppendLine(" {"); + foreach (var item in chl.Items) + { + sb.AppendLine($" {(item.Name)},"); + } + sb.AppendLine(" };"); + + sb.AppendLine(" }"); + + sb.AppendLine(" }"); + + sb.AppendLine("}"); + var str = sb.ToString(); + File.WriteAllText(fn, str, Encoding.UTF8); + } +} + +// You can define other methods, fields, classes and namespaces here +private static string GetName(string view) +{ + return view.Split('.').Last(); +} +private static string GetKeywords(FunctionItem item) +{ + return Newtonsoft.Json.JsonConvert.SerializeObject(item.Keywords).Trim('[', ']').Replace(",",", "); +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/ChannelItemSession.Biz.cs b/LuYao.Toolkit.Core/Entities/ChannelItemSession.Biz.cs new file mode 100644 index 0000000..b97cf9b --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/ChannelItemSession.Biz.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace LuYao.Toolkit.Entities +{ + public partial class ChannelItemSession : Entity + { + #region 对象操作 + static ChannelItemSession() + { + // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx + //var df = Meta.Factory.AdditionalFields; + //df.Add(nameof(IsFavorite)); + + // 过滤器 UserModule、TimeModule、IPModule + } + + /// 验证并修补数据,通过抛出异常的方式提示验证失败。 + /// 是否插入 + public override void Valid(Boolean isNew) + { + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return; + + // 建议先调用基类方法,基类方法会做一些统一处理 + base.Valid(isNew); + + // 在新插入数据或者修改了指定字段时进行修正 + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化ChannelItemSession[ChannelItemSession]数据……"); + + // var entity = new ChannelItemSession(); + // entity.CreatedAt = DateTime.Now; + // entity.LastClick = DateTime.Now; + // entity.IsFavorite = 0; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化ChannelItemSession[ChannelItemSession]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + #endregion + + #region 扩展查询 + /// 根据主键查找 + /// 主键 + /// 实体对象 + public static ChannelItemSession FindById(Guid id) + { + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id); + + // 单对象缓存 + return Meta.SingleCache[id]; + + //return Find(_.Id == id); + } + + /// 根据收藏查找 + /// 收藏 + /// 实体列表 + public static IList FindAllByIsFavorite(Int32 isFavorite) + { + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.IsFavorite == isFavorite); + + return FindAll(_.IsFavorite == isFavorite); + } + #endregion + + #region 高级查询 + /// 高级查询 + /// 最后点击 + /// 收藏 + /// 创建时间开始 + /// 创建时间结束 + /// 关键字 + /// 分页参数信息。可携带统计和数据权限扩展查询等信息 + /// 实体列表 + public static IList Search(DateTime lastClick, Int32 isFavorite, DateTime start, DateTime end, String key, PageParameter page) + { + var exp = new WhereExpression(); + + if (isFavorite >= 0) exp &= _.IsFavorite == isFavorite; + exp &= _.CreatedAt.Between(start, end); + + return FindAll(exp, page); + } + + // Select Count(Id) as Id,Category From ChannelItemSession Where LastClick>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20 + //static readonly FieldCache _CategoryCache = new FieldCache(nameof(Category)) + //{ + //Where = _.LastClick > DateTime.Today.AddDays(-30) & Expression.Empty + //}; + + ///// 获取类别列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择 + ///// + //public static IDictionary GetCategoryList() => _CategoryCache.FindAllName(); + public static IList FindAll(int limit) + { + var order = _.IsFavorite.Asc() & _.LastClick.Desc(); + return FindAll(null, order, null, 0, limit); + } + + public static bool HasSessin() => Meta.Count > 0; + + #endregion + + #region 业务操作 + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/ChannelItemSession.cs b/LuYao.Toolkit.Core/Entities/ChannelItemSession.cs new file mode 100644 index 0000000..faedd3c --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/ChannelItemSession.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using XCode; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Entities +{ + /// + [Serializable] + [DataObject] + [BindIndex("IX_ChannelItemSession_CreatedAt", false, "CreatedAt")] + [BindIndex("IX_ChannelItemSession_LastClick", false, "LastClick")] + [BindIndex("IX_ChannelItemSession_IsFavorite", false, "IsFavorite")] + [BindTable("ChannelItemSession", Description = "", ConnName = "LuYao.Toolkit", DbType = DatabaseType.None)] + public partial class ChannelItemSession + { + #region 属性 + private Guid _Id; + /// 主键 + [DisplayName("主键")] + [Description("主键")] + [DataObjectField(true, false, false, 0)] + [BindColumn("Id", "主键", "")] + public Guid Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } } + + private DateTime _CreatedAt; + /// 创建时间 + [DisplayName("创建时间")] + [Description("创建时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("CreatedAt", "创建时间", "")] + public DateTime CreatedAt { get => _CreatedAt; set { if (OnPropertyChanging("CreatedAt", value)) { _CreatedAt = value; OnPropertyChanged("CreatedAt"); } } } + + private DateTime _LastClick; + /// 最后点击 + [DisplayName("最后点击")] + [Description("最后点击")] + [DataObjectField(false, false, true, 0)] + [BindColumn("LastClick", "最后点击", "")] + public DateTime LastClick { get => _LastClick; set { if (OnPropertyChanging("LastClick", value)) { _LastClick = value; OnPropertyChanged("LastClick"); } } } + + private Int32 _IsFavorite; + /// 收藏 + [DisplayName("收藏")] + [Description("收藏")] + [DataObjectField(false, false, false, 0)] + [BindColumn("IsFavorite", "收藏", "")] + public Int32 IsFavorite { get => _IsFavorite; set { if (OnPropertyChanging("IsFavorite", value)) { _IsFavorite = value; OnPropertyChanged("IsFavorite"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object this[String name] + { + get + { + switch (name) + { + case "Id": return _Id; + case "CreatedAt": return _CreatedAt; + case "LastClick": return _LastClick; + case "IsFavorite": return _IsFavorite; + default: return base[name]; + } + } + set + { + switch (name) + { + case "Id": _Id = (Guid)value; break; + case "CreatedAt": _CreatedAt = value.ToDateTime(); break; + case "LastClick": _LastClick = value.ToDateTime(); break; + case "IsFavorite": _IsFavorite = value.ToInt(); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 字段名 + /// 取得ChannelItemSession字段信息的快捷方式 + public partial class _ + { + /// 主键 + public static readonly Field Id = FindByName("Id"); + + /// 创建时间 + public static readonly Field CreatedAt = FindByName("CreatedAt"); + + /// 最后点击 + public static readonly Field LastClick = FindByName("LastClick"); + + /// 收藏 + public static readonly Field IsFavorite = FindByName("IsFavorite"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得ChannelItemSession字段名称的快捷方式 + public partial class __ + { + /// 主键 + public const String Id = "Id"; + + /// 创建时间 + public const String CreatedAt = "CreatedAt"; + + /// 最后点击 + public const String LastClick = "LastClick"; + + /// 收藏 + public const String IsFavorite = "IsFavorite"; + } + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/Log/2022_07_27.log b/LuYao.Toolkit.Core/Entities/Log/2022_07_27.log new file mode 100644 index 0000000..171f5af --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/Log/2022_07_27.log @@ -0,0 +1,8 @@ +14:15:45.514 4 N T 实体缓存(24)总次数 2 [LuYao.Toolkit.Entities.ViewModelState] +14:15:45.514 4 N T 实体缓存(36)总次数 1 [LuYao.Toolkit.Entities.FunctionViewItem] +18:15:45.532 4 N T 实体缓存(24)总次数 3 [LuYao.Toolkit.Entities.ViewModelState] +18:15:45.533 4 N T 实体缓存(36)总次数 3 [LuYao.Toolkit.Entities.FunctionViewItem] +19:48:32.100 4 N T 慢SQL[1,180ms] [LuYao.Toolkit] Update ViewModelState Set Value='{"UseNumber":true,"UseSymbols":true,"Length":80}' Where Id=1 +19:48:32.101 4 N T 任务 [7]<>c.<.cctor>b__0_0 (2147483647ms) 耗时过长 1,198ms,建议使用异步任务Async=true +20:15:45.535 4 N T 实体缓存(24)总次数 3 [LuYao.Toolkit.Entities.ViewModelState] +20:15:45.535 4 N T 实体缓存(36)总次数 4 [LuYao.Toolkit.Entities.FunctionViewItem] diff --git a/LuYao.Toolkit.Core/Entities/Log/2022_08_04.log b/LuYao.Toolkit.Core/Entities/Log/2022_08_04.log new file mode 100644 index 0000000..366ab34 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/Log/2022_08_04.log @@ -0,0 +1,55 @@ +14:53:56.938 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:53:57.018 1 N - 修正模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:53:57.020 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +14:53:57.024 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:57.041 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:57.061 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:57.062 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:57.062 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:57.062 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:53:58.389 9 N T 实体缓存(14)总次数 8,命中 5(62.50%) [LuYao.Toolkit.Entities.ViewModelState] +14:54:13.169 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:54:13.171 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +14:54:13.171 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.171 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.171 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.172 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.172 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.172 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.983 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:54:13.984 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +14:54:13.984 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.985 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.985 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.985 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.986 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:13.986 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.287 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:54:14.288 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +14:54:14.295 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.302 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.302 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.303 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.303 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.303 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.466 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +14:54:14.467 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +14:54:14.467 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.467 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.468 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.468 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.468 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +14:54:14.469 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.878 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +15:29:22.958 1 N - 修正模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +15:29:22.960 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +15:29:22.963 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.975 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.995 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.995 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.996 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.996 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.996 1 N - 生成 RdoFolder RdoFolder {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.997 1 N - 生成 RdoFolder RdoFolder {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.998 1 N - 生成 RdoConnection RdoConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +15:29:22.999 1 N - 生成 RdoConnection RdoConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} diff --git a/LuYao.Toolkit.Core/Entities/Log/2022_08_08.log b/LuYao.Toolkit.Core/Entities/Log/2022_08_08.log new file mode 100644 index 0000000..753f451 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/Log/2022_08_08.log @@ -0,0 +1,15 @@ +19:34:37.489 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +19:34:37.547 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +19:34:37.550 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.562 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.578 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.578 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.579 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.579 1 N - 生成 RdoIdCard RdoIdCard {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.579 1 N - 生成 RdoFolder RdoFolder {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.583 1 N - 生成 RdoFolder RdoFolder {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.583 1 N - 生成 RdoConnection RdoConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:37.584 1 N - 生成 RdoConnection RdoConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +19:34:38.871 7 Y EQ [LuYao.Toolkit] Update ChannelItemSession Set LastClick='2022-08-08 19:34:35' Where Id='629fe6ac-3488-4045-9f46-fb59e195fa47' +19:37:04.218 10 N T 实体缓存(23)总次数 2 [LuYao.Toolkit.Entities.ChannelItemSession] +19:37:04.218 10 N T 实体缓存(14)总次数 37,命中 27(72.97%) [LuYao.Toolkit.Entities.ViewModelState] diff --git a/LuYao.Toolkit.Core/Entities/Log/2022_09_13.log b/LuYao.Toolkit.Core/Entities/Log/2022_09_13.log new file mode 100644 index 0000000..e2a04dc --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/Log/2022_09_13.log @@ -0,0 +1,8 @@ +11:36:01.101 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +11:36:01.187 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +11:36:01.190 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +11:36:01.202 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +11:36:01.216 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +11:36:01.217 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +11:36:01.217 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +11:36:01.226 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} diff --git a/LuYao.Toolkit.Core/Entities/Log/2023_01_14.log b/LuYao.Toolkit.Core/Entities/Log/2023_01_14.log new file mode 100644 index 0000000..e831deb --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/Log/2023_01_14.log @@ -0,0 +1,26 @@ +16:57:39.129 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +16:57:39.490 1 N - 修正模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +16:57:39.491 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +16:57:39.492 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.494 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.496 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.497 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.497 1 N - 生成 RdpGroup RdpGroup {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.498 1 N - 生成 RdpGroup RdpGroup {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.498 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.499 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:39.509 7 Y P [LuYao.Toolkit] Select * From ViewModelState +16:57:39.510 4 N T [LuYao.Toolkit] Update ViewModelState Set UpdatedAt='2023-01-14 16:57:39',Value='{"XmlFileName":{"Type":"System.String","Json":"\"D:\\\\src\\\\coderbusy\\\\luyao\\\\src\\\\toolkit\\\\LuYao.Toolkit.Core\\\\Entities\\\\LuYao.Toolkit.xml\""}}' Where Id=20 +16:57:51.036 1 N - 导入模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +16:57:51.039 1 N - 修正模型:D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities\LuYao.Toolkit.xml +16:57:51.040 1 N - 生成实体类 D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit.Core\Entities +16:57:51.040 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.040 1 N - 生成 ViewModelState ViewModelState {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.092 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.093 1 N - 生成 ChannelItemSession ChannelItemSession {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.093 1 N - 生成 RdpGroup RdpGroup {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.094 1 N - 生成 RdpGroup RdpGroup {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.094 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.094 1 N - 生成 RdpConnection RdpConnection {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.095 1 N - 生成 PortProxyRule 端口转发规则 {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} +16:57:51.095 1 N - 生成 PortProxyRule 端口转发规则 {"BaseClass":"Entity","Namespace":"LuYao.Toolkit.Entities"} diff --git a/LuYao.Toolkit.Core/Entities/LuYao.Toolkit.xml b/LuYao.Toolkit.Core/Entities/LuYao.Toolkit.xml new file mode 100644 index 0000000..5f9d312 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/LuYao.Toolkit.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
\ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/PortProxyRule.Biz.cs b/LuYao.Toolkit.Core/Entities/PortProxyRule.Biz.cs new file mode 100644 index 0000000..5c08dcb --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/PortProxyRule.Biz.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace LuYao.Toolkit.Entities +{ + public partial class PortProxyRule : Entity + { + #region 对象操作 + static PortProxyRule() + { + // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx + //var df = Meta.Factory.AdditionalFields; + //df.Add(nameof(ListenPort)); + + // 过滤器 UserModule、TimeModule、IPModule + } + + /// 验证并修补数据,通过抛出异常的方式提示验证失败。 + /// 是否插入 + public override void Valid(Boolean isNew) + { + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return; + + // 建议先调用基类方法,基类方法会做一些统一处理 + base.Valid(isNew); + + // 在新插入数据或者修改了指定字段时进行修正 + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化PortProxyRule[端口转发规则]数据……"); + + // var entity = new PortProxyRule(); + // entity.Type = "abc"; + // entity.ListenOn = "abc"; + // entity.ListenPort = 0; + // entity.ConnectTo = "abc"; + // entity.ConnectPort = 0; + // entity.Comment = "abc"; + // entity.Group = "abc"; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化PortProxyRule[端口转发规则]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + #endregion + + #region 扩展查询 + #endregion + + #region 高级查询 + + // Select Count(Id) as Id,Category From PortProxyRule Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20 + //static readonly FieldCache _CategoryCache = new FieldCache(nameof(Category)) + //{ + //Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty + //}; + + ///// 获取类别列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择 + ///// + //public static IDictionary GetCategoryList() => _CategoryCache.FindAllName(); + public static List GetGroups() + { + var ret = new List(); + var exp = new WhereExpression().GroupBy(_.GroupName); + var list = FindAll(exp, _.GroupName.Asc(), _.GroupName, 0, 0); + foreach (var item in list) + { + if (string.IsNullOrWhiteSpace(item.GroupName)) continue; + ret.Add(item.GroupName); + } + return ret; + } + + public static List GetConnectTos() + { + var ret = new List(); + var exp = new WhereExpression().GroupBy(_.ConnectTo); + var list = FindAll(exp, _.ConnectTo.Asc(), _.ConnectTo, 0, 0); + foreach (var item in list) + { + if (string.IsNullOrWhiteSpace(item.ConnectTo)) continue; + ret.Add(item.ConnectTo); + } + return ret; + } + public static IList FindAllByIds(IReadOnlyCollection ids) + { + if (ids == null || ids.Count <= 0) return new List(); + var where = _.Id.In(ids); + return FindAll(where); + } + #endregion + + #region 业务操作 + #endregion + + public bool EqualsWithKeys(PortProxyRule other) + { + return Type == other.Type + && ListenOn == other.ListenOn + && ListenPort == other.ListenPort + && ConnectTo == other.ConnectTo + && ConnectPort == other.ConnectPort; + } + + public bool IsValid => ListenPort.ToInt() > 0 && ConnectPort.ToInt() > 0; + + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/PortProxyRule.cs b/LuYao.Toolkit.Core/Entities/PortProxyRule.cs new file mode 100644 index 0000000..3ab1b63 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/PortProxyRule.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using XCode; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Entities +{ + /// 端口转发规则 + [Serializable] + [DataObject] + [Description("端口转发规则")] + [BindTable("PortProxyRule", Description = "端口转发规则", ConnName = "LuYao.Toolkit", DbType = DatabaseType.None)] + public partial class PortProxyRule + { + #region 属性 + private Int32 _Id; + /// 主键 + [DisplayName("主键")] + [Description("主键")] + [DataObjectField(true, true, false, 0)] + [BindColumn("Id", "主键", "")] + public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } } + + private String _Type; + /// + [DisplayName("Type")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Type", "", "")] + public String Type { get => _Type; set { if (OnPropertyChanging("Type", value)) { _Type = value; OnPropertyChanged("Type"); } } } + + private String _GroupName; + /// + [DisplayName("GroupName")] + [DataObjectField(false, false, true, 255)] + [BindColumn("GroupName", "", "")] + public String GroupName { get => _GroupName; set { if (OnPropertyChanging("GroupName", value)) { _GroupName = value; OnPropertyChanged("GroupName"); } } } + + private String _ListenOn; + /// + [DisplayName("ListenOn")] + [DataObjectField(false, false, true, 50)] + [BindColumn("ListenOn", "", "")] + public String ListenOn { get => _ListenOn; set { if (OnPropertyChanging("ListenOn", value)) { _ListenOn = value; OnPropertyChanged("ListenOn"); } } } + + private String _ListenPort; + /// + [DisplayName("ListenPort")] + [DataObjectField(false, false, true, 50)] + [BindColumn("ListenPort", "", "")] + public String ListenPort { get => _ListenPort; set { if (OnPropertyChanging("ListenPort", value)) { _ListenPort = value; OnPropertyChanged("ListenPort"); } } } + + private String _ConnectTo; + /// + [DisplayName("ConnectTo")] + [DataObjectField(false, false, true, 255)] + [BindColumn("ConnectTo", "", "")] + public String ConnectTo { get => _ConnectTo; set { if (OnPropertyChanging("ConnectTo", value)) { _ConnectTo = value; OnPropertyChanged("ConnectTo"); } } } + + private String _ConnectPort; + /// + [DisplayName("ConnectPort")] + [DataObjectField(false, false, true, 50)] + [BindColumn("ConnectPort", "", "")] + public String ConnectPort { get => _ConnectPort; set { if (OnPropertyChanging("ConnectPort", value)) { _ConnectPort = value; OnPropertyChanged("ConnectPort"); } } } + + private String _Comment; + /// + [DisplayName("Comment")] + [DataObjectField(false, false, true, -1)] + [BindColumn("Comment", "", "")] + public String Comment { get => _Comment; set { if (OnPropertyChanging("Comment", value)) { _Comment = value; OnPropertyChanged("Comment"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object this[String name] + { + get + { + switch (name) + { + case "Id": return _Id; + case "Type": return _Type; + case "GroupName": return _GroupName; + case "ListenOn": return _ListenOn; + case "ListenPort": return _ListenPort; + case "ConnectTo": return _ConnectTo; + case "ConnectPort": return _ConnectPort; + case "Comment": return _Comment; + default: return base[name]; + } + } + set + { + switch (name) + { + case "Id": _Id = value.ToInt(); break; + case "Type": _Type = Convert.ToString(value); break; + case "GroupName": _GroupName = Convert.ToString(value); break; + case "ListenOn": _ListenOn = Convert.ToString(value); break; + case "ListenPort": _ListenPort = Convert.ToString(value); break; + case "ConnectTo": _ConnectTo = Convert.ToString(value); break; + case "ConnectPort": _ConnectPort = Convert.ToString(value); break; + case "Comment": _Comment = Convert.ToString(value); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 字段名 + /// 取得端口转发规则字段信息的快捷方式 + public partial class _ + { + /// 主键 + public static readonly Field Id = FindByName("Id"); + + /// + public static readonly Field Type = FindByName("Type"); + + /// + public static readonly Field GroupName = FindByName("GroupName"); + + /// + public static readonly Field ListenOn = FindByName("ListenOn"); + + /// + public static readonly Field ListenPort = FindByName("ListenPort"); + + /// + public static readonly Field ConnectTo = FindByName("ConnectTo"); + + /// + public static readonly Field ConnectPort = FindByName("ConnectPort"); + + /// + public static readonly Field Comment = FindByName("Comment"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得端口转发规则字段名称的快捷方式 + public partial class __ + { + /// 主键 + public const String Id = "Id"; + + /// + public const String Type = "Type"; + + /// + public const String GroupName = "GroupName"; + + /// + public const String ListenOn = "ListenOn"; + + /// + public const String ListenPort = "ListenPort"; + + /// + public const String ConnectTo = "ConnectTo"; + + /// + public const String ConnectPort = "ConnectPort"; + + /// + public const String Comment = "Comment"; + } + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/RdpConnection.Biz.cs b/LuYao.Toolkit.Core/Entities/RdpConnection.Biz.cs new file mode 100644 index 0000000..740bec0 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/RdpConnection.Biz.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace LuYao.Toolkit.Entities +{ + public partial class RdpConnection : Entity + { + #region 对象操作 + static RdpConnection() + { + // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx + //var df = Meta.Factory.AdditionalFields; + //df.Add(nameof(Port)); + + // 过滤器 UserModule、TimeModule、IPModule + } + + /// 验证并修补数据,通过抛出异常的方式提示验证失败。 + /// 是否插入 + public override void Valid(Boolean isNew) + { + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return; + + // 建议先调用基类方法,基类方法会做一些统一处理 + base.Valid(isNew); + + // 在新插入数据或者修改了指定字段时进行修正 + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化RdoConnection[RdoConnection]数据……"); + + // var entity = new RdoConnection(); + // entity.CreatedAt = DateTime.Now; + // entity.UpdatedAt = DateTime.Now; + // entity.Name = "abc"; + // entity.Remark = "abc"; + // entity.Host = "abc"; + // entity.Port = 0; + // entity.Domain = "abc"; + // entity.Username = "abc"; + // entity.Password = "abc"; + // entity.ConnectToConsole = true; + // entity.DisplayWidth = 0; + // entity.DisplayHeight = 0; + // entity.AutoExpand = true; + // entity.SmartSizing = true; + // entity.ColorDepth = 0; + // entity.AudioSetting = 0; + // entity.KeyboardSetting = 0; + // entity.RedirectDisks = true; + // entity.RedirectPorts = true; + // entity.RedirectPrinters = true; + // entity.RedirectSmartCards = true; + // entity.BitmapCaching = true; + // entity.AllowWallpaper = true; + // entity.AllowThemes = true; + // entity.AllowContents = true; + // entity.AllowAnimation = true; + // entity.AuthenticationLevel = 0; + // entity.EnableCredSspSupport = true; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化RdoConnection[RdoConnection]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + public RdpGroup Group => RdpGroup.FindById(this.GroupId); + public string GroupName => this.Group?.Name; + #endregion + + #region 扩展查询 + /// 根据主键查找 + /// 主键 + /// 实体对象 + public static RdpConnection FindById(Guid id) + { + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id); + + // 单对象缓存 + return Meta.SingleCache[id]; + + //return Find(_.Id == id); + } + #endregion + + #region 高级查询 + + public static IReadOnlyList FindAllByIds(IReadOnlyCollection ids) + { + if (ids.Count == 0) + { + return Array.Empty(); + } + Expression where = @_.Id.In(ids); + return Entity.FindAll(where).ToList(); + } + #endregion + + #region 业务操作 + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/RdpConnection.cs b/LuYao.Toolkit.Core/Entities/RdpConnection.cs new file mode 100644 index 0000000..496e1f9 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/RdpConnection.cs @@ -0,0 +1,527 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using XCode; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Entities +{ + /// + [Serializable] + [DataObject] + [BindTable("RdpConnection", Description = "", ConnName = "LuYao.Toolkit", DbType = DatabaseType.None)] + public partial class RdpConnection + { + #region 属性 + private Guid _Id; + /// 主键 + [DisplayName("主键")] + [Description("主键")] + [DataObjectField(true, false, false, 0)] + [BindColumn("Id", "主键", "")] + public Guid Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } } + + private DateTime _CreatedAt; + /// 创建时间 + [DisplayName("创建时间")] + [Description("创建时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("CreatedAt", "创建时间", "")] + public DateTime CreatedAt { get => _CreatedAt; set { if (OnPropertyChanging("CreatedAt", value)) { _CreatedAt = value; OnPropertyChanged("CreatedAt"); } } } + + private DateTime _UpdatedAt; + /// 更新时间 + [DisplayName("更新时间")] + [Description("更新时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("UpdatedAt", "更新时间", "")] + public DateTime UpdatedAt { get => _UpdatedAt; set { if (OnPropertyChanging("UpdatedAt", value)) { _UpdatedAt = value; OnPropertyChanged("UpdatedAt"); } } } + + private String _Name; + /// 名称 + [DisplayName("名称")] + [Description("名称")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Name", "名称", "", Master = true)] + public String Name { get => _Name; set { if (OnPropertyChanging("Name", value)) { _Name = value; OnPropertyChanged("Name"); } } } + + private Guid _GroupId; + /// 分组编号 + [DisplayName("分组编号")] + [Description("分组编号")] + [DataObjectField(false, false, false, 0)] + [BindColumn("GroupId", "分组编号", "")] + public Guid GroupId { get => _GroupId; set { if (OnPropertyChanging("GroupId", value)) { _GroupId = value; OnPropertyChanged("GroupId"); } } } + + private String _Remark; + /// 备注 + [DisplayName("备注")] + [Description("备注")] + [DataObjectField(false, false, true, 255)] + [BindColumn("Remark", "备注", "")] + public String Remark { get => _Remark; set { if (OnPropertyChanging("Remark", value)) { _Remark = value; OnPropertyChanged("Remark"); } } } + + private String _Host; + /// + [DisplayName("Host")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Host", "", "")] + public String Host { get => _Host; set { if (OnPropertyChanging("Host", value)) { _Host = value; OnPropertyChanged("Host"); } } } + + private Int32 _Port; + /// + [DisplayName("Port")] + [DataObjectField(false, false, false, 0)] + [BindColumn("Port", "", "")] + public Int32 Port { get => _Port; set { if (OnPropertyChanging("Port", value)) { _Port = value; OnPropertyChanged("Port"); } } } + + private String _Domain; + /// + [DisplayName("Domain")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Domain", "", "")] + public String Domain { get => _Domain; set { if (OnPropertyChanging("Domain", value)) { _Domain = value; OnPropertyChanged("Domain"); } } } + + private String _Username; + /// + [DisplayName("Username")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Username", "", "")] + public String Username { get => _Username; set { if (OnPropertyChanging("Username", value)) { _Username = value; OnPropertyChanged("Username"); } } } + + private String _Password; + /// + [DisplayName("Password")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Password", "", "")] + public String Password { get => _Password; set { if (OnPropertyChanging("Password", value)) { _Password = value; OnPropertyChanged("Password"); } } } + + private Boolean _ConnectToConsole; + /// + [DisplayName("ConnectToConsole")] + [DataObjectField(false, false, false, 0)] + [BindColumn("ConnectToConsole", "", "")] + public Boolean ConnectToConsole { get => _ConnectToConsole; set { if (OnPropertyChanging("ConnectToConsole", value)) { _ConnectToConsole = value; OnPropertyChanged("ConnectToConsole"); } } } + + private Int32 _DesktopSize; + /// + [DisplayName("DesktopSize")] + [DataObjectField(false, false, false, 0)] + [BindColumn("DesktopSize", "", "")] + public Int32 DesktopSize { get => _DesktopSize; set { if (OnPropertyChanging("DesktopSize", value)) { _DesktopSize = value; OnPropertyChanged("DesktopSize"); } } } + + private Int32 _DisplayWidth; + /// + [DisplayName("DisplayWidth")] + [DataObjectField(false, false, false, 0)] + [BindColumn("DisplayWidth", "", "")] + public Int32 DisplayWidth { get => _DisplayWidth; set { if (OnPropertyChanging("DisplayWidth", value)) { _DisplayWidth = value; OnPropertyChanged("DisplayWidth"); } } } + + private Int32 _DisplayHeight; + /// + [DisplayName("DisplayHeight")] + [DataObjectField(false, false, false, 0)] + [BindColumn("DisplayHeight", "", "")] + public Int32 DisplayHeight { get => _DisplayHeight; set { if (OnPropertyChanging("DisplayHeight", value)) { _DisplayHeight = value; OnPropertyChanged("DisplayHeight"); } } } + + private Boolean _AutoExpand; + /// + [DisplayName("AutoExpand")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AutoExpand", "", "")] + public Boolean AutoExpand { get => _AutoExpand; set { if (OnPropertyChanging("AutoExpand", value)) { _AutoExpand = value; OnPropertyChanged("AutoExpand"); } } } + + private Boolean _SmartSizing; + /// + [DisplayName("SmartSizing")] + [DataObjectField(false, false, false, 0)] + [BindColumn("SmartSizing", "", "")] + public Boolean SmartSizing { get => _SmartSizing; set { if (OnPropertyChanging("SmartSizing", value)) { _SmartSizing = value; OnPropertyChanged("SmartSizing"); } } } + + private Int32 _ColorDepth; + /// + [DisplayName("ColorDepth")] + [DataObjectField(false, false, false, 0)] + [BindColumn("ColorDepth", "", "")] + public Int32 ColorDepth { get => _ColorDepth; set { if (OnPropertyChanging("ColorDepth", value)) { _ColorDepth = value; OnPropertyChanged("ColorDepth"); } } } + + private Int32 _AudioSetting; + /// + [DisplayName("AudioSetting")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AudioSetting", "", "")] + public Int32 AudioSetting { get => _AudioSetting; set { if (OnPropertyChanging("AudioSetting", value)) { _AudioSetting = value; OnPropertyChanged("AudioSetting"); } } } + + private Int32 _KeyboardSetting; + /// + [DisplayName("KeyboardSetting")] + [DataObjectField(false, false, false, 0)] + [BindColumn("KeyboardSetting", "", "")] + public Int32 KeyboardSetting { get => _KeyboardSetting; set { if (OnPropertyChanging("KeyboardSetting", value)) { _KeyboardSetting = value; OnPropertyChanged("KeyboardSetting"); } } } + + private Boolean _RedirectDisks; + /// + [DisplayName("RedirectDisks")] + [DataObjectField(false, false, false, 0)] + [BindColumn("RedirectDisks", "", "")] + public Boolean RedirectDisks { get => _RedirectDisks; set { if (OnPropertyChanging("RedirectDisks", value)) { _RedirectDisks = value; OnPropertyChanged("RedirectDisks"); } } } + + private Boolean _RedirectPorts; + /// + [DisplayName("RedirectPorts")] + [DataObjectField(false, false, false, 0)] + [BindColumn("RedirectPorts", "", "")] + public Boolean RedirectPorts { get => _RedirectPorts; set { if (OnPropertyChanging("RedirectPorts", value)) { _RedirectPorts = value; OnPropertyChanged("RedirectPorts"); } } } + + private Boolean _RedirectPrinters; + /// + [DisplayName("RedirectPrinters")] + [DataObjectField(false, false, false, 0)] + [BindColumn("RedirectPrinters", "", "")] + public Boolean RedirectPrinters { get => _RedirectPrinters; set { if (OnPropertyChanging("RedirectPrinters", value)) { _RedirectPrinters = value; OnPropertyChanged("RedirectPrinters"); } } } + + private Boolean _RedirectSmartCards; + /// + [DisplayName("RedirectSmartCards")] + [DataObjectField(false, false, false, 0)] + [BindColumn("RedirectSmartCards", "", "")] + public Boolean RedirectSmartCards { get => _RedirectSmartCards; set { if (OnPropertyChanging("RedirectSmartCards", value)) { _RedirectSmartCards = value; OnPropertyChanged("RedirectSmartCards"); } } } + + private Boolean _BitmapCaching; + /// + [DisplayName("BitmapCaching")] + [DataObjectField(false, false, false, 0)] + [BindColumn("BitmapCaching", "", "")] + public Boolean BitmapCaching { get => _BitmapCaching; set { if (OnPropertyChanging("BitmapCaching", value)) { _BitmapCaching = value; OnPropertyChanged("BitmapCaching"); } } } + + private Boolean _AllowWallpaper; + /// + [DisplayName("AllowWallpaper")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AllowWallpaper", "", "")] + public Boolean AllowWallpaper { get => _AllowWallpaper; set { if (OnPropertyChanging("AllowWallpaper", value)) { _AllowWallpaper = value; OnPropertyChanged("AllowWallpaper"); } } } + + private Boolean _AllowThemes; + /// + [DisplayName("AllowThemes")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AllowThemes", "", "")] + public Boolean AllowThemes { get => _AllowThemes; set { if (OnPropertyChanging("AllowThemes", value)) { _AllowThemes = value; OnPropertyChanged("AllowThemes"); } } } + + private Boolean _AllowContents; + /// + [DisplayName("AllowContents")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AllowContents", "", "")] + public Boolean AllowContents { get => _AllowContents; set { if (OnPropertyChanging("AllowContents", value)) { _AllowContents = value; OnPropertyChanged("AllowContents"); } } } + + private Boolean _AllowAnimation; + /// + [DisplayName("AllowAnimation")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AllowAnimation", "", "")] + public Boolean AllowAnimation { get => _AllowAnimation; set { if (OnPropertyChanging("AllowAnimation", value)) { _AllowAnimation = value; OnPropertyChanged("AllowAnimation"); } } } + + private Int32 _AuthenticationLevel; + /// + [DisplayName("AuthenticationLevel")] + [DataObjectField(false, false, false, 0)] + [BindColumn("AuthenticationLevel", "", "")] + public Int32 AuthenticationLevel { get => _AuthenticationLevel; set { if (OnPropertyChanging("AuthenticationLevel", value)) { _AuthenticationLevel = value; OnPropertyChanged("AuthenticationLevel"); } } } + + private Boolean _EnableCredSspSupport; + /// + [DisplayName("EnableCredSspSupport")] + [DataObjectField(false, false, false, 0)] + [BindColumn("EnableCredSspSupport", "", "")] + public Boolean EnableCredSspSupport { get => _EnableCredSspSupport; set { if (OnPropertyChanging("EnableCredSspSupport", value)) { _EnableCredSspSupport = value; OnPropertyChanged("EnableCredSspSupport"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object this[String name] + { + get + { + switch (name) + { + case "Id": return _Id; + case "CreatedAt": return _CreatedAt; + case "UpdatedAt": return _UpdatedAt; + case "Name": return _Name; + case "GroupId": return _GroupId; + case "Remark": return _Remark; + case "Host": return _Host; + case "Port": return _Port; + case "Domain": return _Domain; + case "Username": return _Username; + case "Password": return _Password; + case "ConnectToConsole": return _ConnectToConsole; + case "DesktopSize": return _DesktopSize; + case "DisplayWidth": return _DisplayWidth; + case "DisplayHeight": return _DisplayHeight; + case "AutoExpand": return _AutoExpand; + case "SmartSizing": return _SmartSizing; + case "ColorDepth": return _ColorDepth; + case "AudioSetting": return _AudioSetting; + case "KeyboardSetting": return _KeyboardSetting; + case "RedirectDisks": return _RedirectDisks; + case "RedirectPorts": return _RedirectPorts; + case "RedirectPrinters": return _RedirectPrinters; + case "RedirectSmartCards": return _RedirectSmartCards; + case "BitmapCaching": return _BitmapCaching; + case "AllowWallpaper": return _AllowWallpaper; + case "AllowThemes": return _AllowThemes; + case "AllowContents": return _AllowContents; + case "AllowAnimation": return _AllowAnimation; + case "AuthenticationLevel": return _AuthenticationLevel; + case "EnableCredSspSupport": return _EnableCredSspSupport; + default: return base[name]; + } + } + set + { + switch (name) + { + case "Id": _Id = (Guid)value; break; + case "CreatedAt": _CreatedAt = value.ToDateTime(); break; + case "UpdatedAt": _UpdatedAt = value.ToDateTime(); break; + case "Name": _Name = Convert.ToString(value); break; + case "GroupId": _GroupId = (Guid)value; break; + case "Remark": _Remark = Convert.ToString(value); break; + case "Host": _Host = Convert.ToString(value); break; + case "Port": _Port = value.ToInt(); break; + case "Domain": _Domain = Convert.ToString(value); break; + case "Username": _Username = Convert.ToString(value); break; + case "Password": _Password = Convert.ToString(value); break; + case "ConnectToConsole": _ConnectToConsole = value.ToBoolean(); break; + case "DesktopSize": _DesktopSize = value.ToInt(); break; + case "DisplayWidth": _DisplayWidth = value.ToInt(); break; + case "DisplayHeight": _DisplayHeight = value.ToInt(); break; + case "AutoExpand": _AutoExpand = value.ToBoolean(); break; + case "SmartSizing": _SmartSizing = value.ToBoolean(); break; + case "ColorDepth": _ColorDepth = value.ToInt(); break; + case "AudioSetting": _AudioSetting = value.ToInt(); break; + case "KeyboardSetting": _KeyboardSetting = value.ToInt(); break; + case "RedirectDisks": _RedirectDisks = value.ToBoolean(); break; + case "RedirectPorts": _RedirectPorts = value.ToBoolean(); break; + case "RedirectPrinters": _RedirectPrinters = value.ToBoolean(); break; + case "RedirectSmartCards": _RedirectSmartCards = value.ToBoolean(); break; + case "BitmapCaching": _BitmapCaching = value.ToBoolean(); break; + case "AllowWallpaper": _AllowWallpaper = value.ToBoolean(); break; + case "AllowThemes": _AllowThemes = value.ToBoolean(); break; + case "AllowContents": _AllowContents = value.ToBoolean(); break; + case "AllowAnimation": _AllowAnimation = value.ToBoolean(); break; + case "AuthenticationLevel": _AuthenticationLevel = value.ToInt(); break; + case "EnableCredSspSupport": _EnableCredSspSupport = value.ToBoolean(); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 字段名 + /// 取得RdpConnection字段信息的快捷方式 + public partial class _ + { + /// 主键 + public static readonly Field Id = FindByName("Id"); + + /// 创建时间 + public static readonly Field CreatedAt = FindByName("CreatedAt"); + + /// 更新时间 + public static readonly Field UpdatedAt = FindByName("UpdatedAt"); + + /// 名称 + public static readonly Field Name = FindByName("Name"); + + /// 分组编号 + public static readonly Field GroupId = FindByName("GroupId"); + + /// 备注 + public static readonly Field Remark = FindByName("Remark"); + + /// + public static readonly Field Host = FindByName("Host"); + + /// + public static readonly Field Port = FindByName("Port"); + + /// + public static readonly Field Domain = FindByName("Domain"); + + /// + public static readonly Field Username = FindByName("Username"); + + /// + public static readonly Field Password = FindByName("Password"); + + /// + public static readonly Field ConnectToConsole = FindByName("ConnectToConsole"); + + /// + public static readonly Field DesktopSize = FindByName("DesktopSize"); + + /// + public static readonly Field DisplayWidth = FindByName("DisplayWidth"); + + /// + public static readonly Field DisplayHeight = FindByName("DisplayHeight"); + + /// + public static readonly Field AutoExpand = FindByName("AutoExpand"); + + /// + public static readonly Field SmartSizing = FindByName("SmartSizing"); + + /// + public static readonly Field ColorDepth = FindByName("ColorDepth"); + + /// + public static readonly Field AudioSetting = FindByName("AudioSetting"); + + /// + public static readonly Field KeyboardSetting = FindByName("KeyboardSetting"); + + /// + public static readonly Field RedirectDisks = FindByName("RedirectDisks"); + + /// + public static readonly Field RedirectPorts = FindByName("RedirectPorts"); + + /// + public static readonly Field RedirectPrinters = FindByName("RedirectPrinters"); + + /// + public static readonly Field RedirectSmartCards = FindByName("RedirectSmartCards"); + + /// + public static readonly Field BitmapCaching = FindByName("BitmapCaching"); + + /// + public static readonly Field AllowWallpaper = FindByName("AllowWallpaper"); + + /// + public static readonly Field AllowThemes = FindByName("AllowThemes"); + + /// + public static readonly Field AllowContents = FindByName("AllowContents"); + + /// + public static readonly Field AllowAnimation = FindByName("AllowAnimation"); + + /// + public static readonly Field AuthenticationLevel = FindByName("AuthenticationLevel"); + + /// + public static readonly Field EnableCredSspSupport = FindByName("EnableCredSspSupport"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得RdpConnection字段名称的快捷方式 + public partial class __ + { + /// 主键 + public const String Id = "Id"; + + /// 创建时间 + public const String CreatedAt = "CreatedAt"; + + /// 更新时间 + public const String UpdatedAt = "UpdatedAt"; + + /// 名称 + public const String Name = "Name"; + + /// 分组编号 + public const String GroupId = "GroupId"; + + /// 备注 + public const String Remark = "Remark"; + + /// + public const String Host = "Host"; + + /// + public const String Port = "Port"; + + /// + public const String Domain = "Domain"; + + /// + public const String Username = "Username"; + + /// + public const String Password = "Password"; + + /// + public const String ConnectToConsole = "ConnectToConsole"; + + /// + public const String DesktopSize = "DesktopSize"; + + /// + public const String DisplayWidth = "DisplayWidth"; + + /// + public const String DisplayHeight = "DisplayHeight"; + + /// + public const String AutoExpand = "AutoExpand"; + + /// + public const String SmartSizing = "SmartSizing"; + + /// + public const String ColorDepth = "ColorDepth"; + + /// + public const String AudioSetting = "AudioSetting"; + + /// + public const String KeyboardSetting = "KeyboardSetting"; + + /// + public const String RedirectDisks = "RedirectDisks"; + + /// + public const String RedirectPorts = "RedirectPorts"; + + /// + public const String RedirectPrinters = "RedirectPrinters"; + + /// + public const String RedirectSmartCards = "RedirectSmartCards"; + + /// + public const String BitmapCaching = "BitmapCaching"; + + /// + public const String AllowWallpaper = "AllowWallpaper"; + + /// + public const String AllowThemes = "AllowThemes"; + + /// + public const String AllowContents = "AllowContents"; + + /// + public const String AllowAnimation = "AllowAnimation"; + + /// + public const String AuthenticationLevel = "AuthenticationLevel"; + + /// + public const String EnableCredSspSupport = "EnableCredSspSupport"; + } + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/RdpGroup.Biz.cs b/LuYao.Toolkit.Core/Entities/RdpGroup.Biz.cs new file mode 100644 index 0000000..eff29cb --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/RdpGroup.Biz.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace LuYao.Toolkit.Entities +{ + public partial class RdpGroup : Entity + { + #region 对象操作 + static RdpGroup() + { + // 累加字段,生成 Update xx Set Count=Count+1234 Where xxx + //var df = Meta.Factory.AdditionalFields; + //df.Add(nameof(Rank)); + + // 过滤器 UserModule、TimeModule、IPModule + } + + /// 验证并修补数据,通过抛出异常的方式提示验证失败。 + /// 是否插入 + public override void Valid(Boolean isNew) + { + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return; + + // 建议先调用基类方法,基类方法会做一些统一处理 + base.Valid(isNew); + + // 在新插入数据或者修改了指定字段时进行修正 + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化RdpGroup[RdpGroup]数据……"); + + // var entity = new RdpGroup(); + // entity.CreatedAt = DateTime.Now; + // entity.UpdatedAt = DateTime.Now; + // entity.Name = "abc"; + // entity.Rank = 0; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化RdpGroup[RdpGroup]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + #endregion + + #region 扩展查询 + /// 根据主键查找 + /// 主键 + /// 实体对象 + public static RdpGroup FindById(Guid id) + { + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id); + + // 单对象缓存 + return Meta.SingleCache[id]; + + //return Find(_.Id == id); + } + #endregion + + #region 高级查询 + + // Select Count(Id) as Id,Category From RdpGroup Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20 + //static readonly FieldCache _CategoryCache = new FieldCache(nameof(Category)) + //{ + //Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty + //}; + + ///// 获取类别列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择 + ///// + //public static IDictionary GetCategoryList() => _CategoryCache.FindAllName(); + + public static IList GetAllGroups() + { + return FindAll(null, _.Rank, null, 0, 0); + } + #endregion + + #region 业务操作 + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/RdpGroup.cs b/LuYao.Toolkit.Core/Entities/RdpGroup.cs new file mode 100644 index 0000000..c291b53 --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/RdpGroup.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using XCode; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Entities +{ + /// + [Serializable] + [DataObject] + [BindTable("RdpGroup", Description = "", ConnName = "LuYao.Toolkit", DbType = DatabaseType.None)] + public partial class RdpGroup + { + #region 属性 + private Guid _Id; + /// 主键 + [DisplayName("主键")] + [Description("主键")] + [DataObjectField(true, false, false, 0)] + [BindColumn("Id", "主键", "")] + public Guid Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } } + + private DateTime _CreatedAt; + /// 创建时间 + [DisplayName("创建时间")] + [Description("创建时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("CreatedAt", "创建时间", "")] + public DateTime CreatedAt { get => _CreatedAt; set { if (OnPropertyChanging("CreatedAt", value)) { _CreatedAt = value; OnPropertyChanged("CreatedAt"); } } } + + private DateTime _UpdatedAt; + /// 更新时间 + [DisplayName("更新时间")] + [Description("更新时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("UpdatedAt", "更新时间", "")] + public DateTime UpdatedAt { get => _UpdatedAt; set { if (OnPropertyChanging("UpdatedAt", value)) { _UpdatedAt = value; OnPropertyChanged("UpdatedAt"); } } } + + private String _Name; + /// 名称 + [DisplayName("名称")] + [Description("名称")] + [DataObjectField(false, false, true, 50)] + [BindColumn("Name", "名称", "", Master = true)] + public String Name { get => _Name; set { if (OnPropertyChanging("Name", value)) { _Name = value; OnPropertyChanged("Name"); } } } + + private Int32 _Rank; + /// 排序 + [DisplayName("排序")] + [Description("排序")] + [DataObjectField(false, false, false, 0)] + [BindColumn("Rank", "排序", "")] + public Int32 Rank { get => _Rank; set { if (OnPropertyChanging("Rank", value)) { _Rank = value; OnPropertyChanged("Rank"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object this[String name] + { + get + { + switch (name) + { + case "Id": return _Id; + case "CreatedAt": return _CreatedAt; + case "UpdatedAt": return _UpdatedAt; + case "Name": return _Name; + case "Rank": return _Rank; + default: return base[name]; + } + } + set + { + switch (name) + { + case "Id": _Id = (Guid)value; break; + case "CreatedAt": _CreatedAt = value.ToDateTime(); break; + case "UpdatedAt": _UpdatedAt = value.ToDateTime(); break; + case "Name": _Name = Convert.ToString(value); break; + case "Rank": _Rank = value.ToInt(); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 字段名 + /// 取得RdpGroup字段信息的快捷方式 + public partial class _ + { + /// 主键 + public static readonly Field Id = FindByName("Id"); + + /// 创建时间 + public static readonly Field CreatedAt = FindByName("CreatedAt"); + + /// 更新时间 + public static readonly Field UpdatedAt = FindByName("UpdatedAt"); + + /// 名称 + public static readonly Field Name = FindByName("Name"); + + /// 排序 + public static readonly Field Rank = FindByName("Rank"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得RdpGroup字段名称的快捷方式 + public partial class __ + { + /// 主键 + public const String Id = "Id"; + + /// 创建时间 + public const String CreatedAt = "CreatedAt"; + + /// 更新时间 + public const String UpdatedAt = "UpdatedAt"; + + /// 名称 + public const String Name = "Name"; + + /// 排序 + public const String Rank = "Rank"; + } + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/ViewModelState.Biz.cs b/LuYao.Toolkit.Core/Entities/ViewModelState.Biz.cs new file mode 100644 index 0000000..220ac8a --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/ViewModelState.Biz.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using NewLife; +using NewLife.Data; +using NewLife.Log; +using NewLife.Model; +using NewLife.Reflection; +using NewLife.Threading; +using NewLife.Web; +using XCode; +using XCode.Cache; +using XCode.Configuration; +using XCode.DataAccessLayer; +using XCode.Membership; +using XCode.Shards; + +namespace LuYao.Toolkit.Entities +{ + public partial class ViewModelState : Entity + { + #region 对象操作 + static ViewModelState() + { + + // 过滤器 UserModule、TimeModule、IPModule + } + + /// 验证并修补数据,通过抛出异常的方式提示验证失败。 + /// 是否插入 + public override void Valid(Boolean isNew) + { + // 如果没有脏数据,则不需要进行任何处理 + if (!HasDirty) return; + + // 建议先调用基类方法,基类方法会做一些统一处理 + base.Valid(isNew); + + // 在新插入数据或者修改了指定字段时进行修正 + + // 检查唯一索引 + // CheckExist(isNew, nameof(Type)); + } + + ///// 首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法 + //[EditorBrowsable(EditorBrowsableState.Never)] + //protected override void InitData() + //{ + // // InitData一般用于当数据表没有数据时添加一些默认数据,该实体类的任何第一次数据库操作都会触发该方法,默认异步调用 + // if (Meta.Session.Count > 0) return; + + // if (XTrace.Debug) XTrace.WriteLine("开始初始化ViewModelState[ViewModelState]数据……"); + + // var entity = new ViewModelState(); + // entity.CreatedAt = DateTime.Now; + // entity.UpdatedAt = DateTime.Now; + // entity.Type = "abc"; + // entity.Value = "abc"; + // entity.Insert(); + + // if (XTrace.Debug) XTrace.WriteLine("完成初始化ViewModelState[ViewModelState]数据!"); + //} + + ///// 已重载。基类先调用Valid(true)验证数据,然后在事务保护内调用OnInsert + ///// + //public override Int32 Insert() + //{ + // return base.Insert(); + //} + + ///// 已重载。在事务保护范围内处理业务,位于Valid之后 + ///// + //protected override Int32 OnDelete() + //{ + // return base.OnDelete(); + //} + #endregion + + #region 扩展属性 + #endregion + + #region 扩展查询 + /// 根据自增主键查找 + /// 自增主键 + /// 实体对象 + public static ViewModelState FindById(Int32 id) + { + if (id <= 0) return null; + + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id); + + // 单对象缓存 + return Meta.SingleCache[id]; + + //return Find(_.Id == id); + } + + /// 根据类型查找 + /// 类型 + /// 实体对象 + public static ViewModelState FindByType(String type) + { + // 实体缓存 + if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Type.EqualIgnoreCase(type)); + + return Find(_.Type == type); + } + #endregion + + #region 高级查询 + /// 高级查询 + /// 类型 + /// 关键字 + /// 分页参数信息。可携带统计和数据权限扩展查询等信息 + /// 实体列表 + public static IList Search(String type, String key, PageParameter page) + { + var exp = new WhereExpression(); + + if (!type.IsNullOrEmpty()) exp &= _.Type == type; + if (!key.IsNullOrEmpty()) exp &= _.Type.Contains(key) | _.Value.Contains(key); + + return FindAll(exp, page); + } + + // Select Count(Id) as Id,Category From ViewModelState Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20 + //static readonly FieldCache _CategoryCache = new FieldCache(nameof(Category)) + //{ + //Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty + //}; + + ///// 获取类别列表,字段缓存10分钟,分组统计数据最多的前20种,用于魔方前台下拉选择 + ///// + //public static IDictionary GetCategoryList() => _CategoryCache.FindAllName(); + #endregion + + #region 业务操作 + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Entities/ViewModelState.cs b/LuYao.Toolkit.Core/Entities/ViewModelState.cs new file mode 100644 index 0000000..8f6a53b --- /dev/null +++ b/LuYao.Toolkit.Core/Entities/ViewModelState.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Web.Script.Serialization; +using System.Xml.Serialization; +using XCode; +using XCode.Configuration; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Entities +{ + /// + [Serializable] + [DataObject] + [BindIndex("IU_ViewModelState_Type", true, "Type")] + [BindTable("ViewModelState", Description = "", ConnName = "LuYao.Toolkit", DbType = DatabaseType.None)] + public partial class ViewModelState + { + #region 属性 + private Int32 _Id; + /// 自增主键 + [DisplayName("自增主键")] + [Description("自增主键")] + [DataObjectField(true, true, false, 0)] + [BindColumn("Id", "自增主键", "")] + public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } } + + private DateTime _CreatedAt; + /// 创建时间 + [DisplayName("创建时间")] + [Description("创建时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("CreatedAt", "创建时间", "")] + public DateTime CreatedAt { get => _CreatedAt; set { if (OnPropertyChanging("CreatedAt", value)) { _CreatedAt = value; OnPropertyChanged("CreatedAt"); } } } + + private DateTime _UpdatedAt; + /// 更新时间 + [DisplayName("更新时间")] + [Description("更新时间")] + [DataObjectField(false, false, true, 0)] + [BindColumn("UpdatedAt", "更新时间", "")] + public DateTime UpdatedAt { get => _UpdatedAt; set { if (OnPropertyChanging("UpdatedAt", value)) { _UpdatedAt = value; OnPropertyChanged("UpdatedAt"); } } } + + private String _Type; + /// 类型 + [DisplayName("类型")] + [Description("类型")] + [DataObjectField(false, false, true, 512)] + [BindColumn("Type", "类型", "")] + public String Type { get => _Type; set { if (OnPropertyChanging("Type", value)) { _Type = value; OnPropertyChanged("Type"); } } } + + private String _Value; + /// + [DisplayName("值")] + [Description("值")] + [DataObjectField(false, false, true, -1)] + [BindColumn("Value", "值", "")] + public String Value { get => _Value; set { if (OnPropertyChanging("Value", value)) { _Value = value; OnPropertyChanged("Value"); } } } + #endregion + + #region 获取/设置 字段值 + /// 获取/设置 字段值 + /// 字段名 + /// + public override Object this[String name] + { + get + { + switch (name) + { + case "Id": return _Id; + case "CreatedAt": return _CreatedAt; + case "UpdatedAt": return _UpdatedAt; + case "Type": return _Type; + case "Value": return _Value; + default: return base[name]; + } + } + set + { + switch (name) + { + case "Id": _Id = value.ToInt(); break; + case "CreatedAt": _CreatedAt = value.ToDateTime(); break; + case "UpdatedAt": _UpdatedAt = value.ToDateTime(); break; + case "Type": _Type = Convert.ToString(value); break; + case "Value": _Value = Convert.ToString(value); break; + default: base[name] = value; break; + } + } + } + #endregion + + #region 字段名 + /// 取得ViewModelState字段信息的快捷方式 + public partial class _ + { + /// 自增主键 + public static readonly Field Id = FindByName("Id"); + + /// 创建时间 + public static readonly Field CreatedAt = FindByName("CreatedAt"); + + /// 更新时间 + public static readonly Field UpdatedAt = FindByName("UpdatedAt"); + + /// 类型 + public static readonly Field Type = FindByName("Type"); + + /// + public static readonly Field Value = FindByName("Value"); + + static Field FindByName(String name) => Meta.Table.FindByName(name); + } + + /// 取得ViewModelState字段名称的快捷方式 + public partial class __ + { + /// 自增主键 + public const String Id = "Id"; + + /// 创建时间 + public const String CreatedAt = "CreatedAt"; + + /// 更新时间 + public const String UpdatedAt = "UpdatedAt"; + + /// 类型 + public const String Type = "Type"; + + /// + public const String Value = "Value"; + } + #endregion + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Events/EntityCreatedEvent.cs b/LuYao.Toolkit.Core/Events/EntityCreatedEvent.cs new file mode 100644 index 0000000..e8b147b --- /dev/null +++ b/LuYao.Toolkit.Core/Events/EntityCreatedEvent.cs @@ -0,0 +1,8 @@ +using Prism.Events; +using XCode; + +namespace LuYao.Toolkit.Events; + +public class EntityCreatedEvent : PubSubEvent where TEntity : IEntity +{ +} diff --git a/LuYao.Toolkit.Core/Events/EntityDeletedEvent.cs b/LuYao.Toolkit.Core/Events/EntityDeletedEvent.cs new file mode 100644 index 0000000..f3265cf --- /dev/null +++ b/LuYao.Toolkit.Core/Events/EntityDeletedEvent.cs @@ -0,0 +1,8 @@ +using Prism.Events; +using XCode; + +namespace LuYao.Toolkit.Events; + +public class EntityDeletedEvent : PubSubEvent where TEntity : IEntity +{ +} diff --git a/LuYao.Toolkit.Core/Events/EntityUpdatedEvent.cs b/LuYao.Toolkit.Core/Events/EntityUpdatedEvent.cs new file mode 100644 index 0000000..26d7f2e --- /dev/null +++ b/LuYao.Toolkit.Core/Events/EntityUpdatedEvent.cs @@ -0,0 +1,13 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XCode; + +namespace LuYao.Toolkit.Events; + +public class EntityUpdatedEvent : PubSubEvent where TEntity : IEntity +{ +} diff --git a/LuYao.Toolkit.Core/Events/OpenFunctionItemEvent.cs b/LuYao.Toolkit.Core/Events/OpenFunctionItemEvent.cs new file mode 100644 index 0000000..25b9dd3 --- /dev/null +++ b/LuYao.Toolkit.Core/Events/OpenFunctionItemEvent.cs @@ -0,0 +1,6 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Events +{ + public class OpenFunctionItemEvent : PubSubEvent { } +} diff --git a/LuYao.Toolkit.Core/Events/OpenFunctionItemEventPayload.cs b/LuYao.Toolkit.Core/Events/OpenFunctionItemEventPayload.cs new file mode 100644 index 0000000..159885d --- /dev/null +++ b/LuYao.Toolkit.Core/Events/OpenFunctionItemEventPayload.cs @@ -0,0 +1,15 @@ +using LuYao.Toolkit.Channels; + +namespace LuYao.Toolkit.Events; + +public class OpenFunctionItemEventPayload +{ + public FunctionItem Item { get; } + + public OpenFunctionItemEventPayload(FunctionItem item) + { + Item = item; + } + public bool IsNewSession { get; set; } + public bool IsMultiboxing { get; set; } +} diff --git a/LuYao.Toolkit.Core/Events/OpenTabEvent.cs b/LuYao.Toolkit.Core/Events/OpenTabEvent.cs new file mode 100644 index 0000000..25ba834 --- /dev/null +++ b/LuYao.Toolkit.Core/Events/OpenTabEvent.cs @@ -0,0 +1,6 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Events +{ + public class OpenTabEvent : PubSubEvent { } +} diff --git a/LuYao.Toolkit.Core/Events/PreviewFileAsStringEvent.cs b/LuYao.Toolkit.Core/Events/PreviewFileAsStringEvent.cs new file mode 100644 index 0000000..8a55e05 --- /dev/null +++ b/LuYao.Toolkit.Core/Events/PreviewFileAsStringEvent.cs @@ -0,0 +1,10 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Events; + +public class PreviewFileAsStringEvent : PubSubEvent +{ +} diff --git a/LuYao.Toolkit.Core/Events/PreviewFileAsStringEventPayload.cs b/LuYao.Toolkit.Core/Events/PreviewFileAsStringEventPayload.cs new file mode 100644 index 0000000..877f319 --- /dev/null +++ b/LuYao.Toolkit.Core/Events/PreviewFileAsStringEventPayload.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Events; + +public class PreviewFileAsStringEventPayload +{ + public PreviewFileAsStringEventPayload(string fullName, Encoding encoding) + { + FullName = fullName; + Encoding = encoding; + } + + public string FullName { get; } + public Encoding Encoding { get; } +} diff --git a/LuYao.Toolkit.Core/Events/ThemeChangedEvent.cs b/LuYao.Toolkit.Core/Events/ThemeChangedEvent.cs new file mode 100644 index 0000000..8b0ef92 --- /dev/null +++ b/LuYao.Toolkit.Core/Events/ThemeChangedEvent.cs @@ -0,0 +1,8 @@ +using LuYao.Toolkit.Themes; +using Prism.Events; + +namespace LuYao.Toolkit.Events; + +public class ThemeChangedEvent : PubSubEvent +{ +} diff --git a/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEvent.cs b/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEvent.cs new file mode 100644 index 0000000..2d860db --- /dev/null +++ b/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEvent.cs @@ -0,0 +1,10 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Events; + +public class ViewFileContentAsStringEvent : PubSubEvent +{ +} diff --git a/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEventPayload.cs b/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEventPayload.cs new file mode 100644 index 0000000..7e5bf8b --- /dev/null +++ b/LuYao.Toolkit.Core/Events/ViewFileContentAsStringEventPayload.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace LuYao.Toolkit.Events; + +public class ViewFileContentAsStringEventPayload +{ + public ViewFileContentAsStringEventPayload(string path, Encoding encoding) + { + this.Path = path; + this.Encoding = encoding; + } + public string Path { get; } + public Encoding Encoding { get; } +} diff --git a/LuYao.Toolkit.Core/IClipboardAware.cs b/LuYao.Toolkit.Core/IClipboardAware.cs new file mode 100644 index 0000000..ec4fba4 --- /dev/null +++ b/LuYao.Toolkit.Core/IClipboardAware.cs @@ -0,0 +1,6 @@ +namespace LuYao.Toolkit; + +public interface IClipboardAware +{ + void OnPaste(); +} diff --git a/LuYao.Toolkit.Core/IFileDragDropTarget.cs b/LuYao.Toolkit.Core/IFileDragDropTarget.cs new file mode 100644 index 0000000..82da18b --- /dev/null +++ b/LuYao.Toolkit.Core/IFileDragDropTarget.cs @@ -0,0 +1,6 @@ +namespace LuYao.Toolkit; + +public interface IFileDragDropTarget +{ + void OnFilesDropped(string group, string[] filepaths); +} diff --git a/LuYao.Toolkit.Core/IO/TempHelper.cs b/LuYao.Toolkit.Core/IO/TempHelper.cs new file mode 100644 index 0000000..ab1e8ce --- /dev/null +++ b/LuYao.Toolkit.Core/IO/TempHelper.cs @@ -0,0 +1,69 @@ +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace LuYao.Toolkit.IO; + +public static class TempHelper +{ + static TempHelper() + { + Root = Path.Combine(Path.GetTempPath(), "LuYao.Toolkit", "Cache"); + if (!Directory.Exists(Root)) Directory.CreateDirectory(Root); + } + + public static string Root { get; } + + public static string GetTempFileName() + { + var dir = Root; + if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); + var fn = Path.Combine(dir, Path.GetRandomFileName()); + XTrace.WriteLine("分配临时文件:{0}", fn); + return fn; + } + + public static string GetTempFileName(string name) + { + var dir = Root; + if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); + return Path.Combine(dir, name); + } + + + public static void ClearTemp() + { + XTrace.WriteLine("清理临时目录:{0}", Root); + var dirs = Directory.GetDirectories(Root); + foreach (var dir in dirs) + { + try + { + XTrace.WriteLine("删除临时目录:{0}", dir); + Directory.Delete(dir, true); + } + catch (Exception e) + { + XTrace.WriteLine("目录删除失败"); + XTrace.WriteException(e); + } + } + + var files = Directory.GetFiles(Root); + foreach (var file in files) + { + try + { + XTrace.WriteLine("删除临时文件:{0}", file); + File.Delete(file); + } + catch (Exception e) + { + XTrace.WriteLine("文件删除失败"); + XTrace.WriteException(e); + } + } + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Icons.cs b/LuYao.Toolkit.Core/Icons.cs new file mode 100644 index 0000000..47fe97b --- /dev/null +++ b/LuYao.Toolkit.Core/Icons.cs @@ -0,0 +1,6401 @@ +namespace LuYao.Toolkit; + +public static class Icons +{ + public const string None = "None"; + public const string Abacus = "Abacus"; + public const string AbjadArabic = "AbjadArabic"; + public const string AbjadHebrew = "AbjadHebrew"; + public const string AbTesting = "AbTesting"; + public const string AbugidaDevanagari = "AbugidaDevanagari"; + public const string AbugidaThai = "AbugidaThai"; + public const string AccessPoint = "AccessPoint"; + public const string AccessPointCheck = "AccessPointCheck"; + public const string AccessPointMinus = "AccessPointMinus"; + public const string AccessPointNetwork = "AccessPointNetwork"; + public const string AccessPointNetworkOff = "AccessPointNetworkOff"; + public const string AccessPointOff = "AccessPointOff"; + public const string AccessPointPlus = "AccessPointPlus"; + public const string AccessPointRemove = "AccessPointRemove"; + public const string Account = "Account"; + public const string AccountAlert = "AccountAlert"; + public const string AccountAlertOutline = "AccountAlertOutline"; + public const string AccountArrowDown = "AccountArrowDown"; + public const string AccountArrowDownOutline = "AccountArrowDownOutline"; + public const string AccountArrowLeft = "AccountArrowLeft"; + public const string AccountArrowLeftOutline = "AccountArrowLeftOutline"; + public const string AccountArrowRight = "AccountArrowRight"; + public const string AccountArrowRightOutline = "AccountArrowRightOutline"; + public const string AccountArrowUp = "AccountArrowUp"; + public const string AccountArrowUpOutline = "AccountArrowUpOutline"; + public const string AccountBox = "AccountBox"; + public const string AccountBoxMultiple = "AccountBoxMultiple"; + public const string AccountBoxMultipleOutline = "AccountBoxMultipleOutline"; + public const string AccountBoxOutline = "AccountBoxOutline"; + public const string AccountCancel = "AccountCancel"; + public const string AccountCancelOutline = "AccountCancelOutline"; + public const string AccountCash = "AccountCash"; + public const string AccountCashOutline = "AccountCashOutline"; + public const string AccountCheck = "AccountCheck"; + public const string AccountCheckOutline = "AccountCheckOutline"; + public const string AccountChild = "AccountChild"; + public const string AccountChildCircle = "AccountChildCircle"; + public const string AccountChildOutline = "AccountChildOutline"; + public const string AccountCircle = "AccountCircle"; + public const string AccountCircleOutline = "AccountCircleOutline"; + public const string AccountClock = "AccountClock"; + public const string AccountClockOutline = "AccountClockOutline"; + public const string AccountCog = "AccountCog"; + public const string AccountCogOutline = "AccountCogOutline"; + public const string AccountConvert = "AccountConvert"; + public const string AccountConvertOutline = "AccountConvertOutline"; + public const string AccountCowboyHat = "AccountCowboyHat"; + public const string AccountCowboyHatOutline = "AccountCowboyHatOutline"; + public const string AccountDetails = "AccountDetails"; + public const string AccountDetailsOutline = "AccountDetailsOutline"; + public const string AccountEdit = "AccountEdit"; + public const string AccountEditOutline = "AccountEditOutline"; + public const string AccountEye = "AccountEye"; + public const string AccountEyeOutline = "AccountEyeOutline"; + public const string AccountFilter = "AccountFilter"; + public const string AccountFilterOutline = "AccountFilterOutline"; + public const string AccountGroup = "AccountGroup"; + public const string AccountGroupOutline = "AccountGroupOutline"; + public const string AccountHardHat = "AccountHardHat"; + public const string AccountHeart = "AccountHeart"; + public const string AccountHeartOutline = "AccountHeartOutline"; + public const string AccountInjury = "AccountInjury"; + public const string AccountInjuryOutline = "AccountInjuryOutline"; + public const string AccountKey = "AccountKey"; + public const string AccountKeyOutline = "AccountKeyOutline"; + public const string AccountLock = "AccountLock"; + public const string AccountLockOutline = "AccountLockOutline"; + public const string AccountMinus = "AccountMinus"; + public const string AccountMinusOutline = "AccountMinusOutline"; + public const string AccountMultiple = "AccountMultiple"; + public const string AccountMultipleCheck = "AccountMultipleCheck"; + public const string AccountMultipleCheckOutline = "AccountMultipleCheckOutline"; + public const string AccountMultipleMinus = "AccountMultipleMinus"; + public const string AccountMultipleMinusOutline = "AccountMultipleMinusOutline"; + public const string AccountMultipleOutline = "AccountMultipleOutline"; + public const string AccountMultiplePlus = "AccountMultiplePlus"; + public const string AccountMultiplePlusOutline = "AccountMultiplePlusOutline"; + public const string AccountMultipleRemove = "AccountMultipleRemove"; + public const string AccountMultipleRemoveOutline = "AccountMultipleRemoveOutline"; + public const string AccountMusic = "AccountMusic"; + public const string AccountMusicOutline = "AccountMusicOutline"; + public const string AccountNetwork = "AccountNetwork"; + public const string AccountNetworkOutline = "AccountNetworkOutline"; + public const string AccountOff = "AccountOff"; + public const string AccountOffOutline = "AccountOffOutline"; + public const string AccountOutline = "AccountOutline"; + public const string AccountPlus = "AccountPlus"; + public const string AccountPlusOutline = "AccountPlusOutline"; + public const string AccountQuestion = "AccountQuestion"; + public const string AccountQuestionOutline = "AccountQuestionOutline"; + public const string AccountReactivate = "AccountReactivate"; + public const string AccountReactivateOutline = "AccountReactivateOutline"; + public const string AccountRemove = "AccountRemove"; + public const string AccountRemoveOutline = "AccountRemoveOutline"; + public const string AccountSearch = "AccountSearch"; + public const string AccountSearchOutline = "AccountSearchOutline"; + public const string AccountSettings = "AccountSettings"; + public const string AccountSettingsOutline = "AccountSettingsOutline"; + public const string AccountStar = "AccountStar"; + public const string AccountStarOutline = "AccountStarOutline"; + public const string AccountSupervisor = "AccountSupervisor"; + public const string AccountSupervisorCircle = "AccountSupervisorCircle"; + public const string AccountSupervisorCircleOutline = "AccountSupervisorCircleOutline"; + public const string AccountSupervisorOutline = "AccountSupervisorOutline"; + public const string AccountSwitch = "AccountSwitch"; + public const string AccountSwitchOutline = "AccountSwitchOutline"; + public const string AccountTie = "AccountTie"; + public const string AccountTieHat = "AccountTieHat"; + public const string AccountTieHatOutline = "AccountTieHatOutline"; + public const string AccountTieOutline = "AccountTieOutline"; + public const string AccountTieVoice = "AccountTieVoice"; + public const string AccountTieVoiceOff = "AccountTieVoiceOff"; + public const string AccountTieVoiceOffOutline = "AccountTieVoiceOffOutline"; + public const string AccountTieVoiceOutline = "AccountTieVoiceOutline"; + public const string AccountVoice = "AccountVoice"; + public const string AccountVoiceOff = "AccountVoiceOff"; + public const string AccountWrench = "AccountWrench"; + public const string AccountWrenchOutline = "AccountWrenchOutline"; + public const string Adjust = "Adjust"; + public const string Airbag = "Airbag"; + public const string Airballoon = "Airballoon"; + public const string AirballoonOutline = "AirballoonOutline"; + public const string AirConditioner = "AirConditioner"; + public const string AirFilter = "AirFilter"; + public const string AirHorn = "AirHorn"; + public const string AirHumidifier = "AirHumidifier"; + public const string AirHumidifierOff = "AirHumidifierOff"; + public const string Airplane = "Airplane"; + public const string AirplaneAlert = "AirplaneAlert"; + public const string AirplaneCheck = "AirplaneCheck"; + public const string AirplaneClock = "AirplaneClock"; + public const string AirplaneCog = "AirplaneCog"; + public const string AirplaneEdit = "AirplaneEdit"; + public const string AirplaneLanding = "AirplaneLanding"; + public const string AirplaneMarker = "AirplaneMarker"; + public const string AirplaneMinus = "AirplaneMinus"; + public const string AirplaneOff = "AirplaneOff"; + public const string AirplanePlus = "AirplanePlus"; + public const string AirplaneRemove = "AirplaneRemove"; + public const string AirplaneSearch = "AirplaneSearch"; + public const string AirplaneSettings = "AirplaneSettings"; + public const string AirplaneTakeoff = "AirplaneTakeoff"; + public const string Airport = "Airport"; + public const string AirPurifier = "AirPurifier"; + public const string Alarm = "Alarm"; + public const string AlarmBell = "AlarmBell"; + public const string AlarmCheck = "AlarmCheck"; + public const string AlarmLight = "AlarmLight"; + public const string AlarmLightOff = "AlarmLightOff"; + public const string AlarmLightOffOutline = "AlarmLightOffOutline"; + public const string AlarmLightOutline = "AlarmLightOutline"; + public const string AlarmMultiple = "AlarmMultiple"; + public const string AlarmNote = "AlarmNote"; + public const string AlarmNoteOff = "AlarmNoteOff"; + public const string AlarmOff = "AlarmOff"; + public const string AlarmPanel = "AlarmPanel"; + public const string AlarmPanelOutline = "AlarmPanelOutline"; + public const string AlarmPlus = "AlarmPlus"; + public const string AlarmSnooze = "AlarmSnooze"; + public const string Album = "Album"; + public const string Alert = "Alert"; + public const string AlertBox = "AlertBox"; + public const string AlertBoxOutline = "AlertBoxOutline"; + public const string AlertCircle = "AlertCircle"; + public const string AlertCircleCheck = "AlertCircleCheck"; + public const string AlertCircleCheckOutline = "AlertCircleCheckOutline"; + public const string AlertCircleOutline = "AlertCircleOutline"; + public const string AlertDecagram = "AlertDecagram"; + public const string AlertDecagramOutline = "AlertDecagramOutline"; + public const string AlertMinus = "AlertMinus"; + public const string AlertMinusOutline = "AlertMinusOutline"; + public const string AlertOctagon = "AlertOctagon"; + public const string AlertOctagonOutline = "AlertOctagonOutline"; + public const string AlertOctagram = "AlertOctagram"; + public const string AlertOctagramOutline = "AlertOctagramOutline"; + public const string AlertOutline = "AlertOutline"; + public const string AlertPlus = "AlertPlus"; + public const string AlertPlusOutline = "AlertPlusOutline"; + public const string AlertRemove = "AlertRemove"; + public const string AlertRemoveOutline = "AlertRemoveOutline"; + public const string AlertRhombus = "AlertRhombus"; + public const string AlertRhombusOutline = "AlertRhombusOutline"; + public const string Alien = "Alien"; + public const string AlienOutline = "AlienOutline"; + public const string AlignHorizontalCenter = "AlignHorizontalCenter"; + public const string AlignHorizontalLeft = "AlignHorizontalLeft"; + public const string AlignHorizontalRight = "AlignHorizontalRight"; + public const string AlignVerticalBottom = "AlignVerticalBottom"; + public const string AlignVerticalCenter = "AlignVerticalCenter"; + public const string AlignVerticalTop = "AlignVerticalTop"; + public const string Allergy = "Allergy"; + public const string AllInclusive = "AllInclusive"; + public const string AllInclusiveBox = "AllInclusiveBox"; + public const string AllInclusiveBoxOutline = "AllInclusiveBoxOutline"; + public const string Alpha = "Alpha"; + public const string AlphaA = "AlphaA"; + public const string AlphaABox = "AlphaABox"; + public const string AlphaABoxOutline = "AlphaABoxOutline"; + public const string AlphaACircle = "AlphaACircle"; + public const string AlphaACircleOutline = "AlphaACircleOutline"; + public const string AlphaB = "AlphaB"; + public const string AlphaBBox = "AlphaBBox"; + public const string AlphaBBoxOutline = "AlphaBBoxOutline"; + public const string AlphaBCircle = "AlphaBCircle"; + public const string AlphaBCircleOutline = "AlphaBCircleOutline"; + public const string AlphabetAurebesh = "AlphabetAurebesh"; + public const string AlphabetCyrillic = "AlphabetCyrillic"; + public const string AlphabetGreek = "AlphabetGreek"; + public const string Alphabetical = "Alphabetical"; + public const string AlphabeticalOff = "AlphabeticalOff"; + public const string AlphabeticalVariant = "AlphabeticalVariant"; + public const string AlphabeticalVariantOff = "AlphabeticalVariantOff"; + public const string AlphabetLatin = "AlphabetLatin"; + public const string AlphabetPiqad = "AlphabetPiqad"; + public const string AlphabetTengwar = "AlphabetTengwar"; + public const string AlphaC = "AlphaC"; + public const string AlphaCBox = "AlphaCBox"; + public const string AlphaCBoxOutline = "AlphaCBoxOutline"; + public const string AlphaCCircle = "AlphaCCircle"; + public const string AlphaCCircleOutline = "AlphaCCircleOutline"; + public const string AlphaD = "AlphaD"; + public const string AlphaDBox = "AlphaDBox"; + public const string AlphaDBoxOutline = "AlphaDBoxOutline"; + public const string AlphaDCircle = "AlphaDCircle"; + public const string AlphaDCircleOutline = "AlphaDCircleOutline"; + public const string AlphaE = "AlphaE"; + public const string AlphaEBox = "AlphaEBox"; + public const string AlphaEBoxOutline = "AlphaEBoxOutline"; + public const string AlphaECircle = "AlphaECircle"; + public const string AlphaECircleOutline = "AlphaECircleOutline"; + public const string AlphaF = "AlphaF"; + public const string AlphaFBox = "AlphaFBox"; + public const string AlphaFBoxOutline = "AlphaFBoxOutline"; + public const string AlphaFCircle = "AlphaFCircle"; + public const string AlphaFCircleOutline = "AlphaFCircleOutline"; + public const string AlphaG = "AlphaG"; + public const string AlphaGBox = "AlphaGBox"; + public const string AlphaGBoxOutline = "AlphaGBoxOutline"; + public const string AlphaGCircle = "AlphaGCircle"; + public const string AlphaGCircleOutline = "AlphaGCircleOutline"; + public const string AlphaH = "AlphaH"; + public const string AlphaHBox = "AlphaHBox"; + public const string AlphaHBoxOutline = "AlphaHBoxOutline"; + public const string AlphaHCircle = "AlphaHCircle"; + public const string AlphaHCircleOutline = "AlphaHCircleOutline"; + public const string AlphaI = "AlphaI"; + public const string AlphaIBox = "AlphaIBox"; + public const string AlphaIBoxOutline = "AlphaIBoxOutline"; + public const string AlphaICircle = "AlphaICircle"; + public const string AlphaICircleOutline = "AlphaICircleOutline"; + public const string AlphaJ = "AlphaJ"; + public const string AlphaJBox = "AlphaJBox"; + public const string AlphaJBoxOutline = "AlphaJBoxOutline"; + public const string AlphaJCircle = "AlphaJCircle"; + public const string AlphaJCircleOutline = "AlphaJCircleOutline"; + public const string AlphaK = "AlphaK"; + public const string AlphaKBox = "AlphaKBox"; + public const string AlphaKBoxOutline = "AlphaKBoxOutline"; + public const string AlphaKCircle = "AlphaKCircle"; + public const string AlphaKCircleOutline = "AlphaKCircleOutline"; + public const string AlphaL = "AlphaL"; + public const string AlphaLBox = "AlphaLBox"; + public const string AlphaLBoxOutline = "AlphaLBoxOutline"; + public const string AlphaLCircle = "AlphaLCircle"; + public const string AlphaLCircleOutline = "AlphaLCircleOutline"; + public const string AlphaM = "AlphaM"; + public const string AlphaMBox = "AlphaMBox"; + public const string AlphaMBoxOutline = "AlphaMBoxOutline"; + public const string AlphaMCircle = "AlphaMCircle"; + public const string AlphaMCircleOutline = "AlphaMCircleOutline"; + public const string AlphaN = "AlphaN"; + public const string AlphaNBox = "AlphaNBox"; + public const string AlphaNBoxOutline = "AlphaNBoxOutline"; + public const string AlphaNCircle = "AlphaNCircle"; + public const string AlphaNCircleOutline = "AlphaNCircleOutline"; + public const string AlphaO = "AlphaO"; + public const string AlphaOBox = "AlphaOBox"; + public const string AlphaOBoxOutline = "AlphaOBoxOutline"; + public const string AlphaOCircle = "AlphaOCircle"; + public const string AlphaOCircleOutline = "AlphaOCircleOutline"; + public const string AlphaP = "AlphaP"; + public const string AlphaPBox = "AlphaPBox"; + public const string AlphaPBoxOutline = "AlphaPBoxOutline"; + public const string AlphaPCircle = "AlphaPCircle"; + public const string AlphaPCircleOutline = "AlphaPCircleOutline"; + public const string AlphaQ = "AlphaQ"; + public const string AlphaQBox = "AlphaQBox"; + public const string AlphaQBoxOutline = "AlphaQBoxOutline"; + public const string AlphaQCircle = "AlphaQCircle"; + public const string AlphaQCircleOutline = "AlphaQCircleOutline"; + public const string AlphaR = "AlphaR"; + public const string AlphaRBox = "AlphaRBox"; + public const string AlphaRBoxOutline = "AlphaRBoxOutline"; + public const string AlphaRCircle = "AlphaRCircle"; + public const string AlphaRCircleOutline = "AlphaRCircleOutline"; + public const string AlphaS = "AlphaS"; + public const string AlphaSBox = "AlphaSBox"; + public const string AlphaSBoxOutline = "AlphaSBoxOutline"; + public const string AlphaSCircle = "AlphaSCircle"; + public const string AlphaSCircleOutline = "AlphaSCircleOutline"; + public const string AlphaT = "AlphaT"; + public const string AlphaTBox = "AlphaTBox"; + public const string AlphaTBoxOutline = "AlphaTBoxOutline"; + public const string AlphaTCircle = "AlphaTCircle"; + public const string AlphaTCircleOutline = "AlphaTCircleOutline"; + public const string AlphaU = "AlphaU"; + public const string AlphaUBox = "AlphaUBox"; + public const string AlphaUBoxOutline = "AlphaUBoxOutline"; + public const string AlphaUCircle = "AlphaUCircle"; + public const string AlphaUCircleOutline = "AlphaUCircleOutline"; + public const string AlphaV = "AlphaV"; + public const string AlphaVBox = "AlphaVBox"; + public const string AlphaVBoxOutline = "AlphaVBoxOutline"; + public const string AlphaVCircle = "AlphaVCircle"; + public const string AlphaVCircleOutline = "AlphaVCircleOutline"; + public const string AlphaW = "AlphaW"; + public const string AlphaWBox = "AlphaWBox"; + public const string AlphaWBoxOutline = "AlphaWBoxOutline"; + public const string AlphaWCircle = "AlphaWCircle"; + public const string AlphaWCircleOutline = "AlphaWCircleOutline"; + public const string AlphaX = "AlphaX"; + public const string AlphaXBox = "AlphaXBox"; + public const string AlphaXBoxOutline = "AlphaXBoxOutline"; + public const string AlphaXCircle = "AlphaXCircle"; + public const string AlphaXCircleOutline = "AlphaXCircleOutline"; + public const string AlphaY = "AlphaY"; + public const string AlphaYBox = "AlphaYBox"; + public const string AlphaYBoxOutline = "AlphaYBoxOutline"; + public const string AlphaYCircle = "AlphaYCircle"; + public const string AlphaYCircleOutline = "AlphaYCircleOutline"; + public const string AlphaZ = "AlphaZ"; + public const string AlphaZBox = "AlphaZBox"; + public const string AlphaZBoxOutline = "AlphaZBoxOutline"; + public const string AlphaZCircle = "AlphaZCircle"; + public const string AlphaZCircleOutline = "AlphaZCircleOutline"; + public const string Altimeter = "Altimeter"; + public const string Ambulance = "Ambulance"; + public const string Ammunition = "Ammunition"; + public const string Ampersand = "Ampersand"; + public const string Amplifier = "Amplifier"; + public const string AmplifierOff = "AmplifierOff"; + public const string Anchor = "Anchor"; + public const string Android = "Android"; + public const string AndroidMessages = "AndroidMessages"; + public const string AndroidStudio = "AndroidStudio"; + public const string AngleAcute = "AngleAcute"; + public const string AngleObtuse = "AngleObtuse"; + public const string AngleRight = "AngleRight"; + public const string Angular = "Angular"; + public const string Angularjs = "Angularjs"; + public const string Animation = "Animation"; + public const string AnimationOutline = "AnimationOutline"; + public const string AnimationPlay = "AnimationPlay"; + public const string AnimationPlayOutline = "AnimationPlayOutline"; + public const string Ansible = "Ansible"; + public const string Antenna = "Antenna"; + public const string Anvil = "Anvil"; + public const string ApacheKafka = "ApacheKafka"; + public const string Api = "Api"; + public const string ApiOff = "ApiOff"; + public const string Apple = "Apple"; + public const string AppleFinder = "AppleFinder"; + public const string AppleIcloud = "AppleIcloud"; + public const string AppleIos = "AppleIos"; + public const string AppleKeyboardCaps = "AppleKeyboardCaps"; + public const string AppleKeyboardCommand = "AppleKeyboardCommand"; + public const string AppleKeyboardControl = "AppleKeyboardControl"; + public const string AppleKeyboardOption = "AppleKeyboardOption"; + public const string AppleKeyboardShift = "AppleKeyboardShift"; + public const string AppleSafari = "AppleSafari"; + public const string Application = "Application"; + public const string ApplicationArray = "ApplicationArray"; + public const string ApplicationArrayOutline = "ApplicationArrayOutline"; + public const string ApplicationBraces = "ApplicationBraces"; + public const string ApplicationBracesOutline = "ApplicationBracesOutline"; + public const string ApplicationBrackets = "ApplicationBrackets"; + public const string ApplicationBracketsOutline = "ApplicationBracketsOutline"; + public const string ApplicationCog = "ApplicationCog"; + public const string ApplicationCogOutline = "ApplicationCogOutline"; + public const string ApplicationEdit = "ApplicationEdit"; + public const string ApplicationEditOutline = "ApplicationEditOutline"; + public const string ApplicationExport = "ApplicationExport"; + public const string ApplicationImport = "ApplicationImport"; + public const string ApplicationOutline = "ApplicationOutline"; + public const string ApplicationParentheses = "ApplicationParentheses"; + public const string ApplicationParenthesesOutline = "ApplicationParenthesesOutline"; + public const string ApplicationSettings = "ApplicationSettings"; + public const string ApplicationSettingsOutline = "ApplicationSettingsOutline"; + public const string ApplicationVariable = "ApplicationVariable"; + public const string ApplicationVariableOutline = "ApplicationVariableOutline"; + public const string ApproximatelyEqual = "ApproximatelyEqual"; + public const string ApproximatelyEqualBox = "ApproximatelyEqualBox"; + public const string Apps = "Apps"; + public const string AppsBox = "AppsBox"; + public const string Arch = "Arch"; + public const string Archive = "Archive"; + public const string ArchiveAlert = "ArchiveAlert"; + public const string ArchiveAlertOutline = "ArchiveAlertOutline"; + public const string ArchiveArrowDown = "ArchiveArrowDown"; + public const string ArchiveArrowDownOutline = "ArchiveArrowDownOutline"; + public const string ArchiveArrowUp = "ArchiveArrowUp"; + public const string ArchiveArrowUpOutline = "ArchiveArrowUpOutline"; + public const string ArchiveCancel = "ArchiveCancel"; + public const string ArchiveCancelOutline = "ArchiveCancelOutline"; + public const string ArchiveCheck = "ArchiveCheck"; + public const string ArchiveCheckOutline = "ArchiveCheckOutline"; + public const string ArchiveClock = "ArchiveClock"; + public const string ArchiveClockOutline = "ArchiveClockOutline"; + public const string ArchiveCog = "ArchiveCog"; + public const string ArchiveCogOutline = "ArchiveCogOutline"; + public const string ArchiveEdit = "ArchiveEdit"; + public const string ArchiveEditOutline = "ArchiveEditOutline"; + public const string ArchiveEye = "ArchiveEye"; + public const string ArchiveEyeOutline = "ArchiveEyeOutline"; + public const string ArchiveLock = "ArchiveLock"; + public const string ArchiveLockOpen = "ArchiveLockOpen"; + public const string ArchiveLockOpenOutline = "ArchiveLockOpenOutline"; + public const string ArchiveLockOutline = "ArchiveLockOutline"; + public const string ArchiveMarker = "ArchiveMarker"; + public const string ArchiveMarkerOutline = "ArchiveMarkerOutline"; + public const string ArchiveMinus = "ArchiveMinus"; + public const string ArchiveMinusOutline = "ArchiveMinusOutline"; + public const string ArchiveMusic = "ArchiveMusic"; + public const string ArchiveMusicOutline = "ArchiveMusicOutline"; + public const string ArchiveOff = "ArchiveOff"; + public const string ArchiveOffOutline = "ArchiveOffOutline"; + public const string ArchiveOutline = "ArchiveOutline"; + public const string ArchivePlus = "ArchivePlus"; + public const string ArchivePlusOutline = "ArchivePlusOutline"; + public const string ArchiveRefresh = "ArchiveRefresh"; + public const string ArchiveRefreshOutline = "ArchiveRefreshOutline"; + public const string ArchiveRemove = "ArchiveRemove"; + public const string ArchiveRemoveOutline = "ArchiveRemoveOutline"; + public const string ArchiveSearch = "ArchiveSearch"; + public const string ArchiveSearchOutline = "ArchiveSearchOutline"; + public const string ArchiveSettings = "ArchiveSettings"; + public const string ArchiveSettingsOutline = "ArchiveSettingsOutline"; + public const string ArchiveStar = "ArchiveStar"; + public const string ArchiveStarOutline = "ArchiveStarOutline"; + public const string ArchiveSync = "ArchiveSync"; + public const string ArchiveSyncOutline = "ArchiveSyncOutline"; + public const string ArmFlex = "ArmFlex"; + public const string ArmFlexOutline = "ArmFlexOutline"; + public const string ArrangeBringForward = "ArrangeBringForward"; + public const string ArrangeBringToFront = "ArrangeBringToFront"; + public const string ArrangeSendBackward = "ArrangeSendBackward"; + public const string ArrangeSendToBack = "ArrangeSendToBack"; + public const string ArrowAll = "ArrowAll"; + public const string ArrowBottomLeft = "ArrowBottomLeft"; + public const string ArrowBottomLeftBoldOutline = "ArrowBottomLeftBoldOutline"; + public const string ArrowBottomLeftThick = "ArrowBottomLeftThick"; + public const string ArrowBottomLeftThinCircleOutline = "ArrowBottomLeftThinCircleOutline"; + public const string ArrowBottomRight = "ArrowBottomRight"; + public const string ArrowBottomRightBoldOutline = "ArrowBottomRightBoldOutline"; + public const string ArrowBottomRightThick = "ArrowBottomRightThick"; + public const string ArrowBottomRightThinCircleOutline = "ArrowBottomRightThinCircleOutline"; + public const string ArrowCollapse = "ArrowCollapse"; + public const string ArrowCollapseAll = "ArrowCollapseAll"; + public const string ArrowCollapseDown = "ArrowCollapseDown"; + public const string ArrowCollapseHorizontal = "ArrowCollapseHorizontal"; + public const string ArrowCollapseLeft = "ArrowCollapseLeft"; + public const string ArrowCollapseRight = "ArrowCollapseRight"; + public const string ArrowCollapseUp = "ArrowCollapseUp"; + public const string ArrowCollapseVertical = "ArrowCollapseVertical"; + public const string ArrowDecision = "ArrowDecision"; + public const string ArrowDecisionAuto = "ArrowDecisionAuto"; + public const string ArrowDecisionAutoOutline = "ArrowDecisionAutoOutline"; + public const string ArrowDecisionOutline = "ArrowDecisionOutline"; + public const string ArrowDown = "ArrowDown"; + public const string ArrowDownBold = "ArrowDownBold"; + public const string ArrowDownBoldBox = "ArrowDownBoldBox"; + public const string ArrowDownBoldBoxOutline = "ArrowDownBoldBoxOutline"; + public const string ArrowDownBoldCircle = "ArrowDownBoldCircle"; + public const string ArrowDownBoldCircleOutline = "ArrowDownBoldCircleOutline"; + public const string ArrowDownBoldHexagonOutline = "ArrowDownBoldHexagonOutline"; + public const string ArrowDownBoldOutline = "ArrowDownBoldOutline"; + public const string ArrowDownBox = "ArrowDownBox"; + public const string ArrowDownCircle = "ArrowDownCircle"; + public const string ArrowDownCircleOutline = "ArrowDownCircleOutline"; + public const string ArrowDownDropCircle = "ArrowDownDropCircle"; + public const string ArrowDownDropCircleOutline = "ArrowDownDropCircleOutline"; + public const string ArrowDownLeft = "ArrowDownLeft"; + public const string ArrowDownLeftBold = "ArrowDownLeftBold"; + public const string ArrowDownRight = "ArrowDownRight"; + public const string ArrowDownRightBold = "ArrowDownRightBold"; + public const string ArrowDownThick = "ArrowDownThick"; + public const string ArrowDownThinCircleOutline = "ArrowDownThinCircleOutline"; + public const string ArrowExpand = "ArrowExpand"; + public const string ArrowExpandAll = "ArrowExpandAll"; + public const string ArrowExpandDown = "ArrowExpandDown"; + public const string ArrowExpandHorizontal = "ArrowExpandHorizontal"; + public const string ArrowExpandLeft = "ArrowExpandLeft"; + public const string ArrowExpandRight = "ArrowExpandRight"; + public const string ArrowExpandUp = "ArrowExpandUp"; + public const string ArrowExpandVertical = "ArrowExpandVertical"; + public const string ArrowHorizontalLock = "ArrowHorizontalLock"; + public const string ArrowLeft = "ArrowLeft"; + public const string ArrowLeftBold = "ArrowLeftBold"; + public const string ArrowLeftBoldBox = "ArrowLeftBoldBox"; + public const string ArrowLeftBoldBoxOutline = "ArrowLeftBoldBoxOutline"; + public const string ArrowLeftBoldCircle = "ArrowLeftBoldCircle"; + public const string ArrowLeftBoldCircleOutline = "ArrowLeftBoldCircleOutline"; + public const string ArrowLeftBoldHexagonOutline = "ArrowLeftBoldHexagonOutline"; + public const string ArrowLeftBoldOutline = "ArrowLeftBoldOutline"; + public const string ArrowLeftBottom = "ArrowLeftBottom"; + public const string ArrowLeftBottomBold = "ArrowLeftBottomBold"; + public const string ArrowLeftBox = "ArrowLeftBox"; + public const string ArrowLeftCircle = "ArrowLeftCircle"; + public const string ArrowLeftCircleOutline = "ArrowLeftCircleOutline"; + public const string ArrowLeftDropCircle = "ArrowLeftDropCircle"; + public const string ArrowLeftDropCircleOutline = "ArrowLeftDropCircleOutline"; + public const string ArrowLeftRight = "ArrowLeftRight"; + public const string ArrowLeftRightBold = "ArrowLeftRightBold"; + public const string ArrowLeftRightBoldOutline = "ArrowLeftRightBoldOutline"; + public const string ArrowLeftThick = "ArrowLeftThick"; + public const string ArrowLeftThinCircleOutline = "ArrowLeftThinCircleOutline"; + public const string ArrowLeftTop = "ArrowLeftTop"; + public const string ArrowLeftTopBold = "ArrowLeftTopBold"; + public const string ArrowProjectile = "ArrowProjectile"; + public const string ArrowProjectileMultiple = "ArrowProjectileMultiple"; + public const string ArrowRight = "ArrowRight"; + public const string ArrowRightBold = "ArrowRightBold"; + public const string ArrowRightBoldBox = "ArrowRightBoldBox"; + public const string ArrowRightBoldBoxOutline = "ArrowRightBoldBoxOutline"; + public const string ArrowRightBoldCircle = "ArrowRightBoldCircle"; + public const string ArrowRightBoldCircleOutline = "ArrowRightBoldCircleOutline"; + public const string ArrowRightBoldHexagonOutline = "ArrowRightBoldHexagonOutline"; + public const string ArrowRightBoldOutline = "ArrowRightBoldOutline"; + public const string ArrowRightBottom = "ArrowRightBottom"; + public const string ArrowRightBottomBold = "ArrowRightBottomBold"; + public const string ArrowRightBox = "ArrowRightBox"; + public const string ArrowRightCircle = "ArrowRightCircle"; + public const string ArrowRightCircleOutline = "ArrowRightCircleOutline"; + public const string ArrowRightDropCircle = "ArrowRightDropCircle"; + public const string ArrowRightDropCircleOutline = "ArrowRightDropCircleOutline"; + public const string ArrowRightThick = "ArrowRightThick"; + public const string ArrowRightThinCircleOutline = "ArrowRightThinCircleOutline"; + public const string ArrowRightTop = "ArrowRightTop"; + public const string ArrowRightTopBold = "ArrowRightTopBold"; + public const string ArrowSplitHorizontal = "ArrowSplitHorizontal"; + public const string ArrowSplitVertical = "ArrowSplitVertical"; + public const string ArrowTopLeft = "ArrowTopLeft"; + public const string ArrowTopLeftBoldOutline = "ArrowTopLeftBoldOutline"; + public const string ArrowTopLeftBottomRight = "ArrowTopLeftBottomRight"; + public const string ArrowTopLeftBottomRightBold = "ArrowTopLeftBottomRightBold"; + public const string ArrowTopLeftThick = "ArrowTopLeftThick"; + public const string ArrowTopLeftThinCircleOutline = "ArrowTopLeftThinCircleOutline"; + public const string ArrowTopRight = "ArrowTopRight"; + public const string ArrowTopRightBoldOutline = "ArrowTopRightBoldOutline"; + public const string ArrowTopRightBottomLeft = "ArrowTopRightBottomLeft"; + public const string ArrowTopRightBottomLeftBold = "ArrowTopRightBottomLeftBold"; + public const string ArrowTopRightThick = "ArrowTopRightThick"; + public const string ArrowTopRightThinCircleOutline = "ArrowTopRightThinCircleOutline"; + public const string ArrowUDownLeft = "ArrowUDownLeft"; + public const string ArrowUDownLeftBold = "ArrowUDownLeftBold"; + public const string ArrowUDownRight = "ArrowUDownRight"; + public const string ArrowUDownRightBold = "ArrowUDownRightBold"; + public const string ArrowULeftBottom = "ArrowULeftBottom"; + public const string ArrowULeftBottomBold = "ArrowULeftBottomBold"; + public const string ArrowULeftTop = "ArrowULeftTop"; + public const string ArrowULeftTopBold = "ArrowULeftTopBold"; + public const string ArrowUp = "ArrowUp"; + public const string ArrowUpBold = "ArrowUpBold"; + public const string ArrowUpBoldBox = "ArrowUpBoldBox"; + public const string ArrowUpBoldBoxOutline = "ArrowUpBoldBoxOutline"; + public const string ArrowUpBoldCircle = "ArrowUpBoldCircle"; + public const string ArrowUpBoldCircleOutline = "ArrowUpBoldCircleOutline"; + public const string ArrowUpBoldHexagonOutline = "ArrowUpBoldHexagonOutline"; + public const string ArrowUpBoldOutline = "ArrowUpBoldOutline"; + public const string ArrowUpBox = "ArrowUpBox"; + public const string ArrowUpCircle = "ArrowUpCircle"; + public const string ArrowUpCircleOutline = "ArrowUpCircleOutline"; + public const string ArrowUpDown = "ArrowUpDown"; + public const string ArrowUpDownBold = "ArrowUpDownBold"; + public const string ArrowUpDownBoldOutline = "ArrowUpDownBoldOutline"; + public const string ArrowUpDropCircle = "ArrowUpDropCircle"; + public const string ArrowUpDropCircleOutline = "ArrowUpDropCircleOutline"; + public const string ArrowUpLeft = "ArrowUpLeft"; + public const string ArrowUpLeftBold = "ArrowUpLeftBold"; + public const string ArrowUpRight = "ArrowUpRight"; + public const string ArrowUpRightBold = "ArrowUpRightBold"; + public const string ArrowUpThick = "ArrowUpThick"; + public const string ArrowUpThinCircleOutline = "ArrowUpThinCircleOutline"; + public const string ArrowURightBottom = "ArrowURightBottom"; + public const string ArrowURightBottomBold = "ArrowURightBottomBold"; + public const string ArrowURightTop = "ArrowURightTop"; + public const string ArrowURightTopBold = "ArrowURightTopBold"; + public const string ArrowUUpLeft = "ArrowUUpLeft"; + public const string ArrowUUpLeftBold = "ArrowUUpLeftBold"; + public const string ArrowUUpRight = "ArrowUUpRight"; + public const string ArrowUUpRightBold = "ArrowUUpRightBold"; + public const string ArrowVerticalLock = "ArrowVerticalLock"; + public const string Artstation = "Artstation"; + public const string AspectRatio = "AspectRatio"; + public const string Assistant = "Assistant"; + public const string Asterisk = "Asterisk"; + public const string At = "At"; + public const string Atlassian = "Atlassian"; + public const string Atm = "Atm"; + public const string Atom = "Atom"; + public const string AtomVariant = "AtomVariant"; + public const string Attachment = "Attachment"; + public const string AudioInputRca = "AudioInputRca"; + public const string AudioInputStereoMinijack = "AudioInputStereoMinijack"; + public const string AudioInputXlr = "AudioInputXlr"; + public const string AudioVideo = "AudioVideo"; + public const string AudioVideoOff = "AudioVideoOff"; + public const string AugmentedReality = "AugmentedReality"; + public const string AutoDownload = "AutoDownload"; + public const string AutoFix = "AutoFix"; + public const string Autorenew = "Autorenew"; + public const string AutoUpload = "AutoUpload"; + public const string AvTimer = "AvTimer"; + public const string Aws = "Aws"; + public const string Axe = "Axe"; + public const string AxeBattle = "AxeBattle"; + public const string Axis = "Axis"; + public const string AxisArrow = "AxisArrow"; + public const string AxisArrowInfo = "AxisArrowInfo"; + public const string AxisArrowLock = "AxisArrowLock"; + public const string AxisLock = "AxisLock"; + public const string AxisXArrow = "AxisXArrow"; + public const string AxisXArrowLock = "AxisXArrowLock"; + public const string AxisXRotateClockwise = "AxisXRotateClockwise"; + public const string AxisXRotateCounterclockwise = "AxisXRotateCounterclockwise"; + public const string AxisXYArrowLock = "AxisXYArrowLock"; + public const string AxisYArrow = "AxisYArrow"; + public const string AxisYArrowLock = "AxisYArrowLock"; + public const string AxisYRotateClockwise = "AxisYRotateClockwise"; + public const string AxisYRotateCounterclockwise = "AxisYRotateCounterclockwise"; + public const string AxisZArrow = "AxisZArrow"; + public const string AxisZArrowLock = "AxisZArrowLock"; + public const string AxisZRotateClockwise = "AxisZRotateClockwise"; + public const string AxisZRotateCounterclockwise = "AxisZRotateCounterclockwise"; + public const string Babel = "Babel"; + public const string Baby = "Baby"; + public const string BabyBottle = "BabyBottle"; + public const string BabyBottleOutline = "BabyBottleOutline"; + public const string BabyBuggy = "BabyBuggy"; + public const string BabyCarriage = "BabyCarriage"; + public const string BabyCarriageOff = "BabyCarriageOff"; + public const string BabyFace = "BabyFace"; + public const string BabyFaceOutline = "BabyFaceOutline"; + public const string Backburger = "Backburger"; + public const string Backspace = "Backspace"; + public const string BackspaceOutline = "BackspaceOutline"; + public const string BackspaceReverse = "BackspaceReverse"; + public const string BackspaceReverseOutline = "BackspaceReverseOutline"; + public const string BackupRestore = "BackupRestore"; + public const string Bacteria = "Bacteria"; + public const string BacteriaOutline = "BacteriaOutline"; + public const string BadgeAccount = "BadgeAccount"; + public const string BadgeAccountAlert = "BadgeAccountAlert"; + public const string BadgeAccountAlertOutline = "BadgeAccountAlertOutline"; + public const string BadgeAccountHorizontal = "BadgeAccountHorizontal"; + public const string BadgeAccountHorizontalOutline = "BadgeAccountHorizontalOutline"; + public const string BadgeAccountOutline = "BadgeAccountOutline"; + public const string Badminton = "Badminton"; + public const string BagCarryOn = "BagCarryOn"; + public const string BagCarryOnCheck = "BagCarryOnCheck"; + public const string BagCarryOnOff = "BagCarryOnOff"; + public const string BagChecked = "BagChecked"; + public const string BagPersonal = "BagPersonal"; + public const string BagPersonalOff = "BagPersonalOff"; + public const string BagPersonalOffOutline = "BagPersonalOffOutline"; + public const string BagPersonalOutline = "BagPersonalOutline"; + public const string BagSuitcase = "BagSuitcase"; + public const string BagSuitcaseOff = "BagSuitcaseOff"; + public const string BagSuitcaseOffOutline = "BagSuitcaseOffOutline"; + public const string BagSuitcaseOutline = "BagSuitcaseOutline"; + public const string Baguette = "Baguette"; + public const string Balcony = "Balcony"; + public const string Balloon = "Balloon"; + public const string Ballot = "Ballot"; + public const string BallotOutline = "BallotOutline"; + public const string BallotRecount = "BallotRecount"; + public const string BallotRecountOutline = "BallotRecountOutline"; + public const string Bandage = "Bandage"; + public const string Bank = "Bank"; + public const string BankCheck = "BankCheck"; + public const string BankMinus = "BankMinus"; + public const string BankOff = "BankOff"; + public const string BankOffOutline = "BankOffOutline"; + public const string BankOutline = "BankOutline"; + public const string BankPlus = "BankPlus"; + public const string BankRemove = "BankRemove"; + public const string BankTransfer = "BankTransfer"; + public const string BankTransferIn = "BankTransferIn"; + public const string BankTransferOut = "BankTransferOut"; + public const string Barcode = "Barcode"; + public const string BarcodeOff = "BarcodeOff"; + public const string BarcodeScan = "BarcodeScan"; + public const string Barley = "Barley"; + public const string BarleyOff = "BarleyOff"; + public const string Barn = "Barn"; + public const string Barrel = "Barrel"; + public const string Baseball = "Baseball"; + public const string BaseballBat = "BaseballBat"; + public const string BaseballDiamond = "BaseballDiamond"; + public const string BaseballDiamondOutline = "BaseballDiamondOutline"; + public const string Bash = "Bash"; + public const string Basket = "Basket"; + public const string Basketball = "Basketball"; + public const string BasketballHoop = "BasketballHoop"; + public const string BasketballHoopOutline = "BasketballHoopOutline"; + public const string BasketCheck = "BasketCheck"; + public const string BasketCheckOutline = "BasketCheckOutline"; + public const string BasketFill = "BasketFill"; + public const string BasketMinus = "BasketMinus"; + public const string BasketMinusOutline = "BasketMinusOutline"; + public const string BasketOff = "BasketOff"; + public const string BasketOffOutline = "BasketOffOutline"; + public const string BasketOutline = "BasketOutline"; + public const string BasketPlus = "BasketPlus"; + public const string BasketPlusOutline = "BasketPlusOutline"; + public const string BasketRemove = "BasketRemove"; + public const string BasketRemoveOutline = "BasketRemoveOutline"; + public const string BasketUnfill = "BasketUnfill"; + public const string Bat = "Bat"; + public const string Bathtub = "Bathtub"; + public const string BathtubOutline = "BathtubOutline"; + public const string Battery = "Battery"; + public const string Battery10 = "Battery10"; + public const string Battery10Bluetooth = "Battery10Bluetooth"; + public const string Battery20 = "Battery20"; + public const string Battery20Bluetooth = "Battery20Bluetooth"; + public const string Battery30 = "Battery30"; + public const string Battery30Bluetooth = "Battery30Bluetooth"; + public const string Battery40 = "Battery40"; + public const string Battery40Bluetooth = "Battery40Bluetooth"; + public const string Battery50 = "Battery50"; + public const string Battery50Bluetooth = "Battery50Bluetooth"; + public const string Battery60 = "Battery60"; + public const string Battery60Bluetooth = "Battery60Bluetooth"; + public const string Battery70 = "Battery70"; + public const string Battery70Bluetooth = "Battery70Bluetooth"; + public const string Battery80 = "Battery80"; + public const string Battery80Bluetooth = "Battery80Bluetooth"; + public const string Battery90 = "Battery90"; + public const string Battery90Bluetooth = "Battery90Bluetooth"; + public const string BatteryAlert = "BatteryAlert"; + public const string BatteryAlertBluetooth = "BatteryAlertBluetooth"; + public const string BatteryAlertVariant = "BatteryAlertVariant"; + public const string BatteryAlertVariantOutline = "BatteryAlertVariantOutline"; + public const string BatteryArrowDown = "BatteryArrowDown"; + public const string BatteryArrowDownOutline = "BatteryArrowDownOutline"; + public const string BatteryArrowUp = "BatteryArrowUp"; + public const string BatteryArrowUpOutline = "BatteryArrowUpOutline"; + public const string BatteryBluetooth = "BatteryBluetooth"; + public const string BatteryBluetoothVariant = "BatteryBluetoothVariant"; + public const string BatteryCharging = "BatteryCharging"; + public const string BatteryCharging10 = "BatteryCharging10"; + public const string BatteryCharging100 = "BatteryCharging100"; + public const string BatteryCharging20 = "BatteryCharging20"; + public const string BatteryCharging30 = "BatteryCharging30"; + public const string BatteryCharging40 = "BatteryCharging40"; + public const string BatteryCharging50 = "BatteryCharging50"; + public const string BatteryCharging60 = "BatteryCharging60"; + public const string BatteryCharging70 = "BatteryCharging70"; + public const string BatteryCharging80 = "BatteryCharging80"; + public const string BatteryCharging90 = "BatteryCharging90"; + public const string BatteryChargingHigh = "BatteryChargingHigh"; + public const string BatteryChargingLow = "BatteryChargingLow"; + public const string BatteryChargingMedium = "BatteryChargingMedium"; + public const string BatteryChargingOutline = "BatteryChargingOutline"; + public const string BatteryChargingWireless = "BatteryChargingWireless"; + public const string BatteryChargingWireless10 = "BatteryChargingWireless10"; + public const string BatteryChargingWireless20 = "BatteryChargingWireless20"; + public const string BatteryChargingWireless30 = "BatteryChargingWireless30"; + public const string BatteryChargingWireless40 = "BatteryChargingWireless40"; + public const string BatteryChargingWireless50 = "BatteryChargingWireless50"; + public const string BatteryChargingWireless60 = "BatteryChargingWireless60"; + public const string BatteryChargingWireless70 = "BatteryChargingWireless70"; + public const string BatteryChargingWireless80 = "BatteryChargingWireless80"; + public const string BatteryChargingWireless90 = "BatteryChargingWireless90"; + public const string BatteryChargingWirelessAlert = "BatteryChargingWirelessAlert"; + public const string BatteryChargingWirelessOutline = "BatteryChargingWirelessOutline"; + public const string BatteryCheck = "BatteryCheck"; + public const string BatteryCheckOutline = "BatteryCheckOutline"; + public const string BatteryHeart = "BatteryHeart"; + public const string BatteryHeartOutline = "BatteryHeartOutline"; + public const string BatteryHeartVariant = "BatteryHeartVariant"; + public const string BatteryHigh = "BatteryHigh"; + public const string BatteryLock = "BatteryLock"; + public const string BatteryLockOpen = "BatteryLockOpen"; + public const string BatteryLow = "BatteryLow"; + public const string BatteryMedium = "BatteryMedium"; + public const string BatteryMinus = "BatteryMinus"; + public const string BatteryMinusOutline = "BatteryMinusOutline"; + public const string BatteryMinusVariant = "BatteryMinusVariant"; + public const string BatteryNegative = "BatteryNegative"; + public const string BatteryOff = "BatteryOff"; + public const string BatteryOffOutline = "BatteryOffOutline"; + public const string BatteryOutline = "BatteryOutline"; + public const string BatteryPlus = "BatteryPlus"; + public const string BatteryPlusOutline = "BatteryPlusOutline"; + public const string BatteryPlusVariant = "BatteryPlusVariant"; + public const string BatteryPositive = "BatteryPositive"; + public const string BatteryRemove = "BatteryRemove"; + public const string BatteryRemoveOutline = "BatteryRemoveOutline"; + public const string BatterySync = "BatterySync"; + public const string BatterySyncOutline = "BatterySyncOutline"; + public const string BatteryUnknown = "BatteryUnknown"; + public const string BatteryUnknownBluetooth = "BatteryUnknownBluetooth"; + public const string Beach = "Beach"; + public const string Beaker = "Beaker"; + public const string BeakerAlert = "BeakerAlert"; + public const string BeakerAlertOutline = "BeakerAlertOutline"; + public const string BeakerCheck = "BeakerCheck"; + public const string BeakerCheckOutline = "BeakerCheckOutline"; + public const string BeakerMinus = "BeakerMinus"; + public const string BeakerMinusOutline = "BeakerMinusOutline"; + public const string BeakerOutline = "BeakerOutline"; + public const string BeakerPlus = "BeakerPlus"; + public const string BeakerPlusOutline = "BeakerPlusOutline"; + public const string BeakerQuestion = "BeakerQuestion"; + public const string BeakerQuestionOutline = "BeakerQuestionOutline"; + public const string BeakerRemove = "BeakerRemove"; + public const string BeakerRemoveOutline = "BeakerRemoveOutline"; + public const string Bed = "Bed"; + public const string BedDouble = "BedDouble"; + public const string BedDoubleOutline = "BedDoubleOutline"; + public const string BedEmpty = "BedEmpty"; + public const string BedKing = "BedKing"; + public const string BedKingOutline = "BedKingOutline"; + public const string BedOutline = "BedOutline"; + public const string BedQueen = "BedQueen"; + public const string BedQueenOutline = "BedQueenOutline"; + public const string BedSingle = "BedSingle"; + public const string BedSingleOutline = "BedSingleOutline"; + public const string Bee = "Bee"; + public const string BeeFlower = "BeeFlower"; + public const string BeehiveOffOutline = "BeehiveOffOutline"; + public const string BeehiveOutline = "BeehiveOutline"; + public const string Beekeeper = "Beekeeper"; + public const string Beer = "Beer"; + public const string BeerOutline = "BeerOutline"; + public const string Bell = "Bell"; + public const string BellAlert = "BellAlert"; + public const string BellAlertOutline = "BellAlertOutline"; + public const string BellBadge = "BellBadge"; + public const string BellBadgeOutline = "BellBadgeOutline"; + public const string BellCancel = "BellCancel"; + public const string BellCancelOutline = "BellCancelOutline"; + public const string BellCheck = "BellCheck"; + public const string BellCheckOutline = "BellCheckOutline"; + public const string BellCircle = "BellCircle"; + public const string BellCircleOutline = "BellCircleOutline"; + public const string BellMinus = "BellMinus"; + public const string BellMinusOutline = "BellMinusOutline"; + public const string BellOff = "BellOff"; + public const string BellOffOutline = "BellOffOutline"; + public const string BellOutline = "BellOutline"; + public const string BellPlus = "BellPlus"; + public const string BellPlusOutline = "BellPlusOutline"; + public const string BellRemove = "BellRemove"; + public const string BellRemoveOutline = "BellRemoveOutline"; + public const string BellRing = "BellRing"; + public const string BellRingOutline = "BellRingOutline"; + public const string BellSleep = "BellSleep"; + public const string BellSleepOutline = "BellSleepOutline"; + public const string Beta = "Beta"; + public const string Betamax = "Betamax"; + public const string Biathlon = "Biathlon"; + public const string Bicycle = "Bicycle"; + public const string BicycleBasket = "BicycleBasket"; + public const string BicycleCargo = "BicycleCargo"; + public const string BicycleElectric = "BicycleElectric"; + public const string BicyclePennyFarthing = "BicyclePennyFarthing"; + public const string Bike = "Bike"; + public const string BikeFast = "BikeFast"; + public const string Billboard = "Billboard"; + public const string Billiards = "Billiards"; + public const string BilliardsRack = "BilliardsRack"; + public const string Binoculars = "Binoculars"; + public const string Bio = "Bio"; + public const string Biohazard = "Biohazard"; + public const string Bird = "Bird"; + public const string Bitbucket = "Bitbucket"; + public const string Bitcoin = "Bitcoin"; + public const string BlackMesa = "BlackMesa"; + public const string Blender = "Blender"; + public const string BlenderOutline = "BlenderOutline"; + public const string BlenderSoftware = "BlenderSoftware"; + public const string Blinds = "Blinds"; + public const string BlindsOpen = "BlindsOpen"; + public const string BlockHelper = "BlockHelper"; + public const string BloodBag = "BloodBag"; + public const string Bluetooth = "Bluetooth"; + public const string BluetoothAudio = "BluetoothAudio"; + public const string BluetoothConnect = "BluetoothConnect"; + public const string BluetoothOff = "BluetoothOff"; + public const string BluetoothSettings = "BluetoothSettings"; + public const string BluetoothTransfer = "BluetoothTransfer"; + public const string Blur = "Blur"; + public const string BlurLinear = "BlurLinear"; + public const string BlurOff = "BlurOff"; + public const string BlurRadial = "BlurRadial"; + public const string Bolt = "Bolt"; + public const string Bomb = "Bomb"; + public const string BombOff = "BombOff"; + public const string Bone = "Bone"; + public const string Book = "Book"; + public const string BookAccount = "BookAccount"; + public const string BookAccountOutline = "BookAccountOutline"; + public const string BookAlert = "BookAlert"; + public const string BookAlertOutline = "BookAlertOutline"; + public const string BookAlphabet = "BookAlphabet"; + public const string BookArrowDown = "BookArrowDown"; + public const string BookArrowDownOutline = "BookArrowDownOutline"; + public const string BookArrowLeft = "BookArrowLeft"; + public const string BookArrowLeftOutline = "BookArrowLeftOutline"; + public const string BookArrowRight = "BookArrowRight"; + public const string BookArrowRightOutline = "BookArrowRightOutline"; + public const string BookArrowUp = "BookArrowUp"; + public const string BookArrowUpOutline = "BookArrowUpOutline"; + public const string BookCancel = "BookCancel"; + public const string BookCancelOutline = "BookCancelOutline"; + public const string BookCheck = "BookCheck"; + public const string BookCheckOutline = "BookCheckOutline"; + public const string BookClock = "BookClock"; + public const string BookClockOutline = "BookClockOutline"; + public const string BookCog = "BookCog"; + public const string BookCogOutline = "BookCogOutline"; + public const string BookCross = "BookCross"; + public const string BookEdit = "BookEdit"; + public const string BookEditOutline = "BookEditOutline"; + public const string BookEducation = "BookEducation"; + public const string BookEducationOutline = "BookEducationOutline"; + public const string BookInformationVariant = "BookInformationVariant"; + public const string BookLock = "BookLock"; + public const string BookLockOpen = "BookLockOpen"; + public const string BookLockOpenOutline = "BookLockOpenOutline"; + public const string BookLockOutline = "BookLockOutline"; + public const string Bookmark = "Bookmark"; + public const string BookmarkCheck = "BookmarkCheck"; + public const string BookmarkCheckOutline = "BookmarkCheckOutline"; + public const string BookMarker = "BookMarker"; + public const string BookMarkerOutline = "BookMarkerOutline"; + public const string BookmarkMinus = "BookmarkMinus"; + public const string BookmarkMinusOutline = "BookmarkMinusOutline"; + public const string BookmarkMultiple = "BookmarkMultiple"; + public const string BookmarkMultipleOutline = "BookmarkMultipleOutline"; + public const string BookmarkMusic = "BookmarkMusic"; + public const string BookmarkMusicOutline = "BookmarkMusicOutline"; + public const string BookmarkOff = "BookmarkOff"; + public const string BookmarkOffOutline = "BookmarkOffOutline"; + public const string BookmarkOutline = "BookmarkOutline"; + public const string BookmarkPlus = "BookmarkPlus"; + public const string BookmarkPlusOutline = "BookmarkPlusOutline"; + public const string BookmarkRemove = "BookmarkRemove"; + public const string BookmarkRemoveOutline = "BookmarkRemoveOutline"; + public const string BookMinus = "BookMinus"; + public const string BookMinusMultiple = "BookMinusMultiple"; + public const string BookMinusMultipleOutline = "BookMinusMultipleOutline"; + public const string BookMinusOutline = "BookMinusOutline"; + public const string BookMultiple = "BookMultiple"; + public const string BookMultipleOutline = "BookMultipleOutline"; + public const string BookMusic = "BookMusic"; + public const string BookMusicOutline = "BookMusicOutline"; + public const string BookOff = "BookOff"; + public const string BookOffOutline = "BookOffOutline"; + public const string BookOpen = "BookOpen"; + public const string BookOpenBlankVariant = "BookOpenBlankVariant"; + public const string BookOpenOutline = "BookOpenOutline"; + public const string BookOpenPageVariant = "BookOpenPageVariant"; + public const string BookOpenPageVariantOutline = "BookOpenPageVariantOutline"; + public const string BookOpenVariant = "BookOpenVariant"; + public const string BookOutline = "BookOutline"; + public const string BookPlay = "BookPlay"; + public const string BookPlayOutline = "BookPlayOutline"; + public const string BookPlus = "BookPlus"; + public const string BookPlusMultiple = "BookPlusMultiple"; + public const string BookPlusMultipleOutline = "BookPlusMultipleOutline"; + public const string BookPlusOutline = "BookPlusOutline"; + public const string BookRefresh = "BookRefresh"; + public const string BookRefreshOutline = "BookRefreshOutline"; + public const string BookRemove = "BookRemove"; + public const string BookRemoveMultiple = "BookRemoveMultiple"; + public const string BookRemoveMultipleOutline = "BookRemoveMultipleOutline"; + public const string BookRemoveOutline = "BookRemoveOutline"; + public const string BookSearch = "BookSearch"; + public const string BookSearchOutline = "BookSearchOutline"; + public const string BookSettings = "BookSettings"; + public const string BookSettingsOutline = "BookSettingsOutline"; + public const string Bookshelf = "Bookshelf"; + public const string BookSync = "BookSync"; + public const string BookSyncOutline = "BookSyncOutline"; + public const string BookVariant = "BookVariant"; + public const string BookVariantMultiple = "BookVariantMultiple"; + public const string Boombox = "Boombox"; + public const string Boomerang = "Boomerang"; + public const string BoomGate = "BoomGate"; + public const string BoomGateAlert = "BoomGateAlert"; + public const string BoomGateAlertOutline = "BoomGateAlertOutline"; + public const string BoomGateArrowDown = "BoomGateArrowDown"; + public const string BoomGateArrowDownOutline = "BoomGateArrowDownOutline"; + public const string BoomGateArrowUp = "BoomGateArrowUp"; + public const string BoomGateArrowUpOutline = "BoomGateArrowUpOutline"; + public const string BoomGateOutline = "BoomGateOutline"; + public const string BoomGateUp = "BoomGateUp"; + public const string BoomGateUpOutline = "BoomGateUpOutline"; + public const string Bootstrap = "Bootstrap"; + public const string BorderAll = "BorderAll"; + public const string BorderAllVariant = "BorderAllVariant"; + public const string BorderBottom = "BorderBottom"; + public const string BorderBottomVariant = "BorderBottomVariant"; + public const string BorderColor = "BorderColor"; + public const string BorderHorizontal = "BorderHorizontal"; + public const string BorderInside = "BorderInside"; + public const string BorderLeft = "BorderLeft"; + public const string BorderLeftVariant = "BorderLeftVariant"; + public const string BorderNone = "BorderNone"; + public const string BorderNoneVariant = "BorderNoneVariant"; + public const string BorderOutside = "BorderOutside"; + public const string BorderRight = "BorderRight"; + public const string BorderRightVariant = "BorderRightVariant"; + public const string BorderStyle = "BorderStyle"; + public const string BorderTop = "BorderTop"; + public const string BorderTopVariant = "BorderTopVariant"; + public const string BorderVertical = "BorderVertical"; + public const string BottleSoda = "BottleSoda"; + public const string BottleSodaClassic = "BottleSodaClassic"; + public const string BottleSodaClassicOutline = "BottleSodaClassicOutline"; + public const string BottleSodaOutline = "BottleSodaOutline"; + public const string BottleTonic = "BottleTonic"; + public const string BottleTonicOutline = "BottleTonicOutline"; + public const string BottleTonicPlus = "BottleTonicPlus"; + public const string BottleTonicPlusOutline = "BottleTonicPlusOutline"; + public const string BottleTonicSkull = "BottleTonicSkull"; + public const string BottleTonicSkullOutline = "BottleTonicSkullOutline"; + public const string BottleWine = "BottleWine"; + public const string BottleWineOutline = "BottleWineOutline"; + public const string BowArrow = "BowArrow"; + public const string Bowl = "Bowl"; + public const string Bowling = "Bowling"; + public const string BowlMix = "BowlMix"; + public const string BowlMixOutline = "BowlMixOutline"; + public const string BowlOutline = "BowlOutline"; + public const string BowTie = "BowTie"; + public const string Box = "Box"; + public const string BoxCutter = "BoxCutter"; + public const string BoxCutterOff = "BoxCutterOff"; + public const string BoxingGlove = "BoxingGlove"; + public const string BoxShadow = "BoxShadow"; + public const string Braille = "Braille"; + public const string Brain = "Brain"; + public const string BreadSlice = "BreadSlice"; + public const string BreadSliceOutline = "BreadSliceOutline"; + public const string Bridge = "Bridge"; + public const string Briefcase = "Briefcase"; + public const string BriefcaseAccount = "BriefcaseAccount"; + public const string BriefcaseAccountOutline = "BriefcaseAccountOutline"; + public const string BriefcaseCheck = "BriefcaseCheck"; + public const string BriefcaseCheckOutline = "BriefcaseCheckOutline"; + public const string BriefcaseClock = "BriefcaseClock"; + public const string BriefcaseClockOutline = "BriefcaseClockOutline"; + public const string BriefcaseDownload = "BriefcaseDownload"; + public const string BriefcaseDownloadOutline = "BriefcaseDownloadOutline"; + public const string BriefcaseEdit = "BriefcaseEdit"; + public const string BriefcaseEditOutline = "BriefcaseEditOutline"; + public const string BriefcaseEye = "BriefcaseEye"; + public const string BriefcaseEyeOutline = "BriefcaseEyeOutline"; + public const string BriefcaseMinus = "BriefcaseMinus"; + public const string BriefcaseMinusOutline = "BriefcaseMinusOutline"; + public const string BriefcaseOff = "BriefcaseOff"; + public const string BriefcaseOffOutline = "BriefcaseOffOutline"; + public const string BriefcaseOutline = "BriefcaseOutline"; + public const string BriefcasePlus = "BriefcasePlus"; + public const string BriefcasePlusOutline = "BriefcasePlusOutline"; + public const string BriefcaseRemove = "BriefcaseRemove"; + public const string BriefcaseRemoveOutline = "BriefcaseRemoveOutline"; + public const string BriefcaseSearch = "BriefcaseSearch"; + public const string BriefcaseSearchOutline = "BriefcaseSearchOutline"; + public const string BriefcaseUpload = "BriefcaseUpload"; + public const string BriefcaseUploadOutline = "BriefcaseUploadOutline"; + public const string BriefcaseVariant = "BriefcaseVariant"; + public const string BriefcaseVariantOff = "BriefcaseVariantOff"; + public const string BriefcaseVariantOffOutline = "BriefcaseVariantOffOutline"; + public const string BriefcaseVariantOutline = "BriefcaseVariantOutline"; + public const string Brightness1 = "Brightness1"; + public const string Brightness2 = "Brightness2"; + public const string Brightness3 = "Brightness3"; + public const string Brightness4 = "Brightness4"; + public const string Brightness5 = "Brightness5"; + public const string Brightness6 = "Brightness6"; + public const string Brightness7 = "Brightness7"; + public const string BrightnessAuto = "BrightnessAuto"; + public const string BrightnessPercent = "BrightnessPercent"; + public const string Broadcast = "Broadcast"; + public const string BroadcastOff = "BroadcastOff"; + public const string Broom = "Broom"; + public const string Brush = "Brush"; + public const string BrushOff = "BrushOff"; + public const string BrushVariant = "BrushVariant"; + public const string Bucket = "Bucket"; + public const string BucketOutline = "BucketOutline"; + public const string Buffet = "Buffet"; + public const string Bug = "Bug"; + public const string BugCheck = "BugCheck"; + public const string BugCheckOutline = "BugCheckOutline"; + public const string Bugle = "Bugle"; + public const string BugOutline = "BugOutline"; + public const string Bulldozer = "Bulldozer"; + public const string Bullet = "Bullet"; + public const string BulletinBoard = "BulletinBoard"; + public const string Bullhorn = "Bullhorn"; + public const string BullhornOutline = "BullhornOutline"; + public const string Bullseye = "Bullseye"; + public const string BullseyeArrow = "BullseyeArrow"; + public const string Bulma = "Bulma"; + public const string BunkBed = "BunkBed"; + public const string BunkBedOutline = "BunkBedOutline"; + public const string Bus = "Bus"; + public const string BusAlert = "BusAlert"; + public const string BusArticulatedEnd = "BusArticulatedEnd"; + public const string BusArticulatedFront = "BusArticulatedFront"; + public const string BusClock = "BusClock"; + public const string BusDoubleDecker = "BusDoubleDecker"; + public const string BusMarker = "BusMarker"; + public const string BusMultiple = "BusMultiple"; + public const string BusSchool = "BusSchool"; + public const string BusSide = "BusSide"; + public const string BusStop = "BusStop"; + public const string BusStopCovered = "BusStopCovered"; + public const string BusStopUncovered = "BusStopUncovered"; + public const string Butterfly = "Butterfly"; + public const string ButterflyOutline = "ButterflyOutline"; + public const string CabinAFrame = "CabinAFrame"; + public const string CableData = "CableData"; + public const string Cached = "Cached"; + public const string Cactus = "Cactus"; + public const string Cake = "Cake"; + public const string CakeLayered = "CakeLayered"; + public const string CakeVariant = "CakeVariant"; + public const string CakeVariantOutline = "CakeVariantOutline"; + public const string Calculator = "Calculator"; + public const string CalculatorVariant = "CalculatorVariant"; + public const string CalculatorVariantOutline = "CalculatorVariantOutline"; + public const string Calendar = "Calendar"; + public const string CalendarAccount = "CalendarAccount"; + public const string CalendarAccountOutline = "CalendarAccountOutline"; + public const string CalendarAlert = "CalendarAlert"; + public const string CalendarArrowLeft = "CalendarArrowLeft"; + public const string CalendarArrowRight = "CalendarArrowRight"; + public const string CalendarBlank = "CalendarBlank"; + public const string CalendarBlankMultiple = "CalendarBlankMultiple"; + public const string CalendarBlankOutline = "CalendarBlankOutline"; + public const string CalendarCheck = "CalendarCheck"; + public const string CalendarCheckOutline = "CalendarCheckOutline"; + public const string CalendarClock = "CalendarClock"; + public const string CalendarClockOutline = "CalendarClockOutline"; + public const string CalendarCollapseHorizontal = "CalendarCollapseHorizontal"; + public const string CalendarCursor = "CalendarCursor"; + public const string CalendarEdit = "CalendarEdit"; + public const string CalendarEnd = "CalendarEnd"; + public const string CalendarExpandHorizontal = "CalendarExpandHorizontal"; + public const string CalendarExport = "CalendarExport"; + public const string CalendarHeart = "CalendarHeart"; + public const string CalendarImport = "CalendarImport"; + public const string CalendarLock = "CalendarLock"; + public const string CalendarLockOutline = "CalendarLockOutline"; + public const string CalendarMinus = "CalendarMinus"; + public const string CalendarMonth = "CalendarMonth"; + public const string CalendarMonthOutline = "CalendarMonthOutline"; + public const string CalendarMultiple = "CalendarMultiple"; + public const string CalendarMultipleCheck = "CalendarMultipleCheck"; + public const string CalendarMultiselect = "CalendarMultiselect"; + public const string CalendarOutline = "CalendarOutline"; + public const string CalendarPlus = "CalendarPlus"; + public const string CalendarQuestion = "CalendarQuestion"; + public const string CalendarRange = "CalendarRange"; + public const string CalendarRangeOutline = "CalendarRangeOutline"; + public const string CalendarRefresh = "CalendarRefresh"; + public const string CalendarRefreshOutline = "CalendarRefreshOutline"; + public const string CalendarRemove = "CalendarRemove"; + public const string CalendarRemoveOutline = "CalendarRemoveOutline"; + public const string CalendarSearch = "CalendarSearch"; + public const string CalendarStar = "CalendarStar"; + public const string CalendarStart = "CalendarStart"; + public const string CalendarSync = "CalendarSync"; + public const string CalendarSyncOutline = "CalendarSyncOutline"; + public const string CalendarText = "CalendarText"; + public const string CalendarTextOutline = "CalendarTextOutline"; + public const string CalendarToday = "CalendarToday"; + public const string CalendarWeek = "CalendarWeek"; + public const string CalendarWeekBegin = "CalendarWeekBegin"; + public const string CalendarWeekend = "CalendarWeekend"; + public const string CalendarWeekendOutline = "CalendarWeekendOutline"; + public const string CallMade = "CallMade"; + public const string CallMerge = "CallMerge"; + public const string CallMissed = "CallMissed"; + public const string CallReceived = "CallReceived"; + public const string CallSplit = "CallSplit"; + public const string Camcorder = "Camcorder"; + public const string CamcorderOff = "CamcorderOff"; + public const string Camera = "Camera"; + public const string CameraAccount = "CameraAccount"; + public const string CameraBurst = "CameraBurst"; + public const string CameraControl = "CameraControl"; + public const string CameraDocument = "CameraDocument"; + public const string CameraDocumentOff = "CameraDocumentOff"; + public const string CameraEnhance = "CameraEnhance"; + public const string CameraEnhanceOutline = "CameraEnhanceOutline"; + public const string CameraFlip = "CameraFlip"; + public const string CameraFlipOutline = "CameraFlipOutline"; + public const string CameraFront = "CameraFront"; + public const string CameraFrontVariant = "CameraFrontVariant"; + public const string CameraGopro = "CameraGopro"; + public const string CameraImage = "CameraImage"; + public const string CameraIris = "CameraIris"; + public const string CameraMeteringCenter = "CameraMeteringCenter"; + public const string CameraMeteringMatrix = "CameraMeteringMatrix"; + public const string CameraMeteringPartial = "CameraMeteringPartial"; + public const string CameraMeteringSpot = "CameraMeteringSpot"; + public const string CameraOff = "CameraOff"; + public const string CameraOutline = "CameraOutline"; + public const string CameraPartyMode = "CameraPartyMode"; + public const string CameraPlus = "CameraPlus"; + public const string CameraPlusOutline = "CameraPlusOutline"; + public const string CameraRear = "CameraRear"; + public const string CameraRearVariant = "CameraRearVariant"; + public const string CameraRetake = "CameraRetake"; + public const string CameraRetakeOutline = "CameraRetakeOutline"; + public const string CameraSwitch = "CameraSwitch"; + public const string CameraSwitchOutline = "CameraSwitchOutline"; + public const string CameraTimer = "CameraTimer"; + public const string CameraWireless = "CameraWireless"; + public const string CameraWirelessOutline = "CameraWirelessOutline"; + public const string Campfire = "Campfire"; + public const string Cancel = "Cancel"; + public const string Candelabra = "Candelabra"; + public const string CandelabraFire = "CandelabraFire"; + public const string Candle = "Candle"; + public const string Candycane = "Candycane"; + public const string Cannabis = "Cannabis"; + public const string CannabisOff = "CannabisOff"; + public const string CapsLock = "CapsLock"; + public const string Car = "Car"; + public const string Car2Plus = "Car2Plus"; + public const string Car3Plus = "Car3Plus"; + public const string Carabiner = "Carabiner"; + public const string CarArrowLeft = "CarArrowLeft"; + public const string CarArrowRight = "CarArrowRight"; + public const string Caravan = "Caravan"; + public const string CarBack = "CarBack"; + public const string CarBattery = "CarBattery"; + public const string CarBrakeAbs = "CarBrakeAbs"; + public const string CarBrakeAlert = "CarBrakeAlert"; + public const string CarBrakeHold = "CarBrakeHold"; + public const string CarBrakeParking = "CarBrakeParking"; + public const string CarBrakeRetarder = "CarBrakeRetarder"; + public const string CarChildSeat = "CarChildSeat"; + public const string CarClutch = "CarClutch"; + public const string CarCog = "CarCog"; + public const string CarConnected = "CarConnected"; + public const string CarConvertible = "CarConvertible"; + public const string CarCoolantLevel = "CarCoolantLevel"; + public const string CarCruiseControl = "CarCruiseControl"; + public const string Card = "Card"; + public const string CardAccountDetails = "CardAccountDetails"; + public const string CardAccountDetailsOutline = "CardAccountDetailsOutline"; + public const string CardAccountDetailsStar = "CardAccountDetailsStar"; + public const string CardAccountDetailsStarOutline = "CardAccountDetailsStarOutline"; + public const string CardAccountMail = "CardAccountMail"; + public const string CardAccountMailOutline = "CardAccountMailOutline"; + public const string CardAccountPhone = "CardAccountPhone"; + public const string CardAccountPhoneOutline = "CardAccountPhoneOutline"; + public const string CardBulleted = "CardBulleted"; + public const string CardBulletedOff = "CardBulletedOff"; + public const string CardBulletedOffOutline = "CardBulletedOffOutline"; + public const string CardBulletedOutline = "CardBulletedOutline"; + public const string CardBulletedSettings = "CardBulletedSettings"; + public const string CardBulletedSettingsOutline = "CardBulletedSettingsOutline"; + public const string CarDefrostFront = "CarDefrostFront"; + public const string CarDefrostRear = "CarDefrostRear"; + public const string CardMinus = "CardMinus"; + public const string CardMinusOutline = "CardMinusOutline"; + public const string CardMultiple = "CardMultiple"; + public const string CardMultipleOutline = "CardMultipleOutline"; + public const string CardOff = "CardOff"; + public const string CardOffOutline = "CardOffOutline"; + public const string CarDoor = "CarDoor"; + public const string CarDoorLock = "CarDoorLock"; + public const string CardOutline = "CardOutline"; + public const string CardPlus = "CardPlus"; + public const string CardPlusOutline = "CardPlusOutline"; + public const string CardRemove = "CardRemove"; + public const string CardRemoveOutline = "CardRemoveOutline"; + public const string Cards = "Cards"; + public const string CardsClub = "CardsClub"; + public const string CardsClubOutline = "CardsClubOutline"; + public const string CardsDiamond = "CardsDiamond"; + public const string CardsDiamondOutline = "CardsDiamondOutline"; + public const string CardSearch = "CardSearch"; + public const string CardSearchOutline = "CardSearchOutline"; + public const string CardsHeart = "CardsHeart"; + public const string CardsHeartOutline = "CardsHeartOutline"; + public const string CardsOutline = "CardsOutline"; + public const string CardsPlaying = "CardsPlaying"; + public const string CardsPlayingClub = "CardsPlayingClub"; + public const string CardsPlayingClubMultiple = "CardsPlayingClubMultiple"; + public const string CardsPlayingClubMultipleOutline = "CardsPlayingClubMultipleOutline"; + public const string CardsPlayingClubOutline = "CardsPlayingClubOutline"; + public const string CardsPlayingDiamond = "CardsPlayingDiamond"; + public const string CardsPlayingDiamondMultiple = "CardsPlayingDiamondMultiple"; + public const string CardsPlayingDiamondMultipleOutline = "CardsPlayingDiamondMultipleOutline"; + public const string CardsPlayingDiamondOutline = "CardsPlayingDiamondOutline"; + public const string CardsPlayingHeart = "CardsPlayingHeart"; + public const string CardsPlayingHeartMultiple = "CardsPlayingHeartMultiple"; + public const string CardsPlayingHeartMultipleOutline = "CardsPlayingHeartMultipleOutline"; + public const string CardsPlayingHeartOutline = "CardsPlayingHeartOutline"; + public const string CardsPlayingOutline = "CardsPlayingOutline"; + public const string CardsPlayingSpade = "CardsPlayingSpade"; + public const string CardsPlayingSpadeMultiple = "CardsPlayingSpadeMultiple"; + public const string CardsPlayingSpadeMultipleOutline = "CardsPlayingSpadeMultipleOutline"; + public const string CardsPlayingSpadeOutline = "CardsPlayingSpadeOutline"; + public const string CardsSpade = "CardsSpade"; + public const string CardsSpadeOutline = "CardsSpadeOutline"; + public const string CardsVariant = "CardsVariant"; + public const string CardText = "CardText"; + public const string CardTextOutline = "CardTextOutline"; + public const string CarElectric = "CarElectric"; + public const string CarElectricOutline = "CarElectricOutline"; + public const string CarEmergency = "CarEmergency"; + public const string CarEsp = "CarEsp"; + public const string CarEstate = "CarEstate"; + public const string CarHatchback = "CarHatchback"; + public const string CarInfo = "CarInfo"; + public const string CarKey = "CarKey"; + public const string CarLiftedPickup = "CarLiftedPickup"; + public const string CarLightDimmed = "CarLightDimmed"; + public const string CarLightFog = "CarLightFog"; + public const string CarLightHigh = "CarLightHigh"; + public const string CarLimousine = "CarLimousine"; + public const string CarMultiple = "CarMultiple"; + public const string CarOff = "CarOff"; + public const string CarOutline = "CarOutline"; + public const string CarParkingLights = "CarParkingLights"; + public const string CarPickup = "CarPickup"; + public const string Carrot = "Carrot"; + public const string CarSeat = "CarSeat"; + public const string CarSeatCooler = "CarSeatCooler"; + public const string CarSeatHeater = "CarSeatHeater"; + public const string CarSelect = "CarSelect"; + public const string CarSettings = "CarSettings"; + public const string CarShiftPattern = "CarShiftPattern"; + public const string CarSide = "CarSide"; + public const string CarSports = "CarSports"; + public const string Cart = "Cart"; + public const string CartArrowDown = "CartArrowDown"; + public const string CartArrowRight = "CartArrowRight"; + public const string CartArrowUp = "CartArrowUp"; + public const string CartCheck = "CartCheck"; + public const string CartHeart = "CartHeart"; + public const string CarTireAlert = "CarTireAlert"; + public const string CartMinus = "CartMinus"; + public const string CartOff = "CartOff"; + public const string CartOutline = "CartOutline"; + public const string CartPlus = "CartPlus"; + public const string CarTractionControl = "CarTractionControl"; + public const string CartRemove = "CartRemove"; + public const string CarTurbocharger = "CarTurbocharger"; + public const string CartVariant = "CartVariant"; + public const string CarWash = "CarWash"; + public const string CarWindshield = "CarWindshield"; + public const string CarWindshieldOutline = "CarWindshieldOutline"; + public const string CarWireless = "CarWireless"; + public const string CarWrench = "CarWrench"; + public const string CaseSensitiveAlt = "CaseSensitiveAlt"; + public const string Cash = "Cash"; + public const string Cash100 = "Cash100"; + public const string CashCheck = "CashCheck"; + public const string CashFast = "CashFast"; + public const string CashLock = "CashLock"; + public const string CashLockOpen = "CashLockOpen"; + public const string CashMarker = "CashMarker"; + public const string CashMinus = "CashMinus"; + public const string CashMultiple = "CashMultiple"; + public const string CashPlus = "CashPlus"; + public const string CashRefund = "CashRefund"; + public const string CashRegister = "CashRegister"; + public const string CashRemove = "CashRemove"; + public const string Cassette = "Cassette"; + public const string Cast = "Cast"; + public const string CastAudio = "CastAudio"; + public const string CastAudioVariant = "CastAudioVariant"; + public const string CastConnected = "CastConnected"; + public const string CastEducation = "CastEducation"; + public const string Castle = "Castle"; + public const string CastOff = "CastOff"; + public const string CastVariant = "CastVariant"; + public const string Cat = "Cat"; + public const string Cctv = "Cctv"; + public const string CctvOff = "CctvOff"; + public const string CeilingFan = "CeilingFan"; + public const string CeilingFanLight = "CeilingFanLight"; + public const string CeilingLight = "CeilingLight"; + public const string CeilingLightMultiple = "CeilingLightMultiple"; + public const string CeilingLightMultipleOutline = "CeilingLightMultipleOutline"; + public const string CeilingLightOutline = "CeilingLightOutline"; + public const string Cellphone = "Cellphone"; + public const string CellphoneArrowDown = "CellphoneArrowDown"; + public const string CellphoneBasic = "CellphoneBasic"; + public const string CellphoneCharging = "CellphoneCharging"; + public const string CellphoneCheck = "CellphoneCheck"; + public const string CellphoneCog = "CellphoneCog"; + public const string CellphoneDock = "CellphoneDock"; + public const string CellphoneInformation = "CellphoneInformation"; + public const string CellphoneKey = "CellphoneKey"; + public const string CellphoneLink = "CellphoneLink"; + public const string CellphoneLinkOff = "CellphoneLinkOff"; + public const string CellphoneLock = "CellphoneLock"; + public const string CellphoneMarker = "CellphoneMarker"; + public const string CellphoneMessage = "CellphoneMessage"; + public const string CellphoneMessageOff = "CellphoneMessageOff"; + public const string CellphoneNfc = "CellphoneNfc"; + public const string CellphoneNfcOff = "CellphoneNfcOff"; + public const string CellphoneOff = "CellphoneOff"; + public const string CellphonePlay = "CellphonePlay"; + public const string CellphoneRemove = "CellphoneRemove"; + public const string CellphoneScreenshot = "CellphoneScreenshot"; + public const string CellphoneSettings = "CellphoneSettings"; + public const string CellphoneSound = "CellphoneSound"; + public const string CellphoneText = "CellphoneText"; + public const string CellphoneWireless = "CellphoneWireless"; + public const string Centos = "Centos"; + public const string Certificate = "Certificate"; + public const string CertificateOutline = "CertificateOutline"; + public const string ChairRolling = "ChairRolling"; + public const string ChairSchool = "ChairSchool"; + public const string Chandelier = "Chandelier"; + public const string Charity = "Charity"; + public const string ChartArc = "ChartArc"; + public const string ChartAreaspline = "ChartAreaspline"; + public const string ChartAreasplineVariant = "ChartAreasplineVariant"; + public const string ChartBar = "ChartBar"; + public const string ChartBarStacked = "ChartBarStacked"; + public const string ChartBellCurve = "ChartBellCurve"; + public const string ChartBellCurveCumulative = "ChartBellCurveCumulative"; + public const string ChartBox = "ChartBox"; + public const string ChartBoxOutline = "ChartBoxOutline"; + public const string ChartBoxPlusOutline = "ChartBoxPlusOutline"; + public const string ChartBubble = "ChartBubble"; + public const string ChartDonut = "ChartDonut"; + public const string ChartDonutVariant = "ChartDonutVariant"; + public const string ChartGantt = "ChartGantt"; + public const string ChartHistogram = "ChartHistogram"; + public const string ChartLine = "ChartLine"; + public const string ChartLineStacked = "ChartLineStacked"; + public const string ChartLineVariant = "ChartLineVariant"; + public const string ChartMultiline = "ChartMultiline"; + public const string ChartMultiple = "ChartMultiple"; + public const string ChartPie = "ChartPie"; + public const string ChartPpf = "ChartPpf"; + public const string ChartSankey = "ChartSankey"; + public const string ChartSankeyVariant = "ChartSankeyVariant"; + public const string ChartScatterPlot = "ChartScatterPlot"; + public const string ChartScatterPlotHexbin = "ChartScatterPlotHexbin"; + public const string ChartTimeline = "ChartTimeline"; + public const string ChartTimelineVariant = "ChartTimelineVariant"; + public const string ChartTimelineVariantShimmer = "ChartTimelineVariantShimmer"; + public const string ChartTree = "ChartTree"; + public const string Chat = "Chat"; + public const string ChatAlert = "ChatAlert"; + public const string ChatAlertOutline = "ChatAlertOutline"; + public const string ChatMinus = "ChatMinus"; + public const string ChatMinusOutline = "ChatMinusOutline"; + public const string ChatOutline = "ChatOutline"; + public const string ChatPlus = "ChatPlus"; + public const string ChatPlusOutline = "ChatPlusOutline"; + public const string ChatProcessing = "ChatProcessing"; + public const string ChatProcessingOutline = "ChatProcessingOutline"; + public const string ChatQuestion = "ChatQuestion"; + public const string ChatQuestionOutline = "ChatQuestionOutline"; + public const string ChatRemove = "ChatRemove"; + public const string ChatRemoveOutline = "ChatRemoveOutline"; + public const string ChatSleep = "ChatSleep"; + public const string ChatSleepOutline = "ChatSleepOutline"; + public const string Check = "Check"; + public const string CheckAll = "CheckAll"; + public const string CheckBold = "CheckBold"; + public const string Checkbook = "Checkbook"; + public const string CheckboxBlank = "CheckboxBlank"; + public const string CheckboxBlankBadge = "CheckboxBlankBadge"; + public const string CheckboxBlankBadgeOutline = "CheckboxBlankBadgeOutline"; + public const string CheckboxBlankCircle = "CheckboxBlankCircle"; + public const string CheckboxBlankCircleOutline = "CheckboxBlankCircleOutline"; + public const string CheckboxBlankOff = "CheckboxBlankOff"; + public const string CheckboxBlankOffOutline = "CheckboxBlankOffOutline"; + public const string CheckboxBlankOutline = "CheckboxBlankOutline"; + public const string CheckboxIntermediate = "CheckboxIntermediate"; + public const string CheckboxMarked = "CheckboxMarked"; + public const string CheckboxMarkedCircle = "CheckboxMarkedCircle"; + public const string CheckboxMarkedCircleOutline = "CheckboxMarkedCircleOutline"; + public const string CheckboxMarkedOutline = "CheckboxMarkedOutline"; + public const string CheckboxMultipleBlank = "CheckboxMultipleBlank"; + public const string CheckboxMultipleBlankCircle = "CheckboxMultipleBlankCircle"; + public const string CheckboxMultipleBlankCircleOutline = "CheckboxMultipleBlankCircleOutline"; + public const string CheckboxMultipleBlankOutline = "CheckboxMultipleBlankOutline"; + public const string CheckboxMultipleMarked = "CheckboxMultipleMarked"; + public const string CheckboxMultipleMarkedCircle = "CheckboxMultipleMarkedCircle"; + public const string CheckboxMultipleMarkedCircleOutline = "CheckboxMultipleMarkedCircleOutline"; + public const string CheckboxMultipleMarkedOutline = "CheckboxMultipleMarkedOutline"; + public const string CheckboxMultipleOutline = "CheckboxMultipleOutline"; + public const string CheckboxOutline = "CheckboxOutline"; + public const string CheckCircle = "CheckCircle"; + public const string CheckCircleOutline = "CheckCircleOutline"; + public const string CheckDecagram = "CheckDecagram"; + public const string CheckDecagramOutline = "CheckDecagramOutline"; + public const string Checkerboard = "Checkerboard"; + public const string CheckerboardMinus = "CheckerboardMinus"; + public const string CheckerboardPlus = "CheckerboardPlus"; + public const string CheckerboardRemove = "CheckerboardRemove"; + public const string CheckNetwork = "CheckNetwork"; + public const string CheckNetworkOutline = "CheckNetworkOutline"; + public const string CheckOutline = "CheckOutline"; + public const string CheckUnderline = "CheckUnderline"; + public const string CheckUnderlineCircle = "CheckUnderlineCircle"; + public const string CheckUnderlineCircleOutline = "CheckUnderlineCircleOutline"; + public const string Cheese = "Cheese"; + public const string CheeseOff = "CheeseOff"; + public const string ChefHat = "ChefHat"; + public const string ChemicalWeapon = "ChemicalWeapon"; + public const string ChessBishop = "ChessBishop"; + public const string ChessKing = "ChessKing"; + public const string ChessKnight = "ChessKnight"; + public const string ChessPawn = "ChessPawn"; + public const string ChessQueen = "ChessQueen"; + public const string ChessRook = "ChessRook"; + public const string ChevronDoubleDown = "ChevronDoubleDown"; + public const string ChevronDoubleLeft = "ChevronDoubleLeft"; + public const string ChevronDoubleRight = "ChevronDoubleRight"; + public const string ChevronDoubleUp = "ChevronDoubleUp"; + public const string ChevronDown = "ChevronDown"; + public const string ChevronDownBox = "ChevronDownBox"; + public const string ChevronDownBoxOutline = "ChevronDownBoxOutline"; + public const string ChevronDownCircle = "ChevronDownCircle"; + public const string ChevronDownCircleOutline = "ChevronDownCircleOutline"; + public const string ChevronLeft = "ChevronLeft"; + public const string ChevronLeftBox = "ChevronLeftBox"; + public const string ChevronLeftBoxOutline = "ChevronLeftBoxOutline"; + public const string ChevronLeftCircle = "ChevronLeftCircle"; + public const string ChevronLeftCircleOutline = "ChevronLeftCircleOutline"; + public const string ChevronRight = "ChevronRight"; + public const string ChevronRightBox = "ChevronRightBox"; + public const string ChevronRightBoxOutline = "ChevronRightBoxOutline"; + public const string ChevronRightCircle = "ChevronRightCircle"; + public const string ChevronRightCircleOutline = "ChevronRightCircleOutline"; + public const string ChevronTripleDown = "ChevronTripleDown"; + public const string ChevronTripleLeft = "ChevronTripleLeft"; + public const string ChevronTripleRight = "ChevronTripleRight"; + public const string ChevronTripleUp = "ChevronTripleUp"; + public const string ChevronUp = "ChevronUp"; + public const string ChevronUpBox = "ChevronUpBox"; + public const string ChevronUpBoxOutline = "ChevronUpBoxOutline"; + public const string ChevronUpCircle = "ChevronUpCircle"; + public const string ChevronUpCircleOutline = "ChevronUpCircleOutline"; + public const string ChiliAlert = "ChiliAlert"; + public const string ChiliAlertOutline = "ChiliAlertOutline"; + public const string ChiliHot = "ChiliHot"; + public const string ChiliHotOutline = "ChiliHotOutline"; + public const string ChiliMedium = "ChiliMedium"; + public const string ChiliMediumOutline = "ChiliMediumOutline"; + public const string ChiliMild = "ChiliMild"; + public const string ChiliMildOutline = "ChiliMildOutline"; + public const string ChiliOff = "ChiliOff"; + public const string ChiliOffOutline = "ChiliOffOutline"; + public const string Chip = "Chip"; + public const string Church = "Church"; + public const string Cigar = "Cigar"; + public const string CigarOff = "CigarOff"; + public const string Circle = "Circle"; + public const string CircleBox = "CircleBox"; + public const string CircleBoxOutline = "CircleBoxOutline"; + public const string CircleDouble = "CircleDouble"; + public const string CircleEditOutline = "CircleEditOutline"; + public const string CircleExpand = "CircleExpand"; + public const string CircleHalf = "CircleHalf"; + public const string CircleHalfFull = "CircleHalfFull"; + public const string CircleMedium = "CircleMedium"; + public const string CircleMultiple = "CircleMultiple"; + public const string CircleMultipleOutline = "CircleMultipleOutline"; + public const string CircleOffOutline = "CircleOffOutline"; + public const string CircleOpacity = "CircleOpacity"; + public const string CircleOutline = "CircleOutline"; + public const string CircleSlice1 = "CircleSlice1"; + public const string CircleSlice2 = "CircleSlice2"; + public const string CircleSlice3 = "CircleSlice3"; + public const string CircleSlice4 = "CircleSlice4"; + public const string CircleSlice5 = "CircleSlice5"; + public const string CircleSlice6 = "CircleSlice6"; + public const string CircleSlice7 = "CircleSlice7"; + public const string CircleSlice8 = "CircleSlice8"; + public const string CircleSmall = "CircleSmall"; + public const string CircularSaw = "CircularSaw"; + public const string City = "City"; + public const string CityVariant = "CityVariant"; + public const string CityVariantOutline = "CityVariantOutline"; + public const string Clipboard = "Clipboard"; + public const string ClipboardAccount = "ClipboardAccount"; + public const string ClipboardAccountOutline = "ClipboardAccountOutline"; + public const string ClipboardAlert = "ClipboardAlert"; + public const string ClipboardAlertOutline = "ClipboardAlertOutline"; + public const string ClipboardArrowDown = "ClipboardArrowDown"; + public const string ClipboardArrowDownOutline = "ClipboardArrowDownOutline"; + public const string ClipboardArrowLeft = "ClipboardArrowLeft"; + public const string ClipboardArrowLeftOutline = "ClipboardArrowLeftOutline"; + public const string ClipboardArrowRight = "ClipboardArrowRight"; + public const string ClipboardArrowRightOutline = "ClipboardArrowRightOutline"; + public const string ClipboardArrowUp = "ClipboardArrowUp"; + public const string ClipboardArrowUpOutline = "ClipboardArrowUpOutline"; + public const string ClipboardCheck = "ClipboardCheck"; + public const string ClipboardCheckMultiple = "ClipboardCheckMultiple"; + public const string ClipboardCheckMultipleOutline = "ClipboardCheckMultipleOutline"; + public const string ClipboardCheckOutline = "ClipboardCheckOutline"; + public const string ClipboardClock = "ClipboardClock"; + public const string ClipboardClockOutline = "ClipboardClockOutline"; + public const string ClipboardEdit = "ClipboardEdit"; + public const string ClipboardEditOutline = "ClipboardEditOutline"; + public const string ClipboardFile = "ClipboardFile"; + public const string ClipboardFileOutline = "ClipboardFileOutline"; + public const string ClipboardFlow = "ClipboardFlow"; + public const string ClipboardFlowOutline = "ClipboardFlowOutline"; + public const string ClipboardList = "ClipboardList"; + public const string ClipboardListOutline = "ClipboardListOutline"; + public const string ClipboardMinus = "ClipboardMinus"; + public const string ClipboardMinusOutline = "ClipboardMinusOutline"; + public const string ClipboardMultiple = "ClipboardMultiple"; + public const string ClipboardMultipleOutline = "ClipboardMultipleOutline"; + public const string ClipboardOff = "ClipboardOff"; + public const string ClipboardOffOutline = "ClipboardOffOutline"; + public const string ClipboardOutline = "ClipboardOutline"; + public const string ClipboardPlay = "ClipboardPlay"; + public const string ClipboardPlayMultiple = "ClipboardPlayMultiple"; + public const string ClipboardPlayMultipleOutline = "ClipboardPlayMultipleOutline"; + public const string ClipboardPlayOutline = "ClipboardPlayOutline"; + public const string ClipboardPlus = "ClipboardPlus"; + public const string ClipboardPlusOutline = "ClipboardPlusOutline"; + public const string ClipboardPulse = "ClipboardPulse"; + public const string ClipboardPulseOutline = "ClipboardPulseOutline"; + public const string ClipboardRemove = "ClipboardRemove"; + public const string ClipboardRemoveOutline = "ClipboardRemoveOutline"; + public const string ClipboardSearch = "ClipboardSearch"; + public const string ClipboardSearchOutline = "ClipboardSearchOutline"; + public const string ClipboardText = "ClipboardText"; + public const string ClipboardTextClock = "ClipboardTextClock"; + public const string ClipboardTextClockOutline = "ClipboardTextClockOutline"; + public const string ClipboardTextMultiple = "ClipboardTextMultiple"; + public const string ClipboardTextMultipleOutline = "ClipboardTextMultipleOutline"; + public const string ClipboardTextOff = "ClipboardTextOff"; + public const string ClipboardTextOffOutline = "ClipboardTextOffOutline"; + public const string ClipboardTextOutline = "ClipboardTextOutline"; + public const string ClipboardTextPlay = "ClipboardTextPlay"; + public const string ClipboardTextPlayOutline = "ClipboardTextPlayOutline"; + public const string ClipboardTextSearch = "ClipboardTextSearch"; + public const string ClipboardTextSearchOutline = "ClipboardTextSearchOutline"; + public const string Clippy = "Clippy"; + public const string Clock = "Clock"; + public const string ClockAlert = "ClockAlert"; + public const string ClockAlertOutline = "ClockAlertOutline"; + public const string ClockCheck = "ClockCheck"; + public const string ClockCheckOutline = "ClockCheckOutline"; + public const string ClockDigital = "ClockDigital"; + public const string ClockEnd = "ClockEnd"; + public const string ClockFast = "ClockFast"; + public const string ClockIn = "ClockIn"; + public const string ClockMinus = "ClockMinus"; + public const string ClockMinusOutline = "ClockMinusOutline"; + public const string ClockOut = "ClockOut"; + public const string ClockOutline = "ClockOutline"; + public const string ClockPlus = "ClockPlus"; + public const string ClockPlusOutline = "ClockPlusOutline"; + public const string ClockRemove = "ClockRemove"; + public const string ClockRemoveOutline = "ClockRemoveOutline"; + public const string ClockStart = "ClockStart"; + public const string ClockTimeEight = "ClockTimeEight"; + public const string ClockTimeEightOutline = "ClockTimeEightOutline"; + public const string ClockTimeEleven = "ClockTimeEleven"; + public const string ClockTimeElevenOutline = "ClockTimeElevenOutline"; + public const string ClockTimeFive = "ClockTimeFive"; + public const string ClockTimeFiveOutline = "ClockTimeFiveOutline"; + public const string ClockTimeFour = "ClockTimeFour"; + public const string ClockTimeFourOutline = "ClockTimeFourOutline"; + public const string ClockTimeNine = "ClockTimeNine"; + public const string ClockTimeNineOutline = "ClockTimeNineOutline"; + public const string ClockTimeOne = "ClockTimeOne"; + public const string ClockTimeOneOutline = "ClockTimeOneOutline"; + public const string ClockTimeSeven = "ClockTimeSeven"; + public const string ClockTimeSevenOutline = "ClockTimeSevenOutline"; + public const string ClockTimeSix = "ClockTimeSix"; + public const string ClockTimeSixOutline = "ClockTimeSixOutline"; + public const string ClockTimeTen = "ClockTimeTen"; + public const string ClockTimeTenOutline = "ClockTimeTenOutline"; + public const string ClockTimeThree = "ClockTimeThree"; + public const string ClockTimeThreeOutline = "ClockTimeThreeOutline"; + public const string ClockTimeTwelve = "ClockTimeTwelve"; + public const string ClockTimeTwelveOutline = "ClockTimeTwelveOutline"; + public const string ClockTimeTwo = "ClockTimeTwo"; + public const string ClockTimeTwoOutline = "ClockTimeTwoOutline"; + public const string Close = "Close"; + public const string CloseBox = "CloseBox"; + public const string CloseBoxMultiple = "CloseBoxMultiple"; + public const string CloseBoxMultipleOutline = "CloseBoxMultipleOutline"; + public const string CloseBoxOutline = "CloseBoxOutline"; + public const string CloseCircle = "CloseCircle"; + public const string CloseCircleMultiple = "CloseCircleMultiple"; + public const string CloseCircleMultipleOutline = "CloseCircleMultipleOutline"; + public const string CloseCircleOutline = "CloseCircleOutline"; + public const string ClosedCaption = "ClosedCaption"; + public const string ClosedCaptionOutline = "ClosedCaptionOutline"; + public const string CloseNetwork = "CloseNetwork"; + public const string CloseNetworkOutline = "CloseNetworkOutline"; + public const string CloseOctagon = "CloseOctagon"; + public const string CloseOctagonOutline = "CloseOctagonOutline"; + public const string CloseOutline = "CloseOutline"; + public const string CloseThick = "CloseThick"; + public const string Cloud = "Cloud"; + public const string CloudAlert = "CloudAlert"; + public const string CloudBraces = "CloudBraces"; + public const string CloudCheck = "CloudCheck"; + public const string CloudCheckOutline = "CloudCheckOutline"; + public const string CloudCircle = "CloudCircle"; + public const string CloudDownload = "CloudDownload"; + public const string CloudDownloadOutline = "CloudDownloadOutline"; + public const string CloudLock = "CloudLock"; + public const string CloudLockOutline = "CloudLockOutline"; + public const string CloudOffOutline = "CloudOffOutline"; + public const string CloudOutline = "CloudOutline"; + public const string CloudPrint = "CloudPrint"; + public const string CloudPrintOutline = "CloudPrintOutline"; + public const string CloudQuestion = "CloudQuestion"; + public const string CloudRefresh = "CloudRefresh"; + public const string CloudSearch = "CloudSearch"; + public const string CloudSearchOutline = "CloudSearchOutline"; + public const string CloudSync = "CloudSync"; + public const string CloudSyncOutline = "CloudSyncOutline"; + public const string CloudTags = "CloudTags"; + public const string CloudUpload = "CloudUpload"; + public const string CloudUploadOutline = "CloudUploadOutline"; + public const string Clover = "Clover"; + public const string CoachLamp = "CoachLamp"; + public const string CoatRack = "CoatRack"; + public const string CodeArray = "CodeArray"; + public const string CodeBraces = "CodeBraces"; + public const string CodeBracesBox = "CodeBracesBox"; + public const string CodeBrackets = "CodeBrackets"; + public const string CodeEqual = "CodeEqual"; + public const string CodeGreaterThan = "CodeGreaterThan"; + public const string CodeGreaterThanOrEqual = "CodeGreaterThanOrEqual"; + public const string CodeJson = "CodeJson"; + public const string CodeLessThan = "CodeLessThan"; + public const string CodeLessThanOrEqual = "CodeLessThanOrEqual"; + public const string CodeNotEqual = "CodeNotEqual"; + public const string CodeNotEqualVariant = "CodeNotEqualVariant"; + public const string CodeParentheses = "CodeParentheses"; + public const string CodeParenthesesBox = "CodeParenthesesBox"; + public const string Codepen = "Codepen"; + public const string CodeString = "CodeString"; + public const string CodeTags = "CodeTags"; + public const string CodeTagsCheck = "CodeTagsCheck"; + public const string Coffee = "Coffee"; + public const string CoffeeMaker = "CoffeeMaker"; + public const string CoffeeMakerOutline = "CoffeeMakerOutline"; + public const string CoffeeOff = "CoffeeOff"; + public const string CoffeeOffOutline = "CoffeeOffOutline"; + public const string CoffeeOutline = "CoffeeOutline"; + public const string CoffeeToGo = "CoffeeToGo"; + public const string CoffeeToGoOutline = "CoffeeToGoOutline"; + public const string Coffin = "Coffin"; + public const string Cog = "Cog"; + public const string CogBox = "CogBox"; + public const string CogClockwise = "CogClockwise"; + public const string CogCounterclockwise = "CogCounterclockwise"; + public const string CogOff = "CogOff"; + public const string CogOffOutline = "CogOffOutline"; + public const string CogOutline = "CogOutline"; + public const string CogRefresh = "CogRefresh"; + public const string CogRefreshOutline = "CogRefreshOutline"; + public const string Cogs = "Cogs"; + public const string CogSync = "CogSync"; + public const string CogSyncOutline = "CogSyncOutline"; + public const string CogTransfer = "CogTransfer"; + public const string CogTransferOutline = "CogTransferOutline"; + public const string Collage = "Collage"; + public const string CollapseAll = "CollapseAll"; + public const string CollapseAllOutline = "CollapseAllOutline"; + public const string ColorHelper = "ColorHelper"; + public const string Comma = "Comma"; + public const string CommaBox = "CommaBox"; + public const string CommaBoxOutline = "CommaBoxOutline"; + public const string CommaCircle = "CommaCircle"; + public const string CommaCircleOutline = "CommaCircleOutline"; + public const string Comment = "Comment"; + public const string CommentAccount = "CommentAccount"; + public const string CommentAccountOutline = "CommentAccountOutline"; + public const string CommentAlert = "CommentAlert"; + public const string CommentAlertOutline = "CommentAlertOutline"; + public const string CommentArrowLeft = "CommentArrowLeft"; + public const string CommentArrowLeftOutline = "CommentArrowLeftOutline"; + public const string CommentArrowRight = "CommentArrowRight"; + public const string CommentArrowRightOutline = "CommentArrowRightOutline"; + public const string CommentBookmark = "CommentBookmark"; + public const string CommentBookmarkOutline = "CommentBookmarkOutline"; + public const string CommentCheck = "CommentCheck"; + public const string CommentCheckOutline = "CommentCheckOutline"; + public const string CommentEdit = "CommentEdit"; + public const string CommentEditOutline = "CommentEditOutline"; + public const string CommentEye = "CommentEye"; + public const string CommentEyeOutline = "CommentEyeOutline"; + public const string CommentFlash = "CommentFlash"; + public const string CommentFlashOutline = "CommentFlashOutline"; + public const string CommentMinus = "CommentMinus"; + public const string CommentMinusOutline = "CommentMinusOutline"; + public const string CommentMultiple = "CommentMultiple"; + public const string CommentMultipleOutline = "CommentMultipleOutline"; + public const string CommentOff = "CommentOff"; + public const string CommentOffOutline = "CommentOffOutline"; + public const string CommentOutline = "CommentOutline"; + public const string CommentPlus = "CommentPlus"; + public const string CommentPlusOutline = "CommentPlusOutline"; + public const string CommentProcessing = "CommentProcessing"; + public const string CommentProcessingOutline = "CommentProcessingOutline"; + public const string CommentQuestion = "CommentQuestion"; + public const string CommentQuestionOutline = "CommentQuestionOutline"; + public const string CommentQuote = "CommentQuote"; + public const string CommentQuoteOutline = "CommentQuoteOutline"; + public const string CommentRemove = "CommentRemove"; + public const string CommentRemoveOutline = "CommentRemoveOutline"; + public const string CommentSearch = "CommentSearch"; + public const string CommentSearchOutline = "CommentSearchOutline"; + public const string CommentText = "CommentText"; + public const string CommentTextMultiple = "CommentTextMultiple"; + public const string CommentTextMultipleOutline = "CommentTextMultipleOutline"; + public const string CommentTextOutline = "CommentTextOutline"; + public const string Compare = "Compare"; + public const string CompareHorizontal = "CompareHorizontal"; + public const string CompareRemove = "CompareRemove"; + public const string CompareVertical = "CompareVertical"; + public const string Compass = "Compass"; + public const string CompassOff = "CompassOff"; + public const string CompassOffOutline = "CompassOffOutline"; + public const string CompassOutline = "CompassOutline"; + public const string CompassRose = "CompassRose"; + public const string Connection = "Connection"; + public const string Console = "Console"; + public const string ConsoleLine = "ConsoleLine"; + public const string ConsoleNetwork = "ConsoleNetwork"; + public const string ConsoleNetworkOutline = "ConsoleNetworkOutline"; + public const string Consolidate = "Consolidate"; + public const string ContactlessPayment = "ContactlessPayment"; + public const string ContactlessPaymentCircle = "ContactlessPaymentCircle"; + public const string ContactlessPaymentCircleOutline = "ContactlessPaymentCircleOutline"; + public const string Contacts = "Contacts"; + public const string ContactsOutline = "ContactsOutline"; + public const string Contain = "Contain"; + public const string ContainEnd = "ContainEnd"; + public const string ContainStart = "ContainStart"; + public const string ContentCopy = "ContentCopy"; + public const string ContentCut = "ContentCut"; + public const string ContentDuplicate = "ContentDuplicate"; + public const string ContentPaste = "ContentPaste"; + public const string ContentSave = "ContentSave"; + public const string ContentSaveAlert = "ContentSaveAlert"; + public const string ContentSaveAlertOutline = "ContentSaveAlertOutline"; + public const string ContentSaveAll = "ContentSaveAll"; + public const string ContentSaveAllOutline = "ContentSaveAllOutline"; + public const string ContentSaveCheck = "ContentSaveCheck"; + public const string ContentSaveCheckOutline = "ContentSaveCheckOutline"; + public const string ContentSaveCog = "ContentSaveCog"; + public const string ContentSaveCogOutline = "ContentSaveCogOutline"; + public const string ContentSaveEdit = "ContentSaveEdit"; + public const string ContentSaveEditOutline = "ContentSaveEditOutline"; + public const string ContentSaveMove = "ContentSaveMove"; + public const string ContentSaveMoveOutline = "ContentSaveMoveOutline"; + public const string ContentSaveOff = "ContentSaveOff"; + public const string ContentSaveOffOutline = "ContentSaveOffOutline"; + public const string ContentSaveOutline = "ContentSaveOutline"; + public const string ContentSaveSettings = "ContentSaveSettings"; + public const string ContentSaveSettingsOutline = "ContentSaveSettingsOutline"; + public const string Contrast = "Contrast"; + public const string ContrastBox = "ContrastBox"; + public const string ContrastCircle = "ContrastCircle"; + public const string ControllerClassic = "ControllerClassic"; + public const string ControllerClassicOutline = "ControllerClassicOutline"; + public const string Cookie = "Cookie"; + public const string CookieAlert = "CookieAlert"; + public const string CookieAlertOutline = "CookieAlertOutline"; + public const string CookieCheck = "CookieCheck"; + public const string CookieCheckOutline = "CookieCheckOutline"; + public const string CookieClock = "CookieClock"; + public const string CookieClockOutline = "CookieClockOutline"; + public const string CookieCog = "CookieCog"; + public const string CookieCogOutline = "CookieCogOutline"; + public const string CookieEdit = "CookieEdit"; + public const string CookieEditOutline = "CookieEditOutline"; + public const string CookieLock = "CookieLock"; + public const string CookieLockOutline = "CookieLockOutline"; + public const string CookieMinus = "CookieMinus"; + public const string CookieMinusOutline = "CookieMinusOutline"; + public const string CookieOff = "CookieOff"; + public const string CookieOffOutline = "CookieOffOutline"; + public const string CookieOutline = "CookieOutline"; + public const string CookiePlus = "CookiePlus"; + public const string CookiePlusOutline = "CookiePlusOutline"; + public const string CookieRefresh = "CookieRefresh"; + public const string CookieRefreshOutline = "CookieRefreshOutline"; + public const string CookieRemove = "CookieRemove"; + public const string CookieRemoveOutline = "CookieRemoveOutline"; + public const string CookieSettings = "CookieSettings"; + public const string CookieSettingsOutline = "CookieSettingsOutline"; + public const string CoolantTemperature = "CoolantTemperature"; + public const string Copyright = "Copyright"; + public const string Cordova = "Cordova"; + public const string Corn = "Corn"; + public const string CornOff = "CornOff"; + public const string CosineWave = "CosineWave"; + public const string Counter = "Counter"; + public const string Countertop = "Countertop"; + public const string CountertopOutline = "CountertopOutline"; + public const string Cow = "Cow"; + public const string Cpu32Bit = "Cpu32Bit"; + public const string Cpu64Bit = "Cpu64Bit"; + public const string Crane = "Crane"; + public const string Creation = "Creation"; + public const string CreativeCommons = "CreativeCommons"; + public const string CreditCard = "CreditCard"; + public const string CreditCardCheck = "CreditCardCheck"; + public const string CreditCardCheckOutline = "CreditCardCheckOutline"; + public const string CreditCardClock = "CreditCardClock"; + public const string CreditCardClockOutline = "CreditCardClockOutline"; + public const string CreditCardEdit = "CreditCardEdit"; + public const string CreditCardEditOutline = "CreditCardEditOutline"; + public const string CreditCardLock = "CreditCardLock"; + public const string CreditCardLockOutline = "CreditCardLockOutline"; + public const string CreditCardMarker = "CreditCardMarker"; + public const string CreditCardMarkerOutline = "CreditCardMarkerOutline"; + public const string CreditCardMinus = "CreditCardMinus"; + public const string CreditCardMinusOutline = "CreditCardMinusOutline"; + public const string CreditCardMultiple = "CreditCardMultiple"; + public const string CreditCardMultipleOutline = "CreditCardMultipleOutline"; + public const string CreditCardOff = "CreditCardOff"; + public const string CreditCardOffOutline = "CreditCardOffOutline"; + public const string CreditCardOutline = "CreditCardOutline"; + public const string CreditCardPlus = "CreditCardPlus"; + public const string CreditCardPlusOutline = "CreditCardPlusOutline"; + public const string CreditCardRefresh = "CreditCardRefresh"; + public const string CreditCardRefreshOutline = "CreditCardRefreshOutline"; + public const string CreditCardRefund = "CreditCardRefund"; + public const string CreditCardRefundOutline = "CreditCardRefundOutline"; + public const string CreditCardRemove = "CreditCardRemove"; + public const string CreditCardRemoveOutline = "CreditCardRemoveOutline"; + public const string CreditCardScan = "CreditCardScan"; + public const string CreditCardScanOutline = "CreditCardScanOutline"; + public const string CreditCardSearch = "CreditCardSearch"; + public const string CreditCardSearchOutline = "CreditCardSearchOutline"; + public const string CreditCardSettings = "CreditCardSettings"; + public const string CreditCardSettingsOutline = "CreditCardSettingsOutline"; + public const string CreditCardSync = "CreditCardSync"; + public const string CreditCardSyncOutline = "CreditCardSyncOutline"; + public const string CreditCardWireless = "CreditCardWireless"; + public const string CreditCardWirelessOff = "CreditCardWirelessOff"; + public const string CreditCardWirelessOffOutline = "CreditCardWirelessOffOutline"; + public const string CreditCardWirelessOutline = "CreditCardWirelessOutline"; + public const string Cricket = "Cricket"; + public const string Crop = "Crop"; + public const string CropFree = "CropFree"; + public const string CropLandscape = "CropLandscape"; + public const string CropPortrait = "CropPortrait"; + public const string CropRotate = "CropRotate"; + public const string CropSquare = "CropSquare"; + public const string Cross = "Cross"; + public const string CrossBolnisi = "CrossBolnisi"; + public const string CrossCeltic = "CrossCeltic"; + public const string Crosshairs = "Crosshairs"; + public const string CrosshairsGps = "CrosshairsGps"; + public const string CrosshairsOff = "CrosshairsOff"; + public const string CrosshairsQuestion = "CrosshairsQuestion"; + public const string CrossOutline = "CrossOutline"; + public const string Crown = "Crown"; + public const string CrownCircle = "CrownCircle"; + public const string CrownCircleOutline = "CrownCircleOutline"; + public const string CrownOutline = "CrownOutline"; + public const string Cryengine = "Cryengine"; + public const string CrystalBall = "CrystalBall"; + public const string Cube = "Cube"; + public const string CubeOff = "CubeOff"; + public const string CubeOffOutline = "CubeOffOutline"; + public const string CubeOutline = "CubeOutline"; + public const string CubeScan = "CubeScan"; + public const string CubeSend = "CubeSend"; + public const string CubeUnfolded = "CubeUnfolded"; + public const string Cup = "Cup"; + public const string Cupboard = "Cupboard"; + public const string CupboardOutline = "CupboardOutline"; + public const string Cupcake = "Cupcake"; + public const string CupOff = "CupOff"; + public const string CupOffOutline = "CupOffOutline"; + public const string CupOutline = "CupOutline"; + public const string CupWater = "CupWater"; + public const string Curling = "Curling"; + public const string CurrencyBdt = "CurrencyBdt"; + public const string CurrencyBrl = "CurrencyBrl"; + public const string CurrencyBtc = "CurrencyBtc"; + public const string CurrencyCny = "CurrencyCny"; + public const string CurrencyEth = "CurrencyEth"; + public const string CurrencyEur = "CurrencyEur"; + public const string CurrencyEurOff = "CurrencyEurOff"; + public const string CurrencyGbp = "CurrencyGbp"; + public const string CurrencyIls = "CurrencyIls"; + public const string CurrencyInr = "CurrencyInr"; + public const string CurrencyJpy = "CurrencyJpy"; + public const string CurrencyKrw = "CurrencyKrw"; + public const string CurrencyKzt = "CurrencyKzt"; + public const string CurrencyMnt = "CurrencyMnt"; + public const string CurrencyNgn = "CurrencyNgn"; + public const string CurrencyPhp = "CurrencyPhp"; + public const string CurrencyRial = "CurrencyRial"; + public const string CurrencyRub = "CurrencyRub"; + public const string CurrencySign = "CurrencySign"; + public const string CurrencyTry = "CurrencyTry"; + public const string CurrencyTwd = "CurrencyTwd"; + public const string CurrencyUsd = "CurrencyUsd"; + public const string CurrencyUsdOff = "CurrencyUsdOff"; + public const string CurrentAc = "CurrentAc"; + public const string CurrentDc = "CurrentDc"; + public const string CursorDefault = "CursorDefault"; + public const string CursorDefaultClick = "CursorDefaultClick"; + public const string CursorDefaultClickOutline = "CursorDefaultClickOutline"; + public const string CursorDefaultGesture = "CursorDefaultGesture"; + public const string CursorDefaultGestureOutline = "CursorDefaultGestureOutline"; + public const string CursorDefaultOutline = "CursorDefaultOutline"; + public const string CursorMove = "CursorMove"; + public const string CursorPointer = "CursorPointer"; + public const string CursorText = "CursorText"; + public const string Curtains = "Curtains"; + public const string CurtainsClosed = "CurtainsClosed"; + public const string DanceBallroom = "DanceBallroom"; + public const string DancePole = "DancePole"; + public const string Database = "Database"; + public const string DatabaseAlert = "DatabaseAlert"; + public const string DatabaseAlertOutline = "DatabaseAlertOutline"; + public const string DatabaseArrowDown = "DatabaseArrowDown"; + public const string DatabaseArrowDownOutline = "DatabaseArrowDownOutline"; + public const string DatabaseArrowLeft = "DatabaseArrowLeft"; + public const string DatabaseArrowLeftOutline = "DatabaseArrowLeftOutline"; + public const string DatabaseArrowRight = "DatabaseArrowRight"; + public const string DatabaseArrowRightOutline = "DatabaseArrowRightOutline"; + public const string DatabaseArrowUp = "DatabaseArrowUp"; + public const string DatabaseArrowUpOutline = "DatabaseArrowUpOutline"; + public const string DatabaseCheck = "DatabaseCheck"; + public const string DatabaseCheckOutline = "DatabaseCheckOutline"; + public const string DatabaseClock = "DatabaseClock"; + public const string DatabaseClockOutline = "DatabaseClockOutline"; + public const string DatabaseCog = "DatabaseCog"; + public const string DatabaseCogOutline = "DatabaseCogOutline"; + public const string DatabaseEdit = "DatabaseEdit"; + public const string DatabaseEditOutline = "DatabaseEditOutline"; + public const string DatabaseExport = "DatabaseExport"; + public const string DatabaseExportOutline = "DatabaseExportOutline"; + public const string DatabaseImport = "DatabaseImport"; + public const string DatabaseImportOutline = "DatabaseImportOutline"; + public const string DatabaseLock = "DatabaseLock"; + public const string DatabaseLockOutline = "DatabaseLockOutline"; + public const string DatabaseMarker = "DatabaseMarker"; + public const string DatabaseMarkerOutline = "DatabaseMarkerOutline"; + public const string DatabaseMinus = "DatabaseMinus"; + public const string DatabaseMinusOutline = "DatabaseMinusOutline"; + public const string DatabaseOff = "DatabaseOff"; + public const string DatabaseOffOutline = "DatabaseOffOutline"; + public const string DatabaseOutline = "DatabaseOutline"; + public const string DatabasePlus = "DatabasePlus"; + public const string DatabasePlusOutline = "DatabasePlusOutline"; + public const string DatabaseRefresh = "DatabaseRefresh"; + public const string DatabaseRefreshOutline = "DatabaseRefreshOutline"; + public const string DatabaseRemove = "DatabaseRemove"; + public const string DatabaseRemoveOutline = "DatabaseRemoveOutline"; + public const string DatabaseSearch = "DatabaseSearch"; + public const string DatabaseSearchOutline = "DatabaseSearchOutline"; + public const string DatabaseSettings = "DatabaseSettings"; + public const string DatabaseSettingsOutline = "DatabaseSettingsOutline"; + public const string DatabaseSync = "DatabaseSync"; + public const string DatabaseSyncOutline = "DatabaseSyncOutline"; + public const string DataMatrix = "DataMatrix"; + public const string DataMatrixEdit = "DataMatrixEdit"; + public const string DataMatrixMinus = "DataMatrixMinus"; + public const string DataMatrixPlus = "DataMatrixPlus"; + public const string DataMatrixRemove = "DataMatrixRemove"; + public const string DataMatrixScan = "DataMatrixScan"; + public const string DeathlyHallows = "DeathlyHallows"; + public const string DeathStar = "DeathStar"; + public const string DeathStarVariant = "DeathStarVariant"; + public const string Debian = "Debian"; + public const string DebugStepInto = "DebugStepInto"; + public const string DebugStepOut = "DebugStepOut"; + public const string DebugStepOver = "DebugStepOver"; + public const string Decagram = "Decagram"; + public const string DecagramOutline = "DecagramOutline"; + public const string Decimal = "Decimal"; + public const string DecimalComma = "DecimalComma"; + public const string DecimalCommaDecrease = "DecimalCommaDecrease"; + public const string DecimalCommaIncrease = "DecimalCommaIncrease"; + public const string DecimalDecrease = "DecimalDecrease"; + public const string DecimalIncrease = "DecimalIncrease"; + public const string Delete = "Delete"; + public const string DeleteAlert = "DeleteAlert"; + public const string DeleteAlertOutline = "DeleteAlertOutline"; + public const string DeleteCircle = "DeleteCircle"; + public const string DeleteCircleOutline = "DeleteCircleOutline"; + public const string DeleteClock = "DeleteClock"; + public const string DeleteClockOutline = "DeleteClockOutline"; + public const string DeleteEmpty = "DeleteEmpty"; + public const string DeleteEmptyOutline = "DeleteEmptyOutline"; + public const string DeleteForever = "DeleteForever"; + public const string DeleteForeverOutline = "DeleteForeverOutline"; + public const string DeleteOff = "DeleteOff"; + public const string DeleteOffOutline = "DeleteOffOutline"; + public const string DeleteOutline = "DeleteOutline"; + public const string DeleteRestore = "DeleteRestore"; + public const string DeleteSweep = "DeleteSweep"; + public const string DeleteSweepOutline = "DeleteSweepOutline"; + public const string DeleteVariant = "DeleteVariant"; + public const string Delta = "Delta"; + public const string Desk = "Desk"; + public const string DeskLamp = "DeskLamp"; + public const string Deskphone = "Deskphone"; + public const string DesktopClassic = "DesktopClassic"; + public const string DesktopMac = "DesktopMac"; + public const string DesktopMacDashboard = "DesktopMacDashboard"; + public const string DesktopTower = "DesktopTower"; + public const string DesktopTowerMonitor = "DesktopTowerMonitor"; + public const string Details = "Details"; + public const string DeveloperBoard = "DeveloperBoard"; + public const string Deviantart = "Deviantart"; + public const string Devices = "Devices"; + public const string DevTo = "DevTo"; + public const string Dharmachakra = "Dharmachakra"; + public const string Diabetes = "Diabetes"; + public const string Dialpad = "Dialpad"; + public const string Diameter = "Diameter"; + public const string DiameterOutline = "DiameterOutline"; + public const string DiameterVariant = "DiameterVariant"; + public const string Diamond = "Diamond"; + public const string DiamondOutline = "DiamondOutline"; + public const string DiamondStone = "DiamondStone"; + public const string Dice1 = "Dice1"; + public const string Dice1Outline = "Dice1Outline"; + public const string Dice2 = "Dice2"; + public const string Dice2Outline = "Dice2Outline"; + public const string Dice3 = "Dice3"; + public const string Dice3Outline = "Dice3Outline"; + public const string Dice4 = "Dice4"; + public const string Dice4Outline = "Dice4Outline"; + public const string Dice5 = "Dice5"; + public const string Dice5Outline = "Dice5Outline"; + public const string Dice6 = "Dice6"; + public const string Dice6Outline = "Dice6Outline"; + public const string DiceD10 = "DiceD10"; + public const string DiceD10Outline = "DiceD10Outline"; + public const string DiceD12 = "DiceD12"; + public const string DiceD12Outline = "DiceD12Outline"; + public const string DiceD20 = "DiceD20"; + public const string DiceD20Outline = "DiceD20Outline"; + public const string DiceD4 = "DiceD4"; + public const string DiceD4Outline = "DiceD4Outline"; + public const string DiceD6 = "DiceD6"; + public const string DiceD6Outline = "DiceD6Outline"; + public const string DiceD8 = "DiceD8"; + public const string DiceD8Outline = "DiceD8Outline"; + public const string DiceMultiple = "DiceMultiple"; + public const string DiceMultipleOutline = "DiceMultipleOutline"; + public const string DigitalOcean = "DigitalOcean"; + public const string DipSwitch = "DipSwitch"; + public const string Directions = "Directions"; + public const string DirectionsFork = "DirectionsFork"; + public const string Disc = "Disc"; + public const string DiscAlert = "DiscAlert"; + public const string Discord = "Discord"; + public const string DiscPlayer = "DiscPlayer"; + public const string Dishwasher = "Dishwasher"; + public const string DishwasherAlert = "DishwasherAlert"; + public const string DishwasherOff = "DishwasherOff"; + public const string Disqus = "Disqus"; + public const string DistributeHorizontalCenter = "DistributeHorizontalCenter"; + public const string DistributeHorizontalLeft = "DistributeHorizontalLeft"; + public const string DistributeHorizontalRight = "DistributeHorizontalRight"; + public const string DistributeVerticalBottom = "DistributeVerticalBottom"; + public const string DistributeVerticalCenter = "DistributeVerticalCenter"; + public const string DistributeVerticalTop = "DistributeVerticalTop"; + public const string Diversify = "Diversify"; + public const string DivingFlippers = "DivingFlippers"; + public const string DivingHelmet = "DivingHelmet"; + public const string DivingScuba = "DivingScuba"; + public const string DivingScubaFlag = "DivingScubaFlag"; + public const string DivingScubaTank = "DivingScubaTank"; + public const string DivingScubaTankMultiple = "DivingScubaTankMultiple"; + public const string DivingSnorkel = "DivingSnorkel"; + public const string Division = "Division"; + public const string DivisionBox = "DivisionBox"; + public const string Dlna = "Dlna"; + public const string Dna = "Dna"; + public const string Dns = "Dns"; + public const string DnsOutline = "DnsOutline"; + public const string DockBottom = "DockBottom"; + public const string Docker = "Docker"; + public const string DockLeft = "DockLeft"; + public const string DockRight = "DockRight"; + public const string DockTop = "DockTop"; + public const string DockWindow = "DockWindow"; + public const string Doctor = "Doctor"; + public const string Dog = "Dog"; + public const string DogService = "DogService"; + public const string DogSide = "DogSide"; + public const string DogSideOff = "DogSideOff"; + public const string Dolby = "Dolby"; + public const string Dolly = "Dolly"; + public const string Dolphin = "Dolphin"; + public const string Domain = "Domain"; + public const string DomainOff = "DomainOff"; + public const string DomainPlus = "DomainPlus"; + public const string DomainRemove = "DomainRemove"; + public const string DomeLight = "DomeLight"; + public const string DominoMask = "DominoMask"; + public const string Donkey = "Donkey"; + public const string Door = "Door"; + public const string Doorbell = "Doorbell"; + public const string DoorbellVideo = "DoorbellVideo"; + public const string DoorClosed = "DoorClosed"; + public const string DoorClosedLock = "DoorClosedLock"; + public const string DoorOpen = "DoorOpen"; + public const string DoorSliding = "DoorSliding"; + public const string DoorSlidingLock = "DoorSlidingLock"; + public const string DoorSlidingOpen = "DoorSlidingOpen"; + public const string DotNet = "DotNet"; + public const string DotsGrid = "DotsGrid"; + public const string DotsHexagon = "DotsHexagon"; + public const string DotsHorizontal = "DotsHorizontal"; + public const string DotsHorizontalCircle = "DotsHorizontalCircle"; + public const string DotsHorizontalCircleOutline = "DotsHorizontalCircleOutline"; + public const string DotsSquare = "DotsSquare"; + public const string DotsTriangle = "DotsTriangle"; + public const string DotsVertical = "DotsVertical"; + public const string DotsVerticalCircle = "DotsVerticalCircle"; + public const string DotsVerticalCircleOutline = "DotsVerticalCircleOutline"; + public const string Download = "Download"; + public const string DownloadBox = "DownloadBox"; + public const string DownloadBoxOutline = "DownloadBoxOutline"; + public const string DownloadCircle = "DownloadCircle"; + public const string DownloadCircleOutline = "DownloadCircleOutline"; + public const string DownloadLock = "DownloadLock"; + public const string DownloadLockOutline = "DownloadLockOutline"; + public const string DownloadMultiple = "DownloadMultiple"; + public const string DownloadNetwork = "DownloadNetwork"; + public const string DownloadNetworkOutline = "DownloadNetworkOutline"; + public const string DownloadOff = "DownloadOff"; + public const string DownloadOffOutline = "DownloadOffOutline"; + public const string DownloadOutline = "DownloadOutline"; + public const string Drag = "Drag"; + public const string DragHorizontal = "DragHorizontal"; + public const string DragHorizontalVariant = "DragHorizontalVariant"; + public const string DragVariant = "DragVariant"; + public const string DragVertical = "DragVertical"; + public const string DragVerticalVariant = "DragVerticalVariant"; + public const string DramaMasks = "DramaMasks"; + public const string Draw = "Draw"; + public const string Drawing = "Drawing"; + public const string DrawingBox = "DrawingBox"; + public const string Dresser = "Dresser"; + public const string DresserOutline = "DresserOutline"; + public const string Drone = "Drone"; + public const string Dropbox = "Dropbox"; + public const string Drupal = "Drupal"; + public const string Duck = "Duck"; + public const string Dumbbell = "Dumbbell"; + public const string DumpTruck = "DumpTruck"; + public const string Earbuds = "Earbuds"; + public const string EarbudsOff = "EarbudsOff"; + public const string EarbudsOffOutline = "EarbudsOffOutline"; + public const string EarbudsOutline = "EarbudsOutline"; + public const string EarHearing = "EarHearing"; + public const string EarHearingOff = "EarHearingOff"; + public const string Earth = "Earth"; + public const string EarthArrowRight = "EarthArrowRight"; + public const string EarthBox = "EarthBox"; + public const string EarthBoxMinus = "EarthBoxMinus"; + public const string EarthBoxOff = "EarthBoxOff"; + public const string EarthBoxPlus = "EarthBoxPlus"; + public const string EarthBoxRemove = "EarthBoxRemove"; + public const string EarthMinus = "EarthMinus"; + public const string EarthOff = "EarthOff"; + public const string EarthPlus = "EarthPlus"; + public const string EarthRemove = "EarthRemove"; + public const string Egg = "Egg"; + public const string EggEaster = "EggEaster"; + public const string EggFried = "EggFried"; + public const string EggOff = "EggOff"; + public const string EggOffOutline = "EggOffOutline"; + public const string EggOutline = "EggOutline"; + public const string EiffelTower = "EiffelTower"; + public const string EightTrack = "EightTrack"; + public const string Eject = "Eject"; + public const string EjectOutline = "EjectOutline"; + public const string ElectricSwitch = "ElectricSwitch"; + public const string ElectricSwitchClosed = "ElectricSwitchClosed"; + public const string ElectronFramework = "ElectronFramework"; + public const string Elephant = "Elephant"; + public const string ElevationDecline = "ElevationDecline"; + public const string ElevationRise = "ElevationRise"; + public const string Elevator = "Elevator"; + public const string ElevatorDown = "ElevatorDown"; + public const string ElevatorPassenger = "ElevatorPassenger"; + public const string ElevatorUp = "ElevatorUp"; + public const string Ellipse = "Ellipse"; + public const string EllipseOutline = "EllipseOutline"; + public const string Email = "Email"; + public const string EmailAlert = "EmailAlert"; + public const string EmailAlertOutline = "EmailAlertOutline"; + public const string EmailBox = "EmailBox"; + public const string EmailCheck = "EmailCheck"; + public const string EmailCheckOutline = "EmailCheckOutline"; + public const string EmailEdit = "EmailEdit"; + public const string EmailEditOutline = "EmailEditOutline"; + public const string EmailFast = "EmailFast"; + public const string EmailFastOutline = "EmailFastOutline"; + public const string EmailLock = "EmailLock"; + public const string EmailMarkAsUnread = "EmailMarkAsUnread"; + public const string EmailMinus = "EmailMinus"; + public const string EmailMinusOutline = "EmailMinusOutline"; + public const string EmailMultiple = "EmailMultiple"; + public const string EmailMultipleOutline = "EmailMultipleOutline"; + public const string EmailNewsletter = "EmailNewsletter"; + public const string EmailOff = "EmailOff"; + public const string EmailOffOutline = "EmailOffOutline"; + public const string EmailOpen = "EmailOpen"; + public const string EmailOpenMultiple = "EmailOpenMultiple"; + public const string EmailOpenMultipleOutline = "EmailOpenMultipleOutline"; + public const string EmailOpenOutline = "EmailOpenOutline"; + public const string EmailOutline = "EmailOutline"; + public const string EmailPlus = "EmailPlus"; + public const string EmailPlusOutline = "EmailPlusOutline"; + public const string EmailReceive = "EmailReceive"; + public const string EmailReceiveOutline = "EmailReceiveOutline"; + public const string EmailRemove = "EmailRemove"; + public const string EmailRemoveOutline = "EmailRemoveOutline"; + public const string EmailSearch = "EmailSearch"; + public const string EmailSearchOutline = "EmailSearchOutline"; + public const string EmailSend = "EmailSend"; + public const string EmailSendOutline = "EmailSendOutline"; + public const string EmailSync = "EmailSync"; + public const string EmailSyncOutline = "EmailSyncOutline"; + public const string EmailVariant = "EmailVariant"; + public const string Ember = "Ember"; + public const string Emby = "Emby"; + public const string Emoticon = "Emoticon"; + public const string EmoticonAngry = "EmoticonAngry"; + public const string EmoticonAngryOutline = "EmoticonAngryOutline"; + public const string EmoticonConfused = "EmoticonConfused"; + public const string EmoticonConfusedOutline = "EmoticonConfusedOutline"; + public const string EmoticonCool = "EmoticonCool"; + public const string EmoticonCoolOutline = "EmoticonCoolOutline"; + public const string EmoticonCry = "EmoticonCry"; + public const string EmoticonCryOutline = "EmoticonCryOutline"; + public const string EmoticonDead = "EmoticonDead"; + public const string EmoticonDeadOutline = "EmoticonDeadOutline"; + public const string EmoticonDevil = "EmoticonDevil"; + public const string EmoticonDevilOutline = "EmoticonDevilOutline"; + public const string EmoticonExcited = "EmoticonExcited"; + public const string EmoticonExcitedOutline = "EmoticonExcitedOutline"; + public const string EmoticonFrown = "EmoticonFrown"; + public const string EmoticonFrownOutline = "EmoticonFrownOutline"; + public const string EmoticonHappy = "EmoticonHappy"; + public const string EmoticonHappyOutline = "EmoticonHappyOutline"; + public const string EmoticonKiss = "EmoticonKiss"; + public const string EmoticonKissOutline = "EmoticonKissOutline"; + public const string EmoticonLol = "EmoticonLol"; + public const string EmoticonLolOutline = "EmoticonLolOutline"; + public const string EmoticonNeutral = "EmoticonNeutral"; + public const string EmoticonNeutralOutline = "EmoticonNeutralOutline"; + public const string EmoticonOutline = "EmoticonOutline"; + public const string EmoticonPoop = "EmoticonPoop"; + public const string EmoticonPoopOutline = "EmoticonPoopOutline"; + public const string EmoticonSad = "EmoticonSad"; + public const string EmoticonSadOutline = "EmoticonSadOutline"; + public const string EmoticonSick = "EmoticonSick"; + public const string EmoticonSickOutline = "EmoticonSickOutline"; + public const string EmoticonTongue = "EmoticonTongue"; + public const string EmoticonTongueOutline = "EmoticonTongueOutline"; + public const string EmoticonWink = "EmoticonWink"; + public const string EmoticonWinkOutline = "EmoticonWinkOutline"; + public const string Engine = "Engine"; + public const string EngineOff = "EngineOff"; + public const string EngineOffOutline = "EngineOffOutline"; + public const string EngineOutline = "EngineOutline"; + public const string Epsilon = "Epsilon"; + public const string Equal = "Equal"; + public const string EqualBox = "EqualBox"; + public const string Equalizer = "Equalizer"; + public const string EqualizerOutline = "EqualizerOutline"; + public const string Eraser = "Eraser"; + public const string EraserVariant = "EraserVariant"; + public const string Escalator = "Escalator"; + public const string EscalatorBox = "EscalatorBox"; + public const string EscalatorDown = "EscalatorDown"; + public const string EscalatorUp = "EscalatorUp"; + public const string Eslint = "Eslint"; + public const string Et = "Et"; + public const string Ethereum = "Ethereum"; + public const string Ethernet = "Ethernet"; + public const string EthernetCable = "EthernetCable"; + public const string EthernetCableOff = "EthernetCableOff"; + public const string Evernote = "Evernote"; + public const string EvPlugCcs1 = "EvPlugCcs1"; + public const string EvPlugCcs2 = "EvPlugCcs2"; + public const string EvPlugChademo = "EvPlugChademo"; + public const string EvPlugTesla = "EvPlugTesla"; + public const string EvPlugType1 = "EvPlugType1"; + public const string EvPlugType2 = "EvPlugType2"; + public const string EvStation = "EvStation"; + public const string Excavator = "Excavator"; + public const string Exclamation = "Exclamation"; + public const string ExclamationThick = "ExclamationThick"; + public const string ExitRun = "ExitRun"; + public const string ExitToApp = "ExitToApp"; + public const string ExpandAll = "ExpandAll"; + public const string ExpandAllOutline = "ExpandAllOutline"; + public const string ExpansionCard = "ExpansionCard"; + public const string ExpansionCardVariant = "ExpansionCardVariant"; + public const string Exponent = "Exponent"; + public const string ExponentBox = "ExponentBox"; + public const string Export = "Export"; + public const string ExportVariant = "ExportVariant"; + public const string Eye = "Eye"; + public const string EyeCheck = "EyeCheck"; + public const string EyeCheckOutline = "EyeCheckOutline"; + public const string EyeCircle = "EyeCircle"; + public const string EyeCircleOutline = "EyeCircleOutline"; + public const string Eyedropper = "Eyedropper"; + public const string EyedropperMinus = "EyedropperMinus"; + public const string EyedropperOff = "EyedropperOff"; + public const string EyedropperPlus = "EyedropperPlus"; + public const string EyedropperRemove = "EyedropperRemove"; + public const string EyedropperVariant = "EyedropperVariant"; + public const string EyeMinus = "EyeMinus"; + public const string EyeMinusOutline = "EyeMinusOutline"; + public const string EyeOff = "EyeOff"; + public const string EyeOffOutline = "EyeOffOutline"; + public const string EyeOutline = "EyeOutline"; + public const string EyePlus = "EyePlus"; + public const string EyePlusOutline = "EyePlusOutline"; + public const string EyeRemove = "EyeRemove"; + public const string EyeRemoveOutline = "EyeRemoveOutline"; + public const string EyeSettings = "EyeSettings"; + public const string EyeSettingsOutline = "EyeSettingsOutline"; + public const string FaceAgent = "FaceAgent"; + public const string Facebook = "Facebook"; + public const string FacebookGaming = "FacebookGaming"; + public const string FacebookMessenger = "FacebookMessenger"; + public const string FacebookWorkplace = "FacebookWorkplace"; + public const string FaceMan = "FaceMan"; + public const string FaceManOutline = "FaceManOutline"; + public const string FaceManProfile = "FaceManProfile"; + public const string FaceManShimmer = "FaceManShimmer"; + public const string FaceManShimmerOutline = "FaceManShimmerOutline"; + public const string FaceMask = "FaceMask"; + public const string FaceMaskOutline = "FaceMaskOutline"; + public const string FaceRecognition = "FaceRecognition"; + public const string FaceWoman = "FaceWoman"; + public const string FaceWomanOutline = "FaceWomanOutline"; + public const string FaceWomanProfile = "FaceWomanProfile"; + public const string FaceWomanShimmer = "FaceWomanShimmer"; + public const string FaceWomanShimmerOutline = "FaceWomanShimmerOutline"; + public const string Factory = "Factory"; + public const string FamilyTree = "FamilyTree"; + public const string Fan = "Fan"; + public const string FanAlert = "FanAlert"; + public const string FanAuto = "FanAuto"; + public const string FanChevronDown = "FanChevronDown"; + public const string FanChevronUp = "FanChevronUp"; + public const string FanMinus = "FanMinus"; + public const string FanOff = "FanOff"; + public const string FanPlus = "FanPlus"; + public const string FanRemove = "FanRemove"; + public const string FanSpeed1 = "FanSpeed1"; + public const string FanSpeed2 = "FanSpeed2"; + public const string FanSpeed3 = "FanSpeed3"; + public const string FastForward = "FastForward"; + public const string FastForward10 = "FastForward10"; + public const string FastForward30 = "FastForward30"; + public const string FastForward5 = "FastForward5"; + public const string FastForward60 = "FastForward60"; + public const string FastForwardOutline = "FastForwardOutline"; + public const string Fax = "Fax"; + public const string Feather = "Feather"; + public const string FeatureSearch = "FeatureSearch"; + public const string FeatureSearchOutline = "FeatureSearchOutline"; + public const string Fedora = "Fedora"; + public const string Fence = "Fence"; + public const string FenceElectric = "FenceElectric"; + public const string Fencing = "Fencing"; + public const string FerrisWheel = "FerrisWheel"; + public const string Ferry = "Ferry"; + public const string File = "File"; + public const string FileAccount = "FileAccount"; + public const string FileAccountOutline = "FileAccountOutline"; + public const string FileAlert = "FileAlert"; + public const string FileAlertOutline = "FileAlertOutline"; + public const string FileCabinet = "FileCabinet"; + public const string FileCad = "FileCad"; + public const string FileCadBox = "FileCadBox"; + public const string FileCancel = "FileCancel"; + public const string FileCancelOutline = "FileCancelOutline"; + public const string FileCertificate = "FileCertificate"; + public const string FileCertificateOutline = "FileCertificateOutline"; + public const string FileChart = "FileChart"; + public const string FileChartOutline = "FileChartOutline"; + public const string FileCheck = "FileCheck"; + public const string FileCheckOutline = "FileCheckOutline"; + public const string FileClock = "FileClock"; + public const string FileClockOutline = "FileClockOutline"; + public const string FileCloud = "FileCloud"; + public const string FileCloudOutline = "FileCloudOutline"; + public const string FileCode = "FileCode"; + public const string FileCodeOutline = "FileCodeOutline"; + public const string FileCog = "FileCog"; + public const string FileCogOutline = "FileCogOutline"; + public const string FileCompare = "FileCompare"; + public const string FileDelimited = "FileDelimited"; + public const string FileDelimitedOutline = "FileDelimitedOutline"; + public const string FileDocument = "FileDocument"; + public const string FileDocumentEdit = "FileDocumentEdit"; + public const string FileDocumentEditOutline = "FileDocumentEditOutline"; + public const string FileDocumentMultiple = "FileDocumentMultiple"; + public const string FileDocumentMultipleOutline = "FileDocumentMultipleOutline"; + public const string FileDocumentOutline = "FileDocumentOutline"; + public const string FileDownload = "FileDownload"; + public const string FileDownloadOutline = "FileDownloadOutline"; + public const string FileEdit = "FileEdit"; + public const string FileEditOutline = "FileEditOutline"; + public const string FileExcel = "FileExcel"; + public const string FileExcelBox = "FileExcelBox"; + public const string FileExcelBoxOutline = "FileExcelBoxOutline"; + public const string FileExcelOutline = "FileExcelOutline"; + public const string FileExport = "FileExport"; + public const string FileExportOutline = "FileExportOutline"; + public const string FileEye = "FileEye"; + public const string FileEyeOutline = "FileEyeOutline"; + public const string FileFind = "FileFind"; + public const string FileFindOutline = "FileFindOutline"; + public const string FileGifBox = "FileGifBox"; + public const string FileHidden = "FileHidden"; + public const string FileImage = "FileImage"; + public const string FileImageMarker = "FileImageMarker"; + public const string FileImageMarkerOutline = "FileImageMarkerOutline"; + public const string FileImageOutline = "FileImageOutline"; + public const string FileImport = "FileImport"; + public const string FileImportOutline = "FileImportOutline"; + public const string FileJpgBox = "FileJpgBox"; + public const string FileKey = "FileKey"; + public const string FileKeyOutline = "FileKeyOutline"; + public const string FileLink = "FileLink"; + public const string FileLinkOutline = "FileLinkOutline"; + public const string FileLock = "FileLock"; + public const string FileLockOutline = "FileLockOutline"; + public const string FileMarker = "FileMarker"; + public const string FileMarkerOutline = "FileMarkerOutline"; + public const string FileMove = "FileMove"; + public const string FileMoveOutline = "FileMoveOutline"; + public const string FileMultiple = "FileMultiple"; + public const string FileMultipleOutline = "FileMultipleOutline"; + public const string FileMusic = "FileMusic"; + public const string FileMusicOutline = "FileMusicOutline"; + public const string FileOutline = "FileOutline"; + public const string FilePdfBox = "FilePdfBox"; + public const string FilePercent = "FilePercent"; + public const string FilePercentOutline = "FilePercentOutline"; + public const string FilePhone = "FilePhone"; + public const string FilePhoneOutline = "FilePhoneOutline"; + public const string FilePlus = "FilePlus"; + public const string FilePlusOutline = "FilePlusOutline"; + public const string FilePngBox = "FilePngBox"; + public const string FilePowerpoint = "FilePowerpoint"; + public const string FilePowerpointBox = "FilePowerpointBox"; + public const string FilePowerpointBoxOutline = "FilePowerpointBoxOutline"; + public const string FilePowerpointOutline = "FilePowerpointOutline"; + public const string FilePresentationBox = "FilePresentationBox"; + public const string FileQuestion = "FileQuestion"; + public const string FileQuestionOutline = "FileQuestionOutline"; + public const string FileRefresh = "FileRefresh"; + public const string FileRefreshOutline = "FileRefreshOutline"; + public const string FileRemove = "FileRemove"; + public const string FileRemoveOutline = "FileRemoveOutline"; + public const string FileReplace = "FileReplace"; + public const string FileReplaceOutline = "FileReplaceOutline"; + public const string FileRestore = "FileRestore"; + public const string FileRestoreOutline = "FileRestoreOutline"; + public const string FileSearch = "FileSearch"; + public const string FileSearchOutline = "FileSearchOutline"; + public const string FileSend = "FileSend"; + public const string FileSendOutline = "FileSendOutline"; + public const string FileSettings = "FileSettings"; + public const string FileSettingsOutline = "FileSettingsOutline"; + public const string FileStar = "FileStar"; + public const string FileStarOutline = "FileStarOutline"; + public const string FileSwap = "FileSwap"; + public const string FileSwapOutline = "FileSwapOutline"; + public const string FileSync = "FileSync"; + public const string FileSyncOutline = "FileSyncOutline"; + public const string FileTable = "FileTable"; + public const string FileTableBox = "FileTableBox"; + public const string FileTableBoxMultiple = "FileTableBoxMultiple"; + public const string FileTableBoxMultipleOutline = "FileTableBoxMultipleOutline"; + public const string FileTableBoxOutline = "FileTableBoxOutline"; + public const string FileTableOutline = "FileTableOutline"; + public const string FileTree = "FileTree"; + public const string FileTreeOutline = "FileTreeOutline"; + public const string FileUndo = "FileUndo"; + public const string FileUndoOutline = "FileUndoOutline"; + public const string FileUpload = "FileUpload"; + public const string FileUploadOutline = "FileUploadOutline"; + public const string FileVideo = "FileVideo"; + public const string FileVideoOutline = "FileVideoOutline"; + public const string FileWord = "FileWord"; + public const string FileWordBox = "FileWordBox"; + public const string FileWordBoxOutline = "FileWordBoxOutline"; + public const string FileWordOutline = "FileWordOutline"; + public const string Film = "Film"; + public const string Filmstrip = "Filmstrip"; + public const string FilmstripBox = "FilmstripBox"; + public const string FilmstripBoxMultiple = "FilmstripBoxMultiple"; + public const string FilmstripOff = "FilmstripOff"; + public const string Filter = "Filter"; + public const string FilterCheck = "FilterCheck"; + public const string FilterCheckOutline = "FilterCheckOutline"; + public const string FilterMenu = "FilterMenu"; + public const string FilterMenuOutline = "FilterMenuOutline"; + public const string FilterMinus = "FilterMinus"; + public const string FilterMinusOutline = "FilterMinusOutline"; + public const string FilterOff = "FilterOff"; + public const string FilterOffOutline = "FilterOffOutline"; + public const string FilterOutline = "FilterOutline"; + public const string FilterPlus = "FilterPlus"; + public const string FilterPlusOutline = "FilterPlusOutline"; + public const string FilterRemove = "FilterRemove"; + public const string FilterRemoveOutline = "FilterRemoveOutline"; + public const string FilterVariant = "FilterVariant"; + public const string FilterVariantMinus = "FilterVariantMinus"; + public const string FilterVariantPlus = "FilterVariantPlus"; + public const string FilterVariantRemove = "FilterVariantRemove"; + public const string Finance = "Finance"; + public const string FindReplace = "FindReplace"; + public const string Fingerprint = "Fingerprint"; + public const string FingerprintOff = "FingerprintOff"; + public const string Fire = "Fire"; + public const string FireAlert = "FireAlert"; + public const string Firebase = "Firebase"; + public const string FireCircle = "FireCircle"; + public const string FireExtinguisher = "FireExtinguisher"; + public const string Firefox = "Firefox"; + public const string FireHydrant = "FireHydrant"; + public const string FireHydrantAlert = "FireHydrantAlert"; + public const string FireHydrantOff = "FireHydrantOff"; + public const string FireOff = "FireOff"; + public const string Fireplace = "Fireplace"; + public const string FireplaceOff = "FireplaceOff"; + public const string FireTruck = "FireTruck"; + public const string Firewire = "Firewire"; + public const string Firework = "Firework"; + public const string FireworkOff = "FireworkOff"; + public const string Fish = "Fish"; + public const string Fishbowl = "Fishbowl"; + public const string FishbowlOutline = "FishbowlOutline"; + public const string FishOff = "FishOff"; + public const string FitToPage = "FitToPage"; + public const string FitToPageOutline = "FitToPageOutline"; + public const string FitToScreen = "FitToScreen"; + public const string FitToScreenOutline = "FitToScreenOutline"; + public const string Flag = "Flag"; + public const string FlagCheckered = "FlagCheckered"; + public const string FlagMinus = "FlagMinus"; + public const string FlagMinusOutline = "FlagMinusOutline"; + public const string FlagOff = "FlagOff"; + public const string FlagOffOutline = "FlagOffOutline"; + public const string FlagOutline = "FlagOutline"; + public const string FlagPlus = "FlagPlus"; + public const string FlagPlusOutline = "FlagPlusOutline"; + public const string FlagRemove = "FlagRemove"; + public const string FlagRemoveOutline = "FlagRemoveOutline"; + public const string FlagTriangle = "FlagTriangle"; + public const string FlagVariant = "FlagVariant"; + public const string FlagVariantOutline = "FlagVariantOutline"; + public const string Flare = "Flare"; + public const string Flash = "Flash"; + public const string FlashAlert = "FlashAlert"; + public const string FlashAlertOutline = "FlashAlertOutline"; + public const string FlashAuto = "FlashAuto"; + public const string Flashlight = "Flashlight"; + public const string FlashlightOff = "FlashlightOff"; + public const string FlashOff = "FlashOff"; + public const string FlashOutline = "FlashOutline"; + public const string FlashRedEye = "FlashRedEye"; + public const string Flask = "Flask"; + public const string FlaskEmpty = "FlaskEmpty"; + public const string FlaskEmptyMinus = "FlaskEmptyMinus"; + public const string FlaskEmptyMinusOutline = "FlaskEmptyMinusOutline"; + public const string FlaskEmptyOff = "FlaskEmptyOff"; + public const string FlaskEmptyOffOutline = "FlaskEmptyOffOutline"; + public const string FlaskEmptyOutline = "FlaskEmptyOutline"; + public const string FlaskEmptyPlus = "FlaskEmptyPlus"; + public const string FlaskEmptyPlusOutline = "FlaskEmptyPlusOutline"; + public const string FlaskEmptyRemove = "FlaskEmptyRemove"; + public const string FlaskEmptyRemoveOutline = "FlaskEmptyRemoveOutline"; + public const string FlaskMinus = "FlaskMinus"; + public const string FlaskMinusOutline = "FlaskMinusOutline"; + public const string FlaskOff = "FlaskOff"; + public const string FlaskOffOutline = "FlaskOffOutline"; + public const string FlaskOutline = "FlaskOutline"; + public const string FlaskPlus = "FlaskPlus"; + public const string FlaskPlusOutline = "FlaskPlusOutline"; + public const string FlaskRemove = "FlaskRemove"; + public const string FlaskRemoveOutline = "FlaskRemoveOutline"; + public const string FlaskRoundBottom = "FlaskRoundBottom"; + public const string FlaskRoundBottomEmpty = "FlaskRoundBottomEmpty"; + public const string FlaskRoundBottomEmptyOutline = "FlaskRoundBottomEmptyOutline"; + public const string FlaskRoundBottomOutline = "FlaskRoundBottomOutline"; + public const string FleurDeLis = "FleurDeLis"; + public const string FlipHorizontal = "FlipHorizontal"; + public const string FlipToBack = "FlipToBack"; + public const string FlipToFront = "FlipToFront"; + public const string FlipVertical = "FlipVertical"; + public const string FloorLamp = "FloorLamp"; + public const string FloorLampDual = "FloorLampDual"; + public const string FloorLampDualOutline = "FloorLampDualOutline"; + public const string FloorLampOutline = "FloorLampOutline"; + public const string FloorLampTorchiere = "FloorLampTorchiere"; + public const string FloorLampTorchiereOutline = "FloorLampTorchiereOutline"; + public const string FloorLampTorchiereVariant = "FloorLampTorchiereVariant"; + public const string FloorLampTorchiereVariantOutline = "FloorLampTorchiereVariantOutline"; + public const string FloorPlan = "FloorPlan"; + public const string Floppy = "Floppy"; + public const string FloppyVariant = "FloppyVariant"; + public const string Flower = "Flower"; + public const string FlowerOutline = "FlowerOutline"; + public const string FlowerPollen = "FlowerPollen"; + public const string FlowerPollenOutline = "FlowerPollenOutline"; + public const string FlowerPoppy = "FlowerPoppy"; + public const string FlowerTulip = "FlowerTulip"; + public const string FlowerTulipOutline = "FlowerTulipOutline"; + public const string FocusAuto = "FocusAuto"; + public const string FocusField = "FocusField"; + public const string FocusFieldHorizontal = "FocusFieldHorizontal"; + public const string FocusFieldVertical = "FocusFieldVertical"; + public const string Folder = "Folder"; + public const string FolderAccount = "FolderAccount"; + public const string FolderAccountOutline = "FolderAccountOutline"; + public const string FolderAlert = "FolderAlert"; + public const string FolderAlertOutline = "FolderAlertOutline"; + public const string FolderClock = "FolderClock"; + public const string FolderClockOutline = "FolderClockOutline"; + public const string FolderCog = "FolderCog"; + public const string FolderCogOutline = "FolderCogOutline"; + public const string FolderDownload = "FolderDownload"; + public const string FolderDownloadOutline = "FolderDownloadOutline"; + public const string FolderEdit = "FolderEdit"; + public const string FolderEditOutline = "FolderEditOutline"; + public const string FolderEye = "FolderEye"; + public const string FolderEyeOutline = "FolderEyeOutline"; + public const string FolderGoogleDrive = "FolderGoogleDrive"; + public const string FolderHeart = "FolderHeart"; + public const string FolderHeartOutline = "FolderHeartOutline"; + public const string FolderHidden = "FolderHidden"; + public const string FolderHome = "FolderHome"; + public const string FolderHomeOutline = "FolderHomeOutline"; + public const string FolderImage = "FolderImage"; + public const string FolderInformation = "FolderInformation"; + public const string FolderInformationOutline = "FolderInformationOutline"; + public const string FolderKey = "FolderKey"; + public const string FolderKeyNetwork = "FolderKeyNetwork"; + public const string FolderKeyNetworkOutline = "FolderKeyNetworkOutline"; + public const string FolderKeyOutline = "FolderKeyOutline"; + public const string FolderLock = "FolderLock"; + public const string FolderLockOpen = "FolderLockOpen"; + public const string FolderMarker = "FolderMarker"; + public const string FolderMarkerOutline = "FolderMarkerOutline"; + public const string FolderMove = "FolderMove"; + public const string FolderMoveOutline = "FolderMoveOutline"; + public const string FolderMultiple = "FolderMultiple"; + public const string FolderMultipleImage = "FolderMultipleImage"; + public const string FolderMultipleOutline = "FolderMultipleOutline"; + public const string FolderMultiplePlus = "FolderMultiplePlus"; + public const string FolderMultiplePlusOutline = "FolderMultiplePlusOutline"; + public const string FolderMusic = "FolderMusic"; + public const string FolderMusicOutline = "FolderMusicOutline"; + public const string FolderNetwork = "FolderNetwork"; + public const string FolderNetworkOutline = "FolderNetworkOutline"; + public const string FolderOpen = "FolderOpen"; + public const string FolderOpenOutline = "FolderOpenOutline"; + public const string FolderOutline = "FolderOutline"; + public const string FolderPlus = "FolderPlus"; + public const string FolderPlusOutline = "FolderPlusOutline"; + public const string FolderPound = "FolderPound"; + public const string FolderPoundOutline = "FolderPoundOutline"; + public const string FolderRefresh = "FolderRefresh"; + public const string FolderRefreshOutline = "FolderRefreshOutline"; + public const string FolderRemove = "FolderRemove"; + public const string FolderRemoveOutline = "FolderRemoveOutline"; + public const string FolderSearch = "FolderSearch"; + public const string FolderSearchOutline = "FolderSearchOutline"; + public const string FolderSettings = "FolderSettings"; + public const string FolderSettingsOutline = "FolderSettingsOutline"; + public const string FolderStar = "FolderStar"; + public const string FolderStarMultiple = "FolderStarMultiple"; + public const string FolderStarMultipleOutline = "FolderStarMultipleOutline"; + public const string FolderStarOutline = "FolderStarOutline"; + public const string FolderSwap = "FolderSwap"; + public const string FolderSwapOutline = "FolderSwapOutline"; + public const string FolderSync = "FolderSync"; + public const string FolderSyncOutline = "FolderSyncOutline"; + public const string FolderTable = "FolderTable"; + public const string FolderTableOutline = "FolderTableOutline"; + public const string FolderText = "FolderText"; + public const string FolderTextOutline = "FolderTextOutline"; + public const string FolderUpload = "FolderUpload"; + public const string FolderUploadOutline = "FolderUploadOutline"; + public const string FolderZip = "FolderZip"; + public const string FolderZipOutline = "FolderZipOutline"; + public const string FontAwesome = "FontAwesome"; + public const string Food = "Food"; + public const string FoodApple = "FoodApple"; + public const string FoodAppleOutline = "FoodAppleOutline"; + public const string FoodCroissant = "FoodCroissant"; + public const string FoodDrumstick = "FoodDrumstick"; + public const string FoodDrumstickOff = "FoodDrumstickOff"; + public const string FoodDrumstickOffOutline = "FoodDrumstickOffOutline"; + public const string FoodDrumstickOutline = "FoodDrumstickOutline"; + public const string FoodForkDrink = "FoodForkDrink"; + public const string FoodHalal = "FoodHalal"; + public const string FoodHotDog = "FoodHotDog"; + public const string FoodKosher = "FoodKosher"; + public const string FoodOff = "FoodOff"; + public const string FoodSteak = "FoodSteak"; + public const string FoodSteakOff = "FoodSteakOff"; + public const string FoodTakeoutBox = "FoodTakeoutBox"; + public const string FoodTakeoutBoxOutline = "FoodTakeoutBoxOutline"; + public const string FoodTurkey = "FoodTurkey"; + public const string FoodVariant = "FoodVariant"; + public const string FoodVariantOff = "FoodVariantOff"; + public const string Football = "Football"; + public const string FootballAustralian = "FootballAustralian"; + public const string FootballHelmet = "FootballHelmet"; + public const string FootPrint = "FootPrint"; + public const string Forest = "Forest"; + public const string Forklift = "Forklift"; + public const string FormatAlignBottom = "FormatAlignBottom"; + public const string FormatAlignCenter = "FormatAlignCenter"; + public const string FormatAlignJustify = "FormatAlignJustify"; + public const string FormatAlignLeft = "FormatAlignLeft"; + public const string FormatAlignMiddle = "FormatAlignMiddle"; + public const string FormatAlignRight = "FormatAlignRight"; + public const string FormatAlignTop = "FormatAlignTop"; + public const string FormatAnnotationMinus = "FormatAnnotationMinus"; + public const string FormatAnnotationPlus = "FormatAnnotationPlus"; + public const string FormatBold = "FormatBold"; + public const string FormatClear = "FormatClear"; + public const string FormatColorFill = "FormatColorFill"; + public const string FormatColorHighlight = "FormatColorHighlight"; + public const string FormatColorMarkerCancel = "FormatColorMarkerCancel"; + public const string FormatColorText = "FormatColorText"; + public const string FormatColumns = "FormatColumns"; + public const string FormatFloatCenter = "FormatFloatCenter"; + public const string FormatFloatLeft = "FormatFloatLeft"; + public const string FormatFloatNone = "FormatFloatNone"; + public const string FormatFloatRight = "FormatFloatRight"; + public const string FormatFont = "FormatFont"; + public const string FormatFontSizeDecrease = "FormatFontSizeDecrease"; + public const string FormatFontSizeIncrease = "FormatFontSizeIncrease"; + public const string FormatHeader1 = "FormatHeader1"; + public const string FormatHeader2 = "FormatHeader2"; + public const string FormatHeader3 = "FormatHeader3"; + public const string FormatHeader4 = "FormatHeader4"; + public const string FormatHeader5 = "FormatHeader5"; + public const string FormatHeader6 = "FormatHeader6"; + public const string FormatHeaderDecrease = "FormatHeaderDecrease"; + public const string FormatHeaderEqual = "FormatHeaderEqual"; + public const string FormatHeaderIncrease = "FormatHeaderIncrease"; + public const string FormatHeaderPound = "FormatHeaderPound"; + public const string FormatHorizontalAlignCenter = "FormatHorizontalAlignCenter"; + public const string FormatHorizontalAlignLeft = "FormatHorizontalAlignLeft"; + public const string FormatHorizontalAlignRight = "FormatHorizontalAlignRight"; + public const string FormatIndentDecrease = "FormatIndentDecrease"; + public const string FormatIndentIncrease = "FormatIndentIncrease"; + public const string FormatItalic = "FormatItalic"; + public const string FormatLetterCase = "FormatLetterCase"; + public const string FormatLetterCaseLower = "FormatLetterCaseLower"; + public const string FormatLetterCaseUpper = "FormatLetterCaseUpper"; + public const string FormatLetterEndsWith = "FormatLetterEndsWith"; + public const string FormatLetterMatches = "FormatLetterMatches"; + public const string FormatLetterStartsWith = "FormatLetterStartsWith"; + public const string FormatLineSpacing = "FormatLineSpacing"; + public const string FormatLineStyle = "FormatLineStyle"; + public const string FormatLineWeight = "FormatLineWeight"; + public const string FormatListBulleted = "FormatListBulleted"; + public const string FormatListBulletedSquare = "FormatListBulletedSquare"; + public const string FormatListBulletedTriangle = "FormatListBulletedTriangle"; + public const string FormatListBulletedType = "FormatListBulletedType"; + public const string FormatListCheckbox = "FormatListCheckbox"; + public const string FormatListChecks = "FormatListChecks"; + public const string FormatListGroup = "FormatListGroup"; + public const string FormatListNumbered = "FormatListNumbered"; + public const string FormatListNumberedRtl = "FormatListNumberedRtl"; + public const string FormatListText = "FormatListText"; + public const string FormatOverline = "FormatOverline"; + public const string FormatPageBreak = "FormatPageBreak"; + public const string FormatPaint = "FormatPaint"; + public const string FormatParagraph = "FormatParagraph"; + public const string FormatPilcrow = "FormatPilcrow"; + public const string FormatQuoteClose = "FormatQuoteClose"; + public const string FormatQuoteCloseOutline = "FormatQuoteCloseOutline"; + public const string FormatQuoteOpen = "FormatQuoteOpen"; + public const string FormatQuoteOpenOutline = "FormatQuoteOpenOutline"; + public const string FormatRotate90 = "FormatRotate90"; + public const string FormatSection = "FormatSection"; + public const string FormatSize = "FormatSize"; + public const string FormatStrikethrough = "FormatStrikethrough"; + public const string FormatStrikethroughVariant = "FormatStrikethroughVariant"; + public const string FormatSubscript = "FormatSubscript"; + public const string FormatSuperscript = "FormatSuperscript"; + public const string FormatText = "FormatText"; + public const string FormatTextbox = "FormatTextbox"; + public const string FormatTextdirectionLToR = "FormatTextdirectionLToR"; + public const string FormatTextdirectionRToL = "FormatTextdirectionRToL"; + public const string FormatTextRotationAngleDown = "FormatTextRotationAngleDown"; + public const string FormatTextRotationAngleUp = "FormatTextRotationAngleUp"; + public const string FormatTextRotationDown = "FormatTextRotationDown"; + public const string FormatTextRotationDownVertical = "FormatTextRotationDownVertical"; + public const string FormatTextRotationNone = "FormatTextRotationNone"; + public const string FormatTextRotationUp = "FormatTextRotationUp"; + public const string FormatTextRotationVertical = "FormatTextRotationVertical"; + public const string FormatTextVariant = "FormatTextVariant"; + public const string FormatTextVariantOutline = "FormatTextVariantOutline"; + public const string FormatTextWrappingClip = "FormatTextWrappingClip"; + public const string FormatTextWrappingOverflow = "FormatTextWrappingOverflow"; + public const string FormatTextWrappingWrap = "FormatTextWrappingWrap"; + public const string FormatTitle = "FormatTitle"; + public const string FormatUnderline = "FormatUnderline"; + public const string FormatUnderlineWavy = "FormatUnderlineWavy"; + public const string FormatVerticalAlignBottom = "FormatVerticalAlignBottom"; + public const string FormatVerticalAlignCenter = "FormatVerticalAlignCenter"; + public const string FormatVerticalAlignTop = "FormatVerticalAlignTop"; + public const string FormatWrapInline = "FormatWrapInline"; + public const string FormatWrapSquare = "FormatWrapSquare"; + public const string FormatWrapTight = "FormatWrapTight"; + public const string FormatWrapTopBottom = "FormatWrapTopBottom"; + public const string FormDropdown = "FormDropdown"; + public const string FormSelect = "FormSelect"; + public const string FormTextarea = "FormTextarea"; + public const string FormTextbox = "FormTextbox"; + public const string FormTextboxLock = "FormTextboxLock"; + public const string FormTextboxPassword = "FormTextboxPassword"; + public const string Forum = "Forum"; + public const string ForumOutline = "ForumOutline"; + public const string Forward = "Forward"; + public const string Forwardburger = "Forwardburger"; + public const string Fountain = "Fountain"; + public const string FountainPen = "FountainPen"; + public const string FountainPenTip = "FountainPenTip"; + public const string Freebsd = "Freebsd"; + public const string FrequentlyAskedQuestions = "FrequentlyAskedQuestions"; + public const string Fridge = "Fridge"; + public const string FridgeAlert = "FridgeAlert"; + public const string FridgeAlertOutline = "FridgeAlertOutline"; + public const string FridgeBottom = "FridgeBottom"; + public const string FridgeIndustrial = "FridgeIndustrial"; + public const string FridgeIndustrialAlert = "FridgeIndustrialAlert"; + public const string FridgeIndustrialAlertOutline = "FridgeIndustrialAlertOutline"; + public const string FridgeIndustrialOff = "FridgeIndustrialOff"; + public const string FridgeIndustrialOffOutline = "FridgeIndustrialOffOutline"; + public const string FridgeIndustrialOutline = "FridgeIndustrialOutline"; + public const string FridgeOff = "FridgeOff"; + public const string FridgeOffOutline = "FridgeOffOutline"; + public const string FridgeOutline = "FridgeOutline"; + public const string FridgeTop = "FridgeTop"; + public const string FridgeVariant = "FridgeVariant"; + public const string FridgeVariantAlert = "FridgeVariantAlert"; + public const string FridgeVariantAlertOutline = "FridgeVariantAlertOutline"; + public const string FridgeVariantOff = "FridgeVariantOff"; + public const string FridgeVariantOffOutline = "FridgeVariantOffOutline"; + public const string FridgeVariantOutline = "FridgeVariantOutline"; + public const string FruitCherries = "FruitCherries"; + public const string FruitCherriesOff = "FruitCherriesOff"; + public const string FruitCitrus = "FruitCitrus"; + public const string FruitCitrusOff = "FruitCitrusOff"; + public const string FruitGrapes = "FruitGrapes"; + public const string FruitGrapesOutline = "FruitGrapesOutline"; + public const string FruitPineapple = "FruitPineapple"; + public const string FruitWatermelon = "FruitWatermelon"; + public const string Fuel = "Fuel"; + public const string FuelCell = "FuelCell"; + public const string Fullscreen = "Fullscreen"; + public const string FullscreenExit = "FullscreenExit"; + public const string Function = "Function"; + public const string FunctionVariant = "FunctionVariant"; + public const string FuriganaHorizontal = "FuriganaHorizontal"; + public const string FuriganaVertical = "FuriganaVertical"; + public const string Fuse = "Fuse"; + public const string FuseAlert = "FuseAlert"; + public const string FuseBlade = "FuseBlade"; + public const string FuseOff = "FuseOff"; + public const string Gamepad = "Gamepad"; + public const string GamepadCircle = "GamepadCircle"; + public const string GamepadCircleDown = "GamepadCircleDown"; + public const string GamepadCircleLeft = "GamepadCircleLeft"; + public const string GamepadCircleOutline = "GamepadCircleOutline"; + public const string GamepadCircleRight = "GamepadCircleRight"; + public const string GamepadCircleUp = "GamepadCircleUp"; + public const string GamepadDown = "GamepadDown"; + public const string GamepadLeft = "GamepadLeft"; + public const string GamepadRight = "GamepadRight"; + public const string GamepadRound = "GamepadRound"; + public const string GamepadRoundDown = "GamepadRoundDown"; + public const string GamepadRoundLeft = "GamepadRoundLeft"; + public const string GamepadRoundOutline = "GamepadRoundOutline"; + public const string GamepadRoundRight = "GamepadRoundRight"; + public const string GamepadRoundUp = "GamepadRoundUp"; + public const string GamepadSquare = "GamepadSquare"; + public const string GamepadSquareOutline = "GamepadSquareOutline"; + public const string GamepadUp = "GamepadUp"; + public const string GamepadVariant = "GamepadVariant"; + public const string GamepadVariantOutline = "GamepadVariantOutline"; + public const string Gamma = "Gamma"; + public const string GantryCrane = "GantryCrane"; + public const string Garage = "Garage"; + public const string GarageAlert = "GarageAlert"; + public const string GarageAlertVariant = "GarageAlertVariant"; + public const string GarageLock = "GarageLock"; + public const string GarageOpen = "GarageOpen"; + public const string GarageOpenVariant = "GarageOpenVariant"; + public const string GarageVariant = "GarageVariant"; + public const string GarageVariantLock = "GarageVariantLock"; + public const string GasCylinder = "GasCylinder"; + public const string GasStation = "GasStation"; + public const string GasStationOff = "GasStationOff"; + public const string GasStationOffOutline = "GasStationOffOutline"; + public const string GasStationOutline = "GasStationOutline"; + public const string Gate = "Gate"; + public const string GateAlert = "GateAlert"; + public const string GateAnd = "GateAnd"; + public const string GateArrowLeft = "GateArrowLeft"; + public const string GateArrowRight = "GateArrowRight"; + public const string GateNand = "GateNand"; + public const string GateNor = "GateNor"; + public const string GateNot = "GateNot"; + public const string GateOpen = "GateOpen"; + public const string GateOr = "GateOr"; + public const string GateXnor = "GateXnor"; + public const string GateXor = "GateXor"; + public const string Gatsby = "Gatsby"; + public const string Gauge = "Gauge"; + public const string GaugeEmpty = "GaugeEmpty"; + public const string GaugeFull = "GaugeFull"; + public const string GaugeLow = "GaugeLow"; + public const string Gavel = "Gavel"; + public const string GenderFemale = "GenderFemale"; + public const string GenderMale = "GenderMale"; + public const string GenderMaleFemale = "GenderMaleFemale"; + public const string GenderMaleFemaleVariant = "GenderMaleFemaleVariant"; + public const string GenderNonBinary = "GenderNonBinary"; + public const string GenderTransgender = "GenderTransgender"; + public const string Gentoo = "Gentoo"; + public const string Gesture = "Gesture"; + public const string GestureDoubleTap = "GestureDoubleTap"; + public const string GesturePinch = "GesturePinch"; + public const string GestureSpread = "GestureSpread"; + public const string GestureSwipe = "GestureSwipe"; + public const string GestureSwipeDown = "GestureSwipeDown"; + public const string GestureSwipeHorizontal = "GestureSwipeHorizontal"; + public const string GestureSwipeLeft = "GestureSwipeLeft"; + public const string GestureSwipeRight = "GestureSwipeRight"; + public const string GestureSwipeUp = "GestureSwipeUp"; + public const string GestureSwipeVertical = "GestureSwipeVertical"; + public const string GestureTap = "GestureTap"; + public const string GestureTapBox = "GestureTapBox"; + public const string GestureTapButton = "GestureTapButton"; + public const string GestureTapHold = "GestureTapHold"; + public const string GestureTwoDoubleTap = "GestureTwoDoubleTap"; + public const string GestureTwoTap = "GestureTwoTap"; + public const string Ghost = "Ghost"; + public const string GhostOff = "GhostOff"; + public const string GhostOffOutline = "GhostOffOutline"; + public const string GhostOutline = "GhostOutline"; + public const string Gift = "Gift"; + public const string GiftOff = "GiftOff"; + public const string GiftOffOutline = "GiftOffOutline"; + public const string GiftOpen = "GiftOpen"; + public const string GiftOpenOutline = "GiftOpenOutline"; + public const string GiftOutline = "GiftOutline"; + public const string Git = "Git"; + public const string Github = "Github"; + public const string Gitlab = "Gitlab"; + public const string GlassCocktail = "GlassCocktail"; + public const string GlassCocktailOff = "GlassCocktailOff"; + public const string Glasses = "Glasses"; + public const string GlassFlute = "GlassFlute"; + public const string GlassFragile = "GlassFragile"; + public const string GlassMug = "GlassMug"; + public const string GlassMugOff = "GlassMugOff"; + public const string GlassMugVariant = "GlassMugVariant"; + public const string GlassMugVariantOff = "GlassMugVariantOff"; + public const string GlassPintOutline = "GlassPintOutline"; + public const string GlassStange = "GlassStange"; + public const string GlassTulip = "GlassTulip"; + public const string GlassWine = "GlassWine"; + public const string GlobeLight = "GlobeLight"; + public const string GlobeModel = "GlobeModel"; + public const string Gmail = "Gmail"; + public const string Gnome = "Gnome"; + public const string Gog = "Gog"; + public const string GoKart = "GoKart"; + public const string GoKartTrack = "GoKartTrack"; + public const string Gold = "Gold"; + public const string Golf = "Golf"; + public const string GolfCart = "GolfCart"; + public const string GolfTee = "GolfTee"; + public const string Gondola = "Gondola"; + public const string Goodreads = "Goodreads"; + public const string Google = "Google"; + public const string GoogleAds = "GoogleAds"; + public const string GoogleAnalytics = "GoogleAnalytics"; + public const string GoogleAssistant = "GoogleAssistant"; + public const string GoogleCardboard = "GoogleCardboard"; + public const string GoogleChrome = "GoogleChrome"; + public const string GoogleCircles = "GoogleCircles"; + public const string GoogleCirclesCommunities = "GoogleCirclesCommunities"; + public const string GoogleCirclesExtended = "GoogleCirclesExtended"; + public const string GoogleCirclesGroup = "GoogleCirclesGroup"; + public const string GoogleClassroom = "GoogleClassroom"; + public const string GoogleCloud = "GoogleCloud"; + public const string GoogleController = "GoogleController"; + public const string GoogleControllerOff = "GoogleControllerOff"; + public const string GoogleDownasaur = "GoogleDownasaur"; + public const string GoogleDrive = "GoogleDrive"; + public const string GoogleEarth = "GoogleEarth"; + public const string GoogleFit = "GoogleFit"; + public const string GoogleGlass = "GoogleGlass"; + public const string GoogleHangouts = "GoogleHangouts"; + public const string GoogleHome = "GoogleHome"; + public const string GoogleKeep = "GoogleKeep"; + public const string GoogleLens = "GoogleLens"; + public const string GoogleMaps = "GoogleMaps"; + public const string GoogleMyBusiness = "GoogleMyBusiness"; + public const string GoogleNearby = "GoogleNearby"; + public const string GooglePlay = "GooglePlay"; + public const string GooglePlus = "GooglePlus"; + public const string GooglePodcast = "GooglePodcast"; + public const string GoogleSpreadsheet = "GoogleSpreadsheet"; + public const string GoogleStreetView = "GoogleStreetView"; + public const string GoogleTranslate = "GoogleTranslate"; + public const string GradientHorizontal = "GradientHorizontal"; + public const string GradientVertical = "GradientVertical"; + public const string Grain = "Grain"; + public const string Graph = "Graph"; + public const string GraphOutline = "GraphOutline"; + public const string Graphql = "Graphql"; + public const string Grass = "Grass"; + public const string GraveStone = "GraveStone"; + public const string GreasePencil = "GreasePencil"; + public const string GreaterThan = "GreaterThan"; + public const string GreaterThanOrEqual = "GreaterThanOrEqual"; + public const string Greenhouse = "Greenhouse"; + public const string Grid = "Grid"; + public const string GridLarge = "GridLarge"; + public const string GridOff = "GridOff"; + public const string Grill = "Grill"; + public const string GrillOutline = "GrillOutline"; + public const string Group = "Group"; + public const string GuitarAcoustic = "GuitarAcoustic"; + public const string GuitarElectric = "GuitarElectric"; + public const string GuitarPick = "GuitarPick"; + public const string GuitarPickOutline = "GuitarPickOutline"; + public const string GuyFawkesMask = "GuyFawkesMask"; + public const string Hail = "Hail"; + public const string HairDryer = "HairDryer"; + public const string HairDryerOutline = "HairDryerOutline"; + public const string Halloween = "Halloween"; + public const string Hamburger = "Hamburger"; + public const string HamburgerCheck = "HamburgerCheck"; + public const string HamburgerMinus = "HamburgerMinus"; + public const string HamburgerOff = "HamburgerOff"; + public const string HamburgerPlus = "HamburgerPlus"; + public const string HamburgerRemove = "HamburgerRemove"; + public const string Hammer = "Hammer"; + public const string HammerScrewdriver = "HammerScrewdriver"; + public const string HammerSickle = "HammerSickle"; + public const string HammerWrench = "HammerWrench"; + public const string HandBackLeft = "HandBackLeft"; + public const string HandBackLeftOff = "HandBackLeftOff"; + public const string HandBackLeftOffOutline = "HandBackLeftOffOutline"; + public const string HandBackLeftOutline = "HandBackLeftOutline"; + public const string HandBackRight = "HandBackRight"; + public const string HandBackRightOff = "HandBackRightOff"; + public const string HandBackRightOffOutline = "HandBackRightOffOutline"; + public const string HandBackRightOutline = "HandBackRightOutline"; + public const string Handball = "Handball"; + public const string HandCoin = "HandCoin"; + public const string HandCoinOutline = "HandCoinOutline"; + public const string Handcuffs = "Handcuffs"; + public const string HandExtended = "HandExtended"; + public const string HandExtendedOutline = "HandExtendedOutline"; + public const string HandFrontLeft = "HandFrontLeft"; + public const string HandFrontLeftOutline = "HandFrontLeftOutline"; + public const string HandFrontRight = "HandFrontRight"; + public const string HandFrontRightOutline = "HandFrontRightOutline"; + public const string HandHeart = "HandHeart"; + public const string HandHeartOutline = "HandHeartOutline"; + public const string HandOkay = "HandOkay"; + public const string HandPeace = "HandPeace"; + public const string HandPeaceVariant = "HandPeaceVariant"; + public const string HandPointingDown = "HandPointingDown"; + public const string HandPointingLeft = "HandPointingLeft"; + public const string HandPointingRight = "HandPointingRight"; + public const string HandPointingUp = "HandPointingUp"; + public const string HandSaw = "HandSaw"; + public const string Handshake = "Handshake"; + public const string HandshakeOutline = "HandshakeOutline"; + public const string HandsPray = "HandsPray"; + public const string HandWash = "HandWash"; + public const string HandWashOutline = "HandWashOutline"; + public const string HandWater = "HandWater"; + public const string HandWave = "HandWave"; + public const string HandWaveOutline = "HandWaveOutline"; + public const string Hanger = "Hanger"; + public const string Harddisk = "Harddisk"; + public const string HarddiskPlus = "HarddiskPlus"; + public const string HarddiskRemove = "HarddiskRemove"; + public const string HardHat = "HardHat"; + public const string HatFedora = "HatFedora"; + public const string HazardLights = "HazardLights"; + public const string Hdr = "Hdr"; + public const string HdrOff = "HdrOff"; + public const string Head = "Head"; + public const string HeadAlert = "HeadAlert"; + public const string HeadAlertOutline = "HeadAlertOutline"; + public const string HeadCheck = "HeadCheck"; + public const string HeadCheckOutline = "HeadCheckOutline"; + public const string HeadCog = "HeadCog"; + public const string HeadCogOutline = "HeadCogOutline"; + public const string HeadDotsHorizontal = "HeadDotsHorizontal"; + public const string HeadDotsHorizontalOutline = "HeadDotsHorizontalOutline"; + public const string HeadFlash = "HeadFlash"; + public const string HeadFlashOutline = "HeadFlashOutline"; + public const string HeadHeart = "HeadHeart"; + public const string HeadHeartOutline = "HeadHeartOutline"; + public const string HeadLightbulb = "HeadLightbulb"; + public const string HeadLightbulbOutline = "HeadLightbulbOutline"; + public const string HeadMinus = "HeadMinus"; + public const string HeadMinusOutline = "HeadMinusOutline"; + public const string HeadOutline = "HeadOutline"; + public const string Headphones = "Headphones"; + public const string HeadphonesBluetooth = "HeadphonesBluetooth"; + public const string HeadphonesBox = "HeadphonesBox"; + public const string HeadphonesOff = "HeadphonesOff"; + public const string HeadphonesSettings = "HeadphonesSettings"; + public const string HeadPlus = "HeadPlus"; + public const string HeadPlusOutline = "HeadPlusOutline"; + public const string HeadQuestion = "HeadQuestion"; + public const string HeadQuestionOutline = "HeadQuestionOutline"; + public const string HeadRemove = "HeadRemove"; + public const string HeadRemoveOutline = "HeadRemoveOutline"; + public const string Headset = "Headset"; + public const string HeadsetDock = "HeadsetDock"; + public const string HeadsetOff = "HeadsetOff"; + public const string HeadSnowflake = "HeadSnowflake"; + public const string HeadSnowflakeOutline = "HeadSnowflakeOutline"; + public const string HeadSync = "HeadSync"; + public const string HeadSyncOutline = "HeadSyncOutline"; + public const string Heart = "Heart"; + public const string HeartBox = "HeartBox"; + public const string HeartBoxOutline = "HeartBoxOutline"; + public const string HeartBroken = "HeartBroken"; + public const string HeartBrokenOutline = "HeartBrokenOutline"; + public const string HeartCircle = "HeartCircle"; + public const string HeartCircleOutline = "HeartCircleOutline"; + public const string HeartCog = "HeartCog"; + public const string HeartCogOutline = "HeartCogOutline"; + public const string HeartFlash = "HeartFlash"; + public const string HeartHalf = "HeartHalf"; + public const string HeartHalfFull = "HeartHalfFull"; + public const string HeartHalfOutline = "HeartHalfOutline"; + public const string HeartMinus = "HeartMinus"; + public const string HeartMinusOutline = "HeartMinusOutline"; + public const string HeartMultiple = "HeartMultiple"; + public const string HeartMultipleOutline = "HeartMultipleOutline"; + public const string HeartOff = "HeartOff"; + public const string HeartOffOutline = "HeartOffOutline"; + public const string HeartOutline = "HeartOutline"; + public const string HeartPlus = "HeartPlus"; + public const string HeartPlusOutline = "HeartPlusOutline"; + public const string HeartPulse = "HeartPulse"; + public const string HeartRemove = "HeartRemove"; + public const string HeartRemoveOutline = "HeartRemoveOutline"; + public const string HeartSettings = "HeartSettings"; + public const string HeartSettingsOutline = "HeartSettingsOutline"; + public const string Helicopter = "Helicopter"; + public const string Help = "Help"; + public const string HelpBox = "HelpBox"; + public const string HelpCircle = "HelpCircle"; + public const string HelpCircleOutline = "HelpCircleOutline"; + public const string HelpNetwork = "HelpNetwork"; + public const string HelpNetworkOutline = "HelpNetworkOutline"; + public const string HelpRhombus = "HelpRhombus"; + public const string HelpRhombusOutline = "HelpRhombusOutline"; + public const string Hexadecimal = "Hexadecimal"; + public const string Hexagon = "Hexagon"; + public const string HexagonMultiple = "HexagonMultiple"; + public const string HexagonMultipleOutline = "HexagonMultipleOutline"; + public const string HexagonOutline = "HexagonOutline"; + public const string HexagonSlice1 = "HexagonSlice1"; + public const string HexagonSlice2 = "HexagonSlice2"; + public const string HexagonSlice3 = "HexagonSlice3"; + public const string HexagonSlice4 = "HexagonSlice4"; + public const string HexagonSlice5 = "HexagonSlice5"; + public const string HexagonSlice6 = "HexagonSlice6"; + public const string Hexagram = "Hexagram"; + public const string HexagramOutline = "HexagramOutline"; + public const string HighDefinition = "HighDefinition"; + public const string HighDefinitionBox = "HighDefinitionBox"; + public const string Highway = "Highway"; + public const string Hiking = "Hiking"; + public const string History = "History"; + public const string HockeyPuck = "HockeyPuck"; + public const string HockeySticks = "HockeySticks"; + public const string Hololens = "Hololens"; + public const string Home = "Home"; + public const string HomeAccount = "HomeAccount"; + public const string HomeAlert = "HomeAlert"; + public const string HomeAlertOutline = "HomeAlertOutline"; + public const string HomeAnalytics = "HomeAnalytics"; + public const string HomeAssistant = "HomeAssistant"; + public const string HomeAutomation = "HomeAutomation"; + public const string HomeCircle = "HomeCircle"; + public const string HomeCircleOutline = "HomeCircleOutline"; + public const string HomeCity = "HomeCity"; + public const string HomeCityOutline = "HomeCityOutline"; + public const string HomeEdit = "HomeEdit"; + public const string HomeEditOutline = "HomeEditOutline"; + public const string HomeExportOutline = "HomeExportOutline"; + public const string HomeFlood = "HomeFlood"; + public const string HomeFloor0 = "HomeFloor0"; + public const string HomeFloor1 = "HomeFloor1"; + public const string HomeFloor2 = "HomeFloor2"; + public const string HomeFloor3 = "HomeFloor3"; + public const string HomeFloorA = "HomeFloorA"; + public const string HomeFloorB = "HomeFloorB"; + public const string HomeFloorG = "HomeFloorG"; + public const string HomeFloorL = "HomeFloorL"; + public const string HomeFloorNegative1 = "HomeFloorNegative1"; + public const string HomeGroup = "HomeGroup"; + public const string HomeHeart = "HomeHeart"; + public const string HomeImportOutline = "HomeImportOutline"; + public const string HomeLightbulb = "HomeLightbulb"; + public const string HomeLightbulbOutline = "HomeLightbulbOutline"; + public const string HomeLock = "HomeLock"; + public const string HomeLockOpen = "HomeLockOpen"; + public const string HomeMapMarker = "HomeMapMarker"; + public const string HomeMinus = "HomeMinus"; + public const string HomeMinusOutline = "HomeMinusOutline"; + public const string HomeModern = "HomeModern"; + public const string HomeOutline = "HomeOutline"; + public const string HomePlus = "HomePlus"; + public const string HomePlusOutline = "HomePlusOutline"; + public const string HomeRemove = "HomeRemove"; + public const string HomeRemoveOutline = "HomeRemoveOutline"; + public const string HomeRoof = "HomeRoof"; + public const string HomeSearch = "HomeSearch"; + public const string HomeSearchOutline = "HomeSearchOutline"; + public const string HomeSwitch = "HomeSwitch"; + public const string HomeSwitchOutline = "HomeSwitchOutline"; + public const string HomeThermometer = "HomeThermometer"; + public const string HomeThermometerOutline = "HomeThermometerOutline"; + public const string HomeVariant = "HomeVariant"; + public const string HomeVariantOutline = "HomeVariantOutline"; + public const string Hook = "Hook"; + public const string HookOff = "HookOff"; + public const string HoopHouse = "HoopHouse"; + public const string Hops = "Hops"; + public const string HorizontalRotateClockwise = "HorizontalRotateClockwise"; + public const string HorizontalRotateCounterclockwise = "HorizontalRotateCounterclockwise"; + public const string Horse = "Horse"; + public const string HorseHuman = "HorseHuman"; + public const string Horseshoe = "Horseshoe"; + public const string HorseVariant = "HorseVariant"; + public const string HorseVariantFast = "HorseVariantFast"; + public const string Hospital = "Hospital"; + public const string HospitalBox = "HospitalBox"; + public const string HospitalBoxOutline = "HospitalBoxOutline"; + public const string HospitalBuilding = "HospitalBuilding"; + public const string HospitalMarker = "HospitalMarker"; + public const string HotTub = "HotTub"; + public const string Hours24 = "Hours24"; + public const string Hubspot = "Hubspot"; + public const string Hulu = "Hulu"; + public const string Human = "Human"; + public const string HumanBabyChangingTable = "HumanBabyChangingTable"; + public const string HumanCane = "HumanCane"; + public const string HumanCapacityDecrease = "HumanCapacityDecrease"; + public const string HumanCapacityIncrease = "HumanCapacityIncrease"; + public const string HumanChild = "HumanChild"; + public const string HumanEdit = "HumanEdit"; + public const string HumanFemale = "HumanFemale"; + public const string HumanFemaleBoy = "HumanFemaleBoy"; + public const string HumanFemaleDance = "HumanFemaleDance"; + public const string HumanFemaleFemale = "HumanFemaleFemale"; + public const string HumanFemaleGirl = "HumanFemaleGirl"; + public const string HumanGreeting = "HumanGreeting"; + public const string HumanGreetingProximity = "HumanGreetingProximity"; + public const string HumanGreetingVariant = "HumanGreetingVariant"; + public const string HumanHandsdown = "HumanHandsdown"; + public const string HumanHandsup = "HumanHandsup"; + public const string HumanMale = "HumanMale"; + public const string HumanMaleBoard = "HumanMaleBoard"; + public const string HumanMaleBoardPoll = "HumanMaleBoardPoll"; + public const string HumanMaleBoy = "HumanMaleBoy"; + public const string HumanMaleChild = "HumanMaleChild"; + public const string HumanMaleFemale = "HumanMaleFemale"; + public const string HumanMaleFemaleChild = "HumanMaleFemaleChild"; + public const string HumanMaleGirl = "HumanMaleGirl"; + public const string HumanMaleHeight = "HumanMaleHeight"; + public const string HumanMaleHeightVariant = "HumanMaleHeightVariant"; + public const string HumanMaleMale = "HumanMaleMale"; + public const string HumanNonBinary = "HumanNonBinary"; + public const string HumanPregnant = "HumanPregnant"; + public const string HumanQueue = "HumanQueue"; + public const string HumanScooter = "HumanScooter"; + public const string HumanWheelchair = "HumanWheelchair"; + public const string HumbleBundle = "HumbleBundle"; + public const string Hvac = "Hvac"; + public const string HvacOff = "HvacOff"; + public const string HydraulicOilLevel = "HydraulicOilLevel"; + public const string HydraulicOilTemperature = "HydraulicOilTemperature"; + public const string HydrogenStation = "HydrogenStation"; + public const string HydroPower = "HydroPower"; + public const string IceCream = "IceCream"; + public const string IceCreamOff = "IceCreamOff"; + public const string IcePop = "IcePop"; + public const string IdCard = "IdCard"; + public const string Identifier = "Identifier"; + public const string IdeogramCjk = "IdeogramCjk"; + public const string IdeogramCjkVariant = "IdeogramCjkVariant"; + public const string Image = "Image"; + public const string ImageAlbum = "ImageAlbum"; + public const string ImageArea = "ImageArea"; + public const string ImageAreaClose = "ImageAreaClose"; + public const string ImageAutoAdjust = "ImageAutoAdjust"; + public const string ImageBroken = "ImageBroken"; + public const string ImageBrokenVariant = "ImageBrokenVariant"; + public const string ImageEdit = "ImageEdit"; + public const string ImageEditOutline = "ImageEditOutline"; + public const string ImageFilterBlackWhite = "ImageFilterBlackWhite"; + public const string ImageFilterCenterFocus = "ImageFilterCenterFocus"; + public const string ImageFilterCenterFocusStrong = "ImageFilterCenterFocusStrong"; + public const string ImageFilterCenterFocusStrongOutline = "ImageFilterCenterFocusStrongOutline"; + public const string ImageFilterCenterFocusWeak = "ImageFilterCenterFocusWeak"; + public const string ImageFilterDrama = "ImageFilterDrama"; + public const string ImageFilterFrames = "ImageFilterFrames"; + public const string ImageFilterHdr = "ImageFilterHdr"; + public const string ImageFilterNone = "ImageFilterNone"; + public const string ImageFilterTiltShift = "ImageFilterTiltShift"; + public const string ImageFilterVintage = "ImageFilterVintage"; + public const string ImageFrame = "ImageFrame"; + public const string ImageMarker = "ImageMarker"; + public const string ImageMarkerOutline = "ImageMarkerOutline"; + public const string ImageMinus = "ImageMinus"; + public const string ImageMove = "ImageMove"; + public const string ImageMultiple = "ImageMultiple"; + public const string ImageMultipleOutline = "ImageMultipleOutline"; + public const string ImageOff = "ImageOff"; + public const string ImageOffOutline = "ImageOffOutline"; + public const string ImageOutline = "ImageOutline"; + public const string ImagePlus = "ImagePlus"; + public const string ImageRemove = "ImageRemove"; + public const string ImageSearch = "ImageSearch"; + public const string ImageSearchOutline = "ImageSearchOutline"; + public const string ImageSizeSelectActual = "ImageSizeSelectActual"; + public const string ImageSizeSelectLarge = "ImageSizeSelectLarge"; + public const string ImageSizeSelectSmall = "ImageSizeSelectSmall"; + public const string ImageText = "ImageText"; + public const string Import = "Import"; + public const string Inbox = "Inbox"; + public const string InboxArrowDown = "InboxArrowDown"; + public const string InboxArrowDownOutline = "InboxArrowDownOutline"; + public const string InboxArrowUp = "InboxArrowUp"; + public const string InboxArrowUpOutline = "InboxArrowUpOutline"; + public const string InboxFull = "InboxFull"; + public const string InboxFullOutline = "InboxFullOutline"; + public const string InboxMultiple = "InboxMultiple"; + public const string InboxMultipleOutline = "InboxMultipleOutline"; + public const string InboxOutline = "InboxOutline"; + public const string InboxRemove = "InboxRemove"; + public const string InboxRemoveOutline = "InboxRemoveOutline"; + public const string Incognito = "Incognito"; + public const string IncognitoCircle = "IncognitoCircle"; + public const string IncognitoCircleOff = "IncognitoCircleOff"; + public const string IncognitoOff = "IncognitoOff"; + public const string Induction = "Induction"; + public const string Infinity = "Infinity"; + public const string Information = "Information"; + public const string InformationOff = "InformationOff"; + public const string InformationOffOutline = "InformationOffOutline"; + public const string InformationOutline = "InformationOutline"; + public const string InformationVariant = "InformationVariant"; + public const string Instagram = "Instagram"; + public const string InstrumentTriangle = "InstrumentTriangle"; + public const string InvertColors = "InvertColors"; + public const string InvertColorsOff = "InvertColorsOff"; + public const string Iobroker = "Iobroker"; + public const string Ip = "Ip"; + public const string IpNetwork = "IpNetwork"; + public const string IpNetworkOutline = "IpNetworkOutline"; + public const string Ipod = "Ipod"; + public const string Iron = "Iron"; + public const string IronBoard = "IronBoard"; + public const string IronOutline = "IronOutline"; + public const string Island = "Island"; + public const string IvBag = "IvBag"; + public const string Jabber = "Jabber"; + public const string Jeepney = "Jeepney"; + public const string Jellyfish = "Jellyfish"; + public const string JellyfishOutline = "JellyfishOutline"; + public const string Jira = "Jira"; + public const string Jquery = "Jquery"; + public const string Jsfiddle = "Jsfiddle"; + public const string JumpRope = "JumpRope"; + public const string Kabaddi = "Kabaddi"; + public const string Kangaroo = "Kangaroo"; + public const string Karate = "Karate"; + public const string Kayaking = "Kayaking"; + public const string Keg = "Keg"; + public const string Kettle = "Kettle"; + public const string KettleAlert = "KettleAlert"; + public const string KettleAlertOutline = "KettleAlertOutline"; + public const string Kettlebell = "Kettlebell"; + public const string KettleOff = "KettleOff"; + public const string KettleOffOutline = "KettleOffOutline"; + public const string KettleOutline = "KettleOutline"; + public const string KettlePourOver = "KettlePourOver"; + public const string KettleSteam = "KettleSteam"; + public const string KettleSteamOutline = "KettleSteamOutline"; + public const string Key = "Key"; + public const string KeyArrowRight = "KeyArrowRight"; + public const string Keyboard = "Keyboard"; + public const string KeyboardBackspace = "KeyboardBackspace"; + public const string KeyboardCaps = "KeyboardCaps"; + public const string KeyboardClose = "KeyboardClose"; + public const string KeyboardEsc = "KeyboardEsc"; + public const string KeyboardF1 = "KeyboardF1"; + public const string KeyboardF10 = "KeyboardF10"; + public const string KeyboardF11 = "KeyboardF11"; + public const string KeyboardF12 = "KeyboardF12"; + public const string KeyboardF2 = "KeyboardF2"; + public const string KeyboardF3 = "KeyboardF3"; + public const string KeyboardF4 = "KeyboardF4"; + public const string KeyboardF5 = "KeyboardF5"; + public const string KeyboardF6 = "KeyboardF6"; + public const string KeyboardF7 = "KeyboardF7"; + public const string KeyboardF8 = "KeyboardF8"; + public const string KeyboardF9 = "KeyboardF9"; + public const string KeyboardOff = "KeyboardOff"; + public const string KeyboardOffOutline = "KeyboardOffOutline"; + public const string KeyboardOutline = "KeyboardOutline"; + public const string KeyboardReturn = "KeyboardReturn"; + public const string KeyboardSettings = "KeyboardSettings"; + public const string KeyboardSettingsOutline = "KeyboardSettingsOutline"; + public const string KeyboardSpace = "KeyboardSpace"; + public const string KeyboardTab = "KeyboardTab"; + public const string KeyboardTabReverse = "KeyboardTabReverse"; + public const string KeyboardVariant = "KeyboardVariant"; + public const string KeyChain = "KeyChain"; + public const string KeyChainVariant = "KeyChainVariant"; + public const string KeyChange = "KeyChange"; + public const string KeyLink = "KeyLink"; + public const string KeyMinus = "KeyMinus"; + public const string KeyOutline = "KeyOutline"; + public const string KeyPlus = "KeyPlus"; + public const string KeyRemove = "KeyRemove"; + public const string KeyStar = "KeyStar"; + public const string KeyVariant = "KeyVariant"; + public const string KeyWireless = "KeyWireless"; + public const string Khanda = "Khanda"; + public const string Kickstarter = "Kickstarter"; + public const string Kitesurfing = "Kitesurfing"; + public const string Klingon = "Klingon"; + public const string Knife = "Knife"; + public const string KnifeMilitary = "KnifeMilitary"; + public const string Koala = "Koala"; + public const string Kodi = "Kodi"; + public const string Kubernetes = "Kubernetes"; + public const string Label = "Label"; + public const string LabelMultiple = "LabelMultiple"; + public const string LabelMultipleOutline = "LabelMultipleOutline"; + public const string LabelOff = "LabelOff"; + public const string LabelOffOutline = "LabelOffOutline"; + public const string LabelOutline = "LabelOutline"; + public const string LabelPercent = "LabelPercent"; + public const string LabelPercentOutline = "LabelPercentOutline"; + public const string LabelVariant = "LabelVariant"; + public const string LabelVariantOutline = "LabelVariantOutline"; + public const string Ladder = "Ladder"; + public const string Ladybug = "Ladybug"; + public const string Lambda = "Lambda"; + public const string Lamp = "Lamp"; + public const string LampOutline = "LampOutline"; + public const string Lamps = "Lamps"; + public const string LampsOutline = "LampsOutline"; + public const string Lan = "Lan"; + public const string LanCheck = "LanCheck"; + public const string LanConnect = "LanConnect"; + public const string LanDisconnect = "LanDisconnect"; + public const string LanguageC = "LanguageC"; + public const string LanguageCpp = "LanguageCpp"; + public const string LanguageCsharp = "LanguageCsharp"; + public const string LanguageCss3 = "LanguageCss3"; + public const string LanguageFortran = "LanguageFortran"; + public const string LanguageGo = "LanguageGo"; + public const string LanguageHaskell = "LanguageHaskell"; + public const string LanguageHtml5 = "LanguageHtml5"; + public const string LanguageJava = "LanguageJava"; + public const string LanguageJavascript = "LanguageJavascript"; + public const string LanguageKotlin = "LanguageKotlin"; + public const string LanguageLua = "LanguageLua"; + public const string LanguageMarkdown = "LanguageMarkdown"; + public const string LanguageMarkdownOutline = "LanguageMarkdownOutline"; + public const string LanguagePhp = "LanguagePhp"; + public const string LanguagePython = "LanguagePython"; + public const string LanguageR = "LanguageR"; + public const string LanguageRuby = "LanguageRuby"; + public const string LanguageRubyOnRails = "LanguageRubyOnRails"; + public const string LanguageRust = "LanguageRust"; + public const string LanguageSwift = "LanguageSwift"; + public const string LanguageTypescript = "LanguageTypescript"; + public const string LanguageXaml = "LanguageXaml"; + public const string LanPending = "LanPending"; + public const string Laptop = "Laptop"; + public const string LaptopOff = "LaptopOff"; + public const string Laravel = "Laravel"; + public const string LaserPointer = "LaserPointer"; + public const string Lasso = "Lasso"; + public const string Lastpass = "Lastpass"; + public const string Latitude = "Latitude"; + public const string Launch = "Launch"; + public const string LavaLamp = "LavaLamp"; + public const string Layers = "Layers"; + public const string LayersEdit = "LayersEdit"; + public const string LayersMinus = "LayersMinus"; + public const string LayersOff = "LayersOff"; + public const string LayersOffOutline = "LayersOffOutline"; + public const string LayersOutline = "LayersOutline"; + public const string LayersPlus = "LayersPlus"; + public const string LayersRemove = "LayersRemove"; + public const string LayersSearch = "LayersSearch"; + public const string LayersSearchOutline = "LayersSearchOutline"; + public const string LayersTriple = "LayersTriple"; + public const string LayersTripleOutline = "LayersTripleOutline"; + public const string LeadPencil = "LeadPencil"; + public const string Leaf = "Leaf"; + public const string LeafMaple = "LeafMaple"; + public const string LeafMapleOff = "LeafMapleOff"; + public const string LeafOff = "LeafOff"; + public const string Leak = "Leak"; + public const string LeakOff = "LeakOff"; + public const string LedOff = "LedOff"; + public const string LedOn = "LedOn"; + public const string LedOutline = "LedOutline"; + public const string LedStrip = "LedStrip"; + public const string LedStripVariant = "LedStripVariant"; + public const string LedVariantOff = "LedVariantOff"; + public const string LedVariantOn = "LedVariantOn"; + public const string LedVariantOutline = "LedVariantOutline"; + public const string Leek = "Leek"; + public const string LessThan = "LessThan"; + public const string LessThanOrEqual = "LessThanOrEqual"; + public const string Library = "Library"; + public const string LibraryShelves = "LibraryShelves"; + public const string License = "License"; + public const string Lifebuoy = "Lifebuoy"; + public const string Lightbulb = "Lightbulb"; + public const string LightbulbAuto = "LightbulbAuto"; + public const string LightbulbAutoOutline = "LightbulbAutoOutline"; + public const string LightbulbCfl = "LightbulbCfl"; + public const string LightbulbCflOff = "LightbulbCflOff"; + public const string LightbulbCflSpiral = "LightbulbCflSpiral"; + public const string LightbulbCflSpiralOff = "LightbulbCflSpiralOff"; + public const string LightbulbFluorescentTube = "LightbulbFluorescentTube"; + public const string LightbulbFluorescentTubeOutline = "LightbulbFluorescentTubeOutline"; + public const string LightbulbGroup = "LightbulbGroup"; + public const string LightbulbGroupOff = "LightbulbGroupOff"; + public const string LightbulbGroupOffOutline = "LightbulbGroupOffOutline"; + public const string LightbulbGroupOutline = "LightbulbGroupOutline"; + public const string LightbulbMultiple = "LightbulbMultiple"; + public const string LightbulbMultipleOff = "LightbulbMultipleOff"; + public const string LightbulbMultipleOffOutline = "LightbulbMultipleOffOutline"; + public const string LightbulbMultipleOutline = "LightbulbMultipleOutline"; + public const string LightbulbOff = "LightbulbOff"; + public const string LightbulbOffOutline = "LightbulbOffOutline"; + public const string LightbulbOn = "LightbulbOn"; + public const string LightbulbOnOutline = "LightbulbOnOutline"; + public const string LightbulbOutline = "LightbulbOutline"; + public const string LightbulbSpot = "LightbulbSpot"; + public const string LightbulbSpotOff = "LightbulbSpotOff"; + public const string LightbulbVariant = "LightbulbVariant"; + public const string LightbulbVariantOutline = "LightbulbVariantOutline"; + public const string Lighthouse = "Lighthouse"; + public const string LighthouseOn = "LighthouseOn"; + public const string LightningBolt = "LightningBolt"; + public const string LightningBoltCircle = "LightningBoltCircle"; + public const string LightningBoltOutline = "LightningBoltOutline"; + public const string LightRecessed = "LightRecessed"; + public const string LightSwitch = "LightSwitch"; + public const string LineScan = "LineScan"; + public const string Lingerie = "Lingerie"; + public const string Link = "Link"; + public const string LinkBox = "LinkBox"; + public const string LinkBoxOutline = "LinkBoxOutline"; + public const string LinkBoxVariant = "LinkBoxVariant"; + public const string LinkBoxVariantOutline = "LinkBoxVariantOutline"; + public const string Linkedin = "Linkedin"; + public const string LinkLock = "LinkLock"; + public const string LinkOff = "LinkOff"; + public const string LinkPlus = "LinkPlus"; + public const string LinkVariant = "LinkVariant"; + public const string LinkVariantMinus = "LinkVariantMinus"; + public const string LinkVariantOff = "LinkVariantOff"; + public const string LinkVariantPlus = "LinkVariantPlus"; + public const string LinkVariantRemove = "LinkVariantRemove"; + public const string Linux = "Linux"; + public const string LinuxMint = "LinuxMint"; + public const string Lipstick = "Lipstick"; + public const string LiquidSpot = "LiquidSpot"; + public const string ListStatus = "ListStatus"; + public const string Litecoin = "Litecoin"; + public const string Loading = "Loading"; + public const string LocationEnter = "LocationEnter"; + public const string LocationExit = "LocationExit"; + public const string Lock = "Lock"; + public const string LockAlert = "LockAlert"; + public const string LockAlertOutline = "LockAlertOutline"; + public const string LockCheck = "LockCheck"; + public const string LockCheckOutline = "LockCheckOutline"; + public const string LockClock = "LockClock"; + public const string Locker = "Locker"; + public const string LockerMultiple = "LockerMultiple"; + public const string LockMinus = "LockMinus"; + public const string LockMinusOutline = "LockMinusOutline"; + public const string LockOff = "LockOff"; + public const string LockOffOutline = "LockOffOutline"; + public const string LockOpen = "LockOpen"; + public const string LockOpenAlert = "LockOpenAlert"; + public const string LockOpenAlertOutline = "LockOpenAlertOutline"; + public const string LockOpenCheck = "LockOpenCheck"; + public const string LockOpenCheckOutline = "LockOpenCheckOutline"; + public const string LockOpenMinus = "LockOpenMinus"; + public const string LockOpenMinusOutline = "LockOpenMinusOutline"; + public const string LockOpenOutline = "LockOpenOutline"; + public const string LockOpenPlus = "LockOpenPlus"; + public const string LockOpenPlusOutline = "LockOpenPlusOutline"; + public const string LockOpenRemove = "LockOpenRemove"; + public const string LockOpenRemoveOutline = "LockOpenRemoveOutline"; + public const string LockOpenVariant = "LockOpenVariant"; + public const string LockOpenVariantOutline = "LockOpenVariantOutline"; + public const string LockOutline = "LockOutline"; + public const string LockPattern = "LockPattern"; + public const string LockPlus = "LockPlus"; + public const string LockPlusOutline = "LockPlusOutline"; + public const string LockQuestion = "LockQuestion"; + public const string LockRemove = "LockRemove"; + public const string LockRemoveOutline = "LockRemoveOutline"; + public const string LockReset = "LockReset"; + public const string LockSmart = "LockSmart"; + public const string Login = "Login"; + public const string LoginVariant = "LoginVariant"; + public const string Logout = "Logout"; + public const string LogoutVariant = "LogoutVariant"; + public const string Longitude = "Longitude"; + public const string Looks = "Looks"; + public const string Lotion = "Lotion"; + public const string LotionOutline = "LotionOutline"; + public const string LotionPlus = "LotionPlus"; + public const string LotionPlusOutline = "LotionPlusOutline"; + public const string Loupe = "Loupe"; + public const string Lumx = "Lumx"; + public const string Lungs = "Lungs"; + public const string Mace = "Mace"; + public const string MagazinePistol = "MagazinePistol"; + public const string MagazineRifle = "MagazineRifle"; + public const string MagicStaff = "MagicStaff"; + public const string Magnet = "Magnet"; + public const string MagnetOn = "MagnetOn"; + public const string Magnify = "Magnify"; + public const string MagnifyClose = "MagnifyClose"; + public const string MagnifyExpand = "MagnifyExpand"; + public const string MagnifyMinus = "MagnifyMinus"; + public const string MagnifyMinusCursor = "MagnifyMinusCursor"; + public const string MagnifyMinusOutline = "MagnifyMinusOutline"; + public const string MagnifyPlus = "MagnifyPlus"; + public const string MagnifyPlusCursor = "MagnifyPlusCursor"; + public const string MagnifyPlusOutline = "MagnifyPlusOutline"; + public const string MagnifyRemoveCursor = "MagnifyRemoveCursor"; + public const string MagnifyRemoveOutline = "MagnifyRemoveOutline"; + public const string MagnifyScan = "MagnifyScan"; + public const string Mail = "Mail"; + public const string Mailbox = "Mailbox"; + public const string MailboxOpen = "MailboxOpen"; + public const string MailboxOpenOutline = "MailboxOpenOutline"; + public const string MailboxOpenUp = "MailboxOpenUp"; + public const string MailboxOpenUpOutline = "MailboxOpenUpOutline"; + public const string MailboxOutline = "MailboxOutline"; + public const string MailboxUp = "MailboxUp"; + public const string MailboxUpOutline = "MailboxUpOutline"; + public const string Manjaro = "Manjaro"; + public const string Map = "Map"; + public const string Mapbox = "Mapbox"; + public const string MapCheck = "MapCheck"; + public const string MapCheckOutline = "MapCheckOutline"; + public const string MapClock = "MapClock"; + public const string MapClockOutline = "MapClockOutline"; + public const string MapLegend = "MapLegend"; + public const string MapMarker = "MapMarker"; + public const string MapMarkerAccount = "MapMarkerAccount"; + public const string MapMarkerAccountOutline = "MapMarkerAccountOutline"; + public const string MapMarkerAlert = "MapMarkerAlert"; + public const string MapMarkerAlertOutline = "MapMarkerAlertOutline"; + public const string MapMarkerCheck = "MapMarkerCheck"; + public const string MapMarkerCheckOutline = "MapMarkerCheckOutline"; + public const string MapMarkerCircle = "MapMarkerCircle"; + public const string MapMarkerDistance = "MapMarkerDistance"; + public const string MapMarkerDown = "MapMarkerDown"; + public const string MapMarkerLeft = "MapMarkerLeft"; + public const string MapMarkerLeftOutline = "MapMarkerLeftOutline"; + public const string MapMarkerMinus = "MapMarkerMinus"; + public const string MapMarkerMinusOutline = "MapMarkerMinusOutline"; + public const string MapMarkerMultiple = "MapMarkerMultiple"; + public const string MapMarkerMultipleOutline = "MapMarkerMultipleOutline"; + public const string MapMarkerOff = "MapMarkerOff"; + public const string MapMarkerOffOutline = "MapMarkerOffOutline"; + public const string MapMarkerOutline = "MapMarkerOutline"; + public const string MapMarkerPath = "MapMarkerPath"; + public const string MapMarkerPlus = "MapMarkerPlus"; + public const string MapMarkerPlusOutline = "MapMarkerPlusOutline"; + public const string MapMarkerQuestion = "MapMarkerQuestion"; + public const string MapMarkerQuestionOutline = "MapMarkerQuestionOutline"; + public const string MapMarkerRadius = "MapMarkerRadius"; + public const string MapMarkerRadiusOutline = "MapMarkerRadiusOutline"; + public const string MapMarkerRemove = "MapMarkerRemove"; + public const string MapMarkerRemoveOutline = "MapMarkerRemoveOutline"; + public const string MapMarkerRemoveVariant = "MapMarkerRemoveVariant"; + public const string MapMarkerRight = "MapMarkerRight"; + public const string MapMarkerRightOutline = "MapMarkerRightOutline"; + public const string MapMarkerStar = "MapMarkerStar"; + public const string MapMarkerStarOutline = "MapMarkerStarOutline"; + public const string MapMarkerUp = "MapMarkerUp"; + public const string MapMinus = "MapMinus"; + public const string MapOutline = "MapOutline"; + public const string MapPlus = "MapPlus"; + public const string MapSearch = "MapSearch"; + public const string MapSearchOutline = "MapSearchOutline"; + public const string Margin = "Margin"; + public const string Marker = "Marker"; + public const string MarkerCancel = "MarkerCancel"; + public const string MarkerCheck = "MarkerCheck"; + public const string Mastodon = "Mastodon"; + public const string MaterialDesign = "MaterialDesign"; + public const string MaterialUi = "MaterialUi"; + public const string MathCompass = "MathCompass"; + public const string MathCos = "MathCos"; + public const string MathIntegral = "MathIntegral"; + public const string MathIntegralBox = "MathIntegralBox"; + public const string MathLog = "MathLog"; + public const string MathNorm = "MathNorm"; + public const string MathNormBox = "MathNormBox"; + public const string MathSin = "MathSin"; + public const string MathTan = "MathTan"; + public const string Matrix = "Matrix"; + public const string Medal = "Medal"; + public const string MedalOutline = "MedalOutline"; + public const string MedicalBag = "MedicalBag"; + public const string Meditation = "Meditation"; + public const string Memory = "Memory"; + public const string Menorah = "Menorah"; + public const string MenorahFire = "MenorahFire"; + public const string Menu = "Menu"; + public const string MenuDown = "MenuDown"; + public const string MenuDownOutline = "MenuDownOutline"; + public const string MenuLeft = "MenuLeft"; + public const string MenuLeftOutline = "MenuLeftOutline"; + public const string MenuOpen = "MenuOpen"; + public const string MenuRight = "MenuRight"; + public const string MenuRightOutline = "MenuRightOutline"; + public const string MenuSwap = "MenuSwap"; + public const string MenuSwapOutline = "MenuSwapOutline"; + public const string MenuUp = "MenuUp"; + public const string MenuUpOutline = "MenuUpOutline"; + public const string Merge = "Merge"; + public const string Message = "Message"; + public const string MessageAlert = "MessageAlert"; + public const string MessageAlertOutline = "MessageAlertOutline"; + public const string MessageArrowLeft = "MessageArrowLeft"; + public const string MessageArrowLeftOutline = "MessageArrowLeftOutline"; + public const string MessageArrowRight = "MessageArrowRight"; + public const string MessageArrowRightOutline = "MessageArrowRightOutline"; + public const string MessageBookmark = "MessageBookmark"; + public const string MessageBookmarkOutline = "MessageBookmarkOutline"; + public const string MessageBulleted = "MessageBulleted"; + public const string MessageBulletedOff = "MessageBulletedOff"; + public const string MessageCog = "MessageCog"; + public const string MessageCogOutline = "MessageCogOutline"; + public const string MessageDraw = "MessageDraw"; + public const string MessageFlash = "MessageFlash"; + public const string MessageFlashOutline = "MessageFlashOutline"; + public const string MessageImage = "MessageImage"; + public const string MessageImageOutline = "MessageImageOutline"; + public const string MessageLock = "MessageLock"; + public const string MessageLockOutline = "MessageLockOutline"; + public const string MessageMinus = "MessageMinus"; + public const string MessageMinusOutline = "MessageMinusOutline"; + public const string MessageOff = "MessageOff"; + public const string MessageOffOutline = "MessageOffOutline"; + public const string MessageOutline = "MessageOutline"; + public const string MessagePlus = "MessagePlus"; + public const string MessagePlusOutline = "MessagePlusOutline"; + public const string MessageProcessing = "MessageProcessing"; + public const string MessageProcessingOutline = "MessageProcessingOutline"; + public const string MessageQuestion = "MessageQuestion"; + public const string MessageQuestionOutline = "MessageQuestionOutline"; + public const string MessageReply = "MessageReply"; + public const string MessageReplyOutline = "MessageReplyOutline"; + public const string MessageReplyText = "MessageReplyText"; + public const string MessageReplyTextOutline = "MessageReplyTextOutline"; + public const string MessageSettings = "MessageSettings"; + public const string MessageSettingsOutline = "MessageSettingsOutline"; + public const string MessageStar = "MessageStar"; + public const string MessageStarOutline = "MessageStarOutline"; + public const string MessageText = "MessageText"; + public const string MessageTextClock = "MessageTextClock"; + public const string MessageTextClockOutline = "MessageTextClockOutline"; + public const string MessageTextLock = "MessageTextLock"; + public const string MessageTextLockOutline = "MessageTextLockOutline"; + public const string MessageTextOutline = "MessageTextOutline"; + public const string MessageVideo = "MessageVideo"; + public const string Meteor = "Meteor"; + public const string Metronome = "Metronome"; + public const string MetronomeTick = "MetronomeTick"; + public const string Microphone = "Microphone"; + public const string MicrophoneMinus = "MicrophoneMinus"; + public const string MicrophoneOff = "MicrophoneOff"; + public const string MicrophoneOutline = "MicrophoneOutline"; + public const string MicrophonePlus = "MicrophonePlus"; + public const string MicrophoneSettings = "MicrophoneSettings"; + public const string MicrophoneVariant = "MicrophoneVariant"; + public const string MicrophoneVariantOff = "MicrophoneVariantOff"; + public const string Microscope = "Microscope"; + public const string MicroSd = "MicroSd"; + public const string Microsoft = "Microsoft"; + public const string MicrosoftAccess = "MicrosoftAccess"; + public const string MicrosoftAzure = "MicrosoftAzure"; + public const string MicrosoftAzureDevops = "MicrosoftAzureDevops"; + public const string MicrosoftBing = "MicrosoftBing"; + public const string MicrosoftDynamics365 = "MicrosoftDynamics365"; + public const string MicrosoftEdge = "MicrosoftEdge"; + public const string MicrosoftExcel = "MicrosoftExcel"; + public const string MicrosoftInternetExplorer = "MicrosoftInternetExplorer"; + public const string MicrosoftOffice = "MicrosoftOffice"; + public const string MicrosoftOnedrive = "MicrosoftOnedrive"; + public const string MicrosoftOnenote = "MicrosoftOnenote"; + public const string MicrosoftOutlook = "MicrosoftOutlook"; + public const string MicrosoftPowerpoint = "MicrosoftPowerpoint"; + public const string MicrosoftSharepoint = "MicrosoftSharepoint"; + public const string MicrosoftTeams = "MicrosoftTeams"; + public const string MicrosoftVisualStudio = "MicrosoftVisualStudio"; + public const string MicrosoftVisualStudioCode = "MicrosoftVisualStudioCode"; + public const string MicrosoftWindows = "MicrosoftWindows"; + public const string MicrosoftWindowsClassic = "MicrosoftWindowsClassic"; + public const string MicrosoftWord = "MicrosoftWord"; + public const string MicrosoftXbox = "MicrosoftXbox"; + public const string MicrosoftXboxController = "MicrosoftXboxController"; + public const string MicrosoftXboxControllerBatteryAlert = "MicrosoftXboxControllerBatteryAlert"; + public const string MicrosoftXboxControllerBatteryCharging = "MicrosoftXboxControllerBatteryCharging"; + public const string MicrosoftXboxControllerBatteryEmpty = "MicrosoftXboxControllerBatteryEmpty"; + public const string MicrosoftXboxControllerBatteryFull = "MicrosoftXboxControllerBatteryFull"; + public const string MicrosoftXboxControllerBatteryLow = "MicrosoftXboxControllerBatteryLow"; + public const string MicrosoftXboxControllerBatteryMedium = "MicrosoftXboxControllerBatteryMedium"; + public const string MicrosoftXboxControllerBatteryUnknown = "MicrosoftXboxControllerBatteryUnknown"; + public const string MicrosoftXboxControllerMenu = "MicrosoftXboxControllerMenu"; + public const string MicrosoftXboxControllerOff = "MicrosoftXboxControllerOff"; + public const string MicrosoftXboxControllerView = "MicrosoftXboxControllerView"; + public const string Microwave = "Microwave"; + public const string MicrowaveOff = "MicrowaveOff"; + public const string Middleware = "Middleware"; + public const string MiddlewareOutline = "MiddlewareOutline"; + public const string Midi = "Midi"; + public const string MidiPort = "MidiPort"; + public const string Mine = "Mine"; + public const string Minecraft = "Minecraft"; + public const string Minidisc = "Minidisc"; + public const string MiniSd = "MiniSd"; + public const string Minus = "Minus"; + public const string MinusBox = "MinusBox"; + public const string MinusBoxMultiple = "MinusBoxMultiple"; + public const string MinusBoxMultipleOutline = "MinusBoxMultipleOutline"; + public const string MinusBoxOutline = "MinusBoxOutline"; + public const string MinusCircle = "MinusCircle"; + public const string MinusCircleMultiple = "MinusCircleMultiple"; + public const string MinusCircleMultipleOutline = "MinusCircleMultipleOutline"; + public const string MinusCircleOff = "MinusCircleOff"; + public const string MinusCircleOffOutline = "MinusCircleOffOutline"; + public const string MinusCircleOutline = "MinusCircleOutline"; + public const string MinusNetwork = "MinusNetwork"; + public const string MinusNetworkOutline = "MinusNetworkOutline"; + public const string MinusThick = "MinusThick"; + public const string Mirror = "Mirror"; + public const string MirrorRectangle = "MirrorRectangle"; + public const string MirrorVariant = "MirrorVariant"; + public const string MixedMartialArts = "MixedMartialArts"; + public const string MixedReality = "MixedReality"; + public const string Molecule = "Molecule"; + public const string MoleculeCo = "MoleculeCo"; + public const string MoleculeCo2 = "MoleculeCo2"; + public const string Monitor = "Monitor"; + public const string MonitorCellphone = "MonitorCellphone"; + public const string MonitorCellphoneStar = "MonitorCellphoneStar"; + public const string MonitorDashboard = "MonitorDashboard"; + public const string MonitorEdit = "MonitorEdit"; + public const string MonitorEye = "MonitorEye"; + public const string MonitorLock = "MonitorLock"; + public const string MonitorMultiple = "MonitorMultiple"; + public const string MonitorOff = "MonitorOff"; + public const string MonitorScreenshot = "MonitorScreenshot"; + public const string MonitorShare = "MonitorShare"; + public const string MonitorShimmer = "MonitorShimmer"; + public const string MonitorSmall = "MonitorSmall"; + public const string MonitorSpeaker = "MonitorSpeaker"; + public const string MonitorSpeakerOff = "MonitorSpeakerOff"; + public const string MonitorStar = "MonitorStar"; + public const string MoonFirstQuarter = "MoonFirstQuarter"; + public const string MoonFull = "MoonFull"; + public const string MoonLastQuarter = "MoonLastQuarter"; + public const string MoonNew = "MoonNew"; + public const string MoonWaningCrescent = "MoonWaningCrescent"; + public const string MoonWaningGibbous = "MoonWaningGibbous"; + public const string MoonWaxingCrescent = "MoonWaxingCrescent"; + public const string MoonWaxingGibbous = "MoonWaxingGibbous"; + public const string Moped = "Moped"; + public const string MopedElectric = "MopedElectric"; + public const string MopedElectricOutline = "MopedElectricOutline"; + public const string MopedOutline = "MopedOutline"; + public const string More = "More"; + public const string MortarPestle = "MortarPestle"; + public const string MortarPestlePlus = "MortarPestlePlus"; + public const string Mosque = "Mosque"; + public const string MotherHeart = "MotherHeart"; + public const string MotherNurse = "MotherNurse"; + public const string Motion = "Motion"; + public const string MotionOutline = "MotionOutline"; + public const string MotionPause = "MotionPause"; + public const string MotionPauseOutline = "MotionPauseOutline"; + public const string MotionPlay = "MotionPlay"; + public const string MotionPlayOutline = "MotionPlayOutline"; + public const string MotionSensor = "MotionSensor"; + public const string MotionSensorOff = "MotionSensorOff"; + public const string Motorbike = "Motorbike"; + public const string MotorbikeElectric = "MotorbikeElectric"; + public const string Mouse = "Mouse"; + public const string MouseBluetooth = "MouseBluetooth"; + public const string MouseMoveDown = "MouseMoveDown"; + public const string MouseMoveUp = "MouseMoveUp"; + public const string MouseMoveVertical = "MouseMoveVertical"; + public const string MouseOff = "MouseOff"; + public const string MouseVariant = "MouseVariant"; + public const string MouseVariantOff = "MouseVariantOff"; + public const string MoveResize = "MoveResize"; + public const string MoveResizeVariant = "MoveResizeVariant"; + public const string Movie = "Movie"; + public const string MovieCheck = "MovieCheck"; + public const string MovieCheckOutline = "MovieCheckOutline"; + public const string MovieCog = "MovieCog"; + public const string MovieCogOutline = "MovieCogOutline"; + public const string MovieEdit = "MovieEdit"; + public const string MovieEditOutline = "MovieEditOutline"; + public const string MovieFilter = "MovieFilter"; + public const string MovieFilterOutline = "MovieFilterOutline"; + public const string MovieMinus = "MovieMinus"; + public const string MovieMinusOutline = "MovieMinusOutline"; + public const string MovieOff = "MovieOff"; + public const string MovieOffOutline = "MovieOffOutline"; + public const string MovieOpen = "MovieOpen"; + public const string MovieOpenCheck = "MovieOpenCheck"; + public const string MovieOpenCheckOutline = "MovieOpenCheckOutline"; + public const string MovieOpenCog = "MovieOpenCog"; + public const string MovieOpenCogOutline = "MovieOpenCogOutline"; + public const string MovieOpenEdit = "MovieOpenEdit"; + public const string MovieOpenEditOutline = "MovieOpenEditOutline"; + public const string MovieOpenMinus = "MovieOpenMinus"; + public const string MovieOpenMinusOutline = "MovieOpenMinusOutline"; + public const string MovieOpenOff = "MovieOpenOff"; + public const string MovieOpenOffOutline = "MovieOpenOffOutline"; + public const string MovieOpenOutline = "MovieOpenOutline"; + public const string MovieOpenPlay = "MovieOpenPlay"; + public const string MovieOpenPlayOutline = "MovieOpenPlayOutline"; + public const string MovieOpenPlus = "MovieOpenPlus"; + public const string MovieOpenPlusOutline = "MovieOpenPlusOutline"; + public const string MovieOpenRemove = "MovieOpenRemove"; + public const string MovieOpenRemoveOutline = "MovieOpenRemoveOutline"; + public const string MovieOpenSettings = "MovieOpenSettings"; + public const string MovieOpenSettingsOutline = "MovieOpenSettingsOutline"; + public const string MovieOpenStar = "MovieOpenStar"; + public const string MovieOpenStarOutline = "MovieOpenStarOutline"; + public const string MovieOutline = "MovieOutline"; + public const string MoviePlay = "MoviePlay"; + public const string MoviePlayOutline = "MoviePlayOutline"; + public const string MoviePlus = "MoviePlus"; + public const string MoviePlusOutline = "MoviePlusOutline"; + public const string MovieRemove = "MovieRemove"; + public const string MovieRemoveOutline = "MovieRemoveOutline"; + public const string MovieRoll = "MovieRoll"; + public const string MovieSearch = "MovieSearch"; + public const string MovieSearchOutline = "MovieSearchOutline"; + public const string MovieSettings = "MovieSettings"; + public const string MovieSettingsOutline = "MovieSettingsOutline"; + public const string MovieStar = "MovieStar"; + public const string MovieStarOutline = "MovieStarOutline"; + public const string Mower = "Mower"; + public const string MowerBag = "MowerBag"; + public const string Muffin = "Muffin"; + public const string Multicast = "Multicast"; + public const string Multiplication = "Multiplication"; + public const string MultiplicationBox = "MultiplicationBox"; + public const string Mushroom = "Mushroom"; + public const string MushroomOff = "MushroomOff"; + public const string MushroomOffOutline = "MushroomOffOutline"; + public const string MushroomOutline = "MushroomOutline"; + public const string Music = "Music"; + public const string MusicAccidentalDoubleFlat = "MusicAccidentalDoubleFlat"; + public const string MusicAccidentalDoubleSharp = "MusicAccidentalDoubleSharp"; + public const string MusicAccidentalFlat = "MusicAccidentalFlat"; + public const string MusicAccidentalNatural = "MusicAccidentalNatural"; + public const string MusicAccidentalSharp = "MusicAccidentalSharp"; + public const string MusicBox = "MusicBox"; + public const string MusicBoxMultiple = "MusicBoxMultiple"; + public const string MusicBoxMultipleOutline = "MusicBoxMultipleOutline"; + public const string MusicBoxOutline = "MusicBoxOutline"; + public const string MusicCircle = "MusicCircle"; + public const string MusicCircleOutline = "MusicCircleOutline"; + public const string MusicClefAlto = "MusicClefAlto"; + public const string MusicClefBass = "MusicClefBass"; + public const string MusicClefTreble = "MusicClefTreble"; + public const string MusicNote = "MusicNote"; + public const string MusicNoteBluetooth = "MusicNoteBluetooth"; + public const string MusicNoteBluetoothOff = "MusicNoteBluetoothOff"; + public const string MusicNoteEighth = "MusicNoteEighth"; + public const string MusicNoteEighthDotted = "MusicNoteEighthDotted"; + public const string MusicNoteHalf = "MusicNoteHalf"; + public const string MusicNoteHalfDotted = "MusicNoteHalfDotted"; + public const string MusicNoteOff = "MusicNoteOff"; + public const string MusicNoteOffOutline = "MusicNoteOffOutline"; + public const string MusicNoteOutline = "MusicNoteOutline"; + public const string MusicNotePlus = "MusicNotePlus"; + public const string MusicNoteQuarter = "MusicNoteQuarter"; + public const string MusicNoteQuarterDotted = "MusicNoteQuarterDotted"; + public const string MusicNoteSixteenth = "MusicNoteSixteenth"; + public const string MusicNoteSixteenthDotted = "MusicNoteSixteenthDotted"; + public const string MusicNoteWhole = "MusicNoteWhole"; + public const string MusicNoteWholeDotted = "MusicNoteWholeDotted"; + public const string MusicOff = "MusicOff"; + public const string MusicRestEighth = "MusicRestEighth"; + public const string MusicRestHalf = "MusicRestHalf"; + public const string MusicRestQuarter = "MusicRestQuarter"; + public const string MusicRestSixteenth = "MusicRestSixteenth"; + public const string MusicRestWhole = "MusicRestWhole"; + public const string Mustache = "Mustache"; + public const string Nail = "Nail"; + public const string Nas = "Nas"; + public const string Nativescript = "Nativescript"; + public const string Nature = "Nature"; + public const string NaturePeople = "NaturePeople"; + public const string Navigation = "Navigation"; + public const string NavigationOutline = "NavigationOutline"; + public const string NavigationVariant = "NavigationVariant"; + public const string NavigationVariantOutline = "NavigationVariantOutline"; + public const string NearMe = "NearMe"; + public const string Necklace = "Necklace"; + public const string Needle = "Needle"; + public const string Netflix = "Netflix"; + public const string Network = "Network"; + public const string NetworkOff = "NetworkOff"; + public const string NetworkOffOutline = "NetworkOffOutline"; + public const string NetworkOutline = "NetworkOutline"; + public const string NetworkStrength1 = "NetworkStrength1"; + public const string NetworkStrength1Alert = "NetworkStrength1Alert"; + public const string NetworkStrength2 = "NetworkStrength2"; + public const string NetworkStrength2Alert = "NetworkStrength2Alert"; + public const string NetworkStrength3 = "NetworkStrength3"; + public const string NetworkStrength3Alert = "NetworkStrength3Alert"; + public const string NetworkStrength4 = "NetworkStrength4"; + public const string NetworkStrength4Alert = "NetworkStrength4Alert"; + public const string NetworkStrengthOff = "NetworkStrengthOff"; + public const string NetworkStrengthOffOutline = "NetworkStrengthOffOutline"; + public const string NetworkStrengthOutline = "NetworkStrengthOutline"; + public const string NewBox = "NewBox"; + public const string Newspaper = "Newspaper"; + public const string NewspaperMinus = "NewspaperMinus"; + public const string NewspaperPlus = "NewspaperPlus"; + public const string NewspaperVariant = "NewspaperVariant"; + public const string NewspaperVariantMultiple = "NewspaperVariantMultiple"; + public const string NewspaperVariantMultipleOutline = "NewspaperVariantMultipleOutline"; + public const string NewspaperVariantOutline = "NewspaperVariantOutline"; + public const string Nfc = "Nfc"; + public const string NfcSearchVariant = "NfcSearchVariant"; + public const string NfcTap = "NfcTap"; + public const string NfcVariant = "NfcVariant"; + public const string NfcVariantOff = "NfcVariantOff"; + public const string Ninja = "Ninja"; + public const string NintendoGameBoy = "NintendoGameBoy"; + public const string NintendoSwitch = "NintendoSwitch"; + public const string NintendoWii = "NintendoWii"; + public const string NintendoWiiu = "NintendoWiiu"; + public const string Nix = "Nix"; + public const string Nodejs = "Nodejs"; + public const string Noodles = "Noodles"; + public const string Note = "Note"; + public const string NoteAlert = "NoteAlert"; + public const string NoteAlertOutline = "NoteAlertOutline"; + public const string Notebook = "Notebook"; + public const string NotebookCheck = "NotebookCheck"; + public const string NotebookCheckOutline = "NotebookCheckOutline"; + public const string NotebookEdit = "NotebookEdit"; + public const string NotebookEditOutline = "NotebookEditOutline"; + public const string NotebookMinus = "NotebookMinus"; + public const string NotebookMinusOutline = "NotebookMinusOutline"; + public const string NotebookMultiple = "NotebookMultiple"; + public const string NotebookOutline = "NotebookOutline"; + public const string NotebookPlus = "NotebookPlus"; + public const string NotebookPlusOutline = "NotebookPlusOutline"; + public const string NotebookRemove = "NotebookRemove"; + public const string NotebookRemoveOutline = "NotebookRemoveOutline"; + public const string NoteCheck = "NoteCheck"; + public const string NoteCheckOutline = "NoteCheckOutline"; + public const string NoteEdit = "NoteEdit"; + public const string NoteEditOutline = "NoteEditOutline"; + public const string NoteMinus = "NoteMinus"; + public const string NoteMinusOutline = "NoteMinusOutline"; + public const string NoteMultiple = "NoteMultiple"; + public const string NoteMultipleOutline = "NoteMultipleOutline"; + public const string NoteOff = "NoteOff"; + public const string NoteOffOutline = "NoteOffOutline"; + public const string NoteOutline = "NoteOutline"; + public const string NotePlus = "NotePlus"; + public const string NotePlusOutline = "NotePlusOutline"; + public const string NotEqual = "NotEqual"; + public const string NotEqualVariant = "NotEqualVariant"; + public const string NoteRemove = "NoteRemove"; + public const string NoteRemoveOutline = "NoteRemoveOutline"; + public const string NoteSearch = "NoteSearch"; + public const string NoteSearchOutline = "NoteSearchOutline"; + public const string NoteText = "NoteText"; + public const string NoteTextOutline = "NoteTextOutline"; + public const string NotificationClearAll = "NotificationClearAll"; + public const string Npm = "Npm"; + public const string Nuke = "Nuke"; + public const string Null = "Null"; + public const string Numeric = "Numeric"; + public const string Numeric0 = "Numeric0"; + public const string Numeric0Box = "Numeric0Box"; + public const string Numeric0BoxMultiple = "Numeric0BoxMultiple"; + public const string Numeric0BoxMultipleOutline = "Numeric0BoxMultipleOutline"; + public const string Numeric0BoxOutline = "Numeric0BoxOutline"; + public const string Numeric0Circle = "Numeric0Circle"; + public const string Numeric0CircleOutline = "Numeric0CircleOutline"; + public const string Numeric1 = "Numeric1"; + public const string Numeric10 = "Numeric10"; + public const string Numeric10Box = "Numeric10Box"; + public const string Numeric10BoxMultiple = "Numeric10BoxMultiple"; + public const string Numeric10BoxMultipleOutline = "Numeric10BoxMultipleOutline"; + public const string Numeric10BoxOutline = "Numeric10BoxOutline"; + public const string Numeric10Circle = "Numeric10Circle"; + public const string Numeric10CircleOutline = "Numeric10CircleOutline"; + public const string Numeric1Box = "Numeric1Box"; + public const string Numeric1BoxMultiple = "Numeric1BoxMultiple"; + public const string Numeric1BoxMultipleOutline = "Numeric1BoxMultipleOutline"; + public const string Numeric1BoxOutline = "Numeric1BoxOutline"; + public const string Numeric1Circle = "Numeric1Circle"; + public const string Numeric1CircleOutline = "Numeric1CircleOutline"; + public const string Numeric2 = "Numeric2"; + public const string Numeric2Box = "Numeric2Box"; + public const string Numeric2BoxMultiple = "Numeric2BoxMultiple"; + public const string Numeric2BoxMultipleOutline = "Numeric2BoxMultipleOutline"; + public const string Numeric2BoxOutline = "Numeric2BoxOutline"; + public const string Numeric2Circle = "Numeric2Circle"; + public const string Numeric2CircleOutline = "Numeric2CircleOutline"; + public const string Numeric3 = "Numeric3"; + public const string Numeric3Box = "Numeric3Box"; + public const string Numeric3BoxMultiple = "Numeric3BoxMultiple"; + public const string Numeric3BoxMultipleOutline = "Numeric3BoxMultipleOutline"; + public const string Numeric3BoxOutline = "Numeric3BoxOutline"; + public const string Numeric3Circle = "Numeric3Circle"; + public const string Numeric3CircleOutline = "Numeric3CircleOutline"; + public const string Numeric4 = "Numeric4"; + public const string Numeric4Box = "Numeric4Box"; + public const string Numeric4BoxMultiple = "Numeric4BoxMultiple"; + public const string Numeric4BoxMultipleOutline = "Numeric4BoxMultipleOutline"; + public const string Numeric4BoxOutline = "Numeric4BoxOutline"; + public const string Numeric4Circle = "Numeric4Circle"; + public const string Numeric4CircleOutline = "Numeric4CircleOutline"; + public const string Numeric5 = "Numeric5"; + public const string Numeric5Box = "Numeric5Box"; + public const string Numeric5BoxMultiple = "Numeric5BoxMultiple"; + public const string Numeric5BoxMultipleOutline = "Numeric5BoxMultipleOutline"; + public const string Numeric5BoxOutline = "Numeric5BoxOutline"; + public const string Numeric5Circle = "Numeric5Circle"; + public const string Numeric5CircleOutline = "Numeric5CircleOutline"; + public const string Numeric6 = "Numeric6"; + public const string Numeric6Box = "Numeric6Box"; + public const string Numeric6BoxMultiple = "Numeric6BoxMultiple"; + public const string Numeric6BoxMultipleOutline = "Numeric6BoxMultipleOutline"; + public const string Numeric6BoxOutline = "Numeric6BoxOutline"; + public const string Numeric6Circle = "Numeric6Circle"; + public const string Numeric6CircleOutline = "Numeric6CircleOutline"; + public const string Numeric7 = "Numeric7"; + public const string Numeric7Box = "Numeric7Box"; + public const string Numeric7BoxMultiple = "Numeric7BoxMultiple"; + public const string Numeric7BoxMultipleOutline = "Numeric7BoxMultipleOutline"; + public const string Numeric7BoxOutline = "Numeric7BoxOutline"; + public const string Numeric7Circle = "Numeric7Circle"; + public const string Numeric7CircleOutline = "Numeric7CircleOutline"; + public const string Numeric8 = "Numeric8"; + public const string Numeric8Box = "Numeric8Box"; + public const string Numeric8BoxMultiple = "Numeric8BoxMultiple"; + public const string Numeric8BoxMultipleOutline = "Numeric8BoxMultipleOutline"; + public const string Numeric8BoxOutline = "Numeric8BoxOutline"; + public const string Numeric8Circle = "Numeric8Circle"; + public const string Numeric8CircleOutline = "Numeric8CircleOutline"; + public const string Numeric9 = "Numeric9"; + public const string Numeric9Box = "Numeric9Box"; + public const string Numeric9BoxMultiple = "Numeric9BoxMultiple"; + public const string Numeric9BoxMultipleOutline = "Numeric9BoxMultipleOutline"; + public const string Numeric9BoxOutline = "Numeric9BoxOutline"; + public const string Numeric9Circle = "Numeric9Circle"; + public const string Numeric9CircleOutline = "Numeric9CircleOutline"; + public const string Numeric9Plus = "Numeric9Plus"; + public const string Numeric9PlusBox = "Numeric9PlusBox"; + public const string Numeric9PlusBoxMultiple = "Numeric9PlusBoxMultiple"; + public const string Numeric9PlusBoxMultipleOutline = "Numeric9PlusBoxMultipleOutline"; + public const string Numeric9PlusBoxOutline = "Numeric9PlusBoxOutline"; + public const string Numeric9PlusCircle = "Numeric9PlusCircle"; + public const string Numeric9PlusCircleOutline = "Numeric9PlusCircleOutline"; + public const string NumericNegative1 = "NumericNegative1"; + public const string NumericPositive1 = "NumericPositive1"; + public const string Nut = "Nut"; + public const string Nutrition = "Nutrition"; + public const string Nuxt = "Nuxt"; + public const string Oar = "Oar"; + public const string Ocarina = "Ocarina"; + public const string Oci = "Oci"; + public const string Ocr = "Ocr"; + public const string Octagon = "Octagon"; + public const string OctagonOutline = "OctagonOutline"; + public const string Octagram = "Octagram"; + public const string OctagramOutline = "OctagramOutline"; + public const string Odnoklassniki = "Odnoklassniki"; + public const string Offer = "Offer"; + public const string OfficeBuilding = "OfficeBuilding"; + public const string OfficeBuildingMarker = "OfficeBuildingMarker"; + public const string OfficeBuildingMarkerOutline = "OfficeBuildingMarkerOutline"; + public const string OfficeBuildingOutline = "OfficeBuildingOutline"; + public const string Oil = "Oil"; + public const string OilLamp = "OilLamp"; + public const string OilLevel = "OilLevel"; + public const string OilTemperature = "OilTemperature"; + public const string Om = "Om"; + public const string Omega = "Omega"; + public const string Onepassword = "Onepassword"; + public const string OneUp = "OneUp"; + public const string Opacity = "Opacity"; + public const string Openid = "Openid"; + public const string OpenInApp = "OpenInApp"; + public const string OpenInNew = "OpenInNew"; + public const string OpenSourceInitiative = "OpenSourceInitiative"; + public const string Opera = "Opera"; + public const string Orbit = "Orbit"; + public const string OrbitVariant = "OrbitVariant"; + public const string OrderAlphabeticalAscending = "OrderAlphabeticalAscending"; + public const string OrderAlphabeticalDescending = "OrderAlphabeticalDescending"; + public const string OrderBoolAscending = "OrderBoolAscending"; + public const string OrderBoolAscendingVariant = "OrderBoolAscendingVariant"; + public const string OrderBoolDescending = "OrderBoolDescending"; + public const string OrderBoolDescendingVariant = "OrderBoolDescendingVariant"; + public const string OrderNumericAscending = "OrderNumericAscending"; + public const string OrderNumericDescending = "OrderNumericDescending"; + public const string Origin = "Origin"; + public const string Ornament = "Ornament"; + public const string OrnamentVariant = "OrnamentVariant"; + public const string OutdoorLamp = "OutdoorLamp"; + public const string Overscan = "Overscan"; + public const string Owl = "Owl"; + public const string Package = "Package"; + public const string PackageDown = "PackageDown"; + public const string PackageUp = "PackageUp"; + public const string PackageVariant = "PackageVariant"; + public const string PackageVariantClosed = "PackageVariantClosed"; + public const string PacMan = "PacMan"; + public const string PageFirst = "PageFirst"; + public const string PageLast = "PageLast"; + public const string PageLayoutBody = "PageLayoutBody"; + public const string PageLayoutFooter = "PageLayoutFooter"; + public const string PageLayoutHeader = "PageLayoutHeader"; + public const string PageLayoutHeaderFooter = "PageLayoutHeaderFooter"; + public const string PageLayoutSidebarLeft = "PageLayoutSidebarLeft"; + public const string PageLayoutSidebarRight = "PageLayoutSidebarRight"; + public const string PageNext = "PageNext"; + public const string PageNextOutline = "PageNextOutline"; + public const string PagePrevious = "PagePrevious"; + public const string PagePreviousOutline = "PagePreviousOutline"; + public const string Pail = "Pail"; + public const string PailMinus = "PailMinus"; + public const string PailMinusOutline = "PailMinusOutline"; + public const string PailOff = "PailOff"; + public const string PailOffOutline = "PailOffOutline"; + public const string PailOutline = "PailOutline"; + public const string PailPlus = "PailPlus"; + public const string PailPlusOutline = "PailPlusOutline"; + public const string PailRemove = "PailRemove"; + public const string PailRemoveOutline = "PailRemoveOutline"; + public const string Palette = "Palette"; + public const string PaletteAdvanced = "PaletteAdvanced"; + public const string PaletteOutline = "PaletteOutline"; + public const string PaletteSwatch = "PaletteSwatch"; + public const string PaletteSwatchOutline = "PaletteSwatchOutline"; + public const string PalmTree = "PalmTree"; + public const string Pan = "Pan"; + public const string PanBottomLeft = "PanBottomLeft"; + public const string PanBottomRight = "PanBottomRight"; + public const string Panda = "Panda"; + public const string Pandora = "Pandora"; + public const string PanDown = "PanDown"; + public const string PanHorizontal = "PanHorizontal"; + public const string PanLeft = "PanLeft"; + public const string Panorama = "Panorama"; + public const string PanoramaFisheye = "PanoramaFisheye"; + public const string PanoramaHorizontal = "PanoramaHorizontal"; + public const string PanoramaVertical = "PanoramaVertical"; + public const string PanoramaWideAngle = "PanoramaWideAngle"; + public const string PanRight = "PanRight"; + public const string PanTopLeft = "PanTopLeft"; + public const string PanTopRight = "PanTopRight"; + public const string PanUp = "PanUp"; + public const string PanVertical = "PanVertical"; + public const string Paperclip = "Paperclip"; + public const string PaperCutVertical = "PaperCutVertical"; + public const string PaperRoll = "PaperRoll"; + public const string PaperRollOutline = "PaperRollOutline"; + public const string Parachute = "Parachute"; + public const string ParachuteOutline = "ParachuteOutline"; + public const string Paragliding = "Paragliding"; + public const string Parking = "Parking"; + public const string PartyPopper = "PartyPopper"; + public const string Passport = "Passport"; + public const string PassportBiometric = "PassportBiometric"; + public const string Pasta = "Pasta"; + public const string PatioHeater = "PatioHeater"; + public const string Patreon = "Patreon"; + public const string Pause = "Pause"; + public const string PauseCircle = "PauseCircle"; + public const string PauseCircleOutline = "PauseCircleOutline"; + public const string PauseOctagon = "PauseOctagon"; + public const string PauseOctagonOutline = "PauseOctagonOutline"; + public const string Paw = "Paw"; + public const string PawOff = "PawOff"; + public const string PawOffOutline = "PawOffOutline"; + public const string PawOutline = "PawOutline"; + public const string Peace = "Peace"; + public const string Peanut = "Peanut"; + public const string PeanutOff = "PeanutOff"; + public const string PeanutOffOutline = "PeanutOffOutline"; + public const string PeanutOutline = "PeanutOutline"; + public const string Pen = "Pen"; + public const string Pencil = "Pencil"; + public const string PencilBox = "PencilBox"; + public const string PencilBoxMultiple = "PencilBoxMultiple"; + public const string PencilBoxMultipleOutline = "PencilBoxMultipleOutline"; + public const string PencilBoxOutline = "PencilBoxOutline"; + public const string PencilCircle = "PencilCircle"; + public const string PencilCircleOutline = "PencilCircleOutline"; + public const string PencilLock = "PencilLock"; + public const string PencilLockOutline = "PencilLockOutline"; + public const string PencilMinus = "PencilMinus"; + public const string PencilMinusOutline = "PencilMinusOutline"; + public const string PencilOff = "PencilOff"; + public const string PencilOffOutline = "PencilOffOutline"; + public const string PencilOutline = "PencilOutline"; + public const string PencilPlus = "PencilPlus"; + public const string PencilPlusOutline = "PencilPlusOutline"; + public const string PencilRemove = "PencilRemove"; + public const string PencilRemoveOutline = "PencilRemoveOutline"; + public const string PencilRuler = "PencilRuler"; + public const string Penguin = "Penguin"; + public const string PenLock = "PenLock"; + public const string PenMinus = "PenMinus"; + public const string PenOff = "PenOff"; + public const string PenPlus = "PenPlus"; + public const string PenRemove = "PenRemove"; + public const string Pentagon = "Pentagon"; + public const string PentagonOutline = "PentagonOutline"; + public const string Pentagram = "Pentagram"; + public const string Percent = "Percent"; + public const string PercentOutline = "PercentOutline"; + public const string PeriodicTable = "PeriodicTable"; + public const string PerspectiveLess = "PerspectiveLess"; + public const string PerspectiveMore = "PerspectiveMore"; + public const string Ph = "Ph"; + public const string Phone = "Phone"; + public const string PhoneAlert = "PhoneAlert"; + public const string PhoneAlertOutline = "PhoneAlertOutline"; + public const string PhoneBluetooth = "PhoneBluetooth"; + public const string PhoneBluetoothOutline = "PhoneBluetoothOutline"; + public const string PhoneCancel = "PhoneCancel"; + public const string PhoneCancelOutline = "PhoneCancelOutline"; + public const string PhoneCheck = "PhoneCheck"; + public const string PhoneCheckOutline = "PhoneCheckOutline"; + public const string PhoneClassic = "PhoneClassic"; + public const string PhoneClassicOff = "PhoneClassicOff"; + public const string PhoneDial = "PhoneDial"; + public const string PhoneDialOutline = "PhoneDialOutline"; + public const string PhoneForward = "PhoneForward"; + public const string PhoneForwardOutline = "PhoneForwardOutline"; + public const string PhoneHangup = "PhoneHangup"; + public const string PhoneHangupOutline = "PhoneHangupOutline"; + public const string PhoneIncoming = "PhoneIncoming"; + public const string PhoneIncomingOutline = "PhoneIncomingOutline"; + public const string PhoneInTalk = "PhoneInTalk"; + public const string PhoneInTalkOutline = "PhoneInTalkOutline"; + public const string PhoneLock = "PhoneLock"; + public const string PhoneLockOutline = "PhoneLockOutline"; + public const string PhoneLog = "PhoneLog"; + public const string PhoneLogOutline = "PhoneLogOutline"; + public const string PhoneMessage = "PhoneMessage"; + public const string PhoneMessageOutline = "PhoneMessageOutline"; + public const string PhoneMinus = "PhoneMinus"; + public const string PhoneMinusOutline = "PhoneMinusOutline"; + public const string PhoneMissed = "PhoneMissed"; + public const string PhoneMissedOutline = "PhoneMissedOutline"; + public const string PhoneOff = "PhoneOff"; + public const string PhoneOffOutline = "PhoneOffOutline"; + public const string PhoneOutgoing = "PhoneOutgoing"; + public const string PhoneOutgoingOutline = "PhoneOutgoingOutline"; + public const string PhoneOutline = "PhoneOutline"; + public const string PhonePaused = "PhonePaused"; + public const string PhonePausedOutline = "PhonePausedOutline"; + public const string PhonePlus = "PhonePlus"; + public const string PhonePlusOutline = "PhonePlusOutline"; + public const string PhoneRemove = "PhoneRemove"; + public const string PhoneRemoveOutline = "PhoneRemoveOutline"; + public const string PhoneReturn = "PhoneReturn"; + public const string PhoneReturnOutline = "PhoneReturnOutline"; + public const string PhoneRing = "PhoneRing"; + public const string PhoneRingOutline = "PhoneRingOutline"; + public const string PhoneRotateLandscape = "PhoneRotateLandscape"; + public const string PhoneRotatePortrait = "PhoneRotatePortrait"; + public const string PhoneSettings = "PhoneSettings"; + public const string PhoneSettingsOutline = "PhoneSettingsOutline"; + public const string PhoneVoip = "PhoneVoip"; + public const string Pi = "Pi"; + public const string Piano = "Piano"; + public const string PianoOff = "PianoOff"; + public const string PiBox = "PiBox"; + public const string Pickaxe = "Pickaxe"; + public const string PictureInPictureBottomRight = "PictureInPictureBottomRight"; + public const string PictureInPictureBottomRightOutline = "PictureInPictureBottomRightOutline"; + public const string PictureInPictureTopRight = "PictureInPictureTopRight"; + public const string PictureInPictureTopRightOutline = "PictureInPictureTopRightOutline"; + public const string Pier = "Pier"; + public const string PierCrane = "PierCrane"; + public const string Pig = "Pig"; + public const string PiggyBank = "PiggyBank"; + public const string PiggyBankOutline = "PiggyBankOutline"; + public const string PigVariant = "PigVariant"; + public const string PigVariantOutline = "PigVariantOutline"; + public const string PiHole = "PiHole"; + public const string Pill = "Pill"; + public const string Pillar = "Pillar"; + public const string Pin = "Pin"; + public const string PineTree = "PineTree"; + public const string PineTreeBox = "PineTreeBox"; + public const string PineTreeFire = "PineTreeFire"; + public const string PinOff = "PinOff"; + public const string PinOffOutline = "PinOffOutline"; + public const string PinOutline = "PinOutline"; + public const string Pinterest = "Pinterest"; + public const string Pinwheel = "Pinwheel"; + public const string PinwheelOutline = "PinwheelOutline"; + public const string Pipe = "Pipe"; + public const string PipeDisconnected = "PipeDisconnected"; + public const string PipeLeak = "PipeLeak"; + public const string PipeValve = "PipeValve"; + public const string PipeWrench = "PipeWrench"; + public const string Pirate = "Pirate"; + public const string Pistol = "Pistol"; + public const string Piston = "Piston"; + public const string Pitchfork = "Pitchfork"; + public const string Pizza = "Pizza"; + public const string Play = "Play"; + public const string PlayBox = "PlayBox"; + public const string PlayBoxMultiple = "PlayBoxMultiple"; + public const string PlayBoxMultipleOutline = "PlayBoxMultipleOutline"; + public const string PlayBoxOutline = "PlayBoxOutline"; + public const string PlayCircle = "PlayCircle"; + public const string PlayCircleOutline = "PlayCircleOutline"; + public const string PlaylistCheck = "PlaylistCheck"; + public const string PlaylistEdit = "PlaylistEdit"; + public const string PlaylistMinus = "PlaylistMinus"; + public const string PlaylistMusic = "PlaylistMusic"; + public const string PlaylistMusicOutline = "PlaylistMusicOutline"; + public const string PlaylistPlay = "PlaylistPlay"; + public const string PlaylistPlus = "PlaylistPlus"; + public const string PlaylistRemove = "PlaylistRemove"; + public const string PlaylistStar = "PlaylistStar"; + public const string PlayNetwork = "PlayNetwork"; + public const string PlayNetworkOutline = "PlayNetworkOutline"; + public const string PlayOutline = "PlayOutline"; + public const string PlayPause = "PlayPause"; + public const string PlayProtectedContent = "PlayProtectedContent"; + public const string PlaySpeed = "PlaySpeed"; + public const string Plex = "Plex"; + public const string Plus = "Plus"; + public const string PlusBox = "PlusBox"; + public const string PlusBoxMultiple = "PlusBoxMultiple"; + public const string PlusBoxMultipleOutline = "PlusBoxMultipleOutline"; + public const string PlusBoxOutline = "PlusBoxOutline"; + public const string PlusCircle = "PlusCircle"; + public const string PlusCircleMultiple = "PlusCircleMultiple"; + public const string PlusCircleMultipleOutline = "PlusCircleMultipleOutline"; + public const string PlusCircleOutline = "PlusCircleOutline"; + public const string PlusMinus = "PlusMinus"; + public const string PlusMinusBox = "PlusMinusBox"; + public const string PlusMinusVariant = "PlusMinusVariant"; + public const string PlusNetwork = "PlusNetwork"; + public const string PlusNetworkOutline = "PlusNetworkOutline"; + public const string PlusOutline = "PlusOutline"; + public const string PlusThick = "PlusThick"; + public const string Podcast = "Podcast"; + public const string Podium = "Podium"; + public const string PodiumBronze = "PodiumBronze"; + public const string PodiumGold = "PodiumGold"; + public const string PodiumSilver = "PodiumSilver"; + public const string PointOfSale = "PointOfSale"; + public const string Pokeball = "Pokeball"; + public const string PokemonGo = "PokemonGo"; + public const string PokerChip = "PokerChip"; + public const string Polaroid = "Polaroid"; + public const string PoliceBadge = "PoliceBadge"; + public const string PoliceBadgeOutline = "PoliceBadgeOutline"; + public const string PoliceStation = "PoliceStation"; + public const string Poll = "Poll"; + public const string Polo = "Polo"; + public const string Polymer = "Polymer"; + public const string Pool = "Pool"; + public const string Popcorn = "Popcorn"; + public const string Post = "Post"; + public const string PostageStamp = "PostageStamp"; + public const string PostOutline = "PostOutline"; + public const string Pot = "Pot"; + public const string PotMix = "PotMix"; + public const string PotMixOutline = "PotMixOutline"; + public const string PotOutline = "PotOutline"; + public const string PotSteam = "PotSteam"; + public const string PotSteamOutline = "PotSteamOutline"; + public const string Pound = "Pound"; + public const string PoundBox = "PoundBox"; + public const string PoundBoxOutline = "PoundBoxOutline"; + public const string Power = "Power"; + public const string PowerCycle = "PowerCycle"; + public const string PowerOff = "PowerOff"; + public const string PowerOn = "PowerOn"; + public const string PowerPlug = "PowerPlug"; + public const string PowerPlugOff = "PowerPlugOff"; + public const string PowerPlugOffOutline = "PowerPlugOffOutline"; + public const string PowerPlugOutline = "PowerPlugOutline"; + public const string PowerSettings = "PowerSettings"; + public const string Powershell = "Powershell"; + public const string PowerSleep = "PowerSleep"; + public const string PowerSocket = "PowerSocket"; + public const string PowerSocketAu = "PowerSocketAu"; + public const string PowerSocketCh = "PowerSocketCh"; + public const string PowerSocketDe = "PowerSocketDe"; + public const string PowerSocketEu = "PowerSocketEu"; + public const string PowerSocketFr = "PowerSocketFr"; + public const string PowerSocketIt = "PowerSocketIt"; + public const string PowerSocketJp = "PowerSocketJp"; + public const string PowerSocketUk = "PowerSocketUk"; + public const string PowerSocketUs = "PowerSocketUs"; + public const string PowerStandby = "PowerStandby"; + public const string Prescription = "Prescription"; + public const string Presentation = "Presentation"; + public const string PresentationPlay = "PresentationPlay"; + public const string Pretzel = "Pretzel"; + public const string Printer = "Printer"; + public const string Printer3d = "Printer3d"; + public const string Printer3dNozzle = "Printer3dNozzle"; + public const string Printer3dNozzleAlert = "Printer3dNozzleAlert"; + public const string Printer3dNozzleAlertOutline = "Printer3dNozzleAlertOutline"; + public const string Printer3dNozzleHeat = "Printer3dNozzleHeat"; + public const string Printer3dNozzleHeatOutline = "Printer3dNozzleHeatOutline"; + public const string Printer3dNozzleOutline = "Printer3dNozzleOutline"; + public const string PrinterAlert = "PrinterAlert"; + public const string PrinterCheck = "PrinterCheck"; + public const string PrinterEye = "PrinterEye"; + public const string PrinterOff = "PrinterOff"; + public const string PrinterOffOutline = "PrinterOffOutline"; + public const string PrinterOutline = "PrinterOutline"; + public const string PrinterPos = "PrinterPos"; + public const string PrinterSearch = "PrinterSearch"; + public const string PrinterSettings = "PrinterSettings"; + public const string PrinterWireless = "PrinterWireless"; + public const string PriorityHigh = "PriorityHigh"; + public const string PriorityLow = "PriorityLow"; + public const string ProfessionalHexagon = "ProfessionalHexagon"; + public const string ProgressAlert = "ProgressAlert"; + public const string ProgressCheck = "ProgressCheck"; + public const string ProgressClock = "ProgressClock"; + public const string ProgressClose = "ProgressClose"; + public const string ProgressDownload = "ProgressDownload"; + public const string ProgressPencil = "ProgressPencil"; + public const string ProgressQuestion = "ProgressQuestion"; + public const string ProgressStar = "ProgressStar"; + public const string ProgressUpload = "ProgressUpload"; + public const string ProgressWrench = "ProgressWrench"; + public const string Projector = "Projector"; + public const string ProjectorScreen = "ProjectorScreen"; + public const string ProjectorScreenOff = "ProjectorScreenOff"; + public const string ProjectorScreenOffOutline = "ProjectorScreenOffOutline"; + public const string ProjectorScreenOutline = "ProjectorScreenOutline"; + public const string ProjectorScreenVariant = "ProjectorScreenVariant"; + public const string ProjectorScreenVariantOff = "ProjectorScreenVariantOff"; + public const string ProjectorScreenVariantOffOutline = "ProjectorScreenVariantOffOutline"; + public const string ProjectorScreenVariantOutline = "ProjectorScreenVariantOutline"; + public const string PropaneTank = "PropaneTank"; + public const string PropaneTankOutline = "PropaneTankOutline"; + public const string Protocol = "Protocol"; + public const string Publish = "Publish"; + public const string Pulse = "Pulse"; + public const string Pump = "Pump"; + public const string Pumpkin = "Pumpkin"; + public const string Purse = "Purse"; + public const string PurseOutline = "PurseOutline"; + public const string Puzzle = "Puzzle"; + public const string PuzzleCheck = "PuzzleCheck"; + public const string PuzzleCheckOutline = "PuzzleCheckOutline"; + public const string PuzzleEdit = "PuzzleEdit"; + public const string PuzzleEditOutline = "PuzzleEditOutline"; + public const string PuzzleHeart = "PuzzleHeart"; + public const string PuzzleHeartOutline = "PuzzleHeartOutline"; + public const string PuzzleMinus = "PuzzleMinus"; + public const string PuzzleMinusOutline = "PuzzleMinusOutline"; + public const string PuzzleOutline = "PuzzleOutline"; + public const string PuzzlePlus = "PuzzlePlus"; + public const string PuzzlePlusOutline = "PuzzlePlusOutline"; + public const string PuzzleRemove = "PuzzleRemove"; + public const string PuzzleRemoveOutline = "PuzzleRemoveOutline"; + public const string PuzzleStar = "PuzzleStar"; + public const string PuzzleStarOutline = "PuzzleStarOutline"; + public const string Qi = "Qi"; + public const string Qqchat = "Qqchat"; + public const string Qrcode = "Qrcode"; + public const string QrcodeEdit = "QrcodeEdit"; + public const string QrcodeMinus = "QrcodeMinus"; + public const string QrcodePlus = "QrcodePlus"; + public const string QrcodeRemove = "QrcodeRemove"; + public const string QrcodeScan = "QrcodeScan"; + public const string Quadcopter = "Quadcopter"; + public const string QualityHigh = "QualityHigh"; + public const string QualityLow = "QualityLow"; + public const string QualityMedium = "QualityMedium"; + public const string Quora = "Quora"; + public const string Rabbit = "Rabbit"; + public const string RacingHelmet = "RacingHelmet"; + public const string Racquetball = "Racquetball"; + public const string Radar = "Radar"; + public const string Radiator = "Radiator"; + public const string RadiatorDisabled = "RadiatorDisabled"; + public const string RadiatorOff = "RadiatorOff"; + public const string Radio = "Radio"; + public const string Radioactive = "Radioactive"; + public const string RadioactiveCircle = "RadioactiveCircle"; + public const string RadioactiveCircleOutline = "RadioactiveCircleOutline"; + public const string RadioactiveOff = "RadioactiveOff"; + public const string RadioAm = "RadioAm"; + public const string RadioboxBlank = "RadioboxBlank"; + public const string RadioboxMarked = "RadioboxMarked"; + public const string RadioFm = "RadioFm"; + public const string RadioHandheld = "RadioHandheld"; + public const string RadiologyBox = "RadiologyBox"; + public const string RadiologyBoxOutline = "RadiologyBoxOutline"; + public const string RadioOff = "RadioOff"; + public const string RadioTower = "RadioTower"; + public const string Radius = "Radius"; + public const string RadiusOutline = "RadiusOutline"; + public const string RailroadLight = "RailroadLight"; + public const string Rake = "Rake"; + public const string RaspberryPi = "RaspberryPi"; + public const string RayEnd = "RayEnd"; + public const string RayEndArrow = "RayEndArrow"; + public const string RayStart = "RayStart"; + public const string RayStartArrow = "RayStartArrow"; + public const string RayStartEnd = "RayStartEnd"; + public const string RayStartVertexEnd = "RayStartVertexEnd"; + public const string RayVertex = "RayVertex"; + public const string React = "React"; + public const string Read = "Read"; + public const string Receipt = "Receipt"; + public const string Record = "Record"; + public const string RecordCircle = "RecordCircle"; + public const string RecordCircleOutline = "RecordCircleOutline"; + public const string RecordPlayer = "RecordPlayer"; + public const string RecordRec = "RecordRec"; + public const string Rectangle = "Rectangle"; + public const string RectangleOutline = "RectangleOutline"; + public const string Recycle = "Recycle"; + public const string RecycleVariant = "RecycleVariant"; + public const string Reddit = "Reddit"; + public const string Redhat = "Redhat"; + public const string Redo = "Redo"; + public const string RedoVariant = "RedoVariant"; + public const string ReflectHorizontal = "ReflectHorizontal"; + public const string ReflectVertical = "ReflectVertical"; + public const string Refresh = "Refresh"; + public const string RefreshAuto = "RefreshAuto"; + public const string RefreshCircle = "RefreshCircle"; + public const string Regex = "Regex"; + public const string RegisteredTrademark = "RegisteredTrademark"; + public const string Reiterate = "Reiterate"; + public const string RelationManyToMany = "RelationManyToMany"; + public const string RelationManyToOne = "RelationManyToOne"; + public const string RelationManyToOneOrMany = "RelationManyToOneOrMany"; + public const string RelationManyToOnlyOne = "RelationManyToOnlyOne"; + public const string RelationManyToZeroOrMany = "RelationManyToZeroOrMany"; + public const string RelationManyToZeroOrOne = "RelationManyToZeroOrOne"; + public const string RelationOneOrManyToMany = "RelationOneOrManyToMany"; + public const string RelationOneOrManyToOne = "RelationOneOrManyToOne"; + public const string RelationOneOrManyToOneOrMany = "RelationOneOrManyToOneOrMany"; + public const string RelationOneOrManyToOnlyOne = "RelationOneOrManyToOnlyOne"; + public const string RelationOneOrManyToZeroOrMany = "RelationOneOrManyToZeroOrMany"; + public const string RelationOneOrManyToZeroOrOne = "RelationOneOrManyToZeroOrOne"; + public const string RelationOneToMany = "RelationOneToMany"; + public const string RelationOneToOne = "RelationOneToOne"; + public const string RelationOneToOneOrMany = "RelationOneToOneOrMany"; + public const string RelationOneToOnlyOne = "RelationOneToOnlyOne"; + public const string RelationOneToZeroOrMany = "RelationOneToZeroOrMany"; + public const string RelationOneToZeroOrOne = "RelationOneToZeroOrOne"; + public const string RelationOnlyOneToMany = "RelationOnlyOneToMany"; + public const string RelationOnlyOneToOne = "RelationOnlyOneToOne"; + public const string RelationOnlyOneToOneOrMany = "RelationOnlyOneToOneOrMany"; + public const string RelationOnlyOneToOnlyOne = "RelationOnlyOneToOnlyOne"; + public const string RelationOnlyOneToZeroOrMany = "RelationOnlyOneToZeroOrMany"; + public const string RelationOnlyOneToZeroOrOne = "RelationOnlyOneToZeroOrOne"; + public const string RelationZeroOrManyToMany = "RelationZeroOrManyToMany"; + public const string RelationZeroOrManyToOne = "RelationZeroOrManyToOne"; + public const string RelationZeroOrManyToOneOrMany = "RelationZeroOrManyToOneOrMany"; + public const string RelationZeroOrManyToOnlyOne = "RelationZeroOrManyToOnlyOne"; + public const string RelationZeroOrManyToZeroOrMany = "RelationZeroOrManyToZeroOrMany"; + public const string RelationZeroOrManyToZeroOrOne = "RelationZeroOrManyToZeroOrOne"; + public const string RelationZeroOrOneToMany = "RelationZeroOrOneToMany"; + public const string RelationZeroOrOneToOne = "RelationZeroOrOneToOne"; + public const string RelationZeroOrOneToOneOrMany = "RelationZeroOrOneToOneOrMany"; + public const string RelationZeroOrOneToOnlyOne = "RelationZeroOrOneToOnlyOne"; + public const string RelationZeroOrOneToZeroOrMany = "RelationZeroOrOneToZeroOrMany"; + public const string RelationZeroOrOneToZeroOrOne = "RelationZeroOrOneToZeroOrOne"; + public const string RelativeScale = "RelativeScale"; + public const string Reload = "Reload"; + public const string ReloadAlert = "ReloadAlert"; + public const string Reminder = "Reminder"; + public const string Remote = "Remote"; + public const string RemoteDesktop = "RemoteDesktop"; + public const string RemoteOff = "RemoteOff"; + public const string RemoteTv = "RemoteTv"; + public const string RemoteTvOff = "RemoteTvOff"; + public const string RenameBox = "RenameBox"; + public const string ReorderHorizontal = "ReorderHorizontal"; + public const string ReorderVertical = "ReorderVertical"; + public const string Repeat = "Repeat"; + public const string RepeatOff = "RepeatOff"; + public const string RepeatOnce = "RepeatOnce"; + public const string RepeatVariant = "RepeatVariant"; + public const string Replay = "Replay"; + public const string Reply = "Reply"; + public const string ReplyAll = "ReplyAll"; + public const string ReplyAllOutline = "ReplyAllOutline"; + public const string ReplyCircle = "ReplyCircle"; + public const string ReplyOutline = "ReplyOutline"; + public const string Reproduction = "Reproduction"; + public const string Resistor = "Resistor"; + public const string ResistorNodes = "ResistorNodes"; + public const string Resize = "Resize"; + public const string ResizeBottomRight = "ResizeBottomRight"; + public const string Responsive = "Responsive"; + public const string Restart = "Restart"; + public const string RestartAlert = "RestartAlert"; + public const string RestartOff = "RestartOff"; + public const string Restore = "Restore"; + public const string RestoreAlert = "RestoreAlert"; + public const string Rewind = "Rewind"; + public const string Rewind10 = "Rewind10"; + public const string Rewind30 = "Rewind30"; + public const string Rewind5 = "Rewind5"; + public const string Rewind60 = "Rewind60"; + public const string RewindOutline = "RewindOutline"; + public const string Rhombus = "Rhombus"; + public const string RhombusMedium = "RhombusMedium"; + public const string RhombusMediumOutline = "RhombusMediumOutline"; + public const string RhombusOutline = "RhombusOutline"; + public const string RhombusSplit = "RhombusSplit"; + public const string RhombusSplitOutline = "RhombusSplitOutline"; + public const string Ribbon = "Ribbon"; + public const string Rice = "Rice"; + public const string Rickshaw = "Rickshaw"; + public const string RickshawElectric = "RickshawElectric"; + public const string Ring = "Ring"; + public const string Rivet = "Rivet"; + public const string Road = "Road"; + public const string RoadVariant = "RoadVariant"; + public const string Robber = "Robber"; + public const string Robot = "Robot"; + public const string RobotAngry = "RobotAngry"; + public const string RobotAngryOutline = "RobotAngryOutline"; + public const string RobotConfused = "RobotConfused"; + public const string RobotConfusedOutline = "RobotConfusedOutline"; + public const string RobotDead = "RobotDead"; + public const string RobotDeadOutline = "RobotDeadOutline"; + public const string RobotExcited = "RobotExcited"; + public const string RobotExcitedOutline = "RobotExcitedOutline"; + public const string RobotHappy = "RobotHappy"; + public const string RobotHappyOutline = "RobotHappyOutline"; + public const string RobotIndustrial = "RobotIndustrial"; + public const string RobotLove = "RobotLove"; + public const string RobotLoveOutline = "RobotLoveOutline"; + public const string RobotMower = "RobotMower"; + public const string RobotMowerOutline = "RobotMowerOutline"; + public const string RobotOff = "RobotOff"; + public const string RobotOffOutline = "RobotOffOutline"; + public const string RobotOutline = "RobotOutline"; + public const string RobotVacuum = "RobotVacuum"; + public const string RobotVacuumVariant = "RobotVacuumVariant"; + public const string Rocket = "Rocket"; + public const string RocketLaunch = "RocketLaunch"; + public const string RocketLaunchOutline = "RocketLaunchOutline"; + public const string RocketOutline = "RocketOutline"; + public const string Rodent = "Rodent"; + public const string Rollerblade = "Rollerblade"; + public const string RollerbladeOff = "RollerbladeOff"; + public const string RollerSkate = "RollerSkate"; + public const string RollerSkateOff = "RollerSkateOff"; + public const string Rollupjs = "Rollupjs"; + public const string RomanNumeral1 = "RomanNumeral1"; + public const string RomanNumeral10 = "RomanNumeral10"; + public const string RomanNumeral2 = "RomanNumeral2"; + public const string RomanNumeral3 = "RomanNumeral3"; + public const string RomanNumeral4 = "RomanNumeral4"; + public const string RomanNumeral5 = "RomanNumeral5"; + public const string RomanNumeral6 = "RomanNumeral6"; + public const string RomanNumeral7 = "RomanNumeral7"; + public const string RomanNumeral8 = "RomanNumeral8"; + public const string RomanNumeral9 = "RomanNumeral9"; + public const string RoomService = "RoomService"; + public const string RoomServiceOutline = "RoomServiceOutline"; + public const string Rotate3d = "Rotate3d"; + public const string Rotate3dVariant = "Rotate3dVariant"; + public const string RotateLeft = "RotateLeft"; + public const string RotateLeftVariant = "RotateLeftVariant"; + public const string RotateOrbit = "RotateOrbit"; + public const string RotateRight = "RotateRight"; + public const string RotateRightVariant = "RotateRightVariant"; + public const string RoundedCorner = "RoundedCorner"; + public const string Router = "Router"; + public const string RouterNetwork = "RouterNetwork"; + public const string RouterWireless = "RouterWireless"; + public const string RouterWirelessOff = "RouterWirelessOff"; + public const string RouterWirelessSettings = "RouterWirelessSettings"; + public const string Routes = "Routes"; + public const string RoutesClock = "RoutesClock"; + public const string Rowing = "Rowing"; + public const string Rss = "Rss"; + public const string RssBox = "RssBox"; + public const string RssOff = "RssOff"; + public const string Rug = "Rug"; + public const string Rugby = "Rugby"; + public const string Ruler = "Ruler"; + public const string RulerSquare = "RulerSquare"; + public const string RulerSquareCompass = "RulerSquareCompass"; + public const string Run = "Run"; + public const string RunFast = "RunFast"; + public const string RvTruck = "RvTruck"; + public const string Sack = "Sack"; + public const string SackPercent = "SackPercent"; + public const string Safe = "Safe"; + public const string SafeSquare = "SafeSquare"; + public const string SafeSquareOutline = "SafeSquareOutline"; + public const string SafetyGoggles = "SafetyGoggles"; + public const string SailBoat = "SailBoat"; + public const string Sale = "Sale"; + public const string Salesforce = "Salesforce"; + public const string Sass = "Sass"; + public const string Satellite = "Satellite"; + public const string SatelliteUplink = "SatelliteUplink"; + public const string SatelliteVariant = "SatelliteVariant"; + public const string Sausage = "Sausage"; + public const string SausageOff = "SausageOff"; + public const string SawBlade = "SawBlade"; + public const string SawtoothWave = "SawtoothWave"; + public const string Saxophone = "Saxophone"; + public const string Scale = "Scale"; + public const string ScaleBalance = "ScaleBalance"; + public const string ScaleBathroom = "ScaleBathroom"; + public const string ScaleOff = "ScaleOff"; + public const string ScanHelper = "ScanHelper"; + public const string Scanner = "Scanner"; + public const string ScannerOff = "ScannerOff"; + public const string ScatterPlot = "ScatterPlot"; + public const string ScatterPlotOutline = "ScatterPlotOutline"; + public const string School = "School"; + public const string SchoolOutline = "SchoolOutline"; + public const string ScissorsCutting = "ScissorsCutting"; + public const string Scooter = "Scooter"; + public const string ScooterElectric = "ScooterElectric"; + public const string Scoreboard = "Scoreboard"; + public const string ScoreboardOutline = "ScoreboardOutline"; + public const string ScreenRotation = "ScreenRotation"; + public const string ScreenRotationLock = "ScreenRotationLock"; + public const string Screwdriver = "Screwdriver"; + public const string ScrewFlatTop = "ScrewFlatTop"; + public const string ScrewLag = "ScrewLag"; + public const string ScrewMachineFlatTop = "ScrewMachineFlatTop"; + public const string ScrewMachineRoundTop = "ScrewMachineRoundTop"; + public const string ScrewRoundTop = "ScrewRoundTop"; + public const string Script = "Script"; + public const string ScriptOutline = "ScriptOutline"; + public const string ScriptText = "ScriptText"; + public const string ScriptTextKey = "ScriptTextKey"; + public const string ScriptTextKeyOutline = "ScriptTextKeyOutline"; + public const string ScriptTextOutline = "ScriptTextOutline"; + public const string ScriptTextPlay = "ScriptTextPlay"; + public const string ScriptTextPlayOutline = "ScriptTextPlayOutline"; + public const string Sd = "Sd"; + public const string Seal = "Seal"; + public const string SealVariant = "SealVariant"; + public const string SearchWeb = "SearchWeb"; + public const string Seat = "Seat"; + public const string Seatbelt = "Seatbelt"; + public const string SeatFlat = "SeatFlat"; + public const string SeatFlatAngled = "SeatFlatAngled"; + public const string SeatIndividualSuite = "SeatIndividualSuite"; + public const string SeatLegroomExtra = "SeatLegroomExtra"; + public const string SeatLegroomNormal = "SeatLegroomNormal"; + public const string SeatLegroomReduced = "SeatLegroomReduced"; + public const string SeatOutline = "SeatOutline"; + public const string SeatPassenger = "SeatPassenger"; + public const string SeatReclineExtra = "SeatReclineExtra"; + public const string SeatReclineNormal = "SeatReclineNormal"; + public const string Security = "Security"; + public const string SecurityNetwork = "SecurityNetwork"; + public const string Seed = "Seed"; + public const string SeedOff = "SeedOff"; + public const string SeedOffOutline = "SeedOffOutline"; + public const string SeedOutline = "SeedOutline"; + public const string Seesaw = "Seesaw"; + public const string Segment = "Segment"; + public const string Select = "Select"; + public const string SelectAll = "SelectAll"; + public const string SelectColor = "SelectColor"; + public const string SelectCompare = "SelectCompare"; + public const string SelectDrag = "SelectDrag"; + public const string SelectGroup = "SelectGroup"; + public const string SelectInverse = "SelectInverse"; + public const string Selection = "Selection"; + public const string SelectionDrag = "SelectionDrag"; + public const string SelectionEllipse = "SelectionEllipse"; + public const string SelectionEllipseArrowInside = "SelectionEllipseArrowInside"; + public const string SelectionEllipseRemove = "SelectionEllipseRemove"; + public const string SelectionMarker = "SelectionMarker"; + public const string SelectionMultiple = "SelectionMultiple"; + public const string SelectionMultipleMarker = "SelectionMultipleMarker"; + public const string SelectionOff = "SelectionOff"; + public const string SelectionRemove = "SelectionRemove"; + public const string SelectionSearch = "SelectionSearch"; + public const string SelectMarker = "SelectMarker"; + public const string SelectMultiple = "SelectMultiple"; + public const string SelectMultipleMarker = "SelectMultipleMarker"; + public const string SelectOff = "SelectOff"; + public const string SelectPlace = "SelectPlace"; + public const string SelectRemove = "SelectRemove"; + public const string SelectSearch = "SelectSearch"; + public const string SemanticWeb = "SemanticWeb"; + public const string Send = "Send"; + public const string SendCheck = "SendCheck"; + public const string SendCheckOutline = "SendCheckOutline"; + public const string SendCircle = "SendCircle"; + public const string SendCircleOutline = "SendCircleOutline"; + public const string SendClock = "SendClock"; + public const string SendClockOutline = "SendClockOutline"; + public const string SendLock = "SendLock"; + public const string SendLockOutline = "SendLockOutline"; + public const string SendOutline = "SendOutline"; + public const string SerialPort = "SerialPort"; + public const string Server = "Server"; + public const string ServerMinus = "ServerMinus"; + public const string ServerNetwork = "ServerNetwork"; + public const string ServerNetworkOff = "ServerNetworkOff"; + public const string ServerOff = "ServerOff"; + public const string ServerPlus = "ServerPlus"; + public const string ServerRemove = "ServerRemove"; + public const string ServerSecurity = "ServerSecurity"; + public const string SetAll = "SetAll"; + public const string SetCenter = "SetCenter"; + public const string SetCenterRight = "SetCenterRight"; + public const string SetLeft = "SetLeft"; + public const string SetLeftCenter = "SetLeftCenter"; + public const string SetLeftRight = "SetLeftRight"; + public const string SetMerge = "SetMerge"; + public const string SetNone = "SetNone"; + public const string SetRight = "SetRight"; + public const string SetSplit = "SetSplit"; + public const string SetSquare = "SetSquare"; + public const string SettingsHelper = "SettingsHelper"; + public const string SetTopBox = "SetTopBox"; + public const string Shaker = "Shaker"; + public const string ShakerOutline = "ShakerOutline"; + public const string Shape = "Shape"; + public const string ShapeCirclePlus = "ShapeCirclePlus"; + public const string ShapeOutline = "ShapeOutline"; + public const string ShapeOvalPlus = "ShapeOvalPlus"; + public const string ShapePlus = "ShapePlus"; + public const string ShapePolygonPlus = "ShapePolygonPlus"; + public const string ShapeRectanglePlus = "ShapeRectanglePlus"; + public const string ShapeSquarePlus = "ShapeSquarePlus"; + public const string ShapeSquareRoundedPlus = "ShapeSquareRoundedPlus"; + public const string Share = "Share"; + public const string ShareAll = "ShareAll"; + public const string ShareAllOutline = "ShareAllOutline"; + public const string ShareCircle = "ShareCircle"; + public const string ShareOff = "ShareOff"; + public const string ShareOffOutline = "ShareOffOutline"; + public const string ShareOutline = "ShareOutline"; + public const string ShareVariant = "ShareVariant"; + public const string ShareVariantOutline = "ShareVariantOutline"; + public const string Shark = "Shark"; + public const string SharkFin = "SharkFin"; + public const string SharkFinOutline = "SharkFinOutline"; + public const string SharkOff = "SharkOff"; + public const string Sheep = "Sheep"; + public const string Shield = "Shield"; + public const string ShieldAccount = "ShieldAccount"; + public const string ShieldAccountOutline = "ShieldAccountOutline"; + public const string ShieldAccountVariant = "ShieldAccountVariant"; + public const string ShieldAccountVariantOutline = "ShieldAccountVariantOutline"; + public const string ShieldAirplane = "ShieldAirplane"; + public const string ShieldAirplaneOutline = "ShieldAirplaneOutline"; + public const string ShieldAlert = "ShieldAlert"; + public const string ShieldAlertOutline = "ShieldAlertOutline"; + public const string ShieldBug = "ShieldBug"; + public const string ShieldBugOutline = "ShieldBugOutline"; + public const string ShieldCar = "ShieldCar"; + public const string ShieldCheck = "ShieldCheck"; + public const string ShieldCheckOutline = "ShieldCheckOutline"; + public const string ShieldCross = "ShieldCross"; + public const string ShieldCrossOutline = "ShieldCrossOutline"; + public const string ShieldCrown = "ShieldCrown"; + public const string ShieldCrownOutline = "ShieldCrownOutline"; + public const string ShieldEdit = "ShieldEdit"; + public const string ShieldEditOutline = "ShieldEditOutline"; + public const string ShieldHalf = "ShieldHalf"; + public const string ShieldHalfFull = "ShieldHalfFull"; + public const string ShieldHome = "ShieldHome"; + public const string ShieldHomeOutline = "ShieldHomeOutline"; + public const string ShieldKey = "ShieldKey"; + public const string ShieldKeyOutline = "ShieldKeyOutline"; + public const string ShieldLinkVariant = "ShieldLinkVariant"; + public const string ShieldLinkVariantOutline = "ShieldLinkVariantOutline"; + public const string ShieldLock = "ShieldLock"; + public const string ShieldLockOutline = "ShieldLockOutline"; + public const string ShieldMoon = "ShieldMoon"; + public const string ShieldMoonOutline = "ShieldMoonOutline"; + public const string ShieldOff = "ShieldOff"; + public const string ShieldOffOutline = "ShieldOffOutline"; + public const string ShieldOutline = "ShieldOutline"; + public const string ShieldPlus = "ShieldPlus"; + public const string ShieldPlusOutline = "ShieldPlusOutline"; + public const string ShieldRefresh = "ShieldRefresh"; + public const string ShieldRefreshOutline = "ShieldRefreshOutline"; + public const string ShieldRemove = "ShieldRemove"; + public const string ShieldRemoveOutline = "ShieldRemoveOutline"; + public const string ShieldSearch = "ShieldSearch"; + public const string ShieldStar = "ShieldStar"; + public const string ShieldStarOutline = "ShieldStarOutline"; + public const string ShieldSun = "ShieldSun"; + public const string ShieldSunOutline = "ShieldSunOutline"; + public const string ShieldSword = "ShieldSword"; + public const string ShieldSwordOutline = "ShieldSwordOutline"; + public const string ShieldSync = "ShieldSync"; + public const string ShieldSyncOutline = "ShieldSyncOutline"; + public const string Shimmer = "Shimmer"; + public const string ShippingPallet = "ShippingPallet"; + public const string ShipWheel = "ShipWheel"; + public const string ShoeBallet = "ShoeBallet"; + public const string ShoeCleat = "ShoeCleat"; + public const string ShoeFormal = "ShoeFormal"; + public const string ShoeHeel = "ShoeHeel"; + public const string ShoePrint = "ShoePrint"; + public const string ShoeSneaker = "ShoeSneaker"; + public const string Shopping = "Shopping"; + public const string ShoppingMusic = "ShoppingMusic"; + public const string ShoppingOutline = "ShoppingOutline"; + public const string ShoppingSearch = "ShoppingSearch"; + public const string Shore = "Shore"; + public const string Shovel = "Shovel"; + public const string ShovelOff = "ShovelOff"; + public const string Shower = "Shower"; + public const string ShowerHead = "ShowerHead"; + public const string Shredder = "Shredder"; + public const string Shuffle = "Shuffle"; + public const string ShuffleDisabled = "ShuffleDisabled"; + public const string ShuffleVariant = "ShuffleVariant"; + public const string Shuriken = "Shuriken"; + public const string Sickle = "Sickle"; + public const string Sigma = "Sigma"; + public const string SigmaLower = "SigmaLower"; + public const string Signal = "Signal"; + public const string Signal2g = "Signal2g"; + public const string Signal3g = "Signal3g"; + public const string Signal4g = "Signal4g"; + public const string Signal5g = "Signal5g"; + public const string SignalCellular1 = "SignalCellular1"; + public const string SignalCellular2 = "SignalCellular2"; + public const string SignalCellular3 = "SignalCellular3"; + public const string SignalCellularOutline = "SignalCellularOutline"; + public const string SignalDistanceVariant = "SignalDistanceVariant"; + public const string SignalHspa = "SignalHspa"; + public const string SignalHspaPlus = "SignalHspaPlus"; + public const string SignalOff = "SignalOff"; + public const string SignalVariant = "SignalVariant"; + public const string Signature = "Signature"; + public const string SignatureFreehand = "SignatureFreehand"; + public const string SignatureImage = "SignatureImage"; + public const string SignatureText = "SignatureText"; + public const string SignCaution = "SignCaution"; + public const string SignDirection = "SignDirection"; + public const string SignDirectionMinus = "SignDirectionMinus"; + public const string SignDirectionPlus = "SignDirectionPlus"; + public const string SignDirectionRemove = "SignDirectionRemove"; + public const string SignPole = "SignPole"; + public const string SignRealEstate = "SignRealEstate"; + public const string SignText = "SignText"; + public const string Silo = "Silo"; + public const string Silverware = "Silverware"; + public const string SilverwareClean = "SilverwareClean"; + public const string SilverwareFork = "SilverwareFork"; + public const string SilverwareForkKnife = "SilverwareForkKnife"; + public const string SilverwareSpoon = "SilverwareSpoon"; + public const string SilverwareVariant = "SilverwareVariant"; + public const string Sim = "Sim"; + public const string SimAlert = "SimAlert"; + public const string SimAlertOutline = "SimAlertOutline"; + public const string SimOff = "SimOff"; + public const string SimOffOutline = "SimOffOutline"; + public const string SimOutline = "SimOutline"; + public const string SimpleIcons = "SimpleIcons"; + public const string SinaWeibo = "SinaWeibo"; + public const string SineWave = "SineWave"; + public const string Sitemap = "Sitemap"; + public const string SizeL = "SizeL"; + public const string SizeM = "SizeM"; + public const string SizeS = "SizeS"; + public const string SizeXl = "SizeXl"; + public const string SizeXs = "SizeXs"; + public const string SizeXxl = "SizeXxl"; + public const string SizeXxs = "SizeXxs"; + public const string SizeXxxl = "SizeXxxl"; + public const string Skate = "Skate"; + public const string Skateboard = "Skateboard"; + public const string Skateboarding = "Skateboarding"; + public const string SkateOff = "SkateOff"; + public const string SkewLess = "SkewLess"; + public const string SkewMore = "SkewMore"; + public const string Ski = "Ski"; + public const string SkiCrossCountry = "SkiCrossCountry"; + public const string SkipBackward = "SkipBackward"; + public const string SkipBackwardOutline = "SkipBackwardOutline"; + public const string SkipForward = "SkipForward"; + public const string SkipForwardOutline = "SkipForwardOutline"; + public const string SkipNext = "SkipNext"; + public const string SkipNextCircle = "SkipNextCircle"; + public const string SkipNextCircleOutline = "SkipNextCircleOutline"; + public const string SkipNextOutline = "SkipNextOutline"; + public const string SkipPrevious = "SkipPrevious"; + public const string SkipPreviousCircle = "SkipPreviousCircle"; + public const string SkipPreviousCircleOutline = "SkipPreviousCircleOutline"; + public const string SkipPreviousOutline = "SkipPreviousOutline"; + public const string SkiWater = "SkiWater"; + public const string Skull = "Skull"; + public const string SkullCrossbones = "SkullCrossbones"; + public const string SkullCrossbonesOutline = "SkullCrossbonesOutline"; + public const string SkullOutline = "SkullOutline"; + public const string SkullScan = "SkullScan"; + public const string SkullScanOutline = "SkullScanOutline"; + public const string Skype = "Skype"; + public const string SkypeBusiness = "SkypeBusiness"; + public const string Slack = "Slack"; + public const string SlashForward = "SlashForward"; + public const string SlashForwardBox = "SlashForwardBox"; + public const string Sledding = "Sledding"; + public const string Sleep = "Sleep"; + public const string SleepOff = "SleepOff"; + public const string Slide = "Slide"; + public const string SlopeDownhill = "SlopeDownhill"; + public const string SlopeUphill = "SlopeUphill"; + public const string SlotMachine = "SlotMachine"; + public const string SlotMachineOutline = "SlotMachineOutline"; + public const string SmartCard = "SmartCard"; + public const string SmartCardOff = "SmartCardOff"; + public const string SmartCardOffOutline = "SmartCardOffOutline"; + public const string SmartCardOutline = "SmartCardOutline"; + public const string SmartCardReader = "SmartCardReader"; + public const string SmartCardReaderOutline = "SmartCardReaderOutline"; + public const string Smog = "Smog"; + public const string Smoke = "Smoke"; + public const string SmokeDetector = "SmokeDetector"; + public const string SmokeDetectorOff = "SmokeDetectorOff"; + public const string SmokeDetectorOffOutline = "SmokeDetectorOffOutline"; + public const string SmokeDetectorOutline = "SmokeDetectorOutline"; + public const string SmokeDetectorVariant = "SmokeDetectorVariant"; + public const string SmokeDetectorVariantOff = "SmokeDetectorVariantOff"; + public const string Smoking = "Smoking"; + public const string SmokingOff = "SmokingOff"; + public const string SmokingPipe = "SmokingPipe"; + public const string SmokingPipeOff = "SmokingPipeOff"; + public const string Snail = "Snail"; + public const string Snake = "Snake"; + public const string Snapchat = "Snapchat"; + public const string Snowboard = "Snowboard"; + public const string Snowflake = "Snowflake"; + public const string SnowflakeAlert = "SnowflakeAlert"; + public const string SnowflakeMelt = "SnowflakeMelt"; + public const string SnowflakeOff = "SnowflakeOff"; + public const string SnowflakeVariant = "SnowflakeVariant"; + public const string Snowman = "Snowman"; + public const string Snowmobile = "Snowmobile"; + public const string Soccer = "Soccer"; + public const string SoccerField = "SoccerField"; + public const string SocialDistance2Meters = "SocialDistance2Meters"; + public const string SocialDistance6Feet = "SocialDistance6Feet"; + public const string Sofa = "Sofa"; + public const string SofaOutline = "SofaOutline"; + public const string SofaSingle = "SofaSingle"; + public const string SofaSingleOutline = "SofaSingleOutline"; + public const string SolarPanel = "SolarPanel"; + public const string SolarPanelLarge = "SolarPanelLarge"; + public const string SolarPower = "SolarPower"; + public const string SolderingIron = "SolderingIron"; + public const string Solid = "Solid"; + public const string SonyPlaystation = "SonyPlaystation"; + public const string Sort = "Sort"; + public const string SortAlphabeticalAscending = "SortAlphabeticalAscending"; + public const string SortAlphabeticalAscendingVariant = "SortAlphabeticalAscendingVariant"; + public const string SortAlphabeticalDescending = "SortAlphabeticalDescending"; + public const string SortAlphabeticalDescendingVariant = "SortAlphabeticalDescendingVariant"; + public const string SortAlphabeticalVariant = "SortAlphabeticalVariant"; + public const string SortAscending = "SortAscending"; + public const string SortBoolAscending = "SortBoolAscending"; + public const string SortBoolAscendingVariant = "SortBoolAscendingVariant"; + public const string SortBoolDescending = "SortBoolDescending"; + public const string SortBoolDescendingVariant = "SortBoolDescendingVariant"; + public const string SortCalendarAscending = "SortCalendarAscending"; + public const string SortCalendarDescending = "SortCalendarDescending"; + public const string SortClockAscending = "SortClockAscending"; + public const string SortClockAscendingOutline = "SortClockAscendingOutline"; + public const string SortClockDescending = "SortClockDescending"; + public const string SortClockDescendingOutline = "SortClockDescendingOutline"; + public const string SortDescending = "SortDescending"; + public const string SortNumericAscending = "SortNumericAscending"; + public const string SortNumericAscendingVariant = "SortNumericAscendingVariant"; + public const string SortNumericDescending = "SortNumericDescending"; + public const string SortNumericDescendingVariant = "SortNumericDescendingVariant"; + public const string SortNumericVariant = "SortNumericVariant"; + public const string SortReverseVariant = "SortReverseVariant"; + public const string SortVariant = "SortVariant"; + public const string SortVariantLock = "SortVariantLock"; + public const string SortVariantLockOpen = "SortVariantLockOpen"; + public const string SortVariantRemove = "SortVariantRemove"; + public const string Soundbar = "Soundbar"; + public const string Soundcloud = "Soundcloud"; + public const string SourceBranch = "SourceBranch"; + public const string SourceBranchCheck = "SourceBranchCheck"; + public const string SourceBranchMinus = "SourceBranchMinus"; + public const string SourceBranchPlus = "SourceBranchPlus"; + public const string SourceBranchRefresh = "SourceBranchRefresh"; + public const string SourceBranchRemove = "SourceBranchRemove"; + public const string SourceBranchSync = "SourceBranchSync"; + public const string SourceCommit = "SourceCommit"; + public const string SourceCommitEnd = "SourceCommitEnd"; + public const string SourceCommitEndLocal = "SourceCommitEndLocal"; + public const string SourceCommitLocal = "SourceCommitLocal"; + public const string SourceCommitNextLocal = "SourceCommitNextLocal"; + public const string SourceCommitStart = "SourceCommitStart"; + public const string SourceCommitStartNextLocal = "SourceCommitStartNextLocal"; + public const string SourceFork = "SourceFork"; + public const string SourceMerge = "SourceMerge"; + public const string SourcePull = "SourcePull"; + public const string SourceRepository = "SourceRepository"; + public const string SourceRepositoryMultiple = "SourceRepositoryMultiple"; + public const string SoySauce = "SoySauce"; + public const string SoySauceOff = "SoySauceOff"; + public const string Spa = "Spa"; + public const string SpaceInvaders = "SpaceInvaders"; + public const string SpaceStation = "SpaceStation"; + public const string Spade = "Spade"; + public const string SpaOutline = "SpaOutline"; + public const string Speaker = "Speaker"; + public const string SpeakerBluetooth = "SpeakerBluetooth"; + public const string SpeakerMultiple = "SpeakerMultiple"; + public const string SpeakerOff = "SpeakerOff"; + public const string SpeakerWireless = "SpeakerWireless"; + public const string Spear = "Spear"; + public const string Speedometer = "Speedometer"; + public const string SpeedometerMedium = "SpeedometerMedium"; + public const string SpeedometerSlow = "SpeedometerSlow"; + public const string Spellcheck = "Spellcheck"; + public const string Spider = "Spider"; + public const string SpiderThread = "SpiderThread"; + public const string SpiderWeb = "SpiderWeb"; + public const string SpiritLevel = "SpiritLevel"; + public const string SpoonSugar = "SpoonSugar"; + public const string Spotify = "Spotify"; + public const string Spotlight = "Spotlight"; + public const string SpotlightBeam = "SpotlightBeam"; + public const string Spray = "Spray"; + public const string SprayBottle = "SprayBottle"; + public const string Sprinkler = "Sprinkler"; + public const string SprinklerVariant = "SprinklerVariant"; + public const string Sprout = "Sprout"; + public const string SproutOutline = "SproutOutline"; + public const string Square = "Square"; + public const string SquareCircle = "SquareCircle"; + public const string SquareEditOutline = "SquareEditOutline"; + public const string SquareMedium = "SquareMedium"; + public const string SquareMediumOutline = "SquareMediumOutline"; + public const string SquareOff = "SquareOff"; + public const string SquareOffOutline = "SquareOffOutline"; + public const string SquareOpacity = "SquareOpacity"; + public const string SquareOutline = "SquareOutline"; + public const string SquareRoot = "SquareRoot"; + public const string SquareRootBox = "SquareRootBox"; + public const string SquareRounded = "SquareRounded"; + public const string SquareRoundedOutline = "SquareRoundedOutline"; + public const string SquareSmall = "SquareSmall"; + public const string SquareWave = "SquareWave"; + public const string Squeegee = "Squeegee"; + public const string Ssh = "Ssh"; + public const string StackExchange = "StackExchange"; + public const string StackOverflow = "StackOverflow"; + public const string Stackpath = "Stackpath"; + public const string Stadium = "Stadium"; + public const string StadiumVariant = "StadiumVariant"; + public const string Stairs = "Stairs"; + public const string StairsBox = "StairsBox"; + public const string StairsDown = "StairsDown"; + public const string StairsUp = "StairsUp"; + public const string Stamper = "Stamper"; + public const string StandardDefinition = "StandardDefinition"; + public const string Star = "Star"; + public const string StarBox = "StarBox"; + public const string StarBoxMultiple = "StarBoxMultiple"; + public const string StarBoxMultipleOutline = "StarBoxMultipleOutline"; + public const string StarBoxOutline = "StarBoxOutline"; + public const string StarCheck = "StarCheck"; + public const string StarCheckOutline = "StarCheckOutline"; + public const string StarCircle = "StarCircle"; + public const string StarCircleOutline = "StarCircleOutline"; + public const string StarCog = "StarCog"; + public const string StarCogOutline = "StarCogOutline"; + public const string StarCrescent = "StarCrescent"; + public const string StarDavid = "StarDavid"; + public const string StarFace = "StarFace"; + public const string StarFourPoints = "StarFourPoints"; + public const string StarFourPointsOutline = "StarFourPointsOutline"; + public const string StarHalf = "StarHalf"; + public const string StarHalfFull = "StarHalfFull"; + public const string StarMinus = "StarMinus"; + public const string StarMinusOutline = "StarMinusOutline"; + public const string StarOff = "StarOff"; + public const string StarOffOutline = "StarOffOutline"; + public const string StarOutline = "StarOutline"; + public const string StarPlus = "StarPlus"; + public const string StarPlusOutline = "StarPlusOutline"; + public const string StarRemove = "StarRemove"; + public const string StarRemoveOutline = "StarRemoveOutline"; + public const string StarSettings = "StarSettings"; + public const string StarSettingsOutline = "StarSettingsOutline"; + public const string StarShooting = "StarShooting"; + public const string StarShootingOutline = "StarShootingOutline"; + public const string StarThreePoints = "StarThreePoints"; + public const string StarThreePointsOutline = "StarThreePointsOutline"; + public const string StateMachine = "StateMachine"; + public const string Steam = "Steam"; + public const string Steering = "Steering"; + public const string SteeringOff = "SteeringOff"; + public const string StepBackward = "StepBackward"; + public const string StepBackward2 = "StepBackward2"; + public const string StepForward = "StepForward"; + public const string StepForward2 = "StepForward2"; + public const string Stethoscope = "Stethoscope"; + public const string Sticker = "Sticker"; + public const string StickerAlert = "StickerAlert"; + public const string StickerAlertOutline = "StickerAlertOutline"; + public const string StickerCheck = "StickerCheck"; + public const string StickerCheckOutline = "StickerCheckOutline"; + public const string StickerCircleOutline = "StickerCircleOutline"; + public const string StickerEmoji = "StickerEmoji"; + public const string StickerMinus = "StickerMinus"; + public const string StickerMinusOutline = "StickerMinusOutline"; + public const string StickerOutline = "StickerOutline"; + public const string StickerPlus = "StickerPlus"; + public const string StickerPlusOutline = "StickerPlusOutline"; + public const string StickerRemove = "StickerRemove"; + public const string StickerRemoveOutline = "StickerRemoveOutline"; + public const string StickerText = "StickerText"; + public const string StickerTextOutline = "StickerTextOutline"; + public const string Stocking = "Stocking"; + public const string Stomach = "Stomach"; + public const string Stop = "Stop"; + public const string StopCircle = "StopCircle"; + public const string StopCircleOutline = "StopCircleOutline"; + public const string Store = "Store"; + public const string Store24Hour = "Store24Hour"; + public const string StoreAlert = "StoreAlert"; + public const string StoreAlertOutline = "StoreAlertOutline"; + public const string StoreCheck = "StoreCheck"; + public const string StoreCheckOutline = "StoreCheckOutline"; + public const string StoreClock = "StoreClock"; + public const string StoreClockOutline = "StoreClockOutline"; + public const string StoreCog = "StoreCog"; + public const string StoreCogOutline = "StoreCogOutline"; + public const string StoreEdit = "StoreEdit"; + public const string StoreEditOutline = "StoreEditOutline"; + public const string Storefront = "Storefront"; + public const string StorefrontOutline = "StorefrontOutline"; + public const string StoreMarker = "StoreMarker"; + public const string StoreMarkerOutline = "StoreMarkerOutline"; + public const string StoreMinus = "StoreMinus"; + public const string StoreMinusOutline = "StoreMinusOutline"; + public const string StoreOff = "StoreOff"; + public const string StoreOffOutline = "StoreOffOutline"; + public const string StoreOutline = "StoreOutline"; + public const string StorePlus = "StorePlus"; + public const string StorePlusOutline = "StorePlusOutline"; + public const string StoreRemove = "StoreRemove"; + public const string StoreRemoveOutline = "StoreRemoveOutline"; + public const string StoreSearch = "StoreSearch"; + public const string StoreSearchOutline = "StoreSearchOutline"; + public const string StoreSettings = "StoreSettings"; + public const string StoreSettingsOutline = "StoreSettingsOutline"; + public const string Stove = "Stove"; + public const string Strategy = "Strategy"; + public const string StretchToPage = "StretchToPage"; + public const string StretchToPageOutline = "StretchToPageOutline"; + public const string StringLights = "StringLights"; + public const string StringLightsOff = "StringLightsOff"; + public const string SubdirectoryArrowLeft = "SubdirectoryArrowLeft"; + public const string SubdirectoryArrowRight = "SubdirectoryArrowRight"; + public const string Submarine = "Submarine"; + public const string Subtitles = "Subtitles"; + public const string SubtitlesOutline = "SubtitlesOutline"; + public const string Subway = "Subway"; + public const string SubwayAlertVariant = "SubwayAlertVariant"; + public const string SubwayVariant = "SubwayVariant"; + public const string Summit = "Summit"; + public const string Sunglasses = "Sunglasses"; + public const string SunSnowflake = "SunSnowflake"; + public const string SunThermometer = "SunThermometer"; + public const string SunThermometerOutline = "SunThermometerOutline"; + public const string SunWireless = "SunWireless"; + public const string SunWirelessOutline = "SunWirelessOutline"; + public const string Surfing = "Surfing"; + public const string SurroundSound = "SurroundSound"; + public const string SurroundSound20 = "SurroundSound20"; + public const string SurroundSound21 = "SurroundSound21"; + public const string SurroundSound31 = "SurroundSound31"; + public const string SurroundSound51 = "SurroundSound51"; + public const string SurroundSound512 = "SurroundSound512"; + public const string SurroundSound71 = "SurroundSound71"; + public const string Svg = "Svg"; + public const string SwapHorizontal = "SwapHorizontal"; + public const string SwapHorizontalBold = "SwapHorizontalBold"; + public const string SwapHorizontalCircle = "SwapHorizontalCircle"; + public const string SwapHorizontalCircleOutline = "SwapHorizontalCircleOutline"; + public const string SwapHorizontalVariant = "SwapHorizontalVariant"; + public const string SwapVertical = "SwapVertical"; + public const string SwapVerticalBold = "SwapVerticalBold"; + public const string SwapVerticalCircle = "SwapVerticalCircle"; + public const string SwapVerticalCircleOutline = "SwapVerticalCircleOutline"; + public const string SwapVerticalVariant = "SwapVerticalVariant"; + public const string Swim = "Swim"; + public const string Switch = "Switch"; + public const string Sword = "Sword"; + public const string SwordCross = "SwordCross"; + public const string SyllabaryHangul = "SyllabaryHangul"; + public const string SyllabaryHiragana = "SyllabaryHiragana"; + public const string SyllabaryKatakana = "SyllabaryKatakana"; + public const string SyllabaryKatakanaHalfwidth = "SyllabaryKatakanaHalfwidth"; + public const string Symbol = "Symbol"; + public const string Symfony = "Symfony"; + public const string Sync = "Sync"; + public const string SyncAlert = "SyncAlert"; + public const string SyncCircle = "SyncCircle"; + public const string SyncOff = "SyncOff"; + public const string Tab = "Tab"; + public const string Table = "Table"; + public const string TableAccount = "TableAccount"; + public const string TableAlert = "TableAlert"; + public const string TableArrowDown = "TableArrowDown"; + public const string TableArrowLeft = "TableArrowLeft"; + public const string TableArrowRight = "TableArrowRight"; + public const string TableArrowUp = "TableArrowUp"; + public const string TableBorder = "TableBorder"; + public const string TableCancel = "TableCancel"; + public const string TableChair = "TableChair"; + public const string TableCheck = "TableCheck"; + public const string TableClock = "TableClock"; + public const string TableCog = "TableCog"; + public const string TableColumn = "TableColumn"; + public const string TableColumnPlusAfter = "TableColumnPlusAfter"; + public const string TableColumnPlusBefore = "TableColumnPlusBefore"; + public const string TableColumnRemove = "TableColumnRemove"; + public const string TableColumnWidth = "TableColumnWidth"; + public const string TableEdit = "TableEdit"; + public const string TableEye = "TableEye"; + public const string TableEyeOff = "TableEyeOff"; + public const string TableFurniture = "TableFurniture"; + public const string TableHeadersEye = "TableHeadersEye"; + public const string TableHeadersEyeOff = "TableHeadersEyeOff"; + public const string TableHeart = "TableHeart"; + public const string TableKey = "TableKey"; + public const string TableLarge = "TableLarge"; + public const string TableLargePlus = "TableLargePlus"; + public const string TableLargeRemove = "TableLargeRemove"; + public const string TableLock = "TableLock"; + public const string TableMergeCells = "TableMergeCells"; + public const string TableMinus = "TableMinus"; + public const string TableMultiple = "TableMultiple"; + public const string TableNetwork = "TableNetwork"; + public const string TableOfContents = "TableOfContents"; + public const string TableOff = "TableOff"; + public const string TablePicnic = "TablePicnic"; + public const string TablePivot = "TablePivot"; + public const string TablePlus = "TablePlus"; + public const string TableRefresh = "TableRefresh"; + public const string TableRemove = "TableRemove"; + public const string TableRow = "TableRow"; + public const string TableRowHeight = "TableRowHeight"; + public const string TableRowPlusAfter = "TableRowPlusAfter"; + public const string TableRowPlusBefore = "TableRowPlusBefore"; + public const string TableRowRemove = "TableRowRemove"; + public const string TableSearch = "TableSearch"; + public const string TableSettings = "TableSettings"; + public const string TableSplitCell = "TableSplitCell"; + public const string TableStar = "TableStar"; + public const string TableSync = "TableSync"; + public const string Tablet = "Tablet"; + public const string TabletAndroid = "TabletAndroid"; + public const string TabletCellphone = "TabletCellphone"; + public const string TabletDashboard = "TabletDashboard"; + public const string TableTennis = "TableTennis"; + public const string TabMinus = "TabMinus"; + public const string TabPlus = "TabPlus"; + public const string TabRemove = "TabRemove"; + public const string TabUnselected = "TabUnselected"; + public const string Taco = "Taco"; + public const string Tag = "Tag"; + public const string TagArrowDown = "TagArrowDown"; + public const string TagArrowDownOutline = "TagArrowDownOutline"; + public const string TagArrowLeft = "TagArrowLeft"; + public const string TagArrowLeftOutline = "TagArrowLeftOutline"; + public const string TagArrowRight = "TagArrowRight"; + public const string TagArrowRightOutline = "TagArrowRightOutline"; + public const string TagArrowUp = "TagArrowUp"; + public const string TagArrowUpOutline = "TagArrowUpOutline"; + public const string TagFaces = "TagFaces"; + public const string TagHeart = "TagHeart"; + public const string TagHeartOutline = "TagHeartOutline"; + public const string TagMinus = "TagMinus"; + public const string TagMinusOutline = "TagMinusOutline"; + public const string TagMultiple = "TagMultiple"; + public const string TagMultipleOutline = "TagMultipleOutline"; + public const string TagOff = "TagOff"; + public const string TagOffOutline = "TagOffOutline"; + public const string TagOutline = "TagOutline"; + public const string TagPlus = "TagPlus"; + public const string TagPlusOutline = "TagPlusOutline"; + public const string TagRemove = "TagRemove"; + public const string TagRemoveOutline = "TagRemoveOutline"; + public const string TagText = "TagText"; + public const string TagTextOutline = "TagTextOutline"; + public const string Tailwind = "Tailwind"; + public const string Tangram = "Tangram"; + public const string Tank = "Tank"; + public const string TankerTruck = "TankerTruck"; + public const string TapeDrive = "TapeDrive"; + public const string TapeMeasure = "TapeMeasure"; + public const string Target = "Target"; + public const string TargetAccount = "TargetAccount"; + public const string TargetVariant = "TargetVariant"; + public const string Taxi = "Taxi"; + public const string Tea = "Tea"; + public const string Teamviewer = "Teamviewer"; + public const string TeaOutline = "TeaOutline"; + public const string TeddyBear = "TeddyBear"; + public const string Telescope = "Telescope"; + public const string Television = "Television"; + public const string TelevisionAmbientLight = "TelevisionAmbientLight"; + public const string TelevisionBox = "TelevisionBox"; + public const string TelevisionClassic = "TelevisionClassic"; + public const string TelevisionClassicOff = "TelevisionClassicOff"; + public const string TelevisionGuide = "TelevisionGuide"; + public const string TelevisionOff = "TelevisionOff"; + public const string TelevisionPause = "TelevisionPause"; + public const string TelevisionPlay = "TelevisionPlay"; + public const string TelevisionShimmer = "TelevisionShimmer"; + public const string TelevisionStop = "TelevisionStop"; + public const string TemperatureCelsius = "TemperatureCelsius"; + public const string TemperatureFahrenheit = "TemperatureFahrenheit"; + public const string TemperatureKelvin = "TemperatureKelvin"; + public const string Tennis = "Tennis"; + public const string TennisBall = "TennisBall"; + public const string Tent = "Tent"; + public const string Terraform = "Terraform"; + public const string Terrain = "Terrain"; + public const string TestTube = "TestTube"; + public const string TestTubeEmpty = "TestTubeEmpty"; + public const string TestTubeOff = "TestTubeOff"; + public const string Text = "Text"; + public const string TextAccount = "TextAccount"; + public const string TextBox = "TextBox"; + public const string TextBoxCheck = "TextBoxCheck"; + public const string TextBoxCheckOutline = "TextBoxCheckOutline"; + public const string TextBoxMinus = "TextBoxMinus"; + public const string TextBoxMinusOutline = "TextBoxMinusOutline"; + public const string TextBoxMultiple = "TextBoxMultiple"; + public const string TextBoxMultipleOutline = "TextBoxMultipleOutline"; + public const string TextBoxOutline = "TextBoxOutline"; + public const string TextBoxPlus = "TextBoxPlus"; + public const string TextBoxPlusOutline = "TextBoxPlusOutline"; + public const string TextBoxRemove = "TextBoxRemove"; + public const string TextBoxRemoveOutline = "TextBoxRemoveOutline"; + public const string TextBoxSearch = "TextBoxSearch"; + public const string TextBoxSearchOutline = "TextBoxSearchOutline"; + public const string TextLong = "TextLong"; + public const string TextRecognition = "TextRecognition"; + public const string TextSearch = "TextSearch"; + public const string TextShadow = "TextShadow"; + public const string TextShort = "TextShort"; + public const string TextToSpeech = "TextToSpeech"; + public const string TextToSpeechOff = "TextToSpeechOff"; + public const string Texture = "Texture"; + public const string TextureBox = "TextureBox"; + public const string Theater = "Theater"; + public const string ThemeLightDark = "ThemeLightDark"; + public const string Thermometer = "Thermometer"; + public const string ThermometerAlert = "ThermometerAlert"; + public const string ThermometerBluetooth = "ThermometerBluetooth"; + public const string ThermometerChevronDown = "ThermometerChevronDown"; + public const string ThermometerChevronUp = "ThermometerChevronUp"; + public const string ThermometerHigh = "ThermometerHigh"; + public const string ThermometerLines = "ThermometerLines"; + public const string ThermometerLow = "ThermometerLow"; + public const string ThermometerMinus = "ThermometerMinus"; + public const string ThermometerOff = "ThermometerOff"; + public const string ThermometerPlus = "ThermometerPlus"; + public const string Thermostat = "Thermostat"; + public const string ThermostatBox = "ThermostatBox"; + public const string ThoughtBubble = "ThoughtBubble"; + public const string ThoughtBubbleOutline = "ThoughtBubbleOutline"; + public const string ThumbDown = "ThumbDown"; + public const string ThumbDownOutline = "ThumbDownOutline"; + public const string ThumbsUpDown = "ThumbsUpDown"; + public const string ThumbUp = "ThumbUp"; + public const string ThumbUpOutline = "ThumbUpOutline"; + public const string Ticket = "Ticket"; + public const string TicketAccount = "TicketAccount"; + public const string TicketConfirmation = "TicketConfirmation"; + public const string TicketConfirmationOutline = "TicketConfirmationOutline"; + public const string TicketOutline = "TicketOutline"; + public const string TicketPercent = "TicketPercent"; + public const string TicketPercentOutline = "TicketPercentOutline"; + public const string Tie = "Tie"; + public const string Tilde = "Tilde"; + public const string TildeOff = "TildeOff"; + public const string Timelapse = "Timelapse"; + public const string Timeline = "Timeline"; + public const string TimelineAlert = "TimelineAlert"; + public const string TimelineAlertOutline = "TimelineAlertOutline"; + public const string TimelineCheck = "TimelineCheck"; + public const string TimelineCheckOutline = "TimelineCheckOutline"; + public const string TimelineClock = "TimelineClock"; + public const string TimelineClockOutline = "TimelineClockOutline"; + public const string TimelineHelp = "TimelineHelp"; + public const string TimelineHelpOutline = "TimelineHelpOutline"; + public const string TimelineMinus = "TimelineMinus"; + public const string TimelineMinusOutline = "TimelineMinusOutline"; + public const string TimelineOutline = "TimelineOutline"; + public const string TimelinePlus = "TimelinePlus"; + public const string TimelinePlusOutline = "TimelinePlusOutline"; + public const string TimelineRemove = "TimelineRemove"; + public const string TimelineRemoveOutline = "TimelineRemoveOutline"; + public const string TimelineText = "TimelineText"; + public const string TimelineTextOutline = "TimelineTextOutline"; + public const string Timer = "Timer"; + public const string Timer10 = "Timer10"; + public const string Timer3 = "Timer3"; + public const string TimerOff = "TimerOff"; + public const string TimerOffOutline = "TimerOffOutline"; + public const string TimerOutline = "TimerOutline"; + public const string TimerSand = "TimerSand"; + public const string TimerSandEmpty = "TimerSandEmpty"; + public const string TimerSandFull = "TimerSandFull"; + public const string Timetable = "Timetable"; + public const string Tire = "Tire"; + public const string Toaster = "Toaster"; + public const string ToasterOff = "ToasterOff"; + public const string ToasterOven = "ToasterOven"; + public const string ToggleSwitch = "ToggleSwitch"; + public const string ToggleSwitchOff = "ToggleSwitchOff"; + public const string ToggleSwitchOffOutline = "ToggleSwitchOffOutline"; + public const string ToggleSwitchOutline = "ToggleSwitchOutline"; + public const string Toilet = "Toilet"; + public const string Toolbox = "Toolbox"; + public const string ToolboxOutline = "ToolboxOutline"; + public const string Tools = "Tools"; + public const string Tooltip = "Tooltip"; + public const string TooltipAccount = "TooltipAccount"; + public const string TooltipCellphone = "TooltipCellphone"; + public const string TooltipCheck = "TooltipCheck"; + public const string TooltipCheckOutline = "TooltipCheckOutline"; + public const string TooltipEdit = "TooltipEdit"; + public const string TooltipEditOutline = "TooltipEditOutline"; + public const string TooltipImage = "TooltipImage"; + public const string TooltipImageOutline = "TooltipImageOutline"; + public const string TooltipMinus = "TooltipMinus"; + public const string TooltipMinusOutline = "TooltipMinusOutline"; + public const string TooltipOutline = "TooltipOutline"; + public const string TooltipPlus = "TooltipPlus"; + public const string TooltipPlusOutline = "TooltipPlusOutline"; + public const string TooltipRemove = "TooltipRemove"; + public const string TooltipRemoveOutline = "TooltipRemoveOutline"; + public const string TooltipText = "TooltipText"; + public const string TooltipTextOutline = "TooltipTextOutline"; + public const string Tooth = "Tooth"; + public const string Toothbrush = "Toothbrush"; + public const string ToothbrushElectric = "ToothbrushElectric"; + public const string ToothbrushPaste = "ToothbrushPaste"; + public const string ToothOutline = "ToothOutline"; + public const string Torch = "Torch"; + public const string Tortoise = "Tortoise"; + public const string Toslink = "Toslink"; + public const string Tournament = "Tournament"; + public const string TowerBeach = "TowerBeach"; + public const string TowerFire = "TowerFire"; + public const string TownHall = "TownHall"; + public const string TowTruck = "TowTruck"; + public const string ToyBrick = "ToyBrick"; + public const string ToyBrickMarker = "ToyBrickMarker"; + public const string ToyBrickMarkerOutline = "ToyBrickMarkerOutline"; + public const string ToyBrickMinus = "ToyBrickMinus"; + public const string ToyBrickMinusOutline = "ToyBrickMinusOutline"; + public const string ToyBrickOutline = "ToyBrickOutline"; + public const string ToyBrickPlus = "ToyBrickPlus"; + public const string ToyBrickPlusOutline = "ToyBrickPlusOutline"; + public const string ToyBrickRemove = "ToyBrickRemove"; + public const string ToyBrickRemoveOutline = "ToyBrickRemoveOutline"; + public const string ToyBrickSearch = "ToyBrickSearch"; + public const string ToyBrickSearchOutline = "ToyBrickSearchOutline"; + public const string TrackLight = "TrackLight"; + public const string Trackpad = "Trackpad"; + public const string TrackpadLock = "TrackpadLock"; + public const string Tractor = "Tractor"; + public const string TractorVariant = "TractorVariant"; + public const string Trademark = "Trademark"; + public const string TrafficCone = "TrafficCone"; + public const string TrafficLight = "TrafficLight"; + public const string TrafficLightOutline = "TrafficLightOutline"; + public const string Train = "Train"; + public const string TrainCar = "TrainCar"; + public const string TrainCarPassenger = "TrainCarPassenger"; + public const string TrainCarPassengerDoor = "TrainCarPassengerDoor"; + public const string TrainCarPassengerDoorOpen = "TrainCarPassengerDoorOpen"; + public const string TrainCarPassengerVariant = "TrainCarPassengerVariant"; + public const string TrainVariant = "TrainVariant"; + public const string Tram = "Tram"; + public const string TramSide = "TramSide"; + public const string Transcribe = "Transcribe"; + public const string TranscribeClose = "TranscribeClose"; + public const string Transfer = "Transfer"; + public const string TransferDown = "TransferDown"; + public const string TransferLeft = "TransferLeft"; + public const string TransferRight = "TransferRight"; + public const string TransferUp = "TransferUp"; + public const string TransitConnection = "TransitConnection"; + public const string TransitConnectionHorizontal = "TransitConnectionHorizontal"; + public const string TransitConnectionVariant = "TransitConnectionVariant"; + public const string TransitDetour = "TransitDetour"; + public const string Transition = "Transition"; + public const string TransitionMasked = "TransitionMasked"; + public const string TransitSkip = "TransitSkip"; + public const string TransitTransfer = "TransitTransfer"; + public const string Translate = "Translate"; + public const string TranslateOff = "TranslateOff"; + public const string TransmissionTower = "TransmissionTower"; + public const string TrashCan = "TrashCan"; + public const string TrashCanOutline = "TrashCanOutline"; + public const string Tray = "Tray"; + public const string TrayAlert = "TrayAlert"; + public const string TrayArrowDown = "TrayArrowDown"; + public const string TrayArrowUp = "TrayArrowUp"; + public const string TrayFull = "TrayFull"; + public const string TrayMinus = "TrayMinus"; + public const string TrayPlus = "TrayPlus"; + public const string TrayRemove = "TrayRemove"; + public const string TreasureChest = "TreasureChest"; + public const string Tree = "Tree"; + public const string TreeOutline = "TreeOutline"; + public const string Trello = "Trello"; + public const string TrendingDown = "TrendingDown"; + public const string TrendingNeutral = "TrendingNeutral"; + public const string TrendingUp = "TrendingUp"; + public const string Triangle = "Triangle"; + public const string TriangleOutline = "TriangleOutline"; + public const string TriangleWave = "TriangleWave"; + public const string Triforce = "Triforce"; + public const string Trophy = "Trophy"; + public const string TrophyAward = "TrophyAward"; + public const string TrophyBroken = "TrophyBroken"; + public const string TrophyOutline = "TrophyOutline"; + public const string TrophyVariant = "TrophyVariant"; + public const string TrophyVariantOutline = "TrophyVariantOutline"; + public const string Truck = "Truck"; + public const string TruckCargoContainer = "TruckCargoContainer"; + public const string TruckCheck = "TruckCheck"; + public const string TruckCheckOutline = "TruckCheckOutline"; + public const string TruckDelivery = "TruckDelivery"; + public const string TruckDeliveryOutline = "TruckDeliveryOutline"; + public const string TruckFast = "TruckFast"; + public const string TruckFastOutline = "TruckFastOutline"; + public const string TruckFlatbed = "TruckFlatbed"; + public const string TruckOutline = "TruckOutline"; + public const string TruckTrailer = "TruckTrailer"; + public const string Trumpet = "Trumpet"; + public const string TshirtCrew = "TshirtCrew"; + public const string TshirtCrewOutline = "TshirtCrewOutline"; + public const string TshirtV = "TshirtV"; + public const string TshirtVOutline = "TshirtVOutline"; + public const string TumbleDryer = "TumbleDryer"; + public const string TumbleDryerAlert = "TumbleDryerAlert"; + public const string TumbleDryerOff = "TumbleDryerOff"; + public const string Tune = "Tune"; + public const string TuneVariant = "TuneVariant"; + public const string TuneVertical = "TuneVertical"; + public const string TuneVerticalVariant = "TuneVerticalVariant"; + public const string Tunnel = "Tunnel"; + public const string TunnelOutline = "TunnelOutline"; + public const string Turkey = "Turkey"; + public const string Turnstile = "Turnstile"; + public const string TurnstileOutline = "TurnstileOutline"; + public const string Turtle = "Turtle"; + public const string Twitch = "Twitch"; + public const string Twitter = "Twitter"; + public const string TwoFactorAuthentication = "TwoFactorAuthentication"; + public const string Typewriter = "Typewriter"; + public const string Ubisoft = "Ubisoft"; + public const string Ubuntu = "Ubuntu"; + public const string Ufo = "Ufo"; + public const string UfoOutline = "UfoOutline"; + public const string UltraHighDefinition = "UltraHighDefinition"; + public const string Umbraco = "Umbraco"; + public const string Umbrella = "Umbrella"; + public const string UmbrellaBeach = "UmbrellaBeach"; + public const string UmbrellaBeachOutline = "UmbrellaBeachOutline"; + public const string UmbrellaClosed = "UmbrellaClosed"; + public const string UmbrellaClosedOutline = "UmbrellaClosedOutline"; + public const string UmbrellaClosedVariant = "UmbrellaClosedVariant"; + public const string UmbrellaOutline = "UmbrellaOutline"; + public const string Undo = "Undo"; + public const string UndoVariant = "UndoVariant"; + public const string UnfoldLessHorizontal = "UnfoldLessHorizontal"; + public const string UnfoldLessVertical = "UnfoldLessVertical"; + public const string UnfoldMoreHorizontal = "UnfoldMoreHorizontal"; + public const string UnfoldMoreVertical = "UnfoldMoreVertical"; + public const string Ungroup = "Ungroup"; + public const string Unicode = "Unicode"; + public const string Unicorn = "Unicorn"; + public const string UnicornVariant = "UnicornVariant"; + public const string Unicycle = "Unicycle"; + public const string Unity = "Unity"; + public const string Unreal = "Unreal"; + public const string Update = "Update"; + public const string Upload = "Upload"; + public const string UploadLock = "UploadLock"; + public const string UploadLockOutline = "UploadLockOutline"; + public const string UploadMultiple = "UploadMultiple"; + public const string UploadNetwork = "UploadNetwork"; + public const string UploadNetworkOutline = "UploadNetworkOutline"; + public const string UploadOff = "UploadOff"; + public const string UploadOffOutline = "UploadOffOutline"; + public const string UploadOutline = "UploadOutline"; + public const string Usb = "Usb"; + public const string UsbFlashDrive = "UsbFlashDrive"; + public const string UsbFlashDriveOutline = "UsbFlashDriveOutline"; + public const string UsbPort = "UsbPort"; + public const string Valve = "Valve"; + public const string ValveClosed = "ValveClosed"; + public const string ValveOpen = "ValveOpen"; + public const string Vanish = "Vanish"; + public const string VanishQuarter = "VanishQuarter"; + public const string VanityLight = "VanityLight"; + public const string VanPassenger = "VanPassenger"; + public const string VanUtility = "VanUtility"; + public const string Variable = "Variable"; + public const string VariableBox = "VariableBox"; + public const string VectorArrangeAbove = "VectorArrangeAbove"; + public const string VectorArrangeBelow = "VectorArrangeBelow"; + public const string VectorBezier = "VectorBezier"; + public const string VectorCircle = "VectorCircle"; + public const string VectorCircleVariant = "VectorCircleVariant"; + public const string VectorCombine = "VectorCombine"; + public const string VectorCurve = "VectorCurve"; + public const string VectorDifference = "VectorDifference"; + public const string VectorDifferenceAb = "VectorDifferenceAb"; + public const string VectorDifferenceBa = "VectorDifferenceBa"; + public const string VectorEllipse = "VectorEllipse"; + public const string VectorIntersection = "VectorIntersection"; + public const string VectorLine = "VectorLine"; + public const string VectorLink = "VectorLink"; + public const string VectorPoint = "VectorPoint"; + public const string VectorPolygon = "VectorPolygon"; + public const string VectorPolygonVariant = "VectorPolygonVariant"; + public const string VectorPolyline = "VectorPolyline"; + public const string VectorPolylineEdit = "VectorPolylineEdit"; + public const string VectorPolylineMinus = "VectorPolylineMinus"; + public const string VectorPolylinePlus = "VectorPolylinePlus"; + public const string VectorPolylineRemove = "VectorPolylineRemove"; + public const string VectorRadius = "VectorRadius"; + public const string VectorRectangle = "VectorRectangle"; + public const string VectorSelection = "VectorSelection"; + public const string VectorSquare = "VectorSquare"; + public const string VectorSquareClose = "VectorSquareClose"; + public const string VectorSquareEdit = "VectorSquareEdit"; + public const string VectorSquareMinus = "VectorSquareMinus"; + public const string VectorSquareOpen = "VectorSquareOpen"; + public const string VectorSquarePlus = "VectorSquarePlus"; + public const string VectorSquareRemove = "VectorSquareRemove"; + public const string VectorTriangle = "VectorTriangle"; + public const string VectorUnion = "VectorUnion"; + public const string Vhs = "Vhs"; + public const string Vibrate = "Vibrate"; + public const string VibrateOff = "VibrateOff"; + public const string Video = "Video"; + public const string Video3d = "Video3d"; + public const string Video3dOff = "Video3dOff"; + public const string Video3dVariant = "Video3dVariant"; + public const string Video4kBox = "Video4kBox"; + public const string VideoAccount = "VideoAccount"; + public const string VideoBox = "VideoBox"; + public const string VideoBoxOff = "VideoBoxOff"; + public const string VideoCheck = "VideoCheck"; + public const string VideoCheckOutline = "VideoCheckOutline"; + public const string VideoHighDefinition = "VideoHighDefinition"; + public const string VideoImage = "VideoImage"; + public const string VideoInputAntenna = "VideoInputAntenna"; + public const string VideoInputComponent = "VideoInputComponent"; + public const string VideoInputHdmi = "VideoInputHdmi"; + public const string VideoInputScart = "VideoInputScart"; + public const string VideoInputSvideo = "VideoInputSvideo"; + public const string VideoMinus = "VideoMinus"; + public const string VideoMinusOutline = "VideoMinusOutline"; + public const string VideoOff = "VideoOff"; + public const string VideoOffOutline = "VideoOffOutline"; + public const string VideoOutline = "VideoOutline"; + public const string VideoPlus = "VideoPlus"; + public const string VideoPlusOutline = "VideoPlusOutline"; + public const string VideoStabilization = "VideoStabilization"; + public const string VideoSwitch = "VideoSwitch"; + public const string VideoSwitchOutline = "VideoSwitchOutline"; + public const string VideoVintage = "VideoVintage"; + public const string VideoWireless = "VideoWireless"; + public const string VideoWirelessOutline = "VideoWirelessOutline"; + public const string ViewAgenda = "ViewAgenda"; + public const string ViewAgendaOutline = "ViewAgendaOutline"; + public const string ViewArray = "ViewArray"; + public const string ViewArrayOutline = "ViewArrayOutline"; + public const string ViewCarousel = "ViewCarousel"; + public const string ViewCarouselOutline = "ViewCarouselOutline"; + public const string ViewColumn = "ViewColumn"; + public const string ViewColumnOutline = "ViewColumnOutline"; + public const string ViewComfy = "ViewComfy"; + public const string ViewComfyOutline = "ViewComfyOutline"; + public const string ViewCompact = "ViewCompact"; + public const string ViewCompactOutline = "ViewCompactOutline"; + public const string ViewDashboard = "ViewDashboard"; + public const string ViewDashboardOutline = "ViewDashboardOutline"; + public const string ViewDashboardVariant = "ViewDashboardVariant"; + public const string ViewDashboardVariantOutline = "ViewDashboardVariantOutline"; + public const string ViewDay = "ViewDay"; + public const string ViewDayOutline = "ViewDayOutline"; + public const string ViewGallery = "ViewGallery"; + public const string ViewGalleryOutline = "ViewGalleryOutline"; + public const string ViewGrid = "ViewGrid"; + public const string ViewGridOutline = "ViewGridOutline"; + public const string ViewGridPlus = "ViewGridPlus"; + public const string ViewGridPlusOutline = "ViewGridPlusOutline"; + public const string ViewHeadline = "ViewHeadline"; + public const string ViewList = "ViewList"; + public const string ViewListOutline = "ViewListOutline"; + public const string ViewModule = "ViewModule"; + public const string ViewModuleOutline = "ViewModuleOutline"; + public const string ViewParallel = "ViewParallel"; + public const string ViewParallelOutline = "ViewParallelOutline"; + public const string ViewQuilt = "ViewQuilt"; + public const string ViewQuiltOutline = "ViewQuiltOutline"; + public const string ViewSequential = "ViewSequential"; + public const string ViewSequentialOutline = "ViewSequentialOutline"; + public const string ViewSplitHorizontal = "ViewSplitHorizontal"; + public const string ViewSplitVertical = "ViewSplitVertical"; + public const string ViewStream = "ViewStream"; + public const string ViewStreamOutline = "ViewStreamOutline"; + public const string ViewWeek = "ViewWeek"; + public const string ViewWeekOutline = "ViewWeekOutline"; + public const string Vimeo = "Vimeo"; + public const string Violin = "Violin"; + public const string VirtualReality = "VirtualReality"; + public const string Virus = "Virus"; + public const string VirusOff = "VirusOff"; + public const string VirusOffOutline = "VirusOffOutline"; + public const string VirusOutline = "VirusOutline"; + public const string Vlc = "Vlc"; + public const string Voicemail = "Voicemail"; + public const string Volleyball = "Volleyball"; + public const string VolumeHigh = "VolumeHigh"; + public const string VolumeLow = "VolumeLow"; + public const string VolumeMedium = "VolumeMedium"; + public const string VolumeMinus = "VolumeMinus"; + public const string VolumeMute = "VolumeMute"; + public const string VolumeOff = "VolumeOff"; + public const string VolumePlus = "VolumePlus"; + public const string VolumeSource = "VolumeSource"; + public const string VolumeVariantOff = "VolumeVariantOff"; + public const string VolumeVibrate = "VolumeVibrate"; + public const string Vote = "Vote"; + public const string VoteOutline = "VoteOutline"; + public const string Vpn = "Vpn"; + public const string Vuejs = "Vuejs"; + public const string Vuetify = "Vuetify"; + public const string Walk = "Walk"; + public const string Wall = "Wall"; + public const string Wallet = "Wallet"; + public const string WalletGiftcard = "WalletGiftcard"; + public const string WalletMembership = "WalletMembership"; + public const string WalletOutline = "WalletOutline"; + public const string WalletPlus = "WalletPlus"; + public const string WalletPlusOutline = "WalletPlusOutline"; + public const string WalletTravel = "WalletTravel"; + public const string Wallpaper = "Wallpaper"; + public const string WallSconce = "WallSconce"; + public const string WallSconceFlat = "WallSconceFlat"; + public const string WallSconceFlatOutline = "WallSconceFlatOutline"; + public const string WallSconceFlatVariant = "WallSconceFlatVariant"; + public const string WallSconceFlatVariantOutline = "WallSconceFlatVariantOutline"; + public const string WallSconceOutline = "WallSconceOutline"; + public const string WallSconceRound = "WallSconceRound"; + public const string WallSconceRoundOutline = "WallSconceRoundOutline"; + public const string WallSconceRoundVariant = "WallSconceRoundVariant"; + public const string WallSconceRoundVariantOutline = "WallSconceRoundVariantOutline"; + public const string Wan = "Wan"; + public const string Wardrobe = "Wardrobe"; + public const string WardrobeOutline = "WardrobeOutline"; + public const string Warehouse = "Warehouse"; + public const string WashingMachine = "WashingMachine"; + public const string WashingMachineAlert = "WashingMachineAlert"; + public const string WashingMachineOff = "WashingMachineOff"; + public const string Watch = "Watch"; + public const string WatchExport = "WatchExport"; + public const string WatchExportVariant = "WatchExportVariant"; + public const string WatchImport = "WatchImport"; + public const string WatchImportVariant = "WatchImportVariant"; + public const string WatchVariant = "WatchVariant"; + public const string WatchVibrate = "WatchVibrate"; + public const string WatchVibrateOff = "WatchVibrateOff"; + public const string Water = "Water"; + public const string WaterAlert = "WaterAlert"; + public const string WaterAlertOutline = "WaterAlertOutline"; + public const string WaterBoiler = "WaterBoiler"; + public const string WaterBoilerAlert = "WaterBoilerAlert"; + public const string WaterBoilerOff = "WaterBoilerOff"; + public const string WaterCheck = "WaterCheck"; + public const string WaterCheckOutline = "WaterCheckOutline"; + public const string WaterCircle = "WaterCircle"; + public const string Waterfall = "Waterfall"; + public const string WateringCan = "WateringCan"; + public const string WateringCanOutline = "WateringCanOutline"; + public const string Watermark = "Watermark"; + public const string WaterMinus = "WaterMinus"; + public const string WaterMinusOutline = "WaterMinusOutline"; + public const string WaterOff = "WaterOff"; + public const string WaterOffOutline = "WaterOffOutline"; + public const string WaterOpacity = "WaterOpacity"; + public const string WaterOutline = "WaterOutline"; + public const string WaterPercent = "WaterPercent"; + public const string WaterPercentAlert = "WaterPercentAlert"; + public const string WaterPlus = "WaterPlus"; + public const string WaterPlusOutline = "WaterPlusOutline"; + public const string WaterPolo = "WaterPolo"; + public const string WaterPump = "WaterPump"; + public const string WaterPumpOff = "WaterPumpOff"; + public const string WaterRemove = "WaterRemove"; + public const string WaterRemoveOutline = "WaterRemoveOutline"; + public const string WaterSync = "WaterSync"; + public const string WaterWell = "WaterWell"; + public const string WaterWellOutline = "WaterWellOutline"; + public const string Wave = "Wave"; + public const string Waveform = "Waveform"; + public const string Waves = "Waves"; + public const string WavesArrowLeft = "WavesArrowLeft"; + public const string WavesArrowRight = "WavesArrowRight"; + public const string WavesArrowUp = "WavesArrowUp"; + public const string Waze = "Waze"; + public const string WeatherCloudy = "WeatherCloudy"; + public const string WeatherCloudyAlert = "WeatherCloudyAlert"; + public const string WeatherCloudyArrowRight = "WeatherCloudyArrowRight"; + public const string WeatherCloudyClock = "WeatherCloudyClock"; + public const string WeatherFog = "WeatherFog"; + public const string WeatherHail = "WeatherHail"; + public const string WeatherHazy = "WeatherHazy"; + public const string WeatherHurricane = "WeatherHurricane"; + public const string WeatherLightning = "WeatherLightning"; + public const string WeatherLightningRainy = "WeatherLightningRainy"; + public const string WeatherNight = "WeatherNight"; + public const string WeatherNightPartlyCloudy = "WeatherNightPartlyCloudy"; + public const string WeatherPartlyCloudy = "WeatherPartlyCloudy"; + public const string WeatherPartlyLightning = "WeatherPartlyLightning"; + public const string WeatherPartlyRainy = "WeatherPartlyRainy"; + public const string WeatherPartlySnowy = "WeatherPartlySnowy"; + public const string WeatherPartlySnowyRainy = "WeatherPartlySnowyRainy"; + public const string WeatherPouring = "WeatherPouring"; + public const string WeatherRainy = "WeatherRainy"; + public const string WeatherSnowy = "WeatherSnowy"; + public const string WeatherSnowyHeavy = "WeatherSnowyHeavy"; + public const string WeatherSnowyRainy = "WeatherSnowyRainy"; + public const string WeatherSunny = "WeatherSunny"; + public const string WeatherSunnyAlert = "WeatherSunnyAlert"; + public const string WeatherSunnyOff = "WeatherSunnyOff"; + public const string WeatherSunset = "WeatherSunset"; + public const string WeatherSunsetDown = "WeatherSunsetDown"; + public const string WeatherSunsetUp = "WeatherSunsetUp"; + public const string WeatherTornado = "WeatherTornado"; + public const string WeatherWindy = "WeatherWindy"; + public const string WeatherWindyVariant = "WeatherWindyVariant"; + public const string Web = "Web"; + public const string WebBox = "WebBox"; + public const string Webcam = "Webcam"; + public const string WebcamOff = "WebcamOff"; + public const string WebCancel = "WebCancel"; + public const string WebCheck = "WebCheck"; + public const string WebClock = "WebClock"; + public const string Webhook = "Webhook"; + public const string WebMinus = "WebMinus"; + public const string WebOff = "WebOff"; + public const string Webpack = "Webpack"; + public const string WebPlus = "WebPlus"; + public const string WebRefresh = "WebRefresh"; + public const string WebRemove = "WebRemove"; + public const string Webrtc = "Webrtc"; + public const string WebSync = "WebSync"; + public const string Wechat = "Wechat"; + public const string Weight = "Weight"; + public const string WeightGram = "WeightGram"; + public const string WeightKilogram = "WeightKilogram"; + public const string WeightLifter = "WeightLifter"; + public const string WeightPound = "WeightPound"; + public const string Whatsapp = "Whatsapp"; + public const string WheelBarrow = "WheelBarrow"; + public const string WheelchairAccessibility = "WheelchairAccessibility"; + public const string Whistle = "Whistle"; + public const string WhistleOutline = "WhistleOutline"; + public const string WhiteBalanceAuto = "WhiteBalanceAuto"; + public const string WhiteBalanceIncandescent = "WhiteBalanceIncandescent"; + public const string WhiteBalanceIridescent = "WhiteBalanceIridescent"; + public const string WhiteBalanceSunny = "WhiteBalanceSunny"; + public const string Widgets = "Widgets"; + public const string WidgetsOutline = "WidgetsOutline"; + public const string Wifi = "Wifi"; + public const string WifiAlert = "WifiAlert"; + public const string WifiArrowDown = "WifiArrowDown"; + public const string WifiArrowLeft = "WifiArrowLeft"; + public const string WifiArrowLeftRight = "WifiArrowLeftRight"; + public const string WifiArrowRight = "WifiArrowRight"; + public const string WifiArrowUp = "WifiArrowUp"; + public const string WifiArrowUpDown = "WifiArrowUpDown"; + public const string WifiCancel = "WifiCancel"; + public const string WifiCheck = "WifiCheck"; + public const string WifiCog = "WifiCog"; + public const string WifiLock = "WifiLock"; + public const string WifiLockOpen = "WifiLockOpen"; + public const string WifiMarker = "WifiMarker"; + public const string WifiMinus = "WifiMinus"; + public const string WifiOff = "WifiOff"; + public const string WifiPlus = "WifiPlus"; + public const string WifiRefresh = "WifiRefresh"; + public const string WifiRemove = "WifiRemove"; + public const string WifiSettings = "WifiSettings"; + public const string WifiStar = "WifiStar"; + public const string WifiStrength1 = "WifiStrength1"; + public const string WifiStrength1Alert = "WifiStrength1Alert"; + public const string WifiStrength1Lock = "WifiStrength1Lock"; + public const string WifiStrength1LockOpen = "WifiStrength1LockOpen"; + public const string WifiStrength2 = "WifiStrength2"; + public const string WifiStrength2Alert = "WifiStrength2Alert"; + public const string WifiStrength2Lock = "WifiStrength2Lock"; + public const string WifiStrength2LockOpen = "WifiStrength2LockOpen"; + public const string WifiStrength3 = "WifiStrength3"; + public const string WifiStrength3Alert = "WifiStrength3Alert"; + public const string WifiStrength3Lock = "WifiStrength3Lock"; + public const string WifiStrength3LockOpen = "WifiStrength3LockOpen"; + public const string WifiStrength4 = "WifiStrength4"; + public const string WifiStrength4Alert = "WifiStrength4Alert"; + public const string WifiStrength4Lock = "WifiStrength4Lock"; + public const string WifiStrength4LockOpen = "WifiStrength4LockOpen"; + public const string WifiStrengthAlertOutline = "WifiStrengthAlertOutline"; + public const string WifiStrengthLockOpenOutline = "WifiStrengthLockOpenOutline"; + public const string WifiStrengthLockOutline = "WifiStrengthLockOutline"; + public const string WifiStrengthOff = "WifiStrengthOff"; + public const string WifiStrengthOffOutline = "WifiStrengthOffOutline"; + public const string WifiStrengthOutline = "WifiStrengthOutline"; + public const string WifiSync = "WifiSync"; + public const string Wikipedia = "Wikipedia"; + public const string WindowClose = "WindowClose"; + public const string WindowClosed = "WindowClosed"; + public const string WindowClosedVariant = "WindowClosedVariant"; + public const string WindowMaximize = "WindowMaximize"; + public const string WindowMinimize = "WindowMinimize"; + public const string WindowOpen = "WindowOpen"; + public const string WindowOpenVariant = "WindowOpenVariant"; + public const string WindowRestore = "WindowRestore"; + public const string WindowShutter = "WindowShutter"; + public const string WindowShutterAlert = "WindowShutterAlert"; + public const string WindowShutterOpen = "WindowShutterOpen"; + public const string Windsock = "Windsock"; + public const string WindTurbine = "WindTurbine"; + public const string Wiper = "Wiper"; + public const string WiperWash = "WiperWash"; + public const string WiperWashAlert = "WiperWashAlert"; + public const string WizardHat = "WizardHat"; + public const string Wordpress = "Wordpress"; + public const string Wrap = "Wrap"; + public const string WrapDisabled = "WrapDisabled"; + public const string Wrench = "Wrench"; + public const string WrenchOutline = "WrenchOutline"; + public const string Xamarin = "Xamarin"; + public const string Xml = "Xml"; + public const string Xmpp = "Xmpp"; + public const string Yahoo = "Yahoo"; + public const string Yeast = "Yeast"; + public const string YinYang = "YinYang"; + public const string Yoga = "Yoga"; + public const string Youtube = "Youtube"; + public const string YoutubeGaming = "YoutubeGaming"; + public const string YoutubeStudio = "YoutubeStudio"; + public const string YoutubeSubscription = "YoutubeSubscription"; + public const string YoutubeTv = "YoutubeTv"; + public const string Yurt = "Yurt"; + public const string Zend = "Zend"; + public const string Zigbee = "Zigbee"; + public const string ZipBox = "ZipBox"; + public const string ZipBoxOutline = "ZipBoxOutline"; + public const string ZipDisk = "ZipDisk"; + public const string ZodiacAquarius = "ZodiacAquarius"; + public const string ZodiacAries = "ZodiacAries"; + public const string ZodiacCancer = "ZodiacCancer"; + public const string ZodiacCapricorn = "ZodiacCapricorn"; + public const string ZodiacGemini = "ZodiacGemini"; + public const string ZodiacLeo = "ZodiacLeo"; + public const string ZodiacLibra = "ZodiacLibra"; + public const string ZodiacPisces = "ZodiacPisces"; + public const string ZodiacSagittarius = "ZodiacSagittarius"; + public const string ZodiacScorpio = "ZodiacScorpio"; + public const string ZodiacTaurus = "ZodiacTaurus"; + public const string ZodiacVirgo = "ZodiacVirgo"; + public const string ZWave = "ZWave"; +} diff --git a/LuYao.Toolkit.Core/LuYao.Toolkit.Core.csproj b/LuYao.Toolkit.Core/LuYao.Toolkit.Core.csproj new file mode 100644 index 0000000..f20a82e --- /dev/null +++ b/LuYao.Toolkit.Core/LuYao.Toolkit.Core.csproj @@ -0,0 +1,37 @@ + + + + + net7.0 + LuYao.Toolkit + latest + + + + + + + + + + + + + + + + + + + + + + + + + + ..\libs\LuYao.Common.dll + + + + diff --git a/LuYao.Toolkit.Core/Regions/RegionNames.cs b/LuYao.Toolkit.Core/Regions/RegionNames.cs new file mode 100644 index 0000000..1624db4 --- /dev/null +++ b/LuYao.Toolkit.Core/Regions/RegionNames.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Regions; + +public static class RegionNames +{ + public static string MainRegion => nameof(MainRegion); + public static string WorkingRegion => nameof(WorkingRegion); + public static string PortProxyDetailRegion => nameof(PortProxyDetailRegion); +} diff --git a/LuYao.Toolkit.Core/Resources/AppResources.cs b/LuYao.Toolkit.Core/Resources/AppResources.cs new file mode 100644 index 0000000..369a910 --- /dev/null +++ b/LuYao.Toolkit.Core/Resources/AppResources.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text; + +namespace LuYao.Toolkit.Resources; + +public static partial class AppResources +{ + private static readonly IReadOnlyList _values; + public static long Version { get; } + static AppResources() + { + + var ass = typeof(AppResources).Assembly; + using (var ms = ass.GetManifestResourceStream($"{typeof(AppResources).Namespace}.LuYao.Toolkit.dat")) + using (var r = new BinaryReader(ms)) + { + Version = r.ReadInt64(); + var total = r.ReadInt32(); + var lengths = new int[total]; + var values = new string[total]; + for (int i = 0; i < total; i++) + { + var len = r.ReadInt32(); + lengths[i] = len; + } + for (int i = 0; i < total; i++) + { + var len = lengths[i]; + var bytes = r.ReadBytes(len); + var str = Decompress(bytes); + values[i] = str; + } + _values = values; + } + } + static string Decompress(byte[] data) + { + using (var input = new MemoryStream(data)) + using (var output = new MemoryStream()) + using (DeflateStream decompressor = new DeflateStream(input, CompressionMode.Decompress)) + { + decompressor.CopyTo(output); + var bytes = output.ToArray(); + return Encoding.UTF8.GetString(bytes); + } + } + public static string Get(int id) + { + if (id >= 0 && id < _values.Count) return _values[id]; + throw new Exception($"ID为:{id} 得资源未找到"); + } + public static bool TryGet(int id, out string value) + { + if (id >= 0 && id < _values.Count) + { + value = _values[id]; + return true; + } + value = default; + return false; + } + public static int Count => _values.Count; +} diff --git a/LuYao.Toolkit.Core/Resources/AppResources.g.cs b/LuYao.Toolkit.Core/Resources/AppResources.g.cs new file mode 100644 index 0000000..fdf5197 --- /dev/null +++ b/LuYao.Toolkit.Core/Resources/AppResources.g.cs @@ -0,0 +1,11 @@ +namespace LuYao.Toolkit.Resources; + +// Build Time : 2023-02-01T14:48:31.0333983+08:00 +// Version : 1675234111 +partial class AppResources +{ + public static string Channels_Converts_JsonToCSharp_JS => Get(0); + public static string Channels_Converts_JsonToCSharpDemo_JSON => Get(1); + public static string Channels_Converts_JsonToCsv_JS => Get(2); + public static string Channels_Converts_JsonToCsvDemo_JSON => Get(3); +} diff --git a/LuYao.Toolkit.Core/Resources/BuildAppResources.linq b/LuYao.Toolkit.Core/Resources/BuildAppResources.linq new file mode 100644 index 0000000..e465e99 --- /dev/null +++ b/LuYao.Toolkit.Core/Resources/BuildAppResources.linq @@ -0,0 +1,112 @@ + + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Common.dll + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Toolkit.Core.dll + LuYao.Toolkit.Services + System.IO.Compression + + +void Main() +{ + var dir = Path.GetDirectoryName(Util.CurrentQueryPath); + var root = string.Empty; + while (!string.IsNullOrWhiteSpace(dir)) + { + var sln = Directory.GetFiles(dir, "*.sln"); + if (sln.Length == 0) + { + dir = Path.GetDirectoryName(dir); + } + else + { + root = dir; + break; + } + } + root.Dump("ROOT"); + var regex = new Regex("\\.res\\.(?\\w+)$", RegexOptions.Compiled); + var files = Directory.GetFiles(root, "*.res.*", SearchOption.AllDirectories); + var items = new List(); + foreach (var file in files) + { + //获取项目目录 + var proj = GetProjectRoot(file); + if (string.IsNullOrWhiteSpace(proj)) continue; + var re = Path.GetRelativePath(proj, file); + re = regex.Replace(re, "") + Path.GetExtension(file).ToUpperInvariant(); + var name = ToConstName(re); + var str = FileService.ReadAllText(file); + var bytes = Encoding.UTF8.GetBytes(str); + bytes = Compress(bytes); + items.Add(new Item(name, bytes.Length, bytes)); + } + var version = DateTimeOffset.Now.ToUnixTimeSeconds(); + //写分布类 + var sb = new StringBuilder(); + sb.AppendLine("namespace LuYao.Toolkit.Resources;"); + sb.AppendLine(); + sb.AppendFormat("// Build Time : {0:O}", DateTime.Now); + sb.AppendLine(); + sb.AppendFormat("// Version : {0}", version); + sb.AppendLine(); + sb.AppendLine("partial class AppResources"); + sb.AppendLine("{"); + for (int i = 0; i < items.Count; i++) + { + var item = items[i]; + sb.AppendFormat(" public static string {0} => Get({1});", item.Name, i); + sb.AppendLine(); + } + sb.AppendLine("}"); + File.WriteAllText(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "AppResources.g.cs"), sb.ToString(), Encoding.UTF8); + //写数据格式 + var target = Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "LuYao.Toolkit.dat"); + if (File.Exists(target)) File.Delete(target); + using (var fs = File.OpenWrite(target)) + { + using (var w = new BinaryWriter(fs)) + { + w.Write(version); + w.Write(items.Count); + foreach (var item in items) w.Write(item.Length); + foreach (var item in items) w.Write(item.Data); + } + } + items.Count.Dump("Total"); +} +string GetProjectRoot(string file) +{ + var dir = Path.GetDirectoryName(file); + string root = string.Empty; + while (!string.IsNullOrWhiteSpace(dir)) + { + var files = Directory.GetFiles(dir, "*.csproj"); + if (files.Length > 0) + { + root = dir; + break; + } + else + { + dir = Path.GetDirectoryName(dir); + } + } + return root; +} +string ToConstName(string str) +{ + return str.Replace("\\", "_").Replace(".", "_").Replace("-","_"); +} +// You can define other methods, fields, classes and namespaces here +byte[] Compress(byte[] bytes) +{ + using (var input = new MemoryStream(bytes)) + using (var output = new MemoryStream()) + using (DeflateStream compressor = new DeflateStream(output, CompressionLevel.SmallestSize)) + { + input.CopyTo(compressor); + compressor.Flush(); + return output.ToArray(); + } +} + +public record Item(string Name, int Length, byte[] Data); \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Resources/LuYao.Toolkit.dat b/LuYao.Toolkit.Core/Resources/LuYao.Toolkit.dat new file mode 100644 index 0000000..b9de6db Binary files /dev/null and b/LuYao.Toolkit.Core/Resources/LuYao.Toolkit.dat differ diff --git a/LuYao.Toolkit.Core/Resources/TestAppResources.linq b/LuYao.Toolkit.Core/Resources/TestAppResources.linq new file mode 100644 index 0000000..ac72f2c --- /dev/null +++ b/LuYao.Toolkit.Core/Resources/TestAppResources.linq @@ -0,0 +1,13 @@ + + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Common.dll + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Toolkit.Core.dll + LuYao.Toolkit.Services + System.IO.Compression + LuYao.Toolkit.Resources + + +for (int i = 0; i < AppResources.Count; i++) +{ + AppResources.Get(i).Length.Dump(); +} +AppResources.Version.Dump(); \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Services/ClipboardService.cs b/LuYao.Toolkit.Core/Services/ClipboardService.cs new file mode 100644 index 0000000..7c85ed1 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/ClipboardService.cs @@ -0,0 +1,11 @@ +namespace LuYao.Toolkit.Services; +public static class ClipboardService +{ + public static void CopyText(string text) + { + if (string.IsNullOrWhiteSpace(text)) return; + ServiceProviderContainer.Provider.CopyTextToClipboard(text); + } + public static string GetText() => ServiceProviderContainer.Provider.GetClipboardText(); + public static string GetImage() => ServiceProviderContainer.Provider.GetClipboardImage(); +} diff --git a/LuYao.Toolkit.Core/Services/FileDialogService.cs b/LuYao.Toolkit.Core/Services/FileDialogService.cs new file mode 100644 index 0000000..bd45628 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/FileDialogService.cs @@ -0,0 +1,7 @@ +namespace LuYao.Toolkit.Services; + +public static class FileDialogService +{ + public static IOpenFileDialog CreateOpenFileDialog() => ServiceProviderContainer.Provider.CreateOpenFileDialog(); + public static ISaveFileDialog CreateSaveFileDialog() => ServiceProviderContainer.Provider.CreateSaveFileDialog(); +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Services/FileService.cs b/LuYao.Toolkit.Core/Services/FileService.cs new file mode 100644 index 0000000..cbe3d2f --- /dev/null +++ b/LuYao.Toolkit.Core/Services/FileService.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UtfUnknown; + +namespace LuYao.Toolkit.Services; + +public static class FileService +{ + public static Encoding GetEncoding(string filePath) + { + var result = CharsetDetector.DetectFromFile(filePath); + var encoding = Encoding.UTF8; + if (result.Detected != null && result.Detected.Encoding != null) { encoding = result.Detected.Encoding; } + return encoding; + } + public static async Task ReadAllTextAsync(string filePath) + { + var encoding = GetEncoding(filePath); + using (var fs = File.OpenRead(filePath)) + { + using (var sr = new StreamReader(fs, encoding)) + { + return await sr.ReadToEndAsync(); + } + } + } + + public static string ReadAllText(string filePath) + { + var encoding = GetEncoding(filePath); + using (var fs = File.OpenRead(filePath)) + { + using (var sr = new StreamReader(fs, encoding)) + { + return sr.ReadToEnd(); + } + } + } +} diff --git a/LuYao.Toolkit.Core/Services/GoogleService.cs b/LuYao.Toolkit.Core/Services/GoogleService.cs new file mode 100644 index 0000000..168948f --- /dev/null +++ b/LuYao.Toolkit.Core/Services/GoogleService.cs @@ -0,0 +1,236 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Web; + +namespace LuYao.Toolkit.Services; + +public static class GoogleService +{ + private static string[] GoogleIPAddress = new string[] { "108.177.122.90", "142.250.0.90", "142.250.10.90", "142.250.100.90", "142.250.101.90", "142.250.105.90", "142.250.107.90", "142.250.11.90", "142.250.110.90", "142.250.111.90", "142.250.112.90", "142.250.12.90", "142.250.125.90", "142.250.126.90", "142.250.128.90", "142.250.136.90", "142.250.185.174", "142.250.185.238", "142.250.189.206", "142.250.203.142", "142.250.218.14", "142.250.27.90", "142.250.28.90", "142.250.30.90", "142.250.31.90", "142.250.4.90", "142.250.8.90", "142.250.9.90", "142.250.96.90", "142.250.97.90", "142.250.98.90", "142.251.10.138", "142.251.116.101", "142.251.40.174", "142.251.5.90", "142.251.9.90", "172.217.0.46", "172.217.13.142", "172.217.16.46", "172.217.192.90", "172.217.195.90", "172.217.203.90", "172.217.204.90", "172.217.214.90", "172.217.215.90", "172.217.222.90", "172.217.31.142", "172.253.112.90", "172.253.114.90", "172.253.115.90", "172.253.116.90", "172.253.122.90", "172.253.123.90", "172.253.124.90", "172.253.126.90", "172.253.62.90", "216.58.209.174", "216.58.214.14", "216.58.220.142" }; + + public static string ResolveServerAddress() + { + var tasks = GoogleIPAddress.Select(str => Task.Run(() => Ping(str))).ToList(); + while (tasks.Count > 0) + { + var idx = Task.WaitAny(tasks.ToArray()); + if (idx < 0) throw new Exception("解析 IP 地址没有成功"); + var first = tasks[idx]; + tasks.RemoveAt(idx); + if (first.IsCompletedSuccessfully()) + { + var ret = first.Result; + if (!string.IsNullOrWhiteSpace(ret)) return ret; + } + } + //有些电脑会禁止 ping ,所以在 ping 全部失效时,使用随机地址。 + return GoogleIPAddress[Random.Shared.Next(GoogleIPAddress.Length)]; + } + + private static async Task Ping(string ip) + { + var options = new PingOptions { DontFragment = true }; + const string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + byte[] buffer = Encoding.ASCII.GetBytes(data); + const int timeout = 1000 * 10; + using (var sender = new Ping()) + { + var reply = await sender.SendPingAsync(ip, timeout, buffer, options); + if (reply.Status == IPStatus.Success) return ip; + return string.Empty; + } + } + + private static IPAddress RemoteAddress = null; + + public static void RefreshRemoteAddress() + { + var ip = ResolveServerAddress(); + if (string.IsNullOrWhiteSpace(ip)) throw new Exception("解析 IP 地址没有成功"); + RemoteAddress = IPAddress.Parse(ip); + } + + public static HttpClient CreateHttpClient() + { + if (RemoteAddress == null) RefreshRemoteAddress(); + var handler = new SocketsHttpHandler + { + ConnectCallback = ConnectCallback, + UseProxy = false + }; + return new HttpClient(handler, true); + } + + private static async ValueTask ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellationToken) + { + Socket s = new Socket(SocketType.Stream, ProtocolType.Tcp); + try + { + await s.ConnectAsync(new IPEndPoint(RemoteAddress, context.DnsEndPoint.Port), cancellationToken); + return new NetworkStream(s, true); + } + catch + { + s.Dispose(); + throw; + } + } + public class TranslateResult + { + public string SourceLanguage { get; set; } = string.Empty; + public List Lines { get; } = new List(); + } + + private const string Endpoint = "https://translate.googleapis.com/translate_a/t"; + private const string Query = "anno=3&client=te_lib&format=html&v=1.0&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw&logld=vTE_20220717&tc=1&sr=1&mode=1"; + private static readonly Regex RegexBlock = new Regex("(.+?)", RegexOptions.Compiled); + private static HttpClient DefaultHttpClient; + private static object Locker = new object(); + public static async Task Translate(string from, string to, IReadOnlyList lines) + { + if (DefaultHttpClient == null) + { + lock (Locker) + { + if (DefaultHttpClient == null) + { + DefaultHttpClient = CreateHttpClient(); + } + } + } + return await Translate(DefaultHttpClient, from, to, lines); + } + public static async Task Translate(HttpClient http, string from, string to, IReadOnlyList lines) + { + var ret = new TranslateResult(); + var builder = new UriBuilder(Endpoint) { Port = -1 }; + var qs = HttpUtility.ParseQueryString(Query); + var data = string.Join(string.Empty, lines); + var tk = GetTK(data); + qs["tk"] = tk; + qs["sl"] = from; + qs["tl"] = to; + builder.Query = qs.ToString(); + var doc = new HtmlAgilityPack.HtmlDocument(); + using (var request = new HttpRequestMessage(HttpMethod.Post, builder.Uri.ToString())) + { + using (var post = new FormUrlEncodedContent(lines.Select(i => new KeyValuePair("q", i)))) + { + request.Content = post; + using (var response = await http.SendAsync(request)) + { + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(); + //var ret = new List(); + var items = JArray.Parse(json); + foreach (var item in items) + { + var line = string.Empty; + if (item.Type == JTokenType.String) + { + line = item.Value(); + } + else if (item.Type == JTokenType.Array) + { + line = item.Value(0); + if (string.IsNullOrWhiteSpace(ret.SourceLanguage)) + { + var lang = item.Value(1); + if (!string.IsNullOrWhiteSpace(lang)) ret.SourceLanguage = lang; + } + } + if (!string.IsNullOrWhiteSpace(line)) + { + //去掉原文对照 + var matches = RegexBlock.Matches(line); + if (matches.Count > 0) line = string.Join(string.Empty, matches.Cast().Select(f => f.Groups[1].Value)); + } + + if (line.StartsWith("<")) + { + doc.LoadHtml(line); + line = doc.DocumentNode.InnerText; + } + else + { + line = HttpUtility.HtmlDecode(line); + } + + ret.Lines.Add(line); + } + return ret; + } + } + } + } + private static (int First, int Last) Key = (460609, 461153391); + private static long Mask(long a, string b) + { + for (int i = 0; i < b.Length - 2; i += 3) + { + int c = b[i + 2]; + int d = 'a' <= c ? (int)c - 87 : (int)c - 48; + d = '+' == b[i + 1] ? (int)((uint)a >> d) : (int)(a << d); + a = '+' == b[i] ? a + d & 4294967295 : a ^ d; + } + return a; + } + private static string GetTK(string s) + { + SortedDictionary d = new SortedDictionary(); + int e = 0; + for (int f = 0; f < s.Length; f++) + { + int g = s[f]; + if (128 > g) + { + d[e++] = g; + } + else + { + if (2048 > g) + { + d[e++] = g >> 6 | 192; + d[e++] = g & 63 | 128; + } + else if (55296 == (g & 64512) && f + 1 < s.Length && 56320 == (s[f + 1] & 64512)) + { + g = 65536 + ((g & 1023) << 10) + (s[++f] & 1023); + d[e++] = g >> 18 | 240; + d[e++] = g >> 12 & 63 | 128; + d[e++] = g >> 6 & 63 | 128; + d[e++] = g & 63 | 128; + } + else + { + d[e++] = g >> 12 | 224; + d[e++] = g >> 6 & 63 | 128; + d[e++] = g & 63 | 128; + } + } + } + + long a = Key.First; + for (e = 0; e < d.Count; e++) + { + a += d[e]; + a = Mask(a, "+-a^+6"); + } + a = Mask(a, "+-3^+b+-f"); + a ^= Key.Last; + if (0 > a) { a = (a & 2147483647) + 2147483648; } + var z = a % 1000000; + return $"{z}.{z ^ Key.First}"; + } +} diff --git a/LuYao.Toolkit.Core/Services/IOpenFileDialog.cs b/LuYao.Toolkit.Core/Services/IOpenFileDialog.cs new file mode 100644 index 0000000..881a4e5 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/IOpenFileDialog.cs @@ -0,0 +1,11 @@ +namespace LuYao.Toolkit.Services; + +public interface IOpenFileDialog +{ + string Title { get; set; } + string Filter { get; set; } + bool Multiselect { get; set; } + bool ShowDialog(); + string FileName { get; set; } + string[] FileNames { get; } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Services/ISaveFileDialog.cs b/LuYao.Toolkit.Core/Services/ISaveFileDialog.cs new file mode 100644 index 0000000..0909100 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/ISaveFileDialog.cs @@ -0,0 +1,19 @@ +namespace LuYao.Toolkit.Services +{ + public interface ISaveFileDialog + { + string Title { get; set; } + + string InitialDirectory { get; set; } + + string Filter { get; set; } + + bool AddExtension { get; set; } + + string FileName { get; set; } + string DefaultExt { get; set; } + + + bool ShowDialog(); + } +} diff --git a/LuYao.Toolkit.Core/Services/IServiceProvider.cs b/LuYao.Toolkit.Core/Services/IServiceProvider.cs new file mode 100644 index 0000000..08ef4a1 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/IServiceProvider.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Services; + +public interface IServiceProvider +{ + void CopyTextToClipboard(string text); + string GetClipboardText(); + string GetClipboardImage(); + IOpenFileDialog CreateOpenFileDialog(); + ISaveFileDialog CreateSaveFileDialog(); + void NotifyQuickTip(string msg); + void NotifySuccess(string msg); + void NotifyInfo(string msg); + void NotifyWarning(string msg); + void NotifyFail(string msg); + void NotifyClear(); + bool MessageBoxConfirm(string message, string title); + void MessageBoxAlert(string message, string title); + void Tongji(string url); + Task PlaySound(string url); +} diff --git a/LuYao.Toolkit.Core/Services/IWatchToken.cs b/LuYao.Toolkit.Core/Services/IWatchToken.cs new file mode 100644 index 0000000..aa77996 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/IWatchToken.cs @@ -0,0 +1,10 @@ +using System; +using System.IO; + +namespace LuYao.Toolkit.Services; + +public interface IWatchToken : IDisposable +{ + event EventHandler Changed; + string FullName { get; } +} diff --git a/LuYao.Toolkit.Core/Services/MessageBoxService.cs b/LuYao.Toolkit.Core/Services/MessageBoxService.cs new file mode 100644 index 0000000..7cce62e --- /dev/null +++ b/LuYao.Toolkit.Core/Services/MessageBoxService.cs @@ -0,0 +1,10 @@ +namespace LuYao.Toolkit.Services; + +public static class MessageBoxService +{ + + public static bool Confirm(string message, string title) => ServiceProviderContainer.Provider.MessageBoxConfirm(message, title); + public static bool Confirm(string message) => Confirm(message, "确认"); + public static void Alert(string message, string title) => ServiceProviderContainer.Provider.MessageBoxAlert(message, title); + public static void Alert(string message) => Alert(message, "提示"); +} diff --git a/LuYao.Toolkit.Core/Services/NotifyService.cs b/LuYao.Toolkit.Core/Services/NotifyService.cs new file mode 100644 index 0000000..f1fef9d --- /dev/null +++ b/LuYao.Toolkit.Core/Services/NotifyService.cs @@ -0,0 +1,15 @@ +using System; + +namespace LuYao.Toolkit.Services; + +public static class NotifyService +{ + public static void QuickTip(string msg) => ServiceProviderContainer.Provider.NotifyQuickTip(msg); + public static void Success(string msg) => ServiceProviderContainer.Provider.NotifySuccess(msg); + public static void Info(string msg) => ServiceProviderContainer.Provider.NotifyInfo(msg); + public static void Warning(string msg) => ServiceProviderContainer.Provider.NotifyWarning(msg); + public static void Warning(Exception e) => ServiceProviderContainer.Provider.NotifyWarning(e.Message); + public static void Fail(string msg) => ServiceProviderContainer.Provider.NotifyFail(msg); + public static void Fail(Exception e) => ServiceProviderContainer.Provider.NotifyFail(e.Message); + public static void Clear() => ServiceProviderContainer.Provider.NotifyClear(); +} diff --git a/LuYao.Toolkit.Core/Services/NullServiceProvider.cs b/LuYao.Toolkit.Core/Services/NullServiceProvider.cs new file mode 100644 index 0000000..7ae3e2b --- /dev/null +++ b/LuYao.Toolkit.Core/Services/NullServiceProvider.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Services; + +internal class NullServiceProvider : IServiceProvider +{ + public void CopyTextToClipboard(string text) + { + throw new NotImplementedException(); + } + + public IOpenFileDialog CreateOpenFileDialog() + { + throw new NotImplementedException(); + } + + public ISaveFileDialog CreateSaveFileDialog() + { + throw new NotImplementedException(); + } + + public string GetClipboardImage() + { + throw new NotImplementedException(); + } + + public string GetClipboardText() + { + throw new NotImplementedException(); + } + + public void MessageBoxAlert(string message, string title) + { + throw new NotImplementedException(); + } + + public bool MessageBoxConfirm(string message, string title) + { + throw new NotImplementedException(); + } + + public void NotifyClear() + { + throw new NotImplementedException(); + } + + public void NotifyFail(string msg) + { + throw new NotImplementedException(); + } + + public void NotifyInfo(string msg) + { + throw new NotImplementedException(); + } + + public void NotifyQuickTip(string msg) + { + throw new NotImplementedException(); + } + + public void NotifySuccess(string msg) + { + throw new NotImplementedException(); + } + + public void NotifyWarning(string msg) + { + throw new NotImplementedException(); + } + + public Task PlaySound(string url) + { + throw new NotImplementedException(); + } + + public void Tongji(string url) + { + } +} diff --git a/LuYao.Toolkit.Core/Services/ServiceProviderContainer.cs b/LuYao.Toolkit.Core/Services/ServiceProviderContainer.cs new file mode 100644 index 0000000..8e48423 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/ServiceProviderContainer.cs @@ -0,0 +1,12 @@ +using System; + +namespace LuYao.Toolkit.Services; + +public static class ServiceProviderContainer +{ + public static IServiceProvider Provider { get; private set; } = new NullServiceProvider(); + public static void SetProvider(IServiceProvider provider) + { + Provider = provider ?? throw new ArgumentNullException(nameof(provider)); + } +} diff --git a/LuYao.Toolkit.Core/Services/SoundService.cs b/LuYao.Toolkit.Core/Services/SoundService.cs new file mode 100644 index 0000000..3dfbf34 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/SoundService.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Services +{ + public static class SoundService + { + public static async Task Play(string url) + { + if (string.IsNullOrWhiteSpace(url)) return; + await ServiceProviderContainer.Provider.PlaySound(url); + } + } +} diff --git a/LuYao.Toolkit.Core/Services/TongjiService.cs b/LuYao.Toolkit.Core/Services/TongjiService.cs new file mode 100644 index 0000000..c06763a --- /dev/null +++ b/LuYao.Toolkit.Core/Services/TongjiService.cs @@ -0,0 +1,30 @@ +using System; + +namespace LuYao.Toolkit.Services; + +public static class TongjiService +{ + public static void Tongji(string url) + { + ServiceProviderContainer.Provider.Tongji(url); + } + public static void Tongji(string url, object args) + { + var qs = System.Web.HttpUtility.ParseQueryString(string.Empty); + if (args != null) + { + var type = args.GetType(); + foreach (var o in type.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)) + { + if (o.CanRead == false) continue; + var value = o.GetValue(args); + if (value != null) qs[o.Name] = value.ToString(); + } + } + ServiceProviderContainer.Provider.Tongji($"{url}?{qs}"); + } + public static void Tongji(Type type) + { + ServiceProviderContainer.Provider.Tongji(type.FullName); + } +} diff --git a/LuYao.Toolkit.Core/Services/WatchFileService.cs b/LuYao.Toolkit.Core/Services/WatchFileService.cs new file mode 100644 index 0000000..aac2c7b --- /dev/null +++ b/LuYao.Toolkit.Core/Services/WatchFileService.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; + +namespace LuYao.Toolkit.Services; + +public static class WatchFileService +{ + public static IWatchToken Watch(string file, NotifyFilters filter = NotifyFilters.LastWrite | NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.Size, int delay = 500) + { + if (string.IsNullOrWhiteSpace(file)) throw new ArgumentNullException(nameof(file)); + + var watch = new FileSystemWatcher + { + NotifyFilter = filter, + Path = Path.GetDirectoryName(file), + Filter = Path.GetFileName(file), + }; + + return new WatchToken(watch, file, delay); + } +} diff --git a/LuYao.Toolkit.Core/Services/WatchToken.cs b/LuYao.Toolkit.Core/Services/WatchToken.cs new file mode 100644 index 0000000..0647580 --- /dev/null +++ b/LuYao.Toolkit.Core/Services/WatchToken.cs @@ -0,0 +1,88 @@ +using NewLife.Threading; +using System; +using System.Collections.Concurrent; +using System.IO; + +namespace LuYao.Toolkit.Services; + +public class WatchToken : IWatchToken +{ + public WatchToken(FileSystemWatcher watcher, string fullName,int delay) + { + Watcher = watcher ?? throw new ArgumentNullException(nameof(watcher)); + watcher.Created += Watcher_Changed; + watcher.Changed += Watcher_Changed; + watcher.Deleted += Watcher_Changed; + watcher.Renamed += Watcher_Changed; + watcher.EnableRaisingEvents = true; + _timer = new TimerX(Raise, null, int.MaxValue, int.MaxValue); + _delay = delay; + FullName = fullName; + } + private int _delay; + private readonly ConcurrentQueue _queue = new ConcurrentQueue(); + private readonly TimerX _timer; + + + private void Watcher_Changed(object sender, FileSystemEventArgs e) + { + _queue.Enqueue(e); + _timer.SetNext(_delay); + } + + private void Raise(object state) + { + FileSystemEventArgs e = null; + while (_queue.TryDequeue(out var current)) + { + if (e != null && e.FullPath != current.FullPath) + { + Changed?.Invoke(this, e); + } + if (e == null) + { + e = current; + } + else + { + var type = e.ChangeType | current.ChangeType; + e = new FileSystemEventArgs(type, Path.GetDirectoryName(e.FullPath) ?? string.Empty, e.Name); + } + } + if (e != null) + { + Changed?.Invoke(this, e); + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + ~WatchToken() + { + Dispose(false); + } + private void Dispose(bool disposing) + { + if (_disposed) return; + this.Watcher.EnableRaisingEvents = false; + this.Watcher.Created -= this.Watcher_Changed; + this.Watcher.Changed -= this.Watcher_Changed; + this.Watcher.Deleted -= this.Watcher_Changed; + this.Watcher.Renamed -= this.Watcher_Changed; + this._timer.Dispose(); + this.Watcher.Dispose(); + _disposed = true; + if (disposing) GC.SuppressFinalize(this); + } + + private bool _disposed = false; + + public FileSystemWatcher Watcher { get; } + + public string FullName { get; } + + public event EventHandler Changed; +} diff --git a/LuYao.Toolkit.Core/Tabs/Navs/BuildFromWebsite.linq b/LuYao.Toolkit.Core/Tabs/Navs/BuildFromWebsite.linq new file mode 100644 index 0000000..aaef59d --- /dev/null +++ b/LuYao.Toolkit.Core/Tabs/Navs/BuildFromWebsite.linq @@ -0,0 +1,61 @@ + + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\netstandard2.0\LuYao.Common.dll + D:\src\coderbusy.com\luyao\src\toolkit\LuYao.Toolkit.Core\bin\Debug\netstandard2.0\LuYao.Toolkit.Core.dll + YamlDotNet + LuYao.Toolkit.Tabs.Navs + Newtonsoft.Json + LuYao + System.Net.Http + HtmlAgilityPack + + +var http = new HttpClient(); +var html = await http.GetStringAsync("https://www.coderbusy.com/navs"); +var doc = new HtmlDocument(); +doc.LoadHtml(html); +var items = doc.DocumentNode.SelectNodes("//div[@class='item']"); +var d = new YamlDotNet.Serialization.Deserializer(); +var navs = new List(); +var all = new List(); +foreach (var item in items) +{ + navs.Clear(); + var g = new NavGroup { }; + all.Add(g); + var title = item.SelectSingleNode("h3").InnerText; + g.Title = title; + var links = item.SelectNodes("ul/li/a"); + foreach (var link in links) + { + var notes = link.Attributes["notes"].Value; + if (!string.IsNullOrWhiteSpace(notes)) + { + var bytes = Convert.FromBase64String(notes); + notes = Encoding.UTF8.GetString(bytes); + } + var nav = d.Deserialize(notes) ?? new NavItem { }; + nav.Url = link.GetAttributeValue("href", string.Empty); + var strong = link.SelectSingleNode("strong"); + if (strong != null) nav.Title = strong.InnerText; + var p = link.SelectSingleNode("p"); + if (p != null) nav.Description = p.InnerText; + var img = link.SelectSingleNode("img"); + if (img != null) nav.Favicon = img.GetAttributeValue("src", string.Empty); + navs.Add(nav); + } + g.Items = navs.ToArray(); +} +all.Dump(); +var json = JsonConvert.SerializeObject(all); +var zip = StringZipper.Zip(json, StringZipper.Deflate, StringZipper.Ascii85); +zip.Dump(); +var target = Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "NavGroup.g.cs"); +var sb = new StringBuilder(); +sb.AppendLine("namespace LuYao.Toolkit.Tabs.Navs;"); +sb.AppendLine(); +sb.AppendLine("public partial class NavGroup"); +sb.AppendLine("{"); +sb.AppendFormat(" private const string Data = {0};", JsonConvert.SerializeObject(zip)); +sb.AppendLine(); +sb.AppendLine("}"); +File.WriteAllText(target, sb.ToString(), Encoding.UTF8); \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.cs b/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.cs new file mode 100644 index 0000000..90a8ef4 --- /dev/null +++ b/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.cs @@ -0,0 +1,11 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace LuYao.Toolkit.Tabs.Navs; + +public partial class NavGroup +{ + public string Title { get; set; } + public NavItem[] Items { get; set; } + public static IReadOnlyCollection GetAll() => JsonConvert.DeserializeObject>(StringZipper.Unzip(Data)); +} diff --git a/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.g.cs b/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.g.cs new file mode 100644 index 0000000..7a4e7ec --- /dev/null +++ b/LuYao.Toolkit.Core/Tabs/Navs/NavGroup.g.cs @@ -0,0 +1,6 @@ +namespace LuYao.Toolkit.Tabs.Navs; + +public partial class NavGroup +{ + private const string Data = "data:text/x-deflate;ascii85,<~Q'Z>ddo[=)^IkAA=3?054uhR^0&Y#=W/Rsl1QF+TH7=t5aWtR.md*]L'WRB!;@n+'+DML&>le.2/Mm9(be6STq%`TK.C:PCAf6=pD@ZF?cFN-9cb9)Qo^oHsLHJX#7QuG`TBN6V4?r8EjS;qE!SMPUIart]q8=MiZ(]E(iNd?nNF0s82fJ!^Fn'SPnuZ\"V$\"%\"Ul*eXd688;V;[0!XOu4oAV<>,D#S!.06Rh*(f6_,-%V8jmDg(aKtRMXmf*CH)X\"lV#JV;`l[T/2S?G':.<;=e)lJRL3BjgU,du2[5#^#$TS\"ikDkPs];bt;n?=*m2ef.YQA5YI>4O]OW4:er8))d'\"]d.PBAiKH?]GfrjEl;f&mTs\"?oHLTS6a#%:QQoLE>G`ICb0f8S'R5;%O^bs^7Lb2g!qSFF]K,8RR`?6#7\"p]a;(bII6mShc!>cr`/2BPCl5;^[,XUB-r8ETJ[H,sQ&Ml;5gGZo=fjB7VrfSL#ITZM>>]4C2E%.uO^T@9OP@Z\"*('^%N/FO7ho!oGQhupf]K9']!FlcM4,-&>9\\h8k>2[U^'&jVLQ8XSWS,]Ou/-tcIV2t-H$GN$M)JDpEAj(YZRE\"dBp\"%B-qF^9[=jn_$2I\\+\\JAXOphE'KJbJQdRY@N3XhF>pNjarX8(=[>]G'?@enWF,h+gda+m0.:Gl:2'_?QB5]%LQK6C?p=g*]gOJn-1P,mofq$i6O@;qLnmX`_5Y#ru[:JP(20b#K!o^j:2oNjjbVK&j*cT#/P>A1e1f5lF$)kW[1SWnmRK2VUOHJ6:P5OCG]jZE$chft;'VUXs8%Fjm.<\"!%EPXPGp(1K^/j-*P8%_C=E^/8[Uf#Qs(^^`V,mF,8-P]ijD7?u$_drs<*L3dU9tK$`#N*_^3je%np<;s*&WAB,Z\"_9EXgh8cUUA_HI%BY1rO;1-G(FA8p!._M&MDr'3h*<=eXg\"JE-gH&2U#coDXQi=QE(-`r1$9DgGbn#Q\"5^29OaPQ!nFSqM"; +} diff --git a/LuYao.Toolkit.Core/Tabs/Navs/NavItem.cs b/LuYao.Toolkit.Core/Tabs/Navs/NavItem.cs new file mode 100644 index 0000000..0779e1f --- /dev/null +++ b/LuYao.Toolkit.Core/Tabs/Navs/NavItem.cs @@ -0,0 +1,10 @@ +namespace LuYao.Toolkit.Tabs.Navs; + +public class NavItem +{ + public string Title { get; set; } + public string Icon { get; set; } + public string Url { get; set; } + public string Favicon { get; set; } + public string Description { get; set; } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Core/Tabs/Tab.cs b/LuYao.Toolkit.Core/Tabs/Tab.cs new file mode 100644 index 0000000..37b34cc --- /dev/null +++ b/LuYao.Toolkit.Core/Tabs/Tab.cs @@ -0,0 +1,22 @@ +using LuYao.Toolkit.Views; + +namespace LuYao.Toolkit.Tabs; + +public class Tab +{ + public string Icon { get; } + public string IconArchived { get; } + public string Title { get; } + public string View { get; } + private Tab(string view, string title, string icon, string archived = null) + { + View = view; + Title = title; + Icon = IconArchived = icon; + if (!string.IsNullOrWhiteSpace(archived)) IconArchived = archived; + } + public static Tab Explorer { get; } = new Tab(ViewNames.Tabs.Explorer.Index, "浏览", Icons.Apps); + public static Tab Session { get; } = new Tab(ViewNames.Tabs.Session.Index, "会话", Icons.Chat); + public static Tab Navs { get; } = new Tab(ViewNames.Tabs.Navs.Index, "导航", Icons.Web); + public static Tab Rdp { get; } = new Tab(ViewNames.Tabs.Rdp.Index, "远程", Icons.RemoteDesktop); +} diff --git a/LuYao.Toolkit.Core/Themes/ThemeMode.cs b/LuYao.Toolkit.Core/Themes/ThemeMode.cs new file mode 100644 index 0000000..da4eba1 --- /dev/null +++ b/LuYao.Toolkit.Core/Themes/ThemeMode.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Themes; + +public enum ThemeMode +{ + Light = 1, + Dark = 2, +} diff --git a/LuYao.Toolkit.Core/Update/UpdateConfig.cs b/LuYao.Toolkit.Core/Update/UpdateConfig.cs new file mode 100644 index 0000000..872027d --- /dev/null +++ b/LuYao.Toolkit.Core/Update/UpdateConfig.cs @@ -0,0 +1,30 @@ +using LuYao.IO.Updating; +using NewLife.Configuration; +using System; +using System.Net.Http; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Update; + +public class UpdateConfig : Config +{ + public UpdateConfig() => NextCheckUpdate = DateTime.Now; + public static string Endpoint => "https://luyao.coderbusy.com/update"; + public DateTime NextCheckUpdate { get; set; } + public string GetDataUrl() + { + return $"{Endpoint.Trim('/')}/data.xml?t={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + } + public async Task GetLastVersion() + { + using (var http = new HttpClient()) + { + var xml = await http.GetStringAsync(GetDataUrl()); + return UpdatePackageHelper.Deserialize(xml); + } + } + public void ResetNextCheckTime() + { + NextCheckUpdate = DateTime.Now.AddDays(1); + } +} diff --git a/LuYao.Toolkit.Core/Validators/Extensions.cs b/LuYao.Toolkit.Core/Validators/Extensions.cs new file mode 100644 index 0000000..9d2e34f --- /dev/null +++ b/LuYao.Toolkit.Core/Validators/Extensions.cs @@ -0,0 +1,15 @@ +using FluentValidation; +using System; + +namespace LuYao.Toolkit.Validators; +public static class Extensions +{ + public static IRuleBuilderOptions IPAddress(this IRuleBuilder ruleBuilder) + { + return ruleBuilder.SetValidator(new IPAddressValidator()); + } + public static IRuleBuilderOptions NetworkPort(this IRuleBuilder ruleBuilder) + { + return ruleBuilder.SetValidator(new NetworkPortValidator()); + } +} diff --git a/LuYao.Toolkit.Core/Validators/IPAddressValidator.cs b/LuYao.Toolkit.Core/Validators/IPAddressValidator.cs new file mode 100644 index 0000000..01199c4 --- /dev/null +++ b/LuYao.Toolkit.Core/Validators/IPAddressValidator.cs @@ -0,0 +1,17 @@ +using FluentValidation; +using FluentValidation.Validators; +using System.Net; + +namespace LuYao.Toolkit.Validators; + +public class IPAddressValidator : PropertyValidator +{ + public override string Name => "IPAddressValidator"; + + public override bool IsValid(ValidationContext context, string value) + { + if (value == null) return true; + if (IPAddress.TryParse(value, out IPAddress ipAddress)) return true; + return false; + } +} diff --git a/LuYao.Toolkit.Core/Validators/NetworkPortValidator.cs b/LuYao.Toolkit.Core/Validators/NetworkPortValidator.cs new file mode 100644 index 0000000..3417bf9 --- /dev/null +++ b/LuYao.Toolkit.Core/Validators/NetworkPortValidator.cs @@ -0,0 +1,22 @@ +using FluentValidation; +using FluentValidation.Validators; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Validators; + +public class NetworkPortValidator : PropertyValidator +{ + public override string Name => "NetworkPortValidator"; + + public override bool IsValid(ValidationContext context, string value) + { + if (value == null) return true; + if (int.TryParse(value, out var port) == false) return false; + if (port < 1 || port > 65535) return false; + return true; + } +} diff --git a/LuYao.Toolkit.Core/Views/ViewNameAttribute.cs b/LuYao.Toolkit.Core/Views/ViewNameAttribute.cs new file mode 100644 index 0000000..932edb2 --- /dev/null +++ b/LuYao.Toolkit.Core/Views/ViewNameAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace LuYao.Toolkit.Views; + +[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] +public class ViewNameAttribute : Attribute +{ + public string Name { get; } + + public ViewNameAttribute(string name) + { + Name = name; + } +} diff --git a/LuYao.Toolkit.Core/Views/ViewNames.cs b/LuYao.Toolkit.Core/Views/ViewNames.cs new file mode 100644 index 0000000..50ec7fa --- /dev/null +++ b/LuYao.Toolkit.Core/Views/ViewNames.cs @@ -0,0 +1,113 @@ +namespace LuYao.Toolkit.Views; + +public static class ViewNames +{ + public static class Tabs + { + public static class Session + { + public const string Index = $"{nameof(Tabs)}.{nameof(Session)}.{nameof(Index)}"; + } + public static class Explorer + { + public const string Index = $"{nameof(Tabs)}.{nameof(Explorer)}.{nameof(Index)}"; + } + public static class Rdp + { + public const string Index = $"{nameof(Tabs)}.{nameof(Rdp)}.{nameof(Index)}"; + } + public static class Docs + { + public const string Index = $"{nameof(Tabs)}.{nameof(Docs)}.{nameof(Index)}"; + } + public static class Navs + { + public const string Index = $"{nameof(Tabs)}.{nameof(Navs)}.{nameof(Index)}"; + } + } + public static class Channels + { + public static class Gens + { + public const string GenGuid = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenGuid)}"; + public const string GenPassword = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenPassword)}"; + public const string GenAesKey = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenAesKey)}"; + public const string GenRsaKey = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenRsaKey)}"; + public const string GenXCodeEntity = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenXCodeEntity)}"; + public const string GenLinesByRange = $"{nameof(Channels)}.{nameof(Gens)}.{nameof(GenLinesByRange)}"; + } + public static class Networks + { + public const string IPLookup = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(IPLookup)}"; + public const string Ping = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(Ping)}"; + public const string Whois = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(Whois)}"; + public const string UserAgentParser = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(UserAgentParser)}"; + public const string UrlAnalyzer = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(UrlAnalyzer)}"; + public const string RemoteDesktopManager = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(RemoteDesktopManager)}"; + public const string TrafficMonitor = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(TrafficMonitor)}"; + public const string HttpProxyChecker = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(HttpProxyChecker)}"; + public static class PortProxy + { + public const string Index = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(PortProxy)}.{nameof(Index)}"; + public const string Detail = $"{nameof(Channels)}.{nameof(Networks)}.{nameof(PortProxy)}.{nameof(Detail)}"; + } + } + public static class Converters + { + public const string UnixTimestamp = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(UnixTimestamp)}"; + public const string RsaKeyConvert = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(RsaKeyConvert)}"; + public const string IndentJson = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(IndentJson)}"; + public const string IndentXml = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(IndentXml)}"; + public const string HexConvert = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(HexConvert)}"; + public const string TranslateXmlByXsl = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(TranslateXmlByXsl)}"; + public const string TranslateJsonByJs = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(TranslateJsonByJs)}"; + public const string TranslateJsonByLiquid = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(TranslateJsonByLiquid)}"; + public const string ColorConverter = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(ColorConverter)}"; + public const string JsonToCSharp = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(JsonToCSharp)}"; + public const string JsonToCsv = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(JsonToCsv)}"; + public const string PostmanConverter = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(PostmanConverter)}"; + public const string YamlToJson = $"{nameof(Channels)}.{nameof(Converters)}.{nameof(YamlToJson)}"; + } + public static class Texts + { + public const string GoogleTranslate = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(GoogleTranslate)}"; + public const string TextJoin = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(TextJoin)}"; + public const string LogReader = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(LogReader)}"; + public const string FullHalfConvert = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(FullHalfConvert)}"; + public const string CsvReader = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(CsvReader)}"; + public const string RegexEvaluator = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(RegexEvaluator)}"; + public const string YoudaoDictionary = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(YoudaoDictionary)}"; + public const string HashCalculator = $"{nameof(Channels)}.{nameof(Texts)}.{nameof(HashCalculator)}"; + } + public static class Encodings + { + public const string StringZipper = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(StringZipper)}"; + public const string UrlEncode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(UrlEncode)}"; + public const string HtmlEncode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(HtmlEncode)}"; + public const string Ascii85Encode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(Ascii85Encode)}"; + public const string Base64Encode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(Base64Encode)}"; + public const string Base62Encode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(Base62Encode)}"; + public const string Base16Encode = $"{nameof(Channels)}.{nameof(Encodings)}.{nameof(Base16Encode)}"; + } + public static class Files + { + public const string DetectFileEncodeing = $"{nameof(Channels)}.{nameof(Files)}.{nameof(DetectFileEncodeing)}"; + public const string HashFile = $"{nameof(Channels)}.{nameof(Files)}.{nameof(HashFile)}"; + } + public static class Images + { + public const string ImageToIcon = $"{nameof(Channels)}.{nameof(Images)}.{nameof(ImageToIcon)}"; + public const string GifSplitter = $"{nameof(Channels)}.{nameof(Images)}.{nameof(GifSplitter)}"; + public const string ImageToBase64 = $"{nameof(Channels)}.{nameof(Images)}.{nameof(ImageToBase64)}"; + public const string Base64ToImage = $"{nameof(Channels)}.{nameof(Images)}.{nameof(Base64ToImage)}"; + } + public static class CrossBorder + { + public const string MercadoToWorldFirst = $"{nameof(Channels)}.{nameof(CrossBorder)}.{nameof(MercadoToWorldFirst)}"; + } + public static class Other + { + public const string SystemToolkit = $"{nameof(Channels)}.{nameof(Other)}.{nameof(SystemToolkit)}"; + } + } +} diff --git a/LuYao.Toolkit.Extensions/LuYao.Toolkit.Extensions.csproj b/LuYao.Toolkit.Extensions/LuYao.Toolkit.Extensions.csproj new file mode 100644 index 0000000..ee52ec3 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao.Toolkit.Extensions.csproj @@ -0,0 +1,20 @@ + + + + + net7.0 + + latest + + + + + + + + + ..\libs\LuYao.Common.dll + + + + diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdRunner.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdRunner.cs new file mode 100644 index 0000000..770d88f --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdRunner.cs @@ -0,0 +1,42 @@ +using NewLife; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace LuYao.Toolkit.PortProxy; + +public static class CmdRunner +{ + public static string Execute(string cmd) + { + var proc = Process.Start(new ProcessStartInfo + { + FileName = "cmd", + UseShellExecute = false, + RedirectStandardInput = true, + RedirectStandardOutput = true, + CreateNoWindow = true, + }); + proc.Start(); + + proc.StandardInput.WriteLine($"{cmd} & exit"); + var output = proc.StandardOutput.ReadToEnd(); + + return output; + } + + public static void Run(List cmd) + { + if (cmd == null || cmd.Count <= 0) return; + var proc = Process.Start(new ProcessStartInfo + { + FileName = "cmd.exe", + Arguments = $"/C {cmd.Join("&")}", + UseShellExecute = true, + CreateNoWindow = false, + WindowStyle = ProcessWindowStyle.Normal, + Verb = "runas", + }); + if (proc != null) proc.WaitForExit(); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdUtil.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdUtil.cs new file mode 100644 index 0000000..da367e7 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/CmdUtil.cs @@ -0,0 +1,83 @@ +using LuYao.Toolkit.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace LuYao.Toolkit.PortProxy; + +public static class CmdUtil +{ + private static Regex GetRegex(string fromType, string toType) + { + return new Regex($@"{fromType}[^:]*:[^\n]+?{toType}[^:]*:\r\n\r\n.+?\r\n--------------- ---------- --------------- ----------\r\n(.+?)\r\n\r\n", RegexOptions.Singleline); + } + + private static readonly Dictionary RegexList = new Dictionary() + { + ["ipv4 to ipv4"] = GetRegex("ipv4", "ipv4"), + ["ipv4 to ipv6"] = GetRegex("ipv4", "ipv6"), + ["ipv6 to ipv4"] = GetRegex("ipv6", "ipv4"), + ["ipv6 to ipv6"] = GetRegex("ipv6", "ipv6"), + }; + + private static readonly Regex LineRegex = new(@"^(.*?)\s{1,}(.*?)\s{1,}(.*?)\s{1,}(.*?)$"); + + public static PortProxyRule[] GetProxies() + { + var output = CmdRunner.Execute("netsh interface portproxy show all"); + var types = new[] + { + new ProxyType("ipv4", "ipv4"), + new ProxyType("ipv4", "ipv6"), + new ProxyType("ipv6", "ipv4"), + new ProxyType("ipv6", "ipv6"), + }; + + var list = new List(); + foreach (var type in types) + { + var regex = RegexList[$"{type.From} to {type.To}"]; + var settings = output.ExtractFirst(regex); + var lines = settings?.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + + if (lines is not null) + { + foreach (var line in lines) + { + if (line.TryResolve(LineRegex, out var parts)) + { + var realListenPort = parts[2].First(); + var realConnectPort = parts[4].First(); + + _ = int.TryParse(realListenPort, out var listenPort); + _ = int.TryParse(realConnectPort, out var connectPort); + + list.Add(new PortProxyRule + { + Type = type.Type, + ListenOn = parts[1].First(), + ListenPort = listenPort.ToString(), + ConnectTo = parts[3].First(), + ConnectPort = connectPort.ToString(), + }); + } + } + } + } + + return list.ToArray(); + } + + public static string GenAddOrUpdateProxyCommand(PortProxyRule rule) + { + return $"netsh interface portproxy add {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort} connectaddress={rule.ConnectTo} connectport={rule.ConnectPort}"; + //CmdRunner.Run($"netsh interface portproxy add {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort} connectaddress={rule.ConnectTo} connectport={rule.ConnectPort}"); + } + + public static string GenDeleteProxyCommand(PortProxyRule rule) + { + //CmdRunner.Run($"netsh interface portproxy delete {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort}"); + return $"netsh interface portproxy delete {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort}"; + } +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/ProxyType.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/ProxyType.cs new file mode 100644 index 0000000..52e048d --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/PortProxy/ProxyType.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.PortProxy; + +public class ProxyType +{ + public ProxyType(string from, string to) + { + From = from; + To = to; + } + + public string From { get; set; } + public string To { get; set; } + public string Type + { + get + { + if (From == "ipv4" && To == "ipv4") return "v4tov4"; + if (From == "ipv4" && To == "ipv6") return "v4tov6"; + if (From == "ipv6" && To == "ipv4") return "v6tov4"; + if (From == "ipv6" && To == "ipv6") return "v6tov6"; + throw new NotSupportedException(); + } + } + +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AudioRedirection.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AudioRedirection.cs new file mode 100644 index 0000000..7d25597 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AudioRedirection.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public enum AudioRedirection +{ + [Description("在此计算机上播放")] + PlayOnClient, + [Description("在远程计算机上播放")] + PlayOnRemote, + [Description("不要播放")] + PlayNoSound +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AuthenticationLevel.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AuthenticationLevel.cs new file mode 100644 index 0000000..50b88e5 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/AuthenticationLevel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public enum AuthenticationLevel +{ + [Description("链接并且不显示警告")] + Connect, + [Description("不链接")] + DoNotConnect, + [Description("显示警告")] + WarnMe +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/ColorDepth.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/ColorDepth.cs new file mode 100644 index 0000000..5aa52c5 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/ColorDepth.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public enum ColorDepth +{ + [Description("256色")] + Depth8Bit = 8, + [Description("增强色(15位)")] + Depth15Bit = 0xF, + [Description("增强色(16位)")] + Depth16Bit = 0x10, + [Description("真彩色(24位)")] + Depth24Bit = 24, + [Description("最高质量(32位)")] + Depth32Bit = 0x20 +} + diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/DesktopSize.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/DesktopSize.cs new file mode 100644 index 0000000..871cea6 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/DesktopSize.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public enum DesktopSize +{ + [Description("640 x 480")] + X640Y480, + [Description("800 x 600")] + X800Y600, + [Description("1024 x 768")] + X1024Y768, + [Description("1280 x 1024")] + X1280Y1024, + [Description("自定义")] + Custom +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AddRdpConnectionEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AddRdpConnectionEvent.cs new file mode 100644 index 0000000..b3d0609 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AddRdpConnectionEvent.cs @@ -0,0 +1,4 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Rdm.Events; +public class AddRdpConnectionEvent : PubSubEvent { } diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AfterRdmSettingEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AfterRdmSettingEvent.cs new file mode 100644 index 0000000..435635b --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/AfterRdmSettingEvent.cs @@ -0,0 +1,5 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Rdm.Events; + +public class AfterRdmSettingEvent : PubSubEvent { } diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEvent.cs new file mode 100644 index 0000000..9fcb6cf --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEvent.cs @@ -0,0 +1,5 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Rdm.Events; + +public class EditRdpConnectionEvent : PubSubEvent { } diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEventPayload.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEventPayload.cs new file mode 100644 index 0000000..20e02f1 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/EditRdpConnectionEventPayload.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Rdm.Events; + +public class EditRdpConnectionEventPayload +{ + public EditRdpConnectionEventPayload(Guid id) + { + this.Id = id; + } + public Guid Id { get; } +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdmSettingEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdmSettingEvent.cs new file mode 100644 index 0000000..ec29d92 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdmSettingEvent.cs @@ -0,0 +1,8 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Rdm.Events; + +public class OpenRdmSettingEvent : PubSubEvent { } diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEvent.cs new file mode 100644 index 0000000..04d9a06 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEvent.cs @@ -0,0 +1,12 @@ +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm.Events; + +public class OpenRdpConnectionEvent : PubSubEvent +{ +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEventPayload.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEventPayload.cs new file mode 100644 index 0000000..034da63 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/OpenRdpConnectionEventPayload.cs @@ -0,0 +1,9 @@ +using System; + +namespace LuYao.Toolkit.Rdm.Events; + +public class OpenRdpConnectionEventPayload +{ + public OpenRdpConnectionEventPayload(Guid id) => this.Id = id; + public Guid Id { get; } +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/RdpConnectionChangedEvent.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/RdpConnectionChangedEvent.cs new file mode 100644 index 0000000..e894805 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/Events/RdpConnectionChangedEvent.cs @@ -0,0 +1,5 @@ +using Prism.Events; + +namespace LuYao.Toolkit.Rdm.Events; + +public class RdpConnectionChangedEvent : PubSubEvent { } diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/IRdpConnection.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/IRdpConnection.cs new file mode 100644 index 0000000..904443b --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/IRdpConnection.cs @@ -0,0 +1,41 @@ +using System; + +namespace LuYao.Toolkit.Rdm; + +public interface IRdpConnection +{ + string Name { get; } + //常规 + String Host { get; } + Int32 Port { get; } + String Domain { get; } + String Username { get; } + String Password { get; } + Boolean ConnectToConsole { get; } + + //显示 + Int32 DisplayWidth { get; } + Int32 DisplayHeight { get; } + Boolean AutoExpand { get; } + Boolean SmartSizing { get; } + ColorDepth ColorDepth { get; } + + //本地资源 + AudioRedirection AudioSetting { get; } + KeyboardRedirection KeyboardSetting { get; } + Boolean RedirectDisks { get; } + Boolean RedirectPorts { get; } + Boolean RedirectPrinters { get; } + Boolean RedirectSmartCards { get; } + + //体验 + Boolean BitmapCaching { get; } + Boolean AllowWallpaper { get; } + Boolean AllowThemes { get; } + Boolean AllowContents { get; } + Boolean AllowAnimation { get; } + + //高级 + AuthenticationLevel AuthenticationLevel { get; } + Boolean EnableCredSspSupport { get; } +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/KeyboardRedirection.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/KeyboardRedirection.cs new file mode 100644 index 0000000..5550af5 --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/KeyboardRedirection.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public enum KeyboardRedirection +{ + [Description("在这台计算机上")] + OnLocal, + [Description("在远程计算机上")] + OnRemote +} diff --git a/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/RdpConnectionValidator.cs b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/RdpConnectionValidator.cs new file mode 100644 index 0000000..e83d79a --- /dev/null +++ b/LuYao.Toolkit.Extensions/LuYao/Toolkit/Rdm/RdpConnectionValidator.cs @@ -0,0 +1,19 @@ +using FluentValidation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public class RdpConnectionValidator : AbstractValidator +{ + public static RdpConnectionValidator Instance { get; } = new RdpConnectionValidator(); + public RdpConnectionValidator() + { + RuleFor(i => i.Name).NotEmpty().WithName("连接名称"); + RuleFor(i => i.Host).NotEmpty().WithName("主机"); + RuleFor(i => i.Port).GreaterThan(0).LessThan(65535).WithName("端口"); + } +} diff --git a/LuYao.Toolkit.Extensions/Newtonsoft/Json/Linq/JsonFlattenExtensions.cs b/LuYao.Toolkit.Extensions/Newtonsoft/Json/Linq/JsonFlattenExtensions.cs new file mode 100644 index 0000000..c17fa46 --- /dev/null +++ b/LuYao.Toolkit.Extensions/Newtonsoft/Json/Linq/JsonFlattenExtensions.cs @@ -0,0 +1,185 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace Toolkit.Newtonsoft.Json.Linq; + +public static class JsonFlattenExtensions +{ + /// + /// Flattens a JObject to a Dictionary.null, "", [] and {} are preserved by default + /// + /// JObject to flatten + /// Set to false to ignore JSON properties that are null, "", [] and {} when flattening + public static IDictionary Flatten(this JObject jsonObject, bool includeNullAndEmptyValues = true) + { + return jsonObject + .Descendants() + .Where(p => !p.Any()) + .Aggregate(new Dictionary(), (properties, jToken) => + { + var value = (jToken as JValue)?.Value; + + if (!includeNullAndEmptyValues) + { + if (value?.Equals("") == false) + { + properties.Add(jToken.Path, value); + } + + return properties; + } + + var strVal = jToken.Value()?.ToString().Trim(); + if (strVal?.Equals("[]") == true) + { + value = Enumerable.Empty(); + } + else if (strVal?.Equals("{}") == true) + { + value = new object(); + } + + properties.Add(jToken.Path, value); + + return properties; + }); + } + + /// + /// Unflattens an already flattened JSON Dictionary to its original JSON structure + /// + /// Dictionary to unflatten + public static JObject Unflatten(this IDictionary flattenedJsonKeyValues) + { + JContainer result = null; + var setting = new JsonMergeSettings + { + MergeArrayHandling = MergeArrayHandling.Merge + }; + + foreach (var pathValue in flattenedJsonKeyValues) + { + if (result == null) + { + result = UnflattenSingle(pathValue); + } + else + { + result.Merge(UnflattenSingle(pathValue), setting); + } + } + return result as JObject; + } + + /// + /// Get an item from the dictionary and cast it to a type. + /// + /// + /// + /// + /// + public static T Get(this IDictionary dictionary, string key) => (T)dictionary[key]; + + /// + /// Update an item in the dictionary + /// + /// + /// + /// + public static void Set(this IDictionary dictionary, string key, object value) => dictionary[key] = value; + + /// + /// Try get an item from the dictionary and cast it to a type. + /// + /// + /// + /// + /// + /// + public static bool TryGet(this IDictionary dictionary, string key, out T value) + { + object result; + if (dictionary.TryGetValue(key, out result) && result is T) + { + value = (T)result; + return true; + } + value = default(T); + return false; + } + + private static JContainer UnflattenSingle(KeyValuePair keyValue) + { + var path = keyValue.Key; + var value = keyValue.Value != null ? JToken.FromObject(keyValue.Value) : null; + var pathSegments = SplitPath(path); + + JContainer lastItem = null; + //build from leaf to root + foreach (var pathSegment in pathSegments.Reverse()) + { + if (!IsJsonArray(pathSegment)) + { + var obj = new JObject(); + if (lastItem == null) + { + obj.Add(pathSegment, value); + } + else + { + obj.Add(pathSegment, lastItem); + } + lastItem = obj; + + continue; + } + + var array = new JArray(); + var index = GetArrayIndex(pathSegment); + array = FillEmpty(array, index); + array[index] = lastItem ?? value; + lastItem = array; + + } + return lastItem; + } + + private static IList SplitPath(string path) + { + var reg = path.IndexOf("['", StringComparison.Ordinal) > -1 + ? new Regex(@"(?!\.)([^\'\[\]]+)|(?!\[)(\d+)(?=\])") + : new Regex(@"(?!\.)([^. ^\[\]]+)|(?!\[)(\d+)(?=\])"); + + var result = new List(); + + foreach (Match match in reg.Matches(path)) + { + result.Add(match.Value); + } + + return result; + } + + private static JArray FillEmpty(JArray array, int index) + { + for (var i = 0; i <= index; i++) + { + array.Add(null); + } + return array; + } + + private static bool IsJsonArray(string pathSegment) => int.TryParse(pathSegment, out var x); + + private static int GetArrayIndex(string pathSegment) + { + if (int.TryParse(pathSegment, out var result)) + { + return result; + } + throw new Exception($"Unable to parse array index: {pathSegment}"); + } +} diff --git a/LuYao.Toolkit.Extensions/Youdao/YoudaoDictionary.cs b/LuYao.Toolkit.Extensions/Youdao/YoudaoDictionary.cs new file mode 100644 index 0000000..f06ba27 --- /dev/null +++ b/LuYao.Toolkit.Extensions/Youdao/YoudaoDictionary.cs @@ -0,0 +1,98 @@ +using HtmlAgilityPack; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Xml.Linq; +using System.Xml.XPath; + +namespace Youdao; + +public static class YoudaoDictionary +{ + public static async Task> SuggestAsync(HttpClient http, string input) + { + if (string.IsNullOrWhiteSpace(input)) throw new ArgumentNullException(nameof(input)); + var url = $"https://dict.youdao.com/suggest?type=DESKDICT&num=4&ver=2.0&le=eng&q={HttpUtility.UrlEncode(input)}"; + using (var response = await http.GetAsync(url)) + { + response.EnsureSuccessStatusCode(); + var xml = await response.ReadAsHtmlAsync(); + var ret = new List(); + var doc = XDocument.Parse(xml); + foreach (var node in doc.XPathSelectElements("//item")) + { + var title = node.Element("title"); + var explain = node.Element("explain"); + var result_num = node.Element("result_num"); + if (title == null || explain == null) continue; + var item = new YouDaoSuggestItem + { + Title = title.Value, + Explain = explain.Value, + }; + if (result_num != null && Int32.TryParse(result_num.Value, out var num)) + { + item.ResultNum = num; + } + ret.Add(item); + } + return ret; + } + } + public static async Task QueryAsync(HttpClient http, string input) + { + if (string.IsNullOrWhiteSpace(input)) throw new ArgumentNullException(nameof(input)); + var url = $"https://m.youdao.com/dict?le=eng&q={HttpUtility.UrlEncode(input.Trim())}"; + using (var response = await http.GetAsync(url)) + { + response.EnsureSuccessStatusCode(); + var html = await response.ReadAsHtmlAsync(); + var doc = new HtmlDocument(); + doc.LoadHtml(html); + var empty = doc.DocumentNode.SelectSingleNode("//p[@class=\"empty-content\"]"); + if (empty != null) throw new Exception(HtmlEntity.DeEntitize(empty.InnerText).Trim()); + var ret = new YoudaoWord(input.Trim()); + + var phonetics = doc.DocumentNode.SelectNodes("//*[@class=\"phonetic\"]"); + if (phonetics != null) + { + foreach (var text in phonetics) + { + var o = text.ParentNode; + var type = (o.SelectSingleNode("text()")?.InnerText ?? string.Empty).Trim(); + var source = text.ParentNode.SelectSingleNode("a"); + if (!string.IsNullOrWhiteSpace(type) && source != null) + { + ret.Phonetic.Add(new YoudaoPhonetic + { + Type = type, + Text = text.InnerText.Trim(), + Source = source.GetAttributeValue("data-rel", string.Empty) + }); + } + } + } + var items = doc.DocumentNode.SelectNodes("//*[@id=\"ec\"]/ul/li"); + if (items != null) + { + foreach (var item in items) + { + ret.Paraphrase.Add(HtmlEntity.DeEntitize(item.InnerText).Trim()); + } + } + var subs = doc.DocumentNode.SelectNodes("//div[@class=\"sub\"]/p"); + if (subs != null) + { + foreach (var sub in subs) + { + ret.Variant.Add(HtmlEntity.DeEntitize(sub.InnerText).Trim()); + } + } + if (ret.IsEmpty) throw new Exception("查询结果为空"); + return ret; + } + } +} diff --git a/LuYao.Toolkit.Extensions/Youdao/YoudaoPhonetic.cs b/LuYao.Toolkit.Extensions/Youdao/YoudaoPhonetic.cs new file mode 100644 index 0000000..09ec86a --- /dev/null +++ b/LuYao.Toolkit.Extensions/Youdao/YoudaoPhonetic.cs @@ -0,0 +1,8 @@ +namespace Youdao; + +public class YoudaoPhonetic +{ + public string Type { get; set; } + public string Text { get; set; } + public string Source { get; set; } +} \ No newline at end of file diff --git a/LuYao.Toolkit.Extensions/Youdao/YoudaoSuggestItem.cs b/LuYao.Toolkit.Extensions/Youdao/YoudaoSuggestItem.cs new file mode 100644 index 0000000..b7f4520 --- /dev/null +++ b/LuYao.Toolkit.Extensions/Youdao/YoudaoSuggestItem.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Youdao; + +public class YouDaoSuggestItem +{ + public string Title { get; set; } + public string Explain { get; set; } + public int ResultNum { get; set; } + public override string ToString() => this.Title; +} \ No newline at end of file diff --git a/LuYao.Toolkit.Extensions/Youdao/YoudaoWord.cs b/LuYao.Toolkit.Extensions/Youdao/YoudaoWord.cs new file mode 100644 index 0000000..e3830dd --- /dev/null +++ b/LuYao.Toolkit.Extensions/Youdao/YoudaoWord.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Youdao; +public class YoudaoWord +{ + public YoudaoWord(string word) + { + Word = string.IsNullOrWhiteSpace(word) ? throw new ArgumentNullException(nameof(word)) : word; + } + public bool IsEmpty => Paraphrase.Count == 0; + public string Word { get; } + public List Paraphrase { get; } = new List(); + public List Variant { get; } = new List(); + public List Phonetic { get; } = new List(); +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/ColorConverterViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/ColorConverterViewModel.cs new file mode 100644 index 0000000..236a109 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/ColorConverterViewModel.cs @@ -0,0 +1,104 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text.RegularExpressions; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class ColorConverterViewModel : ViewModelBase +{ + private static readonly ColorConverter converter = new ColorConverter(); + private static Regex RgbColorRegex = new Regex("RGB\\((?[\\d\\s]+),(?[\\d\\s]+),(?[\\d\\s]+)\\)", RegexOptions.IgnoreCase); + private static Regex ArgbColorRegex = new Regex("ARGB\\((?[\\d\\s]+),(?[\\d\\s]+),(?[\\d\\s]+),(?[\\d\\s]+)\\)", RegexOptions.IgnoreCase); + + [INotifyPropertyChanged] + public partial class CodeItem + { + public CodeItem(string title, Func format) + { + this.Title = title; + this._format = format; + } + private Func _format; + public string Title { get; } + [ObservableProperty] + private string _code; + public void Read(Color color) => this.Code = _format(color); + [RelayCommand] + public void Copy() => Services.ClipboardService.CopyText(this.Code); + } + + public ColorConverterViewModel() + { + Items = new List() + { + new CodeItem("HEX",c=> "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2")), + new CodeItem("RGB",c=>$"{c.R},{c.G},{c.B}"), + new CodeItem("ARGB",c=>$"{c.A},{c.R},{c.G},{c.B}"), + new CodeItem("CSS RGB",c=>$"rgb({c.R},{c.G},{c.B})"), + new CodeItem("CSS ARGB",c=>$"argb({c.A},{c.R},{c.G},{c.B})"), + new CodeItem("C# RGB",c=>$"Color.FromRgb({c.R},{c.G},{c.B});"), + new CodeItem("C# ARGB",c=>$"Color.FromArgb({c.A},{c.R},{c.G},{c.B});"), + new CodeItem("C# Brush RGB",c=>$"new SolidColorBrush(Color.FromRgb({c.R},{c.G},{c.B}));"), + new CodeItem("C# Brush ARGB",c=>$"new SolidColorBrush(Color.FromArgb({c.A},{c.R},{c.G},{c.B}));"), + }; + if (!string.IsNullOrWhiteSpace(Input)) this.OnInputChanged(this.Input); + } + + [ViewStates.WatchViewState(nameof(Input))] + [ObservableProperty] + private string _input; + [ObservableProperty] + private string _fail; + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(Hex))] + private Color _color; + [ObservableProperty] + private bool _done = false; + public string Hex => GetHex(); + private string GetHex() + { + if (_color.IsEmpty) return "Transparent"; + var c = _color; + return "#" + c.A.ToString("X2") + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2"); + } + + public IReadOnlyCollection Items { get; } + + partial void OnInputChanged(string value) + { + this.Done = false; + this.Fail = String.Empty; + this.Color = Color.Empty; + try + { + if (!string.IsNullOrWhiteSpace(value)) + { + value = value.Trim(); + if (RgbColorRegex.IsMatch(value)) + { + value = RgbColorRegex.Replace(value, "$1,$2,$3"); + } + else if (ArgbColorRegex.IsMatch(value)) + { + value = ArgbColorRegex.Replace(value, "$1,$2,$3,$4"); + } + else if (value.Contains(" ")) + { + value = value.Replace(" ", ","); + } + var ret = converter.ConvertFromString(value); + if (ret == null) throw new Exception(); + this.Color = (Color)ret; + this.Done = true; + foreach (var item in this.Items) item.Read(this.Color); + } + } + catch (Exception) + { + this.Fail = "请输入 16 进制或 RGB 颜色值"; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/HexConvertViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/HexConvertViewModel.cs new file mode 100644 index 0000000..3675323 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/HexConvertViewModel.cs @@ -0,0 +1,71 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Converts; + +public enum HexConvertBaseType { [Description("二进制")] X2 = 2, [Description("八进制")] X8 = 8, [Description("十进制")] X10 = 10, [Description("十六进制")] X16 = 16 } + +public partial class HexConvertViewModel : ViewModelBase +{ + [INotifyPropertyChanged] + public partial class Item + { + public Item(HexConvertBaseType type) => this.Type = type; + public HexConvertBaseType Type { get; } + [ObservableProperty] + private string output; + [RelayCommand] + private void Copy() + { + Services.ClipboardService.CopyText(this.Output); + } + public void Read(string input, HexConvertBaseType from) + { + if (string.IsNullOrWhiteSpace(input)) + { + this.Output = string.Empty; + return; + } + try + { + var i = System.Convert.ToInt64(input, (int)from); + this.Output = System.Convert.ToString(i, (int)this.Type); + } + catch (Exception) + { + this.Output = "NaN"; + } + } + } + [ObservableProperty] + private string input; + [ObservableProperty] + private HexConvertBaseType type = HexConvertBaseType.X10; + public IReadOnlyList Items { get; } = new List + { + new Item(HexConvertBaseType.X2), + new Item(HexConvertBaseType.X8), + new Item(HexConvertBaseType.X10), + new Item(HexConvertBaseType.X16), + }; + + partial void OnInputChanged(string value) => Convert(); + partial void OnTypeChanged(HexConvertBaseType value) => Convert(); + + private void Convert() + { + var str = this.Input; + var from = this.Type; + foreach (var item in this.Items) + { + item.Read(str, from); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/IndentJsonViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/IndentJsonViewModel.cs new file mode 100644 index 0000000..277a469 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/IndentJsonViewModel.cs @@ -0,0 +1,138 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using CommunityToolkit.Mvvm.Input; +using System.IO; +using System.Text; +using System; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class IndentJsonViewModel : ViewModelBase, IFileDragDropTarget +{ + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(SaveCommand))] + private string _content; + + [ObservableProperty] + private string _fileName; + + [RelayCommand] + private void Beautify() + { + if (string.IsNullOrWhiteSpace(Content)) return; + try + { + var str = this.Content; + str = StringZipper.Unzip(str); + var sb = new StringBuilder(); + using (var sr = new StringReader(str)) + using (var sw = new StringWriter(sb)) + { + JsonReader r = new JsonTextReader(sr); + JsonWriter w = new JsonTextWriter(sw) { Formatting = Formatting.Indented }; + while (r.Read()) w.WriteToken(r); + } + this.Content = sb.ToString(); + } + catch (System.Exception e) + { + Services.NotifyService.Warning(e); + } + } + + [RelayCommand] + private void Uglify() + { + try + { + if (string.IsNullOrWhiteSpace(Content)) return; + var str = this.Content; + str = StringZipper.Unzip(str); + var sb = new StringBuilder(); + using (var sr = new StringReader(str)) + using (var sw = new StringWriter(sb)) + { + JsonReader r = new JsonTextReader(sr); + JsonWriter w = new JsonTextWriter(sw) { Formatting = Formatting.None }; + while (r.Read()) w.WriteToken(r); + } + this.Content = sb.ToString(); + } + catch (System.Exception e) + { + Services.NotifyService.Warning(e); + } + } + + [RelayCommand] + private void Copy() + { + if (string.IsNullOrWhiteSpace(Content)) return; + Services.ClipboardService.CopyText(Content); + } + + [RelayCommand] + private void Paste() + { + var text = Services.ClipboardService.GetText(); + if (string.IsNullOrWhiteSpace(text)) return; + Content = text; + } + + [RelayCommand] + private void Escape() + { + if (string.IsNullOrWhiteSpace(this.Content)) return; + this.Content = this.Content.Replace("\\", "\\\\").Replace("\"", "\\\""); + } + + [RelayCommand] + private void Unescape() + { + if (string.IsNullOrWhiteSpace(this.Content)) return; + this.Content = this.Content.Replace("\\\\", "\\").Replace("\\\"", "\""); + } + + [RelayCommand] + private void Clear() + { + this.Content = string.Empty; + } + private bool CanSave() => !string.IsNullOrWhiteSpace(this.Content); + + [RelayCommand(CanExecute = nameof(CanSave))] + private void Save() + { + if (string.IsNullOrWhiteSpace(this.Content)) return; + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.FileName = this.FileName; + dialog.Title = "保存 JSON 文件"; + dialog.Filter = "JSON|*.json|所有文件|*.*"; + if (!string.IsNullOrWhiteSpace(dialog.FileName)) + { + dialog.InitialDirectory = Path.GetDirectoryName(dialog.FileName); + } + else + { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + if (dialog.ShowDialog()) + { + File.WriteAllText(dialog.FileName, this.Content, Encoding.UTF8); + Services.NotifyService.Success("保存成功"); + } + } + public void OnFilesDropped(string group, string[] filepaths) + { + if (group == "Json") + { + if (filepaths == null || filepaths.Length == 0) return; + var fn = filepaths[0]; + var encoding = Services.FileService.GetEncoding(fn); + if (encoding == null) throw new System.Exception("编码识别失败,可能不是文本文件。"); + this.Content = File.ReadAllText(fn, encoding); + this.FileName = fn; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/IndentXmlViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/IndentXmlViewModel.cs new file mode 100644 index 0000000..079ca09 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/IndentXmlViewModel.cs @@ -0,0 +1,121 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.IO; +using System.Text; +using System.Xml; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class IndentXmlViewModel : ViewModelBase, IFileDragDropTarget +{ + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(SaveCommand))] + private string _content; + + [ObservableProperty] + private string _fileName; + + [RelayCommand] + private void Beautify() + { + if (string.IsNullOrWhiteSpace(Content)) return; + try + { + var str = this.Content; + str = StringZipper.Unzip(str); + XmlDocument doc = new XmlDocument(); + doc.LoadXml(str); + var sb = new StringBuilder(); + using (var w = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, IndentChars = "\t" })) + { + doc.Save(w); + } + this.Content = sb.ToString(); + } + catch (System.Exception e) + { + Services.NotifyService.Warning(e); + } + } + [RelayCommand] + private void Uglify() + { + if (string.IsNullOrWhiteSpace(Content)) return; + try + { + var str = this.Content; + str = StringZipper.Unzip(str); + XmlDocument doc = new XmlDocument(); + doc.LoadXml(str); + var sb = new StringBuilder(); + using (var w = XmlWriter.Create(sb, new XmlWriterSettings { Indent = false, IndentChars = "\t" })) + { + doc.Save(w); + } + this.Content = sb.ToString(); + } + catch (System.Exception e) + { + Services.NotifyService.Warning(e); + } + } + + [RelayCommand] + private void Copy() + { + if (string.IsNullOrWhiteSpace(Content)) return; + Services.ClipboardService.CopyText(Content); + } + + [RelayCommand] + private void Paste() + { + var text = Services.ClipboardService.GetText(); + if (string.IsNullOrWhiteSpace(text)) return; + Content = text; + } + + [RelayCommand] + private void Clear() + { + this.Content = string.Empty; + } + + private bool CanSave() => !string.IsNullOrWhiteSpace(this.Content); + + [RelayCommand(CanExecute = nameof(CanSave))] + private void Save() + { + if (string.IsNullOrWhiteSpace(this.Content)) return; + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.FileName = this.FileName; + dialog.Title = "保存 XML 文件"; + dialog.Filter = "XML|*.xml|所有文件|*.*"; + if (!string.IsNullOrWhiteSpace(dialog.FileName)) + { + dialog.InitialDirectory = Path.GetDirectoryName(dialog.FileName); + } + else + { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + if (dialog.ShowDialog()) + { + File.WriteAllText(dialog.FileName, this.Content, Encoding.UTF8); + Services.NotifyService.Success("保存成功"); + } + } + public void OnFilesDropped(string group, string[] filepaths) + { + if (group == "XML") + { + if (filepaths == null || filepaths.Length == 0) return; + var fn = filepaths[0]; + var encoding = Services.FileService.GetEncoding(fn); + if (encoding == null) throw new System.Exception("编码识别失败,可能不是文本文件。"); + this.Content = File.ReadAllText(fn, encoding); + this.FileName = fn; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharp.res.js b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharp.res.js new file mode 100644 index 0000000..0daaa08 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharp.res.js @@ -0,0 +1,85 @@ +/*[GUID("561A6F5BC8E745439266885631CD20BE")]*/ +String.prototype.format = function () { + var args = arguments; + return this.replace(/\{(\d+)\}/g, + function (m, i) { + return args[i]; + }); +} + +String.prototype.trim = function () { + return this.replace(/(^\s*)|(\s*$)/g, ""); +} + +var keywords = ["abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", "decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally", "fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "in (generic", "modifier)", "int", "interface", "internal", "is", "lock", "long", "namespace", "new", "null", "object", "operator", "out", "", "override", "params", "private", "protected", "public", "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", "struct", "switch", "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", "using", "virtual", "void", "volatile", "while", "add", "alias", "ascending", "descending", "dynamic", "from", "get", "global", "group", "into", "join", "let", "orderby", "partial", "remove", "select", "set"]; + +function isKeyWords(keyw) { + keyw = keyw.toLowerCase(); + for (var i = 0; i < keywords.length; i++) { + if (keyw == keywords[i]) { + return true; + } + } + return false; +} + +JSON2CSharp = { + _allClass: [], + _genClassCode: function (obj, name) { + var clas = "public class {0}\r\n{\r\n".format(name || "Root"); + for (var n in obj) { + var v = obj[n]; + n = n.trim(); + if (isKeyWords(n)) { + n = "@" + n; + } + clas += " {0} public {1} {2} { get; set; }
".format(this._genComment(v), this._genTypeByProp(n, v), n); + } + clas += "}
"; + this._allClass.push(clas); + return this._allClass.join("
"); + }, + _genTypeByProp: function (name, val) { + switch (Object.prototype.toString.apply(val)) { + case "[object Number]": + { + return val.toString().indexOf(".") > -1 ? "double" : "int"; + } + case "[object Date]": + { + return "DateTime"; + } + case "[object Object]": + { + name = name.substring(0, 1).toUpperCase() + name.substring(1); + this._genClassCode(val, name); + return name; + } + case "[object Array]": + { + return "List<{0}>".format(this._genTypeByProp(name + "Item", val[0])); + } + case "[object Boolean]": + { + return "bool"; + } + default: + { + var d = Date.parse(val); + //ڸʽ + if (isNaN(d) == false) return 'DateTime'; + return "string"; + } + } + }, + _genComment: function (val) { + //return ""; + var commm = typeof (val) == "string" && /.*[\u4e00-\u9fa5]+.*$/.test(val) ? val : ""; + if (commm.length > 0) return "/// <summary>\r\n /// " + commm + "\r\n /// </summary>\r\n"; + return ""; + }, + convert: function (jsonObj) { + this._allClass = []; + return this._genClassCode(jsonObj); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpDemo.res.json b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpDemo.res.json new file mode 100644 index 0000000..b1945aa --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpDemo.res.json @@ -0,0 +1,21 @@ +{ + "animals": { + "dog": [ + { + "name": "Rufus", + "breed": "labrador", + "count": 1, + "twoFeet": false + }, + { + "name": "Marty", + "breed": "whippet", + "count": 1, + "twoFeet": false + } + ], + "cat": { + "name": "Matilda" + } + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpViewModel.cs new file mode 100644 index 0000000..75d13bb --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCSharpViewModel.cs @@ -0,0 +1,72 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Jint; +using LuYao.Toolkit.Resources; +using Newtonsoft.Json.Linq; +using System; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class JsonToCSharpViewModel : ViewModelBase +{ + [ObservableProperty] + private string _json; + [ObservableProperty] + private string _cSharp; + + [RelayCommand] + private void Convert() + { + if (string.IsNullOrWhiteSpace(this.Json)) + { + this.CSharp = "JSON 不能为空"; + return; + } + if (!Format()) return; + try + { + using (var engine = new Engine()) + { + var js = AppResources.Channels_Converts_JsonToCSharp_JS; + engine.Evaluate(js); + engine.SetValue("str", this.Json); + var value = engine.Evaluate(@"var t = JSON.parse(str), e = JSON2CSharp.convert(t);e = e.replace(//g, '\n'); return e;"); + var output = value.AsString(); + output = System.Web.HttpUtility.HtmlDecode(output); + this.CSharp = output; + } + } + catch (Exception e) + { + this.CSharp = e.Message; + } + } + private bool Format() + { + try + { + var token = JToken.Parse(this.Json); + this.Json = token.ToString(Newtonsoft.Json.Formatting.Indented); + return true; + } + catch (Exception e) + { + this.CSharp = "JSON 格式不正确:" + Environment.NewLine + e.Message; + return false; + } + } + [RelayCommand] + private void Demo() + { + this.Json = AppResources.Channels_Converts_JsonToCSharpDemo_JSON; + this.Format(); + } + [RelayCommand] + private void Clear() => this.Json = String.Empty; + [RelayCommand] + private void Copy() + { + if (string.IsNullOrWhiteSpace(this.CSharp)) return; + Services.ClipboardService.CopyText(this.CSharp); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsv.res.js b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsv.res.js new file mode 100644 index 0000000..1b561a4 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsv.res.js @@ -0,0 +1,8 @@ +/** + * Minified by jsDelivr using Terser v5.10.0. + * Original file: /npm/json2csv@5.0.7/dist/json2csv.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).json2csv={})}(this,(function(t){"use strict";var e;function r(){}function n(){n.init.call(this)}function i(t){return void 0===t._maxListeners?n.defaultMaxListeners:t._maxListeners}function o(t,e,r){if(e)t.call(r);else for(var n=t.length,i=p(t,n),o=0;o0&&u.length>s){u.warned=!0;var f=new Error("Possible EventEmitter memory leak detected. "+u.length+" "+e+" listeners added. Use emitter.setMaxListeners() to increase limit");f.name="MaxListenersExceededWarning",f.emitter=t,f.type=e,f.count=u.length,h=f,"function"==typeof console.warn?console.warn(h):console.log(h)}}else u=a[e]=n,++t._eventsCount;return t}function c(t,e,r){var n=!1;function i(){t.removeListener(e,i),n||(n=!0,r.apply(t,arguments))}return i.listener=r,i}function l(t){var e=this._events;if(e){var r=e[t];if("function"==typeof r)return 1;if(r)return r.length}return 0}function p(t,e){for(var r=new Array(e);e--;)r[e]=t[e];return r}r.prototype=Object.create(null),n.EventEmitter=n,n.usingDomains=!1,n.prototype.domain=void 0,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.init=function(){this.domain=null,n.usingDomains&&e.active&&e.Domain,this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new r,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(t){if("number"!=typeof t||t<0||isNaN(t))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=t,this},n.prototype.getMaxListeners=function(){return i(this)},n.prototype.emit=function(t){var e,r,n,i,f,c,l,p="error"===t;if(c=this._events)p=p&&null==c.error;else if(!p)return!1;if(l=this.domain,p){if(e=arguments[1],!l){if(e instanceof Error)throw e;var d=new Error('Uncaught, unspecified "error" event. ('+e+")");throw d.context=e,d}return e||(e=new Error('Uncaught, unspecified "error" event')),e.domainEmitter=this,e.domain=l,e.domainThrown=!1,l.emit("error",e),!1}if(!(r=c[t]))return!1;var g="function"==typeof r;switch(n=arguments.length){case 1:o(r,g,this);break;case 2:s(r,g,this,arguments[1]);break;case 3:a(r,g,this,arguments[1],arguments[2]);break;case 4:u(r,g,this,arguments[1],arguments[2],arguments[3]);break;default:for(i=new Array(n-1),f=1;f0;)if(n[s]===e||n[s].listener&&n[s].listener===e){a=n[s].listener,o=s;break}if(o<0)return this;if(1===n.length){if(n[0]=void 0,0==--this._eventsCount)return this._events=new r,this;delete i[t]}else!function(t,e){for(var r=e,n=r+1,i=t.length;n0?Reflect.ownKeys(this._events):[]};var d="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},g=[],y=[],v="undefined"!=typeof Uint8Array?Uint8Array:Array,b=!1;function w(){b=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,r=t.length;e>18&63]+g[i>>12&63]+g[i>>6&63]+g[63&i]);return o.join("")}function _(t){var e;b||w();for(var r=t.length,n=r%3,i="",o=[],s=16383,a=0,u=r-n;au?u:a+s));return 1===n?(e=t[r-1],i+=g[e>>2],i+=g[e<<4&63],i+="=="):2===n&&(e=(t[r-2]<<8)+t[r-1],i+=g[e>>10],i+=g[e>>4&63],i+=g[e<<2&63],i+="="),o.push(i),o.join("")}function S(t,e,r,n,i){var o,s,a=8*i-n-1,u=(1<>1,f=-7,c=r?i-1:0,l=r?-1:1,p=t[e+c];for(c+=l,o=p&(1<<-f)-1,p>>=-f,f+=a;f>0;o=256*o+t[e+c],c+=l,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=n;f>0;s=256*s+t[e+c],c+=l,f-=8);if(0===o)o=1-h;else{if(o===u)return s?NaN:1/0*(p?-1:1);s+=Math.pow(2,n),o-=h}return(p?-1:1)*s*Math.pow(2,o-n)}function E(t,e,r,n,i,o){var s,a,u,h=8*o-i-1,f=(1<>1,l=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:o-1,d=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=f):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+c>=1?l/u:l*Math.pow(2,1-c))*u>=2&&(s++,u/=2),s+c>=f?(a=0,s=f):s+c>=1?(a=(e*u-1)*Math.pow(2,i),s+=c):(a=e*Math.pow(2,c-1)*Math.pow(2,i),s=0));i>=8;t[r+p]=255&a,p+=d,a/=256,i-=8);for(s=s<0;t[r+p]=255&s,p+=d,s/=256,h-=8);t[r+p-d]|=128*g}var R={}.toString,A=Array.isArray||function(t){return"[object Array]"==R.call(t)};function k(){return T.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function O(t,e){if(k()=k())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+k().toString(16)+" bytes");return 0|t}function M(t){return!(null==t||!t._isBuffer)}function x(t,e){if(M(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return ut(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return ht(t).length;default:if(n)return ut(t).length;e=(""+e).toLowerCase(),n=!0}}function U(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return K(this,e,r);case"utf8":case"utf-8":return $(this,e,r);case"ascii":return V(this,e,r);case"latin1":case"binary":return Q(this,e,r);case"base64":return H(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Z(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function I(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function D(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=T.from(e,n)),M(e))return 0===e.length?-1:N(t,e,r,n,i);if("number"==typeof e)return e&=255,T.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):N(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function N(t,e,r,n,i){var o,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var f=-1;for(o=r;oa&&(r=a-u),o=r;o>=0;o--){for(var c=!0,l=0;li&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function H(t,e,r){return 0===e&&r===t.length?_(t):_(t.slice(e,r))}function $(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:h>223?3:h>191?2:1;if(i+c<=r)switch(c){case 1:h<128&&(f=h);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&h)<<6|63&o)>127&&(f=u);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(u=(15&h)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(f=u);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&h)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(f=u)}null===f?(f=65533,c=1):f>65535&&(f-=65536,n.push(f>>>10&1023|55296),f=56320|1023&f),n.push(f),i+=c}return function(t){var e=t.length;if(e<=G)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),""},T.prototype.compare=function(t,e,r,n,i){if(!M(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),u=this.slice(n,i),h=t.slice(e,r),f=0;fi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return q(this,t,e,r);case"utf8":case"utf-8":return Y(this,t,e,r);case"ascii":return F(this,t,e,r);case"latin1":case"binary":return z(this,t,e,r);case"base64":return W(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return J(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},T.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var G=4096;function V(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function tt(t,e,r,n,i,o){if(!M(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function et(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function rt(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function nt(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function it(t,e,r,n,i){return i||nt(t,0,r,4),E(t,e,r,n,23,4),r+4}function ot(t,e,r,n,i){return i||nt(t,0,r,8),E(t,e,r,n,52,8),r+8}T.prototype.slice=function(t,e){var r,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},T.prototype.readUInt8=function(t,e){return e||X(t,1,this.length),this[t]},T.prototype.readUInt16LE=function(t,e){return e||X(t,2,this.length),this[t]|this[t+1]<<8},T.prototype.readUInt16BE=function(t,e){return e||X(t,2,this.length),this[t]<<8|this[t+1]},T.prototype.readUInt32LE=function(t,e){return e||X(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},T.prototype.readUInt32BE=function(t,e){return e||X(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},T.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||X(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},T.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||X(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},T.prototype.readInt8=function(t,e){return e||X(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},T.prototype.readInt16LE=function(t,e){e||X(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},T.prototype.readInt16BE=function(t,e){e||X(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},T.prototype.readInt32LE=function(t,e){return e||X(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},T.prototype.readInt32BE=function(t,e){return e||X(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},T.prototype.readFloatLE=function(t,e){return e||X(t,4,this.length),S(this,t,!0,23,4)},T.prototype.readFloatBE=function(t,e){return e||X(t,4,this.length),S(this,t,!1,23,4)},T.prototype.readDoubleLE=function(t,e){return e||X(t,8,this.length),S(this,t,!0,52,8)},T.prototype.readDoubleBE=function(t,e){return e||X(t,8,this.length),S(this,t,!1,52,8)},T.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||tt(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},T.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,1,255,0),T.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},T.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,2,65535,0),T.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):et(this,t,e,!0),e+2},T.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,2,65535,0),T.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):et(this,t,e,!1),e+2},T.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,4,4294967295,0),T.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):rt(this,t,e,!0),e+4},T.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,4,4294967295,0),T.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):rt(this,t,e,!1),e+4},T.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);tt(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},T.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);tt(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},T.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,1,127,-128),T.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},T.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,2,32767,-32768),T.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):et(this,t,e,!0),e+2},T.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,2,32767,-32768),T.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):et(this,t,e,!1),e+2},T.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,4,2147483647,-2147483648),T.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):rt(this,t,e,!0),e+4},T.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||tt(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),T.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):rt(this,t,e,!1),e+4},T.prototype.writeFloatLE=function(t,e,r){return it(this,t,e,!0,r)},T.prototype.writeFloatBE=function(t,e,r){return it(this,t,e,!1,r)},T.prototype.writeDoubleLE=function(t,e,r){return ot(this,t,e,!0,r)},T.prototype.writeDoubleBE=function(t,e,r){return ot(this,t,e,!1,r)},T.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!T.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function ht(t){return function(t){var e,r,n,i,o,s;b||w();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===t[a-2]?2:"="===t[a-1]?1:0,s=new v(3*a/4-o),n=o>0?a-4:a;var u=0;for(e=0,r=0;e>16&255,s[u++]=i>>8&255,s[u++]=255&i;return 2===o?(i=y[t.charCodeAt(e)]<<2|y[t.charCodeAt(e+1)]>>4,s[u++]=255&i):1===o&&(i=y[t.charCodeAt(e)]<<10|y[t.charCodeAt(e+1)]<<4|y[t.charCodeAt(e+2)]>>2,s[u++]=i>>8&255,s[u++]=255&i),s}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(st,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ft(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function ct(t){return null!=t&&(!!t._isBuffer||lt(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&<(t.slice(0,0))}(t))}function lt(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function pt(){throw new Error("setTimeout has not been defined")}function dt(){throw new Error("clearTimeout has not been defined")}var gt=pt,yt=dt;function vt(t){if(gt===setTimeout)return setTimeout(t,0);if((gt===pt||!gt)&&setTimeout)return gt=setTimeout,setTimeout(t,0);try{return gt(t,0)}catch(e){try{return gt.call(null,t,0)}catch(e){return gt.call(this,t,0)}}}"function"==typeof d.setTimeout&&(gt=setTimeout),"function"==typeof d.clearTimeout&&(yt=clearTimeout);var bt,wt=[],mt=!1,_t=-1;function St(){mt&&bt&&(mt=!1,bt.length?wt=bt.concat(wt):_t=-1,wt.length&&Et())}function Et(){if(!mt){var t=vt(St);mt=!0;for(var e=wt.length;e;){for(bt=wt,wt=[];++_t1)for(var r=1;r=i)return t;switch(t){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return t}})),s=n[r];r=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),Nt(e)?r.showHidden=e:e&&Vt(r,e),Ft(r.showHidden)&&(r.showHidden=!1),Ft(r.depth)&&(r.depth=2),Ft(r.colors)&&(r.colors=!1),Ft(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=Mt),Ut(r,t,r.depth)}function Mt(t,e){var r=Bt.styles[e];return r?"["+Bt.colors[r][0]+"m"+t+"["+Bt.colors[r][1]+"m":t}function xt(t,e){return t}function Ut(t,e,r){if(t.customInspect&&e&&$t(e.inspect)&&e.inspect!==Bt&&(!e.constructor||e.constructor.prototype!==e)){var n=e.inspect(r,t);return Yt(n)||(n=Ut(t,n,r)),n}var i=function(t,e){if(Ft(e))return t.stylize("undefined","undefined");if(Yt(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}if(n=e,"number"==typeof n)return t.stylize(""+e,"number");var n;if(Nt(e))return t.stylize(""+e,"boolean");if(qt(e))return t.stylize("null","null")}(t,e);if(i)return i;var o=Object.keys(e),s=function(t){var e={};return t.forEach((function(t,r){e[t]=!0})),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(e)),Ht(e)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return It(e);if(0===o.length){if($t(e)){var a=e.name?": "+e.name:"";return t.stylize("[Function"+a+"]","special")}if(zt(e))return t.stylize(RegExp.prototype.toString.call(e),"regexp");if(Jt(e))return t.stylize(Date.prototype.toString.call(e),"date");if(Ht(e))return It(e)}var u,h,f="",c=!1,l=["{","}"];(u=e,Array.isArray(u)&&(c=!0,l=["[","]"]),$t(e))&&(f=" [Function"+(e.name?": "+e.name:"")+"]");return zt(e)&&(f=" "+RegExp.prototype.toString.call(e)),Jt(e)&&(f=" "+Date.prototype.toUTCString.call(e)),Ht(e)&&(f=" "+It(e)),0!==o.length||c&&0!=e.length?r<0?zt(e)?t.stylize(RegExp.prototype.toString.call(e),"regexp"):t.stylize("[Object]","special"):(t.seen.push(e),h=c?function(t,e,r,n,i){for(var o=[],s=0,a=e.length;s60)return r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+r[1];return r[0]+e+" "+t.join(", ")+" "+r[1]}(h,f,l)):l[0]+f+l[1]}function It(t){return"["+Error.prototype.toString.call(t)+"]"}function Dt(t,e,r,n,i,o){var s,a,u;if((u=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?a=u.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):u.set&&(a=t.stylize("[Setter]","special")),Qt(n,i)||(s="["+i+"]"),a||(t.seen.indexOf(u.value)<0?(a=qt(r)?Ut(t,u.value,null):Ut(t,u.value,r-1)).indexOf("\n")>-1&&(a=o?a.split("\n").map((function(t){return" "+t})).join("\n").substr(2):"\n"+a.split("\n").map((function(t){return" "+t})).join("\n")):a=t.stylize("[Circular]","special")),Ft(s)){if(o&&i.match(/^\d+$/))return a;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=t.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=t.stylize(s,"string"))}return s+": "+a}function Nt(t){return"boolean"==typeof t}function qt(t){return null===t}function Yt(t){return"string"==typeof t}function Ft(t){return void 0===t}function zt(t){return Wt(t)&&"[object RegExp]"===Gt(t)}function Wt(t){return"object"==typeof t&&null!==t}function Jt(t){return Wt(t)&&"[object Date]"===Gt(t)}function Ht(t){return Wt(t)&&("[object Error]"===Gt(t)||t instanceof Error)}function $t(t){return"function"==typeof t}function Gt(t){return Object.prototype.toString.call(t)}function Vt(t,e){if(!e||!Wt(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t}function Qt(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function Kt(){this.head=null,this.tail=null,this.length=0}Bt.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},Bt.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},Kt.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},Kt.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},Kt.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},Kt.prototype.clear=function(){this.head=this.tail=null,this.length=0},Kt.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},Kt.prototype.concat=function(t){if(0===this.length)return T.alloc(0);if(1===this.length)return this.head.data;for(var e=T.allocUnsafe(t>>>0),r=this.head,n=0;r;)r.data.copy(e,n),n+=r.data.length,r=r.next;return e};var Zt=T.isEncoding||function(t){switch(t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Xt(t){switch(this.encoding=(t||"utf8").toLowerCase().replace(/[-_]/,""),function(t){if(t&&!Zt(t))throw new Error("Unknown encoding: "+t)}(t),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=ee;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=re;break;default:return void(this.write=te)}this.charBuffer=new T(6),this.charReceived=0,this.charLength=0}function te(t){return t.toString(this.encoding)}function ee(t){this.charReceived=t.length%2,this.charLength=this.charReceived?2:0}function re(t){this.charReceived=t.length%3,this.charLength=this.charReceived?3:0}Xt.prototype.write=function(t){for(var e="";this.charLength;){var r=t.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&i<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var n=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,n),n-=this.charReceived);var i;n=(e+=t.toString(this.encoding,0,n)).length-1;if((i=e.charCodeAt(n))>=55296&&i<=56319){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),t.copy(this.charBuffer,0,0,o),e.substring(0,n)}return e},Xt.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},Xt.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;e+=n.slice(0,r).toString(i)}return e},oe.ReadableState=ie;var ne=function(t){if(Ft(jt)&&(jt=""),t=t.toUpperCase(),!Pt[t])if(new RegExp("\\b"+t+"\\b","i").test(jt)){Pt[t]=function(){var e=Lt.apply(null,arguments);console.error("%s %d: %s",t,0,e)}}else Pt[t]=function(){};return Pt[t]}("stream");function ie(t,e){t=t||{},this.objectMode=!!t.objectMode,e instanceof Be&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var r=t.highWaterMark,n=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:n,this.highWaterMark=~~this.highWaterMark,this.buffer=new Kt,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(this.decoder=new Xt(t.encoding),this.encoding=t.encoding)}function oe(t){if(!(this instanceof oe))return new oe(t);this._readableState=new ie(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),n.call(this)}function se(t,e,r,n,i){var o=function(t,e){var r=null;ct(e)||"string"==typeof e||null==e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(e,r);if(o)t.emit("error",o);else if(null===r)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,he(t)}(t,e);else if(e.objectMode||r&&r.length>0)if(e.ended&&!i){var s=new Error("stream.push() after EOF");t.emit("error",s)}else if(e.endEmitted&&i){var a=new Error("stream.unshift() after end event");t.emit("error",a)}else{var u;!e.decoder||i||n||(r=e.decoder.write(r),u=!e.objectMode&&0===r.length),i||(e.reading=!1),u||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,i?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&he(t))),function(t,e){e.readingMore||(e.readingMore=!0,Rt(ce,t,e))}(t,e)}else i||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=ae?t=ae:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function he(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(ne("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?Rt(fe,t):fe(t))}function fe(t){ne("emit readable"),t.emit("readable"),de(t)}function ce(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var n;to.length?o.length:t;if(s===o.length?i+=o:i+=o.slice(0,t),0===(t-=s)){s===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(s));break}++n}return e.length-=n,i}(t,e):function(t,e){var r=T.allocUnsafe(t),n=e.head,i=1;n.data.copy(r),t-=n.data.length;for(;n=n.next;){var o=n.data,s=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,s),0===(t-=s)){s===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(s));break}++i}return e.length-=i,r}(t,e);return n}(t,e.buffer,e.decoder),r);var r}function ye(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,Rt(ve,e,t))}function ve(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function be(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return ne("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?ye(this):he(this),null;if(0===(t=ue(t,e))&&e.ended)return 0===e.length&&ye(this),null;var n,i=e.needReadable;return ne("need readable",i),(0===e.length||e.length-t0?ge(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&ye(this)),null!==n&&this.emit("data",n),n},oe.prototype._read=function(t){this.emit("error",new Error("not implemented"))},oe.prototype.pipe=function(t,e){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=t;break;case 1:n.pipes=[n.pipes,t];break;default:n.pipes.push(t)}n.pipesCount+=1,ne("pipe count=%d opts=%j",n.pipesCount,e);var i=!e||!1!==e.end?s:h;function o(t){ne("onunpipe"),t===r&&h()}function s(){ne("onend"),t.end()}n.endEmitted?Rt(i):r.once("end",i),t.on("unpipe",o);var a=function(t){return function(){var e=t._readableState;ne("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&t.listeners("data").length&&(e.flowing=!0,de(t))}}(r);t.on("drain",a);var u=!1;function h(){ne("cleanup"),t.removeListener("close",p),t.removeListener("finish",d),t.removeListener("drain",a),t.removeListener("error",l),t.removeListener("unpipe",o),r.removeListener("end",s),r.removeListener("end",h),r.removeListener("data",c),u=!0,!n.awaitDrain||t._writableState&&!t._writableState.needDrain||a()}var f=!1;function c(e){ne("ondata"),f=!1,!1!==t.write(e)||f||((1===n.pipesCount&&n.pipes===t||n.pipesCount>1&&-1!==be(n.pipes,t))&&!u&&(ne("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,f=!0),r.pause())}function l(e){ne("onerror",e),g(),t.removeListener("error",l),0===function(t,e){return t.listeners(e).length}(t,"error")&&t.emit("error",e)}function p(){t.removeListener("finish",d),g()}function d(){ne("onfinish"),t.removeListener("close",p),g()}function g(){ne("unpipe"),r.unpipe(t)}return r.on("data",c),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",l),t.once("close",p),t.once("finish",d),t.emit("pipe",r),n.flowing||(ne("pipe resume"),r.resume()),t},oe.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this)),this;if(!t){var r=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var i=0;i-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},Se.prototype._write=function(t,e,r){r(new Error("not implemented"))},Se.prototype._writev=null,Se.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,Te(t,e),r&&(e.finished?Rt(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,n,r)},Ot(Be,oe);for(var Ce=Object.keys(Se.prototype),je=0;je-1},jr.prototype.set=function(t,e){var r=this.__data__,n=Br(r,t);return n<0?r.push([t,e]):r[n][1]=e,this},Pr.prototype.clear=function(){this.__data__={hash:new Cr,map:new(kr||jr),string:new Cr}},Pr.prototype.delete=function(t){return Ur(this,t).delete(t)},Pr.prototype.get=function(t){return Ur(this,t).get(t)},Pr.prototype.has=function(t){return Ur(this,t).has(t)},Pr.prototype.set=function(t,e){return Ur(this,t).set(t,e),this};var Dr=qr((function(t){var e;t=null==(e=t)?"":function(t){if("string"==typeof t)return t;if(zr(t))return Lr?Lr.call(t):"";var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}(e);var r=[];return ar.test(t)&&r.push(""),t.replace(ur,(function(t,e,n,i){r.push(n?i.replace(hr,"$1"):e||t)})),r}));function Nr(t){if("string"==typeof t||zr(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function qr(t,e){if("function"!=typeof t||e&&"function"!=typeof e)throw new TypeError("Expected a function");var r=function(){var n=arguments,i=e?e.apply(this,n):n[0],o=r.cache;if(o.has(i))return o.get(i);var s=t.apply(this,n);return r.cache=o.set(i,s),s};return r.cache=new(qr.Cache||Pr),r}qr.Cache=Pr;var Yr=Array.isArray;function Fr(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function zr(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&"[object Symbol]"==Sr.call(t)}var Wr=function(t,e,r){var n=null==t?void 0:Mr(t,e);return void 0===n?r:n};var Jr=function t(e,r,n){var i=Array.isArray(r)?r:r.split("."),o=Ke(i),s=o[0],a=o.slice(1);return He({},e,Je({},s,i.length>1?t(e[s]||{},a,n):n))},Hr=function t(e,r){var n=Array.isArray(r)?r:r.split("."),i=Ke(n),o=i[0],s=i.slice(1);return"object"!==Ye(e[o])?e:1===n.length?Object.keys(e).filter((function(t){return t!==o})).reduce((function(t,r){return Object.assign(t,Je({},r,e[r]))}),{}):Object.keys(e).reduce((function(r,n){return He({},r,Je({},n,n!==o?e[n]:t(e[o],s)))}),{})},$r=function(t,e){var r=!0;return t.reduce((function(t,n){return null==n&&(n=""),r?(r=!1,"".concat(n)):"".concat(t).concat(e).concat(n)}),"")},Gr=function(t,e){try{return t.push.apply(t,Ze(e)),t}catch(r){return t.concat(e)}},Vr=function(t,e,r){return void 0===t[e]?r:t[e]},Qr=$r,Kr=Gr,Zr=function(){function t(e){Fe(this,t),this.opts=this.preprocessOpts(e)}return We(t,[{key:"preprocessOpts",value:function(t){var e=Object.assign({},t);return e.transforms=Array.isArray(e.transforms)?e.transforms:e.transforms?[e.transforms]:[],e.delimiter=e.delimiter||",",e.eol=e.eol||tr,e.quote="string"==typeof e.quote?e.quote:'"',e.escapedQuote="string"==typeof e.escapedQuote?e.escapedQuote:"".concat(e.quote).concat(e.quote),e.header=!1!==e.header,e.includeEmptyRows=e.includeEmptyRows||!1,e.withBOM=e.withBOM||!1,e}},{key:"preprocessFieldsInfo",value:function(t){var e=this;return t.map((function(t){if("string"==typeof t)return{label:t,value:t.includes(".")||t.includes("[")?function(r){return Wr(r,t,e.opts.defaultValue)}:function(r){return Vr(r,t,e.opts.defaultValue)}};if("object"===Ye(t)){var r="default"in t?t.default:e.opts.defaultValue;if("string"==typeof t.value)return{label:t.label||t.value,value:t.value.includes(".")||t.value.includes("[")?function(e){return Wr(e,t.value,r)}:function(e){return Vr(e,t.value,r)}};if("function"==typeof t.value){var n=t.label||t.value.name||"",i={label:n,default:r};return{label:n,value:function(e){var n=t.value(e,i);return null==n?r:n}}}}throw new Error("Invalid field info option. "+JSON.stringify(t))}))}},{key:"getHeader",value:function(){var t=this;return Qr(this.opts.fields.map((function(e){return t.processValue(e.label)})),this.opts.delimiter)}},{key:"preprocessRow",value:function(t){return this.opts.transforms.reduce((function(t,e){return t.map((function(t){return e(t)})).reduce(Kr,[])}),[t])}},{key:"processRow",value:function(t){var e=this;if(t){var r=this.opts.fields.map((function(r){return e.processCell(t,r)}));if(this.opts.includeEmptyRows||!r.every((function(t){return void 0===t})))return Qr(r,this.opts.delimiter)}}},{key:"processCell",value:function(t,e){return this.processValue(e.value(t))}},{key:"processValue",value:function(t){if(null!=t){var e=Ye(t);if("boolean"!==e&&"number"!==e&&"string"!==e){if(void 0===(t=JSON.stringify(t)))return;'"'===t[0]&&(t=t.replace(/^"(.+)"$/,"$1"))}return"string"==typeof t&&(this.opts.excelStrings?(t.includes(this.opts.quote)&&(t=t.replace(new RegExp(this.opts.quote,"g"),"".concat(this.opts.escapedQuote).concat(this.opts.escapedQuote))),t='"=""'.concat(t,'"""')):(t.includes(this.opts.quote)&&(t=t.replace(new RegExp(this.opts.quote,"g"),this.opts.escapedQuote)),t="".concat(this.opts.quote).concat(t).concat(this.opts.quote))),t}}}]),t}(),Xr=$r,tn=Gr,en=function(t){function e(t){var r;return Fe(this,e),(r=Qe(this,Ge(e).call(this,t))).opts.fields&&(r.opts.fields=r.preprocessFieldsInfo(r.opts.fields)),r}return $e(e,t),We(e,[{key:"parse",value:function(t){var e=this.preprocessData(t);this.opts.fields||(this.opts.fields=e.reduce((function(t,e){return Object.keys(e).forEach((function(e){t.includes(e)||t.push(e)})),t}),[]),this.opts.fields=this.preprocessFieldsInfo(this.opts.fields));var r=this.opts.header?this.getHeader():"",n=this.processData(e);return(this.opts.withBOM?"\ufeff":"")+r+(r&&n?this.opts.eol:"")+n}},{key:"preprocessData",value:function(t){var e=this,r=Array.isArray(t)?t:[t];if(!this.opts.fields&&(0===r.length||"object"!==Ye(r[0])))throw new Error('Data should not be empty or the "fields" option should be included');return 0===this.opts.transforms.length?r:r.map((function(t){return e.preprocessRow(t)})).reduce(tn,[])}},{key:"processData",value:function(t){var e=this;return Xr(t.map((function(t){return e.processRow(t)})).filter((function(t){return t})),this.opts.eol)}}]),e}(Zr),rn={},nn=rn.LEFT_BRACE=1,on=rn.RIGHT_BRACE=2,sn=rn.LEFT_BRACKET=3,an=rn.RIGHT_BRACKET=4,un=rn.COLON=5,hn=rn.COMMA=6,fn=rn.TRUE=7,cn=rn.FALSE=8,ln=rn.NULL=9,pn=rn.STRING=10,dn=rn.NUMBER=11,gn=rn.START=17,yn=rn.STOP=18,vn=rn.TRUE1=33,bn=rn.TRUE2=34,wn=rn.TRUE3=35,mn=rn.FALSE1=49,_n=rn.FALSE2=50,Sn=rn.FALSE3=51,En=rn.FALSE4=52,Rn=rn.NULL1=65,An=rn.NULL2=66,kn=rn.NULL3=67,On=rn.NUMBER1=81,Tn=rn.NUMBER3=83,Ln=rn.STRING1=97,Cn=rn.STRING2=98,jn=rn.STRING3=99,Pn=rn.STRING4=100,Bn=rn.STRING5=101,Mn=rn.STRING6=102,xn=rn.VALUE=113,Un=rn.KEY=114,In=rn.OBJECT=129,Dn=rn.ARRAY=130,Nn="\\".charCodeAt(0),qn="/".charCodeAt(0),Yn="\b".charCodeAt(0),Fn="\f".charCodeAt(0),zn="\n".charCodeAt(0),Wn="\r".charCodeAt(0),Jn="\t".charCodeAt(0),Hn=65536;function $n(){this.tState=gn,this.value=void 0,this.string=void 0,this.stringBuffer=T.alloc?T.alloc(Hn):new T(Hn),this.stringBufferOffset=0,this.unicode=void 0,this.highSurrogate=void 0,this.key=void 0,this.mode=void 0,this.stack=[],this.state=xn,this.bytes_remaining=0,this.bytes_in_sequence=0,this.temp_buffs={2:new T(2),3:new T(3),4:new T(4)},this.offset=-1}$n.toknam=function(t){for(var e=Object.keys(rn),r=0,n=e.length;r=Hn&&(this.string+=this.stringBuffer.toString("utf8"),this.stringBufferOffset=0),this.stringBuffer[this.stringBufferOffset++]=t},Gn.appendStringBuf=function(t,e,r){var n=t.length;"number"==typeof e&&(n="number"==typeof r?r<0?t.length-e+r:r-e:t.length-e),n<0&&(n=0),this.stringBufferOffset+n>Hn&&(this.string+=this.stringBuffer.toString("utf8",0,this.stringBufferOffset),this.stringBufferOffset=0),t.copy(this.stringBuffer,this.stringBufferOffset,e,r),this.stringBufferOffset+=n},Gn.write=function(t){var e;"string"==typeof t&&(t=new T(t));for(var r=0,n=t.length;r=48&&e<64)this.string=String.fromCharCode(e),this.tState=Tn;else if(32!==e&&9!==e&&10!==e&&13!==e)return this.charError(t,r)}else if(this.tState===Ln)if(e=t[r],this.bytes_remaining>0){for(var i=0;i=128){if(e<=193||e>244)return this.onError(new Error("Invalid UTF-8 character at position "+r+" in state "+$n.toknam(this.tState)));if(e>=194&&e<=223&&(this.bytes_in_sequence=2),e>=224&&e<=239&&(this.bytes_in_sequence=3),e>=240&&e<=244&&(this.bytes_in_sequence=4),this.bytes_in_sequence+r>t.length){for(var o=0;o<=t.length-1-r;o++)this.temp_buffs[this.bytes_in_sequence][o]=t[r+o];this.bytes_remaining=r+this.bytes_in_sequence-t.length,r=t.length-1}else this.appendStringBuf(t,r,r+this.bytes_in_sequence),r=r+this.bytes_in_sequence-1}else if(34===e)this.tState=gn,this.string+=this.stringBuffer.toString("utf8",0,this.stringBufferOffset),this.stringBufferOffset=0,this.onToken(pn,this.string),this.offset+=T.byteLength(this.string,"utf8")+1,this.string=void 0;else if(92===e)this.tState=Cn;else{if(!(e>=32))return this.charError(t,r);this.appendStringChar(e)}else if(this.tState===Cn)if(34===(e=t[r]))this.appendStringChar(e),this.tState=Ln;else if(92===e)this.appendStringChar(Nn),this.tState=Ln;else if(47===e)this.appendStringChar(qn),this.tState=Ln;else if(98===e)this.appendStringChar(Yn),this.tState=Ln;else if(102===e)this.appendStringChar(Fn),this.tState=Ln;else if(110===e)this.appendStringChar(zn),this.tState=Ln;else if(114===e)this.appendStringChar(Wn),this.tState=Ln;else if(116===e)this.appendStringChar(Jn),this.tState=Ln;else{if(117!==e)return this.charError(t,r);this.unicode="",this.tState=jn}else if(this.tState===jn||this.tState===Pn||this.tState===Bn||this.tState===Mn){if(!((e=t[r])>=48&&e<64||e>64&&e<=70||e>96&&e<=102))return this.charError(t,r);if(this.unicode+=String.fromCharCode(e),this.tState++===Mn){var s=parseInt(this.unicode,16);this.unicode=void 0,void 0!==this.highSurrogate&&s>=56320&&s<57344?(this.appendStringBuf(new T(String.fromCharCode(this.highSurrogate,s))),this.highSurrogate=void 0):void 0===this.highSurrogate&&s>=55296&&s<56320?this.highSurrogate=s:(void 0!==this.highSurrogate&&(this.appendStringBuf(new T(String.fromCharCode(this.highSurrogate))),this.highSurrogate=void 0),this.appendStringBuf(new T(String.fromCharCode(s)))),this.tState=Ln}}else if(this.tState===On||this.tState===Tn)switch(e=t[r]){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 46:case 101:case 69:case 43:case 45:this.string+=String.fromCharCode(e),this.tState=Tn;break;default:this.tState=gn;var a=Number(this.string);if(isNaN(a))return this.charError(t,r);this.string.match(/[0-9]+/)==this.string&&a.toString()!=this.string?this.onToken(pn,this.string):this.onToken(dn,a),this.offset+=this.string.length-1,this.string=void 0,r--}else if(this.tState===vn){if(114!==t[r])return this.charError(t,r);this.tState=bn}else if(this.tState===bn){if(117!==t[r])return this.charError(t,r);this.tState=wn}else if(this.tState===wn){if(101!==t[r])return this.charError(t,r);this.tState=gn,this.onToken(fn,!0),this.offset+=3}else if(this.tState===mn){if(97!==t[r])return this.charError(t,r);this.tState=_n}else if(this.tState===_n){if(108!==t[r])return this.charError(t,r);this.tState=Sn}else if(this.tState===Sn){if(115!==t[r])return this.charError(t,r);this.tState=En}else if(this.tState===En){if(101!==t[r])return this.charError(t,r);this.tState=gn,this.onToken(cn,!1),this.offset+=4}else if(this.tState===Rn){if(117!==t[r])return this.charError(t,r);this.tState=An}else if(this.tState===An){if(108!==t[r])return this.charError(t,r);this.tState=kn}else if(this.tState===kn){if(108!==t[r])return this.charError(t,r);this.tState=gn,this.onToken(ln,null),this.offset+=3}},Gn.onToken=function(t,e){},Gn.parseError=function(t,e){this.tState=yn,this.onError(new Error("Unexpected "+$n.toknam(t)+(e?"("+JSON.stringify(e)+")":"")+" in state "+$n.toknam(this.state)))},Gn.push=function(){this.stack.push({value:this.value,key:this.key,mode:this.mode})},Gn.pop=function(){var t=this.value,e=this.stack.pop();this.value=e.value,this.key=e.key,this.mode=e.mode,this.emit(t),this.mode||(this.state=xn)},Gn.emit=function(t){this.mode&&(this.state=hn),this.onValue(t)},Gn.onValue=function(t){},Gn.onToken=function(t,e){if(this.state===xn)if(t===pn||t===dn||t===fn||t===cn||t===ln)this.value&&(this.value[this.key]=e),this.emit(e);else if(t===nn)this.push(),this.value?this.value=this.value[this.key]={}:this.value={},this.key=void 0,this.state=Un,this.mode=In;else if(t===sn)this.push(),this.value?this.value=this.value[this.key]=[]:this.value=[],this.key=0,this.mode=Dn,this.state=xn;else if(t===on){if(this.mode!==In)return this.parseError(t,e);this.pop()}else{if(t!==an)return this.parseError(t,e);if(this.mode!==Dn)return this.parseError(t,e);this.pop()}else if(this.state===Un)if(t===pn)this.key=e,this.state=un;else{if(t!==on)return this.parseError(t,e);this.pop()}else if(this.state===un){if(t!==un)return this.parseError(t,e);this.state=xn}else{if(this.state!==hn)return this.parseError(t,e);if(t===hn)this.mode===Dn?(this.key++,this.state=xn):this.mode===In&&(this.state=Un);else{if(!(t===an&&this.mode===Dn||t===on&&this.mode===In))return this.parseError(t,e);this.pop()}}},$n.C=rn;var Vn=$n,Qn=function(t){function e(t,r){var n;return Fe(this,e),n=Qe(this,Ge(e).call(this,r)),Object.getOwnPropertyNames(Zr.prototype).forEach((function(t){return n[t]=Zr.prototype[t]})),n.opts=n.preprocessOpts(t),n._data="",n._hasWritten=!1,n._readableState.objectMode?n.initObjectModeParse():n.opts.ndjson?n.initNDJSONParse():n.initJSONParser(),n.opts.withBOM&&n.push("\ufeff"),n.opts.fields&&(n.opts.fields=n.preprocessFieldsInfo(n.opts.fields),n.pushHeader()),n}return $e(e,t),We(e,[{key:"initObjectModeParse",value:function(){var t=this;this.parser={write:function(e){t.pushLine(e)},getPendingData:function(){}}}},{key:"initNDJSONParse",value:function(){var t=this;this.parser={_data:"",write:function(e){this._data+=e.toString();var r=this._data.split("\n").map((function(t){return t.trim()})).filter((function(t){return""!==t})),n=!1;r.forEach((function(e,i){try{t.pushLine(JSON.parse(e))}catch(o){i===r.length-1?n=!0:(o.message="Invalid JSON (".concat(e,")"),t.emit("error",o))}})),this._data=n?this._data.slice(this._data.lastIndexOf("\n")):""},getPendingData:function(){return this._data}}}},{key:"initJSONParser",value:function(){var t=this;this.parser=new Vn,this.parser.onValue=function(e){this.stack.length===this.depthToEmit&&t.pushLine(e)},this.parser._onToken=this.parser.onToken,this.parser.onToken=function(e,r){t.parser._onToken(e,r),0!==this.stack.length||t.opts.fields||this.mode===Vn.C.ARRAY||this.mode===Vn.C.OBJECT||this.onError(new Error('Data should not be empty or the "fields" option should be included')),1===this.stack.length&&(void 0===this.depthToEmit&&(this.depthToEmit=this.mode===Vn.C.ARRAY?1:0),0!==this.depthToEmit&&1===this.stack.length&&(this.value=void 0))},this.parser.getPendingData=function(){return this.value},this.parser.onError=function(e){e.message.includes("Unexpected")&&(e.message="Invalid JSON (".concat(e.message,")")),t.emit("error",e)}}},{key:"_transform",value:function(t,e,r){this.parser.write(t),r()}},{key:"_flush",value:function(t){this.parser.getPendingData()&&t(new Error("Invalid data received from stdin",this.parser.getPendingData())),t()}},{key:"pushHeader",value:function(){if(this.opts.header){var t=this.getHeader();this.emit("header",t),this.push(t),this._hasWritten=!0}}},{key:"pushLine",value:function(t){var e=this,r=this.preprocessRow(t);this._hasWritten||(this.opts.fields=this.opts.fields||this.preprocessFieldsInfo(Object.keys(r[0])),this.pushHeader()),r.forEach((function(t){var r=e.processRow(t,e.opts);void 0!==r&&(e.emit("line",r),e.push(e._hasWritten?e.opts.eol+r:r),e._hasWritten=!0)}))}}]),e}(qe.Transform),Kn=Qn,Zn=qe.Transform,Xn=$r,ti=function(){function t(e,r){Fe(this,t),this.input=new Zn(r),this.input._read=function(){},this.transform=new Kn(e,r),this.processor=this.input.pipe(this.transform)}return We(t,[{key:"fromInput",value:function(t){if(this._input)throw new Error("Async parser already has an input.");return this._input=t,this.input=this._input.pipe(this.processor),this}},{key:"throughTransform",value:function(t){if(this._output)throw new Error("Can't add transforms once an output has been added.");return this.processor=this.processor.pipe(t),this}},{key:"toOutput",value:function(t){if(this._output)throw new Error("Async parser already has an output.");return this._output=t,this.processor=this.processor.pipe(t),this}},{key:"promise",value:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return new Promise((function(r,n){if(e){var i=[];t.processor.on("data",(function(t){return i.push(t.toString())})).on("finish",(function(){return r(Xn(i,""))})).on("error",(function(t){return n(t)}))}else t.processor.on("finish",(function(){return r()})).on("error",(function(t){return n(t)}))}))}}]),t}(),ei=ti;var ri=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.objects,r=void 0===e||e,n=t.arrays,i=void 0!==n&&n,o=t.separator,s=void 0===o?".":o;function a(t,e,n){return Object.keys(t).forEach((function(o){var u=n?"".concat(n).concat(s).concat(o):o,h=t[o];r&&"object"===Ye(h)&&null!==h&&!Array.isArray(h)&&"[object Function]"!==Object.prototype.toString.call(h.toJSON)&&Object.keys(h).length||i&&Array.isArray(h)?a(h,e,u):e[u]=h})),e}return function(t){return a(t,{})}},ni=Jr,ii=Hr,oi=Gr;function si(t,e){return Object.keys(t).reduce((function(r,n){var i=e?"".concat(e,".").concat(n):n,o=t[n];return"object"===Ye(o)&&null!==o&&!Array.isArray(o)&&"[object Function]"!==Object.prototype.toString.call(o.toJSON)&&Object.keys(o).length?r=r.concat(si(o,i)):Array.isArray(o)&&(r.push(i),r=r.concat(o.map((function(t){return si(t,i)})).reduce(oi,[]).filter((function(t,e,r){return r.indexOf(t)!==e})))),r}),[])}var ai=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.paths,r=void 0===e?void 0:e,n=t.blankOut,i=void 0!==n&&n;function o(t,e){return t.map((function(t){var r=Wr(t,e);return Array.isArray(r)?r.length?r.map((function(r,n){return ni(i&&n>0?{}:t,e,r)})):ii(t,e):t})).reduce(oi,[])}return r=Array.isArray(r)?r:r?[r]:void 0,function(t){return(r||si(t)).reduce(o,[t])}},ui=qe.Readable,hi=en,fi=ei,ci=Kn,li=function(t,e){return new en(e).parse(t)},pi=function(t,e,r){try{t instanceof ui||(r=Object.assign({},r,{objectMode:!0}));var n=new ei(e,r),i=n.promise();return Array.isArray(t)?(t.forEach((function(t){return n.input.push(t)})),n.input.push(null)):t instanceof ui?n.fromInput(t):(n.input.push(t),n.input.push(null)),i}catch(t){return Promise.reject(t)}},di={flatten:ri,unwind:ai},gi={Parser:hi,AsyncParser:fi,Transform:ci,parse:li,parseAsync:pi,transforms:di};t.AsyncParser=fi,t.Parser=hi,t.Transform=ci,t.default=gi,t.parse=li,t.parseAsync=pi,t.transforms=di,Object.defineProperty(t,"__esModule",{value:!0})})); +//# sourceMappingURL=/sm/ef9dc7d5fd5685a1d9971a986235276b4d0c415af23e0a5c859ea55f1d3aee90.map \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvDemo.res.json b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvDemo.res.json new file mode 100644 index 0000000..f521007 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvDemo.res.json @@ -0,0 +1,52 @@ +[ + { + "album": "The White Stripes", + "year": 1999, + "US_peak_chart_post": "-" + }, + { + "album": "De Stijl", + "year": 2000, + "US_peak_chart_post": "-" + }, + { + "album": "White Blood Cells", + "year": 2001, + "US_peak_chart_post": 61 + }, + { + "album": "Elephant", + "year": 2003, + "US_peak_chart_post": 6 + }, + { + "album": "Get Behind Me Satan", + "year": 2005, + "US_peak_chart_post": 3 + }, + { + "album": "Icky Thump", + "year": 2007, + "US_peak_chart_post": 2 + }, + { + "album": "Under Great White Northern Lights", + "year": 2010, + "US_peak_chart_post": 11 + }, + { + "album": "Live in Mississippi", + "year": 2011, + "US_peak_chart_post": "-" + }, + { + "album": "Live at the Gold Dollar", + "year": 2012, + "US_peak_chart_post": "-" + }, + { + "album": "Nine Miles from the White City", + "year": 2013, + "US_peak_chart_post": "-" + } +] \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvViewModel.cs new file mode 100644 index 0000000..add22f8 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/JsonToCsvViewModel.cs @@ -0,0 +1,71 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Jint; +using LuYao.Toolkit.Resources; +using Newtonsoft.Json.Linq; +using System; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class JsonToCsvViewModel : ViewModelBase +{ + [ObservableProperty] + private string _json; + + [ObservableProperty] + private string _csv; + [RelayCommand] + private void Convert() + { + if (string.IsNullOrWhiteSpace(this.Json)) + { + this.Csv = "JSON 不能为空"; + return; + } + if (!Format()) return; + try + { + using (var engine = new Engine()) + { + var js = AppResources.Channels_Converts_JsonToCsv_JS; + engine.Evaluate(js); + engine.SetValue("str", this.Json); + var value = engine.Evaluate("var t = JSON.parse(str);var opts = {transforms:[ json2csv.transforms.flatten()]};var parser = new json2csv.Parser(opts);return parser.parse(t);"); + var output = value.AsString(); + this.Csv = output; + } + } + catch (Exception e) + { + this.Csv = e.Message; + } + } + private bool Format() + { + try + { + var token = JToken.Parse(this.Json); + this.Json = token.ToString(Newtonsoft.Json.Formatting.Indented); + return true; + } + catch (Exception e) + { + this.Csv = "JSON 格式不正确:" + Environment.NewLine + e.Message; + return false; + } + } + [RelayCommand] + private void Demo() + { + this.Json = AppResources.Channels_Converts_JsonToCsvDemo_JSON; + this.Format(); + } + [RelayCommand] + private void Clear() => this.Json = String.Empty; + [RelayCommand] + private void Copy() + { + if (string.IsNullOrWhiteSpace(this.Csv)) return; + Services.ClipboardService.CopyText(this.Csv); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/PostmanConverterViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/PostmanConverterViewModel.cs new file mode 100644 index 0000000..5cbaddc --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/PostmanConverterViewModel.cs @@ -0,0 +1,129 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.IO; +using System.Text; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class PostmanConverterViewModel : ViewModelBase +{ + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(UrlToPostmanCommand))] + [NotifyCanExecuteChangedFor(nameof(PostmanToUrlCommand))] + [NotifyCanExecuteChangedFor(nameof(JsonToPostmanCommand))] + [NotifyCanExecuteChangedFor(nameof(PostmanToJsonCommand))] + private string input; + + [ObservableProperty] + private string output; + + private bool CanUrlToPostman() + { + if (string.IsNullOrWhiteSpace(this.Input)) return false; + return true; + } + private bool CanPostmanToUrl() + { + if (string.IsNullOrWhiteSpace(this.Input)) return false; + + return true; + } + private bool CanJsonToPostman() + { + if (string.IsNullOrWhiteSpace(this.Input)) return false; + try + { + JObject.Parse(this.Input); + } + catch (Exception) + { + return false; + } + return true; + } + + [RelayCommand(CanExecute = nameof(CanUrlToPostman))] + private void UrlToPostman() + { + var qs = System.Web.HttpUtility.ParseQueryString(this.Input ?? string.Empty); + var sb = new StringBuilder(); + for (int i = 0; i < qs.Count; i++) + { + var key = qs.GetKey(i); + var value = qs.Get(i); + sb.AppendFormat("{0}:{1}", key, value); + sb.AppendLine(); + } + this.Output = sb.ToString(); + } + + [RelayCommand(CanExecute = nameof(CanPostmanToUrl))] + private void PostmanToUrl() + { + var items = (this.Input ?? String.Empty).Split('\n'); + var qs = System.Web.HttpUtility.ParseQueryString(string.Empty); + foreach (var item in items) + { + if (string.IsNullOrWhiteSpace(item)) continue; + if (item.IndexOf(':') < 0) continue; + var pairs = item.Split(':'); + var key = pairs[0].Trim(); + if (string.IsNullOrWhiteSpace(key)) continue; + var value = string.Join(':', pairs, 1, pairs.Length - 1).Trim(); + qs.Add(key, value); + } + this.Output = qs.ToString(); + } + [RelayCommand(CanExecute = nameof(CanJsonToPostman))] + private void JsonToPostman() + { + var obj = JObject.Parse(this.Input); + var sb = new StringBuilder(); + foreach (var p in obj.Properties()) + { + sb.AppendFormat("{0}:{1}", p.Name, p.Value); + sb.AppendLine(); + } + this.Output = sb.ToString(); + } + private bool CanPostmanToJson() + { + if (string.IsNullOrWhiteSpace(this.Input)) return false; + return true; + } + + [RelayCommand(CanExecute = nameof(CanPostmanToJson))] + private void PostmanToJson() + { + var sb = new StringBuilder(); + using (var sw = new StringWriter(sb)) + using (var json = new JsonTextWriter(sw)) + { + json.Formatting = Formatting.Indented; + json.WriteStartObject(); + var items = (this.Input ?? String.Empty).Split('\n'); + foreach (var item in items) + { + if (string.IsNullOrWhiteSpace(item)) continue; + if (item.IndexOf(':') < 0) continue; + var pairs = item.Split(':'); + var key = pairs[0].Trim(); + if (string.IsNullOrWhiteSpace(key)) continue; + var value = string.Join(':', pairs, 1, pairs.Length - 1).Trim(); + json.WritePropertyName(key); + json.WriteValue(value); + } + json.WriteEndObject(); + } + this.Output = sb.ToString(); + } + [RelayCommand] + private void Clear() + { + this.Input = string.Empty; + this.Output = string.Empty; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/RsaKeyConvertViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/RsaKeyConvertViewModel.cs new file mode 100644 index 0000000..cde7bca --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/RsaKeyConvertViewModel.cs @@ -0,0 +1,78 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class RsaKeyConvertViewModel : ViewModelBase +{ + [ObservableProperty] + private string _privateKey; + [ObservableProperty] + private string _output; + + private void Do(Func convert) + { + try + { + using (var rsa = CreateRsa()) + { + Output = convert(rsa); + } + } + catch (Exception e) + { + Output = e.Message; + } + } + [RelayCommand] + private void ToPkcs8() => Do(static rsa => Convert.ToBase64String(rsa.ExportPkcs8PrivateKey())); + [RelayCommand] + private void ToPkcs1() => Do(static rsa => Convert.ToBase64String(rsa.ExportRSAPrivateKey())); + [RelayCommand] + private void ToXml() => Do(static rsa => rsa.ToXmlString(true)); + [RelayCommand] + private void GetPublickKey() => Do(static rsa => Convert.ToBase64String(rsa.ExportRSAPublicKey())); + [RelayCommand] + private void GetPublickKeyXml() => Do(static rsa => rsa.ToXmlString(false)); + [RelayCommand] + private void CopyOutput() => Services.ClipboardService.CopyText(Output); + private RSA CreateRsa() + { + if (string.IsNullOrWhiteSpace(this.PrivateKey)) throw new Exception("私钥不能为空"); + // + var rsa = RSA.Create(); + if (this.PrivateKey.StartsWith("")) + { + rsa.FromXmlString(this.PrivateKey); + } + else + { + var key = this.PrivateKey; + if (Regex.IsMatch(key, @"^[-]+BEGIN")) + { + key = Regex.Match(key, @"(?<=KEY[-]+[\r\n]+)[\s\S]+(?=[\r\n]+[-]+END)").Value; + key = Regex.Replace(key, @"[\r\n]+", string.Empty); + } + var bytes = Convert.FromBase64String(key); + if (bytes.Length < 8) throw new Exception("私钥长度过短"); + switch (bytes[7]) + { + case 0x30://PKCS8 + rsa.ImportPkcs8PrivateKey(bytes, out _); + break; + case 0x02://PKCS1 + rsa.ImportRSAPrivateKey(bytes, out _); + break; + default: throw new Exception("仅支持 PKCS#1 和 PKCS#8 格式的 RSA 私钥。"); + } + } + return rsa; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByJsViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByJsViewModel.cs new file mode 100644 index 0000000..c987fd2 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByJsViewModel.cs @@ -0,0 +1,138 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Services; +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Xsl; +using System.Xml; +using Newtonsoft.Json; +using Jint; +using Jint.Native; +using Jint.Native.Object; +using Jint.Native.Date; +using Jint.Native.Array; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class TranslateJsonByJsViewModel : ViewModelBase +{ + private IWatchToken _jsonWatchToken = null; + private IWatchToken _jsWatchToken = null; + + [ObservableProperty] + private string _jsonPath; + [ObservableProperty] + private string _jsPath; + [ObservableProperty] + private string _output = "准备就绪"; + [ObservableProperty] + private DateTime? _lastBuild; + private void FileWatchToken_Changed(object sender, FileSystemEventArgs e) + { + XTrace.WriteLine("自动重载:{0}", e.FullPath); + Translate(); + } + partial void OnJsonPathChanged(string value) + { + if (this._jsonWatchToken != null) this._jsonWatchToken.Dispose(); + this._jsonWatchToken = WatchFileService.Watch(value); + this._jsonWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + partial void OnJsPathChanged(string value) + { + if (this._jsWatchToken != null) this._jsWatchToken.Dispose(); + this._jsWatchToken = WatchFileService.Watch(value); + this._jsWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + [RelayCommand] + private void Translate() + { + if (string.IsNullOrWhiteSpace(JsPath)) + { + Output = "请选择 Js 文件"; + return; + } + + try + { + string json = String.Empty; + if (!string.IsNullOrWhiteSpace(JsonPath)) json = FileService.ReadAllText(JsonPath); + var js = FileService.ReadAllText(JsPath); + using (var e = new Engine()) + { + if (!string.IsNullOrWhiteSpace(json)) + { + JsonConvert.DeserializeObject(json); + e.Evaluate($"var model = {json};"); + } + var result = e.Evaluate(js); + this.Output = BuildOutput(result); + } + } + catch (Exception e) + { + Output = e.Message; + if (e is Jint.Runtime.JavaScriptException js) Output += Environment.NewLine + js.JavaScriptStackTrace; + } + finally + { + this.LastBuild = DateTime.Now; + } + } + private string BuildOutput(JsValue value) + { + if (value.IsObject()) + { + var sb = new StringBuilder(); + using (var sw = new StringWriter(sb)) + { + var w = new JsonTextWriter(sw) + { + Formatting = Newtonsoft.Json.Formatting.Indented + }; + Write(value, w); + return sb.ToString(); + } + } + return value.ToString(); + } + private static void Write(JsValue value, JsonWriter w) + { + switch (value) + { + case ArrayInstance array: + w.WriteStartArray(); + foreach (var item in array) Write(item, w); + w.WriteEndArray(); + break; + case JsDate date: w.WriteValue(date.ToDateTime()); break; + case JsNumber number: w.WriteRawValue(number.ToString()); break; + case JsBigInt bigInt: w.WriteValue(bigInt.ToObject()); break; + case JsBoolean boolean: w.WriteValue(boolean.ToObject()); break; + case ObjectInstance instance: + w.WriteStartObject(); + foreach (var item in instance.GetOwnProperties()) + { + w.WritePropertyName(item.Key.ToString()); + Write(item.Value.Value, w); ; + } + w.WriteEndObject(); + break; + case JsString str: w.WriteValue(str.ToString()); break; + default: w.WriteRawValue(value.ToString()); break; + } + } + public override void Destroy() + { + base.Destroy(); + this._jsonWatchToken?.Dispose(); + this._jsWatchToken?.Dispose(); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByLiquidViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByLiquidViewModel.cs new file mode 100644 index 0000000..ee8282c --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateJsonByLiquidViewModel.cs @@ -0,0 +1,98 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Fluid; +using LuYao.Toolkit.Services; +using Microsoft.Extensions.FileProviders; +using NewLife.Log; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Encodings.Web; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class TranslateJsonByLiquidViewModel : ViewModelBase +{ + private TemplateOptions _templateOptions = new TemplateOptions(); + private FluidParser _fluidParser = new FluidParser(); + private IWatchToken _jsonWatchToken = null; + private IWatchToken _liquidWatchToken = null; + [ObservableProperty] + private string _jsonPath; + [ObservableProperty] + private string _liquidPath; + [ObservableProperty] + private string _output = "准备就绪"; + [ObservableProperty] + private DateTime? _lastBuild; + private void FileWatchToken_Changed(object sender, FileSystemEventArgs e) + { + XTrace.WriteLine("自动重载:{0}", e.FullPath); + Translate(); + } + partial void OnJsonPathChanged(string value) + { + if (this._jsonWatchToken != null) this._jsonWatchToken.Dispose(); + this._jsonWatchToken = WatchFileService.Watch(value); + this._jsonWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + partial void OnLiquidPathChanged(string value) + { + if (this._liquidWatchToken != null) this._liquidWatchToken.Dispose(); + this._liquidWatchToken = WatchFileService.Watch(value); + this._liquidWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + [RelayCommand] + private void Translate() + { + if (string.IsNullOrWhiteSpace(LiquidPath)) + { + Output = "请选择 Liquid 文件"; + return; + } + var model = new Dictionary(); + if (!string.IsNullOrWhiteSpace(this.JsonPath)) + { + try + { + var json = Services.FileService.ReadAllText(this.JsonPath); + JsonConvert.PopulateObject(json, model); + } + catch (Exception e) + { + this.Output = $"模型解析失败: {e.Message}"; + return; + } + } + try + { + var str = FileService.ReadAllText(this.LiquidPath); + var template = _fluidParser.Parse(str); + var dir = Path.GetDirectoryName(this.LiquidPath); + if (this._templateOptions.FileProvider is PhysicalFileProvider provider) + { + if (provider.Root != dir) + { + this._templateOptions.FileProvider = new PhysicalFileProvider(dir); + } + } + else + { + this._templateOptions.FileProvider = new PhysicalFileProvider(dir); + } + var context = new TemplateContext(model, this._templateOptions, true) { }; + Output = template.Render(context, HtmlEncoder.Default); + } + catch (ParseException e) + { + Output = e.Message; + } + catch (Exception e) + { + Output = e.Message; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateXmlByXslViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateXmlByXslViewModel.cs new file mode 100644 index 0000000..0e9c06c --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/TranslateXmlByXslViewModel.cs @@ -0,0 +1,109 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Services; +using Prism.Navigation; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Xsl; +using System.Xml; +using NewLife.Log; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class TranslateXmlByXslViewModel : ViewModelBase, IDestructible +{ + private IWatchToken _xmlWatchToken = null; + private IWatchToken _xslWatchToken = null; + + [ObservableProperty] + private string _xmlPath; + [ObservableProperty] + private string _xslPath; + [ObservableProperty] + private string _output = "准备就绪"; + [ObservableProperty] + private DateTime? _lastBuild; + + + private void FileWatchToken_Changed(object sender, FileSystemEventArgs e) + { + XTrace.WriteLine("自动重载:{0}", e.FullPath); + Translate(); + } + + partial void OnXmlPathChanged(string value) + { + if (this._xmlWatchToken != null) this._xmlWatchToken.Dispose(); + this._xmlWatchToken = WatchFileService.Watch(value); + this._xmlWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + + partial void OnXslPathChanged(string value) + { + if (this._xslWatchToken != null) this._xslWatchToken.Dispose(); + this._xslWatchToken = WatchFileService.Watch(value); + this._xslWatchToken.Changed += this.FileWatchToken_Changed; + this.Translate(); + } + + public override void Destroy() + { + base.Destroy(); + this._xmlWatchToken?.Dispose(); + this._xslWatchToken?.Dispose(); + } + + [RelayCommand] + private void Translate() + { + if (string.IsNullOrWhiteSpace(XmlPath)) + { + Output = "请选择 XML 文件"; + return; + } + if (string.IsNullOrWhiteSpace(XslPath)) + { + Output = "请选择 XSL 文件"; + return; + } + try + { + var xml = FileService.ReadAllText(XmlPath); + var xsl = new XslCompiledTransform(); + xsl.Load(this.XslPath); + using (var sr = File.OpenRead(XmlPath)) + { + using (var reader = XmlReader.Create(sr)) + { + using (var ms = new MemoryStream()) + { + using (var writer = XmlWriter.Create(ms, new XmlWriterSettings + { + Indent = true, + Encoding = Encoding.UTF8 + })) + { + xsl.Transform(reader, writer); + } + + ms.Seek(0, SeekOrigin.Begin); + Output = Encoding.UTF8.GetString(ms.ToArray()); + } + } + } + } + catch (Exception e) + { + Output = e.Message; + } + finally + { + this.LastBuild = DateTime.Now; + } + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/UnixTimestampViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/UnixTimestampViewModel.cs new file mode 100644 index 0000000..aefd3ce --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/UnixTimestampViewModel.cs @@ -0,0 +1,129 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Converts; +public enum UnixTimestampUnit +{ + Secound, + Millisecond +} +public partial class UnixTimestampViewModel : ViewModelBase +{ + public UnixTimestampViewModel() + { + this._toTimestampInput = DateTime.Now; + switch (this.Unit) + { + case UnixTimestampUnit.Secound: + this.ToTimeInput = DateTimeOffset.Now.ToUnixTimeSeconds(); + break; + case UnixTimestampUnit.Millisecond: + this.ToTimeInput = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + break; + default: throw new ArgumentOutOfRangeException(); + } + this.Update(); + this.RunUpdate(); + } + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Unit))] + private UnixTimestampUnit _unit = UnixTimestampUnit.Secound; + + [ObservableProperty] + private long _current; + + [ObservableProperty] + private bool _isRunning = true; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(AutoUpdate))] + private bool _autoUpdate = true; + + [RelayCommand] + private void Copy() + { + var i = this.Current; + if (i <= 0) return; + var txt = i.ToString(); + Services.ClipboardService.CopyText(txt); + } + [RelayCommand] + private void Start() => this.AutoUpdate = true; + [RelayCommand] + private void Stop() => this.AutoUpdate = false; + [RelayCommand] + private void Update() + { + switch (this.Unit) + { + case UnixTimestampUnit.Secound: + this.Current = DateTimeOffset.Now.ToUnixTimeSeconds(); + break; + case UnixTimestampUnit.Millisecond: + this.Current = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + break; + default: throw new ArgumentOutOfRangeException(); + } + } + + private async void RunUpdate() + { + var sleep = TimeSpan.FromMilliseconds(100); + while (IsRunning) + { + if (this.AutoUpdate) Update(); + await Task.Delay(sleep); + } + } + public override void Destroy() + { + base.Destroy(); + if (this.IsRunning) this.IsRunning = false; + } + + [ObservableProperty] + private long _toTimeInput; + [ObservableProperty] + private string _toTimeOutput; + [RelayCommand] + private void ToTime() + { + DateTimeOffset offset; + switch (this.Unit) + { + case UnixTimestampUnit.Secound: + offset = DateTimeOffset.FromUnixTimeSeconds(this.ToTimeInput); + break; + case UnixTimestampUnit.Millisecond: + offset = DateTimeOffset.FromUnixTimeMilliseconds(this.ToTimeInput); + break; + default: throw new ArgumentOutOfRangeException(); + } + var timezone = TimeZoneInfo.Local; + var d = TimeZoneInfo.ConvertTimeFromUtc(offset.DateTime, timezone); + this.ToTimeOutput = d.ToString("yyyy-MM-dd HH:mm:ss"); + } + + [ObservableProperty] + private DateTime _toTimestampInput; + [ObservableProperty] + private long? _toTimestampOutput; + [RelayCommand] + private void ToTimestamp() + { + var offset = new DateTimeOffset(this.ToTimestampInput, TimeZoneInfo.Local.BaseUtcOffset); + switch (this.Unit) + { + case UnixTimestampUnit.Secound: + this.ToTimestampOutput = offset.ToUnixTimeSeconds(); + break; + case UnixTimestampUnit.Millisecond: + this.ToTimestampOutput = offset.ToUnixTimeMilliseconds(); + break; + default: throw new ArgumentOutOfRangeException(); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Converts/YamlToJsonViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Converts/YamlToJsonViewModel.cs new file mode 100644 index 0000000..74c2cf1 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Converts/YamlToJsonViewModel.cs @@ -0,0 +1,51 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.Dynamic; +using System.IO; +using YamlDotNet.Serialization; + +namespace LuYao.Toolkit.Channels.Converts; + +public partial class YamlToJsonViewModel : ViewModelBase +{ + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(YamlToJsonCommand))] + [NotifyCanExecuteChangedFor(nameof(JsonToYamlCommand))] + private string input; + + [ObservableProperty] + private string output; + + private bool CanExecute() => !string.IsNullOrWhiteSpace(this.Input); + + [RelayCommand(CanExecute = nameof(CanExecute))] + private void YamlToJson() + { + using var r = new StringReader(this.Input); + var deserializer = new DeserializerBuilder().Build(); + var yamlObject = deserializer.Deserialize(r); + this.Output = JsonConvert.SerializeObject(yamlObject, Formatting.Indented); + } + + [RelayCommand(CanExecute = nameof(CanExecute))] + private void JsonToYaml() + { + var serializer = new SerializerBuilder().Build(); + var dyn = JsonConvert.DeserializeObject(this.Input, new ExpandoObjectConverter()); + this.Output = serializer.Serialize(dyn); + } + + [RelayCommand] + private void Clear() + { + this.Output = this.Input = string.Empty; + } + + [RelayCommand] + private void Copy() + { + Services.ClipboardService.CopyText(this.Output); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/CrossBorder/MercadoToWorldFirstViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/CrossBorder/MercadoToWorldFirstViewModel.cs new file mode 100644 index 0000000..f5347d9 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/CrossBorder/MercadoToWorldFirstViewModel.cs @@ -0,0 +1,326 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Services; +using OfficeOpenXml; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.CrossBorder; + +public partial class MercadoToWorldFirstViewModel : ViewModelBase +{ + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Input))] + [NotifyCanExecuteChangedFor(nameof(ConvertCommand))] + private string input; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Output))] + [NotifyCanExecuteChangedFor(nameof(ConvertCommand))] + private string output; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(OverwriteExistsFiles))] + private bool overwriteExistsFiles; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(AppendFileName))] + private bool appendFileName; + + [ObservableProperty] + private string log = "准备就绪"; + + private bool CanConvert() + { + if (string.IsNullOrWhiteSpace(this.Input)) return false; + if (string.IsNullOrWhiteSpace(this.Output)) return false; + return true; + } + + private void WriteLog(StringBuilder log, string message, params object[] args) + { + if (args != null && args.Length > 0) + { + log.AppendLine(string.Format(message, args)); + } + else + { + log.AppendLine(message); + } + this.Log = log.ToString(); + } + public class OutputLine + { + public string 订单编号; + public DateTime? 支付时间; + public decimal? 订单金额; + public string 商品标题; + public string 买家名称; + public string 收货地址; + + public string 币种 => "USD"; + public int 商品数量 => 1; + public bool IsEmpty() + { + if (string.IsNullOrWhiteSpace(this.订单编号) == false) return false; + if (this.支付时间 != null) return false; + if (this.订单金额 != null) return false; + if (string.IsNullOrWhiteSpace(this.商品标题) == false) return false; + if (string.IsNullOrWhiteSpace(this.买家名称) == false) return false; + if (string.IsNullOrWhiteSpace(this.收货地址) == false) return false; + return true; + } + } + + private void Write(string file, ExcelWorksheet sheet, List lines) + { + var fn = Path.GetFileNameWithoutExtension(file); + var ext = Path.GetExtension(file); + if (this.AppendFileName && !fn.StartsWith("【万里汇上传】")) + { + fn = $"【万里汇上传】{fn}"; + } + var target = Path.Combine(this.Output, $"{fn}{ext}"); + if (File.Exists(target)) + { + if (!this.OverwriteExistsFiles) throw new Exception($"目标文件已存在,请先删除或者选中【覆盖同名文件】。{Environment.NewLine}路径:{target}"); + File.Delete(target); + } + using (var fs = File.OpenWrite(target)) + using (var pkg = new ExcelPackage(fs)) + { + var sheets = pkg.Workbook.Worksheets; + var dist = sheets.Add(sheet.Name); + //write header + //write body + dist.SetValue("A1", "Order ID"); + dist.SetValue("B1", "Paid Date"); + dist.SetValue("C1", "Order Total"); + dist.SetValue("D1", "Currency Code"); + dist.SetValue("E1", "Product Title"); + dist.SetValue("F1", "Product Quantity"); + dist.SetValue("G1", "Buyer Name/Buyer ID"); + dist.SetValue("H1", "Shipping Address"); + + for (int i = 1; i <= 8; i++) + { + var style = dist.Cells[1, i].Style; + style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; + } + + //TODO:杂项信息 + + var line2 = new string[] { + @"本列填写内容:订单编号 + +填写具体要求: +最长可接受64个字符,超过将不会被计算到交易申报数据中", + @"本列填写内容:支付时间 + +填写具体要求: +1. 针对不同平台的时间格式要求不同,请参照以下平台的时间格式示例: +Tophatter:MM/dd/yyyy,06/21/2019 + +Cdiscount:dd/MM/yyyy HH:mm: ss,04 / 02 / 2020 12:37:50 + +Rakuten:dd / MM / yyyy - HH:mm,26 / 12 / 2019 - 14:50 + + 或 MM/ dd / yyyy hh: mm: ss aa,02 / 13 / 2020 12:19:20 PM + +FNAC:dd / MM / yyyy,14 / 12 / 2019 + +Etsy:MM / dd / yyyy,11 / 27 / 2019 + +Newegg:MM / dd / yyyy HH: mm: ss,12 / 26 / 2019 23:30:18 + +2.不在以上平台范围内的,时间格式要求: yyyy / mm / dd 或者mm / dd / yyyy,2022 / 01 / 31 或者 01 / 31 / 2022", + @"本列填写内容:订单总金额(非商品单价,请填写每笔交易的总金额) + +填写具体要求: +1.必须是数字 +2.可以有小数点,最多只支持小数点后两位,超过小数点后两位的数字将被截断且不计入额度统计", + @"本列填写内容:币种 + +填写具体要求: +1.仅支持大写 +2.且必须为三位字母代码 +例如: USD,EUR,GBP", + @"本列填写内容:商品标题 + +填写具体要求: +1.最长可接受512个字符,超过将不会被计算到交易申报数据中", + @"本列填写内容:商品数量 + +填写具体要求: +1.仅支持整数", + @"本列填写内容:买家名称 / 买家ID + +填写具体要求: +1.最长可接受128字符,超过将不会被计算到交易申报数据中", + @"本列填写内容:收货地址 + +填写具体要求: +1.最长可接受512个字符,超过将不会被计算到交易申报数据中" + }; + + var line3 = new string[] + { + "填写示例:2002021154repeat2020526", + @"填写示例:详见上表示例", + @"填写示例:15.21", + @"填写示例:EUR", + @"填写示例:Gilet pour chien/Harnais Chien- Noir taille XL --", + @"填写示例:1", + @"填写示例:M. Bouscailloux Loric 12 COURS MERCURE", + @"填写示例:FR" + }; + + for (int i = 1; i <= line2.Length; i++) + { + dist.SetValue(2, i, line2[i - 1]); + var style = dist.Cells[2, i].Style; + style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Top; + style.WrapText = true; + } + dist.Row(2).CustomHeight = true; + + for (int i = 1; i <= line3.Length; i++) + { + dist.SetValue(3, i, line3[i - 1]); + var style = dist.Cells[2, i].Style; + style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Top; + style.WrapText = true; + } + dist.Row(3).CustomHeight = true; + + for (int i = 0; i < lines.Count; i++) + { + var line = lines[i]; + var row = i + 4; + dist.SetValue($"A{row}", line.订单编号); + dist.SetValue($"B{row}", line.支付时间); + dist.SetValue($"C{row}", line.订单金额); + dist.SetValue($"D{row}", line.币种); + dist.SetValue($"E{row}", line.商品标题); + dist.SetValue($"F{row}", line.商品数量); + dist.SetValue($"G{row}", line.买家名称); + dist.SetValue($"H{row}", line.收货地址); + + dist.Cells[$"B{row}"].Style.Numberformat.Format = "dd/MM/yy"; + } + + for (int i = 1; i <= 8; i++) + { + dist.Column(i).AutoFit(40, 58); + } + pkg.Save(); + } + } + private void Convert(string[] files, StringBuilder log) + { + var regex = new Regex("((\\w+)(\\s)(\\d+),(\\s)(\\d+))", RegexOptions.None);//表达式对象 + var output = new List(); + foreach (var file in files) + { + WriteLog(log, "处理文件:{0}", Path.GetFileName(file)); + using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var pkg = new ExcelPackage(fs)) + { + foreach (var sheet in pkg.Workbook.Worksheets) + { + WriteLog(log, "读取 Sheet : {0},行:{1},列:{2}。", sheet.Name, sheet.Dimension.Rows, sheet.Dimension.Columns); + output.Clear(); + for (int row = 4; row <= sheet.Dimension.Rows; row++) + { + var line = new OutputLine(); + for (int col = 1; col <= sheet.Dimension.Columns; col++) + { + var cell = sheet.Cells[row, col]; + switch (col) + { + case 1://Order # + line.订单编号 = cell.GetCellValue(); + break; + case 2://Order date + { + var str = cell.GetCellValue(); + if (!string.IsNullOrWhiteSpace(str) && regex.IsMatch(str)) + { + var dt = regex.Match(str).Groups[1].Value; + line.支付时间 = DateTime.Parse(dt).Date; + } + } + break; + case 17://Listing title + line.商品标题 = cell.GetCellValue(); + break; + case 19://Listing sale unit price (USD) + { + var str = cell.GetCellValue(); + if (!string.IsNullOrWhiteSpace(str) && decimal.TryParse(str, out var m)) + { + line.订单金额 = m; + } + } + break; + case 25://Buyer + line.买家名称 = cell.GetCellValue(); + break; + case 31://Country + line.收货地址 = cell.GetCellValue(); + break; + } + } + if (!line.IsEmpty()) output.Add(line); + } + + if (output.Count <= 0) + { + WriteLog(log, "未读取到有效数据,跳过。"); + continue; + } + else + { + WriteLog(log, "转换数据"); + Write(file, sheet, output); + WriteLog(log, "处理成功"); + break; + } + } + } + } + WriteLog(log, "处理完成"); + } + + [RelayCommand(CanExecute = nameof(CanConvert))] + private async Task Convert() + { + var log = new StringBuilder(); + try + { + if (!Directory.Exists(this.Input)) throw new Exception("美客多报表目录不存在!"); + if (!Directory.Exists(this.Output)) Directory.CreateDirectory(this.Output); + if (this.Input == this.Output) throw new Exception("两个目录不能相同"); + var files = Directory.GetFiles(this.Input, "*.xlsx"); + if (files.Length <= 0) throw new Exception("没有找到美客多报表文件,仅支持 xlsx 格式。"); + log.AppendLine($"找到 {files.Length} 个文件"); + await Task.Run(() => Convert(files, log)); + NotifyService.Success("转换成功!"); + } + catch (Exception e) + { + log.AppendLine(e.ToString()); + throw; + } + finally + { + this.Log = log.ToString(); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/Ascii85EncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/Ascii85EncodeViewModel.cs new file mode 100644 index 0000000..6f90516 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/Ascii85EncodeViewModel.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class Ascii85EncodeViewModel : EncodingViewModelBase +{ + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + var bytes = encoding.GetBytes(this.Input); + this.Output = StringZipper.Ascii85.Encode(bytes); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + try + { + var bytes = StringZipper.Ascii85.Decode(this.Input); + this.Output = encoding.GetString(bytes); + } + catch (Exception e) + { + this.Output = e.Message; + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/Base16EncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base16EncodeViewModel.cs new file mode 100644 index 0000000..16b8a9e --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base16EncodeViewModel.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class Base16EncodeViewModel : EncodingViewModelBase +{ + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + var bytes = encoding.GetBytes(this.Input); + this.Output = StringZipper.Base16.Encode(bytes); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + try + { + var bytes = StringZipper.Base16.Decode(this.Input); + this.Output = encoding.GetString(bytes); + } + catch (Exception e) + { + this.Output = e.Message; + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/Base62EncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base62EncodeViewModel.cs new file mode 100644 index 0000000..d77ee4b --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base62EncodeViewModel.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class Base62EncodeViewModel : EncodingViewModelBase +{ + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + var bytes = encoding.GetBytes(this.Input); + this.Output = StringZipper.Base62.Encode(bytes); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + try + { + var bytes = StringZipper.Base62.Decode(this.Input); + this.Output = encoding.GetString(bytes); + } + catch (Exception e) + { + this.Output = e.Message; + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/Base64EncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base64EncodeViewModel.cs new file mode 100644 index 0000000..a6da883 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/Base64EncodeViewModel.cs @@ -0,0 +1,50 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class Base64EncodeViewModel : EncodingViewModelBase +{ + + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + var bytes = encoding.GetBytes(this.Input); + this.Output = Convert.ToBase64String(bytes); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + var encoding = this.GetEncoding(); + try + { + var bytes = Convert.FromBase64String(this.Input); + this.Output = encoding.GetString(bytes); + } + catch (Exception e) + { + this.Output = e.Message; + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/EncodingViewModelBase.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/EncodingViewModelBase.cs new file mode 100644 index 0000000..e97c4b3 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/EncodingViewModelBase.cs @@ -0,0 +1,37 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class EncodingViewModelBase : ViewModelBase +{ + public IReadOnlyCollection Encodings { get; } = new string[] { "UTF-8", "GB2312" }; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Encoding))] + protected string _encoding = "UTF-8"; + + protected Encoding GetEncoding() => System.Text.Encoding.GetEncoding(this.Encoding); + + [ObservableProperty] + private string _input; + [ObservableProperty] + private string _output; + + [RelayCommand] + protected virtual void Copy() + { + Services.ClipboardService.CopyText(this.Output); + } + + [RelayCommand] + protected virtual void Clear() + { + this.Output = this.Input = String.Empty; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/HtmlEncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/HtmlEncodeViewModel.cs new file mode 100644 index 0000000..d73a993 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/HtmlEncodeViewModel.cs @@ -0,0 +1,37 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class HtmlEncodeViewModel : EncodingViewModelBase +{ + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + this.Output = System.Web.HttpUtility.HtmlEncode(this.Input); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + this.Output = System.Web.HttpUtility.HtmlDecode(this.Input); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/StringZipperViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/StringZipperViewModel.cs new file mode 100644 index 0000000..13234bc --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/StringZipperViewModel.cs @@ -0,0 +1,85 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class StringZipperViewModel : EncodingViewModelBase +{ + public IReadOnlyList Encoders { get; } = new string[] { + StringZipper.Base16.Identifier, + StringZipper.Base62.Identifier, + StringZipper.Base64.Identifier, + StringZipper.Ascii85.Identifier + }; + public IReadOnlyCollection Compressors { get; } = new[] + { + StringZipper.LzString.Identifier, + StringZipper.GZip.Identifier, + StringZipper.Deflate.Identifier, + StringZipper.Br.Identifier, + }; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Encoder))] + private string _encoder = "ascii85"; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Compressor))] + private string _compressor = "gzip"; + + [ObservableProperty] + private string _report; + + [RelayCommand] + private void Zip() + { + try + { + if (!StringZipper.TryGetComponent(this.Compressor, out var compressor)) + throw new Exception($"压缩算法未找到:{this.Compressor}"); + + if (!StringZipper.TryGetComponent(this.Encoder, out var encoder)) + throw new Exception($"编码格式未找到:{this.Encoder}"); + + this.Output = StringZipper.Zip(this.Input, compressor, encoder); + this.Report = this.GetReport(this.Input, this.Output); + } + catch (Exception e) + { + this.Output = e.Message; + this.Report = String.Empty; + } + } + + [RelayCommand] + private void Unzip() + { + try + { + this.Output = StringZipper.Unzip(this.Input); + this.Report = this.GetReport(this.Output, this.Input); + } + catch (Exception e) + { + this.Output = e.Message; + this.Report = String.Empty; + } + } + + protected override void Clear() + { + base.Clear(); + this.Report = String.Empty; + } + private string GetReport(string org, string zip) + { + var orgCount = System.Text.Encoding.UTF8.GetByteCount(org ?? String.Empty); + var zipCount = System.Text.Encoding.UTF8.GetByteCount(zip ?? String.Empty); + return $"压缩前:{orgCount} 压缩后:{zipCount} 压缩率:{1d * zipCount / orgCount:0.00%}"; + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Encodings/UrlEncodeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Encodings/UrlEncodeViewModel.cs new file mode 100644 index 0000000..b01caff --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Encodings/UrlEncodeViewModel.cs @@ -0,0 +1,36 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Channels.Encodings; + +public partial class UrlEncodeViewModel : EncodingViewModelBase +{ + [RelayCommand] + private void Encode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + this.Output = Uri.EscapeDataString(this.Input); + } + } + + [RelayCommand] + private void Decode() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + } + else + { + this.Output = Uri.UnescapeDataString(this.Input); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Files/CrackingMdbPasswordViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Files/CrackingMdbPasswordViewModel.cs new file mode 100644 index 0000000..8c41b29 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Files/CrackingMdbPasswordViewModel.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Files; + +public partial class CrackingMdbPasswordViewModel : ViewModelBase +{ + private string GetPassword(string file) + { + // 未加密的文件0x42开始至0x61之前的每间隔一字节的数值 + byte[] baseByte = { 0xbe, 0xec, 0x65, 0x9c, 0xfe, 0x28, 0x2b, 0x8a, 0x6c, 0x7b, 0xcd, 0xdf, 0x4f, 0x13, 0xf7, 0xb1 }; + byte flagByte = 0x0c; // 标志 0x62 处的数值 + + using (var fs = File.OpenRead(file)) + { + if (fs.Length == 0) + { + return "文件为空"; + } + var password = string.Empty; + fs.Seek(0x14, SeekOrigin.Begin); + var ver = (byte)fs.ReadByte(); // 取得版本, 1为Access2000, 0为Access97 + fs.Seek(0x42, SeekOrigin.Begin); + var bs = new byte[33]; + if (fs.Read(bs, 0, 33) != 33) return "数据库格式不正确"; + + var flag = (byte)(bs[32] ^ flagByte); + for (var i = 0; i < 16; i++) + { + var b = (byte)(baseByte[i] ^ bs[i * 2]); + if (i % 2 == 0 && ver == 1) + { + b ^= flag; //Access 2000 + } + + if (b > 0) + { + password += (char)b; + } + } + + return password; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Files/DetectFileEncodeingViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Files/DetectFileEncodeingViewModel.cs new file mode 100644 index 0000000..55cf933 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Files/DetectFileEncodeingViewModel.cs @@ -0,0 +1,98 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Events; +using Prism.Events; +using System; +using System.Collections.ObjectModel; +using System.IO; +using System.Text; +using UtfUnknown; + +namespace LuYao.Toolkit.Channels.Files; + +public partial class DetectFileEncodeingViewModel : ViewModelBase, IFileDragDropTarget +{ + [INotifyPropertyChanged] + public partial class FileItem + { + public FileItem(FileInfo file) + { + this.Path = file.FullName; + this.Name = file.Name; + if (!file.Exists) return; + this.Length = file.Length; + this.ReadEncoding(); + } + [ObservableProperty] + private string _path; + [ObservableProperty] + private string _name; + [ObservableProperty] + public string _encoding; + [ObservableProperty] + private long _length; + private void ReadEncoding() + { + try + { + using FileStream stream = new FileStream(this.Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var r = CharsetDetector.DetectFromStream(stream, 4096); + if (r.Detected != null) this.Encoding = r.Detected.EncodingName; + } + catch (Exception) + { + Encoding = string.Empty; + } + } + } + + private IEventAggregator _eventAggregator; + + public DetectFileEncodeingViewModel(IEventAggregator eventAggregator) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + } + + [ObservableProperty] + private ObservableCollection _files = new ObservableCollection(); + + [RelayCommand] + private void OpenFiles() + { + var dialog = Services.FileDialogService.CreateOpenFileDialog(); + dialog.Title = "编码识别"; + dialog.Multiselect = true; + if (dialog.ShowDialog() != true) return; + AddFiles(dialog.FileNames); + + } + + [RelayCommand] + private void Clear() + { + this.Files.Clear(); + } + private void AddFiles(string[] files) + { + if (files == null || files.Length == 0) return; + Array.Reverse(files); + foreach (var file in files) + { + var info = new FileInfo(file); + var item = new FileItem(info); + Files.Insert(0, item); + } + } + + public void OnFilesDropped(string group, string[] filepaths) + { + AddFiles(filepaths); + } + + [RelayCommand] + private void Preview(FileItem file) + { + var payload = new PreviewFileAsStringEventPayload(file.Path, Encoding.GetEncoding(file.Encoding)); + this._eventAggregator.GetEvent().Publish(payload); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Files/HashFileViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Files/HashFileViewModel.cs new file mode 100644 index 0000000..c164b28 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Files/HashFileViewModel.cs @@ -0,0 +1,220 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Security.Cryptography; +using LuYao.Toolkit.Services; +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Files; + +public partial class HashFileViewModel : ViewModelBase, IFileDragDropTarget +{ + public enum HashStatus { Pendding, Running, Success, Failure } + private static IDictionary Factory { get; } = new SortedDictionary(); + public static HashAlgorithm Create(string name) + { + if (Factory.TryGetValue(name, out var algorithm)) return algorithm.Create(); + return null; + } + + + + public interface IHashAlgorithmItem + { + string Name { get; } + bool IsSelected { get; set; } + HashAlgorithm Create(); + } + private partial class HashAlgorithmItem : ViewModelBase, IHashAlgorithmItem where T : HashAlgorithm + { + [ObservableProperty] + [ViewStates.WatchViewState(nameof(IsSelected))] + private bool _isSelected = false; + public HashAlgorithmItem(string name, Func factory) + { + this.Name = name; + Factory[name] = this; + _factory = factory; + } + private readonly Func _factory; + public string Name { get; private set; } + public HashAlgorithm Create() => _factory.Invoke(); + } + public partial class HashTask : ViewModelBase + { + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(Name))] + private string _fullName; + public string Name => Path.GetFileName(this.FullName); + [ObservableProperty] + private HashStatus _status; + [ObservableProperty] + private long _length; + [ObservableProperty] + private long _current; + [ObservableProperty] + private TimeSpan _cost; + [ObservableProperty] + private string _algorithm; + [ObservableProperty] + private string _result; + [ObservableProperty] + private long _speed; + + [RelayCommand] + private void Copy() + { + if (string.IsNullOrWhiteSpace(this.Result)) return; + ClipboardService.CopyText(this.Result); + } + public void Update(Stopwatch stopwatch) + { + var sec = stopwatch.ElapsedMilliseconds / 1000f; + if (sec <= 0) + { + this.Speed = 0; + return; + } + this.Speed = Convert.ToInt64(this.Current / sec); + } + } + public ObservableCollection HashAlgorithms { get; } + public ObservableCollection Tasks { get; } = new ObservableCollection(); + public HashFileViewModel() + { + this.HashAlgorithms = new ObservableCollection + { + new HashAlgorithmItem("CRC32",()=>new Crc32()), + new HashAlgorithmItem("MD5",()=>MD5.Create()), + new HashAlgorithmItem("SHA1",()=>SHA1.Create()), + new HashAlgorithmItem("SHA256",()=>SHA256.Create()), + new HashAlgorithmItem("SHA384",()=>SHA384.Create()), + }; + if (this.HashAlgorithms.All(i => i.IsSelected == false)) this.HashAlgorithms[1].IsSelected = true; + } + private Task _task = Task.CompletedTask; + private void LoadFiles(string[] files) + { + if (this.HashAlgorithms.All(i => i.IsSelected == false)) this.HashAlgorithms[0].IsSelected = true; + var names = this.HashAlgorithms.Where(i => i.IsSelected).Select(i => i.Name).ToList(); + + foreach (var file in files) + { + var info = new FileInfo(file); + if (info.Exists == false) continue; + foreach (var item in this.HashAlgorithms) + { + if (item.IsSelected == false) continue; + this.Tasks.Add(new HashTask + { + FullName = info.FullName, + Status = HashStatus.Pendding, + Length = info.Length, + Current = 0, + Cost = TimeSpan.Zero, + Algorithm = item.Name, + Result = String.Empty + }); + } + } + if (_task.IsCompleted) _task = Run(); + } + + [RelayCommand] + private void Open() + { + var dialog = FileDialogService.CreateOpenFileDialog(); + dialog.Multiselect = true; + dialog.Title = "选择需要校验的文件"; + if (dialog.ShowDialog()) + { + var files = dialog.FileNames; + if (files is { Length: > 0 }) this.LoadFiles(files); + } + } + + [RelayCommand] + private void Clear() + { + var forRemove = this.Tasks.Where(i => i.Status != HashStatus.Running).ToList(); + if (forRemove.Count > 0) + { + foreach (var item in forRemove) + { + if (item.Status == HashStatus.Running) continue; + this.Tasks.Remove(item); + } + } + } + public void OnFilesDropped(string group, string[] filepaths) + { + LoadFiles(filepaths); + } + private async Task Run() + { + var st = new Stopwatch(); + while (true) + { + var item = this.Tasks.FirstOrDefault(i => i.Status == HashStatus.Pendding); + if (item == null) break; + var runAt = DateTime.Now; + try + { + item.IsBusy = true; + item.Status = HashStatus.Running; + using (HashAlgorithm a = Create(item.Algorithm)) + { + using var fs = File.OpenRead(item.FullName); + var buffer = new byte[1024 * 1024]; + int read; + long total = 0; + var start = DateTime.Now; + var last = 0; + st.Restart(); + + while ((read = await fs.ReadAsync(buffer)) > 0) + { + a.TransformBlock(buffer, 0, read, buffer, 0); + total += read; + var now = Convert.ToInt32(1d * total / fs.Length * 1000); + if (last != now) + { + item.Current = total; + last = now; + item.Update(st); + } + } + + a.TransformFinalBlock(buffer, 0, read); + st.Stop(); + item.Update(st); + + item.Result = BitConverter.ToString(a.Hash) + .ToLowerInvariant() + .Replace("-", string.Empty); + + item.Current = total; + } + item.Status = HashStatus.Success; + } + catch (Exception e) + { + XTrace.WriteException(e); + item.Result = e.Message; + item.Status = HashStatus.Failure; + } + finally + { + item.Cost = DateTime.Now - runAt; + item.IsBusy = false; + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenAesKeyViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenAesKeyViewModel.cs new file mode 100644 index 0000000..40f253a --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenAesKeyViewModel.cs @@ -0,0 +1,57 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace LuYao.Toolkit.Channels.Gens; + +public partial class GenAesKeyViewModel : ViewModelBase +{ + public GenAesKeyViewModel() + { + this.LoadKeys(); + if (this.Keys.Count > 0) Gen(this.Keys.First()); + } + + [ObservableProperty] + private string _result; + public IReadOnlyCollection Keys { get; private set; } + private void LoadKeys() + { + var keys = new SortedSet(); + using (var aes = Aes.Create()) + { + foreach (var size in aes.LegalKeySizes) + { + for (int i = size.MinSize; i <= size.MaxSize; i += size.SkipSize) + { + if (keys.Contains(i)) + { + continue; + } + keys.Add(i); + } + } + } + Keys = keys; + } + [RelayCommand] + private void Gen(object len) => this.Result = GenerateAesKey(Convert.ToInt32(len)); + [RelayCommand] + private void Copy() + { + Services.ClipboardService.CopyText(this.Result); + } + private static string GenerateAesKey(int len) + { + using (var aes = Aes.Create()) + { + aes.KeySize = len; + aes.GenerateKey(); + return Convert.ToBase64String(aes.Key); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenGuidViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenGuidViewModel.cs new file mode 100644 index 0000000..f8505c9 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenGuidViewModel.cs @@ -0,0 +1,79 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Channels.Gens; + +public partial class GenGuidViewModel : ViewModelBase +{ + [INotifyPropertyChanged] + public partial class GuidFormat + { + public GuidFormat(string name, Func format) + { + this.Name = name; + this.Formater = format; + } + public string Name { get; } + public Func Formater { get; } + [ObservableProperty] + private bool _isSelected; + } + private Guid _guid = Guid.Empty; + [ObservableProperty] + [ViewStates.WatchViewState(nameof(SelectedIndex))] + private int _selectedIndex; + public List Formats { get; } + [ObservableProperty] + private string _result; + public GenGuidViewModel() + { + this.Formats = new List + { + new GuidFormat("小写带横线", x => x.ToString("D").ToLowerInvariant()), + new GuidFormat("大写带横线", x => x.ToString("D").ToUpperInvariant()), + new GuidFormat("小写无横线", x => x.ToString("N").ToLowerInvariant()), + new GuidFormat("大写无横线", x => x.ToString("N").ToUpperInvariant()), + new GuidFormat("注册表格式", x => x.ToString("B")), + new GuidFormat("[GUID(\"xxxxxxx-xxxx ... xxxx\")]", x => $"[GUID(\"{x.ToString("D")}\")]"), + new GuidFormat("", x => $""), + new GuidFormat("Guid.Parse(\"xxxxxxx-xxxx ... xxxx\")", x => $"Guid.Parse(\"{x.ToString("D")}\")"), + new GuidFormat("BASE64",x=>Convert.ToBase64String(x.ToByteArray())) + }; + if (this.SelectedIndex >= this.Formats.Count) + { + this.SelectedIndex = 0; + } + this.Formats[this.SelectedIndex].IsSelected = true; + this.Gen(); + } + [RelayCommand] + private void Select(GuidFormat fmt) + { + for (int i = 0; i < this.Formats.Count; i++) + { + var item = this.Formats[i]; + if (item == fmt) + { + item.IsSelected = true; + this.SelectedIndex = i; + this.Result = item.Formater(this._guid); + } + else + { + item.IsSelected = false; + } + } + } + [RelayCommand] + private void Gen() + { + this._guid = Guid.NewGuid(); + var fmt = this.Formats.Find(i => i.IsSelected) ?? this.Formats[0]; + this.Result = fmt.Formater(this._guid); + } + [RelayCommand] + private void Copy() => Services.ClipboardService.CopyText(this.Result); +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenLinesByRangeViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenLinesByRangeViewModel.cs new file mode 100644 index 0000000..ccbcee8 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenLinesByRangeViewModel.cs @@ -0,0 +1,60 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System.Text; + +namespace LuYao.Toolkit.Channels.Gens; + +public partial class GenLinesByRangeViewModel : ViewModelBase +{ + public GenLinesByRangeViewModel() => this.Execute(); + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Min))] + private int min = 1000; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Max))] + private int max = 1024; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Template))] + private string template = "http://www.baidu.com/s?w=${id}"; + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(CopyCommand))] + private string output; + + partial void OnMinChanged(int value) + { + this.Execute(); + } + partial void OnMaxChanged(int value) + { + this.Execute(); + } + partial void OnTemplateChanged(string value) + { + this.Execute(); + } + + void Execute() + { + if (string.IsNullOrWhiteSpace(this.Template)) + { + this.Output = string.Empty; + return; + } + var sb = new StringBuilder(); + for (int i = this.Min; i <= this.Max; i++) + { + sb.Append(this.Template.Replace("${id}", i.ToString())); + sb.AppendLine(); + } + this.Output = sb.ToString(); + } + private bool CanCopy => !string.IsNullOrWhiteSpace(Output); + [RelayCommand(CanExecute = nameof(CanCopy))] + private void Copy() + { + Services.ClipboardService.CopyText(this.Output); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenPasswordViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenPasswordViewModel.cs new file mode 100644 index 0000000..bd0184d --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenPasswordViewModel.cs @@ -0,0 +1,75 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Security; +using LuYao.Toolkit.ViewStates; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace LuYao.Toolkit.Channels.Gens; + +public partial class GenPasswordViewModel : ViewModelBase +{ + public GenPasswordViewModel() => Gen(); + + [ObservableProperty] + [WatchViewState(nameof(UseUpperCase))] + private bool useUpperCase = true; + [ObservableProperty] + [WatchViewState(nameof(UseNumber))] + private bool useNumber = true; + [ObservableProperty] + [WatchViewState(nameof(UseSymbols))] + private bool useSymbols = false; + [ObservableProperty] + [WatchViewState(nameof(Length))] + private int length = 10; + [ObservableProperty] + [WatchViewState(nameof(EasyToRead))] + private bool easyToRead = true; + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(Score))] + [NotifyCanExecuteChangedFor(nameof(GenCommand))] + private string result = string.Empty; + public PasswordScore Score => PasswordAdvisor.CheckStrength(this.result); + private StringBuilder builder = new StringBuilder(); + private static readonly Random Rnd = new Random(); + private static char[] Fallibility = new char[] { '0', 'o', 'O' }; + [RelayCommand] + private void Gen() + { + builder.Clear(); + var pool = new List { }; + pool.AddRange("abcdefghijklmnopqrstuvwxyz"); + if (useUpperCase) pool.AddRange("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + if (useNumber) pool.AddRange("0123456789"); + if (useSymbols) pool.AddRange("!#$%&*@^"); + if (easyToRead) pool.RemoveAll(x => Array.IndexOf(Fallibility, x) >= 0); + + for (int i = 0; i < length; i++) + { + var next = Rnd.Next(0, pool.Count); + builder.Append(pool[next]); + } + + Result = builder.ToString(); + } + [RelayCommand(CanExecute = nameof(CanCopy))] + private void Copy() => Services.ClipboardService.CopyText(this.Result); + private bool CanCopy => !string.IsNullOrWhiteSpace(this.Result); + protected override void OnPropertyChanged(PropertyChangedEventArgs e) + { + base.OnPropertyChanged(e); + switch (e.PropertyName) + { + case nameof(UseUpperCase): + case nameof(UseNumber): + case nameof(UseSymbols): + case nameof(Length): + case nameof(EasyToRead): + this.Gen(); + break; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenRsaKeyViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenRsaKeyViewModel.cs new file mode 100644 index 0000000..8082eb0 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenRsaKeyViewModel.cs @@ -0,0 +1,54 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Security.Cryptography; + +namespace LuYao.Toolkit.Channels.Gens; +public partial class GenRsaKeyViewModel : ViewModelBase +{ + public IReadOnlyCollection KeySizes { get; } = new SortedSet { 512, 1024, 2048, 4096 }; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(KeySize))] + private int _keySize = 1024; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(KeyFormat))] + private RsaKeyFormat _keyFormat = RsaKeyFormat.PKCS8; + + [ObservableProperty] + private string _privateKey; + [ObservableProperty] + private string _publicKey; + [RelayCommand] + private void Gen() + { + using (var rsa = RSA.Create(this.KeySize)) + { + var publicKey = rsa.ExportRSAPublicKey(); + this.PublicKey = Convert.ToBase64String(publicKey); + switch (this.KeyFormat) + { + case RsaKeyFormat.PKCS8: + this.PrivateKey = Convert.ToBase64String(rsa.ExportPkcs8PrivateKey()); + break; + case RsaKeyFormat.PKCS1: + this.PrivateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey()); + break; + case RsaKeyFormat.XML: + this.PrivateKey = rsa.ToXmlString(true); + this.PublicKey = rsa.ToXmlString(false); + break; + default: + this.PrivateKey = String.Empty; + break; + } + } + } + [RelayCommand] + private void Copy(string text) + { + Services.ClipboardService.CopyText(text); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/GenXCodeEntityViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/GenXCodeEntityViewModel.cs new file mode 100644 index 0000000..6e990dd --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/GenXCodeEntityViewModel.cs @@ -0,0 +1,117 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Services; +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using XCode.Code; +using XCode.DataAccessLayer; + +namespace LuYao.Toolkit.Channels.Gens; + +public partial class GenXCodeEntityViewModel : ViewModelBase +{ + [ObservableProperty] + private bool _fixModelFile = true; + [ObservableProperty] + private bool _chineseFileName = false; + [ObservableProperty] + [ViewStates.WatchViewState(nameof(XmlFileName))] + private string _xmlFileName; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(AutoFillDescription))] + private bool _autoFillDescription = false; + [ObservableProperty] + [ViewStates.WatchViewState(nameof(AutoFillToChinese))] + private bool _autoFillToChinese = false; + + [ObservableProperty] + private IList _tables; + [ObservableProperty] + private string _output; + + [RelayCommand] + private async Task Gen() + { + try + { + if (string.IsNullOrWhiteSpace(this.XmlFileName)) throw new Exception("XML 文件不能为空"); + if (!File.Exists(this.XmlFileName)) throw new Exception("XML 文件不存在"); + var sb = new StringBuilder(); + using (CreateLogger(sb)) + { + EntityBuilder.Debug = true; + ClassBuilder.Debug = true; + PathHelper.BasePath = Path.GetDirectoryName(this.XmlFileName); + var options = new BuilderOption { }; + var tables = ClassBuilder.LoadModels(this.XmlFileName, options, out var attrs); + if (this.AutoFillDescription) + { + foreach (var table in tables) + { + var cols = table.Columns.Where(i => String.IsNullOrWhiteSpace(i.Description)).ToList(); + if (cols.Count <= 0) continue; + if (this.AutoFillToChinese) + { + var names = cols.Select(i => i.Name).ToList(); + var values = await GoogleService.Translate("auto", "zh-cn", names); + for (int f = 0; f < values.Lines.Count; f++) + { + cols[f].Description = values.Lines[f]; + } + } + else + { + foreach (var col in cols) + { + col.Description = col.Name; + } + } + } + } + if (this.FixModelFile) EntityBuilder.FixModelFile(this.XmlFileName, options, attrs, tables); + if (string.IsNullOrWhiteSpace(options.Output)) + { + options.Output = Path.GetDirectoryName(this.XmlFileName); + } + else + { + options.Output = Path.Combine(Path.GetDirectoryName(this.XmlFileName), options.Output); + } + var i = EntityBuilder.BuildTables(tables, options, this.ChineseFileName); + sb.AppendLine($"生成成功,共 {i} 个。"); + this.Tables = tables; + Output = sb.ToString(); + } + } + catch (Exception e) + { + Tables = null; + Output = e.Message; + } + } + private IDisposable CreateLogger(StringBuilder sb) + { + var logger = XTrace.Log; + var next = new CompositeLog(logger, new ActionLog((fmt, arg) => + { + if (arg is { Length: > 0 }) + { + sb.AppendFormat(fmt, arg); + } + else + { + sb.Append(fmt); + } + sb.AppendLine(); + })); + XTrace.Log = next; + return new DisposeAction(() => { XTrace.Log = logger; }); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Gens/RsaKeyFormat.cs b/LuYao.Toolkit.ViewModels/Channels/Gens/RsaKeyFormat.cs new file mode 100644 index 0000000..3e33944 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Gens/RsaKeyFormat.cs @@ -0,0 +1,3 @@ +namespace LuYao.Toolkit.Channels.Gens; + +public enum RsaKeyFormat { PKCS8, PKCS1, XML } diff --git a/LuYao.Toolkit.ViewModels/Channels/Images/Base64ToImageViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Images/Base64ToImageViewModel.cs new file mode 100644 index 0000000..90a2833 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Images/Base64ToImageViewModel.cs @@ -0,0 +1,81 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ImageMagick; +using LuYao.Toolkit.IO; +using System; +using System.IO; +using System.Text.RegularExpressions; + +namespace LuYao.Toolkit.Channels.Images; + +public partial class Base64ToImageViewModel : ViewModelBase +{ + private static Regex DataRegex = new Regex("^data:(?[\\w/]+);base64,(?[0-9a-zA-Z/+=]+)$", RegexOptions.Compiled);//表达式对象 + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ConvertCommand))] + [NotifyCanExecuteChangedFor(nameof(ClearCommand))] + private string _input; + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(SaveCommand))] + private string _output = string.Empty; + + private IMagickFormatInfo _format = null; + + private bool CanConvert() => !string.IsNullOrWhiteSpace(this.Input); + [RelayCommand(CanExecute = nameof(CanConvert))] + private void Convert() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + this._format = null; + return; + } + var m = DataRegex.Match(this.Input); + if (m.Success == false) return; + var data = m.Groups["data"].Value; + var bytes = System.Convert.FromBase64String(data); + var fmt = ImageMagick.MagickFormatInfo.Create(bytes); + if (fmt == null) throw new System.Exception("图片格式不正确!"); + this._format = fmt; + var tmp = TempHelper.GetTempFileName(); + File.WriteAllBytes(tmp, bytes); + this.Output = tmp; + } + + private bool CanClear() => !string.IsNullOrWhiteSpace(this.Input); + [RelayCommand(CanExecute = nameof(CanClear))] + private void Clear() + { + this.Input = string.Empty; + this.Output = string.Empty; + } + + [RelayCommand] + private void Paste() + { + var txt = Services.ClipboardService.GetText(); + if (string.IsNullOrWhiteSpace(txt)) return; + this.Input = txt; + this.Convert(); + } + + private bool CanSave() => !string.IsNullOrWhiteSpace(this.Output); + [RelayCommand(CanExecute = nameof(CanSave))] + private void Save() + { + if (string.IsNullOrWhiteSpace(this.Output) || !File.Exists(this.Output) || this._format == null) return; + var ext = this._format.Format.ToString().ToLower(); + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.Filter = $"图片|*.{ext}"; + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + dialog.AddExtension = true; + dialog.Title = "保存图片"; + if (!dialog.ShowDialog()) return; + var fn = dialog.FileName; + if (string.IsNullOrWhiteSpace(Path.GetExtension(fn))) fn += "." + ext; + File.Copy(this.Output, fn, true); + Services.NotifyService.Success("图片保存成功"); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Images/GifSplitterViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Images/GifSplitterViewModel.cs new file mode 100644 index 0000000..8848f1a --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Images/GifSplitterViewModel.cs @@ -0,0 +1,108 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ImageMagick; +using LuYao.Toolkit.IO; +using NewLife.Log; +using System; +using System.Collections.ObjectModel; +using System.IO; +using System.IO.Compression; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Images; + +public partial class GifSplitterViewModel : ViewModelBase +{ + public record Frame(int Index, string FileName) : IDisposable + { + public void Dispose() + { + if (File.Exists(this.FileName)) return; + File.Delete(this.FileName); + } + } + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ClearCommand))] + [NotifyCanExecuteChangedFor(nameof(ExportCommand))] + private string _origin; + + + [ObservableProperty] + private ObservableCollection _frames = new ObservableCollection(); + + [RelayCommand] + private async Task OpenFile() + { + var dialog = Services.FileDialogService.CreateOpenFileDialog(); + dialog.Title = "打开 Gif 图片"; + dialog.Filter = "GIF|*.gif"; + dialog.Multiselect = false; + if (!dialog.ShowDialog()) return; + var fn = dialog.FileName; + var ext = MagickFormatInfo.Create(fn); + if (ext == null) throw new Exception("图片格式识别失败,请确认图片文件是否正确"); + if (ext.IsMultiFrame == false) throw new Exception("选择文件不是动画图片。"); + using var _ = this.Busy(); + this.Origin = fn; + using (var collection = new MagickImageCollection(fn)) + { + if (this.Frames.Count > 0) foreach (var frame in this.Frames) frame.Dispose(); + this.Frames.Clear(); + collection.Coalesce(); + for (int i = 0; i < collection.Count; i++) + { + IMagickImage item = collection[i]; + var tmp = TempHelper.GetTempFileName(); + await Task.Run(() => { item.Write(tmp, MagickFormat.Png); }); + Frames.Add(new Frame(i, tmp)); + } + } + } + private bool CanClear() => !string.IsNullOrWhiteSpace(this.Origin); + + [RelayCommand(CanExecute = nameof(CanClear))] + private void Clear() + { + this.Origin = String.Empty; + this.Frames.Clear(); + } + + [RelayCommand] + private void Save(Frame frame) + { + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.Title = "保存图片帧"; + dialog.Filter = "PNG|*.png"; + dialog.AddExtension = true; + dialog.FileName = Path.GetFileNameWithoutExtension(this.Origin) + "_" + frame.Index + ".png"; + if (!dialog.ShowDialog()) return; + var fn = dialog.FileName; + if (string.IsNullOrWhiteSpace(Path.GetExtension(fn))) fn += ".png"; + File.Copy(frame.FileName, fn, true); + Services.NotifyService.Success("保存成功!"); + } + + private bool CanExport() => !string.IsNullOrWhiteSpace(this.Origin); + + [RelayCommand(CanExecute = nameof(CanExport))] + private void Export() + { + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.Title = "导出所有帧"; + dialog.Filter = "压缩文件|*.zip"; + dialog.AddExtension = true; + dialog.FileName = Path.GetFileNameWithoutExtension(this.Origin) + ".zip"; + if (!dialog.ShowDialog()) return; + var fn = dialog.FileName; + if (string.IsNullOrWhiteSpace(Path.GetExtension(fn))) fn += ".zip"; + if (File.Exists(fn)) File.Delete(fn); + using (var zip = ZipFile.Open(fn, ZipArchiveMode.Create)) + { + foreach (var item in this.Frames) + { + zip.CreateEntryFromFile(item.FileName, $"{Path.GetFileNameWithoutExtension(this.Origin)}_{item.Index}.png"); + } + } + Services.NotifyService.Success("保存成功!"); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Images/ImageToBase64ViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Images/ImageToBase64ViewModel.cs new file mode 100644 index 0000000..02445ea --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Images/ImageToBase64ViewModel.cs @@ -0,0 +1,112 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ImageMagick; +using LuYao.Toolkit.IO; +using LuYao.Toolkit.Services; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.IO; + +namespace LuYao.Toolkit.Channels.Images; + +public partial class ImageToBase64ViewModel : ViewModelBase, IFileDragDropTarget +{ + public record OutputFormat(string Title, Func Format); + public partial class OutputLine + { + public OutputLine(string title, string content) + { + this.Title = title; + this.Content = content; + } + public string Title { get; } + public string Content { get; } + [RelayCommand] + private void Copy() + { + ClipboardService.CopyText(this.Content); + } + } + + private static OutputFormat[] Formats = new OutputFormat[] + { + new OutputFormat("Base64:",static(fmt,str) => $"data:{fmt.MimeType};base64,{str}"), + new OutputFormat("CSS:",static(fmt,str) => $"background-image: url(data:{fmt.MimeType};base64,{str});"), + new OutputFormat("HTML:",static(fmt,str) => $""), + }; + + public void OnFilesDropped(string group, string[] filepaths) + { + if (filepaths is { Length: > 0 }) SetImage(filepaths[0]); + } + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ClearCommand))] + private string _origin = string.Empty; + + partial void OnOriginChanged(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + this.Preview = null; + } + else if (File.Exists(value)) + { + var tmp = TempHelper.GetTempFileName(); + File.Copy(value, tmp, true); + this.Preview = tmp; + } + else + { + this.Preview = value; + } + } + + [ObservableProperty] + private string _preview = null; + + + public ObservableCollection Outputs { get; } = new ObservableCollection(); + + [RelayCommand] + private void OpenFile() + { + var dialog = FileDialogService.CreateOpenFileDialog(); + dialog.Title = "打开图片"; + dialog.Filter = "图片文件|*.jpg;*.png;*.bmp;*.gif;*.webp|所有文件|*.*"; + dialog.Multiselect = false; + if (!dialog.ShowDialog()) return; + var fn = dialog.FileName; + SetImage(fn); + } + private void SetImage(string filename) + { + this.Outputs.Clear(); + if (string.IsNullOrWhiteSpace(filename)) return; + if (!File.Exists(filename)) throw new Exception("原图不存在!"); + var bytes = File.ReadAllBytes(filename); + var fmt = MagickFormatInfo.Create(bytes); + if (fmt == null) throw new Exception("原图加载失败,可能是格式不正确!"); + this.Origin = filename; + var data = File.ReadAllBytes(this.Origin); + var str = Convert.ToBase64String(data); + foreach (var outputFormat in Formats) this.Outputs.Add(new OutputLine(outputFormat.Title, outputFormat.Format(fmt, str))); + } + + private bool CanClear() => !string.IsNullOrWhiteSpace(this.Origin); + [RelayCommand(CanExecute = nameof(CanClear))] + private void Clear() + { + this.Origin = string.Empty; + this.Outputs.Clear(); + } + + [RelayCommand] + private void Paste() + { + var img = ClipboardService.GetImage(); + if (string.IsNullOrWhiteSpace(img)) return; + this.SetImage(img); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Images/ImageToIconViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Images/ImageToIconViewModel.cs new file mode 100644 index 0000000..09a7eed --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Images/ImageToIconViewModel.cs @@ -0,0 +1,88 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ImageMagick; +using LuYao.Toolkit.Drawing; +using LuYao.Toolkit.IO; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; + +namespace LuYao.Toolkit.Channels.Images; + +public partial class ImageToIconViewModel : ViewModelBase +{ + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand))] + private string fileName; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X16))] private bool _x16 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X24))] private bool _x24 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X32))] private bool _x32 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X48))] private bool _x48 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X64))] private bool _x64 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X96))] private bool _x96 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X128))] private bool _x128 = true; + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(ConvertCommand)), ViewStates.WatchViewState(nameof(X256))] private bool _x256 = true; + + private bool CanConvert() + { + if (string.IsNullOrWhiteSpace(this.FileName)) return false; + var width = GetWidth(); + if (width.Count <= 0) return false; + return true; + } + + private List GetWidth() + { + var ret = new List(); + + if (this.X16) ret.Add(16); + if (this.X24) ret.Add(24); + if (this.X32) ret.Add(32); + if (this.X48) ret.Add(48); + if (this.X64) ret.Add(64); + if (this.X96) ret.Add(96); + if (this.X128) ret.Add(128); + if (this.X256) ret.Add(256); + + return ret; + } + + [RelayCommand(CanExecute = nameof(CanConvert))] + private void Convert() + { + var widths = GetWidth(); + var dialog = Services.FileDialogService.CreateSaveFileDialog(); + dialog.Title = "保存图标"; + dialog.Filter = "图标|*.ico"; + dialog.FileName = Path.GetFileNameWithoutExtension(this.FileName) + ".ico"; + dialog.InitialDirectory = Path.GetDirectoryName(this.FileName); + dialog.DefaultExt = ".ico"; + if (dialog.ShowDialog()) + { + widths.Reverse(); + var files = new List(); + foreach (var w in widths) + { + var tmp = TempHelper.GetTempFileName() + ".png"; + using (var img = new MagickImage(this.FileName)) + { + img.Strip(); + img.Resize(w, w); + img.BackgroundColor = MagickColors.Transparent; + img.Format = MagickFormat.Png32; + img.Write(tmp); + } + files.Add(tmp); + } + if (files.Count > 0) + { + var images = files.Select(Image.FromFile).ToList(); + using (var fs = File.OpenWrite(dialog.FileName)) IconFactory.SavePngsAsIcon(images, fs); + images.ForEach(i => i.Dispose()); + files.ForEach(File.Delete); + Services.NotifyService.Success("图标转换成功"); + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/HttpProxyCheckerViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/HttpProxyCheckerViewModel.cs new file mode 100644 index 0000000..204afee --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/HttpProxyCheckerViewModel.cs @@ -0,0 +1,121 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Diagnostics; +using System.Net; +using System.Net.Http; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Networks +{ + public partial class HttpProxyCheckerViewModel : ViewModelBase + { + public enum ResponseStatus + { + Ready, + Running, + OK, + Fail + } + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(GetCommand))] + [ViewStates.WatchViewState(nameof(Host))] + private string _host = "127.0.0.1"; + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(GetCommand))] + [ViewStates.WatchViewState(nameof(Port))] + private int _port = 10809; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Username))] + private string _username; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Password))] + private string _password; + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(GetCommand))] + [ViewStates.WatchViewState(nameof(RequestUrl))] + private string _requestUrl = "https://www.coderbusy.com"; + + [ObservableProperty] + private ResponseStatus _status = ResponseStatus.Ready; + + [ObservableProperty] + private Exception _exception; + + [ObservableProperty] + private HttpResponseMessage _response; + + [ObservableProperty] + private string _responseText; + + [ObservableProperty] + private TimeSpan _cost = TimeSpan.Zero; + + + private bool CanGet() + { + if (string.IsNullOrWhiteSpace(this.Host)) return false; + if (this.Port < 1 && this.Port > 65535) return false; + if (string.IsNullOrWhiteSpace(this.RequestUrl)) return false; + if (!Uri.TryCreate(this.RequestUrl, UriKind.Absolute, out _)) return false; + return true; + } + + [RelayCommand(CanExecute = nameof(CanGet))] + private async Task Get() + { + using var _ = this.Busy(); + var sw = new Stopwatch(); + try + { + this.Status = ResponseStatus.Running; + var proxy = new WebProxy(this.Host, this.Port); + if (!string.IsNullOrWhiteSpace(this.Username)) proxy.Credentials = new NetworkCredential(this.Username, this.Password); + using var handler = new SocketsHttpHandler() + { + UseProxy = true, + Proxy = proxy, + AutomaticDecompression = DecompressionMethods.All, + SslOptions = new SslClientAuthenticationOptions + { + RemoteCertificateValidationCallback = this.RemoteCertificateValidationCallback, + }, + ConnectTimeout = TimeSpan.FromSeconds(10), + PooledConnectionLifetime = TimeSpan.FromSeconds(1000), + }; + using var http = new HttpClient(handler, true); + using var request = new HttpRequestMessage(HttpMethod.Get, this.RequestUrl); + request.AddCommonHeader(); + sw.Start(); + var response = await http.SendAsync(request); + var html = await response.ReadAsHtmlAsync(); + sw.Stop(); + this.Response = response; + this.ResponseText = html; + this.Status = ResponseStatus.OK; + } + catch (Exception e) + { + this.Exception = e; + this.Status = ResponseStatus.Fail; + } + finally + { + if (sw.IsRunning) sw.Stop(); + this.Cost = sw.Elapsed; + } + } + + private bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/IPLookupViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/IPLookupViewModel.cs new file mode 100644 index 0000000..c048e66 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/IPLookupViewModel.cs @@ -0,0 +1,362 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Net; +using NewLife; +using NewLife.Serialization; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class IPLookupViewModel : ViewModelBase +{ + [ObservableObject] + public partial class IPLookupProvider + { + public IPLookupProvider(string name, Func> handler) + { + this.Name = name; + this.handler = handler; + } + [ObservableProperty] + private string name; + + [ObservableProperty] + private string result = string.Empty; + [ObservableProperty] + private string _IP = string.Empty; + private Func> handler; + public async Task Execute(string ip, CancellationToken cancellationToken) + { + this.IP = string.Empty; + this.Result = string.Empty; + if (string.IsNullOrWhiteSpace(ip)) return; + try + { + this.Result = "查询中"; + this.IP = ip; + var result = await this.handler(ip, cancellationToken); + if (this.IP == ip) Result = result; + } + catch (Exception ex) + { + if (this.IP == ip) Result = $"查询异常:{ex.Message}"; + } + } + } + + public IReadOnlyCollection Providers { get; } + public IPLookupViewModel() + { + this.Providers = new List + { + new IPLookupProvider("码农很忙",IPLookupPHandler), + new IPLookupProvider("淘宝", TaoBaoQueryHandler), + new IPLookupProvider("百度地图", BaiduLbsQueryHandler), + new IPLookupProvider("腾讯地图", TencentLbsQueryHandler), + new IPLookupProvider("高德地图", AmapQueryHandler), + new IPLookupProvider("太平洋电脑网", PcOnlineQueryHandler) + }; + } + + + private string _ipAddress; + public string IPAddress + { + get => this._ipAddress; + set + { + if (SetProperty(ref this._ipAddress, value)) this.QueryCommand.NotifyCanExecuteChanged(); + } + } + private CancellationTokenSource CancellationTokenSource; + [RelayCommand(CanExecute = nameof(CanQuery))] + private async Task Query() + { + if (string.IsNullOrWhiteSpace(this.IPAddress)) return; + if (this.CancellationTokenSource != null) + { + this.CancellationTokenSource.Cancel(); + this.CancellationTokenSource = null; + } + using (this.Busy()) + { + var tasks = new List(); + this.CancellationTokenSource = new CancellationTokenSource(); + foreach (var provider in this.Providers) tasks.Add(provider.Execute(this.IPAddress, this.CancellationTokenSource.Token)); + await Task.WhenAll(tasks); + } + } + private bool CanQuery() + { + if (string.IsNullOrWhiteSpace(this.IPAddress)) return false; + string[] splitValues = this.IPAddress.Split('.'); + if (splitValues.Length != 4) return false; + if (!System.Net.IPAddress.TryParse(this.IPAddress, out _)) return false; + return true; + } + private static HttpClient HttpClient = new HttpClient(); + [RelayCommand] + private async Task GetLocale() + { + using (var response = await HttpClient.GetAsync("https://ipv4.gdt.qq.com/get_client_ip")) + { + var str = await response.Content.ReadAsStringAsync(); + if (System.Net.IPAddress.TryParse(str, out var ip)) + { + this.IPAddress = ip.ToString(); + await Query(); + } + } + } + + #region 太平洋电脑网 + + private async Task PcOnlineQueryHandler(string ip, CancellationToken cancellationToken) + { + var url = $"http://whois.pconline.com.cn/ip.jsp?ip={ip}"; + var str = await HttpClient.GetStringAsync(url, cancellationToken); + return str.Trim(); + } + + #endregion + + #region 淘宝 + + public class TaoBaoResponse + { + [XmlElement("code")] public int Code { get; set; } + + [XmlElement("data")] public TaoBaoData Data { get; set; } + [XmlElement("msg")] public string Message { get; set; } + + public class TaoBaoData + { + [XmlElement("country")] public string Country { get; set; } + + [XmlElement("country_id")] public string CountryId { get; set; } + + [XmlElement("area")] public string Area { get; set; } + + [XmlElement("area_id")] public string AreaId { get; set; } + + [XmlElement("region")] public string Region { get; set; } + + [XmlElement("region_id")] public string RegionId { get; set; } + + [XmlElement("city")] public string City { get; set; } + + [XmlElement("city_id")] public string CityId { get; set; } + + [XmlElement("county")] public string County { get; set; } + + [XmlElement("county_id")] public string CountyId { get; set; } + + [XmlElement("isp")] public string Isp { get; set; } + + [XmlElement("isp_id")] public string IspId { get; set; } + + [XmlElement("ip")] public string Ip { get; set; } + } + } + + private async Task TaoBaoQueryHandler(string ip, CancellationToken cancellationToken) + { + var url = $"http://ip.taobao.com/outGetIpInfo?ip={ip}&accessKey=alibaba-inc"; + var json = await HttpClient.GetStringAsync(url, cancellationToken); + json = json + .Replace("xx", string.Empty) + .Replace("XX", string.Empty); + + var r = json.ToJsonEntity(); + if (r.Code == 0) + { + var data = r.Data; + var list = new List + { + data.Country, + data.Region, + data.City, + data.Isp + }; + list.RemoveAll(string.IsNullOrWhiteSpace); + return list.Join(" "); + } + + return r.Message; + } + + #endregion + + #region 高德地图 + + public class AmapResponse + { + [XmlElement("status")] public int Status { get; set; } + + [XmlElement("info")] public string Info { get; set; } + + [XmlElement("infocode")] public string Infocode { get; set; } + + [XmlElement("country")] public string Country { get; set; } + + [XmlElement("province")] public string Province { get; set; } + + [XmlElement("city")] public string City { get; set; } + + [XmlElement("district")] public string District { get; set; } + + [XmlElement("isp")] public string Isp { get; set; } + + [XmlElement("location")] public string Location { get; set; } + + [XmlElement("ip")] public string Ip { get; set; } + + public override string ToString() + { + if (Status != 1) + { + return Info; + } + + var list = new List + { + Country, + Province, + City, + District, + Isp + }; + list.RemoveAll(string.IsNullOrWhiteSpace); + return list.Join(" "); + } + } + + private async Task AmapQueryHandler(string ip, CancellationToken cancellationToken) + { + var key = "0f48c54461148ea1e670b676cbd1700b"; + var url = $"https://restapi.amap.com/v5/ip?key={key}&ip={ip}&type=4"; + var json = await HttpClient.GetStringAsync(url, cancellationToken); + var obj = json.ToJsonEntity(); + return obj.ToString(); + } + + #endregion + + #region 百度地图 + + public class BaiduResponse + { + [XmlElement("address")] public string Address { get; set; } + + [XmlElement("status")] public int Status { get; set; } + + [XmlElement("message")] public string Message { get; set; } + } + + private async Task BaiduLbsQueryHandler(string ip, CancellationToken cancellationToken) + { + const string ak = "yBaSv2qHR4r540yBDWGPpC1bLZYK17ni"; + var url = $"http://api.map.baidu.com/location/ip?ak={ak}&ip={ip}"; + var json = await HttpClient.GetStringAsync(url, cancellationToken); + var obj = json.ToJsonEntity(); + if (obj.Status != 0) + { + return obj.Message; + } + + return obj.Address; + } + + #endregion + + #region 腾讯地图 + + public partial class TencentLbsResponse + { + public class Location2 + { + [XmlElement("lat")] public double Lat { get; set; } + + [XmlElement("lng")] public double Lng { get; set; } + } + } + + public partial class TencentLbsResponse + { + public class AdInfo + { + [XmlElement("nation")] public string Nation { get; set; } + + [XmlElement("province")] public string Province { get; set; } + + [XmlElement("city")] public string City { get; set; } + + [XmlElement("district")] public string District { get; set; } + + [XmlElement("adcode")] public int AdCode { get; set; } + } + } + + public partial class TencentLbsResponse + { + public class Result2 + { + [XmlElement("ip")] public string Ip { get; set; } + + [XmlElement("location")] public Location2 Location { get; set; } + + [XmlElement("ad_info")] public AdInfo AdInfo { get; set; } + } + } + + public partial class TencentLbsResponse + { + [XmlElement("status")] public int Status { get; set; } + + [XmlElement("message")] public string Message { get; set; } + + [XmlElement("result")] public Result2 Result { get; set; } + + public override string ToString() + { + if (Status != 0) + { + return Message; + } + + var list = new List(); + if (Result != null && Result.AdInfo != null) + { + var info = Result.AdInfo; + list.Add(info.Nation); + list.Add(info.Province); + list.Add(info.City); + list.Add(info.District); + list.RemoveAll(string.IsNullOrWhiteSpace); + } + + return list.Join(" "); + } + } + + private async Task TencentLbsQueryHandler(string ip, CancellationToken cancellationToken) + { + var key = "TAOBZ-YQ3KU-R4NVU-BT4IA-2P2MF-RDBVJ"; + var url = $"https://apis.map.qq.com/ws/location/v1/ip?ip={ip}&key={key}"; + var json = await HttpClient.GetStringAsync(url, cancellationToken); + var e = json.ToJsonEntity(); + return e.ToString(); + } + + #endregion + + private static Task IPLookupPHandler(string ip, CancellationToken cancellationToken) + { + return Task.FromResult(IPLookup.Instance.Search(ip)); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/PingViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/PingViewModel.cs new file mode 100644 index 0000000..3429eb6 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/PingViewModel.cs @@ -0,0 +1,111 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class PingViewModel : ViewModelBase +{ + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(PingCommand))] + private string _input; + + + [ObservableProperty] + private string _output; + private bool CanPing => !string.IsNullOrWhiteSpace(this.Input); + + [RelayCommand(AllowConcurrentExecutions = false, CanExecute = nameof(CanPing))] + private async Task Ping() + { + var options = new PingOptions { DontFragment = true }; + const string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + byte[] buffer = Encoding.ASCII.GetBytes(data); + const int timeout = 1000 * 5; + var input = this.Input; + this.Output = String.Empty; + var sb = new StringBuilder(); + string ip = string.Empty; + var total = 0; + var times = new List(); + using (var sender = new Ping()) + { + for (int i = 0; i < 4; i++) + { + if (i > 0) await Task.Delay(TimeSpan.FromSeconds(1)); + try + { + if (string.IsNullOrWhiteSpace(ip)) + { + ip = await GetIPAddress(input); + if (ip != input) + { + sb.AppendLine($"正在 Ping {input} [{ip}] 具有 {buffer.Length} 字节的数据:"); + } + else + { + sb.AppendLine($"正在 Ping {input} 具有 {buffer.Length} 字节的数据:"); + } + } + var reply = await sender.SendPingAsync(ip, timeout, buffer, options); + if (reply.Status == IPStatus.Success) + { + sb.AppendLine($"来自 {reply.Address} 的回复: 字节={reply.Buffer.Length} 时间={reply.RoundtripTime}ms TTL={reply.Options.Ttl}"); + times.Add(reply.RoundtripTime); + } + else + { + sb.AppendLine(reply.Status.ToString()); + } + } + catch (Exception e) + { + sb.AppendLine(GetMessage(e)); + break; + } + finally + { + this.Output = sb.ToString(); + total++; + } + } + } + if (!string.IsNullOrWhiteSpace(ip)) + { + sb.AppendLine(); + sb.AppendFormat("{0} 的 Ping 统计信息:", ip); + sb.AppendLine(); + sb.AppendFormat( + " 数据包: 已发送 = {0},已接收 = {1},丢失 = {2} ({3:0.##%} 丢失),", + total, + times.Count, + total - times.Count, + 1d * (total - times.Count) / total + ); + sb.AppendLine(); + if (times.Count > 0) + { + sb.AppendLine("往返行程的估计时间(以毫秒为单位):"); + sb.AppendFormat(" 最短 = {0}ms,最长 = {1}ms,平均 = {2}ms", times.Min(), times.Max(), times.Average()); + sb.AppendLine(); + } + } + this.Output = sb.ToString(); + } + private async Task GetIPAddress(string host) + { + foreach (var item in await Dns.GetHostAddressesAsync(host)) return item.ToString(); + return "127.0.0.1"; + } + private static string GetMessage(Exception e) + { + while (e.InnerException != null) e = e.InnerException; + return e.Message; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/DetailViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/DetailViewModel.cs new file mode 100644 index 0000000..605a611 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/DetailViewModel.cs @@ -0,0 +1,175 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FluentValidation; +using LuYao.Toolkit.Entities; +using LuYao.Toolkit.Events; +using LuYao.Toolkit.PortProxy; +using LuYao.Toolkit.UI; +using NewLife; +using Prism.Events; +using Prism.Regions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy; + +public partial class DetailViewModel : DetailViewModelBase +{ + private IEventAggregator _eventAggregator; + + public DetailViewModel(IEventAggregator eventAggregator) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + _eventAggregator.GetEvent>().Subscribe(this.OnDelete); + } + + private void OnDelete(PortProxyRule obj) + { + if (this.IsNew) return; + if (obj.Id != this.Detail.Id) return; + this.MasterDetailViewModel.IsShowDetail = false; + } + + public override bool IsNavigationTarget(NavigationContext navigationContext) + { + return true; + } + + public override void OnNavigatedFrom(NavigationContext navigationContext) + { + } + + public override void OnNavigatedTo(NavigationContext navigationContext) + { + base.OnNavigatedTo(navigationContext); + if (navigationContext.Parameters.TryGetValue("Id", out var id)) + { + this.Id = id; + } + else + { + this.Id = 0; + } + this.Reload(); + } + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsNew))] + [NotifyCanExecuteChangedFor(nameof(RefreshCommand))] + private int _id; + public bool IsNew => Id == default; + + [ObservableProperty] + private PortProxyItem _detail; + + [ObservableProperty] + private IReadOnlyList _groups = new List(); + + [ObservableProperty] + private IReadOnlyList _connectTos = new List(); + + public IReadOnlyDictionary Types { get; } = new SortedDictionary + { + {"","(自动)" }, + {"v4tov4","v4tov4" }, + {"v4tov6","v4tov6" }, + {"v6tov4","v6tov4" }, + {"v6tov6","v6tov6" } + }; + + private void Reload() + { + this.Detail = new PortProxyItem + { + ListenOn = "*", + IsEnabled = true, + Type = string.Empty + }; + if (!this.IsNew) + { + var e = PortProxyRule.FindByKey(this.Id); + if (e == null) throw new Exception($"Id 为 {this.Id} 的数据不存在"); + this.Detail.Read(e); + } + + this.Groups = PortProxyRule.GetGroups(); + this.ConnectTos = PortProxyRule.GetConnectTos(); + } + private bool IsIPv6(string ip) + { + if (string.IsNullOrWhiteSpace(ip)) return false; + if (IPAddress.TryParse(ip, out var addr) == false) return false; + return addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6; + } + + private string GetPassType(string listenOn, string connectTo) + { + var from = IsIPv6(listenOn) ? "v6" : "v4"; + var to = IsIPv6(connectTo) ? "v6" : "v4"; + return $"{from}to{to}"; + } + + private bool CanRefresh() + { + return this.IsNew == false; + } + + [RelayCommand(CanExecute = nameof(CanRefresh))] + private void Refresh() + { + this.Reload(); + } + + [RelayCommand] + private void Save() + { + PortProxyItemValidator.Instance.ValidateAndThrow(this.Detail); + var isEnabled = true; + this.Detail.Type = GetPassType(this.Detail.ListenOn, this.Detail.ConnectTo); + var cmd = new List(); + PortProxyRule e; + if (this.IsNew) + { + e = new PortProxyRule { }; + } + else + { + e = PortProxyRule.FindByKeyForEdit(this.Id); + if (e == null) throw new Exception($"Id 为 {this.Id} 的数据不存在"); + cmd.Add(CmdUtil.GenDeleteProxyCommand(e)); + var sysProxies = CmdUtil.GetProxies(); + var find = false; + foreach (var item in sysProxies) + { + if (item.EqualsWithKeys(e)) + { + find = true; + break; + } + } + if (find == false) + { + isEnabled = false; + } + } + this.Detail.Write(e); + e.Save(); + cmd.Add(CmdUtil.GenAddOrUpdateProxyCommand(e)); + if (isEnabled && cmd.Count > 0) CmdRunner.Run(cmd); + if (this.IsNew) + { + this._eventAggregator.GetEvent>().Publish(e); + this.Id = e.Id; + } + else + { + this._eventAggregator.GetEvent>().Publish(e); + } + this.Reload(); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/IndexViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/IndexViewModel.cs new file mode 100644 index 0000000..a110d6d --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/IndexViewModel.cs @@ -0,0 +1,196 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Entities; +using LuYao.Toolkit.Events; +using LuYao.Toolkit.PortProxy; +using LuYao.Toolkit.Regions; +using LuYao.Toolkit.UI; +using LuYao.Toolkit.Views; +using Prism.Events; +using Prism.Regions; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows.Data; +using XCode; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy; +public partial class IndexViewModel : MasterDetailViewModelBase, INavigationAware, IMasterDetailViewModel +{ + private readonly IRegionManager _regionManager; + private readonly IEventAggregator _eventAggregator; + + public IndexViewModel(IRegionManager regionManager, IEventAggregator eventAggregator) + { + _regionManager = regionManager ?? throw new System.ArgumentNullException(nameof(regionManager)); + _eventAggregator = eventAggregator ?? throw new System.ArgumentNullException(nameof(eventAggregator)); + _eventAggregator.GetEvent>().Subscribe(this.OnPortProxyRuleAny); + _eventAggregator.GetEvent>().Subscribe(this.OnPortProxyRuleAny); + this.Reload(); + } + + private void OnPortProxyRuleAny(PortProxyRule obj) + { + this.Reload(); + } + + [ObservableProperty] + public ObservableCollection _proxies = new ObservableCollection(); + + [ObservableProperty] + private PortProxyItem _current; + + partial void OnCurrentChanged(PortProxyItem value) + { + if (value != null) + { + var p = CreateNavigationParameters(); + p.Add("Id", value.Id); + this.IsShowDetail = true; + this._regionManager.RequestNavigate(RegionNames.PortProxyDetailRegion, ViewNames.Channels.Networks.PortProxy.Detail, p); + } + } + protected override void OnHideDetail() + { + this.Current = null; + } + + [RelayCommand] + private void Create() + { + this.IsShowDetail = true; + var p = CreateNavigationParameters(); + this._regionManager.RequestNavigate(RegionNames.PortProxyDetailRegion, ViewNames.Channels.Networks.PortProxy.Detail, p); + } + + private void Reload() + { + var proxies = new ObservableCollection(); + var sysProxies = CmdUtil.GetProxies(); + var dbRules = PortProxyRule.FindAll(); + var groups = new SortedSet(); + foreach (var r in dbRules) + { + if (!string.IsNullOrWhiteSpace(r.GroupName)) { groups.Add(r.GroupName); } + var item = new PortProxyItem(); + item.Read(r); + var matched = sysProxies.FirstOrDefault(f => f.EqualsWithKeys(r)); + item.IsEnabled = matched != null; + proxies.Add(item); + } + if (groups.Count > 0) + { + var cvs = CollectionViewSource.GetDefaultView(proxies); + foreach (var item in proxies) + { + if (string.IsNullOrWhiteSpace(item.GroupName)) item.GroupName = "默认"; + } + cvs.GroupDescriptions.Add(new PropertyGroupDescription(nameof(PortProxyItem.GroupName))); + } + this.Proxies = proxies; + } + + [RelayCommand] + private void RefreshProxyList() + { + var proxies = CmdUtil.GetProxies(); + var rules = PortProxyRule.FindAll(); + foreach (var proxy in proxies) + { + var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy)); + if (matchedRule != null) proxy.Id = matchedRule.Id; + } + + var pendingAdds = proxies.Where(x => x.IsValid && x.Id == 0).ToList(); + if (pendingAdds.Count > 0) pendingAdds.Save(true); + + this.Reload(); + } + + public void OnNavigatedTo(NavigationContext navigationContext) + { + this.Reload(); + } + + public bool IsNavigationTarget(NavigationContext navigationContext) + { + return true; + } + + public void OnNavigatedFrom(NavigationContext navigationContext) + { + } + + + private IList Cast(IEnumerable items) + { + var set = new SortedSet(); + + foreach (PortProxyItem item in items) + { + if (item == null) continue; + set.Add(item.Id); + } + + return PortProxyRule.FindAllByIds(set); + } + + [RelayCommand] + private void Enable(IEnumerable arg) + { + var items = Cast(arg); + if (items.Count == 0) + { + Services.NotifyService.Warning("请先选择需要启用的转发规则!"); + return; + } + var cmds = new List(); + foreach (var item in items) + { + cmds.Add(CmdUtil.GenAddOrUpdateProxyCommand(item)); + } + CmdRunner.Run(cmds); + this.Reload(); + } + [RelayCommand] + private void Disable(IEnumerable arg) + { + var items = Cast(arg); + if (items.Count == 0) + { + Services.NotifyService.Warning("请先选择需要禁用的转发规则!"); + return; + } + var cmds = new List(); + foreach (var item in items) + { + cmds.Add(CmdUtil.GenDeleteProxyCommand(item)); + } + CmdRunner.Run(cmds); + this.Reload(); + } + [RelayCommand] + private void Delete(IEnumerable arg) + { + var items = Cast(arg); + if (items.Count == 0) + { + Services.NotifyService.Warning("请先选择需要删除的转发规则!"); + return; + } + var cmds = new List(); + foreach (var item in items) + { + cmds.Add(CmdUtil.GenDeleteProxyCommand(item)); + } + CmdRunner.Run(cmds); + var e = this._eventAggregator.GetEvent>(); + foreach (var item in items) + { + item.Delete(); + e.Publish(item); + } + this.Reload(); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItem.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItem.cs new file mode 100644 index 0000000..b85348b --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItem.cs @@ -0,0 +1,53 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Entities; +using System; +using System.Text.RegularExpressions; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy; + +public partial class PortProxyItem : ObservableObject +{ + [ObservableProperty] + private int id; + [ObservableProperty] + private string groupName; + [ObservableProperty] + private bool isEnabled; + [ObservableProperty] + private string type; + [ObservableProperty] + private string listenOn; + [ObservableProperty] + private string listenPort; + [ObservableProperty] + private string connectTo; + [ObservableProperty] + private string connectPort; + [ObservableProperty] + private string comment; + + public void Read(PortProxyRule rule) + { + this.Id = rule.Id; + this.GroupName = rule.GroupName; + this.Comment = rule.Comment; + this.Type = rule.Type; + this.ListenOn = rule.ListenOn; + this.ListenPort = rule.ListenPort; + this.ConnectTo = rule.ConnectTo; + this.ConnectPort = rule.ConnectPort; + + } + + public void Write(PortProxyRule rule) + { + if (rule.Id != this.Id) throw new ArgumentException(nameof(rule)); + rule.GroupName = this.GroupName; + rule.Comment = this.Comment; + rule.Type = this.Type; + rule.ListenOn = this.ListenOn; + rule.ListenPort = this.ListenPort; + rule.ConnectTo = this.ConnectTo; + rule.ConnectPort = this.ConnectPort; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItemValidator.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItemValidator.cs new file mode 100644 index 0000000..cbb14b6 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/PortProxy/PortProxyItemValidator.cs @@ -0,0 +1,30 @@ +using FluentValidation; +using LuYao.Toolkit.Validators; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy; +public class PortProxyItemValidator : AbstractValidator +{ + public static PortProxyItemValidator Instance { get; } = new PortProxyItemValidator(); + public PortProxyItemValidator() + { + RuleFor(i => i.ListenOn) + .NotEmpty() + .WithName("监听地址"); + + RuleFor(i => i.ListenPort) + .NotEmpty() + .NetworkPort() + .WithName("监听端口"); + + RuleFor(i => i.ConnectTo) + .NotEmpty() + .IPAddress() + .NotEqual(i => i.ListenOn) + .WithName("转发地址"); + + RuleFor(i => i.ConnectPort) + .NotEmpty() + .NetworkPort() + .WithName("转发端口"); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/RemoteDesktopManagerViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/RemoteDesktopManagerViewModel.cs new file mode 100644 index 0000000..0e80d9f --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/RemoteDesktopManagerViewModel.cs @@ -0,0 +1,313 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CsvHelper; +using CsvHelper.Configuration; +using LuYao.Toolkit.Rdm; +using LuYao.Toolkit.Rdm.Events; +using LuYao.Toolkit.Services; +using NewLife.Configuration; +using Prism.Events; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using XCode; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class RemoteDesktopManagerViewModel : ViewModelBase +{ + [INotifyPropertyChanged] + public partial class SearchInput + { + public SearchInput(RemoteDesktopManagerViewModel vm) + { + this.vm = vm ?? throw new ArgumentNullException(nameof(vm)); + } + private RemoteDesktopManagerViewModel vm; + [ObservableProperty] + private RdpGroup _group = RdpGroup.All; + + [ObservableProperty] + private string _keyword; + partial void OnGroupChanged(RdpGroup value) + { + vm.Search(); + } + } + private readonly IEventAggregator eventAggregator; + public RemoteDesktopManagerViewModel(IEventAggregator eventAggregator) + { + this.eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + this._input = new SearchInput(this); + this.eventAggregator.GetEvent().Subscribe(OnRdoConnectionChanged); + this.eventAggregator.GetEvent().Subscribe(OnAfterRdmSetting); + this.Reload(); + } + + private void OnAfterRdmSetting() + { + this.Reload(); + } + + private void OnRdoConnectionChanged() + { + this.Reload(); + } + + [ObservableProperty] + private List _groups = new List { RdpGroup.All }; + + [ObservableProperty] + private SearchInput _input; + + [ObservableProperty] + private List _connections = new List(); + + [ObservableProperty] + private IList _selectedConnections; + + [RelayCommand] + private void Reload() + { + var groups = Entities.RdpGroup.FindAll(null, Entities.RdpGroup._.Rank, null, 0, 0); + var list = new List { RdpGroup.All }; + foreach (var g in groups) + { + list.Add(new RdpGroup(g)); + } + this.Groups = list; + this.Search(); + } + + [RelayCommand] + private void Search() + { + WhereExpression where = new WhereExpression(); + var order = Entities.RdpConnection._.GroupId.Asc() & Entities.RdpConnection._.Name.Asc(); + if (Input.Group != null && Input.Group.Id != Guid.Empty) + { + where &= Entities.RdpConnection._.GroupId == Input.Group.Id; + } + if (!string.IsNullOrWhiteSpace(Input.Keyword)) + { + where &= ( + Entities.RdpConnection._.Name.Contains(Input.Keyword) | + Entities.RdpConnection._.Host.Contains(Input.Keyword) | + Entities.RdpConnection._.Username.Contains(Input.Keyword) | + Entities.RdpConnection._.Remark.Contains(Input.Keyword) + ); + } + + var list = Entities.RdpConnection.FindAll(where, order, null, 0, 0); + var connections = new List(list.Count); + var groups = new SortedSet(); + foreach (var item in list) + { + connections.Add(new RdpConnectionBase(item)); + if (!string.IsNullOrWhiteSpace(item.GroupName)) { groups.Add(item.GroupName); } + } + this.Connections = connections; + if (groups.Count > 1) + { + foreach (var item in this.Connections) + { + if (string.IsNullOrWhiteSpace(item.GroupName)) item.GroupName = "默认"; + } + var cvs = CollectionViewSource.GetDefaultView(this.Connections); + cvs.GroupDescriptions.Add(new PropertyGroupDescription(nameof(RdpConnectionBase.GroupName))); + } + } + + [RelayCommand] + private void Add() + { + this.eventAggregator.GetEvent().Publish(); + } + + [RelayCommand] + private void OpenSetting() + { + this.eventAggregator.GetEvent().Publish(); + } + + [RelayCommand] + private void Edit(RdpConnectionBase connection) + { + this.eventAggregator.GetEvent().Publish(new EditRdpConnectionEventPayload(connection.Id)); + } + + [RelayCommand] + private void Open(RdpConnectionBase connection) + { + if (connection == null) return; + this.eventAggregator.GetEvent().Publish(new OpenRdpConnectionEventPayload(connection.Id)); + } + + [RelayCommand] + private void Delete(IList connections) + { + if (connections.Count == 0) + { + NotifyService.Warning("请先选择要删除的数据"); + return; + } + var ids = connections.Cast().Select(i => i.Id).ToArray(); + if (MessageBoxService.Confirm($"确定要删除 {ids.Length} 个链接吗?") == false) return; + + var count = Entities.RdpConnection.Delete(Entities.RdpConnection._.Id.In(ids)); + NotifyService.Success($"成功删除链接 {count} 个。"); + this.Reload(); + } + + [RelayCommand] + private void Import() + { + var dialog = FileDialogService.CreateOpenFileDialog(); + dialog.Title = "导入远程桌面链接"; + dialog.Filter = "远程桌面链接备份|*.rdcsv"; + if (dialog.ShowDialog() == false) return; + var config = new CsvConfiguration(CultureInfo.InvariantCulture) + { + MissingFieldFound = null, + HeaderValidated = null, + }; + using (var reader = new StreamReader(dialog.FileName)) + using (var csv = new CsvReader(reader, config)) + { + csv.Context.RegisterClassMap(); + var records = csv.GetRecords().ToList(); + if (records.Count <= 0) + { + NotifyService.Warning("要导入的数据为空"); + return; + } + + var itemsForAdd = new List(); + var itemsForUpdate = new List(); + var itemsForSkip = new List(); + + var groups = new Dictionary(); + + var validator = RdpConnectionValidator.Instance; + for (int i = 0; i < records.Count; i++) + { + RdpConnection item = records[i]; + var result = validator.Validate(item); + if (result.IsValid == false) + { + NotifyService.Warning($"第 {i + 1} 行数据有误。{result}"); + return; + } + if (item.Id == Guid.Empty) item.Id = Guid.NewGuid(); + if (!string.IsNullOrWhiteSpace(item.GroupName)) + { + if (groups.ContainsKey(item.GroupName)) continue; + groups.Add(item.GroupName, null); + } + } + + if (groups.Count > 0) + { + var find = Entities.RdpGroup.FindAll(Entities.RdpGroup._.Name.In(groups.Keys)); + foreach (var name in groups.Keys.ToArray()) + { + var e = find.FirstOrDefault(i => i.Name == name); + if (e == null) + { + e = new Entities.RdpGroup + { + CreatedAt = DateTime.Now, + Name = name, + Rank = 0, + UpdatedAt = DateTime.Now, + Id = Guid.NewGuid() + }; + e.Insert(); + } + groups[name] = e; + } + } + + foreach (var item in records) + { + if (!string.IsNullOrWhiteSpace(item.GroupName) && groups.TryGetValue(item.GroupName, out var g)) item.GroupId = g.Id; + else item.GroupId = Guid.Empty; + + var e = Entities.RdpConnection.FindById(item.Id); + if (e != null) + { + if (e.UpdatedAt >= item.UpdatedAt) + { + itemsForSkip.Add(item); + } + else + { + item.Write(e); + itemsForUpdate.Add(e); + } + } + else + { + e = new Entities.RdpConnection { Id = Guid.NewGuid(), CreatedAt = DateTime.Now }; + item.Write(e); + itemsForAdd.Add(e); + } + } + + itemsForAdd.Insert(); + itemsForUpdate.Update(); + + NotifyService.Success($"导入成功!新增:{itemsForAdd.Count} 更新:{itemsForUpdate.Count} 跳过:{itemsForSkip.Count}"); + this.Reload(); + } + } + + [RelayCommand] + private void Export(IList connections) + { + + if (connections.Count == 0) + { + NotifyService.Warning("请先选择要导出的数据"); + return; + } + Guid[] ids = (from RdpConnectionBase i in connections select i.Id).ToArray(); + IReadOnlyList list = Entities.RdpConnection.FindAllByIds(ids); + if (connections.Count == 0) + { + NotifyService.Warning("要导出的数据为空"); + return; + } + ISaveFileDialog dialog = FileDialogService.CreateSaveFileDialog(); + dialog.Title = "导出远程桌面链接"; + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + dialog.Filter = "远程桌面链接备份|*.rdcsv"; + dialog.AddExtension = true; + dialog.FileName = $"远程桌面_{DateTime.Now:yyyyMMdd_HHmmss}.rdcsv"; + if (!dialog.ShowDialog()) return; + string fn = dialog.FileName; + if (!fn.EndsWith(".rdcsv", StringComparison.InvariantCultureIgnoreCase)) fn += ".rdcsv"; + List exports = new List(list.Count); + foreach (Entities.RdpConnection item in list) exports.Add(new RdpConnection(item)); + using (StreamWriter writer = new StreamWriter(fn, append: false, Encoding.UTF8)) + { + using CsvWriter csv = new CsvWriter(writer, CultureInfo.InvariantCulture); + csv.Context.RegisterClassMap(); + csv.WriteHeader(); + csv.NextRecord(); + foreach (RdpConnection record in exports) + { + csv.WriteRecord(record); + csv.NextRecord(); + } + } + NotifyService.Success($"数据导出成功,共 {exports.Count} 条."); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.GetAllTcpConnections.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.GetAllTcpConnections.cs new file mode 100644 index 0000000..3c71836 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.GetAllTcpConnections.cs @@ -0,0 +1,105 @@ +using System; +using System.Runtime.InteropServices; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class TrafficMonitorViewModel +{ + public enum TCP_TABLE_CLASS : int + { + TCP_TABLE_BASIC_LISTENER, + TCP_TABLE_BASIC_CONNECTIONS, + TCP_TABLE_BASIC_ALL, + TCP_TABLE_OWNER_PID_LISTENER, + TCP_TABLE_OWNER_PID_CONNECTIONS, + TCP_TABLE_OWNER_PID_ALL, + TCP_TABLE_OWNER_MODULE_LISTENER, + TCP_TABLE_OWNER_MODULE_CONNECTIONS, + TCP_TABLE_OWNER_MODULE_ALL + } + + [StructLayout(LayoutKind.Sequential)] + public struct MIB_TCPROW_OWNER_PID + { + public uint state; + public uint localAddr; + public byte localPort1; + public byte localPort2; + public byte localPort3; + public byte localPort4; + public uint remoteAddr; + public byte remotePort1; + public byte remotePort2; + public byte remotePort3; + public byte remotePort4; + public int owningPid; + + public ushort LocalPort => BitConverter.ToUInt16(new byte[2] { localPort2, localPort1 }, 0); + + public ushort RemotePort => BitConverter.ToUInt16(new byte[2] { remotePort2, remotePort1 }, 0); + } + + [StructLayout(LayoutKind.Sequential)] + public struct MIB_TCPTABLE_OWNER_PID + { + public uint dwNumEntries; + MIB_TCPROW_OWNER_PID table; + } + + [DllImport("iphlpapi.dll", SetLastError = true)] + static extern uint GetExtendedTcpTable(IntPtr pTcpTable, + ref int dwOutBufLen, + bool sort, + int ipVersion, + TCP_TABLE_CLASS tblClass, + int reserved); + + public static MIB_TCPROW_OWNER_PID[] GetAllTcpConnections() + { + MIB_TCPROW_OWNER_PID[] tTable; + int AF_INET = 2; // IP_v4 + int buffSize = 0; + + // how much memory do we need? + uint ret = GetExtendedTcpTable(IntPtr.Zero, + ref buffSize, + true, + AF_INET, + TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, + 0); + if (ret != 0 && ret != 122) // 122 insufficient buffer size + throw new Exception("bad ret on check " + ret); + IntPtr buffTable = Marshal.AllocHGlobal(buffSize); + + try + { + ret = GetExtendedTcpTable(buffTable, + ref buffSize, + true, + AF_INET, + TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, + 0); + if (ret != 0) + throw new Exception("bad ret " + ret); + + // get the number of entries in the table + MIB_TCPTABLE_OWNER_PID tab = (MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(buffTable, typeof(MIB_TCPTABLE_OWNER_PID)); + IntPtr rowPtr = (IntPtr)((long)buffTable + Marshal.SizeOf(tab.dwNumEntries)); + tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries]; + + for (int i = 0; i < tab.dwNumEntries; i++) + { + MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID)); + tTable[i] = tcpRow; + // next entry + rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow)); + } + } + finally + { + // Free the Memory + Marshal.FreeHGlobal(buffTable); + } + return tTable; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.cs new file mode 100644 index 0000000..134f0ee --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/TrafficMonitorViewModel.cs @@ -0,0 +1,136 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Services; +using NewLife.Caching; +using Prism.Regions; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class TrafficMonitorViewModel : ViewModelBase, INavigationAware +{ + private static MemoryCache ProcessCache = new MemoryCache(); + private record ProcessInfo(string ProcessName, string FileName, string ModuleName, DateTime? StartTime, string FileDescription); + private static ProcessInfo GetProcessInfo(int id) => ProcessCache.GetOrAdd(id.ToString(), CreateProcessInfo, 300); + + private static bool TryGet(Process p, Func get, out T value) + { + try + { + value = get(p); + return true; + } + catch (Exception) + { + value = default; + return false; + } + } + + private static ProcessInfo CreateProcessInfo(string arg) + { + string processName = string.Empty; + string fileName = string.Empty; + string moduleName = string.Empty; + string fileDescription = string.Empty; + DateTime? startTime = default; + using (var p = Process.GetProcessById(Convert.ToInt32(arg))) + { + if (TryGet(p, p => p.ProcessName, out var name)) processName = name; + if (TryGet(p, p => p.StartTime, out var time)) startTime = time; + if (TryGet(p, p => p.MainModule, out var mainModule) && mainModule != null) + { + fileName = mainModule.FileName; + moduleName = mainModule.ModuleName; + if (mainModule.FileVersionInfo != null) + { + fileDescription = mainModule.FileVersionInfo.FileDescription; + } + } + } + return new ProcessInfo(processName, fileName, moduleName, startTime, fileDescription); + } + + [INotifyPropertyChanged] + public partial class TrafficReport + { + [ObservableProperty] + private int pid; + [ObservableProperty] + private string name; + [ObservableProperty] + private string fileName; + [ObservableProperty] + private string moduleName; + [ObservableProperty] + private int count; + [ObservableProperty] + private DateTime? startTime; + [ObservableProperty] + private string fileDescription; + } + #region INavigationAware + public bool IsNavigationTarget(NavigationContext navigationContext) => true; + public void OnNavigatedFrom(NavigationContext navigationContext) => this._isRunning = false; + public void OnNavigatedTo(NavigationContext navigationContext) => this._isRunning = true; + #endregion + private bool _isRunning = true; + + public TrafficMonitorViewModel() => Run(); + private async void Run() + { + while (true) + { + if (this._isRunning) + { + var count = GetAllTcpConnections() + .GroupBy(i => i.owningPid) + .ToDictionary(i => i.Key, i => i.Count()); + + for (int i = 0; i < this.Reports.Count; i++) + { + var item = this.Reports[i]; + if (count.TryGetValue(item.Pid, out var value)) + { + item.Count = value; + count.Remove(item.Pid); + } + else + { + this.Reports.RemoveAt(i); + i--; + } + } + if (count.Count > 0) + { + var forAdd = count.Select(i => new TrafficReport { Pid = i.Key, Count = i.Value }).ToList(); + foreach (var item in forAdd) + { + this.Reports.Add(item); + } + Reload(forAdd); + } + } + await Task.Delay(1000); + } + } + private async void Reload(IReadOnlyList items) + { + foreach (var item in items) + { + var info = await Task.Run(() => GetProcessInfo(item.Pid)); + item.Name = info.ProcessName; + item.FileName = info.FileName; + item.StartTime = info.StartTime; + item.ModuleName = info.ModuleName; + item.FileDescription = info.FileDescription; + } + } + + [ObservableProperty] + private ObservableCollection _reports = new ObservableCollection(); +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/UrlAnalyzerViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/UrlAnalyzerViewModel.cs new file mode 100644 index 0000000..689f1d1 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/UrlAnalyzerViewModel.cs @@ -0,0 +1,78 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class UrlAnalyzerViewModel : ViewModelBase +{ + public class KeyValueItem + { + public KeyValueItem(string key, string value) + { + this.Key = key; + this.Value = value; + } + public string Key { get; } + public string Value { get; } + } + [ObservableProperty] + private string _url; + [ObservableProperty] + private bool _isAbsoluteUri; + [ObservableProperty] + private IReadOnlyList _queryString; + [ObservableProperty] + private Uri _uri; + [ObservableProperty] + private string _output; + [RelayCommand] + private void Clear() + { + this.Output = string.Empty; + this.QueryString = default; + this.IsAbsoluteUri = default; + this.Uri = default; + } + [RelayCommand] + private void Analyze() + { + this.Clear(); + if (string.IsNullOrWhiteSpace(this.Url)) + { + this.Output = "URL为空"; + return; + } + if (Uri.TryCreate(this.Url, UriKind.RelativeOrAbsolute, out var uri)) + { + IsAbsoluteUri = uri.IsAbsoluteUri; + if (!this.IsAbsoluteUri) + { + this.Output = "仅支持绝对路径"; + return; + } + this.Uri = uri; + if (!string.IsNullOrWhiteSpace(uri.Query)) + { + var nv = System.Web.HttpUtility.ParseQueryString(uri.Query); + if (nv.Count > 0) + { + var list = new List(); + foreach (var key in nv.AllKeys) + { + foreach (var value in nv.GetValues(key)) + { + list.Add(new KeyValueItem(key, value)); + } + } + this.QueryString = list; + } + } + } + else + { + this.Output = "URL解析失败"; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/UserAgentParserViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/UserAgentParserViewModel.cs new file mode 100644 index 0000000..0e1ac8b --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/UserAgentParserViewModel.cs @@ -0,0 +1,64 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System.Text; +using UAParser; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class UserAgentParserViewModel : ViewModelBase +{ + private Parser _parser; + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ParseCommand))] + private string _input; + + [ObservableProperty()] + private OS _OS; + + [ObservableProperty] + private Device _device; + + [ObservableProperty] + private UserAgent _UA; + + [ObservableProperty] + private string _output; + + private bool CanParse() => !string.IsNullOrWhiteSpace(this.Input); + + [RelayCommand(CanExecute = nameof(CanParse))] + private void Parse() + { + if (_parser == null) _parser = Parser.GetDefault(); + var sb = new StringBuilder(); + var client = _parser.Parse(this.Input); + this.OS = client.OS; + this.Device = client.Device; + this.UA = client.UA; + + sb.AppendLine($"========== {this.Device} =========="); + sb.AppendLine($"{nameof(Device.IsSpider)}:{this.Device.IsSpider}"); + sb.AppendLine($"{nameof(Device.Brand)}:{this.Device.Brand}"); + sb.AppendLine($"{nameof(Device.Family)}:{this.Device.Family}"); + sb.AppendLine($"{nameof(Device.Model)}:{this.Device.Model}"); + sb.AppendLine(); + + sb.AppendLine($"========== {this.OS} =========="); + sb.AppendLine($"{nameof(OS.Family)}:{this.OS.Family}"); + sb.AppendLine($"{nameof(OS.Major)}:{this.OS.Major}"); + sb.AppendLine($"{nameof(OS.Minor)}:{this.OS.Minor}"); + sb.AppendLine($"{nameof(OS.Patch)}:{this.OS.Patch}"); + sb.AppendLine($"{nameof(OS.PatchMinor)}:{this.OS.PatchMinor}"); + sb.AppendLine(); + + + sb.AppendLine($"========== {this.UA} =========="); + sb.AppendLine($"{nameof(UserAgent.Family)}:{this.UA.Family}"); + sb.AppendLine($"{nameof(UserAgent.Major)}:{this.UA.Major}"); + sb.AppendLine($"{nameof(UserAgent.Minor)}:{this.UA.Minor}"); + sb.AppendLine($"{nameof(UserAgent.Patch)}:{this.UA.Patch}"); + + this.Output = sb.ToString(); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Networks/WhoisViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Networks/WhoisViewModel.cs new file mode 100644 index 0000000..09f3e52 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Networks/WhoisViewModel.cs @@ -0,0 +1,100 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Networks; + +public partial class WhoisViewModel : ViewModelBase +{ + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(QueryCommand))] + private string _input; + private bool CanQuery => !string.IsNullOrWhiteSpace(this.Input); + + + + + public ObservableCollection Items { get; } = new ObservableCollection(); + + [ObservableProperty] + private WhoisInfomation _current; + + [RelayCommand(CanExecute = nameof(CanQuery))] + private async Task Query() + { + this.Current = null; + this.Items.Clear(); + var input = this.Input; + var list = new List>(); + foreach (var server in AllServers) + { + list.Add(Query(server, input)); + } + await Task.WhenAll(list); + foreach (var item in list) + { + if (item.IsCompletedSuccessfully()) + { + var server = item.Result; + if (server != null && !string.IsNullOrWhiteSpace(server.Result)) + { + this.Items.Add(item.Result); + } + } + } + if (this.Items.Count > 0) this.Current = this.Items[0]; + } + private static readonly string[] AllServers = new string[] { + "whois.verisign-grs.com", + "whois.markmonitor.com", + "whois.sfn.cn" + }; + private static async Task GetWhoisInformation(string whoisServer, string url) + { + StringBuilder stringBuilderResult = new StringBuilder(); + using TcpClient tcpClinetWhois = new TcpClient(); + await tcpClinetWhois.ConnectAsync(whoisServer, 43); + NetworkStream networkStreamWhois = tcpClinetWhois.GetStream(); + BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois); + StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois); + + await streamWriter.WriteLineAsync(url); + await streamWriter.FlushAsync(); + + StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois) { }; + + while (!streamReaderReceive.EndOfStream) + { + var line = await streamReaderReceive.ReadLineAsync(); + stringBuilderResult.AppendLine(line.Trim()); + } + + return stringBuilderResult.ToString(); + } + private static async Task Query(string server, string domain) + { + try + { + var ret = await GetWhoisInformation(server, domain); + return new WhoisInfomation { Server = server, Result = ret }; + } + catch (Exception) + { + return null; + } + } + + public class WhoisInfomation + { + public string Server { get; set; } + public string Result { get; set; } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/CsvReaderViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/CsvReaderViewModel.cs new file mode 100644 index 0000000..b056e5e --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/CsvReaderViewModel.cs @@ -0,0 +1,131 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CsvHelper; +using CsvHelper.Configuration; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class CsvReaderViewModel : ViewModelBase +{ + private const int PAGE_SIZE = 100; + + [ObservableProperty] + private string _fileName = string.Empty; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Delimiter))] + private string _delimiter = ","; + public int MaxPageCount + { + get + { + if (this._total > 0) + { + var count = this._total / PAGE_SIZE; + if (this._total % PAGE_SIZE > 0) count++; + return count; + } + return 0; + } + } + [ObservableProperty] + private int _pageIndex = 1; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(MaxPageCount))] + private int _total = 0; + + [ObservableProperty] + private DataTable _rows; + + private DataTable _table = new DataTable(); + partial void OnPageIndexChanged(int value) + { + DoPage(value); + } + + private void DoPage(int value) + { + if (this.Total <= 0) return; + var skip = (Math.Min(value, this.MaxPageCount) - 1) * PAGE_SIZE; + + var dt = this.Rows; + dt.Clear(); + dt.BeginLoadData(); + for (int i = skip; i < this._table.Rows.Count && dt.Rows.Count < PAGE_SIZE; i++) + { + var row = this._table.Rows[i]; + dt.ImportRow(row); + } + dt.EndLoadData(); + //this.OnPropertyChanged(nameof(this.Rows)); + } + + [RelayCommand] + private void Open() + { + var dialog = Services.FileDialogService.CreateOpenFileDialog(); + dialog.Title = "打开 CSV 文件"; + if (dialog.ShowDialog()) + { + this.FileName = dialog.FileName; + Read(dialog.FileName); + } + } + [RelayCommand] + private void Reload() + { + if (String.IsNullOrWhiteSpace(this.FileName)) return; + Read(this.FileName); + } + + private void Read(string fn) + { + try + { + var config = new CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture) + { + BadDataFound = this.OnBadDataFound, + }; + if (!string.IsNullOrEmpty(this.Delimiter)) config.Delimiter = this.Delimiter; + var encoding = Services.FileService.GetEncoding(fn); + using (var fs = new FileStream(fn, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var reader = new StreamReader(fs, encoding)) + using (var csv = new CsvReader(reader, config)) + { + using (var dr = new CsvDataReader(csv)) + { + + var ss = dr.GetSchemaTable(); + this._table = new DataTable(); + _table.Load(dr); + this.Rows = _table.Clone(); + this.Total = _table.Rows.Count; + if (this.PageIndex != 1) + { + this.PageIndex = 1; + } + else + { + DoPage(1); + } + } + } + } + catch (Exception e) + { + Services.NotifyService.Warning(e.Message); + } + } + + private void OnBadDataFound(BadDataFoundArgs args) + { + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/FullHalfConvertViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/FullHalfConvertViewModel.cs new file mode 100644 index 0000000..506c9d3 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/FullHalfConvertViewModel.cs @@ -0,0 +1,85 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Text; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class FullHalfConvertViewModel : ViewModelBase +{ + [ObservableProperty] + private string _input = string.Empty; + [ObservableProperty] + private string _output = string.Empty; + [RelayCommand] + private void ToFull() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + return; + } + var str = this.Input; + var len = str.Length; + var sb = new StringBuilder(); + for (int i = 0; i < len; i++) + { + int t = str[i]; + if (t == 32) + { + t = 12288; + } + else if (t >= 33 && t <= 126) + { + t += 65248; + } + else if (t == '.') + { + t = '。'; + } + sb.Append((char)t); + } + this.Output = sb.ToString(); + } + [RelayCommand] + private void ToHalf() + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + return; + } + var str = this.Input; + var len = str.Length; + var sb = new StringBuilder(); + for (int i = 0; i < len; i++) + { + int t = str[i]; + if (t == 12288) + { + t = 32; + } + else if (t >= 65281 && t <= 65374) + { + t -= 65248; + } + else if (t == '。') + { + t = '.'; + } + sb.Append((char)t); + } + this.Output = sb.ToString(); + } + [RelayCommand] + protected virtual void Copy() + { + Services.ClipboardService.CopyText(this.Output); + } + + [RelayCommand] + protected virtual void Clear() + { + this.Output = this.Input = String.Empty; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/GoogleTranslateViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/GoogleTranslateViewModel.cs new file mode 100644 index 0000000..c28af18 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/GoogleTranslateViewModel.cs @@ -0,0 +1,246 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Services; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class GoogleTranslateViewModel : ViewModelBase +{ + public record LangItem(String Id, string Name, string[] Keywords); + public static List AllFromLanguages { get; } + public static List AllToLanguages { get; } + private static LangItem Create(string id, string name, params string[] keywords) => new LangItem(id, name, keywords); + static GoogleTranslateViewModel() + { + AllFromLanguages = new List + { + Create("auto","自动检测","auto","自动检测","zidongjiance","zdjc"), + Create("en","英语","en","英语","yingyu","yy"), + Create("fr","法语","fr","法语","fayu","fy"), + Create("de","德语","de","德语","deyu","dy"), + Create("it","意大利语","it","意大利语","yidaliyu","ydly"), + Create("es","西班牙语","es","西班牙语","xibanyayu","xbyy"), + Create("pt","葡萄牙语","pt","葡萄牙语","putaoyayu","ptyy"), + Create("nl","荷兰语","nl","荷兰语","helanyu","hly"), + Create("pl","波兰语","pl","波兰语","bolanyu","bly"), + Create("ja","日语","ja","日语","riyu","ry"), + Create("ko","韩语","ko","韩语","hanyu","hy"), + Create("ar","阿拉伯语","ar","阿拉伯语","alaboyu","alby"), + Create("tr","土耳其语","tr","土耳其语","tuerqiyu","teqy"), + Create("th","泰语","th","泰语","taiyu","ty"), + Create("ms","马来语","ms","马来语","malaiyu","mly"), + Create("vi","越南语","vi","越南语","yuenanyu","yny"), + Create("sv","瑞典语","sv","瑞典语","ruidianyu","rdy"), + Create("id","印度尼西亚语","id","印度尼西亚语","yindunixiyayu","ydnxyy"), + Create("zh-cn","中文(简体)","zh-cn","中文(简体)","zhongwen(jianti)","zw(jt)"), + Create("zh-tw","中文(繁体)","zh-tw","中文(繁体)","zhongwen(fanti)","zw(ft)"), + Create("sq","阿尔巴尼亚语","sq","阿尔巴尼亚语","aerbaniyayu","aebnyy"), + Create("am","阿姆哈拉语","am","阿姆哈拉语","amuhalayu","amhly"), + Create("az","阿塞拜疆语","az","阿塞拜疆语","asaibaijiangyu","asbjy"), + Create("ga","爱尔兰语","ga","爱尔兰语","aierlanyu","aely"), + Create("et","爱沙尼亚语","et","爱沙尼亚语","aishaniyayu","asnyy"), + Create("eu","巴斯克语","eu","巴斯克语","basikeyu","bsky"), + Create("be","白俄罗斯语","be","白俄罗斯语","baieluosiyu","belsy"), + Create("bg","保加利亚语","bg","保加利亚语","baojialiyayu","bjlyy"), + Create("is","冰岛语","is","冰岛语","bingdaoyu","bdy"), + Create("bs","波斯尼亚语","bs","波斯尼亚语","bosiniyayu","bsnyy"), + Create("fa","波斯语","fa","波斯语","bosiyu","bsy"), + Create("da","丹麦语","da","丹麦语","danmaiyu","dmy"), + Create("ru","俄语","ru","俄语","eyu","ey"), + Create("fi","芬兰语","fi","芬兰语","fenlanyu","fly"), + Create("km","高棉语","km","高棉语","gaomianyu","gmy"), + Create("ka","格鲁吉亚语","ka","格鲁吉亚语","gelujiyayu","gljyy"), + Create("gu","古吉拉特语","gu","古吉拉特语","gujilateyu","gjlty"), + Create("kk","哈萨克语","kk","哈萨克语","hasakeyu","hsky"), + Create("ht","海地克里奥尔语","ht","海地克里奥尔语","haidikeliaoeryu","hdklaey"), + Create("ha","豪萨语","ha","豪萨语","haosayu","hsy"), + Create("gl","加利西亚语","gl","加利西亚语","jialixiyayu","jlxyy"), + Create("ca","加泰罗尼亚语","ca","加泰罗尼亚语","jiatailuoniyayu","jtlnyy"), + Create("cs","捷克语","cs","捷克语","jiekeyu","jky"), + Create("kn","卡纳达语","kn","卡纳达语","kanadayu","kndy"), + Create("ky","柯尔克孜语","ky","柯尔克孜语","keerkeziyu","kekzy"), + Create("xh","科萨语","xh","科萨语","kesayu","ksy"), + Create("co","科西嘉语","co","科西嘉语","kexijiayu","kxjy"), + Create("hr","克罗地亚语","hr","克罗地亚语","keluodiyayu","kldyy"), + Create("ku","库尔德语","ku","库尔德语","kuerdeyu","kedy"), + Create("la","拉丁语","la","拉丁语","ladingyu","ldy"), + Create("lv","拉脱维亚语","lv","拉脱维亚语","latuoweiyayu","ltwyy"), + Create("lo","老挝语","lo","老挝语","laowoyu","lwy"), + Create("lt","立陶宛语","lt","立陶宛语","litaowanyu","ltwy"), + Create("lb","卢森堡语","lb","卢森堡语","lusenbaoyu","lsby"), + Create("ro","罗马尼亚语","ro","罗马尼亚语","luomaniyayu","lmnyy"), + Create("mt","马耳他语","mt","马耳他语","maertayu","mety"), + Create("mr","马拉地语","mr","马拉地语","maladiyu","mldy"), + Create("mg","马拉加斯语","mg","马拉加斯语","malajiasiyu","mljsy"), + Create("ml","马拉雅拉姆语","ml","马拉雅拉姆语","malayalamuyu","mlylmy"), + Create("mk","马其顿语","mk","马其顿语","maqidunyu","mqdy"), + Create("mi","毛利语","mi","毛利语","maoliyu","mly"), + Create("mn","蒙古语","mn","蒙古语","mengguyu","mgy"), + Create("bn","孟加拉语","bn","孟加拉语","mengjialayu","mjly"), + Create("my","缅甸语","my","缅甸语","miandianyu","mdy"), + Create("hmn","苗语","hmn","苗语","miaoyu","my"), + Create("af","南非荷兰语","af","南非荷兰语","nanfeihelanyu","nfhly"), + Create("st","南索托语","st","南索托语","nansuotuoyu","nsty"), + Create("ne","尼泊尔语","ne","尼泊尔语","niboeryu","nbey"), + Create("no","挪威语","no","挪威语","nuoweiyu","nwy"), + Create("ps","普什图语","ps","普什图语","pushentuyu","psty"), + Create("ny","齐切瓦语","ny","齐切瓦语","qiqiewayu","qqwy"), + Create("sm","萨摩亚语","sm","萨摩亚语","samoyayu","smyy"), + Create("sr","塞尔维亚语","sr","塞尔维亚语","saierweiyayu","sewyy"), + Create("si","僧伽罗语","si","僧伽罗语","sengjialuoyu","sjly"), + Create("sn","绍纳语","sn","绍纳语","shaonayu","sny"), + Create("eo","世界语","eo","世界语","shijieyu","sjy"), + Create("sk","斯洛伐克语","sk","斯洛伐克语","siluofakeyu","slfky"), + Create("sl","斯洛文尼亚语","sl","斯洛文尼亚语","siluowenniyayu","slwnyy"), + Create("sw","斯瓦希里语","sw","斯瓦希里语","siwaxiliyu","swxly"), + Create("gd","苏格兰盖尔语","gd","苏格兰盖尔语","sugelangaieryu","sglgey"), + Create("ceb","宿务语","ceb","宿务语","suwuyu","swy"), + Create("so","索马里语","so","索马里语","suomaliyu","smly"), + Create("tl","他加禄语","tl","他加禄语","tajialuyu","tjly"), + Create("tg","塔吉克语","tg","塔吉克语","tajikeyu","tjky"), + Create("te","泰卢固语","te","泰卢固语","tailuguyu","tlgy"), + Create("ta","泰米尔语","ta","泰米尔语","taimieryu","tmey"), + Create("cy","威尔士语","cy","威尔士语","weiershiyu","wesy"), + Create("ur","乌尔都语","ur","乌尔都语","wuerdouyu","wedy"), + Create("uk","乌克兰语","uk","乌克兰语","wukelanyu","wkly"), + Create("uz","乌兹别克语","uz","乌兹别克语","wuzibiekeyu","wzbky"), + Create("fy","西弗里西亚语","fy","西弗里西亚语","xifulixiyayu","xflxyy"), + Create("iw","希伯来语","iw","希伯来语","xibolaiyu","xbly"), + Create("el","希腊语","el","希腊语","xilayu","xly"), + Create("haw","夏威夷语","haw","夏威夷语","xiaweiyiyu","xwyy"), + Create("sd","信德语","sd","信德语","xindeyu","xdy"), + Create("hu","匈牙利语","hu","匈牙利语","xiongyaliyu","xyly"), + Create("su","巽他语","su","巽他语","xuntayu","xty"), + Create("hy","亚美尼亚语","hy","亚美尼亚语","yameiniyayu","ymnyy"), + Create("ig","伊博语","ig","伊博语","yiboyu","yby"), + Create("yi","意第绪语","yi","意第绪语","yidixuyu","ydxy"), + Create("hi","印地语","hi","印地语","yindiyu","ydy"), + Create("yo","约鲁巴语","yo","约鲁巴语","yuelubayu","ylby"), + Create("jw","爪哇语","jw","爪哇语","zhuawayu","zwy"), + Create("zu","祖鲁语","zu","祖鲁语","zuluyu","zly"), + }; + AllToLanguages = AllFromLanguages.Skip(1).ToList(); + } + [ObservableProperty] + [ViewStates.WatchViewState(nameof(From))] + private string _from = "auto"; + [ObservableProperty] + [ViewStates.WatchViewState(nameof(To))] + private string _to = "zh-cn"; + public GoogleTranslateViewModel() + { + this.Filter(AllFromLanguages, FromLanguages, String.Empty); + this.Filter(AllToLanguages, ToLanguages, String.Empty); + } + + [RelayCommand] + private void SetTo(string lang) + { + if (string.IsNullOrWhiteSpace(lang)) throw new ArgumentNullException(nameof(lang)); + To = lang; + } + + [ObservableProperty] + private string _input; + [ObservableProperty] + private string _output; + [ObservableProperty] + private string _sourceLanguage; + + [RelayCommand] + private async Task Translate() + { + using (this.Busy()) + { + if (string.IsNullOrWhiteSpace(this.Input)) + { + this.Output = string.Empty; + this.SourceLanguage = string.Empty; + } + else + { + var lines = this.Input.Split('\n'); + var num = this.dataVersion; + TongjiService.Tongji(Views.ViewNames.Channels.Texts.GoogleTranslate, new { Action = nameof(Translate) }); + var ret = await GoogleService.Translate(this.From, this.To, lines); + if (this.dataVersion == num) + { + this.Output = string.Join("\n", ret.Lines); + this.SourceLanguage = ret.SourceLanguage; + } + } + } + } + + partial void OnInputChanged(string value) + { + var v = DateTime.Now.Ticks; + dataVersion = v; + AutoStart(v); + } + private long dataVersion = 0; + private async void AutoStart(long n) + { + await Task.Delay(500); + if (this.dataVersion == n) await Translate(); + } + + [RelayCommand] + private void Clear() => this.Input = this.Output = this.SourceLanguage = string.Empty; + + [ObservableProperty] + private string fromText; + + [ObservableProperty] + private string toText; + + partial void OnFromTextChanged(string value) + { + Filter(AllFromLanguages, this.FromLanguages, value); + } + + partial void OnToTextChanged(string value) + { + Filter(AllToLanguages, this.ToLanguages, value); + } + + public ObservableCollection FromLanguages { get; set; } = new(); + + public ObservableCollection ToLanguages { get; set; } = new(); + + + private void Filter(List all, ObservableCollection result, string text) + { + result.Clear(); + if (string.IsNullOrWhiteSpace(text)) + { + foreach (var item in all) + { + result.Add(item); + } + } + else + { + var key = text.ToLowerInvariant(); + foreach (var item in all) + { + var find = false; + foreach (var k in item.Keywords) + { + if (k.Contains(key)) + { + find = true; + break; + } + } + if (find) result.Add(item); + } + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/HashCalculatorViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/HashCalculatorViewModel.cs new file mode 100644 index 0000000..948edcb --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/HashCalculatorViewModel.cs @@ -0,0 +1,101 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using NewLife.Reflection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class HashCalculatorViewModel : ViewModelBase +{ + public interface IHashAlgorithmItem + { + string Name { get; } + void Reload(HashCalculatorViewModel vm); + } + public partial class HashAlgorithmItem : ViewModelBase, IHashAlgorithmItem where T : HashAlgorithm + { + public string Name { get; private set; } + + [ObservableProperty] + private string _output = string.Empty; + + private readonly Func _factory; + public HashAlgorithmItem(string name, Func factory) + { + this.Name = name; + _factory = factory; + } + public HashAlgorithm Create(string password) => _factory.Invoke(password); + + public void Reload(HashCalculatorViewModel vm) + { + if (string.IsNullOrWhiteSpace(vm.Input)) + { + this.Output = string.Empty; + return; + } + var bytes = Encoding.GetEncoding(vm.Encode).GetBytes(vm.Input); + using (var hash = this.Create(vm.Password)) + { + bytes = hash.ComputeHash(bytes); + } + var str = BitConverter.ToString(bytes).Replace("-", string.Empty); + if (vm.ToUpperCase) + { + this.Output = str.ToUpperInvariant(); + } + else + { + this.Output = str.ToLowerInvariant(); + } + } + } + + public EncodingInfo[] Encodings { get; } + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Encode))] + private int _encode = Encoding.UTF8.CodePage; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(ToUpperCase))] + private bool _toUpperCase = false; + + [ObservableProperty] + private string _input = string.Empty; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Password))] + private string _password = string.Empty; + + public List Items { get; } + public HashCalculatorViewModel() + { + Encodings = Encoding.GetEncodings(); + + this.Items = new List + { + new HashAlgorithmItem("MD5",(pwd)=>MD5.Create()), + new HashAlgorithmItem("SHA1",(pwd)=>SHA1.Create()), + new HashAlgorithmItem("SHA256",(pwd)=>SHA256.Create()), + new HashAlgorithmItem("SHA512",(pwd)=>SHA512.Create()), + new HashAlgorithmItem("HMAC-MD5",(pwd)=>new HMACMD5(Encoding.UTF8.GetBytes(pwd))), + new HashAlgorithmItem("HMAC-SHA1",(pwd)=>new HMACSHA1(Encoding.UTF8.GetBytes(pwd))), + new HashAlgorithmItem("HMAC-SHA256",(pwd)=>new HMACSHA256(Encoding.UTF8.GetBytes(pwd))), + new HashAlgorithmItem("HMAC-SHA384",(pwd)=>new HMACSHA384(Encoding.UTF8.GetBytes(pwd))), + new HashAlgorithmItem("HMAC-SHA512",(pwd)=>new HMACSHA512(Encoding.UTF8.GetBytes(pwd))), + }; + } + private void Reload() + { + foreach (var item in this.Items) item.Reload(this); + } + partial void OnEncodeChanged(int value) => Reload(); + partial void OnInputChanged(string value) => Reload(); + partial void OnToUpperCaseChanged(bool value) => this.Reload(); + partial void OnPasswordChanged(string value) => this.Reload(); +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/LogReaderViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/LogReaderViewModel.cs new file mode 100644 index 0000000..58bbc9d --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/LogReaderViewModel.cs @@ -0,0 +1,81 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Services; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class LogReaderViewModel : ViewModelBase +{ + [ObservableProperty] + private string _path; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(Output))] + private List _lines = new List(); + + public string Output + { + get => string.Join(Environment.NewLine, Lines); + set => Debug.WriteLine(value); + } + + private const int MAX_LINES = 200; + + partial void OnPathChanged(string value) + { + this.Lines.Clear(); + var encoding = File.Exists(value) ? FileService.GetEncoding(value) : Encoding.UTF8; + StartRead(value, encoding); + } + + private async void StartRead(string fn, Encoding encoding) + { + long lastPosition = 0; + var info = new FileInfo(fn); + while (fn == Path) + { + info.Refresh(); + if (!info.Exists) + { + await Task.Delay(1000); + continue; + } + if (info.Length != lastPosition) + { + Read(fn, encoding, lastPosition); + lastPosition = info.Length; + } + else + { + await Task.Delay(300); + } + } + } + + private void Read(string fn, Encoding encoding, long position) + { + using var fs = new FileStream(fn, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + fs.Seek(position, SeekOrigin.Begin); + using var sr = new StreamReader(fs, encoding); + var queue = new Queue(this.Lines); + while (!sr.EndOfStream) + { + var str = sr.ReadLine(); + queue.Enqueue(str); + while (queue.Count > MAX_LINES) queue.Dequeue(); + } + this.Lines = queue.ToList(); + } + + public override void Destroy() + { + base.Destroy(); + this.Path = String.Empty; + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/RegexEvaluatorViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/RegexEvaluatorViewModel.cs new file mode 100644 index 0000000..a406f1a --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/RegexEvaluatorViewModel.cs @@ -0,0 +1,133 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.ViewStates; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class RegexEvaluatorViewModel : ViewModelBase +{ + [ObservableProperty] + private string _pattern = string.Empty; + [ObservableProperty] + private string _inputText = string.Empty; + + #region Options + [ObservableProperty] + [WatchViewState(nameof(IgnoreCase))] + private bool _ignoreCase = false; + + [ObservableProperty] + [WatchViewState(nameof(Multiline))] + private bool _multiline = false; + + [ObservableProperty] + [WatchViewState(nameof(ExplicitCapture))] + private bool _explicitCapture = false; + + [ObservableProperty] + [WatchViewState(nameof(Compiled))] + private bool _compiled = false; + + [ObservableProperty] + [WatchViewState(nameof(Singleline))] + private bool _singleline = false; + + [ObservableProperty] + [WatchViewState(nameof(IgnorePatternWhitespace))] + private bool _ignorePatternWhitespace = false; + + [ObservableProperty] + [WatchViewState(nameof(RightToLeft))] + private bool _rightToLeft = false; + + [ObservableProperty] + [WatchViewState(nameof(ECMAScript))] + private bool _eCMAScript = false; + + [ObservableProperty] + [WatchViewState(nameof(CultureInvariant))] + private bool _cultureInvariant = false; + + #endregion + + [ObservableProperty] + private MatchCollection _matches; + [ObservableProperty] + private string _code; + [ObservableProperty] + private Exception _exception; + + [RelayCommand] + private void Clear() + { + this.Pattern = this.InputText = this.Code = string.Empty; + this.Matches = null; + this.Exception = null; + } + + [RelayCommand] + private void Update() + { + var options = RegexOptions.None; + if (this.IgnoreCase) options |= RegexOptions.IgnoreCase; + if (this.Multiline) options |= RegexOptions.Multiline; + if (this.ExplicitCapture) options |= RegexOptions.ExplicitCapture; + if (this.Compiled) options |= RegexOptions.Compiled; + if (this.Singleline) options |= RegexOptions.Singleline; + if (this.IgnorePatternWhitespace) options |= RegexOptions.IgnorePatternWhitespace; + if (this.RightToLeft) options |= RegexOptions.RightToLeft; + if (this.ECMAScript) options |= RegexOptions.ECMAScript; + if (this.CultureInvariant) options |= RegexOptions.CultureInvariant; + try + { + Matches = Regex.Matches(this.InputText, this.Pattern, options); + Exception = null; + BuildCode(); + } + catch (Exception e) + { + Matches = null; + Exception = e; + Code = string.Empty; + } + } + + private void BuildCode() + { + var options = new List(); + if (this.IgnoreCase) options.Add("RegexOptions.IgnoreCase"); + if (this.Multiline) options.Add("RegexOptions.Multiline"); + if (this.ExplicitCapture) options.Add("RegexOptions.ExplicitCapture"); + if (this.Compiled) options.Add("RegexOptions.Compiled"); + if (this.Singleline) options.Add("RegexOptions.Singleline"); + if (this.IgnorePatternWhitespace) options.Add("RegexOptions.IgnorePatternWhitespace"); + if (this.RightToLeft) options.Add("RegexOptions.RightToLeft"); + if (this.ECMAScript) options.Add("RegexOptions.ECMAScript"); + if (this.CultureInvariant) options.Add("RegexOptions.CultureInvariant"); + if (options.Count == 0) options.Add("RegexOptions.None"); + var sb = new StringBuilder(); + sb.AppendFormat("var pattern = {0};//表达式文本", JsonConvert.SerializeObject(this.Pattern)); + sb.AppendLine(); + sb.AppendFormat("var regex = new Regex({0},{1});//表达式对象", JsonConvert.SerializeObject(this.Pattern), string.Join("|", options)); + this.Code = sb.ToString(); + } + + partial void OnPatternChanged(string value) => this.Update(); + partial void OnInputTextChanged(string value) => this.Update(); + partial void OnIgnoreCaseChanged(bool value) => this.Update(); + partial void OnMultilineChanged(bool value) => this.Update(); + partial void OnExplicitCaptureChanged(bool value) => this.Update(); + partial void OnCompiledChanged(bool value) => this.Update(); + partial void OnSinglelineChanged(bool value) => this.Update(); + partial void OnIgnorePatternWhitespaceChanged(bool value) => this.Update(); + partial void OnRightToLeftChanged(bool value) => this.Update(); + partial void OnECMAScriptChanged(bool value) => this.Update(); + partial void OnCultureInvariantChanged(bool value) => this.Update(); +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/TextJoinViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/TextJoinViewModel.cs new file mode 100644 index 0000000..32efbbb --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/TextJoinViewModel.cs @@ -0,0 +1,163 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class TextJoinViewModel : ViewModelBase +{ + /// + /// 分割方式 + /// + public enum SplitBy + { + [Description("换行")] + NewLine, + [Description("逗号(,)")] + Dot, + [Description("分号(;)")] + Semicolon, + [Description("分隔符(|)")] + Separator, + [Description("制表符(\\t)")] + Tab + } + /// + /// 串联方式 + /// + public enum JoinBy + { + [Description("换行")] + NewLine, + [Description("逗号(,)")] + Dot, + [Description("分号(;)")] + Semicolon, + [Description("分隔符(|)")] + Separator, + [Description("制表符(\\t)")] + Tab, + [Description("无")] + None + } + public enum EscapeType + { + [Description("不包装")] + None, + [Description("包裹 ' 转义为 \\'")] + 斜杠单引号, + [Description("包裹 ' 转义为 ''")] + 重复单引号, + [Description("包裹 \" 转义为 \\\"")] + 斜杠双引号, + [Description("包裹 \" 转义为 \"\"")] + 重复双引号 + } + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Split))] + private SplitBy _split = SplitBy.NewLine; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Escape))] + private EscapeType _escape = EscapeType.None; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Join))] + private JoinBy _join = JoinBy.NewLine; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Trim))] + private bool _trim = true; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Distinct))] + private bool _distinct = true; + + [ObservableProperty] + [ViewStates.WatchViewState(nameof(Sort))] + private bool _sort = true; + + [ObservableProperty] + private string _input; + + [ObservableProperty] + private string _output; + + [RelayCommand] + private void Execute() + { + this.Output = string.Empty; + if (string.IsNullOrEmpty(this.Input)) return; + + var split = new char[] { '\n', '\r' }; + switch (this.Split) + { + case SplitBy.Dot: + split = new char[] { ',' }; + break; + case SplitBy.Semicolon: + split = new char[] { ';' }; + break; + case SplitBy.Separator: + split = new char[] { '|' }; + break; + case SplitBy.Tab: + split = new char[] { '\t' }; + break; + case SplitBy.NewLine: + default: + break; + } + + var separator = string.Empty; + switch (this.Join) + { + case JoinBy.Dot: + separator = ","; + break; + case JoinBy.Semicolon: + separator = ";"; + break; + case JoinBy.Separator: + separator = "|"; + break; + case JoinBy.Tab: + separator = "\t"; + break; + case JoinBy.NewLine: + separator = Environment.NewLine; + break; + case JoinBy.None: + break; + default: + break; + } + + IEnumerable items = this.Input.Split(split, StringSplitOptions.RemoveEmptyEntries); + if (this.Trim) { items = items.Select(i => i.Trim()); } + switch (this.Escape) + { + case EscapeType.None: + break; + case EscapeType.斜杠单引号: + items = items.Select(i => $"'{i.Replace("'", "\\'")}'"); + break; + case EscapeType.重复单引号: + items = items.Select(i => $"'{i.Replace("'", "''")}'"); + break; + case EscapeType.斜杠双引号: + items = items.Select(i => $"\"{i.Replace("\"", "\\\"")}\""); + break; + case EscapeType.重复双引号: + items = items.Select(i => $"\"{i.Replace("\"", "\"\"")}\""); + break; + } + if (this.Distinct) { items = items.Distinct(); } + if (this.Sort) { items = items.OrderBy(i => i); } + + this.Output = string.Join(separator, items); + } +} diff --git a/LuYao.Toolkit.ViewModels/Channels/Texts/YoudaoDictionaryViewModel.cs b/LuYao.Toolkit.ViewModels/Channels/Texts/YoudaoDictionaryViewModel.cs new file mode 100644 index 0000000..586eb76 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Channels/Texts/YoudaoDictionaryViewModel.cs @@ -0,0 +1,41 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Net.Http; +using System.Threading.Tasks; +using Youdao; + +namespace LuYao.Toolkit.Channels.Texts; + +public partial class YoudaoDictionaryViewModel : ViewModelBase +{ + private static HttpClient _http = new HttpClient(); + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(QueryCommand))] + private string _input; + + [ObservableProperty] + private YoudaoWord _result; + + private bool CanQuery() => !string.IsNullOrWhiteSpace(this.Input); + + [RelayCommand(CanExecute = nameof(CanQuery))] + private async Task Query() + { + using (this.Busy()) + { + if (string.IsNullOrWhiteSpace(this.Input)) throw new ArgumentNullException("英文单词不能为空"); + this.Result = null; + this.Result = await YoudaoDictionary.QueryAsync(_http, this.Input); + } + } + + [RelayCommand] + private async void Play(YoudaoPhonetic phonetic) + { + if (phonetic == null) return; + if (string.IsNullOrWhiteSpace(phonetic.Source)) return; + await Services.SoundService.Play(phonetic.Source); + } +} diff --git a/LuYao.Toolkit.ViewModels/Drawing/IconFactory.cs b/LuYao.Toolkit.ViewModels/Drawing/IconFactory.cs new file mode 100644 index 0000000..14f55c7 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Drawing/IconFactory.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; + +namespace LuYao.Toolkit.Drawing; + +/// +/// Provides methods for creating icons. +/// +/// https://stackoverflow.com/questions/3213999/how-to-create-an-icon-file-that-contains-multiple-sizes-images-in-c-sharp +public static class IconFactory +{ + #region constants + + /// + /// Represents the max allowed width of an icon. + /// + public const int MaxIconWidth = 256; + + /// + /// Represents the max allowed height of an icon. + /// + public const int MaxIconHeight = 256; + + private const ushort HeaderReserved = 0; + private const ushort HeaderIconType = 1; + private const byte HeaderLength = 6; + + private const byte EntryReserved = 0; + private const byte EntryLength = 16; + + private const byte PngColorsInPalette = 0; + private const ushort PngColorPlanes = 1; + + #endregion + + #region methods + + /// + /// Saves the specified objects as a single + /// icon into the output stream. + /// + /// The bitmaps to save as an icon. + /// The output stream. + /// + /// The expected input for the parameter are + /// portable network graphic files that have a + /// of and where the + /// width is less than or equal to and the + /// height is less than or equal to . + /// + /// + /// Occurs if any of the input images do + /// not follow the required image format. See remarks for details. + /// + /// + /// Occurs if any of the arguments are null. + /// + public static void SavePngsAsIcon(IReadOnlyCollection images, Stream stream) + { + if (images == null) throw new ArgumentNullException(nameof(images)); + if (stream == null) throw new ArgumentNullException(nameof(stream)); + + // validates the pngs + ThrowForInvalidPngs(images); + + var orderedImages = images.OrderBy(i => i.Width).ThenBy(i => i.Height).ToArray(); + + using (var writer = new BinaryWriter(stream)) + { + // write the header + writer.Write(HeaderReserved); + writer.Write(HeaderIconType); + writer.Write((ushort)orderedImages.Length); + + // save the image buffers and offsets + var buffers = new Dictionary(); + + // tracks the length of the buffers as the iterations occur + // and adds that to the offset of the entries + uint lengthSum = 0; + var baseOffset = (uint)(HeaderLength + + EntryLength * orderedImages.Length); + + for (var i = 0; i < orderedImages.Length; i++) + { + var image = orderedImages[i]; + + // creates a byte array from an image + var buffer = CreateImageBuffer(image); + + // calculates what the offset of this image will be + // in the stream + var offset = baseOffset + lengthSum; + + // writes the image entry + writer.Write(GetIconWidth(image)); + writer.Write(GetIconHeight(image)); + writer.Write(PngColorsInPalette); + writer.Write(EntryReserved); + writer.Write(PngColorPlanes); + writer.Write((ushort)Image.GetPixelFormatSize(image.PixelFormat)); + writer.Write((uint)buffer.Length); + writer.Write(offset); + + lengthSum += (uint)buffer.Length; + + // adds the buffer to be written at the offset + buffers.Add(offset, buffer); + } + + // writes the buffers for each image + foreach (var kvp in buffers) + { + // seeks to the specified offset required for the image buffer + writer.BaseStream.Seek(kvp.Key, SeekOrigin.Begin); + + // writes the buffer + writer.Write(kvp.Value); + } + } + } + + private static void ThrowForInvalidPngs(IEnumerable images) + { + foreach (var image in images) + { + if (image.PixelFormat != PixelFormat.Format32bppArgb) + throw new InvalidOperationException($"Required pixel format is PixelFormat.{PixelFormat.Format32bppArgb}."); + + if (image.RawFormat.Guid != ImageFormat.Png.Guid) + throw new InvalidOperationException("Required image format is a portable network graphic (png)."); + + if (image.Width > MaxIconWidth || image.Height > MaxIconHeight) + throw new InvalidOperationException($"Dimensions must be less than or equal to {MaxIconWidth}x{MaxIconHeight}"); + } + } + + private static byte GetIconHeight(Image image) + { + if (image.Height == MaxIconHeight) + { + return 0; + } + + return (byte)image.Height; + } + + private static byte GetIconWidth(Image image) + { + if (image.Width == MaxIconWidth) + { + return 0; + } + + return (byte)image.Width; + } + + private static byte[] CreateImageBuffer(Image image) + { + using (var stream = new MemoryStream()) + { + image.Save(stream, image.RawFormat); + + return stream.ToArray(); + } + } + + #endregion +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/LuYao.Toolkit.ViewModels.csproj b/LuYao.Toolkit.ViewModels/LuYao.Toolkit.ViewModels.csproj new file mode 100644 index 0000000..6f7fe9c --- /dev/null +++ b/LuYao.Toolkit.ViewModels/LuYao.Toolkit.ViewModels.csproj @@ -0,0 +1,40 @@ + + + + + net7.0-windows + LuYao.Toolkit + latest + + + + + + + + + + + + + + + + + + + + + + + ..\libs\LuYao.Common.dll + + + + + + + + + + diff --git a/LuYao.Toolkit.ViewModels/MainWindowViewModel.cs b/LuYao.Toolkit.ViewModels/MainWindowViewModel.cs new file mode 100644 index 0000000..d224660 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/MainWindowViewModel.cs @@ -0,0 +1,69 @@ +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Channels; +using LuYao.Toolkit.Entities; +using LuYao.Toolkit.Events; +using LuYao.Toolkit.Rdm.Events; +using LuYao.Toolkit.Tabs; +using Prism.Events; +using System; +using System.Collections.Generic; + +namespace LuYao.Toolkit; +public partial class MainWindowViewModel : ViewModelBase +{ + private IEventAggregator _eventAggregator; + public MainWindowViewModel(IEventAggregator eventAggregator) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + var hasSessin = ChannelItemSession.HasSessin(); + Tabs = new List { + new TabItem(Tab.Session){ IsSelected = hasSessin== true }, + new TabItem(Tab.Explorer){ IsSelected = hasSessin== false }, + new TabItem(Tab.Navs), + new TabItem(Tab.Rdp) + }; + _eventAggregator.GetEvent().Subscribe(this.OnOpenFunctionItem); + _eventAggregator.GetEvent().Subscribe(this.OnRdmOpenRdpConnection); + } + + private void OnRdmOpenRdpConnection(OpenRdpConnectionEventPayload obj) => OpenTab(Tab.Rdp); + + private void OnOpenFunctionItem(OpenFunctionItemEventPayload payload) + { + if (payload.IsNewSession) + { + var item = payload.Item; + var session = Entities.ChannelItemSession.FindById(item.Id); + if (session == null) session = new Entities.ChannelItemSession + { + Id = item.Id, + CreatedAt = DateTime.Now, + IsFavorite = 0 + }; + session.LastClick = DateTime.Now; + session.Save(); + } + for (int i = 0; i < this.Tabs.Count; i++) + { + this.Tabs[i].IsSelected = this.Tabs[i].View == Tab.Session.View; + } + } + + public List Tabs { get; } + public string UserName => Environment.UserName; + [RelayCommand] + void OpenTab(TabItem item) + { + if (item == null) return; + OpenTab(item.Tab); + } + void OpenTab(Tab item) + { + if (item == null) return; + foreach (var tab in this.Tabs) + { + tab.IsSelected = tab.View == item.View; + if (tab.IsSelected) _eventAggregator.GetEvent().Publish(tab.Tab); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Rdm/RdpConnection.cs b/LuYao.Toolkit.ViewModels/Rdm/RdpConnection.cs new file mode 100644 index 0000000..95cd616 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Rdm/RdpConnection.cs @@ -0,0 +1,144 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Rdm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public partial class RdpConnection : RdpConnectionBase, IRdpConnection +{ + public RdpConnection() { } + public RdpConnection(Entities.RdpConnection e) : base(e) + { + this.DesktopSize = (DesktopSize)e.DesktopSize; + this.Password = e.Password; + this.Domain = e.Domain; + this.ConnectToConsole = e.ConnectToConsole; + this.DisplayWidth = e.DisplayWidth; + this.DisplayHeight = e.DisplayHeight; + this.AutoExpand = e.AutoExpand; + this.SmartSizing = e.SmartSizing; + this.ColorDepth = (ColorDepth)e.ColorDepth; + this.AudioSetting = (AudioRedirection)e.AudioSetting; + this.KeyboardSetting = (KeyboardRedirection)e.KeyboardSetting; + this.RedirectDisks = e.RedirectDisks; + this.RedirectPorts = e.RedirectPorts; + this.RedirectPrinters = e.RedirectPrinters; + this.RedirectSmartCards = e.RedirectSmartCards; + this.BitmapCaching = e.BitmapCaching; + this.AllowWallpaper = e.AllowWallpaper; + this.AllowThemes = e.AllowThemes; + this.AllowContents = e.AllowContents; + this.AllowAnimation = e.AllowAnimation; + this.AuthenticationLevel = (AuthenticationLevel)e.AuthenticationLevel; + this.EnableCredSspSupport = e.EnableCredSspSupport; + this.Remark = e.Remark; + this.GroupId = e.GroupId; + } + + [ObservableProperty] + private DesktopSize desktopSize; + + [ObservableProperty] + private string password; + + [ObservableProperty] + private string domain; + + [ObservableProperty] + private bool connectToConsole; + + [ObservableProperty] + private int displayWidth; + + [ObservableProperty] + private int displayHeight; + + [ObservableProperty] + private bool autoExpand; + + [ObservableProperty] + private bool smartSizing; + + [ObservableProperty] + private ColorDepth colorDepth; + + [ObservableProperty] + private AudioRedirection audioSetting; + + [ObservableProperty] + private KeyboardRedirection keyboardSetting; + + [ObservableProperty] + private bool redirectDisks; + + [ObservableProperty] + private bool redirectPorts; + + [ObservableProperty] + private bool redirectPrinters; + + [ObservableProperty] + private bool redirectSmartCards; + + [ObservableProperty] + private bool bitmapCaching; + + [ObservableProperty] + private bool allowWallpaper; + + [ObservableProperty] + private bool allowThemes; + + [ObservableProperty] + private bool allowContents; + + [ObservableProperty] + private bool allowAnimation; + + [ObservableProperty] + private AuthenticationLevel authenticationLevel; + + [ObservableProperty] + private bool enableCredSspSupport; + + [ObservableProperty] + private string remark; + + [ObservableProperty] + private Guid groupId; + public void Write(Entities.RdpConnection e) + { + e.DesktopSize = (int)this.DesktopSize; + e.Password = this.Password; + e.Domain = this.Domain; + e.ConnectToConsole = this.ConnectToConsole; + e.DisplayWidth = this.DisplayWidth; + e.DisplayHeight = this.DisplayHeight; + e.AutoExpand = this.AutoExpand; + e.SmartSizing = this.SmartSizing; + e.ColorDepth = (int)this.ColorDepth; + e.AudioSetting = (int)this.AudioSetting; + e.KeyboardSetting = (int)this.KeyboardSetting; + e.RedirectDisks = this.RedirectDisks; + e.RedirectPorts = this.RedirectPorts; + e.RedirectPrinters = this.RedirectPrinters; + e.RedirectSmartCards = this.RedirectSmartCards; + e.BitmapCaching = this.BitmapCaching; + e.AllowWallpaper = this.AllowWallpaper; + e.AllowThemes = this.AllowThemes; + e.AllowContents = this.AllowContents; + e.AllowAnimation = this.AllowAnimation; + e.AuthenticationLevel = (int)this.AuthenticationLevel; + e.EnableCredSspSupport = this.EnableCredSspSupport; + e.Name = this.Name; + e.Host = this.Host; + e.Port = this.Port; + e.Username = this.Username; + e.Remark = this.Remark; + e.GroupId = this.GroupId; + } +} \ No newline at end of file diff --git a/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionBase.cs b/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionBase.cs new file mode 100644 index 0000000..d999ed3 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionBase.cs @@ -0,0 +1,41 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +[INotifyPropertyChanged] +public partial class RdpConnectionBase +{ + [ObservableProperty] + private Guid id; + [ObservableProperty] + private string name; + [ObservableProperty] + private string host; + [ObservableProperty] + private int port; + [ObservableProperty] + private string username; + [ObservableProperty] + private Guid _groupId; + [ObservableProperty] + private string groupName; + [ObservableProperty] + private DateTime _updatedAt; + public RdpConnectionBase() { } + public RdpConnectionBase(Entities.RdpConnection e) : this() + { + this.Id = e.Id; + this.Name = e.Name; + this.Host = e.Host; + this.Port = e.Port; + this.Username = e.Username; + this.GroupId = e.GroupId; + this.GroupName = e.GroupName; + this.UpdatedAt = e.UpdatedAt; + } +} diff --git a/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionCsvMap.cs b/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionCsvMap.cs new file mode 100644 index 0000000..06eb6f9 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Rdm/RdpConnectionCsvMap.cs @@ -0,0 +1,70 @@ +using CsvHelper.Configuration; +using System.Text; + +namespace LuYao.Toolkit.Rdm; + +public class RdpConnectionCsvMap : ClassMap +{ + public RdpConnectionCsvMap() + { + Map(i => i.Id).Name(RenameSnakeCase(nameof(RdpConnection.Id))); + + Map(i => i.UpdatedAt).Name(RenameSnakeCase(nameof(RdpConnection.UpdatedAt))); + + Map(i => i.Name).Name(RenameSnakeCase(nameof(RdpConnection.Name))); + Map(i => i.Host).Name(RenameSnakeCase(nameof(RdpConnection.Host))); + Map(i => i.Port).Name(RenameSnakeCase(nameof(RdpConnection.Port))); + Map(i => i.Username).Name(RenameSnakeCase(nameof(RdpConnection.Username))); + Map(i => i.Password).Name(RenameSnakeCase(nameof(RdpConnection.Password))); + + Map(i => i.GroupName).Name(RenameSnakeCase(nameof(RdpConnection.GroupName))); + + Map(i => i.AllowAnimation).Name(RenameSnakeCase(nameof(RdpConnection.AllowAnimation))); + Map(i => i.AllowContents).Name(RenameSnakeCase(nameof(RdpConnection.AllowContents))); + Map(i => i.AllowThemes).Name(RenameSnakeCase(nameof(RdpConnection.AllowThemes))); + Map(i => i.AllowWallpaper).Name(RenameSnakeCase(nameof(RdpConnection.AllowWallpaper))); + Map(i => i.AudioSetting).Name(RenameSnakeCase(nameof(RdpConnection.AudioSetting))); + Map(i => i.AuthenticationLevel).Name(RenameSnakeCase(nameof(RdpConnection.AuthenticationLevel))); + Map(i => i.AutoExpand).Name(RenameSnakeCase(nameof(RdpConnection.AutoExpand))); + Map(i => i.BitmapCaching).Name(RenameSnakeCase(nameof(RdpConnection.BitmapCaching))); + Map(i => i.ColorDepth).Name(RenameSnakeCase(nameof(RdpConnection.ColorDepth))); + Map(i => i.ConnectToConsole).Name(RenameSnakeCase(nameof(RdpConnection.ConnectToConsole))); + Map(i => i.DesktopSize).Name(RenameSnakeCase(nameof(RdpConnection.DesktopSize))); + Map(i => i.DisplayHeight).Name(RenameSnakeCase(nameof(RdpConnection.DisplayHeight))); + Map(i => i.DisplayWidth).Name(RenameSnakeCase(nameof(RdpConnection.DisplayWidth))); + Map(i => i.Domain).Name(RenameSnakeCase(nameof(RdpConnection.Domain))); + Map(i => i.EnableCredSspSupport).Name(RenameSnakeCase(nameof(RdpConnection.EnableCredSspSupport))); + Map(i => i.KeyboardSetting).Name(RenameSnakeCase(nameof(RdpConnection.KeyboardSetting))); + Map(i => i.RedirectDisks).Name(RenameSnakeCase(nameof(RdpConnection.RedirectDisks))); + Map(i => i.RedirectPorts).Name(RenameSnakeCase(nameof(RdpConnection.RedirectPorts))); + Map(i => i.RedirectPrinters).Name(RenameSnakeCase(nameof(RdpConnection.RedirectPrinters))); + Map(i => i.RedirectSmartCards).Name(RenameSnakeCase(nameof(RdpConnection.RedirectSmartCards))); + Map(i => i.SmartSizing).Name(RenameSnakeCase(nameof(RdpConnection.SmartSizing))); + Map(i => i.Remark).Name(RenameSnakeCase(nameof(RdpConnection.Remark))); + } + private static string RenameSnakeCase(string name) + { + var builder = new StringBuilder(); + var previousUpper = false; + + for (var i = 0; i < name.Length; i++) + { + var c = name[i]; + if (char.IsUpper(c)) + { + if (i > 0 && !previousUpper) + { + builder.Append("_"); + } + builder.Append(char.ToLowerInvariant(c)); + previousUpper = true; + } + else + { + builder.Append(c); + previousUpper = false; + } + } + return builder.ToString(); + } +} diff --git a/LuYao.Toolkit.ViewModels/Rdm/RdpGroup.cs b/LuYao.Toolkit.ViewModels/Rdm/RdpGroup.cs new file mode 100644 index 0000000..2967261 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Rdm/RdpGroup.cs @@ -0,0 +1,24 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; + +namespace LuYao.Toolkit.Rdm; + +[INotifyPropertyChanged] +public partial class RdpGroup +{ + public static RdpGroup All { get; } = new RdpGroup { Id = Guid.Empty, Name = "全部分组", Rank = int.MinValue }; + public static RdpGroup None { get; } = new RdpGroup { Id = Guid.Empty, Name = "无", Rank = int.MaxValue }; + public RdpGroup() { } + public RdpGroup(Entities.RdpGroup e) : this() + { + this.Id = e.Id; + this.Name = e.Name; + this.Rank = e.Rank; + } + [ObservableProperty] + private Guid _id; + [ObservableProperty] + private string _name; + [ObservableProperty] + private int _rank; +} diff --git a/LuYao.Toolkit.ViewModels/Rdm/RdpGroupValidator.cs b/LuYao.Toolkit.ViewModels/Rdm/RdpGroupValidator.cs new file mode 100644 index 0000000..6c5f4e3 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Rdm/RdpGroupValidator.cs @@ -0,0 +1,17 @@ +using FluentValidation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm; + +public class RdpGroupValidator : AbstractValidator +{ + public static RdpGroupValidator Instance { get; } = new RdpGroupValidator(); + public RdpGroupValidator() + { + this.RuleFor(i => i.Name).NotEmpty().WithName("分组名称"); + } +} diff --git a/LuYao.Toolkit.ViewModels/TabItem.cs b/LuYao.Toolkit.ViewModels/TabItem.cs new file mode 100644 index 0000000..8a73b51 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/TabItem.cs @@ -0,0 +1,21 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Tabs; + +namespace LuYao.Toolkit; + +public partial class TabItem : ObservableObject +{ + private Tab _tab; + public Tab Tab => _tab; + [ObservableProperty] + private bool _isSelected; + + public TabItem(Tab tab) + { + _tab = tab; + } + public string Icon => _tab.Icon; + public string IconArchived => _tab.IconArchived; + public string Title => _tab.Title; + public string View => _tab.View; +} diff --git a/LuYao.Toolkit.ViewModels/Tabs/Explorer/IndexViewModel.cs b/LuYao.Toolkit.ViewModels/Tabs/Explorer/IndexViewModel.cs new file mode 100644 index 0000000..2b38a51 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Tabs/Explorer/IndexViewModel.cs @@ -0,0 +1,31 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Channels; +using Prism.Events; +using System; +using System.Collections.Generic; + +namespace LuYao.Toolkit.Tabs.Explorer; + +public partial class IndexViewModel : ViewModelBase +{ + public IndexViewModel(IEventAggregator eventAggregator) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + this.Selected = Channels[0]; + } + private IEventAggregator _eventAggregator; + public IReadOnlyList Channels => Channel.Channels; + [ObservableProperty] + private Channel _selected; + + [RelayCommand] + void OpenItem(FunctionItem item) + { + if (item == null) return; + _eventAggregator.GetEvent().Publish(new Events.OpenFunctionItemEventPayload(item) + { + IsNewSession = true + }); + } +} diff --git a/LuYao.Toolkit.ViewModels/Tabs/Navs/IndexViewModel.cs b/LuYao.Toolkit.ViewModels/Tabs/Navs/IndexViewModel.cs new file mode 100644 index 0000000..b13ff57 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Tabs/Navs/IndexViewModel.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.Input; +using NewLife.Reflection; +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace LuYao.Toolkit.Tabs.Navs; + +public partial class IndexViewModel : ViewModelBase +{ + public IndexViewModel() + { + this.Groups = NavGroup.GetAll(); + } + + public IReadOnlyCollection Groups { get; } + + [RelayCommand] + private void Open(NavItem item) + { + if (string.IsNullOrWhiteSpace(item.Url)) return; + var builder = new UriBuilder(item.Url); + var qs = System.Web.HttpUtility.ParseQueryString(builder.Query); + qs["from"] = "LuYao.Toolkit"; + qs["ver"] = AssemblyX.Entry.Version; + builder.Query = qs.ToString(); + Start(builder.ToString()); + Services.TongjiService.Tongji(Views.ViewNames.Tabs.Navs.Index + "?jump=" + Uri.EscapeDataString(item.Title)); + } + + public static void Start(string url) // 调用系统默认的浏览器 + { + try + { + var p = Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + Debug.WriteLine(ex); + if (url.StartsWith("http")) throw new Exception($"系统默认浏览器未设置好,请设置后重试![{ex.Message}]"); + throw new Exception($"系统未找到能打开{url}文件的应用程序![{ex.Message}]"); + } + } +} diff --git a/LuYao.Toolkit.ViewModels/Tabs/Rdp/IndexViewModel.cs b/LuYao.Toolkit.ViewModels/Tabs/Rdp/IndexViewModel.cs new file mode 100644 index 0000000..cdf1021 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Tabs/Rdp/IndexViewModel.cs @@ -0,0 +1,15 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Rdm; +using LuYao.Toolkit.Rdm.Events; +using Prism.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using XCode; + +namespace LuYao.Toolkit.Tabs.Rdp; + +public partial class IndexViewModel : ViewModelBase +{ +} diff --git a/LuYao.Toolkit.ViewModels/Tabs/Session/ChannelItemSessionItem.cs b/LuYao.Toolkit.ViewModels/Tabs/Session/ChannelItemSessionItem.cs new file mode 100644 index 0000000..909dee3 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Tabs/Session/ChannelItemSessionItem.cs @@ -0,0 +1,21 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.Channels; +using System; +using System.Collections.Generic; +using System.Text; + +namespace LuYao.Toolkit.Tabs.Session; + +[INotifyPropertyChanged] +public partial class ChannelItemSessionItem +{ + public ChannelItemSessionItem(FunctionItem item) + { + Item = item ?? throw new ArgumentNullException(nameof(item)); + } + public FunctionItem Item { get; } + [ObservableProperty] + private int _isFavorite; + [ObservableProperty] + private DateTime _lastClick; +} diff --git a/LuYao.Toolkit.ViewModels/Tabs/Session/IndexViewModel.cs b/LuYao.Toolkit.ViewModels/Tabs/Session/IndexViewModel.cs new file mode 100644 index 0000000..ae83591 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/Tabs/Session/IndexViewModel.cs @@ -0,0 +1,161 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Channels; +using LuYao.Toolkit.Events; +using Prism.Events; +using System; +using System.Collections.ObjectModel; +using System.Linq; + +namespace LuYao.Toolkit.Tabs.Session; + +public partial class IndexViewModel : ViewModelBase +{ + private readonly IEventAggregator eventAggregator; + public IndexViewModel(IEventAggregator eventAggregator) + { + Sessions = new ObservableCollection(); + this.eventAggregator = eventAggregator; + ReloadSession(); + if (this.Sessions.Count > 0) this.Session = this.Sessions[0]; + this.eventAggregator.GetEvent().Subscribe(this.OnOpenFunctionItem); + } + + private void OnOpenFunctionItem(OpenFunctionItemEventPayload payload) + { + if (payload.IsMultiboxing) return; + if (payload.IsNewSession) + { + var item = payload.Item; + var session = Entities.ChannelItemSession.FindById(item.Id); + if (session == null) session = new Entities.ChannelItemSession + { + Id = item.Id, + CreatedAt = DateTime.Now, + IsFavorite = 0, + LastClick = DateTime.Now, + }; + var idx = -1; + for (int i = 0; i < this.Sessions.Count; i++) + { + var tmp = this.Sessions[i]; + if (tmp.Item.Id == item.Id) + { + idx = i; + tmp.LastClick = session.LastClick; + this.Session = tmp; + break; + } + } + + if (idx < 0) + { + var add = new ChannelItemSessionItem(item) { IsFavorite = session.IsFavorite, LastClick = session.LastClick }; + this.Sessions.Insert(0, add); + this.Session = add; + } + else if (idx > 0) + { + this.Sessions.Move(idx, 0); + } + } + } + + public ObservableCollection Sessions { get; } + [ObservableProperty] + private ChannelItemSessionItem _session; + private void ReloadSession() + { + var list = Entities.ChannelItemSession.FindAll(50); + //only add + foreach (var item in list) + { + var find = Sessions.FirstOrDefault(i => i.Item.Id == item.Id); + if (find == null) + { + if (Channel.TryGetItem(item.Id, out var channelItem)) + { + var session = new ChannelItemSessionItem(channelItem) + { + IsFavorite = item.IsFavorite, + LastClick = item.LastClick + }; + this.Sessions.Add(session); + } + else + { + item.Delete(); + } + } + else + { + find.IsFavorite = item.IsFavorite; + find.LastClick = item.LastClick; + } + } + } + private void Open(FunctionItem item, bool isNewSession) + { + this.eventAggregator.GetEvent() + .Publish(new OpenFunctionItemEventPayload(item) + { + IsNewSession = isNewSession + }); + } + [RelayCommand] + private void Open(FunctionItem item) + { + if (item == null) return; + this.IsSearching = false; + Open(item, true); + } + partial void OnSessionChanged(ChannelItemSessionItem value) + { + if (value == null) return; + Open(value.Item, false); + } + [RelayCommand] + private void OpenNew(ChannelItemSessionItem item) + { + if (item == null) return; + this.eventAggregator.GetEvent() + .Publish(new OpenFunctionItemEventPayload(item.Item) { IsMultiboxing = true }); + } + [ObservableProperty] + private bool _isSearching = false; + [ObservableProperty] + private string _keyword = string.Empty; + public ObservableCollection Suggestions { get; } = new ObservableCollection(); + private void Search(string key) + { + if (!this.IsSearching && !string.IsNullOrWhiteSpace(key)) this.IsSearching = true; + var items = FunctionItem.Search(key, 10); + this.Suggestions.Clear(); + if (items.Count > 0) + { + foreach (var item in items) this.Suggestions.Add(item); + } + } + partial void OnIsSearchingChanged(bool value) + { + if (value == false) this.Keyword = string.Empty; + } + partial void OnKeywordChanged(string value) => Search(value); + [RelayCommand] + private void OpenSearch() => this.IsSearching = true; + [RelayCommand] + private void CloseSearch() => this.IsSearching = false; + [RelayCommand] + private void Delete(ChannelItemSessionItem item) + { + if (item == null) return; + var check = item == this.Session; + this.Sessions.Remove(item); + var find = Entities.ChannelItemSession.FindById(item.Item.Id); + if (find != null) find.Delete(); + if (check && this.Sessions.Count > 0) + { + this.Session = this.Sessions[0]; + } + } +} diff --git a/LuYao.Toolkit.ViewModels/UI/DetailViewModelBase.cs b/LuYao.Toolkit.ViewModels/UI/DetailViewModelBase.cs new file mode 100644 index 0000000..2fc1516 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/UI/DetailViewModelBase.cs @@ -0,0 +1,19 @@ +using Prism.Regions; +using System; + +namespace LuYao.Toolkit.UI; + +public abstract partial class DetailViewModelBase : ViewModelBase, INavigationAware +{ + private IMasterDetailViewModel _masterDetailViewModel; + public abstract bool IsNavigationTarget(NavigationContext navigationContext); + + public abstract void OnNavigatedFrom(NavigationContext navigationContext); + + public virtual void OnNavigatedTo(NavigationContext navigationContext) + { + _masterDetailViewModel = null; + if (navigationContext.Parameters.TryGetValue("MasterDetailViewModel", out var vm)) _masterDetailViewModel = vm; + } + protected IMasterDetailViewModel MasterDetailViewModel => _masterDetailViewModel ?? throw new ArgumentNullException(); +} diff --git a/LuYao.Toolkit.ViewModels/UI/IMasterDetailViewModel.cs b/LuYao.Toolkit.ViewModels/UI/IMasterDetailViewModel.cs new file mode 100644 index 0000000..9aeeea9 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/UI/IMasterDetailViewModel.cs @@ -0,0 +1,6 @@ +namespace LuYao.Toolkit.UI; + +public interface IMasterDetailViewModel +{ + bool IsShowDetail { get; set; } +} diff --git a/LuYao.Toolkit.ViewModels/UI/MasterDetailViewModelBase.cs b/LuYao.Toolkit.ViewModels/UI/MasterDetailViewModelBase.cs new file mode 100644 index 0000000..279a654 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/UI/MasterDetailViewModelBase.cs @@ -0,0 +1,26 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Prism.Regions; + +namespace LuYao.Toolkit.UI; + +public partial class MasterDetailViewModelBase : ViewModelBase, IMasterDetailViewModel +{ + [ObservableProperty] + private bool _isShowDetail = false; + + protected NavigationParameters CreateNavigationParameters() + { + var p = new NavigationParameters + { + { "MasterDetailViewModel", this } + }; + return p; + } + partial void OnIsShowDetailChanged(bool value) + { + if (value) OnShowDetail(); + else OnHideDetail(); + } + protected virtual void OnShowDetail() { } + protected virtual void OnHideDetail() { } +} diff --git a/LuYao.Toolkit.ViewModels/ViewModelBase.cs b/LuYao.Toolkit.ViewModels/ViewModelBase.cs new file mode 100644 index 0000000..7ca3a47 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/ViewModelBase.cs @@ -0,0 +1,36 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using LuYao.Toolkit.ViewStates; +using Prism.Navigation; +using System; +using System.Collections.Concurrent; + +namespace LuYao.Toolkit; + +public partial class ViewModelBase : ObservableObject, IDestructible, IViewStateHost +{ + private static readonly ConcurrentDictionary _count = new ConcurrentDictionary(); + private int instanceId; + public ViewModelBase() + { + this.instanceId = _count.AddOrUpdate(this.GetType(), 1, (t, x) => x + 1); + this.ViewState = new ViewStateBag(this); + } + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsNotBusy))] + private bool _isBusy = false; + public bool IsNotBusy => _isBusy == false; + + int IViewStateHost.InstanceId => this.instanceId; + + protected ViewStateBag ViewState { get; } + public virtual void Destroy() + { + _count.AddOrUpdate(this.GetType(), 0, (t, x) => x - 1); + } + + protected IDisposable Busy() + { + this.IsBusy = true; + return new DisposeAction(() => this.IsBusy = false); + } +} diff --git a/LuYao.Toolkit.ViewModels/ViewStates/IViewStateHost.cs b/LuYao.Toolkit.ViewModels/ViewStates/IViewStateHost.cs new file mode 100644 index 0000000..bdab04a --- /dev/null +++ b/LuYao.Toolkit.ViewModels/ViewStates/IViewStateHost.cs @@ -0,0 +1,9 @@ +using System.ComponentModel; + +namespace LuYao.Toolkit.ViewStates +{ + public interface IViewStateHost : INotifyPropertyChanged + { + public int InstanceId { get; } + } +} diff --git a/LuYao.Toolkit.ViewModels/ViewStates/ViewStateBag.cs b/LuYao.Toolkit.ViewModels/ViewStates/ViewStateBag.cs new file mode 100644 index 0000000..f02fc97 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/ViewStates/ViewStateBag.cs @@ -0,0 +1,79 @@ +using NewLife.Threading; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Reflection; + +namespace LuYao.Toolkit.ViewStates; + +public class ViewStateBag : SortedDictionary +{ + private static readonly ConcurrentQueue _bags = new ConcurrentQueue(); + private static readonly TimerX _timer; + static ViewStateBag() + { + _timer = new TimerX(Flush, _bags, int.MaxValue, int.MaxValue); + } + public static void Flush() => Flush(_bags); + private static void Flush(object locker) + { + lock (locker) + { + var set = new HashSet(); + while (_bags.TryDequeue(out var item)) set.Add(item); + foreach (var item in set) + { + var entity = item.FindEntity() ?? new Entities.ViewModelState { CreatedAt = DateTime.Now, Type = item.HostType.FullName }; + entity.UpdatedAt = DateTime.Now; + entity.Value = item.ToJson(); + entity.Save(); + } + } + } + public ViewStateBag(IViewStateHost host) + { + this._host = host; + this.HostType = host.GetType(); + var entity = FindEntity(); + if (entity != null) JsonConvert.PopulateObject(entity.Value, this); + var fields = this.HostType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var field in fields) + { + var attributes = field.GetCustomAttributes(); + foreach (var item in attributes) maps[item.Property] = field; + } + if (maps.Count > 0 && this.Count > 0) + { + foreach (var item in maps) + { + if (this.TryGetValue(item.Key, out var value)) + { + var fld = item.Value; + var type = fld.FieldType; + if (type.FullName == value.Type) item.Value.SetValue(host, value.Read(type)); + } + } + } + if (this._host.InstanceId == 1) + { + this._host.PropertyChanged += this.PropertyChanged; + } + } + private SortedDictionary maps = new SortedDictionary(); + public Type HostType { get; } + private Entities.ViewModelState FindEntity() => Entities.ViewModelState.FindByType(this.HostType.FullName); + private void PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (!this.maps.TryGetValue(e.PropertyName, out var field)) return; + var value = field.GetValue(this._host); + if (!this.TryGetValue(e.PropertyName, out var item)) item = this[e.PropertyName] = new ViewStateItem(); + item.Write(value); + _bags.Enqueue(this); + _timer.SetNext(1000); + } + + private readonly IViewStateHost _host; + + public string ToJson() => JsonConvert.SerializeObject(this); +} diff --git a/LuYao.Toolkit.ViewModels/ViewStates/ViewStateItem.cs b/LuYao.Toolkit.ViewModels/ViewStates/ViewStateItem.cs new file mode 100644 index 0000000..d2537f5 --- /dev/null +++ b/LuYao.Toolkit.ViewModels/ViewStates/ViewStateItem.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; +using System; + +namespace LuYao.Toolkit.ViewStates; + +public class ViewStateItem +{ + public string Type { get; set; } + public string Json { get; set; } + public object Read(Type type) + { + return JsonConvert.DeserializeObject(Json, type); + } + public void Write(object value) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + Type = value.GetType().FullName; + Json = JsonConvert.SerializeObject(value); + } +} diff --git a/LuYao.Toolkit.ViewModels/ViewStates/WatchViewStateAttribute.cs b/LuYao.Toolkit.ViewModels/ViewStates/WatchViewStateAttribute.cs new file mode 100644 index 0000000..a513b3e --- /dev/null +++ b/LuYao.Toolkit.ViewModels/ViewStates/WatchViewStateAttribute.cs @@ -0,0 +1,14 @@ +using System; + +namespace LuYao.Toolkit.ViewStates; + +[AttributeUsage(AttributeTargets.Field)] +public class WatchViewStateAttribute : Attribute +{ + public string Property { get; } + public WatchViewStateAttribute(string property) + { + if (string.IsNullOrWhiteSpace(property)) throw new ArgumentOutOfRangeException(nameof(property)); + Property = property; + } +} diff --git a/LuYao.Toolkit.sln b/LuYao.Toolkit.sln new file mode 100644 index 0000000..6e84edb --- /dev/null +++ b/LuYao.Toolkit.sln @@ -0,0 +1,48 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31912.275 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LuYao.Toolkit.ViewModels", "LuYao.Toolkit.ViewModels\LuYao.Toolkit.ViewModels.csproj", "{4D8200CA-1142-4BC7-A637-E8CA88213313}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LuYao.Toolkit.Core", "LuYao.Toolkit.Core\LuYao.Toolkit.Core.csproj", "{6B78E333-74F7-48DB-B49D-C54ABCC215F0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LuYao.Toolkit", "LuYao.Toolkit\LuYao.Toolkit.csproj", "{D1E1E873-F697-42D8-9EA6-1A280DF3D4FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LuYao.Toolkit.Extensions", "LuYao.Toolkit.Extensions\LuYao.Toolkit.Extensions.csproj", "{9DCF56D7-CE8C-4CC6-9FCA-8BCF75661552}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{CAF0F5E4-6A8C-4B4F-B46C-DF65CE11619F}" + ProjectSection(SolutionItems) = preProject + common.props = common.props + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4D8200CA-1142-4BC7-A637-E8CA88213313}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D8200CA-1142-4BC7-A637-E8CA88213313}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D8200CA-1142-4BC7-A637-E8CA88213313}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D8200CA-1142-4BC7-A637-E8CA88213313}.Release|Any CPU.Build.0 = Release|Any CPU + {6B78E333-74F7-48DB-B49D-C54ABCC215F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B78E333-74F7-48DB-B49D-C54ABCC215F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B78E333-74F7-48DB-B49D-C54ABCC215F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B78E333-74F7-48DB-B49D-C54ABCC215F0}.Release|Any CPU.Build.0 = Release|Any CPU + {D1E1E873-F697-42D8-9EA6-1A280DF3D4FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1E1E873-F697-42D8-9EA6-1A280DF3D4FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1E1E873-F697-42D8-9EA6-1A280DF3D4FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1E1E873-F697-42D8-9EA6-1A280DF3D4FB}.Release|Any CPU.Build.0 = Release|Any CPU + {9DCF56D7-CE8C-4CC6-9FCA-8BCF75661552}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DCF56D7-CE8C-4CC6-9FCA-8BCF75661552}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DCF56D7-CE8C-4CC6-9FCA-8BCF75661552}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DCF56D7-CE8C-4CC6-9FCA-8BCF75661552}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E2A6C1AD-DC44-41A3-BA1E-663ED4ADA32D} + EndGlobalSection +EndGlobal diff --git a/LuYao.Toolkit/App.config b/LuYao.Toolkit/App.config new file mode 100644 index 0000000..52b7622 --- /dev/null +++ b/LuYao.Toolkit/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/App.ico b/LuYao.Toolkit/App.ico new file mode 100644 index 0000000..d7d6ad4 Binary files /dev/null and b/LuYao.Toolkit/App.ico differ diff --git a/LuYao.Toolkit/App.xaml b/LuYao.Toolkit/App.xaml new file mode 100644 index 0000000..3027eef --- /dev/null +++ b/LuYao.Toolkit/App.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + pack://application:,,,/LuYao.Toolkit;component/Resources/#JetBrains Mono + + + diff --git a/LuYao.Toolkit/App.xaml.cs b/LuYao.Toolkit/App.xaml.cs new file mode 100644 index 0000000..10773b3 --- /dev/null +++ b/LuYao.Toolkit/App.xaml.cs @@ -0,0 +1,162 @@ + +using FluentValidation; +using LuYao.IO.Updating; +using LuYao.Toolkit.Behaviors; +using LuYao.Toolkit.Controls.AvalonEdit; +using LuYao.Toolkit.Dialogs; +using LuYao.Toolkit.Entities; +using LuYao.Toolkit.Rdm.Dialogs; +using LuYao.Toolkit.Regions; +using LuYao.Toolkit.Services; +using LuYao.Toolkit.Themes; +using LuYao.Toolkit.Update; +using LuYao.Toolkit.Views; +using NewLife.Log; +using NewLife.Reflection; +using OfficeOpenXml; +using Prism.Ioc; +using Prism.Mvvm; +using Prism.Unity; +using System; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using LicenseContext = OfficeOpenXml.LicenseContext; + +namespace LuYao.Toolkit; + +/// +/// Interaction logic for App.xaml +/// +public partial class App : PrismApplication +{ + static App() + { + AssemblyX.ResolveFilter = ResolveFilter; + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + } + + public App() + { + ProcessManager.GetProcessLock(); + } + + protected override void OnStartup(StartupEventArgs e) + { + var splashScreen = new SplashScreen("Resources/Toolbox.png"); + splashScreen.Show(true); + this.DispatcherUnhandledException += App_DispatcherUnhandledException; + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + Task.Run(ChannelItemSession.FindCount); + HighlightingHelper.RegisterHighlighting(); + ThemeManager.ThemeChanged += ThemeManager_ThemeChanged; + base.OnStartup(e); + Task.Run(Clear); + } + private static void Clear() + { + UpdatePackageHelper.Clear(AppDomain.CurrentDomain.BaseDirectory); + } + + private static void ThemeManager_ThemeChanged(object sender, ThemeMode e) + { + HighlightingHelper.RegisterHighlighting(); + } + + private static bool ResolveFilter(string name) + { + if (string.IsNullOrWhiteSpace(name)) return false; + if (name.Contains(".resources,")) return false; + return true; + } + private static void ShowError(string msg) + { + Services.NotifyService.Warning(msg); + } + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (e.ExceptionObject is Exception ex) + { + XTrace.WriteLine("CurrentDomain_UnhandledException"); + XTrace.WriteException(ex); + ShowError(ex.Message); + } + } + + private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) + { + XTrace.WriteLine("TaskScheduler_UnobservedTaskException"); + XTrace.WriteException(e.Exception); + ShowError(e.Exception.Message); + e.SetObserved(); + } + + private static void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + XTrace.WriteLine("App_DispatcherUnhandledException"); + XTrace.WriteException(e.Exception); + if (e.Exception is ValidationException v) + { + Services.MessageBoxService.Alert(v.Message, "验证失败"); + } + else + { + ShowError(e.Exception.Message); + } + e.Handled = true; + } + protected override Window CreateShell() + { + return this.Container.Resolve(); + } + + protected override void RegisterTypes(IContainerRegistry containerRegistry) + { + AppRegisterTypes.RegisterViews(containerRegistry); + + containerRegistry.RegisterDialogWindow(); + containerRegistry.RegisterDialogWindow(nameof(MultiboxingDialogWindow)); + containerRegistry.RegisterDialog(); + + containerRegistry.RegisterDialog(nameof(RdpConnectionDetailDialog)); + containerRegistry.RegisterDialog(nameof(RdmSettingDialog)); + containerRegistry.RegisterDialog(nameof(RdpGroupDetailDialog)); + containerRegistry.RegisterDialog(nameof(FindNewVersionDialog)); + containerRegistry.RegisterDialog(nameof(PreviewFileAsStringDialog)); + containerRegistry.RegisterDialog(nameof(ToolkitSettingsDialog)); + } + + protected override void Initialize() + { + base.Initialize(); + var mgr = this.Container.Resolve(); + + if (ChannelItemSession.HasSessin()) + { + mgr.RegisterViewWithRegion(RegionNames.MainRegion, ViewNames.Tabs.Session.Index); + } + else + { + mgr.RegisterViewWithRegion(RegionNames.MainRegion, ViewNames.Tabs.Explorer.Index); + } + + + ServiceProviderContainer.SetProvider(new ServiceProvider()); + } + + protected override void ConfigureViewModelLocator() + { + base.ConfigureViewModelLocator(); + ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( + static (view) => AppHelper.ViewModelTypeResolver(view, typeof(ViewModelBase).Assembly, view.Assembly) + ); + } + + protected override void OnExit(ExitEventArgs e) + { + ViewStates.ViewStateBag.Flush(); + base.OnExit(e); + } +} diff --git a/LuYao.Toolkit/AppRegisterTypes.cs b/LuYao.Toolkit/AppRegisterTypes.cs new file mode 100644 index 0000000..473d7bf --- /dev/null +++ b/LuYao.Toolkit/AppRegisterTypes.cs @@ -0,0 +1,65 @@ +using Prism.Ioc; + +namespace LuYao.Toolkit; +static class AppRegisterTypes +{ + public static void RegisterViews(IContainerRegistry containerRegistry) + { + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.ColorConverter), "Channels.Converters.ColorConverter"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.HexConvert), "Channels.Converters.HexConvert"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.IndentJson), "Channels.Converters.IndentJson"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.IndentXml), "Channels.Converters.IndentXml"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.JsonToCSharp), "Channels.Converters.JsonToCSharp"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.JsonToCsv), "Channels.Converters.JsonToCsv"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.PostmanConverter), "Channels.Converters.PostmanConverter"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.RsaKeyConvert), "Channels.Converters.RsaKeyConvert"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.TranslateJsonByJs), "Channels.Converters.TranslateJsonByJs"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.TranslateJsonByLiquid), "Channels.Converters.TranslateJsonByLiquid"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.TranslateXmlByXsl), "Channels.Converters.TranslateXmlByXsl"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.UnixTimestamp), "Channels.Converters.UnixTimestamp"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Converts.YamlToJson), "Channels.Converters.YamlToJson"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.CrossBorder.MercadoToWorldFirst), "Channels.CrossBorder.MercadoToWorldFirst"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.Ascii85Encode), "Channels.Encodings.Ascii85Encode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.Base16Encode), "Channels.Encodings.Base16Encode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.Base62Encode), "Channels.Encodings.Base62Encode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.Base64Encode), "Channels.Encodings.Base64Encode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.HtmlEncode), "Channels.Encodings.HtmlEncode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.StringZipper), "Channels.Encodings.StringZipper"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Encodings.UrlEncode), "Channels.Encodings.UrlEncode"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Files.DetectFileEncodeing), "Channels.Files.DetectFileEncodeing"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Files.HashFile), "Channels.Files.HashFile"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenAesKey), "Channels.Gens.GenAesKey"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenGuid), "Channels.Gens.GenGuid"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenLinesByRange), "Channels.Gens.GenLinesByRange"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenPassword), "Channels.Gens.GenPassword"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenRsaKey), "Channels.Gens.GenRsaKey"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Gens.GenXCodeEntity), "Channels.Gens.GenXCodeEntity"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Images.Base64ToImage), "Channels.Images.Base64ToImage"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Images.GifSplitter), "Channels.Images.GifSplitter"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Images.ImageToBase64), "Channels.Images.ImageToBase64"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Images.ImageToIcon), "Channels.Images.ImageToIcon"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.HttpProxyChecker), "Channels.Networks.HttpProxyChecker"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.IPLookup), "Channels.Networks.IPLookup"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.Ping), "Channels.Networks.Ping"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.PortProxy.Detail), "Channels.Networks.PortProxy.Detail"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.PortProxy.Index), "Channels.Networks.PortProxy.Index"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.RemoteDesktopManager), "Channels.Networks.RemoteDesktopManager"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.TrafficMonitor), "Channels.Networks.TrafficMonitor"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.UrlAnalyzer), "Channels.Networks.UrlAnalyzer"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.UserAgentParser), "Channels.Networks.UserAgentParser"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Networks.Whois), "Channels.Networks.Whois"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Other.SystemToolkit), "Channels.Other.SystemToolkit"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.CsvReader), "Channels.Texts.CsvReader"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.FullHalfConvert), "Channels.Texts.FullHalfConvert"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.GoogleTranslate), "Channels.Texts.GoogleTranslate"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.HashCalculator), "Channels.Texts.HashCalculator"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.LogReader), "Channels.Texts.LogReader"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.RegexEvaluator), "Channels.Texts.RegexEvaluator"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.TextJoin), "Channels.Texts.TextJoin"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Channels.Texts.YoudaoDictionary), "Channels.Texts.YoudaoDictionary"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Tabs.Explorer.Index), "Tabs.Explorer.Index"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Tabs.Navs.Index), "Tabs.Navs.Index"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Tabs.Rdp.Index), "Tabs.Rdp.Index"); + containerRegistry.RegisterForNavigation(typeof(LuYao.Toolkit.Tabs.Session.Index), "Tabs.Session.Index"); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/AppRegisterTypes.linq b/LuYao.Toolkit/AppRegisterTypes.linq new file mode 100644 index 0000000..eceefad --- /dev/null +++ b/LuYao.Toolkit/AppRegisterTypes.linq @@ -0,0 +1,38 @@ + + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Toolkit.Core.dll + D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\bin\Debug\net7.0-windows\LuYao.Toolkit.dll + Fluid.Core + LuYao.Toolkit + LuYao.Toolkit.Views + Fluid + + +var assembly = typeof(MainWindow).Assembly; +var types = assembly.GetTypes(); +var dic = new SortedDictionary(); +foreach (var item in types) +{ + if (item.IsAbstract) continue; + if (item.IsGenericType) continue; + var attr = item.GetCustomAttribute(); + if (attr == null) continue; + var key = item.FullName; + var view = attr.Name; + dic[key] = view; +} +var dir = Path.GetDirectoryName(Util.CurrentQueryPath); +var parser = new FluidParser(); +var model = new { Types = dic.Select(i => new { Type = i.Key, View = i.Value }).ToList() }; +var source = File.ReadAllText(Path.Combine(dir, "AppRegisterTypes.liquid")); +if (parser.TryParse(source, out var template, out var error)) +{ + var context = new TemplateContext(model); + context.Options.MemberAccessStrategy = new UnsafeMemberAccessStrategy(); + var output = template.Render(context); + Console.WriteLine(output); + File.WriteAllText(Path.Combine(dir, "AppRegisterTypes.cs"), output, Encoding.UTF8); +} +else +{ + Console.WriteLine($"Error: {error}"); +} \ No newline at end of file diff --git a/LuYao.Toolkit/AppRegisterTypes.liquid b/LuYao.Toolkit/AppRegisterTypes.liquid new file mode 100644 index 0000000..72a819d --- /dev/null +++ b/LuYao.Toolkit/AppRegisterTypes.liquid @@ -0,0 +1,12 @@ +using Prism.Ioc; + +namespace LuYao.Toolkit; +static class AppRegisterTypes +{ + public static void RegisterViews(IContainerRegistry containerRegistry) + { +{%- for item in Types %} + containerRegistry.RegisterForNavigation(typeof({{item.Type}}), {{item.View | json}}); +{%- endfor %} + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/AssemblyInfo.cs b/LuYao.Toolkit/AssemblyInfo.cs new file mode 100644 index 0000000..74087a1 --- /dev/null +++ b/LuYao.Toolkit/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/LuYao.Toolkit/Attaches/ComboBoxAttach.cs b/LuYao.Toolkit/Attaches/ComboBoxAttach.cs new file mode 100644 index 0000000..c6caf7a --- /dev/null +++ b/LuYao.Toolkit/Attaches/ComboBoxAttach.cs @@ -0,0 +1,47 @@ +using NewLife; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Attaches; + +public static class ComboBoxAttach +{ + + public static readonly DependencyProperty BindEnumProperty = + DependencyProperty.RegisterAttached("BindEnum", typeof(Type), typeof(ComboBoxAttach), new PropertyMetadata(null, OnBindEnumChanged)); + public static void SetBindEnum(DependencyObject element, Type value) + { + element.SetValue(BindEnumProperty, value); + } + + public static Type GetBindEnum(DependencyObject element) + { + return (Type)element.GetValue(BindEnumProperty); + } + private static void OnBindEnumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is ComboBox combo && e.NewValue is Type type && type.IsEnum) + { + var values = Enum.GetValues(type); + combo.DisplayMemberPath = "Display"; + combo.SelectedValuePath = "Value"; + combo.Items.Clear(); + foreach (Enum item in values) + { + var desc = item.GetDescription(); + if (string.IsNullOrWhiteSpace(desc)) desc = item.ToString(); + var dto = new + { + Display = desc, + Value = item + }; + combo.Items.Add(dto); + } + } + } +} diff --git a/LuYao.Toolkit/Attaches/FileDragDropAttach.cs b/LuYao.Toolkit/Attaches/FileDragDropAttach.cs new file mode 100644 index 0000000..ba693ff --- /dev/null +++ b/LuYao.Toolkit/Attaches/FileDragDropAttach.cs @@ -0,0 +1,60 @@ +using System; +using System.Windows; + +namespace LuYao.Toolkit.Attaches; + +public static class FileDragDropAttach +{ + public static readonly DependencyProperty GroupProperty = + DependencyProperty.Register("Group", typeof(string), typeof(FrameworkElement), new PropertyMetadata(string.Empty, OnGroupChanged) + { + }); + + public static void SetGroup(DependencyObject element, string value) + { + element.SetValue(GroupProperty, value); + } + public static string GetGroup(DependencyObject obj) + { + return (string)obj.GetValue(GroupProperty); + } + + private static void OnGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is FrameworkElement element) + { + var g = Convert.ToString(e.NewValue ?? string.Empty); + if (string.IsNullOrWhiteSpace(g)) + { + element.AllowDrop = false; + element.PreviewDragOver -= Element_PreviewDragOver; + element.Drop -= Element_Drop; + } + else + { + element.AllowDrop = true; + element.PreviewDragOver += Element_PreviewDragOver; + element.Drop += Element_Drop; + } + } + } + + private static void Element_Drop(object sender, DragEventArgs e) + { + if (sender is FrameworkElement element && element.DataContext is IFileDragDropTarget target) + { + var group = (string)element.GetValue(GroupProperty); + if (string.IsNullOrWhiteSpace(group)) return; + + if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return; + + if (e.Data.GetData(DataFormats.FileDrop) is string[] files) target.OnFilesDropped(group, files); + } + } + + private static void Element_PreviewDragOver(object sender, DragEventArgs e) + { + e.Effects = DragDropEffects.Move; + e.Handled = true; + } +} diff --git a/LuYao.Toolkit/Attaches/TextBoxAttach.cs b/LuYao.Toolkit/Attaches/TextBoxAttach.cs new file mode 100644 index 0000000..5dc693a --- /dev/null +++ b/LuYao.Toolkit/Attaches/TextBoxAttach.cs @@ -0,0 +1,7 @@ +using System.Windows; + +namespace LuYao.Toolkit.Attaches; + +public static class TextBoxAttach +{ +} diff --git a/LuYao.Toolkit/Attaches/UniformSpacingPanelAttach.cs b/LuYao.Toolkit/Attaches/UniformSpacingPanelAttach.cs new file mode 100644 index 0000000..45735a3 --- /dev/null +++ b/LuYao.Toolkit/Attaches/UniformSpacingPanelAttach.cs @@ -0,0 +1,106 @@ +using HandyControl.Controls; +using HandyControl.Tools.Extension; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace LuYao.Toolkit.Attaches; + +public static class UniformSpacingPanelAttach +{ + static UniformSpacingPanelAttach() + { + } + public static readonly DependencyProperty ColumnsProperty = DependencyProperty.RegisterAttached( + "Columns", + typeof(int), + typeof(UniformSpacingPanel), + new PropertyMetadata(0, OnColumnsChanged) + ); + + private static void OnColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is UniformSpacingPanel panel) + { + FixItemWidth(panel); + panel.SizeChanged += Panel_SizeChanged; + } + } + public static readonly DependencyProperty LayoutProperty = DependencyProperty.RegisterAttached( + "Layout", + typeof(ColLayout), + typeof(UniformSpacingPanel), + new PropertyMetadata(null, OnLayoutChanged) + ); + + private static void OnLayoutChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is UniformSpacingPanel panel) + { + FixItemWidth(panel); + panel.SizeChanged += Panel_SizeChanged; + } + } + + public static void SetColumns(DependencyObject element, int value) => element.SetValue(ColumnsProperty, value); + public static int GetColumns(DependencyObject element) => (int)element.GetValue(ColumnsProperty); + public static ColLayout GetLayout(DependencyObject element) => (ColLayout)element.GetValue(LayoutProperty); + public static void SetLayout(DependencyObject element, ColLayout value) => element.SetValue(LayoutProperty, value); + + private static void Panel_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (sender is UniformSpacingPanel panel) FixItemWidth(panel); + } + private static void FixItemWidth(UniformSpacingPanel panel) + { + var full = panel.ActualWidth; + if (full <= 0) full = panel.Width; + var cols = GetColumns(panel); + var layout = GetLayout(panel); + if (layout != null) + { + FrameworkElement parent = System.Windows.Window.GetWindow(panel); + if (parent == null) + { + FrameworkElement cursor = panel; + while (cursor.Parent is FrameworkElement element) + { + cursor = element; + parent = cursor; + } + } + if (parent == null) parent = panel; + var status = ColLayout.GetLayoutStatus(parent.ActualWidth); + var unit = ColLayout.ColMaxCellCount; + switch (status) + { + case HandyControl.Data.ColLayoutStatus.Xs: unit = layout.Xs; break; + case HandyControl.Data.ColLayoutStatus.Sm: unit = layout.Sm; break; + case HandyControl.Data.ColLayoutStatus.Md: unit = layout.Md; break; + case HandyControl.Data.ColLayoutStatus.Lg: unit = layout.Lg; break; + case HandyControl.Data.ColLayoutStatus.Xl: unit = layout.Xl; break; + case HandyControl.Data.ColLayoutStatus.Xxl: unit = layout.Xxl; break; + } + if (unit > 0 && unit <= ColLayout.ColMaxCellCount) + { + cols = ColLayout.ColMaxCellCount / unit; + } + } + if (cols <= 0) return; + double spacing = 0; + if (!double.IsNaN(panel.Spacing)) + { + spacing = panel.Spacing; + } + else if (!double.IsNaN(panel.HorizontalSpacing)) + { + spacing = panel.HorizontalSpacing; + } + var itemWidth = (full - (cols - 1) * spacing) / cols; + panel.ItemWidth = itemWidth; + } +} diff --git a/LuYao.Toolkit/Behaviors/AvalonEditBehaviour.cs b/LuYao.Toolkit/Behaviors/AvalonEditBehaviour.cs new file mode 100644 index 0000000..e9f7cf9 --- /dev/null +++ b/LuYao.Toolkit/Behaviors/AvalonEditBehaviour.cs @@ -0,0 +1,189 @@ +//using ICSharpCode.AvalonEdit; +//using ICSharpCode.AvalonEdit.Document; +//using ICSharpCode.AvalonEdit.Highlighting; +//using ICSharpCode.AvalonEdit.Highlighting.Xshd; +//using ICSharpCode.AvalonEdit.Rendering; +//using LuYao.Toolkit.Controls.AvalonEdit.Highlighting; +//using LuYao.Toolkit.Themes; +//using Microsoft.Xaml.Behaviors; +//using System; +//using System.IO; +//using System.Windows; +//using System.Xml; + +//namespace LuYao.Toolkit.Behaviors; + +//public class AvalonEditBehaviour : Behavior +//{ +// private class TruncateLongLines : VisualLineElementGenerator +// { + +// const int maxLength = 256; +// const string ellipsis = "......"; +// const int charactersAfterEllipsis = 50; + +// public override int GetFirstInterestedOffset(int startOffset) +// { +// DocumentLine line = CurrentContext.VisualLine.LastDocumentLine; +// if (line.Length > maxLength) +// { +// int ellipsisOffset = line.Offset + maxLength - charactersAfterEllipsis - ellipsis.Length; +// if (startOffset <= ellipsisOffset) +// return ellipsisOffset; +// } +// return -1; +// } + +// public override VisualLineElement ConstructElement(int offset) +// { +// var fmt = new FormattedTextElement(ellipsis, CurrentContext.VisualLine.LastDocumentLine.EndOffset - offset - charactersAfterEllipsis); +// return fmt; +// } +// } + +// public static readonly DependencyProperty CodeTextProperty = +// DependencyProperty.Register("CodeText", typeof(string), typeof(AvalonEditBehaviour), +// new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, CodeTextChangedCallback)); + +// public string CodeText +// { +// get { return (string)GetValue(CodeTextProperty); } +// set { SetValue(CodeTextProperty, value); } +// } + +// public Boolean IsTruncateable +// { +// get { return (Boolean)GetValue(IsTruncateableProperty); } +// set { SetValue(IsTruncateableProperty, value); } +// } + +// // Using a DependencyProperty as the backing store for IsTruncateable. This enables animation, styling, binding, etc... +// public static readonly DependencyProperty IsTruncateableProperty = +// DependencyProperty.Register("IsTruncateable", typeof(Boolean), typeof(AvalonEditBehaviour), new FrameworkPropertyMetadata(false)); + + + +// public Boolean AutoToEnd +// { +// get { return (Boolean)GetValue(AutoToEndProperty); } +// set { SetValue(AutoToEndProperty, value); } +// } + +// // Using a DependencyProperty as the backing store for AutoToEnd. This enables animation, styling, binding, etc... +// public static readonly DependencyProperty AutoToEndProperty = +// DependencyProperty.Register("AutoToEnd", typeof(Boolean), typeof(AvalonEditBehaviour), new PropertyMetadata(false)); + +// private static void CodeTextChangedCallback( +// DependencyObject dependencyObject, +// DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) +// { +// var behavior = dependencyObject as AvalonEditBehaviour; +// if (behavior.AssociatedObject != null) +// { +// var editor = behavior.AssociatedObject; +// if (editor.Document != null) +// { +// var caretOffset = editor.CaretOffset; +// var next = dependencyPropertyChangedEventArgs.NewValue.ToString(); +// if (next != editor.Text) +// { +// editor.Document.Text = next; +// if (behavior.AutoToEnd) +// { +// editor.ScrollToEnd(); +// if (editor.WordWrap) editor.ScrollToEnd(); +// } +// else +// { +// if (caretOffset <= editor.Document.Text.Length) editor.CaretOffset = caretOffset; +// } +// } +// } +// } +// } +// protected override void OnAttached() +// { +// base.OnAttached(); +// if (AssociatedObject != null) +// { +// var editor = AssociatedObject; +// editor.Options.EnableHyperlinks = false; +// editor.Options.EnableEmailHyperlinks = false; +// if (this.IsTruncateable) editor.TextArea.TextView.ElementGenerators.Add(new TruncateLongLines()); +// editor.TextChanged += AssociatedObjectOnTextChanged; +// ThemeManager.ThemeChanged += AvalonEditBehaviour_OnThemeChanged; +// } +// } + +// private void AvalonEditBehaviour_OnThemeChanged(object sender, ThemeMode e) +// { +// if (this.AssociatedObject != null) +// { +// var editor = this.AssociatedObject; +// if (editor != null) +// { +// var txt = editor.Text; +// editor.Clear(); +// var highlighting = editor.SyntaxHighlighting; +// if (highlighting != null) +// { +// editor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition(highlighting.Name); +// } +// editor.Text = txt; +// } +// } +// } + +// protected override void OnDetaching() +// { +// base.OnDetaching(); +// if (AssociatedObject != null) +// { +// AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged; +// ThemeManager.ThemeChanged -= AvalonEditBehaviour_OnThemeChanged; +// } +// } +// private void AssociatedObjectOnTextChanged(object sender, EventArgs eventArgs) +// { +// if (sender is TextEditor textEditor) +// { +// if (textEditor.Document != null) +// { +// CodeText = textEditor.Document.Text; +// } +// } +// } +// public static void RegisterHighlighting() +// { +// HighlightingManager.Instance.RegisterHighlighting("C#", new[] { ".cs" }, "CSharp-Mode"); +// HighlightingManager.Instance.RegisterHighlighting("Json", new[] { ".json" }, "Json-Mode"); +// HighlightingManager.Instance.RegisterHighlighting("XML", new[] { ".xml", ".baml" }, "XML-Mode"); +// } +//} + +//static class ExtensionMethods +//{ +// public static void RegisterHighlighting( +// this HighlightingManager manager, +// string name, +// string[] extensions, +// string resourceName) +// { +// switch (ToolkitConfig.Current.Theme) +// { +// case ThemeMode.Light: resourceName += "-Default"; break; +// case ThemeMode.Dark: resourceName += "-Dark"; break; +// } + +// resourceName += ".xshd"; + +// Stream resourceStream = typeof(AvalonEditBehaviour).Assembly +// .GetManifestResourceStream(typeof(Defines), resourceName); + +// if (resourceStream != null) +// { +// using (resourceStream) +// using (XmlTextReader reader = new XmlTextReader(resourceStream)) manager.RegisterHighlighting(name, extensions, HighlightingLoader.Load(reader, manager)); +// } +// } +//} \ No newline at end of file diff --git a/LuYao.Toolkit/Behaviors/ListBoxScrollIntoNewAddBehaviour.cs b/LuYao.Toolkit/Behaviors/ListBoxScrollIntoNewAddBehaviour.cs new file mode 100644 index 0000000..06007f6 --- /dev/null +++ b/LuYao.Toolkit/Behaviors/ListBoxScrollIntoNewAddBehaviour.cs @@ -0,0 +1,32 @@ +using Microsoft.Xaml.Behaviors; +using System.Collections.Specialized; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Behaviors; +public class ListBoxScrollIntoNewAddBehaviour : Behavior +{ + protected override void OnAttached() + { + if (this.AssociatedObject.Items is INotifyCollectionChanged notify) + { + notify.CollectionChanged += Notify_CollectionChanged; + } + } + + private void Notify_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems.Count > 0) + { + var item = e.NewItems[0]; + this.AssociatedObject.ScrollIntoView(item); + } + } + + protected override void OnDetaching() + { + if (this.AssociatedObject.Items is INotifyCollectionChanged notify) + { + notify.CollectionChanged -= Notify_CollectionChanged; + } + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/Behaviors/UIElementBehaviour.cs b/LuYao.Toolkit/Behaviors/UIElementBehaviour.cs new file mode 100644 index 0000000..0b60f02 --- /dev/null +++ b/LuYao.Toolkit/Behaviors/UIElementBehaviour.cs @@ -0,0 +1,52 @@ +using Microsoft.Xaml.Behaviors; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Behaviors +{ + public class UIElementBehaviour : Behavior + { + public bool IsFocused + { + get { return (bool)GetValue(IsFocusedProperty); } + set { SetValue(IsFocusedProperty, value); } + } + + public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.Register("IsFocused", typeof(bool), typeof(UIElementBehaviour), new PropertyMetadata(false)); + + protected override void OnAttached() + { + base.OnAttached(); + if (this.AssociatedObject != null) + { + this.AssociatedObject.GotFocus += AssociatedObject_GotFocus; + this.AssociatedObject.LostFocus += AssociatedObject_LostFocus; + } + } + + private void AssociatedObject_LostFocus(object sender, RoutedEventArgs e) + { + this.IsFocused = false; + } + + private void AssociatedObject_GotFocus(object sender, RoutedEventArgs e) + { + this.IsFocused = true; + } + + protected override void OnDetaching() + { + base.OnDetaching(); + if (this.AssociatedObject != null) + { + this.AssociatedObject.GotFocus -= AssociatedObject_GotFocus; + this.AssociatedObject.LostFocus -= AssociatedObject_LostFocus; + } + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml b/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml new file mode 100644 index 0000000..af7428c --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml.cs b/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml.cs new file mode 100644 index 0000000..70f9326 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/ColorConverter.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// ColorConverter.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.ColorConverter)] + public partial class ColorConverter : UserControl + { + public ColorConverter() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/HexConvert.xaml b/LuYao.Toolkit/Channels/Converts/HexConvert.xaml new file mode 100644 index 0000000..d6fd5f7 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/HexConvert.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/HexConvert.xaml.cs b/LuYao.Toolkit/Channels/Converts/HexConvert.xaml.cs new file mode 100644 index 0000000..58e15f5 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/HexConvert.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// HexConvert.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.HexConvert)] + public partial class HexConvert : UserControl + { + public HexConvert() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/IndentJson.xaml b/LuYao.Toolkit/Channels/Converts/IndentJson.xaml new file mode 100644 index 0000000..532a038 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/IndentJson.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/IndentJson.xaml.cs b/LuYao.Toolkit/Channels/Converts/IndentJson.xaml.cs new file mode 100644 index 0000000..8ad1342 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/IndentJson.xaml.cs @@ -0,0 +1,20 @@ +using ICSharpCode.AvalonEdit.Folding; +using ICSharpCode.AvalonEdit.Search; +using LuYao.Toolkit.Controls.AvalonEdit; +using System; +using System.Windows; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Channels.Converts; + +/// +/// IndentJson.xaml 的交互逻辑 +/// +[Views.ViewName(Views.ViewNames.Channels.Converters.IndentJson)] +public partial class IndentJson : UserControl +{ + public IndentJson() + { + InitializeComponent(); + } +} diff --git a/LuYao.Toolkit/Channels/Converts/IndentXml.xaml b/LuYao.Toolkit/Channels/Converts/IndentXml.xaml new file mode 100644 index 0000000..97de8d6 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/IndentXml.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/IndentXml.xaml.cs b/LuYao.Toolkit/Channels/Converts/IndentXml.xaml.cs new file mode 100644 index 0000000..496d885 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/IndentXml.xaml.cs @@ -0,0 +1,32 @@ +using ICSharpCode.AvalonEdit.Folding; +using ICSharpCode.AvalonEdit.Search; +using LuYao.Toolkit.Controls.AvalonEdit; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// IndentXml.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.IndentXml)] + public partial class IndentXml : UserControl + { + public IndentXml() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml b/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml new file mode 100644 index 0000000..2af59ec --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml.cs b/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml.cs new file mode 100644 index 0000000..e6de575 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/JsonToCSharp.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// JsonToCSharp.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.JsonToCSharp)] + public partial class JsonToCSharp : UserControl + { + public JsonToCSharp() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml b/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml new file mode 100644 index 0000000..7c32dcf --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml.cs b/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml.cs new file mode 100644 index 0000000..7f1cad0 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/JsonToCsv.xaml.cs @@ -0,0 +1,16 @@ +using System.Windows.Controls; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// JsonToCsv.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.JsonToCsv)] + public partial class JsonToCsv : UserControl + { + public JsonToCsv() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml b/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml new file mode 100644 index 0000000..d32398a --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml.cs b/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml.cs new file mode 100644 index 0000000..b7e4dd1 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/PostmanConverter.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// PostmanConverter.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.PostmanConverter)] + public partial class PostmanConverter : UserControl + { + public PostmanConverter() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml b/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml new file mode 100644 index 0000000..9989275 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml.cs b/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml.cs new file mode 100644 index 0000000..8a8012c --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/RsaKeyConvert.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// RsaKeyConvert.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.RsaKeyConvert)] + public partial class RsaKeyConvert : UserControl + { + public RsaKeyConvert() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml b/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml new file mode 100644 index 0000000..86bc2ed --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml.cs b/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml.cs new file mode 100644 index 0000000..e79e604 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateJsonByJs.xaml.cs @@ -0,0 +1,30 @@ +using ICSharpCode.AvalonEdit.Search; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// TranslateJsonByJs.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.TranslateJsonByJs)] + public partial class TranslateJsonByJs : UserControl + { + public TranslateJsonByJs() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml b/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml new file mode 100644 index 0000000..6af307c --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml.cs b/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml.cs new file mode 100644 index 0000000..0213984 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateJsonByLiquid.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// TranslateJsonByLiquid.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.TranslateJsonByLiquid)] + public partial class TranslateJsonByLiquid : UserControl + { + public TranslateJsonByLiquid() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml b/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml new file mode 100644 index 0000000..e397948 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml.cs b/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml.cs new file mode 100644 index 0000000..5dd6c3b --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/TranslateXmlByXsl.xaml.cs @@ -0,0 +1,30 @@ +using ICSharpCode.AvalonEdit.Search; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// TranslateXmlByXslt.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.TranslateXmlByXsl)] + public partial class TranslateXmlByXsl : UserControl + { + public TranslateXmlByXsl() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml b/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml new file mode 100644 index 0000000..6a0ae83 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml.cs b/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml.cs new file mode 100644 index 0000000..ef319b0 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/UnixTimestamp.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// UnixTimestamp.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.UnixTimestamp)] + public partial class UnixTimestamp : UserControl + { + public UnixTimestamp() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml b/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml new file mode 100644 index 0000000..c44e802 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml.cs b/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml.cs new file mode 100644 index 0000000..0d3b0e2 --- /dev/null +++ b/LuYao.Toolkit/Channels/Converts/YamlToJson.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Converts +{ + /// + /// YamlToJson.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Converters.YamlToJson)] + public partial class YamlToJson : UserControl + { + public YamlToJson() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml b/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml new file mode 100644 index 0000000..3f25cef --- /dev/null +++ b/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml.cs b/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml.cs new file mode 100644 index 0000000..08aab0c --- /dev/null +++ b/LuYao.Toolkit/Channels/CrossBorder/MercadoToWorldFirst.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.CrossBorder +{ + /// + /// MercadoToWorldFirst.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.CrossBorder.MercadoToWorldFirst)] + public partial class MercadoToWorldFirst : UserControl + { + public MercadoToWorldFirst() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml b/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml new file mode 100644 index 0000000..b03cab5 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml.cs new file mode 100644 index 0000000..3b24375 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Ascii85Encode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// Ascii85Encode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.Ascii85Encode)] + public partial class Ascii85Encode : UserControl + { + public Ascii85Encode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml b/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml new file mode 100644 index 0000000..86c2ee3 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml.cs new file mode 100644 index 0000000..7c90ad9 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base16Encode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// Base16Encode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.Base16Encode)] + public partial class Base16Encode : UserControl + { + public Base16Encode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml b/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml new file mode 100644 index 0000000..02be403 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml.cs new file mode 100644 index 0000000..a44714f --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base62Encode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// Base62Encode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.Base62Encode)] + public partial class Base62Encode : UserControl + { + public Base62Encode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml b/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml new file mode 100644 index 0000000..fac19a1 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml.cs new file mode 100644 index 0000000..a7a37dd --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/Base64Encode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// Base64Encode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.Base64Encode)] + public partial class Base64Encode : UserControl + { + public Base64Encode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml b/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml new file mode 100644 index 0000000..00df38f --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml.cs new file mode 100644 index 0000000..886ef59 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/HtmlEncode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// HtmlEncode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.HtmlEncode)] + public partial class HtmlEncode : UserControl + { + public HtmlEncode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml b/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml new file mode 100644 index 0000000..767a319 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml.cs b/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml.cs new file mode 100644 index 0000000..0c3d652 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/StringZipper.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// StringZipper.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.StringZipper)] + public partial class StringZipper : UserControl + { + public StringZipper() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml b/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml new file mode 100644 index 0000000..b1ad156 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml.cs b/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml.cs new file mode 100644 index 0000000..0d0e811 --- /dev/null +++ b/LuYao.Toolkit/Channels/Encodings/UrlEncode.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Encodings +{ + /// + /// UrlEncode.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Encodings.UrlEncode)] + public partial class UrlEncode : UserControl + { + public UrlEncode() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml b/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml new file mode 100644 index 0000000..7f89441 --- /dev/null +++ b/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml.cs b/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml.cs new file mode 100644 index 0000000..fb82d93 --- /dev/null +++ b/LuYao.Toolkit/Channels/Files/DetectFileEncodeing.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Files +{ + /// + /// DetectFileEncodeing.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Files.DetectFileEncodeing)] + public partial class DetectFileEncodeing : UserControl + { + public DetectFileEncodeing() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Files/HashFile.xaml b/LuYao.Toolkit/Channels/Files/HashFile.xaml new file mode 100644 index 0000000..839dd12 --- /dev/null +++ b/LuYao.Toolkit/Channels/Files/HashFile.xaml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Files/HashFile.xaml.cs b/LuYao.Toolkit/Channels/Files/HashFile.xaml.cs new file mode 100644 index 0000000..3187588 --- /dev/null +++ b/LuYao.Toolkit/Channels/Files/HashFile.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Files +{ + /// + /// HashFile.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Files.HashFile)] + public partial class HashFile : UserControl + { + public HashFile() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml b/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml new file mode 100644 index 0000000..d29f267 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml.cs new file mode 100644 index 0000000..c288467 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenAesKey.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenAesKey.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Gens.GenAesKey)] + public partial class GenAesKey : UserControl + { + public GenAesKey() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenGuid.xaml b/LuYao.Toolkit/Channels/Gens/GenGuid.xaml new file mode 100644 index 0000000..cbbae76 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenGuid.xaml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenGuid.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenGuid.xaml.cs new file mode 100644 index 0000000..e6db440 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenGuid.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenGuid.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Gens.GenGuid)] + public partial class GenGuid : UserControl + { + public GenGuid() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml b/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml new file mode 100644 index 0000000..7c0bf53 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml.cs new file mode 100644 index 0000000..bae876b --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenLinesByRange.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenLinesByRange.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Gens.GenLinesByRange)] + public partial class GenLinesByRange : UserControl + { + public GenLinesByRange() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenPassword.xaml b/LuYao.Toolkit/Channels/Gens/GenPassword.xaml new file mode 100644 index 0000000..631db50 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenPassword.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenPassword.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenPassword.xaml.cs new file mode 100644 index 0000000..3ccd586 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenPassword.xaml.cs @@ -0,0 +1,17 @@ +using LuYao.Toolkit.Views; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenPassword.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Gens.GenPassword)] + public partial class GenPassword : UserControl + { + public GenPassword() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml b/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml new file mode 100644 index 0000000..c67616d --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml.cs new file mode 100644 index 0000000..5dfca95 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenRsaKey.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenRsaKey.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Gens.GenRsaKey)] + public partial class GenRsaKey : UserControl + { + public GenRsaKey() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml b/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml new file mode 100644 index 0000000..f475764 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml.cs b/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml.cs new file mode 100644 index 0000000..ac93215 --- /dev/null +++ b/LuYao.Toolkit/Channels/Gens/GenXCodeEntity.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Gens +{ + /// + /// GenXCodeEntity.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Gens.GenXCodeEntity)] + public partial class GenXCodeEntity : UserControl + { + public GenXCodeEntity() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml b/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml new file mode 100644 index 0000000..e71ee08 --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml.cs b/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml.cs new file mode 100644 index 0000000..617adfb --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/Base64ToImage.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Images +{ + /// + /// Base64ToImage.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Images.Base64ToImage)] + public partial class Base64ToImage : UserControl + { + public Base64ToImage() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Images/GifSplitter.xaml b/LuYao.Toolkit/Channels/Images/GifSplitter.xaml new file mode 100644 index 0000000..a1d929c --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/GifSplitter.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Images/ImageToBase64.xaml.cs b/LuYao.Toolkit/Channels/Images/ImageToBase64.xaml.cs new file mode 100644 index 0000000..776f606 --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/ImageToBase64.xaml.cs @@ -0,0 +1,31 @@ +using LuYao.Toolkit.Helpers; +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Images +{ + /// + /// ImageToBase64.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Images.ImageToBase64)] + public partial class ImageToBase64 : UserControl + { + public ImageToBase64() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml b/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml new file mode 100644 index 0000000..180cd91 --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml.cs b/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml.cs new file mode 100644 index 0000000..38ccb57 --- /dev/null +++ b/LuYao.Toolkit/Channels/Images/ImageToIcon.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Images +{ + /// + /// ImageToIcon.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Images.ImageToIcon)] + public partial class ImageToIcon : UserControl + { + public ImageToIcon() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/HttpProxyChecker.xaml b/LuYao.Toolkit/Channels/Networks/HttpProxyChecker.xaml new file mode 100644 index 0000000..710c6d8 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/HttpProxyChecker.xaml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/IPLookup.xaml.cs b/LuYao.Toolkit/Channels/Networks/IPLookup.xaml.cs new file mode 100644 index 0000000..0af1768 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/IPLookup.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// IPLookup.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.IPLookup)] + public partial class IPLookup : UserControl + { + public IPLookup() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/Ping.xaml b/LuYao.Toolkit/Channels/Networks/Ping.xaml new file mode 100644 index 0000000..b6e7461 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/Ping.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/Ping.xaml.cs b/LuYao.Toolkit/Channels/Networks/Ping.xaml.cs new file mode 100644 index 0000000..e454ae2 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/Ping.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// Ping.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.Ping)] + public partial class Ping : UserControl + { + public Ping() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml b/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml new file mode 100644 index 0000000..62a528a --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml.cs b/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml.cs new file mode 100644 index 0000000..698fc37 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/PortProxy/Detail.xaml.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy +{ + [Views.ViewName(Views.ViewNames.Channels.Networks.PortProxy.Detail)] + public partial class Detail : UserControl + { + public Detail() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml b/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml new file mode 100644 index 0000000..936e65f --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml.cs b/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml.cs new file mode 100644 index 0000000..9ca05eb --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/PortProxy/Index.xaml.cs @@ -0,0 +1,33 @@ +using Prism.Ioc; +using Prism.Regions; +using Prism.Regions.Behaviors; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Xml.Linq; + +namespace LuYao.Toolkit.Channels.Networks.PortProxy +{ + /// + /// PortProxy.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.PortProxy.Index)] + public partial class Index : UserControl + { + public Index() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml b/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml new file mode 100644 index 0000000..c4cc92f --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml.cs b/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml.cs new file mode 100644 index 0000000..6017bde --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/RemoteDesktopManager.xaml.cs @@ -0,0 +1,88 @@ +using LuYao.Toolkit.Rdm.Dialogs; +using LuYao.Toolkit.Rdm.Events; +using Prism.Events; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// RemoteDesktopManager.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.RemoteDesktopManager)] + public partial class RemoteDesktopManager : UserControl + { + private readonly IEventAggregator eventAggregator; + private readonly IDialogService dialogService; + public RemoteDesktopManager(IEventAggregator eventAggregator, IDialogService dialogService) + { + InitializeComponent(); + this.eventAggregator = eventAggregator ?? throw new System.ArgumentNullException(nameof(eventAggregator)); + this.dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService)); + this.eventAggregator.GetEvent().Subscribe(this.OnAddRdoConnection); + this.eventAggregator.GetEvent().Subscribe(this.OnEditRdoConnection); + this.eventAggregator.GetEvent().Subscribe(this.OnOpenRdpConnection); + this.eventAggregator.GetEvent().Subscribe(this.OnOpenRdmSetting); + } + + private void OnOpenRdmSetting() + { + dialogService.ShowDialog(nameof(RdmSettingDialog), null, (r) => { this.eventAggregator.GetEvent().Publish(); }); + } + + private void OnOpenRdpConnection(OpenRdpConnectionEventPayload args) + { + //foreach (RdpTabItem item in SessionTabControl.Items) + //{ + // if (item.Id == args.Id) + // { + // this.SessionTabControl.SelectedItem = item; + // return; + // } + //} + //var e = Entities.RdpConnection.FindById(args.Id); + //if (e == null) return; + //var rdp = new RdpConnection(e); + //var tab = new RdpTabItem(args.Id, rdp); + //this.SessionTabControl.Items.Add(tab); + //this.SessionTabControl.SelectedItem = tab; + //tab.Connect(); + } + + private void DialogCallback(IDialogResult i) + { + if (i.Result == ButtonResult.OK) + { + this.eventAggregator.GetEvent().Publish(); + } + } + + private void OnEditRdoConnection(EditRdpConnectionEventPayload args) + { + var p = new DialogParameters(); + p.Add("act", "edit"); + p.Add("id", args.Id); + dialogService.ShowDialog(nameof(RdpConnectionDetailDialog), p, DialogCallback); + } + + private void OnAddRdoConnection() + { + var p = new DialogParameters(); + p.Add("act", "add"); + dialogService.ShowDialog(nameof(RdpConnectionDetailDialog), p, DialogCallback); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml b/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml new file mode 100644 index 0000000..122ee30 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml.cs b/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml.cs new file mode 100644 index 0000000..55ddb1d --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/TrafficMonitor.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// TrafficMonitor.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.TrafficMonitor)] + public partial class TrafficMonitor : UserControl + { + public TrafficMonitor() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml b/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml new file mode 100644 index 0000000..fad332e --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml.cs b/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml.cs new file mode 100644 index 0000000..44e6aaa --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/UrlAnalyzer.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// UrlAnalyzer.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.UrlAnalyzer)] + public partial class UrlAnalyzer : UserControl + { + public UrlAnalyzer() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml b/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml new file mode 100644 index 0000000..c958a0f --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml.cs b/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml.cs new file mode 100644 index 0000000..ec86262 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/UserAgentParser.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// UserAgentParser.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.UserAgentParser)] + public partial class UserAgentParser : UserControl + { + public UserAgentParser() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Networks/Whois.xaml b/LuYao.Toolkit/Channels/Networks/Whois.xaml new file mode 100644 index 0000000..75d9777 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/Whois.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Networks/Whois.xaml.cs b/LuYao.Toolkit/Channels/Networks/Whois.xaml.cs new file mode 100644 index 0000000..db392c5 --- /dev/null +++ b/LuYao.Toolkit/Channels/Networks/Whois.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Networks +{ + /// + /// Whois.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Networks.Whois)] + public partial class Whois : UserControl + { + public Whois() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml b/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml new file mode 100644 index 0000000..ec4031d --- /dev/null +++ b/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml.cs b/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml.cs new file mode 100644 index 0000000..82cf186 --- /dev/null +++ b/LuYao.Toolkit/Channels/Other/SystemToolkit.xaml.cs @@ -0,0 +1,101 @@ +using NewLife.Log; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Other; + +/// +/// SystemToolkit.xaml 的交互逻辑 +/// +[Views.ViewName(Views.ViewNames.Channels.Other.SystemToolkit)] +public partial class SystemToolkit : UserControl +{ + public SystemToolkit() + { + InitializeComponent(); + //https://github.com/BlackINT3/OpenArk/blob/cf3d548b962f0f5cfb764c626f0c71b37f1ac06b/src/OpenArk/utilities/utilities.cpp + this.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.OnButtonClick)); + } + + + private void OnButtonClick(object sender, RoutedEventArgs e) + { + if (e.OriginalSource is Button btn) + { + switch (btn.Name) + { + case nameof(Cmd): ShellRun("cmd.exe", "/k cd /d %userprofile%"); break; + case nameof(Wsl): ShellRun("wsl.exe", ""); break; + case nameof(PowerShell): ShellRun("powershell.exe", ""); break; + case nameof(taskmgr): ShellRun("taskmgr.exe", ""); break; + case nameof(regedit): ShellRun("regedit.exe", ""); break; + case nameof(services): ShellRun("services.msc", ""); break; + case nameof(pcname): ShellRun("SystemPropertiesComputerName.exe", ""); break; + case nameof(env): ShellRun("SystemPropertiesAdvanced.exe", ""); break; + case nameof(program): ShellRun("control.exe", "appwiz.cpl"); break; + case nameof(calc): ShellRun("calc.exe", ""); break; + case nameof(systeminfo): ShellRun("cmd.exe", "/c systeminfo |more & pause"); break; + case nameof(version): ShellRun("winver.exe", ""); break; + case nameof(deskicon): ShellRun("rundll32.exe", "shell32.dll,Control_RunDLL desk.cpl,,0"); break; + case nameof(tasksch): ShellRun("taskschd.msc", "/s"); break; + case nameof(devmgr): ShellRun("devmgmt.msc", ""); break; + case nameof(disks): ShellRun("diskmgmt.msc", ""); break; + case nameof(datetime): ShellRun("control.exe", "date/time"); break; + case nameof(wallpaper): + if (Environment.OSVersion.Version.Major <= 5) + { + ShellRun("rundll32.exe", "shell32.dll,Control_RunDLL desk.cpl,,0"); + } + else + { + ShellRun("control.exe", "/name Microsoft.Personalization /page pageWallpaper"); + } + break; + case nameof(credential): ShellRun("control.exe", "/name Microsoft.CredentialManager"); break; + case nameof(uac): ShellRun("UserAccountControlSettings.exe", ""); break; + case nameof(users): ShellRun("lusrmgr.msc", ""); break; + case nameof(secpolicy): ShellRun("secpol.msc", ""); break; + case nameof(gpedit): ShellRun("gpedit.msc", ""); break; + case nameof(eventlog): ShellRun("eventvwr.msc", ""); break; + case nameof(performance): ShellRun("perfmon.exe", ""); break; + case nameof(perfsettings): ShellRun("SystemPropertiesPerformance.exe", ""); break; + case nameof(resmon): ShellRun("resmon.exe", ""); break; + case nameof(powercfg): ShellRun("control.exe", "powercfg.cpl,,3"); break; + case nameof(certmgr): ShellRun("certmgr.msc", ""); break; + case nameof(hosts): ShellRun("notepad.exe", System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32", "drivers", "etc", "hosts")); break; + case nameof(proxy): ShellRun("rundll32.exe", "shell32.dll,Control_RunDLL inetcpl.cpl,,4"); break; + case nameof(firewall): ShellRun("control.exe", "firewall.cpl"); break; + case nameof(ipv6): ShellRun("cmd.exe", "/k ipconfig|findstr /i ipv6"); break; + case nameof(ipv4): ShellRun("cmd.exe", "/k ipconfig|findstr /i ipv4"); break; + case nameof(route): ShellRun("cmd.exe", "/k route print"); break; + case nameof(netconnections): ShellRun("control.exe", "ncpa.cpl"); break; + case nameof(share): ShellRun("fsmgmt.msc", ""); break; + } + } + } + private static void ShellRun(string cmdline, string param) + { + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.CreateNoWindow = false; + startInfo.UseShellExecute = true; + startInfo.FileName = cmdline; + startInfo.Arguments = param; + + Process.Start(startInfo); + } +} diff --git a/LuYao.Toolkit/Channels/Texts/CsvReader.xaml b/LuYao.Toolkit/Channels/Texts/CsvReader.xaml new file mode 100644 index 0000000..958a891 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/CsvReader.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/CsvReader.xaml.cs b/LuYao.Toolkit/Channels/Texts/CsvReader.xaml.cs new file mode 100644 index 0000000..7402bad --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/CsvReader.xaml.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// CsvReader.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Texts.CsvReader)] + public partial class CsvReader : UserControl + { + public CsvReader() + { + InitializeComponent(); + } + + private void MainDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) + { + if (e.Column is DataGridBoundColumn dataGridBoundColumn) + { + if (e.PropertyName.Contains('.')) + { + dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]"); + } + dataGridBoundColumn.MaxWidth = 200; + } + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml b/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml new file mode 100644 index 0000000..b5f3ac1 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml.cs b/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml.cs new file mode 100644 index 0000000..82e05b7 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/FullHalfConvert.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// FullHalfConvert.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Texts.FullHalfConvert)] + public partial class FullHalfConvert : UserControl + { + public FullHalfConvert() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml b/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml new file mode 100644 index 0000000..4ce10be --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml.cs b/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml.cs new file mode 100644 index 0000000..485903d --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/GoogleTranslate.xaml.cs @@ -0,0 +1,137 @@ +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Windows; +using System; +using System.Windows.Controls; +using System.IO; +using System.Threading.Tasks; +using System.Net.NetworkInformation; +using System.Linq; +using NewLife.Log; +using NewLife; +using LuYao.Toolkit.Services; +using LuYao.Toolkit.IO; +using System.Diagnostics; +using System.ComponentModel; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// GoogleTranslate.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Texts.GoogleTranslate)] + public partial class GoogleTranslate : UserControl + { + public GoogleTranslate() + { + InitializeComponent(); + } + private void FixHostButton_OnClick(object sender, RoutedEventArgs e) + { + try + { + TongjiService.Tongji(Views.ViewNames.Channels.Texts.GoogleTranslate, new + { + Action = "FixHost" + }); + this.FixHostButton.IsEnabled = false; + var ip = FixHost(out var file); + using (var p = new Process()) + { + p.StartInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Normal, + CreateNoWindow = false, + FileName = "cmd.exe", + Arguments = $"/C xcopy /Y /R \"{file}\" \"%WinDir%\\system32\\drivers\\etc\\hosts\"", + Verb = "runas", + UseShellExecute = true + }; + if (p.Start()) + { + p.WaitForExit(); + NotifyService.Success($"修复成功,服务器地址为:{ip}。"); + } + } + } + catch (Exception exception) + { + XTrace.WriteException(exception); + if (exception is Win32Exception) + { + MessageBoxService.Alert("操作失败,请在弹出是否允许时,选择“是”。" + Environment.NewLine + exception.Message); + } + else if (exception is UnauthorizedAccessException) + { + var copy = false; + if (!string.IsNullOrWhiteSpace(fixedHost)) + { + ClipboardService.CopyText(fixedHost); + copy = true; + } + MessageBoxService.Alert( + "操作失败,请以管理员身份启动程序(程序图标上点鼠标右键,选择:以管理员身份运行)。" + + Environment.NewLine + + "如果依旧无法修复,尝试手动修改 hosts 文件。" + + (copy ? "修复内容已经复制到剪切板。" : string.Empty) + + Environment.NewLine + + exception.Message + ); + } + else + { + MessageBoxService.Alert("操作失败:" + Environment.NewLine + exception.Message); + } + } + finally + { + this.FixHostButton.IsEnabled = true; + } + } + + private string fixedHost = string.Empty; + private record HostItem(string Host, string IPAddress); + private string FixHost(out string file) + { + var ip = GoogleService.ResolveServerAddress(); + + var dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32", "drivers", "etc"); + var fn = Path.Combine(dir, "hosts"); + FileInfo info = new FileInfo(fn); + var lines = new List(); + if (info.Exists) lines.AddRange(File.ReadAllLines(fn)); + //File.ReadAllLines(fn) + foreach (var d in new string[] { "translate.google.com", "translate.googleapis.com" }) + { + var keep = new HostItem(d, ip); + Keep(lines, keep); + } + var output = lines.Join(Environment.NewLine); + this.OutputTextEditor.Text = fixedHost = output; + XTrace.WriteLine(output); + file = TempHelper.GetTempFileName("host.txt"); + File.WriteAllLines(file, lines, Encoding.UTF8); + return ip; + } + + private static void Keep(List lines, HostItem keep) + { + for (int i = 0; i < lines.Count; i++) + { + var str = lines[i]; + if (string.IsNullOrWhiteSpace(str)) continue;//跳过空格 + if (str.Trim().StartsWith("#")) continue;//跳过注释 + var parts = str.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length <= 1) continue; + var host = parts[1]; + if (string.Equals(host, keep.Host, StringComparison.OrdinalIgnoreCase)) + { + lines.RemoveAt(i); + i--; + } + } + lines.Add($"{keep.IPAddress} {keep.Host}"); + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml b/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml new file mode 100644 index 0000000..753d223 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml.cs b/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml.cs new file mode 100644 index 0000000..b16682d --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/HashCalculator.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// HashCalculator.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Channels.Texts.HashCalculator)] + public partial class HashCalculator : UserControl + { + public HashCalculator() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/LogReader.xaml b/LuYao.Toolkit/Channels/Texts/LogReader.xaml new file mode 100644 index 0000000..910f0f5 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/LogReader.xaml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/LogReader.xaml.cs b/LuYao.Toolkit/Channels/Texts/LogReader.xaml.cs new file mode 100644 index 0000000..e6fe04b --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/LogReader.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// LogReader.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Texts.LogReader)] + public partial class LogReader : UserControl + { + public LogReader() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml b/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml new file mode 100644 index 0000000..e484106 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml.cs b/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml.cs new file mode 100644 index 0000000..c3bccf2 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/RegexEvaluator.xaml.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts +{ + /// + /// RegexEvaluator.xaml 的交互逻辑 + /// + [Views.ViewName(Views.ViewNames.Channels.Texts.RegexEvaluator)] + public partial class RegexEvaluator : UserControl + { + public RegexEvaluator() + { + InitializeComponent(); + } + private void MatchesDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + foreach (var item in e.AddedItems) + { + if (item is Capture c) + { + //InputTextBox.Select(c.Index, c.Length); + break; + } + } + } + + private void GroupDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + foreach (var item in e.AddedItems) + { + if (item is Capture c) + { + //InputTextBox.Select(c.Index, c.Length); + break; + } + } + } + + private void CaptureDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + foreach (var item in e.AddedItems) + { + if (item is Capture c) + { + //InputTextBox.Select(c.Index, c.Length); + break; + } + } + } + } +} diff --git a/LuYao.Toolkit/Channels/Texts/TextJoin.xaml b/LuYao.Toolkit/Channels/Texts/TextJoin.xaml new file mode 100644 index 0000000..8ac4bf8 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/TextJoin.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/TextJoin.xaml.cs b/LuYao.Toolkit/Channels/Texts/TextJoin.xaml.cs new file mode 100644 index 0000000..c2ec68e --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/TextJoin.xaml.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts; + +/// +/// TextJoin.xaml 的交互逻辑 +/// +[Views.ViewName(Views.ViewNames.Channels.Texts.TextJoin)] +public partial class TextJoin : UserControl +{ + public TextJoin() + { + InitializeComponent(); + Attaches.ComboBoxAttach.SetBindEnum(this.SplitComboBox, typeof(TextJoinViewModel.SplitBy)); + Attaches.ComboBoxAttach.SetBindEnum(this.EscapeComboBox, typeof(TextJoinViewModel.EscapeType)); + Attaches.ComboBoxAttach.SetBindEnum(this.JoinComboBox, typeof(TextJoinViewModel.JoinBy)); + } +} diff --git a/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml b/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml new file mode 100644 index 0000000..9d078c7 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml.cs b/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml.cs new file mode 100644 index 0000000..d36b1a0 --- /dev/null +++ b/LuYao.Toolkit/Channels/Texts/YoudaoDictionary.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Channels.Texts; + +/// +/// YoudaoDictionary.xaml 的交互逻辑 +/// +[Views.ViewName(Views.ViewNames.Channels.Texts.YoudaoDictionary)] +public partial class YoudaoDictionary : UserControl +{ + public YoudaoDictionary() + { + InitializeComponent(); + } +} diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Dark.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Dark.xshd new file mode 100644 index 0000000..d4f5f5c --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Dark.xshd @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + FIXME + + + HACK + UNDONE + + + + + + + \# + + + + (define|undef|if|elif|else|endif|line)\b + + + + // + + + + + + (region|endregion|error|warning|pragma)\b + + + + + + + ///(?!/) + + + + + + + + // + + + + /\* + \*/ + + + + " + " + + + + + + + + ' + ' + + + + + + + + @" + " + + + + + + + + \$" + " + + + + + + + + + + + + @[\w\d_]+ + + + + this + base + + + + as + is + new + sizeof + typeof + stackalloc + + + + true + false + + + + else + if + switch + case + default + do + for + foreach + in + while + lock + + + + break + continue + goto + return + + + + yield + partial + global + where + select + group + by + into + from + ascending + descending + orderby + let + join + on + equals + var + dynamic + await + + + + try + throw + catch + finally + + + + checked + unchecked + + + + fixed + unsafe + + + + bool + byte + char + decimal + double + enum + float + int + long + sbyte + short + struct + uint + ushort + ulong + + + + class + interface + delegate + object + string + void + + + + explicit + implicit + operator + + + + params + ref + out + + + + abstract + const + event + extern + override + readonly + sealed + static + virtual + volatile + async + + + + public + protected + private + internal + + + + namespace + using + + + + get + set + add + remove + + + + null + value + + + + nameof + + + + + \b + [\d\w_]+ # an identifier + (?=\s*\() # followed by ( + + + + + \b0[xX][0-9a-fA-F]+ # hex number + | + ( \b\d+(\.[0-9]+)? #number with optional floating point + | \.[0-9]+ #or just starting with floating point + ) + ([eE][+-]?[0-9]+)? # optional exponent + + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+ + + + diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Default.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Default.xshd new file mode 100644 index 0000000..39ab004 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/CSharp-Mode-Default.xshd @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + FIXME + + + HACK + UNDONE + + + + + + + \# + + + + (define|undef|if|elif|else|endif|line)\b + + + + // + + + + + + (region|endregion|error|warning|pragma)\b + + + + + + + ///(?!/) + + + + + + + + // + + + + /\* + \*/ + + + + " + " + + + + + + + + ' + ' + + + + + + + + @" + " + + + + + + + + \$" + " + + + + + + + + + + + + @[\w\d_]+ + + + + this + base + + + + as + is + new + sizeof + typeof + stackalloc + + + + true + false + + + + else + if + switch + case + default + do + for + foreach + in + while + lock + + + + break + continue + goto + return + + + + yield + partial + global + where + select + group + by + into + from + ascending + descending + orderby + let + join + on + equals + var + dynamic + await + + + + try + throw + catch + finally + + + + checked + unchecked + + + + fixed + unsafe + + + + bool + byte + char + decimal + double + enum + float + int + long + sbyte + short + struct + uint + ushort + ulong + + + + class + interface + delegate + object + string + void + + + + explicit + implicit + operator + + + + params + ref + out + + + + abstract + const + event + extern + override + readonly + sealed + static + virtual + volatile + async + + + + public + protected + private + internal + + + + namespace + using + + + + get + set + add + remove + + + + null + value + + + + nameof + + + + + \b + [\d\w_]+ # an identifier + (?=\s*\() # followed by ( + + + + + \b0[xX][0-9a-fA-F]+ # hex number + | + ( \b\d+(\.[0-9]+)? #number with optional floating point + | \.[0-9]+ #or just starting with floating point + ) + ([eE][+-]?[0-9]+)? # optional exponent + + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+ + + + diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Defines.cs b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Defines.cs new file mode 100644 index 0000000..b41e740 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Defines.cs @@ -0,0 +1,22 @@ +using ICSharpCode.AvalonEdit.Highlighting.Xshd; +using ICSharpCode.AvalonEdit.Highlighting; +using System.IO; +using System.Xml; + +namespace LuYao.Toolkit.Controls.AvalonEdit.Highlighting; + +public static class Defines +{ + static Defines() + { + var type = typeof(Defines); + using (Stream s = type.Assembly.GetManifestResourceStream($"{type.Namespace}.Log.xshd")) + { + using (XmlReader reader = new XmlTextReader(s)) + { + Log = HighlightingLoader.Load(reader, HighlightingManager.Instance); + } + } + } + public static IHighlightingDefinition Log { get; } +} diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Dark.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Dark.xshd new file mode 100644 index 0000000..d54de18 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Dark.xshd @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + " + " + + + ' + ' + + + : + + + , + + + + + + + , + + + + + + true + false + + + null + + + " + " + + + ' + ' + + + \{ + \} + + + \[ + \] + + + \b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)? + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Default.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Default.xshd new file mode 100644 index 0000000..3f3837a --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Json-Mode-Default.xshd @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + " + " + + + ' + ' + + + : + + + , + + + + + + + , + + + + + + true + false + + + null + + + " + " + + + ' + ' + + + \{ + \} + + + \[ + \] + + + \b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)? + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Log.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Log.xshd new file mode 100644 index 0000000..d7c39d8 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/Log.xshd @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Info + Information + Trace + Debug + + + + Error + Warn + Warning + Exception + Fatal + + + + [Trace] + [Debug] + + + + [Info] + [Information] + + + + [Warn] + [Warning] + + + + [Error] + [Exception] + [Fatal] + + + + ' + ' + + + + " + " + + + + + + + \# + + + + \[ + \] + + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+ + + + + [?,.;()\[\]{}+\-/%*<>^+~!|&]+[0-9]+[ ?,.;()\[\]{}+\-/%*<>^+~!|&]+\n + + + + + [0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9] + + + + + [0-9][0-9]\:[0-9][0-9]\:[0-9][0-9]\.[0-9][0-9][0-9] + + + + + [0-9][0-9]\:[0-9][0-9]\:[0-9][0-9] + + + + + diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Dark.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Dark.xshd new file mode 100644 index 0000000..37484da --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Dark.xshd @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + <!-- + --> + + + <!\[CDATA\[ + ]]> + + + <!DOCTYPE + > + + + <\? + \?> + + + < + > + + + + " + "|(?=<) + + + ' + '|(?=<) + + [\d\w_\-\.]+(?=(\s*=)) + = + + + + + + + + & + [\w\d\#]+ + ; + + + + & + [\w\d\#]* + #missing ; + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Default.xshd b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Default.xshd new file mode 100644 index 0000000..75dfd88 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/Highlighting/XML-Mode-Default.xshd @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + <!-- + --> + + + <!\[CDATA\[ + ]]> + + + <!DOCTYPE + > + + + <\? + \?> + + + < + > + + + + " + "|(?=<) + + + ' + '|(?=<) + + [\d\w_\-\.]+(?=(\s*=)) + = + + + + + + + + & + [\w\d\#]+ + ; + + + + & + [\w\d\#]* + #missing ; + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/AvalonEdit/HighlightingHelper.cs b/LuYao.Toolkit/Controls/AvalonEdit/HighlightingHelper.cs new file mode 100644 index 0000000..105dae4 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/HighlightingHelper.cs @@ -0,0 +1,51 @@ +using ICSharpCode.AvalonEdit.Highlighting; +using ICSharpCode.AvalonEdit.Highlighting.Xshd; +using LuYao.Toolkit.Behaviors; +using LuYao.Toolkit.Controls.AvalonEdit.Highlighting; +using LuYao.Toolkit.Themes; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace LuYao.Toolkit.Controls.AvalonEdit; + +public static class HighlightingHelper +{ + static HighlightingHelper() + { + HighlightingManager.Instance.RegisterHighlighting("Log", new[] { ".log" }, Defines.Log); + } + public static void RegisterHighlighting() + { + HighlightingManager.Instance.RegisterHighlighting("C#", new[] { ".cs" }, "CSharp-Mode"); + HighlightingManager.Instance.RegisterHighlighting("Json", new[] { ".json" }, "Json-Mode"); + HighlightingManager.Instance.RegisterHighlighting("XML", new[] { ".xml", ".baml" }, "XML-Mode"); + } + private static void RegisterHighlighting( + this HighlightingManager manager, + string name, + string[] extensions, + string resourceName) + { + switch (ToolkitConfig.Current.Theme) + { + case ThemeMode.Light: resourceName += "-Default"; break; + case ThemeMode.Dark: resourceName += "-Dark"; break; + } + + resourceName += ".xshd"; + + Stream resourceStream = typeof(HighlightingHelper).Assembly + .GetManifestResourceStream(typeof(Defines), resourceName); + + if (resourceStream != null) + { + using (resourceStream) + using (XmlTextReader reader = new XmlTextReader(resourceStream)) manager.RegisterHighlighting(name, extensions, HighlightingLoader.Load(reader, manager)); + } + } +} diff --git a/LuYao.Toolkit/Controls/AvalonEdit/JsonFoldingStrategy.cs b/LuYao.Toolkit/Controls/AvalonEdit/JsonFoldingStrategy.cs new file mode 100644 index 0000000..bffe8e7 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/JsonFoldingStrategy.cs @@ -0,0 +1,87 @@ +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Folding; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Controls.AvalonEdit; + +/// +/// Allows producing foldings from a document based on braces. +/// +public class JsonFoldingStrategy +{ + /// + /// Gets/Sets the opening brace. The default value is '{'. + /// + public char[] OpeningBrace { get; set; } + + /// + /// Gets/Sets the closing brace. The default value is '}'. + /// + public char[] ClosingBrace { get; set; } + + /// + /// Creates a new BraceFoldingStrategy. + /// + public JsonFoldingStrategy() + { + this.OpeningBrace = new char[] { '{', '[' }; + this.ClosingBrace = new char[] { '}', ']' }; + } + + public void UpdateFoldings(FoldingManager manager, TextDocument document) + { + int firstErrorOffset; + IEnumerable newFoldings = CreateNewFoldings(document, out firstErrorOffset); + manager.UpdateFoldings(newFoldings, firstErrorOffset); + } + + /// + /// Create s for the specified document. + /// + public IEnumerable CreateNewFoldings(TextDocument document, out int firstErrorOffset) + { + firstErrorOffset = -1; + return CreateNewFoldings(document); + } + + /// + /// Create s for the specified document. + /// + public IEnumerable CreateNewFoldings(ITextSource document) + { + List newFoldings = new List(); + + Stack startOffsets = new Stack(); + int lastNewLineOffset = 0; + //char openingBrace = this.OpeningBrace; + //char closingBrace = this.ClosingBrace; + for (int i = 0; i < document.TextLength; i++) + { + char c = document.GetCharAt(i); + //if (c == openingBrace) + if (OpeningBrace.Contains(c)) + { + startOffsets.Push(i); + } + else if (ClosingBrace.Contains(c) && startOffsets.Count > 0) + { + int startOffset = startOffsets.Pop(); + // don't fold if opening and closing brace are on the same line + if (startOffset < lastNewLineOffset) + { + newFoldings.Add(new NewFolding(startOffset, i + 1)); + } + } + else if (c == '\n' || c == '\r') + { + lastNewLineOffset = i + 1; + } + } + newFoldings.Sort((a, b) => a.StartOffset.CompareTo(b.StartOffset)); + return newFoldings; + } +} diff --git a/LuYao.Toolkit/Controls/AvalonEdit/SearchPanel.xaml b/LuYao.Toolkit/Controls/AvalonEdit/SearchPanel.xaml new file mode 100644 index 0000000..0358276 --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/SearchPanel.xaml @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/AvalonEdit/TruncateLongLinesElementGenerator.cs b/LuYao.Toolkit/Controls/AvalonEdit/TruncateLongLinesElementGenerator.cs new file mode 100644 index 0000000..3c507ca --- /dev/null +++ b/LuYao.Toolkit/Controls/AvalonEdit/TruncateLongLinesElementGenerator.cs @@ -0,0 +1,29 @@ +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Rendering; + +namespace LuYao.Toolkit.Controls.AvalonEdit; + +public class TruncateLongLinesElementGenerator : VisualLineElementGenerator +{ + const int maxLength = 256; + const string ellipsis = "......"; + const int charactersAfterEllipsis = 50; + + public override int GetFirstInterestedOffset(int startOffset) + { + DocumentLine line = CurrentContext.VisualLine.LastDocumentLine; + if (line.Length > maxLength) + { + int ellipsisOffset = line.Offset + maxLength - charactersAfterEllipsis - ellipsis.Length; + if (startOffset <= ellipsisOffset) + return ellipsisOffset; + } + return -1; + } + + public override VisualLineElement ConstructElement(int offset) + { + var fmt = new FormattedTextElement(ellipsis, CurrentContext.VisualLine.LastDocumentLine.EndOffset - offset - charactersAfterEllipsis); + return fmt; + } +} diff --git a/LuYao.Toolkit/Controls/CodeEditor.Commands.cs b/LuYao.Toolkit/Controls/CodeEditor.Commands.cs new file mode 100644 index 0000000..44f384b --- /dev/null +++ b/LuYao.Toolkit/Controls/CodeEditor.Commands.cs @@ -0,0 +1,49 @@ +using System.Windows.Input; + +namespace LuYao.Toolkit.Controls; + +public partial class CodeEditor +{ + public static RoutedCommand OpenSearchCommand { get; } = new RoutedCommand(nameof(OpenSearchCommand), typeof(CodeEditor)); + public static RoutedCommand OpenAllFoldedCommand { get; } = new RoutedCommand(nameof(OpenAllFoldedCommand), typeof(CodeEditor)); + public static RoutedCommand CloseAllFoldedCommand { get; } = new RoutedCommand(nameof(CloseAllFoldedCommand), typeof(CodeEditor)); + + private void InitCommands() + { + this.CommandBindings.Add(new CommandBinding(OpenSearchCommand, OnOpenSearch)); + this.CommandBindings.Add(new CommandBinding(OpenAllFoldedCommand, OnOpenAllFolded, CanFolded)); + this.CommandBindings.Add(new CommandBinding(CloseAllFoldedCommand, OnCloseAllFolded, CanFolded)); + } + + private void CanFolded(object sender, CanExecuteRoutedEventArgs e) + { + e.CanExecute = !string.IsNullOrWhiteSpace(this.Text) && this._editorContext != null && this._editorContext.FoldingStrategy != null; + } + + private void OnCloseAllFolded(object sender, ExecutedRoutedEventArgs e) + { + if (this._foldingManager == null) return; + var isFrist = true; + foreach (var item in this._foldingManager.AllFoldings) + { + if (isFrist) + { + isFrist = false; + continue; + } + item.IsFolded = true; + } + } + + + private void OnOpenAllFolded(object sender, ExecutedRoutedEventArgs e) + { + if (this._foldingManager == null) return; + foreach (var item in this._foldingManager.AllFoldings) item.IsFolded = false; + } + + private void OnOpenSearch(object sender, ExecutedRoutedEventArgs e) + { + this._searchPanel.Open(); + } +} diff --git a/LuYao.Toolkit/Controls/CodeEditor.Context.cs b/LuYao.Toolkit/Controls/CodeEditor.Context.cs new file mode 100644 index 0000000..fd8d165 --- /dev/null +++ b/LuYao.Toolkit/Controls/CodeEditor.Context.cs @@ -0,0 +1,30 @@ +using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Folding; + +namespace LuYao.Toolkit.Controls; + +public partial class CodeEditor +{ + private class EditorContext + { + public Highlighting SyntaxHighlighting { get; } + public IFoldingStrategy FoldingStrategy { get; } + + public EditorContext(Highlighting syntaxHighlighting) + { + SyntaxHighlighting = syntaxHighlighting; + } + public EditorContext(Highlighting syntaxHighlighting, IFoldingStrategy foldingStrategy) : this(syntaxHighlighting) + { + this.FoldingStrategy = foldingStrategy; + } + } + private interface IFoldingStrategy + { + void UpdateFoldings(FoldingManager manager, TextDocument document); + } + + private class XmlFoldingStrategy : global::ICSharpCode.AvalonEdit.Folding.XmlFoldingStrategy, IFoldingStrategy { } + + private class JsonFoldingStrategy : AvalonEdit.JsonFoldingStrategy, IFoldingStrategy { } +} diff --git a/LuYao.Toolkit/Controls/CodeEditor.Highlighting.cs b/LuYao.Toolkit/Controls/CodeEditor.Highlighting.cs new file mode 100644 index 0000000..0df63b9 --- /dev/null +++ b/LuYao.Toolkit/Controls/CodeEditor.Highlighting.cs @@ -0,0 +1,13 @@ +namespace LuYao.Toolkit.Controls; + +public partial class CodeEditor +{ + public enum Highlighting + { + Unset, + CSharp, + Json, + Log, + Xml + } +} diff --git a/LuYao.Toolkit/Controls/CodeEditor.xaml b/LuYao.Toolkit/Controls/CodeEditor.xaml new file mode 100644 index 0000000..b132117 --- /dev/null +++ b/LuYao.Toolkit/Controls/CodeEditor.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Controls/CodeEditor.xaml.cs b/LuYao.Toolkit/Controls/CodeEditor.xaml.cs new file mode 100644 index 0000000..d334175 --- /dev/null +++ b/LuYao.Toolkit/Controls/CodeEditor.xaml.cs @@ -0,0 +1,198 @@ +using ICSharpCode.AvalonEdit.Folding; +using ICSharpCode.AvalonEdit.Highlighting; +using ICSharpCode.AvalonEdit.Search; +using LuYao.Toolkit.Controls.Utils; +using System; +using System.Windows; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Controls +{ + /// + /// CodeEditor.xaml 的交互逻辑 + /// + public partial class CodeEditor : UserControl + { + private SearchPanel _searchPanel = null; + private EditorContext _editorContext = null; + private FoldingManager _foldingManager = null; + + public CodeEditor() + { + InitializeComponent(); + this._searchPanel = SearchPanel.Install(this.MainEditor); + this.MainEditor.TextChanged += MainEditor_TextChanged; + this.InitCommands(); + var cfg = ToolkitConfig.Current; + this.MainEditor.ShowLineNumbers = cfg.CodeEditorShowLineNumbers; + this.MainEditor.WordWrap = cfg.CodeEditorWordWrap; + + WeakEventManager.AddHandler(null, nameof(ToolkitConfig.Saved), this.ToolkitConfig_Saved); + } + + private void ToolkitConfig_Saved(object sender, EventArgs e) + { + SetWordWrap(this.WordWrap); + SetShowLineNumbers(this.ShowLineNumbers); + } + + private void MainEditor_TextChanged(object sender, EventArgs e) + { + this.Text = this.MainEditor.Text; + if (_foldingManager == null) return; + if (_editorContext?.FoldingStrategy != null) _editorContext.FoldingStrategy.UpdateFoldings(_foldingManager, this.MainEditor.Document); + } + + + private Highlighting _syntaxHighlighting; + + public Highlighting SyntaxHighlighting + { + get { return _syntaxHighlighting; } + set + { + if (_syntaxHighlighting != value) + { + _syntaxHighlighting = value; + this.MainEditor.SyntaxHighlighting = null; + this._editorContext = null; + if (this._foldingManager != null) + { + FoldingManager.Uninstall(this._foldingManager); + this._foldingManager = null; + } + switch (value) + { + case Highlighting.CSharp: + this.MainEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("C#"); + this._editorContext = new EditorContext(Highlighting.CSharp); + break; + case Highlighting.Json: + this.MainEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition(nameof(Highlighting.Json)); + this._editorContext = new EditorContext(Highlighting.Json, new JsonFoldingStrategy()); + break; + case Highlighting.Log: + this.MainEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition(nameof(Highlighting.Log)); + this._editorContext = new EditorContext(Highlighting.Log); + break; + case Highlighting.Xml: + this.MainEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("XML"); + this._editorContext = new EditorContext(Highlighting.Xml, new XmlFoldingStrategy()); + break; + } + if (this._editorContext != null && this._editorContext.FoldingStrategy != null) + { + this._foldingManager = FoldingManager.Install(this.MainEditor.TextArea); + } + } + } + } + + + public string Text + { + get { return (string)GetValue(TextProperty); } + set { SetValue(TextProperty, value); } + } + + public static readonly DependencyProperty TextProperty + = DependencyProperty.Register( + nameof(Text), + typeof(string), + typeof(CodeEditor), + new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextChanged) + ); + + private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var txt = e.NewValue as string; + if (d is CodeEditor editor && editor.MainEditor.Document != null && editor.MainEditor.Text != txt) + { + editor.MainEditor.Document.Text = txt ?? string.Empty; + if (editor.IsReadOnly && editor.IsAutoToEnd) + { + editor.MainEditor.ScrollToEnd(); + if (editor.MainEditor.WordWrap) editor.MainEditor.ScrollToEnd(); + } + } + } + + public static DependencyProperty IsReadOnlyProperty = DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(CodeEditor), new FrameworkPropertyMetadata(Boxes.Box(false), OnIsReadOnlyChanged)); + + public bool IsReadOnly + { + get => (bool)GetValue(IsReadOnlyProperty); + set => SetValue(IsReadOnlyProperty, Boxes.Box(value)); + } + + private static void OnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is CodeEditor editor) editor.MainEditor.IsReadOnly = (bool)e.NewValue; + } + + public bool? WordWrap + { + get { return (bool?)GetValue(WordWrapProperty); } + set { SetValue(WordWrapProperty, value); } + } + + public static readonly DependencyProperty WordWrapProperty = DependencyProperty.Register("WordWrap", typeof(bool?), typeof(CodeEditor), new FrameworkPropertyMetadata(null, OnWordWrapChanged)); + + private static void OnWordWrapChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is CodeEditor editor) + { + editor.SetWordWrap(e.NewValue as bool?); + } + } + + public bool? ShowLineNumbers + { + get { return (bool?)GetValue(ShowLineNumbersProperty); } + set { SetValue(ShowLineNumbersProperty, value); } + } + + public static readonly DependencyProperty ShowLineNumbersProperty = DependencyProperty.Register("ShowLineNumbers", typeof(bool?), typeof(CodeEditor), new FrameworkPropertyMetadata(null, OnShowLineNumbersChanged)); + + private static void OnShowLineNumbersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is CodeEditor editor) + { + editor.SetShowLineNumbers(e.NewValue as bool?); + } + } + + private void SetWordWrap(bool? v) + { + if (v != null) + { + this.MainEditor.WordWrap = v.Value; + } + else + { + this.MainEditor.WordWrap = ToolkitConfig.Current.CodeEditorWordWrap; + } + } + + private void SetShowLineNumbers(bool? v) + { + if (v != null) + { + this.MainEditor.ShowLineNumbers = v.Value; + } + else + { + this.MainEditor.ShowLineNumbers = ToolkitConfig.Current.CodeEditorShowLineNumbers; + } + } + + private bool _isAutoToEnd; + + public bool IsAutoToEnd + { + get => _isAutoToEnd; + set => _isAutoToEnd = value; + } + + } +} diff --git a/LuYao.Toolkit/Controls/DirectorySelector.xaml b/LuYao.Toolkit/Controls/DirectorySelector.xaml new file mode 100644 index 0000000..735b8ba --- /dev/null +++ b/LuYao.Toolkit/Controls/DirectorySelector.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Controls/DirectorySelector.xaml.cs b/LuYao.Toolkit/Controls/DirectorySelector.xaml.cs new file mode 100644 index 0000000..4c69616 --- /dev/null +++ b/LuYao.Toolkit/Controls/DirectorySelector.xaml.cs @@ -0,0 +1,125 @@ +using Microsoft.Win32; +using Ookii.Dialogs.Wpf; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Controls +{ + /// + /// DirectorySelector.xaml 的交互逻辑 + /// + public partial class DirectorySelector : UserControl + { + public DirectorySelector() + { + InitializeComponent(); + } + public static readonly DependencyProperty PathProperty = + DependencyProperty.Register( + "Path", + typeof(string), + typeof(DirectorySelector), + new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) + ); + public string Path + { + get => (string)GetValue(PathProperty); + set => SetValue(PathProperty, value); + } + + + + public ICommand Command + { + get { return (ICommand)GetValue(CommandProperty); } + set { SetValue(CommandProperty, value); } + } + + // Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc... + public static readonly DependencyProperty CommandProperty = + DependencyProperty.Register("Command", typeof(ICommand), typeof(DirectorySelector), new PropertyMetadata(default(ICommand))); + + + + public string DialogTitle { get; set; } + + private void OpenDirectoryButton_Click(object sender, RoutedEventArgs e) + { + OpenDialog(); + } + private void OpenDialog() + { + VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog { SelectedPath = Path, Multiselect = false }; + if (!string.IsNullOrWhiteSpace(DialogTitle)) + { + dialog.Description = DialogTitle; + dialog.UseDescriptionForTitle = true; + } + if (dialog.ShowDialog() == true) + { + Path = dialog.SelectedPath; + var cmd = this.Command; + if (cmd != null && cmd.CanExecute(this.Path)) + { + cmd.Execute(this.Path); + } + } + } + + private void PathTextBox_PreviewDragOver(object sender, DragEventArgs e) + { + e.Effects = DragDropEffects.None; + if ( + e.Data.GetDataPresent(DataFormats.FileDrop) + && e.Data.GetData(DataFormats.FileDrop) is string[] dirs + && dirs.Length == 1 + ) + { + var path = dirs[0]; + var match = Directory.Exists(path); + if (match) + { + e.Effects = DragDropEffects.Copy; + } + } + + e.Handled = true; + } + + private void PathTextBox_PreviewDrop(object sender, DragEventArgs e) + { + + e.Handled = true; + if (e.Data.GetData(DataFormats.FileDrop) is string[] dirs && dirs.Length > 0) + { + Path = dirs[0]; + } + } + + private void OpenDirectory_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(Path)) return; + Process.Start("explorer", $"\"{Path}\""); + } + + private void CopyPath_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(Path)) return; + Services.ClipboardService.CopyText(Path); + } + } +} diff --git a/LuYao.Toolkit/Controls/FileSelector.xaml b/LuYao.Toolkit/Controls/FileSelector.xaml new file mode 100644 index 0000000..cc9cea3 --- /dev/null +++ b/LuYao.Toolkit/Controls/FileSelector.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Controls/FileSelector.xaml.cs b/LuYao.Toolkit/Controls/FileSelector.xaml.cs new file mode 100644 index 0000000..e96af68 --- /dev/null +++ b/LuYao.Toolkit/Controls/FileSelector.xaml.cs @@ -0,0 +1,133 @@ +using LuYao.Toolkit.IO; +using LuYao.Toolkit.Services; +using NewLife; +using NewLife.Log; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using Ookii.Dialogs.Wpf; + +namespace LuYao.Toolkit.Controls; + +/// +/// FileSelector.xaml 的交互逻辑 +/// +public partial class FileSelector : UserControl +{ + public FileSelector() + { + InitializeComponent(); + } + public FileType FileType { get; set; } = FileType.All; + + public string FileTypeDescription { get; set; } + public string CustomerExtensions { get; set; } + public string DialogTitle { get; set; } + + public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register(nameof(FilePath), typeof(string), typeof(FileSelector), new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); + + public string FilePath + { + get => (string)GetValue(FilePathProperty); + set => SetValue(FilePathProperty, value); + } + + + public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.Register(nameof(Placeholder), typeof(string), typeof(FileSelector), new FrameworkPropertyMetadata("可将文件拖拽至此", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); + + public string Placeholder + { + get => (string)GetValue(PlaceholderProperty); + set => SetValue(PlaceholderProperty, value); + } + private void OpenFolderButton_Click(object sender, RoutedEventArgs e) + { + var dialog = new VistaOpenFileDialog { Multiselect = false, Title = DialogTitle }; + + dialog.Filter = this.FileType.BuildFilter(this.CustomerExtensions); + + if (dialog.ShowDialog() == true) + { + SelectFile(dialog.FileName); + } + } + + private void SelectFile(string file) + { + FilePath = file; + } + + private void OpenFolder_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(FilePath)) return; + + var arg = $"/select,\"{FilePath.Replace("\"", "\"\"")}\""; + try + { + Process.Start("explorer", arg); + } + catch (Exception exception) + { + XTrace.WriteLine("打开文件失败,路径:{0}", FilePath); + XTrace.WriteException(exception); + } + } + + private void CopyFullName_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(FilePath)) return; + + ClipboardService.CopyText(FilePath); + } + + private void CopyFileName_Click(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(FilePath)) return; + + var fn = System.IO.Path.GetFileName(FilePath); + if (string.IsNullOrWhiteSpace(fn)) return; + + ClipboardService.CopyText(fn); + } + + private void FileNameTextBox_PreviewDrop(object sender, DragEventArgs e) + { + if (e.Data.GetData(DataFormats.FileDrop) is string[] files) + { + var file = files.First(); + SelectFile(file); + } + } + + private void FileNameTextBox_PreviewDragOver(object sender, DragEventArgs e) + { + e.Effects = DragDropEffects.None; + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + if (e.Data.GetData(DataFormats.FileDrop) is string[] files) + { + var file = files.First(); + if (File.Exists(file)) + { + if (this.FileType.TryGetExtensions(this.CustomerExtensions, out var extensions)) + { + var ext = Path.GetExtension(file) ?? string.Empty; + if (string.IsNullOrWhiteSpace(ext) || extensions.Contains(ext, StringComparer.OrdinalIgnoreCase)) + { + e.Effects = DragDropEffects.Copy; + } + } + else + { + e.Effects = DragDropEffects.Copy; + } + } + } + } + + e.Handled = true; + } +} diff --git a/LuYao.Toolkit/Controls/FormItemContainer.cs b/LuYao.Toolkit/Controls/FormItemContainer.cs new file mode 100644 index 0000000..587526c --- /dev/null +++ b/LuYao.Toolkit/Controls/FormItemContainer.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Controls; + +public class FormItemContainer : ContentControl +{ + static FormItemContainer() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(FormItemContainer), new FrameworkPropertyMetadata(typeof(FormItemContainer))); + } + public static readonly DependencyProperty PrefixProperty = + DependencyProperty.Register("Prefix", typeof(string), typeof(FormItemContainer) + , new PropertyMetadata("标签信息:")); + + public static readonly DependencyProperty PrefixWidthProperty = + DependencyProperty.Register("PrefixWidth", typeof(double), typeof(FormItemContainer), + new PropertyMetadata(100.0d)); + public string Prefix + { + get => (string)GetValue(PrefixProperty); + set => SetValue(PrefixProperty, value); + } + + + public double PrefixWidth + { + get => (double)GetValue(PrefixWidthProperty); + set => SetValue(PrefixWidthProperty, value); + } + + protected override void OnMouseDown(MouseButtonEventArgs e) + { + if (Content is UIElement element) + { + element.Focus(); + } + + base.OnMouseDown(e); + } +} diff --git a/LuYao.Toolkit/Controls/MasterDetailLayout.cs b/LuYao.Toolkit/Controls/MasterDetailLayout.cs new file mode 100644 index 0000000..a8ea24e --- /dev/null +++ b/LuYao.Toolkit/Controls/MasterDetailLayout.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Controls; + +public class MasterDetailLayout : Expander +{ + static MasterDetailLayout() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(MasterDetailLayout), new FrameworkPropertyMetadata(typeof(MasterDetailLayout))); + } + public MasterDetailLayout() + { + this.CommandBindings.Add(new CommandBinding(LuYaoCommands.CloseDetailCommand, this.HandleCloseDetailCommand)); + } + + private void HandleCloseDetailCommand(object sender, ExecutedRoutedEventArgs e) + { + this.IsExpanded = false; + } + + public double MinDetailWidth + { + get { return (double)GetValue(MinDetailWidthProperty); } + set { SetValue(MinDetailWidthProperty, value); } + } + public double MaxDetailWidth + { + get { return (double)GetValue(MaxDetailWidthProperty); } + set { SetValue(MaxDetailWidthProperty, value); } + } + + public static readonly DependencyProperty MinDetailWidthProperty = DependencyProperty.Register("MinDetailWidth", typeof(double), typeof(MasterDetailLayout), new FrameworkPropertyMetadata(350d)); + public static readonly DependencyProperty MaxDetailWidthProperty = DependencyProperty.Register("MaxDetailWidth", typeof(double), typeof(MasterDetailLayout), new FrameworkPropertyMetadata(400d)); +} diff --git a/LuYao.Toolkit/Controls/TextBlockWithIconBox.cs b/LuYao.Toolkit/Controls/TextBlockWithIconBox.cs new file mode 100644 index 0000000..77f1804 --- /dev/null +++ b/LuYao.Toolkit/Controls/TextBlockWithIconBox.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Controls +{ + public class TextBlockWithIconBox : Control + { + static TextBlockWithIconBox() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(TextBlockWithIconBox), new FrameworkPropertyMetadata(typeof(TextBlockWithIconBox))); + } + + + public ImageSource Icon + { + get { return (ImageSource)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + + public static readonly DependencyProperty IconProperty = + DependencyProperty.Register("Icon", typeof(ImageSource), typeof(TextBlockWithIconBox), new PropertyMetadata(null)); + + public string Text + { + get { return (string)GetValue(TextProperty); } + set { SetValue(TextProperty, value); } + } + + public static readonly DependencyProperty TextProperty = + DependencyProperty.Register("Text", typeof(string), typeof(TextBlockWithIconBox), new PropertyMetadata(string.Empty)); + + } +} diff --git a/LuYao.Toolkit/Controls/Utils/Boxes.cs b/LuYao.Toolkit/Controls/Utils/Boxes.cs new file mode 100644 index 0000000..95ed7b9 --- /dev/null +++ b/LuYao.Toolkit/Controls/Utils/Boxes.cs @@ -0,0 +1,18 @@ +namespace LuYao.Toolkit.Controls.Utils; + +internal static class Boxes +{ + public static readonly object True = true; + + public static readonly object False = false; + + public static object Box(bool value) + { + if (!value) + { + return False; + } + + return True; + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/Controls/WindowToolbox.cs b/LuYao.Toolkit/Controls/WindowToolbox.cs new file mode 100644 index 0000000..e8e7f41 --- /dev/null +++ b/LuYao.Toolkit/Controls/WindowToolbox.cs @@ -0,0 +1,165 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Controls +{ + /// + /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。 + /// + /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。 + /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 + /// 元素中: + /// + /// xmlns:MyNamespace="clr-namespace:LuYao.Toolkit.Controls" + /// + /// + /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。 + /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 + /// 元素中: + /// + /// xmlns:MyNamespace="clr-namespace:LuYao.Toolkit.Controls;assembly=LuYao.Toolkit.Controls" + /// + /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用, + /// 并重新生成以避免编译错误: + /// + /// 在解决方案资源管理器中右击目标项目,然后依次单击 + /// “添加引用”->“项目”->[浏览查找并选择此项目] + /// + /// + /// 步骤 2) + /// 继续操作并在 XAML 文件中使用控件。 + /// + /// + /// + /// + public class WindowToolbox : Control + { + static WindowToolbox() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowToolbox), new FrameworkPropertyMetadata(typeof(WindowToolbox))); + } + + public WindowToolbox() + { + this.TopmostCommand = new RelayCommand(this.OnTopmostClick); + this.MinimizeCommand = new RelayCommand(this.OnMinimizeClick); + this.MaximizeCommand = new RelayCommand(this.OnMaximizeClick); + this.CloseCommand = new RelayCommand(this.OnCloseClick); + } + public bool MaximizeBox + { + get { return (bool)GetValue(MaximizeBoxProperty); } + set { SetValue(MaximizeBoxProperty, value); } + } + + public static readonly DependencyProperty MaximizeBoxProperty = DependencyProperty.Register(nameof(MaximizeBox), typeof(bool), typeof(WindowToolbox), new PropertyMetadata(true)); + + + public bool MinimizeBox + { + get { return (bool)GetValue(MinimizeBoxProperty); } + set { SetValue(MinimizeBoxProperty, value); } + } + + public static readonly DependencyProperty MinimizeBoxProperty = + DependencyProperty.Register("MinimizeBox", typeof(bool), typeof(WindowToolbox), new PropertyMetadata(true)); + + + + public bool TopmostBox + { + get { return (bool)GetValue(TopmostBoxProperty); } + set { SetValue(TopmostBoxProperty, value); } + } + + // Using a DependencyProperty as the backing store for TopmostBox. This enables animation, styling, binding, etc... + public static readonly DependencyProperty TopmostBoxProperty = + DependencyProperty.Register("TopmostBox", typeof(bool), typeof(WindowToolbox), new PropertyMetadata(true)); + + private void OnTopmostClick() + { + var win = Window.GetWindow(this); + win.Topmost = !win.Topmost; + } + private void OnMinimizeClick() + { + var win = Window.GetWindow(this); + win.WindowState = WindowState.Minimized; + } + private void OnMaximizeClick() + { + var win = Window.GetWindow(this); + if(win.WindowState == WindowState.Maximized) + { + win.WindowState = WindowState.Normal; + } + else + { + win.WindowState = WindowState.Maximized; + } + } + private void OnCloseClick() + { + var win = Window.GetWindow(this); + win.Close(); + } + + + public ICommand TopmostCommand + { + get { return (ICommand)GetValue(TopmostCommandProperty); } + set { SetValue(TopmostCommandProperty, value); } + } + + public static readonly DependencyProperty TopmostCommandProperty = DependencyProperty.Register("TopmostCommand", typeof(ICommand), typeof(WindowToolbox), new PropertyMetadata(null)); + + + + public ICommand MinimizeCommand + { + get { return (ICommand)GetValue(MinimizeCommandProperty); } + set { SetValue(MinimizeCommandProperty, value); } + } + + public static readonly DependencyProperty MinimizeCommandProperty = + DependencyProperty.Register("MinimizeCommand", typeof(ICommand), typeof(WindowToolbox), new PropertyMetadata(null)); + + + + public ICommand MaximizeCommand + { + get { return (ICommand)GetValue(MaximizeCommandProperty); } + set { SetValue(MaximizeCommandProperty, value); } + } + + public static readonly DependencyProperty MaximizeCommandProperty = + DependencyProperty.Register("MaximizeCommand", typeof(ICommand), typeof(WindowToolbox), new PropertyMetadata(null)); + + + + public ICommand CloseCommand + { + get { return (ICommand)GetValue(CloseCommandProperty); } + set { SetValue(CloseCommandProperty, value); } + } + + public static readonly DependencyProperty CloseCommandProperty = + DependencyProperty.Register("CloseCommand", typeof(ICommand), typeof(WindowToolbox), new PropertyMetadata(null)); + + + + } +} diff --git a/LuYao.Toolkit/Converters/ByteCountToDisplaySizeConverter.cs b/LuYao.Toolkit/Converters/ByteCountToDisplaySizeConverter.cs new file mode 100644 index 0000000..2a1e228 --- /dev/null +++ b/LuYao.Toolkit/Converters/ByteCountToDisplaySizeConverter.cs @@ -0,0 +1,33 @@ +using LuYao.IO; +using NewLife.Data; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters +{ + [ValueConversion(typeof(int), typeof(string))] + [ValueConversion(typeof(long), typeof(string))] + public class ByteCountToDisplaySizeConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is int || value is long || value is uint || value is ulong) + { + var len = System.Convert.ToInt64(value); + return FileUtil.ByteCountToDisplaySize(len); + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/LuYao.Toolkit/Converters/DateTimeToRelativeConverter.cs b/LuYao.Toolkit/Converters/DateTimeToRelativeConverter.cs new file mode 100644 index 0000000..b2b9c72 --- /dev/null +++ b/LuYao.Toolkit/Converters/DateTimeToRelativeConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +public class DateTimeToRelativeConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is DateTime time) return DateTimeUtils.GetRelative(time); + return string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/EnumToBooleanConverter.cs b/LuYao.Toolkit/Converters/EnumToBooleanConverter.cs new file mode 100644 index 0000000..92a45ed --- /dev/null +++ b/LuYao.Toolkit/Converters/EnumToBooleanConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows; + +namespace LuYao.Toolkit.Converters; + +public class EnumToBooleanConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var ParameterString = parameter as string; + if (ParameterString == null) return DependencyProperty.UnsetValue; + + if (Enum.IsDefined(value.GetType(), value) == false) return DependencyProperty.UnsetValue; + + object paramvalue = Enum.Parse(value.GetType(), ParameterString); + return paramvalue.Equals(value); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + var ParameterString = parameter as string; + var valueAsBool = (bool)value; + + if (ParameterString == null || !valueAsBool) + { + try + { + return Enum.Parse(targetType, "0"); + } + catch (Exception) + { + return DependencyProperty.UnsetValue; + } + } + return Enum.Parse(targetType, ParameterString); + } +} diff --git a/LuYao.Toolkit/Converters/EnumToDescriptionConverter.cs b/LuYao.Toolkit/Converters/EnumToDescriptionConverter.cs new file mode 100644 index 0000000..93849ea --- /dev/null +++ b/LuYao.Toolkit/Converters/EnumToDescriptionConverter.cs @@ -0,0 +1,27 @@ +using NewLife; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +public class EnumToDescriptionConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Enum e) + { + return e.GetDescription(); + } + return string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/EnumToVisibilityConverter.cs b/LuYao.Toolkit/Converters/EnumToVisibilityConverter.cs new file mode 100644 index 0000000..6de7936 --- /dev/null +++ b/LuYao.Toolkit/Converters/EnumToVisibilityConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters +{ + public class EnumToVisibilityConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var ParameterString = parameter as string; + if (ParameterString == null) return DependencyProperty.UnsetValue; + + if (Enum.IsDefined(value.GetType(), value) == false) return DependencyProperty.UnsetValue; + + object paramvalue = Enum.Parse(value.GetType(), ParameterString); + return paramvalue.Equals(value) ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/LuYao.Toolkit/Converters/FunctionBackgroundConverter.cs b/LuYao.Toolkit/Converters/FunctionBackgroundConverter.cs new file mode 100644 index 0000000..4d5aa52 --- /dev/null +++ b/LuYao.Toolkit/Converters/FunctionBackgroundConverter.cs @@ -0,0 +1,125 @@ +using LuYao.Toolkit.Channels; +using LuYao.Toolkit.Tabs.Navs; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Windows.Media; + +namespace LuYao.Toolkit.Converters +{ + public class FunctionBackgroundConverter : IValueConverter + { + private static readonly IReadOnlyList BrusheList = new SolidColorBrush[] + { + new SolidColorBrush(Color.FromArgb(255,0,0,255)), + new SolidColorBrush(Color.FromArgb(255,0,98,102)), + new SolidColorBrush(Color.FromArgb(255,0,123,67)), + new SolidColorBrush(Color.FromArgb(255,0,148,50)), + new SolidColorBrush(Color.FromArgb(255,0,148,200)), + new SolidColorBrush(Color.FromArgb(255,0,149,217)), + new SolidColorBrush(Color.FromArgb(255,0,163,175)), + new SolidColorBrush(Color.FromArgb(255,0,164,151)), + new SolidColorBrush(Color.FromArgb(255,0,168,255)), + new SolidColorBrush(Color.FromArgb(255,0,181,204)), + new SolidColorBrush(Color.FromArgb(255,0,184,148)), + new SolidColorBrush(Color.FromArgb(255,0,206,201)), + new SolidColorBrush(Color.FromArgb(255,1,152,117)), + new SolidColorBrush(Color.FromArgb(255,1,163,164)), + new SolidColorBrush(Color.FromArgb(255,3,201,169)), + new SolidColorBrush(Color.FromArgb(255,6,82,221)), + new SolidColorBrush(Color.FromArgb(255,9,132,227)), + new SolidColorBrush(Color.FromArgb(255,10,189,227)), + new SolidColorBrush(Color.FromArgb(255,16,172,132)), + new SolidColorBrush(Color.FromArgb(255,18,137,167)), + new SolidColorBrush(Color.FromArgb(255,34,166,179)), + new SolidColorBrush(Color.FromArgb(255,39,60,117)), + new SolidColorBrush(Color.FromArgb(255,39,146,195)), + new SolidColorBrush(Color.FromArgb(255,44,169,225)), + new SolidColorBrush(Color.FromArgb(255,46,134,222)), + new SolidColorBrush(Color.FromArgb(255,46,213,115)), + new SolidColorBrush(Color.FromArgb(255,52,31,151)), + new SolidColorBrush(Color.FromArgb(255,52,158,105)), + new SolidColorBrush(Color.FromArgb(255,56,161,219)), + new SolidColorBrush(Color.FromArgb(255,56,180,139)), + new SolidColorBrush(Color.FromArgb(255,71,88,92)), + new SolidColorBrush(Color.FromArgb(255,72,52,212)), + new SolidColorBrush(Color.FromArgb(255,72,126,176)), + new SolidColorBrush(Color.FromArgb(255,76,209,55)), + new SolidColorBrush(Color.FromArgb(255,77,5,232)), + new SolidColorBrush(Color.FromArgb(255,78,205,196)), + new SolidColorBrush(Color.FromArgb(255,89,88,87)), + new SolidColorBrush(Color.FromArgb(255,106,176,76)), + new SolidColorBrush(Color.FromArgb(255,108,92,231)), + new SolidColorBrush(Color.FromArgb(255,111,30,81)), + new SolidColorBrush(Color.FromArgb(255,113,128,142)), + new SolidColorBrush(Color.FromArgb(255,127,143,166)), + new SolidColorBrush(Color.FromArgb(255,131,52,113)), + new SolidColorBrush(Color.FromArgb(255,131,149,167)), + new SolidColorBrush(Color.FromArgb(255,145,61,136)), + new SolidColorBrush(Color.FromArgb(255,153,128,250)), + new SolidColorBrush(Color.FromArgb(255,156,136,255)), + new SolidColorBrush(Color.FromArgb(255,163,203,56)), + new SolidColorBrush(Color.FromArgb(255,165,55,253)), + new SolidColorBrush(Color.FromArgb(255,181,52,113)), + new SolidColorBrush(Color.FromArgb(255,190,46,221)), + new SolidColorBrush(Color.FromArgb(255,211,56,28)), + new SolidColorBrush(Color.FromArgb(255,214,48,49)), + new SolidColorBrush(Color.FromArgb(255,217,51,63)), + new SolidColorBrush(Color.FromArgb(255,217,128,250)), + new SolidColorBrush(Color.FromArgb(255,225,112,85)), + new SolidColorBrush(Color.FromArgb(255,225,123,52)), + new SolidColorBrush(Color.FromArgb(255,230,0,51)), + new SolidColorBrush(Color.FromArgb(255,232,65,24)), + new SolidColorBrush(Color.FromArgb(255,232,67,147)), + new SolidColorBrush(Color.FromArgb(255,233,82,149)), + new SolidColorBrush(Color.FromArgb(255,234,32,39)), + new SolidColorBrush(Color.FromArgb(255,234,85,6)), + new SolidColorBrush(Color.FromArgb(255,235,77,75)), + new SolidColorBrush(Color.FromArgb(255,235,98,56)), + new SolidColorBrush(Color.FromArgb(255,237,76,103)), + new SolidColorBrush(Color.FromArgb(255,238,82,83)), + new SolidColorBrush(Color.FromArgb(255,238,90,36)), + new SolidColorBrush(Color.FromArgb(255,240,147,43)), + new SolidColorBrush(Color.FromArgb(255,243,104,224)), + new SolidColorBrush(Color.FromArgb(255,245,36,67)), + new SolidColorBrush(Color.FromArgb(255,245,171,53)), + new SolidColorBrush(Color.FromArgb(255,246,36,89)), + new SolidColorBrush(Color.FromArgb(255,247,159,31)), + new SolidColorBrush(Color.FromArgb(255,247,202,24)), + new SolidColorBrush(Color.FromArgb(255,251,197,49)), + new SolidColorBrush(Color.FromArgb(255,253,121,168)), + new SolidColorBrush(Color.FromArgb(255,253,203,110)), + new SolidColorBrush(Color.FromArgb(255,255,71,209)), + new SolidColorBrush(Color.FromArgb(255,255,107,129)), + new SolidColorBrush(Color.FromArgb(255,255,159,67)), + }; + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is FunctionItem item) + { + var code = Math.Abs(item.Id.GetHashCode()); + var len = BrusheList.Count; + var idx = code % len; + return BrusheList[idx]; + } + if(value is NavItem nav) + { + var code = Math.Abs(nav.Url.GetDeterministicHashCode()); + var len = BrusheList.Count; + var idx = code % len; + return BrusheList[idx]; + } + return Brushes.Black; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/LuYao.Toolkit/Converters/FunctionBackgroundConverter.linq b/LuYao.Toolkit/Converters/FunctionBackgroundConverter.linq new file mode 100644 index 0000000..91050b0 --- /dev/null +++ b/LuYao.Toolkit/Converters/FunctionBackgroundConverter.linq @@ -0,0 +1,19 @@ + + System.Drawing + + +var colors = new string[] { +"#006266","#007B43","#009432","#0094C8","#0095D9","#00A3AF","#00A497","#00a8ff","#00b5cc","#00b894","#00cec9","#019875","#01a3a4","#03c9a9","#0652DD","#0984e3","#0abde3","#10ac84","#1289A7","#22a6b3","#273c75","#2792C3","#2CA9E1","#2e86de","#2ed573","#341f97","#349e69","#38A1DB","#38B48B","#47585C","#4834d4","#487eb0","#4cd137","#4d05e8","#4ecdc4","#595857","#6ab04c","#6c5ce7","#6F1E51","#71808E","#7f8fa6","#833471","#8395a7","#913d88","#9980FA","#9c88ff","#A3CB38","#a537fd","#B53471","#be2edd","#D3381C","#d63031","#D9333F","#D980FA","#e17055","#E17B34","#E60033","#e84118","#e84393","#E95295","#EA2027","#EA5506","#eb4d4b","#EB6238","#ED4C67","#ee5253","#EE5A24","#f0932b","#f368e0","#f52443","#f5ab35","#f62459","#F79F1F","#f7ca18","#fbc531","#fd79a8","#fdcb6e","#ff47d1","#ff6b81","#ff9f43","blue" +}; +var converter = new ColorConverter(); +var list = new SortedSet(); +foreach (var color in colors) +{ + var item =(Color) converter.ConvertFrom(color); + list.Add(item.ToArgb()); +} +foreach (var i in list) +{ + var item = Color.FromArgb(i); + Console.WriteLine("new SolidColorBrush(Color.FromArgb({0},{1},{2},{3})),",item.A,item.R,item.G,item.B); +} \ No newline at end of file diff --git a/LuYao.Toolkit/Converters/LanguageCodeToNameConverter.cs b/LuYao.Toolkit/Converters/LanguageCodeToNameConverter.cs new file mode 100644 index 0000000..6ac440a --- /dev/null +++ b/LuYao.Toolkit/Converters/LanguageCodeToNameConverter.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters +{ + public class LanguageCodeToNameConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string str && !string.IsNullOrWhiteSpace(str)) + { + switch (str.ToUpperInvariant()) + { + case "EN": return "英语"; + case "FR": return "法语"; + case "DE": return "德语"; + case "IT": return "意大利"; + case "ES": return "西班牙"; + case "PT": return "葡萄牙"; + case "NL": return "荷兰语"; + case "PL": return "波兰语"; + case "JA": return "日语"; + case "KO": return "韩语"; + case "AR": return "阿拉伯"; + case "TR": return "土耳其"; + case "TH": return "泰文"; + case "MS": return "马来语"; + case "VI": return "越南语"; + case "SV": return "瑞典语"; + case "ID": return "印尼语"; + case "ZH": + case "ZH-CN": + return "中文"; + default: return str; + } + } + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/LuYao.Toolkit/Converters/PathToFileNameConverter.cs b/LuYao.Toolkit/Converters/PathToFileNameConverter.cs new file mode 100644 index 0000000..dc2e9ab --- /dev/null +++ b/LuYao.Toolkit/Converters/PathToFileNameConverter.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using System.IO; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +[ValueConversion(typeof(string), typeof(string))] +public class PathToFileNameConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string str) return Path.GetFileName(str); + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/PathToIconConverter.cs b/LuYao.Toolkit/Converters/PathToIconConverter.cs new file mode 100644 index 0000000..fcd3a7b --- /dev/null +++ b/LuYao.Toolkit/Converters/PathToIconConverter.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Windows.Interop; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.Windows; +using System.IO; + +namespace LuYao.Toolkit.Converters; + +[ValueConversion(typeof(string), typeof(ImageSource))] +public class PathToIconConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string fn && File.Exists(fn)) + { + //return Path.GetFileName(str); + var icon = Icon.ExtractAssociatedIcon(fn); + if (icon != null) + { + using (var bitmap = icon.ToBitmap()) + { + //ensure Bitmap is disposed of after usefulness is fulfilled. + var bmpPt = bitmap.GetHbitmap(); + try + { + var bitmapSource = + Imaging.CreateBitmapSourceFromHBitmap( + bmpPt, + IntPtr.Zero, + Int32Rect.Empty, + BitmapSizeOptions.FromEmptyOptions()); + + //freeze bitmapSource and clear memory to avoid memory leaks + bitmapSource.Freeze(); + return bitmapSource; + } + finally + { + //done in a finally block to ensure this memory is not leaked regardless of exceptions. + DeleteObject(bmpPt); + } + } + } + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + [DllImport("gdi32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool DeleteObject(IntPtr value); +} diff --git a/LuYao.Toolkit/Converters/RegexMatchPositionConverter.cs b/LuYao.Toolkit/Converters/RegexMatchPositionConverter.cs new file mode 100644 index 0000000..7503963 --- /dev/null +++ b/LuYao.Toolkit/Converters/RegexMatchPositionConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +public class RegexMatchPositionConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Match m) + { + return $"({m.Index},{m.Length})"; + } + if (value is Group g) + { + return $"({g.Index},{g.Length})"; + } + if (value is Capture c) + { + return $"({c.Index},{c.Length})"; + } + return string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/SingleLineConverter.cs b/LuYao.Toolkit/Converters/SingleLineConverter.cs new file mode 100644 index 0000000..8bf13ec --- /dev/null +++ b/LuYao.Toolkit/Converters/SingleLineConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +public class SingleLineConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string str && !string.IsNullOrWhiteSpace(str)) + { + return str + .Replace("\n", string.Empty) + .Replace("\r", string.Empty) + .Trim(); + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/StringIsNotNullOrEmptyConverter.cs b/LuYao.Toolkit/Converters/StringIsNotNullOrEmptyConverter.cs new file mode 100644 index 0000000..26bebc7 --- /dev/null +++ b/LuYao.Toolkit/Converters/StringIsNotNullOrEmptyConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +[ValueConversion(typeof(string), typeof(bool))] +public class StringIsNotNullOrEmptyConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string str) + { + return !string.IsNullOrWhiteSpace(str); + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Converters/TruncateStringConverter.cs b/LuYao.Toolkit/Converters/TruncateStringConverter.cs new file mode 100644 index 0000000..b05a156 --- /dev/null +++ b/LuYao.Toolkit/Converters/TruncateStringConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace LuYao.Toolkit.Converters; + +public class TruncateStringConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var max = 500; + if (parameter is int i) max = i; + if (max <= 0) max = 500; + if (value is string str) + { + if (str.Length > max) return str.Substring(0, max); + return str; + } + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/LuYao.Toolkit/Dialogs/DialogWindow.xaml b/LuYao.Toolkit/Dialogs/DialogWindow.xaml new file mode 100644 index 0000000..d884661 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/DialogWindow.xaml @@ -0,0 +1,12 @@ + + diff --git a/LuYao.Toolkit/Dialogs/DialogWindow.xaml.cs b/LuYao.Toolkit/Dialogs/DialogWindow.xaml.cs new file mode 100644 index 0000000..e31978b --- /dev/null +++ b/LuYao.Toolkit/Dialogs/DialogWindow.xaml.cs @@ -0,0 +1,40 @@ +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Dialogs; + +/// +/// DialogWindow.xaml 的交互逻辑 +/// +public partial class DialogWindow : IDialogWindow +{ + public DialogWindow() + { + InitializeComponent(); + this.Loaded += DialogWindow_Loaded; + } + + private void DialogWindow_Loaded(object sender, RoutedEventArgs e) + { + Debug.WriteLine(this.Title); + } + + /// + /// The of the dialog. + /// + public IDialogResult Result { get; set; } + +} diff --git a/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml b/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml new file mode 100644 index 0000000..e2c3b50 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml.cs b/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml.cs new file mode 100644 index 0000000..c76cd25 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/MultiboxingDialog.xaml.cs @@ -0,0 +1,33 @@ +using LuYao.Toolkit.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Dialogs +{ + /// + /// MultiboxingDialog.xaml 的交互逻辑 + /// + public partial class MultiboxingDialog : UserControl, IGrowlTokenProvider + { + public MultiboxingDialog() + { + InitializeComponent(); + this.GrowlToken = $"growl_{Math.Abs(this.GetHashCode())}"; + this.GrowlStackPanel.SetValue(HandyControl.Controls.Growl.TokenProperty, this.GrowlToken); + } + + public string GrowlToken { get; set; } + } +} diff --git a/LuYao.Toolkit/Dialogs/MultiboxingDialogViewModel.cs b/LuYao.Toolkit/Dialogs/MultiboxingDialogViewModel.cs new file mode 100644 index 0000000..4956339 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/MultiboxingDialogViewModel.cs @@ -0,0 +1,47 @@ +using LuYao.Toolkit.Channels; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Dialogs; + +public partial class MultiboxingDialogViewModel : ViewModelBase, IDialogAware +{ + private IRegionManager _regionManager; + public string RegionName { get; } + public MultiboxingDialogViewModel(IRegionManager regionManager) + { + this._regionManager = regionManager ?? throw new ArgumentNullException(nameof(regionManager)); + this.RegionName = $"dialog_{Math.Abs(this.GetHashCode())}"; + } + + public string Title { set; get; } + + public event Action RequestClose; + + public bool CanCloseDialog() + { + return true; + } + + public void OnDialogClosed() + { + this._regionManager.Regions.Remove(this.RegionName); + } + + public void OnDialogOpened(IDialogParameters parameters) + { + var func = parameters.GetValue("Function"); + if (func == null) return; + this.Title = func.Title; + this._regionManager.RegisterViewWithRegion(this.RegionName, func.View); + } + protected virtual void OnRequestClose(IDialogResult obj) + { + RequestClose?.Invoke(obj); + } +} diff --git a/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml b/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml new file mode 100644 index 0000000..8f367d5 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml @@ -0,0 +1,14 @@ + + diff --git a/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml.cs b/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml.cs new file mode 100644 index 0000000..622da97 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/MultiboxingDialogWindow.xaml.cs @@ -0,0 +1,44 @@ +using LuYao.Toolkit.Services; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Dialogs +{ + /// + /// DialogWindow.xaml 的交互逻辑 + /// + public partial class MultiboxingDialogWindow : IDialogWindow, IGrowlTokenProvider + { + public MultiboxingDialogWindow() + { + InitializeComponent(); + this.Loaded += DialogWindow_Loaded; + } + + private void DialogWindow_Loaded(object sender, RoutedEventArgs e) + { + this.Owner = null; + } + + public IDialogResult Result { get; set; } + + public string GrowlToken => GetGrowlName(); + private string GetGrowlName() + { + if (this.Content is IGrowlTokenProvider provider) return provider.GrowlToken; + return nameof(MainWindow); + } + } +} diff --git a/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml new file mode 100644 index 0000000..1171f9a --- /dev/null +++ b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml.cs b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml.cs new file mode 100644 index 0000000..7572da4 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialog.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Dialogs +{ + /// + /// PreviewFileAsStringDialog.xaml 的交互逻辑 + /// + public partial class PreviewFileAsStringDialog : UserControl + { + public PreviewFileAsStringDialog() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialogViewModel.cs b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialogViewModel.cs new file mode 100644 index 0000000..3d38151 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/PreviewFileAsStringDialogViewModel.cs @@ -0,0 +1,84 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Prism.Services.Dialogs; +using System; +using System.IO; +using System.Text; + +namespace LuYao.Toolkit.Dialogs; + +public partial class PreviewFileAsStringDialogViewModel : ViewModelBase, IDialogAware +{ + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(FileName))] + private Events.PreviewFileAsStringEventPayload _payload; + + public string FileName => Path.GetFileName(this.Payload.FullName); + + [ObservableProperty] + private string _content; + + public const int Limit = 1000; + + + public string Title => "预览文件"; + + public event Action RequestClose; + + [RelayCommand] + private void Close() + { + this.RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } + + public bool CanCloseDialog() => true; + + public void OnDialogClosed() + { + } + + private void ReadConten() + { + using (var sr = new StreamReader(this.Payload.FullName, this.Payload.Encoding)) + { + var sb = new StringBuilder(); + while (!sr.EndOfStream) + { + if (sb.Length >= Limit) break; + var line = sr.ReadLine(); + if (!string.IsNullOrWhiteSpace(line)) + { + if (line.Length <= Limit) + { + sb.AppendLine(line); + } + else + { + sb.Append(line.Substring(0, Limit)); + sb.Append("..."); + sb.AppendLine(); + break; + } + } + else + { + sb.Append(line); + } + } + this.Content = sb.ToString(); + } + } + + public void OnDialogOpened(IDialogParameters parameters) + { + if (parameters.TryGetValue(nameof(Payload), out var payload)) + { + this.Payload = payload; + this.ReadConten(); + } + else + { + throw new Exception("Payload 为空"); + } + } +} diff --git a/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml new file mode 100644 index 0000000..0a8dc8e --- /dev/null +++ b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml.cs b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml.cs new file mode 100644 index 0000000..95b3af5 --- /dev/null +++ b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialog.xaml.cs @@ -0,0 +1,32 @@ +using LuYao.Toolkit.Helpers; +using LuYao.Toolkit.Rdm; +using LuYao.Toolkit.Themes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Dialogs +{ + /// + /// ToolkitSettingsDialog.xaml 的交互逻辑 + /// + public partial class ToolkitSettingsDialog : UserControl + { + public ToolkitSettingsDialog() + { + InitializeComponent(); + ComboBoxHelper.BindEnum(ThemesComboBox); + } + } +} diff --git a/LuYao.Toolkit/Dialogs/ToolkitSettingsDialogViewModel.cs b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialogViewModel.cs new file mode 100644 index 0000000..af9759c --- /dev/null +++ b/LuYao.Toolkit/Dialogs/ToolkitSettingsDialogViewModel.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.Toolkit.Events; +using Prism.Events; +using Prism.Services.Dialogs; +using System; + +namespace LuYao.Toolkit.Dialogs; + +public partial class ToolkitSettingsDialogViewModel : ViewModelBase, IDialogAware +{ + private IEventAggregator eventAggregator; + + public ToolkitSettingsDialogViewModel(IEventAggregator eventAggregator) + { + this.eventAggregator = eventAggregator; + } + + public string Title => "设置"; + + public event Action RequestClose; + + public bool CanCloseDialog() + { + return true; + } + + public void OnDialogClosed() + { + ToolkitConfig.Current = null; + } + + public void OnDialogOpened(IDialogParameters parameters) + { + this.Config = ToolkitConfig.Current; + } + + [ObservableProperty] + private ToolkitConfig _config; + + [RelayCommand] + private void Save() + { + this.Config.Save(); + eventAggregator.GetEvent().Publish(this.Config.Theme); + this.RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } +} diff --git a/LuYao.Toolkit/Helpers/ComboBoxHelper.cs b/LuYao.Toolkit/Helpers/ComboBoxHelper.cs new file mode 100644 index 0000000..04c561f --- /dev/null +++ b/LuYao.Toolkit/Helpers/ComboBoxHelper.cs @@ -0,0 +1,39 @@ +using NewLife; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Helpers; + +public static class ComboBoxHelper +{ + public static void BindEnum(T combo) where TEnum : Enum where T : ComboBox + { + var values = Enum.GetValues(typeof(TEnum)); + combo.DisplayMemberPath = "Display"; + combo.SelectedValuePath = "Value"; + combo.Items.Clear(); + foreach (TEnum item in values) + { + var desc = item.GetDescription(); + if (string.IsNullOrWhiteSpace(desc)) desc = item.ToString(); + var dto = new + { + Display = desc, + Value = item + }; + combo.Items.Add(dto); + } + } + public static void BindEnum(this ComboBox combo) where TEnum : Enum + { + BindEnum(combo); + } + public static void BindEnum(this HandyControl.Controls.ComboBox combo) where TEnum : Enum + { + BindEnum(combo); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/IO/FileType.cs b/LuYao.Toolkit/IO/FileType.cs new file mode 100644 index 0000000..8907eb5 --- /dev/null +++ b/LuYao.Toolkit/IO/FileType.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel; + +namespace LuYao.Toolkit.IO; + +[Flags] +public enum FileType +{ + [Description("全部文件")] + All = -1, + + [Description("文件")] + Customer = 0, + + [Description("位图文件")] + [FileTypeExtensions(".jpg", ".png", ".bmp", ".gif", ".webp")] + Image = 1, + + [Description("文本文件")] + [FileTypeExtensions(".txt")] + Text = 2, + + [Description("Word文件")] + [FileTypeExtensions(".doc", ".docx")] + Word = 4, + + [Description("Excel文件")] + [FileTypeExtensions(".xls", ".xlsx")] + Excel = 8, + + [Description("压缩文件")] + [FileTypeExtensions(".zip", ".rar", ".gz", ".7z")] + Zip = 16, + + [Description("XML文件")] + [FileTypeExtensions(".xml")] + Xml = 32, + + [Description("可执行文件")] + [FileTypeExtensions(".exe")] + Exe = 64, + + [Description("XSL文件")] + [FileTypeExtensions(".xsl", ".xslt")] + Xsl = 128, + + [FileTypeExtensions(".json", ".js", ".txt")] + [Description("JSON")] + Json = 256, + + [FileTypeExtensions(".js")] + [Description("JavaScript")] + JavaScript = 512, + + [Description("日志")] + [FileTypeExtensions(".log", ".txt")] + Log = 1024, + + [Description("Liquid")] + [FileTypeExtensions(".liquid")] + Liquid = 2048, + + [Description("矢量图")] + [FileTypeExtensions(".svg")] + Svg = 4096, +} diff --git a/LuYao.Toolkit/IO/FileTypeExtensions.cs b/LuYao.Toolkit/IO/FileTypeExtensions.cs new file mode 100644 index 0000000..38d21f2 --- /dev/null +++ b/LuYao.Toolkit/IO/FileTypeExtensions.cs @@ -0,0 +1,115 @@ +using NewLife; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace LuYao.Toolkit.IO; + +public static class FileTypeExtensions +{ + private static FileTypeExtensionsAttribute GetFileTypeExtensions(this FileType value) + { + + FieldInfo field = value.GetType().GetField(value.ToString(), BindingFlags.Static | BindingFlags.Public); + if (field == null) + { + return null; + } + return field.GetCustomAttribute(); + } + + public static bool TryGetExtensions(this FileType type, string custome, out List extensions) + { + extensions = new List(); + if (type == FileType.All) return false; + if (type == FileType.Customer) + { + if (!string.IsNullOrWhiteSpace(custome)) + { + foreach (var ext in custome.Split(';')) if (!extensions.Contains(ext)) extensions.Add(ext); + } + } + else + { + var values = Enum.GetValues(); + foreach (var item in values) + { + if (type.HasFlag(item)) + { + var exts = item.GetFileTypeExtensions(); + if (exts != null) + { + foreach (var ext in exts.Extensions) + { + if (!extensions.Contains(ext)) extensions.Add(ext); + } + } + } + } + } + return true; + } + + public static string BuildFilter(this FileType type, string custome) + { + if (type == FileType.All) return "全部文件|*.*"; + var sb = new StringBuilder(); + if (type == FileType.Customer) + { + sb.Append("文件|"); + if (string.IsNullOrWhiteSpace(custome)) + { + sb.Append("*.*"); + } + else + { + foreach (var ext in custome.Split(';')) sb.AppendFormat("*{0};", ext); + sb.Length--; + } + } + else + { + var dic = new SortedDictionary(); + var values = Enum.GetValues(); + foreach (var item in values) + { + if (type.HasFlag(item)) + { + var exts = item.GetFileTypeExtensions(); + if (exts != null) + { + dic.Add(item.GetDescription(), exts); + } + } + } + if (dic.Count <= 0) return "全部文件|*.*"; + if (dic.Count == 1) + { + var first = dic.First(); + return $"{first.Key}|{first.Value.FilterValue}"; + } + var set = new SortedSet(StringComparer.OrdinalIgnoreCase); + foreach (var item in dic) + { + foreach (var value in item.Value.Extensions) + { + set.Add("*" + value); + } + } + sb.Append("全部文件|"); + sb.Append(string.Join(";", set)); + sb.Append('|'); + foreach (var item in dic) + { + sb.Append(item.Key); + sb.Append('|'); + sb.Append(item.Value.FilterValue); + sb.Append('|'); + } + sb.Length--; + } + return sb.ToString(); + } +} diff --git a/LuYao.Toolkit/IO/FileTypeExtensionsAttribute.cs b/LuYao.Toolkit/IO/FileTypeExtensionsAttribute.cs new file mode 100644 index 0000000..a47a314 --- /dev/null +++ b/LuYao.Toolkit/IO/FileTypeExtensionsAttribute.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace LuYao.Toolkit.IO; + +public class FileTypeExtensionsAttribute : Attribute +{ + public FileTypeExtensionsAttribute(params string[] extensions) + { + this.Extensions = extensions ?? throw new ArgumentNullException(nameof(extensions)); + if (this.Extensions.Count <= 0) throw new ArgumentOutOfRangeException(nameof(extensions)); + this.FilterValue = string.Join( + ";", + extensions.Order(StringComparer.InvariantCultureIgnoreCase) + .Distinct() + .Select(str => $"*{str}") + ); + } + public IReadOnlyCollection Extensions { get; } + public string FilterValue { get; } +} diff --git a/LuYao.Toolkit/IPLookup.dat b/LuYao.Toolkit/IPLookup.dat new file mode 100644 index 0000000..a958a40 Binary files /dev/null and b/LuYao.Toolkit/IPLookup.dat differ diff --git a/LuYao.Toolkit/LuYao.Toolkit.csproj b/LuYao.Toolkit/LuYao.Toolkit.csproj new file mode 100644 index 0000000..e0085de --- /dev/null +++ b/LuYao.Toolkit/LuYao.Toolkit.csproj @@ -0,0 +1,107 @@ + + + + + WinExe + net7.0-windows + true + latest + App.ico + + + + + libs + + + System.Data.SQLite.dll;SQLite.Interop.dll + + + + False + + + False + False + + + False + + Error + + https://gitee.com/liesauer/HostFXRPatcher + master + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\libs\AxInterop.MSTSCLib.dll + + + ..\libs\Interop.MSTSCLib.dll + + + ..\libs\LuYao.Common.dll + + + + + + + + + + + + + + Always + + + + + + + + + Designer + + + Designer + + + diff --git a/LuYao.Toolkit/LuYao.Toolkit.csproj.user b/LuYao.Toolkit/LuYao.Toolkit.csproj.user new file mode 100644 index 0000000..4ca6ea1 --- /dev/null +++ b/LuYao.Toolkit/LuYao.Toolkit.csproj.user @@ -0,0 +1,344 @@ + + + + <_LastSelectedProfileId>D:\src\coderbusy\luyao\src\toolkit\LuYao.Toolkit\Properties\PublishProfiles\FolderProfile.pubxml + net462 + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + UserControl + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + \ No newline at end of file diff --git a/LuYao.Toolkit/LuYaoCommands.cs b/LuYao.Toolkit/LuYaoCommands.cs new file mode 100644 index 0000000..49a3f77 --- /dev/null +++ b/LuYao.Toolkit/LuYaoCommands.cs @@ -0,0 +1,12 @@ +using System.Windows.Input; + +namespace LuYao.Toolkit; + +public static class LuYaoCommands +{ + static LuYaoCommands() + { + CloseDetailCommand = new RoutedCommand(nameof(CloseDetailCommand), typeof(LuYaoCommands)); + } + public static RoutedCommand CloseDetailCommand { get; private set; } +} diff --git a/LuYao.Toolkit/MainWindow.xaml b/LuYao.Toolkit/MainWindow.xaml new file mode 100644 index 0000000..812a6d1 --- /dev/null +++ b/LuYao.Toolkit/MainWindow.xaml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/MainWindow.xaml.cs b/LuYao.Toolkit/MainWindow.xaml.cs new file mode 100644 index 0000000..380c595 --- /dev/null +++ b/LuYao.Toolkit/MainWindow.xaml.cs @@ -0,0 +1,199 @@ +using HandyControl.Controls; +using HandyControl.Data; +using HandyControl.Tools; +using LuYao.IO.Updating; +using LuYao.Toolkit.Behaviors; +using LuYao.Toolkit.Events; +using LuYao.Toolkit.IO; +using LuYao.Toolkit.Rdm.Events; +using LuYao.Toolkit.Themes; +using LuYao.Toolkit.Update; +using LuYao.Toolkit.Views; +using NewLife.Configuration; +using NewLife.Reflection; +using Prism.Events; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO.Packaging; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : ViewStates.IViewStateHost + { + private IEventAggregator _eventAggregator; + private IRegionManager _regionManager; + private IDialogService _dialogService; + public MainWindow(IEventAggregator eventAggregator, IRegionManager regionManager, IDialogService dialogService) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + _regionManager = regionManager ?? throw new ArgumentNullException(nameof(regionManager)); + this._dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService)); + InitializeComponent(); + _size = new Size(this.MinWidth, this.MinHeight); + this.ViewSate = new ViewStates.ViewStateBag(this); + _eventAggregator.GetEvent().Subscribe(OnOpenTab); + _eventAggregator.GetEvent().Subscribe(OnOpenFunctionItem); + _eventAggregator.GetEvent().Subscribe(this.OnRdmOpenRdpConnection); + _eventAggregator.GetEvent().Subscribe(OnPreviewFileAsStringEvent); + _eventAggregator.GetEvent().Subscribe(this.OnThemeChanged); + this.Width = _size.Width; + this.Height = _size.Height; + this.EnsureFormFits(); + this.SizeChanged += MainWindow_SizeChanged; + this.Closed += MainWindow_Closed; + this.Loaded += MainWindow_Loaded; + + var cfg = ToolkitConfig.Current; + var themeManager = ThemeManager.Current; + if (cfg.Theme != themeManager.Theme) themeManager.Theme = cfg.Theme; + if (cfg.CheckForUpdatesOnStartup) this.CheckUpdate(); + } + + private void OnThemeChanged(ThemeMode theme) + { + ThemeManager.Current.Theme = theme; + } + + private void MainWindow_Loaded(object sender, RoutedEventArgs e) + { + var ass = AssemblyX.Create(Assembly.GetExecutingAssembly()); + this.Title = $"路遥工具箱 v{ass.Version}"; + TempHelper.ClearTemp(); + } + + private void OnPreviewFileAsStringEvent(PreviewFileAsStringEventPayload payload) + { + _dialogService.Show(nameof(Dialogs.PreviewFileAsStringDialog), new DialogParameters { { "Payload", payload } }, result => { }); + } + + private void MainWindow_Closed(object sender, EventArgs e) + { + System.Windows.Application.Current.Shutdown(); + } + + private void EnsureFormFits() + { + var workingArea = Screen.FromHandle(this.GetHandle()).WorkingArea; + if (base.Width > workingArea.Width * 0.8) + { + base.Width = workingArea.Width * 0.8; + } + if (base.Height > workingArea.Height * 0.8) + { + base.Height = workingArea.Height * 0.8; + } + + if (this.Left < 0) this.Left = 0; + if (this.Top < 0) this.Top = 0; + } + + [ViewStates.WatchViewState(nameof(WindowSize))] + private Size _size; + public Size WindowSize + { + get => _size; + set + { + if (_size != value) + { + _size = value; + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(WindowSize))); + } + } + } + private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e) + { + this.WindowSize = e.NewSize; + } + + public ViewStates.ViewStateBag ViewSate { get; } + public int InstanceId => 1; + + public event PropertyChangedEventHandler PropertyChanged; + + private void OnOpenFunctionItem(OpenFunctionItemEventPayload payload) + { + var item = payload.Item; + Services.TongjiService.Tongji(item.View); + if (payload.IsNewSession) + { + _regionManager.RequestNavigate(Regions.RegionNames.MainRegion, ViewNames.Tabs.Session.Index, (r) => + { + if (r.Result == true) _regionManager.RequestNavigate(Regions.RegionNames.WorkingRegion, item.View); + }); + } + } + + private void OnOpenTab(Tabs.Tab tab) + { + _regionManager.RequestNavigate(Regions.RegionNames.MainRegion, tab.View); + } + private void OnRdmOpenRdpConnection(OpenRdpConnectionEventPayload args) + { + var id = args.Id; + _regionManager.RequestNavigate(Regions.RegionNames.MainRegion, ViewNames.Tabs.Rdp.Index, (r) => + { + if (r.Result == true) Tabs.Rdp.Index.Open(id); + }); + } + private async void CheckUpdate() + { + await Task.Delay(TimeSpan.FromSeconds(3)); + var config = UpdateConfig.Current; + if (config.NextCheckUpdate <= DateTime.Now) + { + var package = await config.GetLastVersion(); + var root = AppDomain.CurrentDomain.BaseDirectory; + if (!await package.HasUpdate(Assembly.GetExecutingAssembly(), root)) + { + return; + } + _dialogService.Show(nameof(Update.FindNewVersionDialog), new DialogParameters { { nameof(UpdatePackage), package } }, result => + { + if (result.Result == ButtonResult.Ignore) + { + config.ResetNextCheckTime(); + config.Save(); + } + else if (result.Result == ButtonResult.Yes) + { + Notification.Show(new Update.Update(package), ShowAnimation.None, true); + } + }); + } + } + + private void Settings_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + _dialogService.ShowDialog(nameof(Dialogs.ToolkitSettingsDialog)); + } + + private void SettingsButton_Click(object sender, RoutedEventArgs e) + { + + e.Handled = true; + _dialogService.ShowDialog(nameof(Dialogs.ToolkitSettingsDialog)); + } + } +} diff --git a/LuYao.Toolkit/ProcessManager.cs b/LuYao.Toolkit/ProcessManager.cs new file mode 100644 index 0000000..6cb92b5 --- /dev/null +++ b/LuYao.Toolkit/ProcessManager.cs @@ -0,0 +1,79 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using System.Threading; + +namespace LuYao.Toolkit; + +internal static class ProcessManager +{ + private static Mutex ProcessLock; + private static bool HasLock; + + /// + /// 获取进程锁 + /// + public static void GetProcessLock() + { + // 全局锁 + ProcessLock = new Mutex(false, $"Global\\LuYao.Toolkit[{GetUid()}]", out HasLock); + + if (!HasLock) + { + ActiveWindow(); + Environment.Exit(0); + } + } + + private static string GetUid() + { + var bytes = Encoding.UTF8.GetBytes(Assembly.GetExecutingAssembly().Location); + using (var md5 = MD5.Create()) + { + bytes = md5.ComputeHash(bytes); + } + return BitConverter.ToString(bytes); + } + + /// + /// 激活当前进程并将其窗口放到屏幕最前面 + /// + public static void ActiveWindow() + { + using (var p = Process.GetCurrentProcess()) + { + string pName = p.ProcessName; + Process[] temp = Process.GetProcessesByName(pName); + foreach (var item in temp) + { + if (item.MainModule.FileName == p.MainModule.FileName) + { + IntPtr handle = item.MainWindowHandle; + SwitchToThisWindow(handle, true); + break; + } + } + } + } + + /// + /// 释放当前进程的锁 + /// + /// 小心使用 + public static void ReleaseLock() + { + if (ProcessLock != null && HasLock) + { + ProcessLock.Dispose(); + HasLock = false; + } + } + + // 将另一个窗口激活放到前台。 + // Win32 API + [DllImport("user32.dll")] + public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab); +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml new file mode 100644 index 0000000..011ac95 --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml.cs b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml.cs new file mode 100644 index 0000000..ec8a1af --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingDialog.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Rdm.Dialogs +{ + /// + /// RdmSettingDialog.xaml 的交互逻辑 + /// + public partial class RdmSettingDialog : UserControl + { + public RdmSettingDialog() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdmSettingViewModel.cs b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingViewModel.cs new file mode 100644 index 0000000..7efacf4 --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdmSettingViewModel.cs @@ -0,0 +1,147 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FluentValidation; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XCode; + +namespace LuYao.Toolkit.Rdm.Dialogs; + +public partial class RdmSettingViewModel : ViewModelBase, IDialogAware +{ + private readonly IDialogService _dialogService; + + public RdmSettingViewModel(IDialogService dialogService) + { + _dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService)); + } + + public string Title => "远程桌面设置"; + + + public event Action RequestClose; + + public bool CanCloseDialog() + { + return true; + } + + public void OnDialogClosed() + { + } + + public void OnDialogOpened(IDialogParameters parameters) + { + LoadGroups(); + } + + [ObservableProperty] + private List _groups = new List(); + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(EditGroupCommand))] + [NotifyCanExecuteChangedFor(nameof(DeleteGroupCommand))] + [NotifyCanExecuteChangedFor(nameof(UpGroupCommand))] + [NotifyCanExecuteChangedFor(nameof(DownGroupCommand))] + private RdpGroup _currentGroup = null; + + private void LoadGroups() + { + var groups = Entities.RdpGroup.GetAllGroups(); + var list = new List(groups.Count); + foreach (var g in groups) + { + list.Add(new RdpGroup(g)); + } + this.Groups = list; + } + [RelayCommand] + private void AddGroup() + { + _dialogService.ShowDialog(nameof(RdpGroupDetailDialog), (r) => + { + if (r.Result == ButtonResult.OK) + { + this.LoadGroups(); + } + }); + } + + private bool CanEdit() => this.CurrentGroup != null; + [RelayCommand(CanExecute = nameof(CanEdit))] + private void EditGroup() + { + var p = new DialogParameters(); + p.Add("id", this.CurrentGroup.Id); + _dialogService.ShowDialog(nameof(RdpGroupDetailDialog), p, (r) => + { + if (r.Result == ButtonResult.OK) + { + this.LoadGroups(); + } + }); + } + + private bool CanDelete() => this.CurrentGroup != null; + [RelayCommand(CanExecute = nameof(CanDelete))] + private void DeleteGroup() + { + if (this.CurrentGroup == null) return; + if (Services.MessageBoxService.Confirm("是否确认删除此分组?") == false) return; + var e = Entities.RdpGroup.FindById(this.CurrentGroup.Id); + if (e != null) e.Delete(); + this.LoadGroups(); + } + + private bool CanUp() + { + if (this.CurrentGroup == null) return false; + var id = this.CurrentGroup.Id; + var all = Entities.RdpGroup.GetAllGroups(); + if (all.Count > 0 && all[0].Id != id) return true; + return false; + } + [RelayCommand(CanExecute = nameof(CanUp))] + private void UpGroup() + { + var all = Entities.RdpGroup.GetAllGroups(); + for (int i = 0; i < all.Count; i++) + { + all[i].Rank = i * 2; + if (all[i].Id == this.CurrentGroup.Id) + { + all[i].Rank -= 3; + } + } + all.Save(); + LoadGroups(); + } + + private bool CanDown() + { + if (this.CurrentGroup == null) return false; + var id = this.CurrentGroup.Id; + var all = Entities.RdpGroup.GetAllGroups(); + if (all.Count > 0 && all[all.Count - 1].Id != id) return true; + return false; + } + [RelayCommand(CanExecute = nameof(CanDown))] + private void DownGroup() + { + var all = Entities.RdpGroup.GetAllGroups(); + for (int i = 0; i < all.Count; i++) + { + all[i].Rank = i * 2; + if (all[i].Id == this.CurrentGroup.Id) + { + all[i].Rank += 3; + } + } + all.Save(); + LoadGroups(); + } +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml new file mode 100644 index 0000000..ca0345e --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml.cs b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml.cs new file mode 100644 index 0000000..7224d3c --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailDialog.xaml.cs @@ -0,0 +1,66 @@ +using LuYao.Toolkit.Helpers; +using LuYao.Toolkit.Rdm; +using NewLife; +using System; +using System.Windows; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Rdm.Dialogs +{ + /// + /// RdoConnectionDetail.xaml 的交互逻辑 + /// + public partial class RdpConnectionDetailDialog : UserControl + { + public RdpConnectionDetailDialog() + { + InitializeComponent(); + ComboBoxHelper.BindEnum(DesktopSizeComboBox); + ComboBoxHelper.BindEnum(ColorDepthComboBox); + ComboBoxHelper.BindEnum(AudioRedirectionComboBox); + ComboBoxHelper.BindEnum(KeyboardRedirectionComboBox); + ComboBoxHelper.BindEnum(AuthenticationLevelComboBox); + DesktopSizeComboBox.SelectionChanged += DesktopSizeComboBox_SelectionChanged; + NameTextBox.LostFocus += NameTextBox_OnLostFocus; + } + + private void DesktopSizeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (e.AddedItems != null && e.AddedItems.Count > 0) + { + var current = (DesktopSize)(e.AddedItems[0] as dynamic).Value; + if (current == DesktopSize.Custom) + { + WidthNumericUpDown.IsEnabled = true; + HeightNumericUpDown.IsEnabled = true; + } + else + { + WidthNumericUpDown.IsEnabled = false; + HeightNumericUpDown.IsEnabled = false; + var arr = current.GetDescription() + .Split(new[] { 'x' }, StringSplitOptions.RemoveEmptyEntries); + WidthNumericUpDown.Value = Convert.ToInt32(arr[0]); + HeightNumericUpDown.Value = Convert.ToInt32(arr[1]); + } + } + } + private void NameTextBox_OnLostFocus(object sender, RoutedEventArgs e) + { + if (string.IsNullOrWhiteSpace(this.NameTextBox.Text)) return; + if (!string.IsNullOrWhiteSpace(this.HostTextBox.Text)) return; + var host = this.NameTextBox.Text.Replace(':', ':').Trim(); + if (host.Contains(":")) + { + var arr = host.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length == 2 && int.TryParse(arr[1], out var port) && port > 0 && port < 65535) + { + host = arr[0]; + this.PortNumericUpDown.Value = port; + } + } + + this.HostTextBox.Text = host; + } + } +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailViewModel.cs b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailViewModel.cs new file mode 100644 index 0000000..a8e13f4 --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpConnectionDetailViewModel.cs @@ -0,0 +1,122 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FluentValidation; +using LuYao.Toolkit.Rdm; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using XCode; + +namespace LuYao.Toolkit.Rdm.Dialogs; + +public partial class RdpConnectionDetailViewModel : ViewModelBase, IDialogAware +{ + + public RdpConnectionDetailViewModel() + { + } + public string Title { get; private set; } + + [ObservableProperty] + private IList _groups; + + private RdpConnection _connection; + + public RdpConnection Connection + { + get => _connection; + set => SetProperty(ref _connection, value); + } + + public event Action RequestClose; + + [RelayCommand] + void Save() + { + RdpConnectionValidator.Instance.ValidateAndThrow(this.Connection); + if (this.Connection.Id == Guid.Empty) + { + var e = new Entities.RdpConnection + { + CreatedAt = DateTime.Now, + UpdatedAt = DateTime.Now, + Id = Guid.NewGuid(), + }; + this.Connection.Write(e); + e.Save(); + } + else + { + var e = Entities.RdpConnection.FindById(this.Connection.Id); + if (e == null) throw new Exception("数据未找到"); + e.UpdatedAt = DateTime.Now; + + this.Connection.Write(e); + + e.Save(); + } + this.RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } + [RelayCommand] + void Cancel() + { + this.RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + } + + public bool CanCloseDialog() + { + return true; + } + + public void OnDialogClosed() + { + } + + public void OnDialogOpened(IDialogParameters parameters) + { + //act=add : 不去数据库查询数据,标题设置成 新建 + //act=edit : 去数据库查一查数据,标题设置成 编辑 + if (parameters.TryGetValue("act", out var act)) + { + switch (act) + { + case "add": + this.Title = "添加远程桌面"; + this.Connection = new RdpConnection + { + Port = 3389, + DesktopSize = DesktopSize.X1024Y768, + AutoExpand = true, + ColorDepth = ColorDepth.Depth16Bit, + AudioSetting = AudioRedirection.PlayNoSound, + KeyboardSetting = KeyboardRedirection.OnLocal, + BitmapCaching = true, + AuthenticationLevel = AuthenticationLevel.Connect, + EnableCredSspSupport = true, + Username = "administrator" + }; + break; + case "edit": + this.Title = "编辑远程桌面"; + if (!parameters.TryGetValue("id", out var id)) throw new Exception("id 未找到"); + var e = Entities.RdpConnection.FindById(id); + if (e == null) throw new Exception("数据未找到"); + this.Connection = new RdpConnection(e); + var g = Entities.RdpGroup.FindById(e.GroupId); + if (g == null) this.Connection.GroupId = Guid.Empty; + break; + default: + throw new Exception($"未知的 action:{act}"); + } + } + var items = new List { RdpGroup.None }; + foreach (var item in Entities.RdpGroup.GetAllGroups()) + { + items.Add(new RdpGroup(item)); + } + this.Groups = items; + } +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml new file mode 100644 index 0000000..2701cab --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml.cs b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml.cs new file mode 100644 index 0000000..6030e0e --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailDialog.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Rdm.Dialogs +{ + /// + /// RdpGroupDetailDialog.xaml 的交互逻辑 + /// + public partial class RdpGroupDetailDialog : UserControl + { + public RdpGroupDetailDialog() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailViewModel.cs b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailViewModel.cs new file mode 100644 index 0000000..c2274b8 --- /dev/null +++ b/LuYao.Toolkit/Rdm/Dialogs/RdpGroupDetailViewModel.cs @@ -0,0 +1,85 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FluentValidation; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Rdm.Dialogs; + +public partial class RdpGroupDetailViewModel : ViewModelBase, IDialogAware +{ + [ObservableProperty] + private string _action = "添加"; + + [ObservableProperty] + private RdpGroup _group = new RdpGroup { }; + public string Title => $"{this.Action}分组"; + + public event Action RequestClose; + + public bool CanCloseDialog() + { + return true; + } + + public void OnDialogClosed() + { + } + + public void OnDialogOpened(IDialogParameters parameters) + { + if (parameters.TryGetValue("id", out var id)) + { + var e = Entities.RdpGroup.FindById(id); + if (e == null) + { + Close(); + return; + } + this.Group = new RdpGroup(e); + this.Action = "编辑"; + } + else + { + this.Action = "添加"; + this.Group = new RdpGroup { }; + } + } + + [RelayCommand] + private void Close() + { + this.RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + } + + [RelayCommand] + private void Save() + { + RdpGroupValidator.Instance.ValidateAndThrow(this.Group); + Entities.RdpGroup group; + if (this.Group.Id != Guid.Empty) + { + group = Entities.RdpGroup.FindById(this.Group.Id); + } + else + { + group = new Entities.RdpGroup { CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now }; + } + group.Name = this.Group.Name; + group.UpdatedAt = DateTime.Now; + if (group.Id == Guid.Empty) + { + group.Id = Guid.NewGuid(); + group.Insert(); + } + else + { + group.Update(); + } + this.RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } +} diff --git a/LuYao.Toolkit/Rdm/IMsRdpClient.cs b/LuYao.Toolkit/Rdm/IMsRdpClient.cs new file mode 100644 index 0000000..169e503 --- /dev/null +++ b/LuYao.Toolkit/Rdm/IMsRdpClient.cs @@ -0,0 +1,18 @@ +using MSTSCLib; +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace LuYao.Toolkit.Rdm; + +public interface IMsRdpClient : IDisposable, ISupportInitialize +{ + void Update(IRdpConnection connection); + Control Control { get; } + void Attach(IMsRdpClientHandler handler); + void Detach(IMsRdpClientHandler handler); + void Connect(); + void Disconnect(); + string GetErrorDescription(uint disconnectReason, uint extendedDisconnectReason); + ExtendedDisconnectReasonCode ExtendedDisconnectReason { get; } +} diff --git a/LuYao.Toolkit/Rdm/IMsRdpClientHandler.cs b/LuYao.Toolkit/Rdm/IMsRdpClientHandler.cs new file mode 100644 index 0000000..6489820 --- /dev/null +++ b/LuYao.Toolkit/Rdm/IMsRdpClientHandler.cs @@ -0,0 +1,15 @@ +using AxMSTSCLib; +using System; + +namespace LuYao.Toolkit.Rdm; + +public interface IMsRdpClientHandler +{ + void OnConnecting(object sender, EventArgs e); + + void OnLoginComplete(object sender, EventArgs e); + + void OnDisconnected(object sender, IMsTscAxEvents_OnDisconnectedEvent e); + + void OnConnected(object sender, EventArgs e); +} diff --git a/LuYao.Toolkit/Rdm/MsRdpClientFactory.cs b/LuYao.Toolkit/Rdm/MsRdpClientFactory.cs new file mode 100644 index 0000000..aaadf1b --- /dev/null +++ b/LuYao.Toolkit/Rdm/MsRdpClientFactory.cs @@ -0,0 +1,418 @@ +using AxMSTSCLib; +using System; +using System.Windows.Forms; + +namespace LuYao.Toolkit.Rdm; +public static class MsRdpClientFactory +{ + private class MsRdpClient5 : AxMsRdpClient5, IMsRdpClient + { + public MsRdpClient5() + { + Name = nameof(MsRdpClient5); + } + public Control Control => this; + + public void Attach(IMsRdpClientHandler handler) + { + OnConnected += handler.OnConnected; + OnDisconnected += handler.OnDisconnected; + OnLoginComplete += handler.OnLoginComplete; + OnConnecting += handler.OnConnecting; + } + + public void Detach(IMsRdpClientHandler handler) + { + OnConnected -= handler.OnConnected; + OnDisconnected -= handler.OnDisconnected; + OnLoginComplete -= handler.OnLoginComplete; + OnConnecting -= handler.OnConnecting; + } + + public void Update(IRdpConnection desktop) + { + AdvancedSettings6.BitmapPersistence = Convert.ToInt32(desktop.BitmapCaching); + ColorDepth = (int)desktop.ColorDepth; + FullScreenTitle = desktop.Name + " - " + desktop.Host; + AdvancedSettings6.ConnectToServerConsole = desktop.ConnectToConsole; + Server = desktop.Host.Trim(); + + if (!string.IsNullOrWhiteSpace(desktop.Username)) + { + UserName = desktop.Username.Trim(); + if (!string.IsNullOrWhiteSpace(desktop.Password)) + { + AdvancedSettings6.ClearTextPassword = desktop.Password; + } + } + if (!string.IsNullOrWhiteSpace(desktop.Domain)) Domain = desktop.Domain.Trim(); + + AdvancedSettings6.RDPPort = desktop.Port; + SecuredSettings2.AudioRedirectionMode = Convert.ToInt32(desktop.AudioSetting); + SecuredSettings2.KeyboardHookMode = Convert.ToInt32(desktop.KeyboardSetting); + AdvancedSettings6.RedirectDrives = desktop.RedirectDisks; + AdvancedSettings6.RedirectPorts = desktop.RedirectPorts; + AdvancedSettings6.RedirectPrinters = desktop.RedirectPrinters; + AdvancedSettings6.RedirectSmartCards = desktop.RedirectSmartCards; + AdvancedSettings6.SmartSizing = desktop.SmartSizing; + AdvancedSettings6.allowBackgroundInput = 1; + AdvancedSettings6.PinConnectionBar = true; + AdvancedSettings6.DisplayConnectionBar = true; + AdvancedSettings6.ContainerHandledFullScreen = 0; + ConnectingText = "Connecting to " + desktop.Name + "..."; + DisconnectedText = "Disconnected from " + desktop.Name; + int num = 0; + if (!desktop.AllowWallpaper) + { + num++; + } + if (!desktop.AllowContents) + { + num += 2; + } + if (!desktop.AllowAnimation) + { + num += 4; + } + if (!desktop.AllowThemes) + { + num += 8; + } + AdvancedSettings6.PerformanceFlags = num; + AdvancedSettings6.AuthenticationLevel = (uint)desktop.AuthenticationLevel; + if (!desktop.AutoExpand) + { + DesktopHeight = desktop.DisplayHeight; + DesktopWidth = desktop.DisplayWidth; + } + else + { + DesktopHeight = Height; + DesktopWidth = Width; + } + } + + protected override void WndProc(ref Message m) + { + // Fix for the missing focus issue on the rdp client component + if (m.Msg == 0x0021) // WM_MOUSEACTIVATE + { + if (!ContainsFocus) + { + Focus(); + } + } + + base.WndProc(ref m); + } + } + private class MsRdpClient6 : AxMsRdpClient6, IMsRdpClient + { + public Control Control => this; + public void Attach(IMsRdpClientHandler handler) + { + OnConnected += handler.OnConnected; + OnDisconnected += handler.OnDisconnected; + OnLoginComplete += handler.OnLoginComplete; + OnConnecting += handler.OnConnecting; + } + + public void Detach(IMsRdpClientHandler handler) + { + OnConnected -= handler.OnConnected; + OnDisconnected -= handler.OnDisconnected; + OnLoginComplete -= handler.OnLoginComplete; + OnConnecting -= handler.OnConnecting; + } + + public void Update(IRdpConnection connection) + { + + AdvancedSettings7.BitmapPersistence = Convert.ToInt32(connection.BitmapCaching); + ColorDepth = (int)connection.ColorDepth; + FullScreenTitle = connection.Name + " - " + connection.Host; + AdvancedSettings7.ConnectToServerConsole = connection.ConnectToConsole; + AdvancedSettings7.ConnectToAdministerServer = connection.ConnectToConsole; + Server = connection.Host.Trim(); + + if (!string.IsNullOrWhiteSpace(connection.Username)) + { + UserName = connection.Username.Trim(); + if (!string.IsNullOrWhiteSpace(connection.Password)) + { + AdvancedSettings6.ClearTextPassword = connection.Password; + } + } + if (!string.IsNullOrWhiteSpace(connection.Domain)) Domain = connection.Domain.Trim(); + + AdvancedSettings7.RDPPort = connection.Port; + SecuredSettings2.AudioRedirectionMode = Convert.ToInt32(connection.AudioSetting); + SecuredSettings2.KeyboardHookMode = Convert.ToInt32(connection.KeyboardSetting); + AdvancedSettings7.RedirectDrives = connection.RedirectDisks; + AdvancedSettings7.RedirectPorts = connection.RedirectPorts; + AdvancedSettings7.RedirectPrinters = connection.RedirectPrinters; + AdvancedSettings7.RedirectSmartCards = connection.RedirectSmartCards; + AdvancedSettings7.SmartSizing = connection.SmartSizing; + AdvancedSettings7.allowBackgroundInput = 1; + AdvancedSettings7.PinConnectionBar = true; + AdvancedSettings7.DisplayConnectionBar = true; + AdvancedSettings7.ContainerHandledFullScreen = 0; + ConnectingText = "Connecting to " + connection.Name + "..."; + DisconnectedText = "Disconnected from " + connection.Name; + int num = 0; + if (!connection.AllowWallpaper) + { + num++; + } + if (!connection.AllowContents) + { + num += 2; + } + if (!connection.AllowAnimation) + { + num += 4; + } + if (!connection.AllowThemes) + { + num += 8; + } + AdvancedSettings7.PerformanceFlags = num; + AdvancedSettings7.AuthenticationLevel = (uint)connection.AuthenticationLevel; + AdvancedSettings7.EnableCredSspSupport = connection.EnableCredSspSupport; + if (!connection.AutoExpand) + { + DesktopHeight = connection.DisplayHeight; + DesktopWidth = connection.DisplayWidth; + } + else + { + DesktopHeight = Height; + DesktopWidth = Width; + } + } + + protected override void WndProc(ref Message m) + { + // Fix for the missing focus issue on the rdp client component + if (m.Msg == 0x0021) // WM_MOUSEACTIVATE + { + if (!ContainsFocus) + { + Focus(); + } + } + + base.WndProc(ref m); + } + } + private class MsRdpClient7 : AxMsRdpClient7, IMsRdpClient + { + public Control Control => this; + public void Attach(IMsRdpClientHandler handler) + { + OnConnected += handler.OnConnected; + OnDisconnected += handler.OnDisconnected; + OnLoginComplete += handler.OnLoginComplete; + OnConnecting += handler.OnConnecting; + } + + public void Detach(IMsRdpClientHandler handler) + { + OnConnected -= handler.OnConnected; + OnDisconnected -= handler.OnDisconnected; + OnLoginComplete -= handler.OnLoginComplete; + OnConnecting -= handler.OnConnecting; + } + + public void Update(IRdpConnection desktop) + { + AdvancedSettings8.BitmapPersistence = Convert.ToInt32(desktop.BitmapCaching); + ColorDepth = (int)desktop.ColorDepth; + FullScreenTitle = desktop.Name + " - " + desktop.Host; + AdvancedSettings8.ConnectToServerConsole = desktop.ConnectToConsole; + AdvancedSettings8.ConnectToAdministerServer = desktop.ConnectToConsole; + Server = desktop.Host.Trim(); + + if (!string.IsNullOrWhiteSpace(desktop.Username)) + { + UserName = desktop.Username.Trim(); + if (!string.IsNullOrWhiteSpace(desktop.Password)) + { + AdvancedSettings6.ClearTextPassword = desktop.Password; + } + } + if (!string.IsNullOrWhiteSpace(desktop.Domain)) Domain = desktop.Domain.Trim(); + + AdvancedSettings8.RDPPort = desktop.Port; + SecuredSettings3.AudioRedirectionMode = Convert.ToInt32(desktop.AudioSetting); + SecuredSettings3.KeyboardHookMode = Convert.ToInt32(desktop.KeyboardSetting); + AdvancedSettings8.RedirectDrives = desktop.RedirectDisks; + AdvancedSettings8.RedirectPorts = desktop.RedirectPorts; + AdvancedSettings8.RedirectPrinters = desktop.RedirectPrinters; + AdvancedSettings8.RedirectSmartCards = desktop.RedirectSmartCards; + AdvancedSettings8.SmartSizing = desktop.SmartSizing; + AdvancedSettings8.allowBackgroundInput = 1; + AdvancedSettings8.PinConnectionBar = true; + AdvancedSettings8.DisplayConnectionBar = true; + AdvancedSettings8.ContainerHandledFullScreen = 1; + ConnectingText = "Connecting to " + desktop.Name + "..."; + DisconnectedText = "Disconnected from " + desktop.Name; + int num = 0; + if (!desktop.AllowWallpaper) + { + num++; + } + if (!desktop.AllowContents) + { + num += 2; + } + if (!desktop.AllowAnimation) + { + num += 4; + } + if (!desktop.AllowThemes) + { + num += 8; + } + AdvancedSettings8.PerformanceFlags = num; + AdvancedSettings8.AuthenticationLevel = (uint)desktop.AuthenticationLevel; + AdvancedSettings8.EnableCredSspSupport = desktop.EnableCredSspSupport; + + if (!desktop.AutoExpand) + { + DesktopHeight = desktop.DisplayHeight; + DesktopWidth = desktop.DisplayWidth; + } + else + { + DesktopHeight = Height; + DesktopWidth = Width; + } + } + + protected override void WndProc(ref Message m) + { + // Fix for the missing focus issue on the rdp client component + if (m.Msg == 0x0021) // WM_MOUSEACTIVATE + { + if (!ContainsFocus) + { + Focus(); + } + } + + base.WndProc(ref m); + } + } + private class MsRdpClient8 : AxMsRdpClient8NotSafeForScripting, IMsRdpClient + { + public MsRdpClient8() + { + } + public Control Control => this; + public void Attach(IMsRdpClientHandler handler) + { + OnConnected += handler.OnConnected; + OnDisconnected += handler.OnDisconnected; + OnLoginComplete += handler.OnLoginComplete; + OnConnecting += handler.OnConnecting; + } + public void Detach(IMsRdpClientHandler handler) + { + OnConnected -= handler.OnConnected; + OnDisconnected -= handler.OnDisconnected; + OnLoginComplete -= handler.OnLoginComplete; + OnConnecting -= handler.OnConnecting; + } + public void Update(IRdpConnection desktop) + { + AdvancedSettings9.BitmapPersistence = Convert.ToInt32(desktop.BitmapCaching); + ColorDepth = (int)desktop.ColorDepth; + FullScreenTitle = desktop.Name + " - " + desktop.Host; + AdvancedSettings9.ConnectToServerConsole = desktop.ConnectToConsole; + AdvancedSettings9.ConnectToAdministerServer = desktop.ConnectToConsole; + Server = desktop.Host.Trim(); + + if (!string.IsNullOrWhiteSpace(desktop.Username)) + { + UserName = desktop.Username.Trim(); + if (!string.IsNullOrWhiteSpace(desktop.Password)) + { + AdvancedSettings6.ClearTextPassword = desktop.Password; + } + } + if (!string.IsNullOrWhiteSpace(desktop.Domain)) Domain = desktop.Domain.Trim(); + + AdvancedSettings9.RDPPort = desktop.Port; + SecuredSettings3.AudioRedirectionMode = Convert.ToInt32(desktop.AudioSetting); + SecuredSettings3.KeyboardHookMode = Convert.ToInt32(desktop.KeyboardSetting); + AdvancedSettings9.RedirectDrives = desktop.RedirectDisks; + AdvancedSettings9.RedirectPorts = desktop.RedirectPorts; + AdvancedSettings9.RedirectPrinters = desktop.RedirectPrinters; + AdvancedSettings9.RedirectSmartCards = desktop.RedirectSmartCards; + AdvancedSettings9.SmartSizing = desktop.SmartSizing; + AdvancedSettings9.allowBackgroundInput = 1; + AdvancedSettings9.PinConnectionBar = true; + AdvancedSettings9.DisplayConnectionBar = true; + AdvancedSettings9.ContainerHandledFullScreen = 1; + ConnectingText = "Connecting to " + desktop.Name + "..."; + DisconnectedText = "Disconnected from " + desktop.Name; + int num = 0; + if (!desktop.AllowWallpaper) + { + num++; + } + if (!desktop.AllowContents) + { + num += 2; + } + if (!desktop.AllowAnimation) + { + num += 4; + } + if (!desktop.AllowThemes) + { + num += 8; + } + AdvancedSettings8.PerformanceFlags = num; + AdvancedSettings8.AuthenticationLevel = (uint)desktop.AuthenticationLevel; + AdvancedSettings8.EnableCredSspSupport = desktop.EnableCredSspSupport; + + if (!desktop.AutoExpand) + { + DesktopHeight = desktop.DisplayHeight; + DesktopWidth = desktop.DisplayWidth; + } + else + { + DesktopHeight = Height; + DesktopWidth = Width; + } + } + protected override void WndProc(ref Message m) + { + // Fix for the missing focus issue on the rdp client component + if (m.Msg == 0x0021) // WM_MOUSEACTIVATE + { + if (!ContainsFocus) + { + Focus(); + } + } + + base.WndProc(ref m); + } + } + public static IMsRdpClient Create(int? version) + { + switch (version) + { + case 5: return new MsRdpClient5(); + case 6: return new MsRdpClient6(); + case 7: return new MsRdpClient7(); + case 8: return new MsRdpClient8(); + } + return null; + } +} + diff --git a/LuYao.Toolkit/Rdm/RdpConnectStatus.cs b/LuYao.Toolkit/Rdm/RdpConnectStatus.cs new file mode 100644 index 0000000..53ccbb5 --- /dev/null +++ b/LuYao.Toolkit/Rdm/RdpConnectStatus.cs @@ -0,0 +1,3 @@ +namespace LuYao.Toolkit.Rdm; + +public enum RdpConnectStatus { Pending, Connecting, Connected, Disconnected, Fail } diff --git a/LuYao.Toolkit/Rdm/RdpSession.Designer.cs b/LuYao.Toolkit/Rdm/RdpSession.Designer.cs new file mode 100644 index 0000000..7bd8e4b --- /dev/null +++ b/LuYao.Toolkit/Rdm/RdpSession.Designer.cs @@ -0,0 +1,70 @@ +namespace LuYao.Toolkit.Tabs.Rdp.Controls +{ + partial class RdpSession + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.ErrorTextBox = new System.Windows.Forms.TextBox(); + this.tConnect = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // ErrorTextBox + // + this.ErrorTextBox.AcceptsReturn = true; + this.ErrorTextBox.AcceptsTab = true; + this.ErrorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.ErrorTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(227)))), ((int)(((byte)(227))))); + this.ErrorTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.ErrorTextBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(157)))), ((int)(((byte)(0)))), ((int)(((byte)(51))))); + this.ErrorTextBox.Location = new System.Drawing.Point(243, 243); + this.ErrorTextBox.Margin = new System.Windows.Forms.Padding(4); + this.ErrorTextBox.Multiline = true; + this.ErrorTextBox.Name = "ErrorTextBox"; + this.ErrorTextBox.ReadOnly = true; + this.ErrorTextBox.Size = new System.Drawing.Size(403, 113); + this.ErrorTextBox.TabIndex = 1; + this.ErrorTextBox.Visible = false; + // + // RdoSession + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.ErrorTextBox); + this.Name = "RdoSession"; + this.Size = new System.Drawing.Size(700, 400); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox ErrorTextBox; + private System.Windows.Forms.Timer tConnect; + } +} diff --git a/LuYao.Toolkit/Rdm/RdpSession.cs b/LuYao.Toolkit/Rdm/RdpSession.cs new file mode 100644 index 0000000..eace5bf --- /dev/null +++ b/LuYao.Toolkit/Rdm/RdpSession.cs @@ -0,0 +1,186 @@ +using AxMSTSCLib; +using LuYao.Toolkit.Rdm; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LuYao.Toolkit.Tabs.Rdp.Controls; +public partial class RdpSession : UserControl, IMsRdpClientHandler +{ + static RdpSession() => LoadVersion(); + #region 版本识别 + public static int? Version { get; private set; } + private static bool LoadVersion() + { + try + { + FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\mstscax.dll"); + switch (versionInfo.ProductMajorPart) + { + default: + return false; + case 10: + Version = 8; + break; + case 6: + switch (versionInfo.ProductMinorPart) + { + default: + Version = 8; + break; + case 0: + if (versionInfo.ProductBuildPart <= 6000) + { + Version = 5; + } + else if (versionInfo.ProductBuildPart >= 6001) + { + Version = 6; + } + break; + case 1: + if (versionInfo.ProductBuildPart <= 6999) + { + Version = 6; + } + else if (versionInfo.ProductBuildPart >= 7000) + { + Version = 7; + } + break; + case 2: + if (versionInfo.ProductBuildPart >= 9200) + { + Version = 8; + } + break; + case 3: + if (versionInfo.ProductBuildPart >= 9600) + { + Version = 8; + } + break; + } + break; + } + return true; + } + catch (Exception) + { + return false; + } + } + #endregion + private RdpConnectStatus _status = RdpConnectStatus.Pending; + private static readonly object EventStatusChanged = new object(); + public RdpConnectStatus Status + { + get => _status; + set + { + if (value != _status) + { + _status = value; + var handlers = (StatusChangedEventHandler)Events[EventStatusChanged]; + handlers?.Invoke(this, new StatusChangedEventArgs(value)); + } + } + } + public event StatusChangedEventHandler StatusChanged + { + add => base.Events.AddHandler(EventStatusChanged, value); + remove => base.Events.RemoveHandler(EventStatusChanged, value); + } + public IMsRdpClient MsRdpClient { get; private set; } + public IRdpConnection RdpConnection { get; set; } + public RdpSession() + { + InitializeComponent(); + this.MsRdpClient = MsRdpClientFactory.Create(Version); + this.Load += RdoSession_Load; + this.tConnect.Tick += TConnect_Tick; + } + + + public void Release() + { + if (this.MsRdpClient == null) return; + this.MsRdpClient.Detach(this); + this.Controls.Remove(this.MsRdpClient.Control); + this.MsRdpClient.Dispose(); + this.MsRdpClient = null; + } + + public void Connect() + { + this.tConnect.Enabled = true; + } + public void Disconnect() + { + if (this.MsRdpClient == null) return; + MsRdpClient.Disconnect(); + } + private void TConnect_Tick(object sender, EventArgs e) + { + this.tConnect.Enabled = false; + if (this.MsRdpClient == null || this.RdpConnection == null) return; + MsRdpClient.Update(this.RdpConnection); + MsRdpClient.Connect(); + } + + private void RdoSession_Load(object sender, EventArgs e) + { + if (this.MsRdpClient != null) + { + var ctrl = MsRdpClient.Control; + ctrl.Enabled = true; + ctrl.Dock = DockStyle.Fill; + this.Controls.Add(ctrl); + MsRdpClient.Attach(this); + } + else + { + Status = RdpConnectStatus.Fail; + MessageBox.Show( + "Unable to find compatible version of Microsoft Remote Desktop Connection!" + Environment.NewLine + "Version 6.0 or higher is required.", + $"{this.Name} - Error", + MessageBoxButtons.OK, + MessageBoxIcon.Hand + ); + } + } + #region IMsRdpClientHandler + public void OnConnecting(object sender, EventArgs e) + { + ErrorTextBox.SendToBack(); + ErrorTextBox.Visible = false; + this.Status = RdpConnectStatus.Connecting; + } + + public void OnLoginComplete(object sender, EventArgs e) + { + } + + public void OnDisconnected(object sender, IMsTscAxEvents_OnDisconnectedEvent e) + { + if (e.discReason != 1 && e.discReason != 2 && MsRdpClient != null) + { + ErrorTextBox.Text = MsRdpClient.GetErrorDescription((uint)e.discReason, (uint)MsRdpClient.ExtendedDisconnectReason); + ErrorTextBox.Visible = true; + ErrorTextBox.BringToFront(); + } + this.Status = RdpConnectStatus.Disconnected; + } + + public void OnConnected(object sender, EventArgs e) + { + this.Status = RdpConnectStatus.Connected; + } + #endregion +} diff --git a/LuYao.Toolkit/Rdm/RdpSession.resx b/LuYao.Toolkit/Rdm/RdpSession.resx new file mode 100644 index 0000000..b341343 --- /dev/null +++ b/LuYao.Toolkit/Rdm/RdpSession.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/LuYao.Toolkit/Rdm/StatusChangedEventArgs.cs b/LuYao.Toolkit/Rdm/StatusChangedEventArgs.cs new file mode 100644 index 0000000..e4e17d2 --- /dev/null +++ b/LuYao.Toolkit/Rdm/StatusChangedEventArgs.cs @@ -0,0 +1,12 @@ +using System; + +namespace LuYao.Toolkit.Rdm; + +public class StatusChangedEventArgs : EventArgs +{ + public RdpConnectStatus Status { get; } + + public StatusChangedEventArgs(RdpConnectStatus status) => Status = status; +} + +public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e); \ No newline at end of file diff --git a/LuYao.Toolkit/Resources/JetBrainsMono.ttf b/LuYao.Toolkit/Resources/JetBrainsMono.ttf new file mode 100644 index 0000000..8da8aa4 Binary files /dev/null and b/LuYao.Toolkit/Resources/JetBrainsMono.ttf differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/calc.ico b/LuYao.Toolkit/Resources/SystemToolkit/calc.ico new file mode 100644 index 0000000..d21f3ec Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/calc.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/certmgr.ico b/LuYao.Toolkit/Resources/SystemToolkit/certmgr.ico new file mode 100644 index 0000000..43cdfd7 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/certmgr.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/cmd.ico b/LuYao.Toolkit/Resources/SystemToolkit/cmd.ico new file mode 100644 index 0000000..7583c3c Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/cmd.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/credential.ico b/LuYao.Toolkit/Resources/SystemToolkit/credential.ico new file mode 100644 index 0000000..72e9603 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/credential.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/datetime.ico b/LuYao.Toolkit/Resources/SystemToolkit/datetime.ico new file mode 100644 index 0000000..ad4ac04 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/datetime.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/deskicon.ico b/LuYao.Toolkit/Resources/SystemToolkit/deskicon.ico new file mode 100644 index 0000000..d8243f8 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/deskicon.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/devmgr.ico b/LuYao.Toolkit/Resources/SystemToolkit/devmgr.ico new file mode 100644 index 0000000..8ce0037 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/devmgr.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/disks.ico b/LuYao.Toolkit/Resources/SystemToolkit/disks.ico new file mode 100644 index 0000000..ab34a8b Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/disks.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/env.ico b/LuYao.Toolkit/Resources/SystemToolkit/env.ico new file mode 100644 index 0000000..2669995 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/env.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/eventlog.ico b/LuYao.Toolkit/Resources/SystemToolkit/eventlog.ico new file mode 100644 index 0000000..41de01c Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/eventlog.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/firewall.ico b/LuYao.Toolkit/Resources/SystemToolkit/firewall.ico new file mode 100644 index 0000000..d1d9bf7 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/firewall.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/gpedit.ico b/LuYao.Toolkit/Resources/SystemToolkit/gpedit.ico new file mode 100644 index 0000000..36ff7c8 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/gpedit.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/hosts.ico b/LuYao.Toolkit/Resources/SystemToolkit/hosts.ico new file mode 100644 index 0000000..64fb6e9 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/hosts.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/ipv4.ico b/LuYao.Toolkit/Resources/SystemToolkit/ipv4.ico new file mode 100644 index 0000000..ec2dbdb Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/ipv4.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/ipv6.ico b/LuYao.Toolkit/Resources/SystemToolkit/ipv6.ico new file mode 100644 index 0000000..3f9584e Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/ipv6.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/killexplorer.ico b/LuYao.Toolkit/Resources/SystemToolkit/killexplorer.ico new file mode 100644 index 0000000..be59e3d Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/killexplorer.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/netconnections.ico b/LuYao.Toolkit/Resources/SystemToolkit/netconnections.ico new file mode 100644 index 0000000..5b3eb89 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/netconnections.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/pcname.ico b/LuYao.Toolkit/Resources/SystemToolkit/pcname.ico new file mode 100644 index 0000000..bbfe444 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/pcname.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/performance.ico b/LuYao.Toolkit/Resources/SystemToolkit/performance.ico new file mode 100644 index 0000000..e4e42dd Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/performance.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/perfsettings.ico b/LuYao.Toolkit/Resources/SystemToolkit/perfsettings.ico new file mode 100644 index 0000000..9dca631 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/perfsettings.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/powercfg.ico b/LuYao.Toolkit/Resources/SystemToolkit/powercfg.ico new file mode 100644 index 0000000..9919e3d Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/powercfg.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/poweroff.ico b/LuYao.Toolkit/Resources/SystemToolkit/poweroff.ico new file mode 100644 index 0000000..f606bb3 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/poweroff.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/powershell.ico b/LuYao.Toolkit/Resources/SystemToolkit/powershell.ico new file mode 100644 index 0000000..b188820 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/powershell.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/program.ico b/LuYao.Toolkit/Resources/SystemToolkit/program.ico new file mode 100644 index 0000000..84f3eda Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/program.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/proxy.ico b/LuYao.Toolkit/Resources/SystemToolkit/proxy.ico new file mode 100644 index 0000000..3459577 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/proxy.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/reboot.ico b/LuYao.Toolkit/Resources/SystemToolkit/reboot.ico new file mode 100644 index 0000000..8bc1670 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/reboot.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/recyclebin.png b/LuYao.Toolkit/Resources/SystemToolkit/recyclebin.png new file mode 100644 index 0000000..e633ffc Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/recyclebin.png differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/regedit.ico b/LuYao.Toolkit/Resources/SystemToolkit/regedit.ico new file mode 100644 index 0000000..d47a3f9 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/regedit.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/resetexplorer.ico b/LuYao.Toolkit/Resources/SystemToolkit/resetexplorer.ico new file mode 100644 index 0000000..d41628d Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/resetexplorer.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/resmon.ico b/LuYao.Toolkit/Resources/SystemToolkit/resmon.ico new file mode 100644 index 0000000..2764645 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/resmon.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/route.ico b/LuYao.Toolkit/Resources/SystemToolkit/route.ico new file mode 100644 index 0000000..260b5f8 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/route.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/secpolicy.ico b/LuYao.Toolkit/Resources/SystemToolkit/secpolicy.ico new file mode 100644 index 0000000..a5197c8 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/secpolicy.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/services.ico b/LuYao.Toolkit/Resources/SystemToolkit/services.ico new file mode 100644 index 0000000..090f687 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/services.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/share.ico b/LuYao.Toolkit/Resources/SystemToolkit/share.ico new file mode 100644 index 0000000..781efb2 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/share.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/systeminfo.ico b/LuYao.Toolkit/Resources/SystemToolkit/systeminfo.ico new file mode 100644 index 0000000..489d834 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/systeminfo.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/taskmgr.ico b/LuYao.Toolkit/Resources/SystemToolkit/taskmgr.ico new file mode 100644 index 0000000..dd14d13 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/taskmgr.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/tasksch.ico b/LuYao.Toolkit/Resources/SystemToolkit/tasksch.ico new file mode 100644 index 0000000..4d896c6 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/tasksch.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/uac.ico b/LuYao.Toolkit/Resources/SystemToolkit/uac.ico new file mode 100644 index 0000000..05867ae Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/uac.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/users.ico b/LuYao.Toolkit/Resources/SystemToolkit/users.ico new file mode 100644 index 0000000..2e330d3 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/users.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/version.ico b/LuYao.Toolkit/Resources/SystemToolkit/version.ico new file mode 100644 index 0000000..07f4955 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/version.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/wallpaper.ico b/LuYao.Toolkit/Resources/SystemToolkit/wallpaper.ico new file mode 100644 index 0000000..9819d73 Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/wallpaper.ico differ diff --git a/LuYao.Toolkit/Resources/SystemToolkit/wsl.ico b/LuYao.Toolkit/Resources/SystemToolkit/wsl.ico new file mode 100644 index 0000000..2a9206f Binary files /dev/null and b/LuYao.Toolkit/Resources/SystemToolkit/wsl.ico differ diff --git a/LuYao.Toolkit/Resources/Toolbox.png b/LuYao.Toolkit/Resources/Toolbox.png new file mode 100644 index 0000000..a3beab6 Binary files /dev/null and b/LuYao.Toolkit/Resources/Toolbox.png differ diff --git a/LuYao.Toolkit/Resources/Update.png b/LuYao.Toolkit/Resources/Update.png new file mode 100644 index 0000000..9e47351 Binary files /dev/null and b/LuYao.Toolkit/Resources/Update.png differ diff --git a/LuYao.Toolkit/Resources/find.png b/LuYao.Toolkit/Resources/find.png new file mode 100644 index 0000000..92669a5 Binary files /dev/null and b/LuYao.Toolkit/Resources/find.png differ diff --git a/LuYao.Toolkit/Services/IGrowlTokenProvider.cs b/LuYao.Toolkit/Services/IGrowlTokenProvider.cs new file mode 100644 index 0000000..d3fa229 --- /dev/null +++ b/LuYao.Toolkit/Services/IGrowlTokenProvider.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Services; + +public interface IGrowlTokenProvider +{ + string GrowlToken { get; } +} diff --git a/LuYao.Toolkit/Services/ServiceProvider.cs b/LuYao.Toolkit/Services/ServiceProvider.cs new file mode 100644 index 0000000..de2394a --- /dev/null +++ b/LuYao.Toolkit/Services/ServiceProvider.cs @@ -0,0 +1,128 @@ +using HandyControl.Controls; +using HandyControl.Data; +using HandyControl.Tools; +using LuYao.Toolkit.IO; +using System; +using System.IO; +using System.Net.Http; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; + +namespace LuYao.Toolkit.Services; + +internal class ServiceProvider : IServiceProvider +{ + public static HttpClient HttpClient { get; } = new HttpClient(); + private class OpenFileDialog : IOpenFileDialog + { + private Ookii.Dialogs.Wpf.VistaOpenFileDialog _dialog = new Ookii.Dialogs.Wpf.VistaOpenFileDialog { }; + + public string FileName { get => _dialog.FileName; set => _dialog.FileName = value; } + public string Title { get => _dialog.Title; set => _dialog.Title = value; } + public string Filter { get => _dialog.Filter; set => _dialog.Filter = value; } + public bool Multiselect { get => _dialog.Multiselect; set => _dialog.Multiselect = value; } + public string[] FileNames => _dialog.FileNames; + public bool ShowDialog() => _dialog.ShowDialog() == true; + } + private class SaveFileDialog : ISaveFileDialog + { + private Ookii.Dialogs.Wpf.VistaSaveFileDialog _dialog = new Ookii.Dialogs.Wpf.VistaSaveFileDialog { }; + + public string Title { get => _dialog.Title; set => _dialog.Title = value; } + public string InitialDirectory { get => _dialog.InitialDirectory; set => _dialog.InitialDirectory = value; } + public string Filter { get => _dialog.Filter; set => _dialog.Filter = value; } + public bool AddExtension { get => _dialog.AddExtension; set => _dialog.AddExtension = value; } + public string FileName { get => _dialog.FileName; set => _dialog.FileName = value; } + public string DefaultExt { get => _dialog.DefaultExt; set => _dialog.DefaultExt = value; } + + public bool ShowDialog() => _dialog.ShowDialog() == true; + } + public void CopyTextToClipboard(string text) + { + if (string.IsNullOrWhiteSpace(text)) return; + System.Windows.Clipboard.SetText(text); + NotifyQuickTip("复制成功"); + } + + public string GetClipboardText() + { + return System.Windows.Clipboard.GetText(); + } + public IOpenFileDialog CreateOpenFileDialog() => new OpenFileDialog(); + public ISaveFileDialog CreateSaveFileDialog() => new SaveFileDialog(); + + public void MessageBoxAlert(string message, string title) + { + MessageBox.Show(new MessageBoxInfo { Message = message, Caption = title, Button = System.Windows.MessageBoxButton.OK }); + } + + public bool MessageBoxConfirm(string message, string title) + { + return MessageBox.Show(new MessageBoxInfo { Message = message, Caption = "确认", Button = System.Windows.MessageBoxButton.YesNo }) == System.Windows.MessageBoxResult.Yes; + } + private string GetGrowlToken() + { + if (WindowHelper.GetActiveWindow() is IGrowlTokenProvider provider) return provider.GrowlToken; + return nameof(MainWindow); + } + + public void NotifyClear() => Growl.Clear(GetGrowlToken()); + + public void NotifyFail(string msg) => Growl.Fatal(msg, GetGrowlToken()); + + public void NotifyInfo(string msg) => Growl.Info(msg, GetGrowlToken()); + + public void NotifyQuickTip(string msg) => Growl.Success(new GrowlInfo { Token = GetGrowlToken(), Message = msg, WaitTime = 1 }); + + public void NotifySuccess(string msg) => Growl.Success(msg, GetGrowlToken()); + + public void NotifyWarning(string msg) => Growl.Warning(msg, GetGrowlToken()); + + public void Tongji(string url) + { + TongjiServiceProvider.Tongji(url); + } + + public string GetClipboardImage() + { + if (System.Windows.Clipboard.ContainsImage()) + { + var img = System.Windows.Clipboard.GetImage(); + BitmapEncoder encoder = new PngBitmapEncoder(); + encoder.Frames.Add(BitmapFrame.Create(img)); + var tmp = TempHelper.GetTempFileName(); + using (var fs = File.OpenWrite(tmp)) encoder.Save(fs); + return tmp; + } + return string.Empty; + } + + private static string GetHash(string input) + { + var bytes = Encoding.UTF8.GetBytes(input); + using (var sha1 = SHA1.Create()) bytes = sha1.ComputeHash(bytes); + return BitConverter.ToString(bytes).Replace("-", string.Empty).ToLower(); + } + + [DllImport("winmm.dll")] + public static extern uint mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hWndCallback); + + public async Task PlaySound(string url) + { + var dir = Path.Combine(TempHelper.Root, "Sounds"); + if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); + var fn = Path.Combine(dir, GetHash(url) + ".mp3"); + if (!File.Exists(fn)) + { + using var ms = await HttpClient.GetStreamAsync(url); + using var fs = File.OpenWrite(fn); + await ms.CopyToAsync(fs); + } + mciSendString(@"close temp_alias", null, 0, IntPtr.Zero); + mciSendString($@"open ""{fn}"" alias temp_alias", null, 0, IntPtr.Zero); + mciSendString("play temp_alias", null, 0, IntPtr.Zero); + } +} diff --git a/LuYao.Toolkit/Services/TongjiServiceProvider.cs b/LuYao.Toolkit/Services/TongjiServiceProvider.cs new file mode 100644 index 0000000..8ffed90 --- /dev/null +++ b/LuYao.Toolkit/Services/TongjiServiceProvider.cs @@ -0,0 +1,172 @@ +using NewLife.Reflection; +using NewLife.Xml; +using Newtonsoft.Json; +using System; +using System.Linq; +using System.Net.Http; +using System.Net; +using System.Windows.Forms; +using System.Collections.Generic; + +namespace LuYao.Toolkit.Services; + +public static class TongjiServiceProvider +{ + public class TongjiConfig : XmlConfig + { + public int LastVisitTime { get; set; } + public string Detail { get; set; } + public CookieContainer GetCookie() + { + if (string.IsNullOrWhiteSpace(Detail)) return new CookieContainer(); + var cookie = new CookieContainer(); + var collection = new CookieCollection(); + var list = JsonConvert.DeserializeObject(this.Detail); + foreach (var item in list) + { + collection.Add(item.ToCookie()); + } + cookie.Add(collection); + return cookie; + } + public void SetCookie(CookieContainer cookie) + { + if (cookie == null) throw new ArgumentNullException(nameof(cookie)); + var collection = cookie.GetAllCookies(); + var json = JsonConvert.SerializeObject(collection.Select(i => new CookieInfo(i))); + this.Detail = json; + } + } + private static CookieContainer Cookie { get; } + static TongjiServiceProvider() + { + Cookie = TongjiConfig.Current.GetCookie(); + HttpClient = new HttpClient(new HttpClientHandler + { + UseCookies = true, + CookieContainer = Cookie + }, true); + HttpClient.DefaultRequestHeaders.UserAgent.ParseAdd(GetUserAgent()); + HttpClient.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); + HttpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("zh-CN,zh;q=0.9,en;q=0.8,fr;q=0.7,pt;q=0.6,so;q=0.5,de;q=0.4,en-US;q=0.3,ko;q=0.2,ja;q=0.1,zh-TW;q=0.1,und;q=0.1,is;q=0.1"); + +#if DEBUG + _fail = int.MaxValue; +#endif + } + public class CookieInfo + { + public CookieInfo() { } + public CookieInfo(Cookie cookie) + { + this.Name = cookie.Name; + this.Value = cookie.Value; + this.Path = cookie.Path; + this.Domain = cookie.Domain; + } + public string Name { get; set; } + public string Value { get; set; } + public string Path { get; set; } + public string Domain { get; set; } + public Cookie ToCookie() => new Cookie(this.Name, this.Value, this.Path, this.Domain); + } + private static void SaveCookie() + { + var cfg = TongjiConfig.Current; + cfg.SetCookie(Cookie); + cfg.SaveAsync(); + } + private static int _fail = 0; + private static int _lastPageVisitTime = 0; + private static HttpClient HttpClient { get; } + private static string GetUserAgent() => $"Mozilla/5.0 (Windows NT {Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{AssemblyX.Entry.Version} Safari/537.36"; + private static string _prev = string.Empty; + + public static async void Tongji(string func) + { + if (_fail >= 10) return; + var link = $"https://luyao.coderbusy.com/app/{func}"; + if (link == _prev) return; + int currentPageVisitTime = GetSecondsSinceEpoch(DateTime.Now); + int lastPageVisitTime = _lastPageVisitTime; + var info = new Info(); + var cfg = TongjiConfig.Current; + if (cfg.LastVisitTime > 0) info.LastVisitTime = cfg.LastVisitTime; + cfg.LastVisitTime = currentPageVisitTime; + _lastPageVisitTime = currentPageVisitTime; + info.SourceType = GetSourceType(currentPageVisitTime, lastPageVisitTime); + info.IsNewVisit = (info.SourceType == 4) ? 0 : 1; + info.Data["u"] = link; + if (!string.IsNullOrWhiteSpace(_prev)) info.Data["su"] = _prev; + _prev = link; + var screen = Screen.PrimaryScreen; + info.Data["ds"] = $"{screen.Bounds.Width}x{screen.Bounds.Height}"; + info.Data["cl"] = $"{screen.BitsPerPixel}-bit"; + var target = $"http://hm.baidu.com/hm.gif?{info.ToQueryString()}"; + try + { + using (var request = new HttpRequestMessage(HttpMethod.Get, target)) + { + request.Headers.Referrer = new Uri(link); + using (var response = await HttpClient.SendAsync(request)) + { + if (response.IsSuccessStatusCode) + { + using var _ = await response.Content.ReadAsStreamAsync(); + SaveCookie(); + } + } + } + _fail = 0; + } + catch (Exception) + { + System.Threading.Interlocked.Increment(ref _fail); + } + } + #region MyRegion + + private const string Version = "wap-1-0.1"; + private const int VisitDuration = 1800; + private static String GetRandomNumber() + { + Random RandomClass = new Random(); + return RandomClass.Next(0x7fffffff).ToString(); + } + + private static int GetSecondsSinceEpoch(DateTime time) + { + return (int)(time - new DateTime(1970, 1, 1).ToLocalTime()).TotalSeconds; + } + + private static int GetSourceType(int currentPageVisitTime, int lastPageVisitTime) + { + if (currentPageVisitTime - lastPageVisitTime > VisitDuration) + { + return 1; + } + else + { + return 4; + } + } + private class Info + { + public int? LastVisitTime { get; set; } + public int SourceType { get; set; } + public int IsNewVisit { get; set; } + public SortedDictionary Data { get; } = new SortedDictionary(); + public string ToQueryString() + { + var nv = System.Web.HttpUtility.ParseQueryString("si=0d558ebb1f987e8cd4ce83298458d9c6&et=0"); + nv["nv"] = this.IsNewVisit.ToString(); + nv["st"] = this.SourceType.ToString(); + nv["v"] = Version; + nv["rnd"] = GetRandomNumber(); + if (LastVisitTime != null) nv["lt"] = LastVisitTime.ToString(); + foreach (var item in Data) nv[item.Key] = item.Value; + return nv.ToString(); + } + } + #endregion +} diff --git a/LuYao.Toolkit/Tabs/Explorer/Index.xaml b/LuYao.Toolkit/Tabs/Explorer/Index.xaml new file mode 100644 index 0000000..cc6034e --- /dev/null +++ b/LuYao.Toolkit/Tabs/Explorer/Index.xaml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Tabs/Explorer/Index.xaml.cs b/LuYao.Toolkit/Tabs/Explorer/Index.xaml.cs new file mode 100644 index 0000000..53eb85f --- /dev/null +++ b/LuYao.Toolkit/Tabs/Explorer/Index.xaml.cs @@ -0,0 +1,17 @@ +using LuYao.Toolkit.Views; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Tabs.Explorer +{ + /// + /// Index.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Tabs.Explorer.Index)] + public partial class Index : UserControl + { + public Index() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Tabs/Navs/Index.xaml b/LuYao.Toolkit/Tabs/Navs/Index.xaml new file mode 100644 index 0000000..476af27 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Navs/Index.xaml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Tabs/Navs/Index.xaml.cs b/LuYao.Toolkit/Tabs/Navs/Index.xaml.cs new file mode 100644 index 0000000..fa0b99d --- /dev/null +++ b/LuYao.Toolkit/Tabs/Navs/Index.xaml.cs @@ -0,0 +1,30 @@ +using LuYao.Toolkit.Views; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Tabs.Navs +{ + /// + /// Index.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Tabs.Navs.Index)] + public partial class Index : UserControl + { + public Index() + { + InitializeComponent(); + } + } +} diff --git a/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItem.cs b/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItem.cs new file mode 100644 index 0000000..aea6b07 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItem.cs @@ -0,0 +1,53 @@ +using LuYao.Toolkit.Rdm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Forms.Integration; +using System.Windows.Media; + +namespace LuYao.Toolkit.Tabs.Rdp.Controls; + +public class RdpTabItem : HandyControl.Controls.TabItem +{ + public RdpTabItem(Guid id, IRdpConnection connection) + { + this.Id = id; + this.Connection = connection ?? throw new ArgumentNullException(nameof(connection)); + _session = new RdpSession() { RdpConnection = connection }; + this.Header = new RdpTabItemHeader(connection, _session); + this.Content = new WindowsFormsHost + { + Child = _session, + Margin = new Thickness(0), + Padding = new Thickness(0), + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Stretch, + }; + this.Closed += RdpTabItem_Closed; + } + + private void RdpTabItem_Closed(object sender, EventArgs e) + { + if (_session == null) return; + this.Dispatcher.BeginInvoke(() => + { + this._session.Release(); + }); + } + + private RdpSession _session; + public Guid Id { get; } + public IRdpConnection Connection { get; } + public void Connect() + { + this._session.Connect(); + } + public void Disconnect() + { + this._session.Disconnect(); + } +} diff --git a/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItemHeader.cs b/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItemHeader.cs new file mode 100644 index 0000000..0928f96 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Rdp/Controls/RdpTabItemHeader.cs @@ -0,0 +1,91 @@ +using CommunityToolkit.Mvvm.Input; +using HandyControl.Controls; +using HandyControl.Interactivity; +using LuYao.Toolkit.Rdm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Tabs.Rdp.Controls +{ + /// + /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。 + /// + /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。 + /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 + /// 元素中: + /// + /// xmlns:MyNamespace="clr-namespace:LuYao.Toolkit.Tabs.Rdo.Controls" + /// + /// + /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。 + /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根 + /// 元素中: + /// + /// xmlns:MyNamespace="clr-namespace:LuYao.Toolkit.Tabs.Rdo.Controls;assembly=LuYao.Toolkit.Tabs.Rdo.Controls" + /// + /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用, + /// 并重新生成以避免编译错误: + /// + /// 在解决方案资源管理器中右击目标项目,然后依次单击 + /// “添加引用”->“项目”->[浏览查找并选择此项目] + /// + /// + /// 步骤 2) + /// 继续操作并在 XAML 文件中使用控件。 + /// + /// + /// + /// + public class RdpTabItemHeader : Control + { + static RdpTabItemHeader() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(RdpTabItemHeader), new FrameworkPropertyMetadata(typeof(RdpTabItemHeader))); + } + public RdpTabItemHeader(IRdpConnection connection, RdpSession session) + { + this.Connection = connection; + this.RdpSession = session; + this.RdpSession.StatusChanged += RdpSession_StatusChanged; + this.ConnectCommand = new RelayCommand(this.Connect); + this.DisconnectCommand = new RelayCommand(this.Disconnect); + } + + private void RdpSession_StatusChanged(object sender, StatusChangedEventArgs e) + { + this.Status = e.Status; + } + public IRdpConnection Connection { get; } + public RdpSession RdpSession { get; } + public RdpConnectStatus Status + { + get { return (RdpConnectStatus)GetValue(StatusProperty); } + set { SetValue(StatusProperty, value); } + } + + // Using a DependencyProperty as the backing store for Status. This enables animation, styling, binding, etc... + public static readonly DependencyProperty StatusProperty = DependencyProperty.Register("Status", typeof(RdpConnectStatus), typeof(RdpTabItemHeader), new PropertyMetadata(RdpConnectStatus.Pending)); + public ICommand ConnectCommand { get; } + public ICommand DisconnectCommand { get; } + private void Connect() + { + this.RdpSession.Connect(); + } + private void Disconnect() + { + this.RdpSession.Disconnect(); + } + } +} diff --git a/LuYao.Toolkit/Tabs/Rdp/Index.xaml b/LuYao.Toolkit/Tabs/Rdp/Index.xaml new file mode 100644 index 0000000..37c9d03 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Rdp/Index.xaml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/LuYao.Toolkit/Tabs/Rdp/Index.xaml.cs b/LuYao.Toolkit/Tabs/Rdp/Index.xaml.cs new file mode 100644 index 0000000..9ca4c2c --- /dev/null +++ b/LuYao.Toolkit/Tabs/Rdp/Index.xaml.cs @@ -0,0 +1,50 @@ +using LuYao.Toolkit.Rdm; +using LuYao.Toolkit.Rdm.Events; +using LuYao.Toolkit.Tabs.Rdp.Controls; +using LuYao.Toolkit.Views; +using Prism.Events; +using Prism.Services.Dialogs; +using System; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Tabs.Rdp +{ + /// + /// Index.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Tabs.Rdp.Index)] + public partial class Index : UserControl + { + public Index() + { + InitializeComponent(); + OpenRdpConnection += Index_OpenRdpConnection; + } + + private void Index_OpenRdpConnection(object sender, Guid id) + { + foreach (RdpTabItem item in SessionTabControl.Items) + { + if (item.Id == id) + { + this.SessionTabControl.SelectedItem = item; + return; + } + } + var e = Entities.RdpConnection.FindById(id); + if (e == null) return; + var rdp = new RdpConnection(e); + var tab = new RdpTabItem(id, rdp); + this.SessionTabControl.Items.Add(tab); + this.SessionTabControl.SelectedItem = tab; + tab.Connect(); + } + + private static event EventHandler OpenRdpConnection; + public static void Open(Guid id) + { + if (OpenRdpConnection == null) return; + OpenRdpConnection.Invoke(null, id); + } + } +} diff --git a/LuYao.Toolkit/Tabs/Session/Index.xaml b/LuYao.Toolkit/Tabs/Session/Index.xaml new file mode 100644 index 0000000..75b3090 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Session/Index.xaml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Tabs/Session/Index.xaml.cs b/LuYao.Toolkit/Tabs/Session/Index.xaml.cs new file mode 100644 index 0000000..e837f42 --- /dev/null +++ b/LuYao.Toolkit/Tabs/Session/Index.xaml.cs @@ -0,0 +1,86 @@ +using LuYao.Toolkit.Events; +using LuYao.Toolkit.Views; +using Prism.Events; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Windows.Controls; + +namespace LuYao.Toolkit.Tabs.Session +{ + /// + /// Index.xaml 的交互逻辑 + /// + [ViewName(ViewNames.Tabs.Session.Index)] + public partial class Index : UserControl + { + private IEventAggregator _eventAggregator; + private IRegionManager _regionManager; + private IDialogService _dialogService; + public Index(IEventAggregator eventAggregator, IRegionManager regionManager, IDialogService dialogService) + { + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + _regionManager = regionManager; + _dialogService = dialogService; + InitializeComponent(); + _eventAggregator.GetEvent().Subscribe(this.OnOpenFunctionItem); + } + + private void OnOpenFunctionItem(OpenFunctionItemEventPayload item) + { + if (item.IsMultiboxing) + { + //不支持多开 + if (item.Item.Multiboxing == false) return; + var p = new DialogParameters { }; + p.Add("Function", item.Item); + _dialogService.Show(nameof(Dialogs.MultiboxingDialog), p, (result) => { }, nameof(Dialogs.MultiboxingDialogWindow)); + return; + } + this.txtTitle.Text = item.Item.Title; + if (item.IsNewSession == false) + { + if (_regionManager.Regions.ContainsRegionWithName(Regions.RegionNames.WorkingRegion)) + { + _regionManager.RequestNavigate(Regions.RegionNames.WorkingRegion, item.Item.View); + } + else + { + _regionManager.RegisterViewWithRegion(Regions.RegionNames.WorkingRegion, item.Item.View); + } + } + } + + private void txtKeyword_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) + { + switch (e.Key) + { + case System.Windows.Input.Key.Up: + Move(-1); + break; + case System.Windows.Input.Key.Down: + Move(1); + break; + default: + if (this.lbSuggestions.Items.Count > 0 && this.lbSuggestions.SelectedIndex < 0) this.lbSuggestions.SelectedIndex = 0; + break; + } + } + private void Move(int i) + { + if (this.lbSuggestions.Visibility != System.Windows.Visibility.Visible) return; + var count = this.lbSuggestions.Items.Count; + var idx = this.lbSuggestions.SelectedIndex; + switch (i) + { + case 1: + idx++; + break; + case -1: + idx--; + break; + } + if (idx >= 0 && idx < count) this.lbSuggestions.SelectedIndex = idx; + } + } +} diff --git a/LuYao.Toolkit/Themes/Basic/Converters.xaml b/LuYao.Toolkit/Themes/Basic/Converters.xaml new file mode 100644 index 0000000..d4ab192 --- /dev/null +++ b/LuYao.Toolkit/Themes/Basic/Converters.xaml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Basic/Geometries.xaml b/LuYao.Toolkit/Themes/Basic/Geometries.xaml new file mode 100644 index 0000000..d235a9f --- /dev/null +++ b/LuYao.Toolkit/Themes/Basic/Geometries.xaml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Basic/MaterialToGeometry.linq b/LuYao.Toolkit/Themes/Basic/MaterialToGeometry.linq new file mode 100644 index 0000000..217b8b8 --- /dev/null +++ b/LuYao.Toolkit/Themes/Basic/MaterialToGeometry.linq @@ -0,0 +1,19 @@ + + MahApps.Metro.IconPacks.Material + MahApps.Metro.IconPacks.Converter + System.Windows.Data + MahApps.Metro.IconPacks + System.Windows.Media + System.Globalization + + +var idx = PackIconMaterialDataFactory.DataIndex.Value!; +var names = Enum.GetNames(typeof(PackIconMaterialKind)); +foreach (var n in names) +{ + var kind = (PackIconMaterialKind)Enum.Parse(typeof(PackIconMaterialKind), n); + if (idx.TryGetValue(kind, out var path)) + { + Console.WriteLine("{1}", n, path); + } +} \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/DataGrid.xaml b/LuYao.Toolkit/Themes/Controls/DataGrid.xaml new file mode 100644 index 0000000..aed705e --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/DataGrid.xaml @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/FormItemContainer.xaml b/LuYao.Toolkit/Themes/Controls/FormItemContainer.xaml new file mode 100644 index 0000000..919a1c5 --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/FormItemContainer.xaml @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/MasterDetailLayout.xaml b/LuYao.Toolkit/Themes/Controls/MasterDetailLayout.xaml new file mode 100644 index 0000000..5773bc3 --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/MasterDetailLayout.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/RdpTabItemHeader.xaml b/LuYao.Toolkit/Themes/Controls/RdpTabItemHeader.xaml new file mode 100644 index 0000000..7d70033 --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/RdpTabItemHeader.xaml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/TextBlockWithIconBox.xaml b/LuYao.Toolkit/Themes/Controls/TextBlockWithIconBox.xaml new file mode 100644 index 0000000..efb2a07 --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/TextBlockWithIconBox.xaml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/TextEditor.xaml b/LuYao.Toolkit/Themes/Controls/TextEditor.xaml new file mode 100644 index 0000000..a6f5e67 --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/TextEditor.xaml @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Controls/Window.xaml b/LuYao.Toolkit/Themes/Controls/Window.xaml new file mode 100644 index 0000000..08f859f --- /dev/null +++ b/LuYao.Toolkit/Themes/Controls/Window.xaml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Generic.txt b/LuYao.Toolkit/Themes/Generic.txt new file mode 100644 index 0000000..c34f5bb --- /dev/null +++ b/LuYao.Toolkit/Themes/Generic.txt @@ -0,0 +1,10 @@ +Basic\Converters.xaml +Basic\Geometries.xaml +# -------------------------------------- +Controls\DataGrid.xaml +Controls\FormItemContainer.xaml +Controls\RdpTabItemHeader.xaml +Controls\TextEditor.xaml +Controls\Window.xaml +Controls\TextBlockWithIconBox.xaml +Controls\MasterDetailLayout.xaml \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Generic.xaml b/LuYao.Toolkit/Themes/Generic.xaml new file mode 100644 index 0000000..8a76d65 --- /dev/null +++ b/LuYao.Toolkit/Themes/Generic.xaml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/SkinDark.xaml b/LuYao.Toolkit/Themes/SkinDark.xaml new file mode 100644 index 0000000..f578617 --- /dev/null +++ b/LuYao.Toolkit/Themes/SkinDark.xaml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/SkinDefault.xaml b/LuYao.Toolkit/Themes/SkinDefault.xaml new file mode 100644 index 0000000..ffa4d8e --- /dev/null +++ b/LuYao.Toolkit/Themes/SkinDefault.xaml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/Theme.xaml b/LuYao.Toolkit/Themes/Theme.xaml new file mode 100644 index 0000000..40329be --- /dev/null +++ b/LuYao.Toolkit/Themes/Theme.xaml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/LuYao.Toolkit/Themes/ThemeManager.cs b/LuYao.Toolkit/Themes/ThemeManager.cs new file mode 100644 index 0000000..9b91d50 --- /dev/null +++ b/LuYao.Toolkit/Themes/ThemeManager.cs @@ -0,0 +1,52 @@ +using HandyControl.Data; +using HandyControl.Tools; +using LuYao.Toolkit.Behaviors; +using System; +using System.Windows; + +namespace LuYao.Toolkit.Themes; + +internal class ThemeManager +{ + public static readonly ThemeManager Current = new ThemeManager(); + public static event EventHandler ThemeChanged; + private static void OnThemeChanged(object sender,ThemeMode theme) + { + ThemeChanged?.Invoke(sender, theme); + } + private ThemeMode _theme = ThemeMode.Light; + public ThemeMode Theme + { + get { return _theme; } + set + { + if (_theme == value) return; + _theme = value; + SkinType skin = SkinType.Default; + switch (_theme) + { + case ThemeMode.Light: skin = SkinType.Default; break; + case ThemeMode.Dark: skin = SkinType.Dark; break; + } + var dics = Application.Current.Resources.MergedDictionaries; + var skins0 = dics[0]; + skins0.MergedDictionaries.Clear(); + skins0.MergedDictionaries.Add(ResourceHelper.GetSkin(skin)); + skins0.MergedDictionaries.Add(ResourceHelper.GetSkin(typeof(App).Assembly, "Themes", skin)); + + var skins1 = dics[1]; + skins1.MergedDictionaries.Clear(); + skins1.MergedDictionaries.Add(new ResourceDictionary + { + Source = new Uri("pack://application:,,,/HandyControl;component/Themes/Theme.xaml") + }); + skins1.MergedDictionaries.Add(new ResourceDictionary + { + Source = new Uri("pack://application:,,,/LuYao.Toolkit;component/Themes/Theme.xaml") + }); + + foreach (Window win in Application.Current.Windows) win.OnApplyTemplate(); + OnThemeChanged(this, _theme); + } + } +} diff --git a/LuYao.Toolkit/Themes/XamlCombine.exe b/LuYao.Toolkit/Themes/XamlCombine.exe new file mode 100644 index 0000000..af458ff Binary files /dev/null and b/LuYao.Toolkit/Themes/XamlCombine.exe differ diff --git a/LuYao.Toolkit/ToolkitConfig.cs b/LuYao.Toolkit/ToolkitConfig.cs new file mode 100644 index 0000000..da4f1e5 --- /dev/null +++ b/LuYao.Toolkit/ToolkitConfig.cs @@ -0,0 +1,21 @@ +using LuYao.Toolkit.Themes; +using NewLife.Xml; +using System; + +namespace LuYao.Toolkit; + +public class ToolkitConfig : XmlConfig +{ + public ThemeMode Theme { get; set; } = ThemeMode.Light; + public bool CheckForUpdatesOnStartup { get; set; } = true; + public bool CodeEditorShowLineNumbers { get; set; } = true; + public bool CodeEditorWordWrap { get; set; } = false; + + public override void Save() + { + base.Save(); + Saved?.Invoke(null, EventArgs.Empty); + } + + public static event EventHandler Saved; +} diff --git a/LuYao.Toolkit/Update/FindNewVersionDialog.xaml b/LuYao.Toolkit/Update/FindNewVersionDialog.xaml new file mode 100644 index 0000000..d3d635d --- /dev/null +++ b/LuYao.Toolkit/Update/FindNewVersionDialog.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Update/FindNewVersionDialog.xaml.cs b/LuYao.Toolkit/Update/FindNewVersionDialog.xaml.cs new file mode 100644 index 0000000..dd459e0 --- /dev/null +++ b/LuYao.Toolkit/Update/FindNewVersionDialog.xaml.cs @@ -0,0 +1,34 @@ +using HandyControl.Tools; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Update; + +/// +/// FindNewVersionDialog.xaml 的交互逻辑 +/// +public partial class FindNewVersionDialog : UserControl +{ + public FindNewVersionDialog() + { + InitializeComponent(); + this.Loaded += FindNewVersionDialog_Loaded; + } + + private void FindNewVersionDialog_Loaded(object sender, RoutedEventArgs e) + { + Window.GetWindow(this).Topmost = true; + } +} diff --git a/LuYao.Toolkit/Update/FindNewVersionDialogViewModel.cs b/LuYao.Toolkit/Update/FindNewVersionDialogViewModel.cs new file mode 100644 index 0000000..86fd097 --- /dev/null +++ b/LuYao.Toolkit/Update/FindNewVersionDialogViewModel.cs @@ -0,0 +1,49 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.IO.Updating; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Update; + +public partial class FindNewVersionDialogViewModel : ViewModelBase, IDialogAware +{ + public string Title => "发现新版本"; + + public event Action RequestClose; + protected virtual void OnRequestClose(IDialogResult obj) + { + RequestClose?.Invoke(obj); + } + + public bool CanCloseDialog() => true; + + public void OnDialogClosed() + { + } + + public void OnDialogOpened(IDialogParameters parameters) + { + var pkg = parameters.GetValue("UpdatePackage"); + this.Description = pkg.Description; + } + + [ObservableProperty] + private string _description; + + [RelayCommand] + private void Update() + { + OnRequestClose(new DialogResult(ButtonResult.Yes)); + } + + [RelayCommand] + private void Ignore() + { + OnRequestClose(new DialogResult(ButtonResult.Ignore)); + } +} diff --git a/LuYao.Toolkit/Update/Update.xaml b/LuYao.Toolkit/Update/Update.xaml new file mode 100644 index 0000000..7008665 --- /dev/null +++ b/LuYao.Toolkit/Update/Update.xaml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/LuYao.Toolkit/Update/Update.xaml.cs b/LuYao.Toolkit/Update/Update.xaml.cs new file mode 100644 index 0000000..0257ae0 --- /dev/null +++ b/LuYao.Toolkit/Update/Update.xaml.cs @@ -0,0 +1,29 @@ +using LuYao.IO.Updating; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace LuYao.Toolkit.Update; + +/// +/// Update.xaml 的交互逻辑 +/// +public partial class Update : UserControl +{ + public Update(UpdatePackage package) + { + InitializeComponent(); + this.DataContext = new UpdateViewModel(package); + } +} diff --git a/LuYao.Toolkit/Update/UpdateViewModel.cs b/LuYao.Toolkit/Update/UpdateViewModel.cs new file mode 100644 index 0000000..e328c32 --- /dev/null +++ b/LuYao.Toolkit/Update/UpdateViewModel.cs @@ -0,0 +1,195 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using LuYao.IO.Updating; +using LuYao.Toolkit.IO; +using LuYao.Toolkit.Services; +using NewLife.Log; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace LuYao.Toolkit.Update; + +public partial class UpdateViewModel : ViewModelBase +{ + [INotifyPropertyChanged] + public partial class UpdateLog + { + [ObservableProperty] + private string _message; + } + public class ReplaceTask + { + public string Source { get; set; } + public string Target { get; set; } + } + public UpdateViewModel(UpdatePackage package) + { + this.Package = package ?? throw new ArgumentNullException(nameof(package)); + this.Execute(); + } + private async void Execute() + { + try + { + await UpdateAsync(); + this.Status = UpdateStatus.Success; + } + catch (Exception e) + { + XTrace.WriteLine("更新失败"); + XTrace.WriteException(e); + this.Status = UpdateStatus.Fail; + NotifyService.Fail(e); + } + } + public UpdatePackage Package { get; } + public ObservableCollection Logs { get; } = new ObservableCollection(); + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(RestartCommand))] + private UpdateStatus _status; + + [ObservableProperty] + private long _total; + + [ObservableProperty] + private long _current; + + private Queue _replaceTasks; + + private bool CanRestart => this.Status == UpdateStatus.Success; + + [RelayCommand(CanExecute = nameof(CanRestart))] + private void Restart() + { + if (_replaceTasks != null) + { + var log = new UpdateLog { Message = "替换文件" }; + Logs.Add(log); + while (_replaceTasks.Count > 0) + { + var task = _replaceTasks.Dequeue(); + if (string.IsNullOrWhiteSpace(task.Target)) continue; + var dir = Path.GetDirectoryName(task.Target); + var name = Path.GetFileName(task.Target); + log.Message = $"替换文件:{name}"; + if (!string.IsNullOrWhiteSpace(dir) && !Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + if (File.Exists(task.Target)) + { + var del = task.Target + ".del"; + if (File.Exists(del)) File.Delete(del); + File.Move(task.Target, del); + } + + File.Copy(task.Source, task.Target, true); + } + } + + System.Windows.Forms.Application.Restart(); + System.Windows.Application.Current.Shutdown(); + } + private async Task UpdateAsync() + { + Status = UpdateStatus.Checking; + Logs.Clear(); + var replace = new Queue(); + var checkLog = new UpdateLog { Message = "文件对比..." }; + Logs.Add(checkLog); + var root = AppDomain.CurrentDomain.BaseDirectory; + var queue = new Queue(); + await CheckFiles(checkLog, root, queue); + + checkLog.Message = $"对比完毕,待更新:{queue.Count}"; + + Status = UpdateStatus.Updating; + this.Total = queue.Count > 0 ? queue.Sum(i => i.FileSize) : 0; + this.Current = 0; + using var http = new HttpClient(); + while (queue.Count > 0) + { + var file = queue.Dequeue(); + var fileLog = new UpdateLog { Message = $"处理文件:{file.FilePath}" }; + Logs.Add(fileLog); + await Task.Delay(100); + var url = (string.IsNullOrWhiteSpace(Package.BaseUrl) ? UpdateConfig.Endpoint : Package.BaseUrl) + "/" + file.Url; + var tmp = TempHelper.GetTempFileName(file.FileHash + ".tmp"); + if (!File.Exists(tmp) || await UpdatePackageHelper.Hash(tmp) != file.FileHash) + { + fileLog.Message = $"下载文件:{file.FilePath}"; + using (var ms = await http.GetStreamAsync(url)) + { + using (var gzip = new GZipStream(ms, CompressionMode.Decompress)) + { + using (var fs = File.OpenWrite(tmp)) + { + fs.SetLength(0); + var buffer = new byte[4096]; + int read; + while ((read = await gzip.ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await fs.WriteAsync(buffer, 0, read); + Current += read; + } + } + } + } + } + else + { + Current += file.FileSize; + } + fileLog.Message = $"下载完毕:{file.FilePath}"; + replace.Enqueue(new ReplaceTask + { + Source = tmp, + Target = Path.Combine(root, file.FilePath) + }); + } + Logs.Add(new UpdateLog { Message = "更新下载完毕" }); + _replaceTasks = replace; + } + + private async Task CheckFiles(UpdateLog checkLog, string root, Queue queue) + { + foreach (var file in Package.UpdateFilePackages) + { + checkLog.Message = $"对比文件:{file.FilePath}"; + var fileName = Path.Combine(root, file.FilePath); + var fileInfo = new FileInfo(fileName); + if (!fileInfo.Exists) + { + queue.Enqueue(file); + } + else if (fileInfo.Length != file.FileSize) + { + queue.Enqueue(file); + } + else if (!string.IsNullOrWhiteSpace(file.FileVersion)) + { + //文件版本相同的情况下,就不用对比哈希值了。 + var version = FileVersionInfo.GetVersionInfo(fileName); + if (version.FileVersion != file.FileVersion) + { + queue.Enqueue(file); + } + } + else if (file.FileHash != await UpdatePackageHelper.Hash(fileName)) + { + queue.Enqueue(file); + } + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..9cf8479 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# LuYao.Toolkit diff --git a/common.props b/common.props new file mode 100644 index 0000000..daa6e89 --- /dev/null +++ b/common.props @@ -0,0 +1,5 @@ + + + 4.3.15.57 + + \ No newline at end of file diff --git a/delete-bin-obj-folders.bat b/delete-bin-obj-folders.bat new file mode 100644 index 0000000..af6cf6f --- /dev/null +++ b/delete-bin-obj-folders.bat @@ -0,0 +1,20 @@ +@ECHO off +cls + +ECHO Deleting all BIN and OBJ folders... +ECHO. + +FOR /d /r . %%d in (bin,obj) DO ( + IF EXIST "%%d" ( + ECHO %%d | FIND /I "\node_modules\" > Nul && ( + ECHO.Skipping: %%d + ) || ( + ECHO.Deleting: %%d + rd /s/q "%%d" + ) + ) +) + +ECHO. +ECHO.BIN and OBJ folders have been successfully deleted. Press any key to exit. +pause > nul \ No newline at end of file diff --git a/libs/AxInterop.MSTSCLib.dll b/libs/AxInterop.MSTSCLib.dll new file mode 100644 index 0000000..2137f2c Binary files /dev/null and b/libs/AxInterop.MSTSCLib.dll differ diff --git a/libs/Interop.MSTSCLib.dll b/libs/Interop.MSTSCLib.dll new file mode 100644 index 0000000..cfd07a4 Binary files /dev/null and b/libs/Interop.MSTSCLib.dll differ diff --git a/libs/LuYao.Common.deps.json b/libs/LuYao.Common.deps.json new file mode 100644 index 0000000..ed843b9 --- /dev/null +++ b/libs/LuYao.Common.deps.json @@ -0,0 +1,47 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v7.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v7.0": { + "LuYao.Common/1.1.14": { + "dependencies": { + "ConfigureAwait.Fody": "3.3.2", + "Fody": "6.6.4" + }, + "runtime": { + "LuYao.Common.dll": {} + } + }, + "ConfigureAwait.Fody/3.3.2": { + "dependencies": { + "Fody": "6.6.4" + } + }, + "Fody/6.6.4": {} + } + }, + "libraries": { + "LuYao.Common/1.1.14": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "ConfigureAwait.Fody/3.3.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vzGcpFU7uY4SbdB1Q68sFqv52HU5V1l39bF1rw6BIb7Os/DRLZa5ObV1yf/CNuTXj8IZjqJQ7PnTzSUiI/W49A==", + "path": "configureawait.fody/3.3.2", + "hashPath": "configureawait.fody.3.3.2.nupkg.sha512" + }, + "Fody/6.6.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vLZS+oa+ndUHYPlx/8n9bBTT3dHkCF0riml4paKq4D663+cZd47x1uagQo32D/gKFZ/sfmV1oqKaLmH0elxq4A==", + "path": "fody/6.6.4", + "hashPath": "fody.6.6.4.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/libs/LuYao.Common.dll b/libs/LuYao.Common.dll new file mode 100644 index 0000000..fb1f1be Binary files /dev/null and b/libs/LuYao.Common.dll differ diff --git a/libs/LuYao.Common.pdb b/libs/LuYao.Common.pdb new file mode 100644 index 0000000..55af2d8 Binary files /dev/null and b/libs/LuYao.Common.pdb differ diff --git a/libs/LuYao.Common.xml b/libs/LuYao.Common.xml new file mode 100644 index 0000000..35fe4be --- /dev/null +++ b/libs/LuYao.Common.xml @@ -0,0 +1,534 @@ + + + + LuYao.Common + + + + + 释放基类 + + + + + 是否已释放 + + + + + 释放资源 + + 是否释放中 + + + + 释放资源。执行与释放或重置非托管资源关联的应用程序定义的任务 + + + + + 析构函数 + + + + + This class can be used to provide an action when + Dipose method is called. + + + + + Creates a new object. + + Action to be executed when this object is disposed. + + + + Strongly typed version of Enum with Parsing and performance improvements. + + Type of Enum + + + + 根据文件后缀来获取MIME类型字符串 + + 文件后缀 + + + + + 升级包的校验值 + + + + + 升级包大小 + + + + + 升级包路径 + + + + + 文件路径 + + + + + 文件大小 + + + + + 文件校验值 + + + + + 文件版本 + + + + + 代理服务器源 + + + + + 使用代理服务器创建 + + + + + + + 从 提取 + + + + + + + 重置 以便下次重用 + + + + + + 基于 Http 链接的数据源 + + + + + 提取地址 + + + + + 用户名 + + + + + 密码 + + + + + 代理服务器源 + + + + + 当发现新的代理服务器时 + + + + + 当代理服务器失效时 + + + + + 默认提取间隔 + + + + + 默认可用有效期 + + + + + 代理服务器提取间隔 + + + + + 代理服务器有效期 + + + + + 刷新数据源 + + + + + Implements a 32-bit CRC hash algorithm compatible with Zip etc. + + + Crc32 should only be used for backward compatibility with older file formats + and algorithms. It is not secure enough for new applications. + If you need to call multiple times for the same data either use the HashAlgorithm + interface or remember that the result of one Compute call needs to be ~ (XOR) before + being passed in as the seed for the next Compute call. + + + + + Create a new with a and . + + + + + Create a new with a supplied polynomial, seed, and algorithm options.. + Note: the "default" CRC32 algorithm reflects both input and output, then flips all bits (XorOut = 0xFFFFFFFF). + + The polynomial to use in calculating. + The initial seed to start from. + + + + + + + + + + + + + + + + Calculate the for a given with the + and . + + The buffer to calcuate a CRC32 for. + The CRC32 for the buffer. + + + + Calculate the for a given with a + specified and . + + The initial seed to start from. + The buffer to calcuate a CRC32 for. + The CRC32 for the buffer. + + + + Calculate the for a given with a + specified and . + + The initial seed to start from. + The buffer to calcuate a CRC32 for. + The CRC32 for the buffer. + + + + Initialize a CRC32 calculation table for a given polynomial. + + The polynomial to calculate a table for. + A table to be used in calculating a CRC32. + + + + Calculate an inverted CRC32 for a given using a polynomial-derived . + + The polynomial-derived table such as from . + The initial seed to start from. + The buffer to calculate the CRC32 from. + What position within the to start calculating from. + How many bytes within the to read in calculating the CRC32. + The bit-inverted CRC32. + This hash is bit-inverted. Use other methods in this class or the result from this method. + + + + Convert a to a taking care + to reverse the bytes on little endian processors. + + The to convert. + The containing the converted bytes. + + + + Helper to support bitwise reflecting (reversing) of bytes. + + + + + + + + 高性能低碰撞Murmur128哈希算法,Redis等大量使用,比MD5要好。 + + + + + 字符串压缩工具 + + + + + 注册一个压缩器 + + + + + + + 注册一个编码器 + + + + + + + 压缩器 + + + + + 编码器 + + + + + 压缩字符串 + + 待压缩字符串 + 压缩器 + 编码器 + 压缩后的字符串 + + + + + 使用默认配置压缩字符串 + + + + + + + 解压缩字符串 + + + + + + + + zero-allocate itoa, dtoa, atoi, atod converters. + + + + + 0 ~ 9 + + + + + Is 0 ~ 9, '.', '+', '-'? + + + + + Convinient pattern of ReadIsBeginArrayWithVerify + while(!ReadIsEndArrayWithSkipValueSeparator) + + + + + Convinient pattern of ReadIsBeginObjectWithVerify + while(!ReadIsEndObjectWithSkipValueSeparator) + + + + ReadString + ReadIsNameSeparatorWithVerify + + + Get raw string-span(do not unescape) + + + Get raw string-span(do not unescape) + ReadIsNameSeparatorWithVerify + + + + Underlying bytes is may be a pooling buffer, be careful to use it. If lost reference or can not handled byte[], return null. + + + + + Underlying bytes is may be a pooling buffer, be careful to use it. If lost reference or can not handled byte[], return null. + + + + { + + + } + + + [ + + + ] + + + 0~9, - + + + " + + + t + + + f + + + n + + + , + + + : + + + + 从字符串中抽取 JSON ,自动判断 JSON 层级。 + + + + + + + : + + + WriteString + WriteNameSeparator + + + + C# implementation of ASCII85 encoding. + Based on C code from http://www.stillhq.com/cgi-bin/cvsweb/ascii85/ + + + Jeff Atwood + http://www.codinghorror.com/blog/archives/000410.html + + + + + + Suffix mark that identifies an encoded ASCII85 string, traditionally '~>' + + + + + Maximum line length for encoded ASCII85 string; + set to zero for one unbroken line. + + + + + Add the Prefix and Suffix marks when encoding, and enforce their presence for decoding + + + + + Decodes an ASCII85 encoded string into the original binary data + + ASCII85 encoded string + byte array of decoded binary data + + + + Encodes binary data into a plaintext ASCII85 format string + + binary data to encode + ASCII85 encoded string + + + + Encode a byte array with Base62 + + Byte array + Use inverted character set + Base62 string + + + + Decode a base62-encoded string + + Base62 string + Use inverted character set + Byte array + + + + datatable转List + + + + + + + + 截断毫秒部分 + + + + + 截断秒及之后部分 + + + + + 阶段分钟及之后部分 + + + + + 截断小时及之后部分 + + + + + 读取响应字符串,自动识别内容编码。 + + + + + + + Extract strings by using regular expressions. + + + + + Extract string by using regular expressions. If no match, return null. + + + + + Projects the specified string to an array by using regular expressions. + + + +