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 static XsltArgumentList args = new XsltArgumentList();
21 readonly ExtensionObject ExtObject = new ExtensionObject ();
25 args.AddExtensionObject("monodoc:///extensions", ExtObject);
29 public string CssCode {
33 var assembly = typeof(Ecma2Html).Assembly;
34 Stream str_css = assembly.GetManifestResourceStream ("mono-ecma.css");
35 css_ecma = (new StreamReader (str_css)).ReadToEnd();
40 public string JsCode {
44 var assembly = typeof(Ecma2Html).Assembly;
45 Stream str_js = assembly.GetManifestResourceStream ("helper.js");
46 js = (new StreamReader (str_js)).ReadToEnd();
51 public string Htmlize (XmlReader ecma_xml)
53 return Htmlize(ecma_xml, args);
56 public string Htmlize (XmlReader ecma_xml, XsltArgumentList args)
60 var output = new StringBuilder ();
61 ecma_transform.Transform (ecma_xml,
63 XmlWriter.Create (output, ecma_transform.OutputSettings),
64 CreateDocumentResolver ());
65 return output.ToString ();
68 string GetViewMode (string url)
73 protected virtual XmlResolver CreateDocumentResolver ()
75 // results in using XmlUrlResolver
79 public string Export (Stream stream, Dictionary<string, string> extraArgs)
81 return Htmlize (XmlReader.Create (stream));
84 public string Export (string input, Dictionary<string, string> extraArgs)
86 return Htmlize (XmlReader.Create (new StringReader (input)));
89 static void EnsureTransform ()
91 if (ecma_transform == null) {
92 ecma_transform = new XslCompiledTransform ();
93 var assembly = System.Reflection.Assembly.GetCallingAssembly ();
95 Stream stream = assembly.GetManifestResourceStream ("mono-ecma-css.xsl");
96 XmlReader xml_reader = new XmlTextReader (stream);
97 XmlResolver r = new ManifestResourceResolver (".");
98 ecma_transform.Load (xml_reader, XsltSettings.TrustedXslt, r);
102 public class ExtensionObject
106 public string Colorize(string code, string lang)
108 return Mono.Utilities.Colorizer.Colorize(code,lang);
111 // Used by stylesheet to nicely reformat the <see cref=> tags.
112 public string MakeNiceSignature(string sig, string contexttype)
120 sig = sig.Substring(2);
123 case 'N': return sig;
124 case 'T': return ShortTypeName (sig, contexttype);
126 case 'C': case 'M': case 'P': case 'F': case 'E':
127 string type, mem, arg;
131 if (s == 'C' || s == 'M')
132 paren = sig.IndexOf("(");
134 paren = sig.IndexOf("[");
138 if (paren > 0 && paren < sig.Length-1) {
139 string[] args = sig.Substring(paren+1, sig.Length-paren-2).Split(',');
140 for (int i = 0; i < args.Length; i++)
141 args[i] = ShortTypeName(args[i], contexttype);
142 arg = "(" + String.Join(", ", args) + ")";
143 sig = sig.Substring(0, paren);
148 // Get type and member names
149 int dot = sig.LastIndexOf(".");
150 if (s == 'C' || dot <= 0 || dot == sig.Length-1) {
154 type = sig.Substring(0, dot);
155 mem = sig.Substring(dot);
158 type = ShortTypeName(type, contexttype);
160 return type + mem + arg;
167 static string ShortTypeName(string name, string contexttype)
169 int dot = contexttype.LastIndexOf(".");
170 if (dot < 0) return name;
171 string contextns = contexttype.Substring(0, dot+1);
173 if (name == contexttype)
174 return name.Substring(dot+1);
176 if (name.StartsWith(contextns))
177 return name.Substring(contextns.Length);
179 return name.Replace("+", ".");
182 string MonoImpInfo(string assemblyname, string typename, string membername, string arglist, bool strlong)
187 var a = new List<string> ();
188 if (!string.IsNullOrEmpty (arglist)) a.Add (arglist);
189 return MonoImpInfo(assemblyname, typename, membername, a, strlong);
192 string MonoImpInfo(string assemblyname, string typename, string membername, XPathNodeIterator itr, bool strlong)
197 var rgs = itr.Cast<XPathNavigator> ().Select (nav => nav.Value).ToList ();
199 return MonoImpInfo (assemblyname, typename, membername, rgs, strlong);
202 string MonoImpInfo(string assemblyname, string typename, string membername, List<string> arglist, bool strlong)
205 System.Reflection.Assembly assembly = null;
208 assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
209 } catch (Exception) {
213 if (assembly == null) {
214 /*if (strlong) return "The assembly " + assemblyname + " is not available to MonoDoc.";
215 else return string.Empty;*/
216 return string.Empty; // silently ignore
219 Type t = assembly.GetType(typename, false);
222 return typename + " has not been implemented.";
224 return "Not implemented.";
227 // The following code is flakey and fails to find existing members
229 } catch (Exception) {
234 string MonoImpInfo(System.Reflection.MemberInfo mi, string itemtype, bool strlong)
239 string s = string.Empty;
241 object[] atts = mi.GetCustomAttributes(true);
243 foreach (object att in atts) if (att.GetType().Name == "MonoTODOAttribute") todoctr++;
247 s = "This " + itemtype + " is marked as being unfinished.<BR/>\n";
255 public string MonoImpInfo(string assemblyname, string typename, bool strlong)
261 if (assemblyname == string.Empty)
264 var assembly = System.Reflection.Assembly.LoadWithPartialName(assemblyname);
265 if (assembly == null)
268 Type t = assembly.GetType(typename, false);
271 return typename + " has not been implemented.";
273 return "Not implemented.";
276 string s = MonoImpInfo(t, "type", strlong);
279 var mis = t.GetMembers (BF.Static | BF.Instance | BF.Public | BF.NonPublic);
281 // Scan members for MonoTODO attributes
283 foreach (var mi in mis) {
284 string mii = MonoImpInfo(mi, null, false);
285 if (mii != string.Empty) mctr++;
288 s += "This type has " + mctr + " members that are marked as unfinished.<BR/>";
294 } catch (Exception) {
299 public bool MonoEditing ()
304 public bool IsToBeAdded(string text)
306 return text.StartsWith ("To be added");