[Docs] Search the docs. Needs styling and to be wired into the search box.

This commit is contained in:
Chris Eppstein 2010-05-08 11:07:31 -07:00
parent 79c69c77a2
commit b5439e0b25
5 changed files with 118 additions and 0 deletions

View File

@ -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

View File

@ -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 %>;

View File

@ -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 += '<li><a href="'+items[i].url+'">'+items[i].title+'</a></li>';
}
$('ol#results').html(html)
} else {
$('ol#results').html("<li class='none'>Nothing found.</li>");
}
}
%input{:type => "text", :placeholder=>"Search"}
%ol#results
%li.none Please enter a search term.

View File

@ -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"

74
doc-src/lib/search.rb Normal file
View File

@ -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