Make it work again
[mono.git] / web / web / render-team-page.cs
1 //
2 // RenderTeamPage.cs - Renders an HTML page with team member information from an XML file
3 //
4 // Author: Duncan Mak (duncan@ximian.com)
5 //
6 // (C) Copyright 2003, Ximian Inc.
7 //
8
9 using System;
10 using System.Collections;
11 using System.IO;
12 using System.Text;
13 using System.Xml;
14
15 class Write {
16
17         static Contributor [] list;
18         static public XmlNamespaceManager nsmgr;
19
20         static void Main (string [] args)
21         {
22                 if (args.Length != 2) {
23                         Console.WriteLine ("write.exe <input.xml> <output.html>");
24                         Environment.Exit (0);
25                 }
26
27                 string input = args [0];
28                 string output = args [1];
29                 XmlDocument document = new XmlDocument ();
30                 document.Load (input);
31
32                 nsmgr = new XmlNamespaceManager (document.NameTable);
33                 nsmgr.AddNamespace ("t", "http://go-mono.org/team.xsd");
34                 XmlNodeList contributors = document.SelectNodes ("/t:contributors/t:contributor", nsmgr);
35                 list = new Contributor [contributors.Count];
36
37                 Page p = new Page ();
38
39                 int count = 0;
40                 foreach (XmlNode n in contributors) {
41                         list [count] = new Contributor (n, p.Document);
42                         count ++;
43                 }
44
45                 Array.Sort (list, new ContributorComparer ());
46
47                 int length = list.Length % 2 == 0 ? list.Length : list.Length + 1;
48
49                 int i = 0;
50                 while (i < length) {
51                         try {
52                                 p.AddRow (list [i].RenderHtml (), list [i + 1].RenderHtml ());
53                         } catch (IndexOutOfRangeException) {
54                                 p.AddRow (list [i].RenderHtml (), null);
55                         }
56                         i += 2;
57                 }
58
59                 p.Write (output);
60         }
61 }
62
63 public class ContributorComparer : IComparer
64 {
65         public int Compare (object x, object y)
66         {
67                 return String.Compare (x as string , y as string);
68         }
69 }
70
71 class Contributor {
72
73         public Name name;
74         public string email;
75         public string image;
76         public string location;
77         public string organization;
78         public string description;
79         public string[] tasks;
80
81         public XmlDocument document;
82
83         public Contributor (XmlNode node, XmlDocument document)
84         {
85
86                 name         = GetName (node);
87                 image        = GetImage (node);
88                 email        = GetField (node, "t:e-mail");
89                 location     = GetField (node, "t:location");
90                 organization = GetField (node, "t:organization");
91                 description  = GetField (node, "t:description");
92                 tasks        = GetTasks (node);
93
94                 this.document = document;
95         }
96
97         public override string ToString ()
98         {
99                 return name.ToString ();
100         }
101
102         public static string GetImage (XmlNode node)
103         {
104                 string result = GetField (node, "t:image");
105
106                 if (result == String.Empty)
107                         return "none.png";
108
109                 else
110                         return result;
111         }
112
113         public static string GetField (XmlNode node, string selector)
114         {
115                 XmlNode result = node.SelectSingleNode (selector, Write.nsmgr);
116
117                 if (result == null)
118                         return String.Empty;
119
120                 return result.InnerText;
121         }
122
123         public static Name GetName (XmlNode node)
124         {
125                 string first_name = GetField (node, "t:name/t:first-name");
126                 string last_name = GetField (node, "t:name/t:last-name");
127
128                 return new Name (first_name, last_name);
129         }
130
131         public static string [] GetTasks (XmlNode node)
132         {
133                 XmlNodeList nodes = node.SelectNodes ("t:tasks/t:task", Write.nsmgr);
134
135                 string [] result = new string [nodes.Count];
136
137                 int i = 0;
138                 foreach (XmlNode n in nodes) {
139                         result [i] = n.InnerText;
140
141                         i++;
142                 }
143
144                 return result;
145         }
146
147         public XmlElement RenderHtml ()
148         {
149                 XmlElement root = document.CreateElement ("TD");
150                 XmlElement table = document.CreateElement ("TABLE");
151                 table.SetAttribute ("width", "100%");
152                 XmlElement tr = document.CreateElement ("TR");
153                 XmlElement td = document.CreateElement ("TD");
154                 td.SetAttribute ("bgcolor", "#c3cda7");
155                 td.SetAttribute ("valign", "top");
156                 tr.AppendChild (td);
157                 table.AppendChild (tr);
158                 root.AppendChild (table);
159
160                 XmlElement img = document.CreateElement ("IMG");
161                 img.SetAttribute ("align", "top");
162                 img.SetAttribute ("border", "0");
163                 img.SetAttribute ("height", "48");
164                 img.SetAttribute ("width", "48");
165                 img.SetAttribute ("src", "team/" + image);
166                 td.AppendChild (img);
167
168                 td = document.CreateElement ("TD");
169                 td.SetAttribute ("bgcolor", "#c3cda7");
170                 td.SetAttribute ("valign", "bottom");
171                 tr.AppendChild (td);
172
173                 td.AppendChild (name.ToXml (document));
174                 td.AppendChild (document.CreateElement ("BR"));
175                 td.AppendChild (RenderEmail ());
176
177                 tr = document.CreateElement ("TR");
178                 table.AppendChild (tr);
179                 td = document.CreateElement ("TD");
180                 td.SetAttribute ("bgcolor", "#f5f8e4");
181                 td.SetAttribute ("valign", "top");
182                 tr.AppendChild (td);
183                 td.AppendChild (RenderLabel ("Location: "));
184
185                 td = document.CreateElement ("TD");
186                 td.SetAttribute ("bgcolor", "#f5f8e4");
187                 td.SetAttribute ("valign", "top");
188                 tr.AppendChild (td);
189                 td.AppendChild (document.CreateTextNode (location));
190
191                 tr = document.CreateElement ("TR");
192                 table.AppendChild (tr);
193                 td = document.CreateElement ("TD");
194                 td.SetAttribute ("bgcolor", "#f5f8e4");
195                 td.SetAttribute ("valign", "top");
196                 tr.AppendChild (td);
197                 td.AppendChild (RenderLabel ("Description: "));
198
199                 td = document.CreateElement ("TD");
200                 td.SetAttribute ("bgcolor", "#f5f8e4");
201                 td.SetAttribute ("valign", "top");
202                 tr.AppendChild (td);
203                 td.AppendChild (document.CreateTextNode (description));
204
205                 tr = document.CreateElement ("TR");
206                 table.AppendChild (tr);
207                 td = document.CreateElement ("TD");
208                 td.SetAttribute ("bgcolor", "#f5f8e4");
209                 td.SetAttribute ("valign", "top");
210                 tr.AppendChild (td);
211                 td.AppendChild (RenderLabel ("Tasks: "));
212
213                 td = document.CreateElement ("TD");
214                 td.SetAttribute ("bgcolor", "#f5f8e4");
215                 td.SetAttribute ("valign", "top");
216                 tr.AppendChild (td);
217                 td.AppendChild (RenderTasks ());
218
219                 return root;
220         }
221
222         public XmlNode RenderTasks ()
223         {
224
225                 XmlElement element = document.CreateElement ("OL");
226                 element.SetAttribute ("type", "I");
227
228                 foreach (string task in tasks) {
229                         XmlElement li = document.CreateElement ("LI");
230                         li.AppendChild (document.CreateTextNode (task));
231                         element.AppendChild (li);
232                 }
233
234                 return element;
235         }
236
237         public XmlNode RenderEmail ()
238         {
239                 XmlElement a = document.CreateElement ("A");
240                 a.SetAttribute ("href", "mailto:" + email);
241                 XmlElement font = document.CreateElement ("FONT");
242                 font.SetAttribute ("size", "3");
243                 XmlText t = document.CreateTextNode (email);
244                 a.AppendChild (font);
245                 font.AppendChild (t);
246
247                 return a;
248         }
249
250         public XmlNode RenderLabel (string label)
251         {
252                 string text = String.Format ("{0}: ", label);
253                 XmlElement element = document.CreateElement ("B");
254                 XmlText t = document.CreateTextNode (label );
255                 element.AppendChild (t);
256
257                 return element;
258         }
259 }
260
261 class Page {
262
263         XmlDocument document;
264         XmlElement tbody;
265
266         public Page ()
267         {
268                 document = new XmlDocument ();
269
270                 XmlElement table = document.CreateElement ("TABLE");
271                 document.AppendChild (table);
272
273                 tbody = document.CreateElement ("TBODY");
274                 table.AppendChild (tbody);
275         }
276
277         public XmlDocument Document {
278                 get { return document; }
279         }
280
281         public void AddRow (XmlNode left, XmlNode right)
282         {
283                 if (left == null && right == null)
284                         return;
285
286                 XmlElement tr = document.CreateElement ("TR");
287                 tbody.AppendChild (tr);
288                 tr.AppendChild (left);
289
290                 if (right == null)
291                         tr.AppendChild (document.CreateElement ("TD"));
292                 else {
293                         tr.SetAttribute ("valign", "top");
294                         tr.AppendChild (right);
295                 }
296         }
297
298         public void Write (TextWriter text_writer)
299         {
300                 XmlTextWriter writer = new XmlTextWriter (text_writer);
301                 writer.Formatting = Formatting.Indented;
302
303                 document.WriteContentTo (writer);
304
305                 writer.Flush ();
306         }
307
308         public void Write (string filename)
309         {
310                 XmlTextWriter writer = new XmlTextWriter (filename, Encoding.Default);
311                 writer.Formatting = Formatting.Indented;
312
313                 document.WriteContentTo (writer);
314                 writer.Flush ();
315         }
316 }
317
318
319 class Name {
320
321         string first_name;
322         string last_name;
323
324         public Name (string a, string b)
325         {
326                 this.first_name = a;
327                 this.last_name = b;
328         }
329
330         public override string ToString ()
331         {
332                 if (first_name == null && last_name == null)
333                         return String.Empty;
334
335                 return first_name + " " + last_name;
336         }
337
338         public XmlNode ToXml (XmlDocument document)
339         {
340                 XmlElement element = document.CreateElement ("FONT");
341                 element.SetAttribute ("size", "3");
342                 XmlElement b = document.CreateElement ("B");
343                 XmlText t = document.CreateTextNode (ToString ());
344                 b.AppendChild (t);
345                 element.AppendChild (b);
346
347                 return element;
348         }
349 }