3
3
require 'open-uri'
4
4
5
5
module Jekyll
6
- class OpenSearchSuggestions < Liquid ::Tag
7
- def initialize ( tag_name , text , tokens )
8
- super
9
- @search_term = text . strip
10
- end
6
+ class OpenSearchSuggestionsGenerator < Generator
7
+ safe true
8
+ priority :low
11
9
12
- def render ( context )
13
- site = context . registers [ :site ]
14
-
15
- # Use the site's URL from _config.yml
16
- site_url = site . config [ 'url' ]
17
- sitemap_url = "#{ site_url } /sitemap.xml"
18
-
19
- debug_info = {
20
- search_term : @search_term ,
21
- sitemap_url : sitemap_url
22
- }
10
+ def generate ( site )
11
+ sitemap_url = "#{ site . config [ 'url' ] } /sitemap.xml"
23
12
24
13
begin
25
14
sitemap = URI . open ( sitemap_url ) . read
26
15
doc = Nokogiri ::XML ( sitemap )
27
16
28
17
urls = doc . xpath ( '//xmlns:url/xmlns:loc' ) . map ( &:text )
29
- debug_info [ :total_urls ] = urls . length
30
18
31
- matches = urls . select { |url | url . downcase . include? ( @search_term . downcase ) }
32
- debug_info [ :matches ] = matches
33
-
34
- suggestions = matches . map do |url |
19
+ suggestions = urls . map do |url |
35
20
title = url . split ( '/' ) . last . gsub ( '-' , ' ' ) . capitalize
36
21
[ title , url ]
37
22
end
38
-
39
- result = [ @search_term , suggestions . map ( &:first ) , suggestions . map ( &:last ) , debug_info ]
40
- result . to_json
23
+
24
+ site . pages << OpenSearchSuggestionsPage . new ( site , site . source , "" , "opensearch.json" , suggestions )
41
25
rescue OpenURI ::HTTPError => e
42
- { error : "Failed to fetch sitemap: #{ e . message } " , debug_info : debug_info } . to_json
26
+ Jekyll . logger . error "OpenSearchSuggestionsGenerator:" , "Failed to fetch sitemap: #{ e . message } "
43
27
rescue StandardError => e
44
- { error : "An error occurred: #{ e . message } " , debug_info : debug_info } . to_json
28
+ Jekyll . logger . error "OpenSearchSuggestionsGenerator:" , "An error occurred: #{ e . message } "
45
29
end
46
30
end
47
31
end
48
- end
49
32
50
- Liquid ::Template . register_tag ( 'opensearch_suggestions' , Jekyll ::OpenSearchSuggestions )
33
+ class OpenSearchSuggestionsPage < Page
34
+ def initialize ( site , base , dir , name , suggestions )
35
+ @site = site
36
+ @base = base
37
+ @dir = dir
38
+ @name = name
39
+
40
+ self . process ( name )
41
+ self . data = { }
42
+
43
+ self . content = <<-EOS
44
+ function getOpenSearchSuggestions(query) {
45
+ query = query.toLowerCase();
46
+ var suggestions = #{ suggestions . to_json } ;
47
+ var matches = suggestions.filter(function(item) {
48
+ return item[0].toLowerCase().includes(query) || item[1].toLowerCase().includes(query);
49
+ });
50
+ return [query, matches.map(function(item) { return item[0]; }), matches.map(function(item) { return item[1]; })];
51
+ }
52
+ EOS
53
+ end
54
+ end
55
+ end
0 commit comments