Contenidos de ManPage.cs using System; using System.IO; using System.Text; using ICSharpCode.SharpZipLib.GZip; namespace SuperMan { public class ManPage { int mannumber; string manname, mancontent; public int PageNumber { get { return mannumber; } } public string PageName { get { return manname; } } public string Content { get { return mancontent; } } public ManPage (string ManFile) { /* * We get the man page number and the name of the man page * the manpage filename format is manpagename.manpagenumber * */ string file = Path.GetFileNameWithoutExtension (ManFile); int dotIndex = file.LastIndexOf ('.'); manname = file.Substring (0, dotIndex); mannumber = int.Parse (file.Substring (dotIndex + 1)); /* * TODO: If the file it's not gziped just read the file * */ GZipInputStream GZipStream = new GZipInputStream (File.OpenRead (ManFile)); int BytesReaded; Decoder UTF8Decoder = Encoding.UTF8.GetDecoder(); StringBuilder ManBuilder = new StringBuilder(); do { byte[] Chunk = new byte[2048]; BytesReaded = GZipStream.Read (Chunk, 0, Chunk.Length); char[] ManPiece = new char[UTF8Decoder.GetCharCount (Chunk, 0, BytesReaded)]; UTF8Decoder.GetChars (Chunk, 0, BytesReaded, ManPiece, 0); ManBuilder.Append (ManPiece); } while (BytesReaded > 0); mancontent = ManBuilder.ToString(); } } } Contenido de MainWindow.cs using System; using Gtk; namespace SuperMan { public class MainWindow : Window { public static void Main (string[] args) { Application.Init(); new MainWindow (new ManPage (args[0])); Application.Run(); } void OnDelete (object sender, DeleteEventArgs args) { Application.Quit(); } public MainWindow (ManPage page) : base ("SuperMan") { DeleteEvent += new DeleteEventHandler (OnDelete); VBox caja = new VBox(); Label label = new Label (); label.Markup = "Nombre: " + page.PageName; caja.PackStart (label, false, false, 5); label = new Label (); label.Markup = "Pagina: " + page.PageNumber; caja.PackStart (label, false, false, 5); TextView tview = new TextView (); tview.Editable = false; string[] ManLines = page.Content.Split ('\n'); int startOffset, endOffset; startOffset = endOffset = 0; for (int i = 0; i < ManLines.Length; i++) { string Line = ManLines[i]; Line = Line.Replace ("\\-", "-"); if (Line.StartsWith (".\\\"")) continue; if (Line.StartsWith (".B ")) { TextTag tag = InsertTextAndTagToBuffer (tview.Buffer, Line.Substring (3), ref startOffset, ref endOffset); Pango.FontDescription fdesc = new Pango.FontDescription (); fdesc.Weight = Pango.Weight.Bold; tag.FontDesc = fdesc; } else if (Line.StartsWith (".I ")) { TextTag tag = InsertTextAndTagToBuffer (tview.Buffer, Line.Substring (3), ref startOffset, ref endOffset); tag.Style = Pango.Style.Italic; } else tview.Buffer.InsertAtCursor (Line + "\n"); } ScrolledWindow tviews = new ScrolledWindow (); tviews.Add (tview); caja.PackStart (tviews, true, true, 0); Add (caja); ShowAll (); } TextTag InsertTextAndTagToBuffer (TextBuffer buffer, string Text, ref int startOffset, ref int endOffset) { startOffset = buffer.EndIter.Offset; buffer.InsertAtCursor (Text); endOffset = buffer.EndIter.Offset; buffer.InsertAtCursor ("\n"); TextTag tag = new TextTag (startOffset.ToString ()); buffer.TagTable.Add (tag); TextIter StartIter = buffer.GetIterAtOffset (startOffset); TextIter EndIter = buffer.GetIterAtOffset (endOffset); buffer.ApplyTag (tag, StartIter, EndIter); return tag; } } }