7 using System.Xml.XPath;
8 using System.Collections.Generic;
10 using Mono.Documentation;
11 using BF = System.Reflection.BindingFlags;
13 namespace MonkeyDoc.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);
52 foreach (var kvp in extraArgs)
53 args.AddParam (kvp.Key, string.Empty, kvp.Value);
55 return Htmlize(ecma_xml, args);
58 public string Htmlize (XmlReader ecma_xml, XsltArgumentList args)
62 var output = new StringBuilder ();
63 ecma_transform.Transform (ecma_xml,
65 XmlWriter.Create (output, ecma_transform.OutputSettings),
66 CreateDocumentResolver ());
67 return output.ToString ();
70 protected virtual XmlResolver CreateDocumentResolver ()
72 // results in using XmlUrlResolver
76 public string Export (Stream stream, Dictionary<string, string> extraArgs)
78 return Htmlize (XmlReader.Create (stream), extraArgs);
81 public string Export (string input, Dictionary<string, string> extraArgs)
83 return Htmlize (XmlReader.Create (new StringReader (input)), extraArgs);
86 static void EnsureTransform ()
88 if (ecma_transform == null) {
89 ecma_transform = new XslCompiledTransform ();
90 var assembly = System.Reflection.Assembly.GetCallingAssembly ();
92 Stream stream = assembly.GetManifestResourceStream ("mono-ecma-css.xsl");
93 XmlReader xml_reader = new XmlTextReader (stream);
94 XmlResolver r = new ManifestResourceResolver (".");
95 ecma_transform.Load (xml_reader, XsltSettings.TrustedXslt, r);
99 public class ExtensionObject
103 public string Colorize(string code, string lang)
105 return Mono.Utilities.Colorizer.Colorize(code,lang);
108 // Used by stylesheet to nicely reformat the <see cref=> tags.
109 public string MakeNiceSignature(string sig, string contexttype)
117 sig = sig.Substring(2);
120 case 'N': return sig;
121 case 'T': return ShortTypeName (sig, contexttype);
123 case 'C': case 'M': case 'P': case 'F': case 'E':
124 string type, mem, arg;
128 if (s == 'C' || s == 'M')
129 paren = sig.IndexOf("(");
131 paren = sig.IndexOf("[");
135 if (paren > 0 && paren < sig.Length-1) {
136 string[] args = sig.Substring(paren+1, sig.Length-paren-2).Split(',');
137 for (int i = 0; i < args.Length; i++)
138 args[i] = ShortTypeName(args[i], contexttype);
139 arg = "(" + String.Join(", ", args) + ")";
140 sig = sig.Substring(0, paren);
145 // Get type and member names
146 int dot = sig.LastIndexOf(".");
147 if (s == 'C' || dot <= 0 || dot == sig.Length-1) {
151 type = sig.Substring(0, dot);
152 mem = sig.Substring(dot);
155 type = ShortTypeName(type, contexttype);
157 return type + mem + arg;
164 static string ShortTypeName(string name, string contexttype)
166 int dot = contexttype.LastIndexOf(".");
167 if (dot < 0) return name;
168 string contextns = contexttype.Substring(0, dot+1);
170 if (name == contexttype)
171 return name.Substring(dot+1);
173 if (name.StartsWith(contextns))
174 return name.Substring(contextns.Length);
176 return name.Replace("+", ".");
179 string MonoImpInfo(string assemblyname, string typename, string membername, string arglist, bool strlong)
184 var a = new List<string> ();
185 if (!string.IsNullOrEmpty (arglist)) a.Add (arglist);
186 return MonoImpInfo(assemblyname, typename, membername, a, strlong);
189 string MonoImpInfo(string assemblyname, string typename, string membername, XPathNodeIterator itr, bool strlong)
194 var rgs = itr.Cast<XPathNavigator> ().Select (nav => nav.Value).ToList ();
196 return MonoImpInfo (assemblyname, typename, membername, rgs, strlong);
199 string MonoImpInfo(string assemblyname, string typename, string membername, List<string> arglist, bool strlong)
202 System.Reflection.Assembly assembly = null;
205 assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
206 } catch (Exception) {
210 if (assembly == null) {
211 /*if (strlong) return "The assembly " + assemblyname + " is not available to MonoDoc.";
212 else return string.Empty;*/
213 return string.Empty; // silently ignore
216 Type t = assembly.GetType(typename, false);
219 return typename + " has not been implemented.";
221 return "Not implemented.";
224 // The following code is flakey and fails to find existing members
226 } catch (Exception) {
231 string MonoImpInfo(System.Reflection.MemberInfo mi, string itemtype, bool strlong)
236 string s = string.Empty;
238 object[] atts = mi.GetCustomAttributes(true);
240 foreach (object att in atts) if (att.GetType().Name == "MonoTODOAttribute") todoctr++;
244 s = "This " + itemtype + " is marked as being unfinished.<BR/>\n";
252 public string MonoImpInfo(string assemblyname, string typename, bool strlong)
258 if (assemblyname == string.Empty)
261 var assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
262 if (assembly == null)
265 Type t = assembly.GetType(typename, false);
268 return typename + " has not been implemented.";
270 return "Not implemented.";
273 string s = MonoImpInfo(t, "type", strlong);
276 var mis = t.GetMembers (BF.Static | BF.Instance | BF.Public | BF.NonPublic);
278 // Scan members for MonoTODO attributes
280 foreach (var mi in mis) {
281 string mii = MonoImpInfo(mi, null, false);
282 if (mii != string.Empty) mctr++;
285 s += "This type has " + mctr + " members that are marked as unfinished.<BR/>";
291 } catch (Exception) {
296 public bool MonoEditing ()
301 public bool IsToBeAdded(string text)
303 return text.StartsWith ("To be added");