7 using System.Xml.XPath;
8 using System.Collections.Generic;
10 using Mono.Documentation;
11 using BF = System.Reflection.BindingFlags;
13 namespace Monodoc.Generators.Html
15 public class Ecma2Html : IHtmlExporter
17 static string css_ecma;
19 static XslCompiledTransform ecma_transform;
20 readonly ExtensionObject ExtObject = new ExtensionObject ();
26 public string CssCode {
30 var assembly = typeof(Ecma2Html).Assembly;
31 Stream str_css = assembly.GetManifestResourceStream ("mono-ecma.css");
32 css_ecma = (new StreamReader (str_css)).ReadToEnd();
37 public string JsCode {
41 var assembly = typeof(Ecma2Html).Assembly;
42 Stream str_js = assembly.GetManifestResourceStream ("helper.js");
43 js = (new StreamReader (str_js)).ReadToEnd();
48 public string Htmlize (XmlReader ecma_xml, Dictionary<string, string> extraArgs)
50 var args = new XsltArgumentList ();
51 args.AddExtensionObject("monodoc:///extensions", ExtObject);
53 if (extraArgs.TryGetValue ("specialpage", out specialPage) && specialPage == "root") {
54 extraArgs.Remove ("specialpage");
55 extraArgs["show"] = "masteroverview";
58 foreach (var kvp in extraArgs)
59 args.AddParam (kvp.Key, string.Empty, kvp.Value);
61 return Htmlize (ecma_xml, args);
64 public string Htmlize (XmlReader ecma_xml, XsltArgumentList args)
69 var output = new StringBuilder ();
70 ecma_transform.Transform (ecma_xml,
72 XmlWriter.Create (output, ecma_transform.OutputSettings),
73 CreateDocumentResolver ());
74 return output.ToString ();
78 var msg = x.ToString ();
83 protected virtual XmlResolver CreateDocumentResolver ()
85 // results in using XmlUrlResolver
89 public string Export (Stream stream, Dictionary<string, string> extraArgs)
91 return Htmlize (XmlReader.Create (new StreamReader(stream)), extraArgs);
94 public string Export (string input, Dictionary<string, string> extraArgs)
96 return Htmlize (XmlReader.Create (new StringReader(input)), extraArgs);
100 static void EnsureTransform ()
102 if (ecma_transform == null) {
103 ecma_transform = new XslCompiledTransform ();
104 var assembly = System.Reflection.Assembly.GetAssembly (typeof (Ecma2Html));
106 Stream stream = assembly.GetManifestResourceStream ("mono-ecma-css.xsl");
107 XmlReader xml_reader = new XmlTextReader (stream);
108 XmlResolver r = new ManifestResourceResolver (".");
109 ecma_transform.Load (xml_reader, XsltSettings.TrustedXslt, r);
113 public class ExtensionObject
116 Dictionary<string, System.Reflection.Assembly> assemblyCache = new Dictionary<string, System.Reflection.Assembly> ();
118 public string Colorize(string code, string lang)
120 return Mono.Utilities.Colorizer.Colorize(code,lang);
123 // Used by stylesheet to nicely reformat the <see cref=> tags.
124 public string MakeNiceSignature(string sig, string contexttype)
132 sig = sig.Substring(2);
135 case 'N': return sig;
136 case 'T': return ShortTypeName (sig, contexttype);
138 case 'C': case 'M': case 'P': case 'F': case 'E':
139 string type, mem, arg;
143 if (s == 'C' || s == 'M')
144 paren = sig.IndexOf("(");
146 paren = sig.IndexOf("[");
150 if (paren > 0 && paren < sig.Length-1) {
151 string[] args = sig.Substring(paren+1, sig.Length-paren-2).Split(',');
152 for (int i = 0; i < args.Length; i++)
153 args[i] = ShortTypeName(args[i], contexttype);
154 arg = "(" + String.Join(", ", args) + ")";
155 sig = sig.Substring(0, paren);
160 // Get type and member names
161 int dot = sig.LastIndexOf(".");
162 if (s == 'C' || dot <= 0 || dot == sig.Length-1) {
166 type = sig.Substring(0, dot);
167 mem = sig.Substring(dot);
170 type = ShortTypeName(type, contexttype);
172 return type + mem + arg;
179 static string ShortTypeName(string name, string contexttype)
181 int dot = contexttype.LastIndexOf(".");
182 if (dot < 0) return name;
183 string contextns = contexttype.Substring(0, dot+1);
185 if (name == contexttype)
186 return name.Substring(dot+1);
188 if (name.StartsWith(contextns))
189 return name.Substring(contextns.Length);
191 return name.Replace("+", ".");
194 string MonoImpInfo(string assemblyname, string typename, string membername, string arglist, bool strlong)
199 var a = new List<string> ();
200 if (!string.IsNullOrEmpty (arglist)) a.Add (arglist);
201 return MonoImpInfo(assemblyname, typename, membername, a, strlong);
204 string MonoImpInfo(string assemblyname, string typename, string membername, XPathNodeIterator itr, bool strlong)
209 var rgs = itr.Cast<XPathNavigator> ().Select (nav => nav.Value).ToList ();
211 return MonoImpInfo (assemblyname, typename, membername, rgs, strlong);
214 string MonoImpInfo(string assemblyname, string typename, string membername, List<string> arglist, bool strlong)
217 System.Reflection.Assembly assembly = null;
220 if (!assemblyCache.TryGetValue (assemblyname, out assembly)) {
221 assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
222 if (assembly != null)
223 assemblyCache[assemblyname] = assembly;
225 } catch (Exception) {
229 if (assembly == null) {
230 /*if (strlong) return "The assembly " + assemblyname + " is not available to MonoDoc.";
231 else return string.Empty;*/
232 return string.Empty; // silently ignore
235 Type t = assembly.GetType(typename, false);
238 return typename + " has not been implemented.";
240 return "Not implemented.";
243 // The following code is flakey and fails to find existing members
245 } catch (Exception) {
250 string MonoImpInfo(System.Reflection.MemberInfo mi, string itemtype, bool strlong)
255 string s = string.Empty;
257 object[] atts = mi.GetCustomAttributes(true);
259 foreach (object att in atts) if (att.GetType().Name == "MonoTODOAttribute") todoctr++;
263 s = "This " + itemtype + " is marked as being unfinished.<BR/>\n";
271 public string MonoImpInfo(string assemblyname, string typename, bool strlong)
277 if (assemblyname == string.Empty)
280 System.Reflection.Assembly assembly;
281 if (!assemblyCache.TryGetValue (assemblyname, out assembly)) {
282 assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
283 if (assembly != null)
284 assemblyCache[assemblyname] = assembly;
287 if (assembly == null)
290 Type t = assembly.GetType(typename, false);
293 return typename + " has not been implemented.";
295 return "Not implemented.";
298 string s = MonoImpInfo(t, "type", strlong);
301 var mis = t.GetMembers (BF.Static | BF.Instance | BF.Public | BF.NonPublic);
303 // Scan members for MonoTODO attributes
305 foreach (var mi in mis) {
306 string mii = MonoImpInfo(mi, null, false);
307 if (mii != string.Empty) mctr++;
310 s += "This type has " + mctr + " members that are marked as unfinished.<BR/>";
316 } catch (Exception) {
321 public bool MonoEditing ()
326 public bool IsToBeAdded(string text)
328 return text.StartsWith ("To be added");