Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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);
        }