private string GetChildNodeInnerText(MemberXmlElement elem, string name)
 {
     if (elem != null)
     {
         XmlNodeList nodes = elem.Data.GetElementsByTagName(name);
         if (nodes != null && nodes.Count > 0 && nodes[0].NodeType == XmlNodeType.Element)
         {
             return(GetTag(nodes[0] as XmlElement, elem.OwnerDirectory));
         }
         else
         {
             return("");
         }
     }
     else
     {
         return("");
     }
 }
        /// <summary>
        /// 生成命名空间页面
        /// </summary>
        /// <param name="typeItems">命名空间中的所有类型</param>
        /// <param name="ns">命名空间包含信息(名称,页面文件名等)</param>
        protected override void CreateNamespacePage(IGetTypes typeItems, ContentTreeItem ns)
        {
            HtmlText content = new HtmlText();

            foreach (string category in typeItems.GetAllCategory())
            {
                string   title      = NameToTitleDictionary[category] as string;
                HtmlText secContent = new HtmlText();
                foreach (ContentTreeItem typeItem in typeItems.GetMembers(category))
                {
                    Type             type = typeItem.Info as Type;
                    MemberXmlElement data = DataProvider.GetMemberXmlNode(type);
                    string           summary;
                    summary = GetChildNodeInnerText(data, "summary");
                    if (string.IsNullOrEmpty(summary))
                    {
                        summary = "&nbsp;";
                    }
                    string strRow = tempTypeTable_Row.Render(
                        tempImg.Render(NameToTitleDictionary[category], category + ".png"),
                        typeItem.FileName,
                        HtmlText.HtmlFormat(typeItem.Name),
                        summary
                        );
                    secContent.AppendPre(strRow);
                }
                content.AppendPre(CreateTableSection(title, title, secContent.ToString()));
            }

            Hashtable values = new Hashtable();

            values["CollapseAll"] = Resources.strCollapseAll;
            values["ExpandAll"]   = Resources.strExpandAll;
            values["PIC"]         = Resources.strPic;
            values["Title"]       = HtmlText.HtmlFormat(ns.Name);
            values["Summary"]     = "";
            values["Content"]     = content.ToString();
            values["Encoding"]    = TargetEncoding.HeaderName;
            tempPage.SaveAs(HtmlFileDirectory + "\\" + ns.FileName, TargetEncoding, values);
        }
        /// <summary>
        /// 创建成员页面
        /// </summary>
        /// <param name="memberItem">成员的信息</param>
        protected override void CreateMemberPage(ContentTreeItem memberItem)
        {
            MemberInfo       info       = memberItem.Info;
            MemberXmlElement memberData = DataProvider.GetMemberXmlNode(info);

            HtmlText content = new HtmlText();
            int      secID   = 0;

            foreach (PageSection section in MemberPageSections)
            {
                string secText = null;
                switch (section.SectionType)
                {
                case PageSectionType.Syntax:
                {
                    string parameters = "";
                    string ret        = "";
                    string val        = "";

                    if (memberData != null)
                    {
                        XmlNodeList ns;

                        ns = memberData.Data.GetElementsByTagName("param");
                        foreach (XmlElement p in ns)
                        {
                            parameters += tempParam.Render(
                                HtmlText.HtmlFormat(p.GetAttribute("name")),
                                GetInnerTags(p, memberData.Owner)
                                );
                        }

                        ret = GetChildNodeInnerText(memberData, "returns");
                        val = GetChildNodeInnerText(memberData, "value");
                    }

                    HtmlText secContent = new HtmlText(), declaration = new HtmlText();

                    declaration.AppendPre(HtmlText.HtmlFormat(CreateMemberDeclaration(info, memberData)));

                    secContent.AppendPre(tempDeclaration.Render("C#", declaration));

                    switch (info.MemberType)
                    {
                    case MemberTypes.Constructor:
                    case MemberTypes.Method:
                    {
                        if (!string.IsNullOrEmpty(parameters))
                        {
                            secContent.AppendPre(tempParamsBlock.Render(Resources.String46, parameters));
                        }
                        if (!string.IsNullOrEmpty(ret))
                        {
                            secContent.AppendPre(tempParamsBlock.Render(Resources.String47, ret));
                        }
                        break;
                    }

                    case MemberTypes.Property:
                    {
                        if (!string.IsNullOrEmpty(val))
                        {
                            secContent.AppendPre(tempParamsBlock.Render(Resources.String48, val));
                        }
                        break;
                    }

                    default:
                        break;
                    }

                    Hashtable sectionValues = new Hashtable();
                    sectionValues["ID"]      = "Syntex";
                    sectionValues["Title"]   = section.Name;
                    sectionValues["Content"] = secContent.ToString();
                    secText = tempSection.Render(sectionValues);
                    break;
                }

                case PageSectionType.Remarks:
                {
                    if (memberData != null)
                    {
                        string remarks = GetChildNodeInnerText(memberData, "remarks");
                        if (!string.IsNullOrEmpty(remarks))
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "Remarks";
                            sectionValues["Title"]   = section.Name;
                            sectionValues["Content"] = tempRemarks.Render(remarks);
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }

                case PageSectionType.Exception:
                {
                    if (memberData != null)
                    {
                        XmlNodeList ns;
                        ns = memberData.Data.GetElementsByTagName("exception");
                        HtmlText ecx = new HtmlText();
                        foreach (XmlElement n in ns)
                        {
                            int index = n.GetAttribute("cref").LastIndexOfAny(new char[] { ':', '.', '+' });
                            ecx.AppendPre(
                                tempExceptionTable_Row.Render(
                                    n.GetAttribute("cref").Substring(index + 1),
                                    n.InnerText
                                    )
                                );
                        }
                        if (ecx.Length > 0)
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "Exception";
                            sectionValues["Title"]   = section.Name;
                            sectionValues["Content"] = tempExceptionTable.Render(ecx);
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }

                case PageSectionType.Example:
                {
                    if (memberData != null)
                    {
                        string exampleText = GetChildNodeInnerText(memberData, "example");
                        if (!string.IsNullOrEmpty(exampleText))
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "Exception";
                            sectionValues["Title"]   = section.Name;
                            sectionValues["Content"] = exampleText;
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }

                case PageSectionType.FromXML:
                {
                    if (memberData != null)
                    {
                        string text = GetChildNodeInnerText(memberData, section.XmlSource);
                        if (!string.IsNullOrEmpty(text))
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "SEC" + secID.ToString("00");
                            sectionValues["Title"]   = section.Name;
                            sectionValues["Content"] = text;
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }
                }
                if (!string.IsNullOrEmpty(secText))
                {
                    content.AppendPre(secText);
                }
                secID++;
            }

            string summary = GetChildNodeInnerText(memberData, "summary");

            Hashtable values = new Hashtable();

            values["CollapseAll"] = Resources.strCollapseAll;
            values["ExpandAll"]   = Resources.strExpandAll;
            values["PIC"]         = Resources.strPic;
            if (info.MemberType == MemberTypes.Constructor)
            {
                values["Title"] = HtmlText.HtmlFormat(memberItem.Name) + " " + NameToTypeDictionary[memberItem.Parent.Name];
            }
            else
            {
                values["Title"] = HtmlText.HtmlFormat(info.DeclaringType.Name + "." + info.Name) + " " + NameToTypeDictionary[memberItem.Parent.Name];
            }
            values["Summary"]  = summary;
            values["Content"]  = content;
            values["Encoding"] = TargetEncoding.HeaderName;

            tempPage.SaveAs(
                HtmlFileDirectory + "\\" + memberItem.FileName,
                TargetEncoding,
                values
                );
        }
        private string GetTypeMemberCategorySection(IGetMembers memberItems, Type type, MemberXmlElement typeData, string category)
        {
            if (memberItems.GetMembers(category) != null)
            {
                string   secText        = null;
                string   sectionTitle   = NameToTitleDictionary[category] as string;
                HtmlText sectionContent = new HtmlText();
                foreach (ContentTreeItem memberItem in memberItems.GetMembers(category))
                {
                    MemberXmlElement memberData = DataProvider.GetMemberXmlNode(memberItem.Info);
                    string           summary    = "";
                    summary = GetChildNodeInnerText(memberData, "summary");
                    if (memberItem.Info.DeclaringType != type)
                    {
                        summary += string.Format(Resources.String56, memberItem.Info.DeclaringType.Name);
                    }
                    if (string.IsNullOrEmpty(summary))
                    {
                        summary = "&nbsp;";
                    }
                    HtmlText imgs = new HtmlText();
                    imgs.AppendPre(tempImg.Render(NameToTitleDictionary[category], category + ".bmp"));
                    if (IsStatic(memberItem.Info))
                    {
                        imgs.AppendPre("&nbsp;");
                        imgs.AppendPre(tempImg.Render("static", "static.bmp"));
                    }

                    string mname = "";
                    mname += HtmlText.HtmlFormat(memberItem.Name);
                    MethodInfo method = memberItem.Info as MethodInfo;
                    //if (method != null)
                    if (method != null)
                    {
                        //泛型方法
                        //if (method.IsGenericMethod == true)
                        //{

                        if (memberData != null && memberData.Data != null)
                        {
                            XmlNodeList lst = memberData.Data.GetElementsByTagName("typeparam");

                            if (lst.Count > 0)
                            {
                                mname += HtmlText.HtmlFormat("<");
                                mname += (lst[0] as XmlElement).GetAttribute("name");
                                for (int i = 1; i < lst.Count; i++)
                                {
                                    mname += ("," + (lst[i] as XmlElement).GetAttribute("name"));
                                }
                                //泛型方法处理
                                //name = name.Replace("``" + elem.GetElementsByTagName("typeparam").Count, "");
                                mname += HtmlText.HtmlFormat(">");
                            }
                        }
                        //}

                        ParameterInfo[] parameters = method.GetParameters();
                        if (parameters.Length > 0)
                        {
                            string strParams = "";
                            foreach (ParameterInfo param in parameters)
                            {
                                if (string.IsNullOrEmpty(strParams))
                                {
                                    strParams = "" + SimpleParamName(DocumentBuilderUtility.GetTypeDefinition(param.ParameterType)) + "";
                                }
                                else
                                {
                                    strParams += "," + SimpleParamName(DocumentBuilderUtility.GetTypeDefinition(param.ParameterType)) + "";
                                }
                            }
                            mname += ("(" + strParams + ")");
                        }
                        else
                        {
                            mname += ("()");
                        }
                    }


                    string strRow = tempTypeTable_Row.Render(
                        imgs,
                        memberItem.FileName,
                        //HtmlText.HtmlFormat(memberItem.Name),
                        mname,
                        summary
                        );
                    sectionContent.AppendPre(strRow);
                }
                if (sectionContent.Length > 0)
                {
                    secText = CreateTableSection(category, sectionTitle, sectionContent.ToString());
                }
                return(secText);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 生成类型页面
        /// </summary>
        /// <param name="memberItems">该类型包含的所有成员</param>
        /// <param name="typeItem">类型包含信息(名称,页面文件名等)</param>
        protected override void CreateTypePage(IGetMembers memberItems, ContentTreeItem typeItem)
        {
            HtmlText pageContent = new HtmlText();
            Type     type        = typeItem.Info as Type;

            MemberXmlElement typeData = DataProvider.GetMemberXmlNode(type);
            int secID = 0;

            foreach (PageSection section in TypePageSections)
            {
                string secText = null;
                switch (section.SectionType)
                {
                case PageSectionType.Constructor:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "Constructor");
                    break;

                case PageSectionType.PublicMethod:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PublicMethod");
                    break;

                case PageSectionType.ProtectedMethod:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "ProtectedMethod");
                    break;

                case PageSectionType.PrivateMethod:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PrivateMethod");
                    break;

                case PageSectionType.PublicProperty:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PublicProperty");
                    break;

                case PageSectionType.ProtectedProperty:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "ProtectedProperty");
                    break;

                case PageSectionType.PrivateProperty:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PrivateProperty");
                    break;

                case PageSectionType.PublicField:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PublicField");
                    break;

                case PageSectionType.ProtectedField:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "ProtectedField");
                    break;

                case PageSectionType.PrivateField:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "PrivateField");
                    break;

                case PageSectionType.Event:
                    secText = GetTypeMemberCategorySection(memberItems, type, typeData, "Event");
                    break;

                case PageSectionType.Remarks:
                {
                    if (typeData != null)
                    {
                        HtmlText remarks = new HtmlText();
                        remarks.AppendPre(GetChildNodeInnerText(typeData, "remarks"));
                        if (remarks.Length > 0)
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "remarks";
                            sectionValues["Title"]   = Resources.String42;
                            sectionValues["Content"] = tempRemarks.Render(remarks);
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }

                case PageSectionType.Example:
                {
                    if (typeData != null)
                    {
                        HtmlText example = new HtmlText();
                        example.AppendPre(GetChildNodeInnerText(typeData, "example"));
                        if (example.Length > 0)
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "example";
                            sectionValues["Title"]   = Resources.String43;
                            sectionValues["Content"] = tempRemarks.Render(example);
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }

                case PageSectionType.FromXML:
                {
                    if (typeData != null)
                    {
                        string text = GetChildNodeInnerText(typeData, section.XmlSource);
                        if (!string.IsNullOrEmpty(text))
                        {
                            Hashtable sectionValues = new Hashtable();
                            sectionValues["ID"]      = "SEC" + secID.ToString("00");
                            sectionValues["Title"]   = section.Name;
                            sectionValues["Content"] = text;
                            secText = tempSection.Render(sectionValues);
                        }
                    }
                    break;
                }
                }
                if (!string.IsNullOrEmpty(secText))
                {
                    pageContent.AppendPre(secText);
                }
                secID++;
            }

            Hashtable values = new Hashtable();

            values["CollapseAll"] = Resources.strCollapseAll;
            values["ExpandAll"]   = Resources.strExpandAll;
            values["PIC"]         = Resources.strPic;
            values["Title"]       = HtmlText.HtmlFormat(DocumentBuilderUtility.GetTypeDefinition(type, false)) + " " + NameToTypeDictionary[typeItem.Parent.Name];
            values["Summary"]     = GetChildNodeInnerText(typeData, "summary");
            values["Content"]     = pageContent;
            values["Encoding"]    = TargetEncoding.HeaderName;
            tempPage.SaveAs(
                HtmlFileDirectory + "\\" + typeItem.FileName,
                TargetEncoding,
                values
                );
        }
        private string CreateMemberDeclaration(MemberInfo info, MemberXmlElement memberData)
        {
            StringBuilder declaration = new StringBuilder();

            switch (info.MemberType)
            {
            case MemberTypes.Method:
            {
                MethodInfo method = info as MethodInfo;
                if (method.IsStatic)
                {
                    declaration.Append("static ");
                }
                if (method.IsVirtual)
                {
                    declaration.Append("virtual ");
                }
                declaration.Append(DocumentBuilderUtility.GetTypeDefinition(method.ReturnType) + " " + method.Name);

                //泛型方法处理
                //if (method.IsGenericMethod == true)
                //if (method.IsGenericMethod == true)
                //{
                if (memberData != null && memberData.Data != null)
                {
                    XmlNodeList lst = memberData.Data.GetElementsByTagName("typeparam");
                    if (lst.Count > 0)
                    {
                        declaration.Append("<");
                        declaration.Append((lst[0] as XmlElement).GetAttribute("name"));
                        for (int i = 1; i < lst.Count; i++)
                        {
                            declaration.Append("," + (lst[i] as XmlElement).GetAttribute("name"));
                        }
                        declaration.Append(">");
                    }
                }
                //}

                ParameterInfo[] parameters = method.GetParameters();
                if (parameters.Length > 0)
                {
                    string strParams = "";
                    foreach (ParameterInfo param in parameters)
                    {
                        if (string.IsNullOrEmpty(strParams))
                        {
                            strParams = "    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                        }
                        else
                        {
                            strParams += ",\r\n    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                        }
                    }
                    declaration.Append("(\r\n" + strParams + "\r\n);");
                }
                else
                {
                    declaration.Append("();");
                }
                break;
            }

            case MemberTypes.Property:
            {
                PropertyInfo property = info as PropertyInfo;
                MethodInfo   method   = property.GetGetMethod(true);
                if (method == null)
                {
                    method = property.GetSetMethod(true);
                }
                if (method.IsStatic)
                {
                    declaration.Append("static ");
                }
                if (method.IsVirtual)
                {
                    declaration.Append("virtual ");
                }
                declaration.Append(DocumentBuilderUtility.GetTypeDefinition(method.ReturnType) + " " + property.Name);
                if (method != null)
                {
                    ParameterInfo[] parameters = method.GetParameters();
                    if (parameters.Length > 0)
                    {
                        string strParams = "";
                        foreach (ParameterInfo param in parameters)
                        {
                            if (string.IsNullOrEmpty(strParams))
                            {
                                strParams = "    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                            }
                            else
                            {
                                strParams += ",\r\n    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                            }
                        }
                        declaration.Append("[\r\n" + strParams + "\r\n]");
                    }
                    declaration.ToString();
                }
                declaration.Append("{");
                if (property.GetGetMethod(true) != null)
                {
                    declaration.Append(" get;");
                }
                if (property.GetSetMethod(true) != null)
                {
                    declaration.Append(" set;");
                }
                declaration.Append(" }");
                break;
            }

            case MemberTypes.Constructor:
            {
                ConstructorInfo ctor = info as ConstructorInfo;
                declaration.Append(DocumentBuilderUtility.GetTypeDefinition(ctor.DeclaringType, false));
                ParameterInfo[] parameters = ctor.GetParameters();
                if (parameters.Length > 0)
                {
                    string strParams = "";
                    foreach (ParameterInfo param in parameters)
                    {
                        if (string.IsNullOrEmpty(strParams))
                        {
                            strParams = "    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                        }
                        else
                        {
                            strParams += ",\r\n    " + DocumentBuilderUtility.GetTypeDefinition(param.ParameterType) + " " + param.Name;
                        }
                    }
                    declaration.Append("(\r\n" + strParams + "\r\n);");
                }
                else
                {
                    declaration.Append("();");
                }
                break;
            }

            case MemberTypes.Field:
            {
                FieldInfo field = info as FieldInfo;
                if (field.IsStatic)
                {
                    declaration.Append("static ");
                }
                declaration.Append(field.ToString());
                break;
            }

            case MemberTypes.Event:
            {
                EventInfo ent = info as EventInfo;
                declaration.Append(ent.ToString());
                break;
            }
            }
            return(declaration.ToString());
        }