// // Create list of documents for searching // public override void PopulateSearchableIndex (IndexWriter writer) { StringBuilder text; foreach (Node ns_node in Tree.Nodes) { Message (TraceLevel.Info, "\tNamespace: {0} ({1})", ns_node.Caption, ns_node.Nodes.Count); foreach (Node type_node in ns_node.Nodes) { string typename = type_node.Caption.Substring (0, type_node.Caption.IndexOf (' ')); string full = ns_node.Caption + "." + typename; string doc_tag = GetKindFromCaption (type_node.Caption); string url = "T:" + full; string rest; XmlDocument xdoc = GetXmlFromUrl (type_node.URL, out rest); if (xdoc == null) continue; // // For classes, structures or interfaces add a doc for the overview and // add a doc for every constructor, method, event, ... // if (doc_tag == "Class" || doc_tag == "Structure" || doc_tag == "Interface"){ // Adds a doc for every overview of every type SearchableDocument doc = new SearchableDocument (); doc.title = type_node.Caption; doc.hottext = typename; doc.url = url; XmlNode node_sel = xdoc.SelectSingleNode ("/Type/Docs"); text = new StringBuilder (); GetTextFromNode (node_sel, text); doc.text = text.ToString (); text = new StringBuilder (); GetExamples (node_sel, text); doc.examples = text.ToString (); writer.AddDocument (doc.LuceneDoc); //Add docs for contructors, methods, etc. foreach (Node c in type_node.Nodes) { // c = Constructors || Fields || Events || Properties || Methods || Operators if (c.Element == "*") continue; int i = 1; foreach (Node nc in c.Nodes) { //xpath to the docs xml node string xpath; if (c.Caption == "Constructors") xpath = String.Format ("/Type/Members/Member[{0}]/Docs", i++); else if (c.Caption == "Operators") xpath = String.Format ("/Type/Members/Member[@MemberName='op_{0}']/Docs", nc.Caption); else xpath = String.Format ("/Type/Members/Member[@MemberName='{0}']/Docs", nc.Caption); //construct url of the form M:Array.Sort string urlnc; if (c.Caption == "Constructors") urlnc = String.Format ("{0}:{1}.{2}", c.Caption[0], ns_node.Caption, nc.Caption); else urlnc = String.Format ("{0}:{1}.{2}.{3}", c.Caption[0], ns_node.Caption, typename, nc.Caption); //create the doc SearchableDocument doc_nod = new SearchableDocument (); doc_nod.title = LargeName (nc); //dont add the parameters to the hottext int ppos = nc.Caption.IndexOf ('('); if (ppos != -1) doc_nod.hottext = nc.Caption.Substring (0, ppos); else doc_nod.hottext = nc.Caption; doc_nod.url = urlnc; XmlNode xmln = xdoc.SelectSingleNode (xpath); if (xmln == null) { Error ("Problem: {0}, with xpath: {1}", urlnc, xpath); continue; } text = new StringBuilder (); GetTextFromNode (xmln, text); doc_nod.text = text.ToString (); text = new StringBuilder (); GetExamples (xmln, text); doc_nod.examples = text.ToString (); writer.AddDocument (doc_nod.LuceneDoc); } } // // Enumerations: add the enumeration values // } else if (doc_tag == "Enumeration"){ XmlNodeList members = xdoc.SelectNodes ("/Type/Members/Member"); if (members == null) continue; text = new StringBuilder (); foreach (XmlNode member_node in members) { string enum_value = member_node.Attributes ["MemberName"].InnerText; text.Append (enum_value); text.Append (" "); GetTextFromNode (member_node["Docs"], text); text.Append ("\n"); } SearchableDocument doc = new SearchableDocument (); text = new StringBuilder (); GetExamples (xdoc.SelectSingleNode ("/Type/Docs"), text); doc.examples = text.ToString (); doc.title = type_node.Caption; doc.hottext = xdoc.DocumentElement.Attributes["Name"].Value; doc.url = url; doc.text = text.ToString(); writer.AddDocument (doc.LuceneDoc); // // Add delegates // } else if (doc_tag == "Delegate"){ SearchableDocument doc = new SearchableDocument (); doc.title = type_node.Caption; doc.hottext = xdoc.DocumentElement.Attributes["Name"].Value; doc.url = url; XmlNode node_sel = xdoc.SelectSingleNode ("/Type/Docs"); text = new StringBuilder (); GetTextFromNode (node_sel, text); doc.text = text.ToString(); text = new StringBuilder (); GetExamples (node_sel, text); doc.examples = text.ToString(); writer.AddDocument (doc.LuceneDoc); } } } }
void AddDocuments (IndexWriter writer, Node node) { string url = node.URL; Stream file_stream = GetHelpStream (url.Substring (9)); if (file_stream == null) //Error return; XmlDocument xdoc = new XmlDocument (); xdoc.Load (new XmlTextReader (file_stream)); //Obtain the title XmlNode nelem = xdoc.DocumentElement; string title = nelem.Attributes["number"].Value + ": " + nelem.Attributes["title"].Value; //Obtain the text StringBuilder s = new StringBuilder (); GetTextNode (nelem, s); string text = s.ToString (); //Obatin the examples StringBuilder s2 = new StringBuilder (); GetExamples (nelem, s2); string examples = s2.ToString (); //Write to the Lucene Index all the parts SearchableDocument doc = new SearchableDocument (); doc.title = title; doc.hottext = title.Substring (title.IndexOf (':')); doc.url = url; doc.text = text; doc.examples = examples; writer.AddDocument (doc.LuceneDoc); if (node.IsLeaf) return; foreach (Node n in node.Nodes) AddDocuments (writer, n); }