using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using WalkingTec.Mvvm.Core; namespace WalkingTec.Mvvm.Mvc { public static class IconFontsHelper { private static List _iconFontItems; public static List IconFontItems { get { foreach (var item in _iconFontItems.Where(x => x.Selected == true)) item.Selected = false; return _iconFontItems; } } private static Dictionary> _iconFontDicItems; public static Dictionary> IconFontDicItems => _iconFontDicItems; public static void GenerateIconFont(params string[] dirs) { var baseDirs = new string[] { "wwwroot/font", "wwwroot/layui" }; if(dirs.Length > 0) { baseDirs = dirs; } var iconFontHashSet = new HashSet(); var IconFontDic = new Dictionary(); foreach (var dir in baseDirs) { if (Directory.Exists(dir)) { RecursiveDir(dir, iconFontHashSet, IconFontDic); } } var iconFonts = iconFontHashSet.ToArray(); _iconFontItems = iconFontHashSet.Select(x => new ComboSelectListItem { Text = x, Value = x }).ToList(); _iconFontDicItems = new Dictionary>(); foreach (var key in IconFontDic.Keys) { IconFontDicItems.Add(key, IconFontDic[key].Select(x => new MenuItem { Text = x, Value = x, Icon = $"{key} {x}" }).ToList()); } } private static void RecursiveDir(string dirPath, HashSet iconFonts, Dictionary iconFontDic) { var dirs = Directory.GetDirectories(dirPath); foreach (var dir in dirs) { RecursiveDir(dir, iconFonts, iconFontDic); } var files = Directory.GetFiles(dirPath, "*.css"); foreach (var cssPath in files) { ResolveIconfont(cssPath, iconFonts, iconFontDic); } } /// /// 解析 /// private static void ResolveIconfont(string cssPath, HashSet iconFonts, Dictionary iconFontDic) { var file = File.ReadAllText(cssPath).Replace("\r\n", string.Empty); // 找到自定义的 iconfont var regex = new Regex("@font-face\\s{0,}{\\s{0,}('|\"|)font-family(\\1)\\s{0,}:\\s{0,}('|\"|)([a-zA-Z0-9-_.#]{1,})(\\3)\\s{0,};"); var iconMatchs = regex.Matches(file); foreach (Match iconfontItem in iconMatchs) { // icon family name var iconName = iconfontItem.Groups[4].ToString(); var itemRegex = new Regex($".({iconName}-([a-zA-Z0-9-_.#]{{1,}}))\\s{{0,}}:before\\s{{0,}}{{"); var itemMatchs = itemRegex.Matches(file); var iconFontItems = new List(); foreach (Match item in itemMatchs) { iconFontItems.Add(item.Groups[1].ToString()); } if (iconFontItems.Count > 0) { iconFonts.Add(iconName); iconFontDic.Add(iconName, iconFontItems.OrderBy(x => x).ToArray()); } } } } }