public static SkinCollection GetAllSkins() { SkinCollection allSkins = s_AllSkins;//new SkinCollection(); CacheDependency skinsWatcher = s_SkinsWatcher; if (allSkins == null || skinsWatcher == null || skinsWatcher.HasChanged) { lock (s_LoadSkinLocker) { allSkins = s_AllSkins; skinsWatcher = s_SkinsWatcher; if (allSkins == null || skinsWatcher == null || skinsWatcher.HasChanged) { allSkins = new SkinCollection(); //SkinCollection enabledSkins = new SkinCollection(); string skinsPath = Globals.GetPath(SystemDirecotry.Skins); //获得保存主题的目录实体 DirectoryInfo skinsDirectory = new DirectoryInfo(skinsPath); //所有主题的目录集合 DirectoryInfo[] skinDirectorys = skinsDirectory.GetDirectories(); List <string> watcher = new List <string>(); //string[] tempFileNames = new string[skinDirectorys.Length]; //int index = 0; //遍历所有主题的目录集合,把存在Theme.Config文件的主题添加到主题列表中 foreach (DirectoryInfo skinDirectory in skinDirectorys) { string file = IOUtil.JoinPath(skinDirectory.FullName, MaxLabs.bbsMax.Consts.SkinConfigFile); if (File.Exists(file) == true) { Skin skin = new Skin(); skin.SkinID = skinDirectory.Name; skin.Name = skin.SkinID; //读取_skin.config配置文件 XmlDocument doc = new XmlDocument(); try { doc.Load(file); #region 循环取 Skin 的属性 foreach (XmlNode configNode in doc.DocumentElement.ChildNodes) { if (configNode.NodeType != XmlNodeType.Comment) { switch (configNode.Name.ToLower()) { case "name": skin.Name = configNode.InnerText.Trim(); break; case "version": skin.Version = configNode.InnerText.Trim(); break; case "publishdate": try { skin.PublishDate = DateTime.Parse(configNode.InnerText.Trim()); } catch { skin.PublishDate = DateTime.MinValue; } break; case "author": skin.Author = configNode.InnerText.Trim(); break; case "website": skin.WebSite = configNode.InnerText.Trim(); break; case "description": skin.Description = configNode.InnerText.Trim(); break; case "skinbase": skin.SkinBase = configNode.InnerText.Trim(); break; } } } #endregion } catch { } allSkins.Add(skin); //if (skin.Enabled) // enabledSkins.Add(skin); watcher.Add(file); //tempFileNames[index] = file; //index++; } else { watcher.Add(skinDirectory.FullName); } } watcher.Add(skinsPath); s_AllSkins = allSkins; s_EnabledSkins = null; s_SkinsWatcher = new CacheDependency(watcher.ToArray()); } } } if (allSkins == null || allSkins.Count == 0 || allSkins.ContainsKey(MaxLabs.bbsMax.Consts.DefaultSkinID) == false) { throw new Exception("载入默认模板失败。默认模板位于“max-templates/default”目录下,该目录不能删除。"); } return(allSkins); }
/// <summary> /// 解析指定路径下的模板文件,并返回模板解析结果的路径,如果所给的路径不是模板文件路径,则返回原路径 /// </summary> /// <param name="virtualPath">模板文件的虚拟路径,支持.aspx和.ascx文件</param> /// <returns></returns> public static string ParseTemplate(string path) { string virtualPath = null; string queryString = null; int queryStart = path.IndexOf('?'); if (queryStart >= 0) { virtualPath = path.Substring(0, queryStart); queryString = path.Substring(queryStart); } else { virtualPath = path; } //if (virtualPath.StartsWith(SkinedPath, StringComparison.OrdinalIgnoreCase)) //{ // string skinID = User.Current.SkinID; // virtualPath = "~/max-templates/default/" + skinID + virtualPath.Substring(1); //} TemplateFile templateFile = GetTemplateFile(virtualPath); if (templateFile == null) { return(path);//virtualPath + queryString; } Skin skin = s_IsPreParsing == false ? Context.Current.Skin : s_PreParseSkin; bool useSkin; string skinID; if (skin == null) { useSkin = false; skinID = MaxLabs.bbsMax.Consts.DefaultSkinID; } else { useSkin = skin.SkinID != MaxLabs.bbsMax.Consts.DefaultSkinID; skinID = skin.SkinID; } if (useSkin) { templateFile = templateFile.GetSkin(skin.SkinID); } if (templateFile.IsParsed == false) { lock (templateFile) { if (templateFile.IsParsed == false) { using (TemplateParser parser = new TemplateParser()) { //string forumPath = "~/max-templates/" + skinID + "/forums/"; ////UrlFormat urlFormat = s_IsPreParsing ? s_PreParseUrlFormat : AllSettings.Current.FriendlyUrlSettings.UrlFormat; //if (templateFile.VirtualPath.StartsWith(forumPath, StringComparison.OrdinalIgnoreCase)) //{ // parser.GenerateV30AspxCode(skinID, templateFile, Config.Current.TemplateImports); //} //else //{ parser.GenerateAspxCode(skinID, templateFile, Config.Current.TemplateImports); //} templateFile.IsParsed = true; } } } } return(templateFile.ParsedFileVirtualPath + queryString); }