You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // A provider to display man pages
 | |
| //
 | |
| // Authors:
 | |
| //   Johannes Roith <johannes@roith.de>
 | |
| //   Jonathan Pryor <jpryor@novell.com>
 | |
| //
 | |
| // (C) 2008 Novell, Inc.
 | |
| 
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Text;
 | |
| using System.Xml;
 | |
| using System.Linq;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| namespace Monodoc.Providers
 | |
| {
 | |
| 	public class ManProvider : Provider
 | |
| 	{
 | |
| 		string[] tocFiles;
 | |
| 	
 | |
| 		public ManProvider (string[] handbookTocFiles)
 | |
| 		{
 | |
| 			tocFiles = handbookTocFiles;
 | |
| 
 | |
| 			// huh...
 | |
| 			if (!File.Exists (tocFiles[0]))
 | |
| 				throw new FileNotFoundException (String.Format ("The table of contents, `{0}' does not exist", tocFiles[0]));
 | |
| 		}
 | |
| 
 | |
| 		public override void PopulateTree (Tree tree)
 | |
| 		{
 | |
| 			foreach(string TocFile in tocFiles) {
 | |
| 				XmlDocument doc = new XmlDocument();
 | |
| 				doc.Load (TocFile);
 | |
| 
 | |
| 				XmlNodeList nodeList = doc.GetElementsByTagName("manpage");
 | |
| 				Node nodeToAddChildrenTo = tree.RootNode;
 | |
| 				var storage = nodeToAddChildrenTo.Tree.HelpSource.Storage;
 | |
| 
 | |
| 				foreach (XmlNode node in nodeList) {
 | |
| 
 | |
| 					XmlAttribute name = node.Attributes["name"];
 | |
| 					XmlAttribute page = node.Attributes["page"];
 | |
| 
 | |
| 					if (name == null || page == null) continue;
 | |
| 
 | |
| 					if (!File.Exists (page.Value))
 | |
| 						continue;
 | |
| 
 | |
| 					string target = "man:" + name.Value;
 | |
| 					nodeToAddChildrenTo.CreateNode (name.Value, target);
 | |
| 
 | |
| 					if (File.Exists (page.Value))
 | |
| 						using (var file = File.OpenRead (page.Value))
 | |
| 							storage.Store (name.Value, file);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public override void CloseTree (HelpSource hs, Tree tree)
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public class ManHelpSource : HelpSource
 | |
| 	{
 | |
| 		const string ManPrefix = "man:";
 | |
| 		Dictionary<string, Node> nodesMap;
 | |
| 
 | |
| 		public ManHelpSource (string base_file, bool create) : base (base_file, create)
 | |
| 		{
 | |
| 			nodesMap = Tree.RootNode.ChildNodes.ToDictionary (n => n.Element);
 | |
| 		}
 | |
| 
 | |
| 		// Since man always has a flat tree and rather small amount of item
 | |
| 		// we store them in a dictionary
 | |
| 		public override Node MatchNode (string url)
 | |
| 		{
 | |
| 			Node result;
 | |
| 			return nodesMap.TryGetValue (url, out result) ? result : null;
 | |
| 		}
 | |
| 
 | |
| 		public override DocumentType GetDocumentTypeForId (string id)
 | |
| 		{
 | |
| 			return id == "root:" ? DocumentType.TocXml : DocumentType.Man;
 | |
| 		}
 | |
| 
 | |
| 		public override bool IsGeneratedContent (string id)
 | |
| 		{
 | |
| 			return id == "root:";
 | |
| 		}
 | |
| 	
 | |
| 		public override string GetText (string url)
 | |
| 		{
 | |
| 			return TreeDumper.ExportToTocXml (Tree.RootNode, "Mono Documentation Library", "Available man pages:");
 | |
| 		}
 | |
| 
 | |
| 		protected override string UriPrefix {
 | |
| 			get {
 | |
| 				return ManPrefix;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |