From b5439e0b253a4d790a1b39d32ff92d0152c78e5d Mon Sep 17 00:00:00 2001 From: Chris Eppstein Date: Sat, 8 May 2010 11:07:31 -0700 Subject: [PATCH] [Docs] Search the docs. Needs styling and to be wired into the search box. --- doc-src/Rules | 8 ++++ doc-src/content/search-data.js.erb | 7 +++ doc-src/content/search.haml | 28 +++++++++++ doc-src/layouts/main.haml | 1 + doc-src/lib/search.rb | 74 ++++++++++++++++++++++++++++++ 5 files changed, 118 insertions(+) create mode 100644 doc-src/content/search-data.js.erb create mode 100644 doc-src/content/search.haml create mode 100644 doc-src/lib/search.rb diff --git a/doc-src/Rules b/doc-src/Rules index 07e0549e..25875512 100644 --- a/doc-src/Rules +++ b/doc-src/Rules @@ -23,6 +23,10 @@ compile '/' do layout 'main' end +compile '/search-data/' do + filter :erb +end + compile '/examples/*/' do filter :haml, :ugly => true filter :highlight if ENV['SYNTAX'] @@ -54,6 +58,10 @@ compile '*' do layout item[:layout] || 'main' end +route '/search-data/' do + "#{SITE_ROOT}/javascripts"+item.identifier[0..-2]+".js" +end + (0..5).each do |i| route("/stylesheets/#{'*/' * i}_*/") {nil} end diff --git a/doc-src/content/search-data.js.erb b/doc-src/content/search-data.js.erb new file mode 100644 index 00000000..42fab9d4 --- /dev/null +++ b/doc-src/content/search-data.js.erb @@ -0,0 +1,7 @@ +function search(term, callback) { + var ids = index.terms[term] || index.approximate[term] || []; + var items = $.map(ids, function(id){ return index.items[id]; }); + callback(items) +} + +var index = <%= search_index.to_json %>; diff --git a/doc-src/content/search.haml b/doc-src/content/search.haml new file mode 100644 index 00000000..595c03f1 --- /dev/null +++ b/doc-src/content/search.haml @@ -0,0 +1,28 @@ +--- +title: Search | Compass Documentation +crumb: Search +body_id: search +--- +- content_for(:javascripts) do + %script(type="text/javascript" src="/docs/javascripts/search-data.js") + :javascript + $(function(){ + $('input').keypress(function(){ + search(this.value, displayResults); + }); + }) + function displayResults(items) { + if (items.length > 0) { + var html = "" + for (var i = 0; i < items.length; i++) { + html += '
  • '+items[i].title+'
  • '; + } + $('ol#results').html(html) + } else { + $('ol#results').html("
  • Nothing found.
  • "); + } + } +%input{:type => "text", :placeholder=>"Search"} + +%ol#results + %li.none Please enter a search term. \ No newline at end of file diff --git a/doc-src/layouts/main.haml b/doc-src/layouts/main.haml index ce8c8798..f88576af 100644 --- a/doc-src/layouts/main.haml +++ b/doc-src/layouts/main.haml @@ -41,4 +41,5 @@ %footer(role="contentinfo")= render "partials/footer" %script(src="/docs/javascripts/jquery-1.3.2.min.js") %script(src="/docs/javascripts/fixups.js" deferred) + = @item[:content_for_javascripts] = render "partials/analytics" diff --git a/doc-src/lib/search.rb b/doc-src/lib/search.rb new file mode 100644 index 00000000..6755b954 --- /dev/null +++ b/doc-src/lib/search.rb @@ -0,0 +1,74 @@ +require 'json' + +STOP_WORDS = %w{ + a about above across after afterwards again against all almost + alone along already also although always am among amongst amoungst + amount an and another any anyhow anyone anything anyway anywhere + are around as at back be became because become becomes becoming + been before beforehand behind being below beside besides between + beyond bill both bottom but by call can cannot cant co computer con + could couldnt cry de describe detail do done down due during each + eg eight either eleven else elsewhere empty enough etc even ever + every everyone everything everywhere except few fifteen fify fill + find fire first five for former formerly forty found four from + front full further get give go had has hasnt have he hence her here + hereafter hereby herein hereupon hers herself him himself his how + however hundred i ie if in inc indeed interest into is it its + itself keep last latter latterly least less ltd made many may me + meanwhile might mill mine more moreover most mostly move much must + my myself name namely neither never nevertheless next nine no + nobody none noone nor not nothing now nowhere of off often on once + one only onto or other others otherwise our ours ourselves out over + own part per perhaps please put rather re same see seem seemed + seeming seems serious several she should show side since sincere + six sixty so some somehow someone something sometime sometimes + somewhere still such system take ten than that the their them + themselves then thence there thereafter thereby therefore therein + thereupon these they thick thin third this those though three + through throughout thru thus to together too top toward towards + twelve twenty two un under until up upon us very via was we well + were what whatever when whence whenever where whereafter whereas + whereby wherein whereupon wherever whether which while whither who + whoever whole whom whose why will with within without would yet you + your yours yourself yourselves +} unless defined?(STOP_WORDS) + +def search_terms_for(item) + if item.identifier =~ /^\/(reference|tutorials)/ + content = item.rep_named(:default).compiled_content + doc = Nokogiri::HTML(content) + full_text = doc.css("p, h1, h2, h3, h4, h5, h6").map{|el| el.inner_text}.join(" ") + "#{item[:title]} #{item[:meta_description]} #{full_text}".gsub(/[\W\s]+/m,' ').downcase.split(/\s+/).uniq - STOP_WORDS + else + [] + end +end + +def search_index + id = 0; + idx = { + "approximate" => {}, + "terms" => {}, + "items" => {} + } + @items.each do |item| + search_terms_for(item).each do |term| + idx["terms"][term] = [] + idx["terms"][term] << id + (0...term.length).each do |c| + subterm = term[0...c] + idx["approximate"][subterm] ||= [] + unless idx["approximate"][subterm].include?(id) + idx["approximate"][subterm] << id + end + end + end + idx["items"][id] = { + "url" => item.identifier, + "title" => item[:title], + "crumb" => item[:crumb] + } + id += 1 + end + idx +end