using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace bytex64.WebThing { public class SearchHandler { WebThing wt; Dictionary Handlers; ISearchPlugin DefaultSearchHandler; public SearchHandler(WebThing wt) { Handlers = new Dictionary(); this.wt = wt; foreach (SearchHandlerPair p in Config.SearchHandlers) { AddHandler(p.Shortcut, p.Plugin); } if (Config.DefaultSearchHandler != null) { SetDefaultHandler(Config.DefaultSearchHandler); } } private bool IsValidSearchHandler(WebThingPlugin p) { Type ptype = p.GetType(); if (ptype.GetInterface("ISearchPlugin") != null) return true; return false; } public void AddHandler(string key, string plugin) { if (Handlers.ContainsKey(key)) { Console.WriteLine("Cannot add search handler {0}: shortcut {1} already registered", plugin, key); return; } if (!wt.Plugins.Plugins.ContainsKey(plugin)) { Console.WriteLine("Cannot add search handler {0}: Plugin for {0} not loaded", plugin); return; } WebThingPlugin p = wt.Plugins.Plugins[plugin]; if (IsValidSearchHandler(p)) { Handlers[key] = (ISearchPlugin) p; Console.WriteLine("Added handler {0} for key {1}", plugin, key); } else { Console.WriteLine("Cannot add search handler {0}: {0} Does not implement ISearchPlugin", plugin); } } public void SetDefaultHandler(string plugin) { if (wt.Plugins.Plugins.ContainsKey(plugin)) { WebThingPlugin p = wt.Plugins.Plugins[plugin]; if (IsValidSearchHandler(p)) { DefaultSearchHandler = (ISearchPlugin) p; } else { Console.WriteLine("Could not set default search handler: {0} does not implement ISearchPlugin", plugin); } } else { Console.WriteLine("Could not set default search handler: {0} is not loaded", plugin); } } // Call a search handler based on the leading word public string Transform(string search) { Regex get_handler_re = new Regex(@"^([\w-]+)\s+"); Match m = get_handler_re.Match(search); if (m.Success) { string key = m.Groups[1].Value; string query = get_handler_re.Replace(search, ""); if (Handlers.ContainsKey(key)) { return Handlers[key].SearchTransform(query); } else { if (DefaultSearchHandler != null) { return DefaultSearchHandler.SearchTransform(search); } else { Console.WriteLine("Could not search with {0} and no default search handler defined", key); return null; } } } else { if (DefaultSearchHandler != null) { return DefaultSearchHandler.SearchTransform(search); } else { Console.WriteLine("Could not get search key and no default search handler defined"); return null; } } } } }