New test.
[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.ToString (), y.ToString ());
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 ("cellPadding", "0");
152                 table.SetAttribute ("border", "0");
153                 XmlElement tr = document.CreateElement ("tr");
154                 XmlElement td = document.CreateElement ("td");
155                 td.SetAttribute ("bgcolor", "#c3cda7");
156                 td.SetAttribute ("valign", "top");
157                 td.SetAttribute ("width", "1%");
158                 tr.AppendChild (td);
159                 table.AppendChild (tr);
160                 root.AppendChild (table);
161
162                 XmlElement img = document.CreateElement ("img");
163                 img.SetAttribute ("align", "top");
164                 img.SetAttribute ("border", "0");
165                 img.SetAttribute ("height", "48");
166                 img.SetAttribute ("width", "48");
167                 img.SetAttribute ("src", "team/" + image);
168                 td.AppendChild (img);
169
170                 td = document.CreateElement ("TD");
171                 td.SetAttribute ("bgcolor", "#c3cda7");
172                 td.SetAttribute ("valign", "bottom");
173                 td.SetAttribute ("width", "100%");
174                 tr.AppendChild (td);
175
176                 td.AppendChild (name.ToXml (document));
177                 td.AppendChild (document.CreateElement ("br"));
178                 td.AppendChild (RenderEmail ());
179
180                 tr = document.CreateElement ("tr");
181                 table.AppendChild (tr);
182                 td = document.CreateElement ("td");
183                 td.SetAttribute ("bgcolor", "#f5f8e4");
184                 td.SetAttribute ("valign", "top");
185                 tr.AppendChild (td);
186                 td.AppendChild (RenderLabel ("Location: "));
187
188                 td = document.CreateElement ("td");
189                 td.SetAttribute ("bgcolor", "#f5f8e4");
190                 td.SetAttribute ("valign", "top");
191                 tr.AppendChild (td);
192                 td.AppendChild (document.CreateTextNode (location));
193
194                 tr = document.CreateElement ("tr");
195                 table.AppendChild (tr);
196                 td = document.CreateElement ("td");
197                 td.SetAttribute ("bgcolor", "#f5f8e4");
198                 td.SetAttribute ("valign", "top");
199                 tr.AppendChild (td);
200                 td.AppendChild (RenderLabel ("Description: "));
201
202                 td = document.CreateElement ("td");
203                 td.SetAttribute ("bgcolor", "#f5f8e4");
204                 td.SetAttribute ("valign", "top");
205                 tr.AppendChild (td);
206                 td.AppendChild (document.CreateTextNode (description));
207
208                 tr = document.CreateElement ("tr");
209                 table.AppendChild (tr);
210                 td = document.CreateElement ("td");
211                 td.SetAttribute ("bgcolor", "#f5f8e4");
212                 td.SetAttribute ("valign", "top");
213                 tr.AppendChild (td);
214                 td.AppendChild (RenderLabel ("Tasks: "));
215
216                 td = document.CreateElement ("td");
217                 td.SetAttribute ("bgcolor", "#f5f8e4");
218                 td.SetAttribute ("valign", "top");
219                 tr.AppendChild (td);
220                 td.AppendChild (RenderTasks ());
221
222                 return root;
223         }
224
225         public XmlNode RenderTasks ()
226         {
227
228                 XmlElement element = document.CreateElement ("ol");
229                 element.SetAttribute ("type", "I");
230
231                 foreach (string task in tasks) {
232                         XmlElement li = document.CreateElement ("li");
233                         li.AppendChild (document.CreateTextNode (task));
234                         element.AppendChild (li);
235                 }
236
237                 return element;
238         }
239
240         public XmlNode RenderEmail ()
241         {
242                 XmlElement a = document.CreateElement ("a");
243                 a.SetAttribute ("href", "mailto:" + email);
244                 XmlElement font = document.CreateElement ("font");
245                 font.SetAttribute ("size", "3");
246                 XmlText t = document.CreateTextNode (email);
247                 a.AppendChild (font);
248                 font.AppendChild (t);
249
250                 return a;
251         }
252
253         public XmlNode RenderLabel (string label)
254         {
255                 string text = String.Format ("{0}: ", label);
256                 XmlElement element = document.CreateElement ("b");
257                 XmlText t = document.CreateTextNode (label );
258                 element.AppendChild (t);
259
260                 return element;
261         }
262 }
263
264 class Page {
265
266         XmlDocument document;
267         XmlElement tbody;
268
269         public Page ()
270         {
271                 document = new XmlDocument ();
272
273                 XmlElement table = document.CreateElement ("table");
274                 document.AppendChild (table);
275
276                 tbody = document.CreateElement ("tbody");
277                 table.AppendChild (tbody);
278         }
279
280         public XmlDocument Document {
281                 get { return document; }
282         }
283
284         public void AddRow (XmlNode left, XmlNode right)
285         {
286                 if (left == null && right == null)
287                         return;
288
289                 XmlElement tr = document.CreateElement ("tr");
290                 tbody.AppendChild (tr);
291                 tr.AppendChild (left);
292
293                 if (right == null)
294                         tr.AppendChild (document.CreateElement ("td"));
295                 else {
296                         tr.SetAttribute ("valign", "top");
297                         tr.AppendChild (right);
298                 }
299         }
300
301         public void Write (TextWriter text_writer)
302         {
303                 XmlTextWriter writer = new XmlTextWriter (text_writer);
304                 writer.Formatting = Formatting.Indented;
305
306                 document.WriteContentTo (writer);
307
308                 writer.Flush ();
309         }
310
311         public void Write (string filename)
312         {
313                 XmlTextWriter writer = new XmlTextWriter (filename, Encoding.Default);
314                 writer.Formatting = Formatting.Indented;
315
316                 document.WriteContentTo (writer);
317                 writer.Flush ();
318         }
319 }
320
321
322 class Name {
323
324         string first_name;
325         string last_name;
326
327         public Name (string a, string b)
328         {
329                 this.first_name = a;
330                 this.last_name = b;
331         }
332
333         public override string ToString ()
334         {
335                 if (first_name == null && last_name == null)
336                         return String.Empty;
337
338                 return first_name + " " + last_name;
339         }
340
341         public XmlNode ToXml (XmlDocument document)
342         {
343                 XmlElement element = document.CreateElement ("font");
344                 element.SetAttribute ("size", "3");
345                 XmlElement b = document.CreateElement ("B");
346                 XmlText t = document.CreateTextNode (ToString ());
347                 b.AppendChild (t);
348                 element.AppendChild (b);
349
350                 return element;
351         }
352 }