private string BuildSearchIndex(IList <SearchIndexItem> searchIndexItems, string[] stopwords, IExecutionContext context) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < searchIndexItems.Count(); ++i) { SearchIndexItem itm = searchIndexItems.ElementAt(i); sb.AppendLine($@"a({{ id:{i}, title:{CleanString(itm.Title, stopwords)}, content:{CleanString(itm.Content, stopwords)}, description:{CleanString(itm.Description, stopwords)}, tags:'{itm.Tags}' }});"); } foreach (SearchIndexItem itm in searchIndexItems) { sb.AppendLine($@"y({{ url:'{context.GetLink(new FilePath(itm.Url), true)}', title:{ToJsonString(itm.Title)}, description:{ToJsonString(itm.Description)} }});"); } return(CreateJs(sb.ToString())); }
private StringBuilder BuildScript(IList <SearchIndexItem> searchIndexItems, string[] stopwords, IExecutionContext context) { StringBuilder scriptBuilder = new StringBuilder($@" var searchModule = function() {{ var idMap = []; function y(e) {{ idMap.push(e); }} var idx = lunr(function() {{ this.field('title', {{ boost: 10 }}); this.field('content'); this.field('description', {{ boost: 5 }}); this.field('tags', {{ boost: 50 }}); this.ref('id'); this.pipeline.remove(lunr.stopWordFilter); {(_enableStemming ? "" : "this.pipeline.remove(lunr.stemmer);")} }}); function a(e) {{ idx.add(e); }} "); for (int i = 0; i < searchIndexItems.Count; ++i) { SearchIndexItem itm = searchIndexItems.ElementAt(i); scriptBuilder.AppendLine($@" a({{ id:{i}, title:{CleanString(itm.Title, stopwords)}, content:{CleanString(itm.Content, stopwords)}, description:{CleanString(itm.Description, stopwords)}, tags:'{itm.Tags}' }});"); } foreach (SearchIndexItem itm in searchIndexItems) { scriptBuilder.AppendLine($@" y({{ url:'{context.GetLink(new FilePath(itm.Url), _includeHost)}', title:{ToJsonString(itm.Title)}, description:{ToJsonString(itm.Description)} }});"); } scriptBuilder.AppendLine($@" return {{ search: function(q) {{ return idx.search(q).map(function(i) {{ return idMap[i.ref]; }}); }} }}; }}();"); return(scriptBuilder); }