Merge pull request #472 from MelanieT/spmanager_fix
[mono.git] / mcs / class / monodoc / Monodoc / generators / html / Addin2Html.cs
1 using System;
2 using System.IO;
3 using System.Text;
4 using System.Xml;
5 using System.Xml.Xsl;
6 using System.Xml.XPath;
7 using System.Collections.Generic;
8
9 namespace Monodoc.Generators.Html
10 {
11         public class Addin2Html : IHtmlExporter
12         {
13                 public string CssCode {
14                         get {
15                                 return string.Empty;
16                         }
17                 }
18
19                 public string Export (Stream stream, Dictionary<string, string> extraArgs)
20                 {
21                         using (var reader = new StreamReader (stream))
22                                 return Htmlize (GetAddin (reader, extraArgs["AddinID"]),
23                                                 extraArgs["show"],
24                                                 extraArgs["AddinID"],
25                                                 extraArgs["FileID"],
26                                                 extraArgs["NodeID"]);
27                 }
28
29                 public string Export (string input, Dictionary<string, string> extraArgs)
30                 {
31                         return Htmlize (GetAddin (new StringReader (input), extraArgs["AddinID"]),
32                                         extraArgs["show"],
33                                         extraArgs["AddinID"],
34                                         extraArgs["FileID"],
35                                         extraArgs["NodeID"]);
36                 }
37
38                 XmlElement GetAddin (TextReader reader, string addinId)
39                 {
40                         XmlDocument doc = new XmlDocument ();
41                         doc.Load (reader);
42                         XmlElement addin = (XmlElement) doc.SelectSingleNode ("Addins/Addin[@fullId='" + addinId + "']");
43                         return addin != null ? addin : null;
44                 }
45
46                 public string Htmlize (XmlElement addin, string urlType, string addinId, string fileId, string path)
47                 {
48                         if (urlType == Monodoc.Providers.AddinsHelpSource.AddinPrefix)
49                                 return GetAddinTextFromUrl (addin, addinId, fileId);
50                         else if (urlType == Monodoc.Providers.AddinsHelpSource.ExtensionPrefix)
51                                 return GetExtensionTextFromUrl (addin, addinId, fileId, path);
52                         else if (urlType == Monodoc.Providers.AddinsHelpSource.ExtensionNodePrefix)
53                                 return GetExtensionNodeTextFromUrl (addin, addinId, fileId, path);
54
55                         return null;
56                 }
57
58                 protected string GetAddinTextFromUrl (XmlElement addin, string addinId, string fileId)
59                 {
60                         if (addin == null)
61                                 return "<html>Add-in not found: " + addinId + "</html>";
62                         
63                         StringBuilder sb = new StringBuilder ("<html>");
64                         sb.Append ("<h1>").Append (addin.GetAttribute ("name")).Append ("</h1>");
65                         XmlElement docs = (XmlElement) addin.SelectSingleNode ("Description");
66                         if (docs != null)
67                                 sb.Append (docs.InnerText);
68
69                         sb.Append ("<p><table border=\"1\" cellpadding=\"4\" cellspacing=\"0\">");
70                         sb.AppendFormat ("<tr><td><b>Id</b></td><td>{0}</td></tr>", addin.GetAttribute ("addinId"));
71                         sb.AppendFormat ("<tr><td><b>Namespace</b></td><td>{0}</td></tr>", addin.GetAttribute ("namespace"));
72                         sb.AppendFormat ("<tr><td><b>Version</b></td><td>{0}</td></tr>", addin.GetAttribute ("version"));
73                         sb.Append ("</table></p>");
74                         sb.Append ("<p><b>Extension Points</b>:</p>");
75                         sb.Append ("<ul>");
76                         
77                         foreach (XmlElement ep in addin.SelectNodes ("ExtensionPoint")) {
78                                 sb.AppendFormat ("<li><a href=\"extension-point:{0}#{1}#{2}\">{3}</li>", fileId, addinId, ep.GetAttribute ("path"), ep.GetAttribute ("name"));
79                         }
80                         sb.Append ("</ul>");
81                         
82                         sb.Append ("</html>");
83                         return sb.ToString ();
84                 }
85                 
86                 protected string GetExtensionTextFromUrl (XmlElement addin, string addinId, string fileId, string path)
87                 {
88                         if (addin == null)
89                                 return "<html>Add-in not found: " + addinId + "</html>";
90                         
91                         XmlElement ext = (XmlElement) addin.SelectSingleNode ("ExtensionPoint[@path='" + path + "']");
92                         if (ext == null)
93                                 return "<html>Extension point not found: " + path + "</html>";
94                         
95                         StringBuilder sb = new StringBuilder ("<html>");
96                         sb.Append ("<h1>").Append (ext.GetAttribute ("name")).Append ("</h1>");
97
98                         path = path.Replace ("/", " <b>/</b> ");
99                         sb.Append ("<p><b>Path</b>: ").Append (path).Append ("</p>");
100                         XmlElement desc = (XmlElement) ext.SelectSingleNode ("Description");
101                         if (desc != null)
102                                 sb.Append (desc.InnerText);
103
104                         sb.Append ("<p><b>Extension Nodes</b>:</p>");
105                         sb.Append ("<table border=\"1\" cellpadding=\"4\" cellspacing=\"0\">");
106                         
107                         foreach (XmlElement en in ext.SelectNodes ("ExtensionNode")) {
108                                 string nid = en.GetAttribute ("id");
109                                 string nname = en.GetAttribute ("name"); 
110                                 string sdesc = "";
111                                 desc = (XmlElement) en.SelectSingleNode ("Description");
112                                 if (desc != null)
113                                         sdesc = desc.InnerText;
114                                 
115                                 sb.AppendFormat ("<tr><td><a href=\"extension-node:{0}#{1}#{2}\">{3}</td><td>{4}</td></tr>", fileId, addinId, nid, nname, sdesc);
116                         }
117                         sb.Append ("</table>");
118                         
119                         sb.Append ("</html>");
120                         return sb.ToString ();
121                 }
122                 
123                 protected string GetExtensionNodeTextFromUrl (XmlElement addin, string addinId, string fileId, string nodeId)
124                 {
125                         if (addin == null)
126                                 return "<html>Add-in not found: " + addinId + "</html>";
127                         
128                         XmlElement node = (XmlElement) addin.SelectSingleNode ("ExtensionNodeType[@id='" + nodeId + "']");
129                         if (node == null)
130                                 return "<html>Extension point not found: " + nodeId + "</html>";
131                         
132                         StringBuilder sb = new StringBuilder ("<html>");
133                         sb.Append ("<h1>").Append (node.GetAttribute ("name")).Append ("</h1>");
134                         XmlElement desc = (XmlElement) node.SelectSingleNode ("Description");
135                         if (desc != null)
136                                 sb.Append (desc.InnerText);
137
138                         sb.Append ("<p><b>Attributes</b>:</p>");
139                         sb.Append ("<table border=\"1\" cellpadding=\"4\" cellspacing=\"0\"><tr>");
140                         sb.Append ("<td><b>Name</b></td>");
141                         sb.Append ("<td><b>Type</b></td>");
142                         sb.Append ("<td><b>Required</b></td>");
143                         sb.Append ("<td><b>Localizable</b></td>");
144                         sb.Append ("<td><b>Description</b></td>");
145                         sb.Append ("<tr>");
146                         sb.Append ("<td>id</td>");
147                         sb.Append ("<td>System.String</td>");
148                         sb.Append ("<td></td>");
149                         sb.Append ("<td></td>");
150                         sb.Append ("<td>Identifier of the node.</td>");
151                         sb.Append ("</tr>");
152                         
153                         foreach (XmlElement at in node.SelectNodes ("Attributes/Attribute")) {
154                                 sb.Append ("<tr>");
155                                 sb.AppendFormat ("<td>{0}</td>", at.GetAttribute ("name"));
156                                 sb.AppendFormat ("<td>{0}</td>", at.GetAttribute ("type"));
157                                 if (at.GetAttribute ("required") == "True")
158                                         sb.Append ("<td>Yes</td>");
159                                 else
160                                         sb.Append ("<td></td>");
161                                 if (at.GetAttribute ("localizable") == "True")
162                                         sb.Append ("<td>Yes</td>");
163                                 else
164                                         sb.Append ("<td></td>");
165                                 string sdesc = "";
166                                 desc = (XmlElement) at.SelectSingleNode ("Description");
167                                 if (desc != null)
168                                         sdesc = desc.InnerText;
169                                 
170                                 sb.AppendFormat ("<td>{0}</td>", sdesc);
171                                 sb.Append ("</tr>");
172                         }
173                         sb.Append ("</table>");
174
175                         XmlNodeList children = node.SelectNodes ("ChildNodes/ExtensionNode");
176                         if (children.Count > 0) {
177                                 sb.Append ("<p><b>Child Nodes</b>:</p>");
178                                 sb.Append ("<table border=\"1\" cellpadding=\"4\" cellspacing=\"0\">");
179                                 
180                                 foreach (XmlElement en in children) {
181                                         string nid = en.GetAttribute ("id");
182                                         string nname = en.GetAttribute ("name"); 
183                                         string sdesc = "";
184                                         desc = (XmlElement) en.SelectSingleNode ("Description");
185                                         if (desc != null)
186                                                 sdesc = desc.InnerText;
187                                         
188                                         sb.AppendFormat ("<tr><td><a href=\"extension-node:{0}#{1}#{2}\">{3}</td><td>{4}</td></tr>", fileId, addinId, nid, nname, sdesc);
189                                 }
190                                 sb.Append ("</table>");
191                         }
192                         
193                         sb.Append ("</html>");
194                         return sb.ToString ();
195                 }
196         }
197 }