diff --git a/app/assets/javascripts/discourse/lib/search.js b/app/assets/javascripts/discourse/lib/search.js index 512213d02ad..f71766c1f66 100644 --- a/app/assets/javascripts/discourse/lib/search.js +++ b/app/assets/javascripts/discourse/lib/search.js @@ -21,7 +21,7 @@ Discourse.Search = { if (!opts) opts = {}; // Only include the data we have - var data = { term: term }; + var data = { term: term, include_blurbs: 'true' }; if (opts.typeFilter) data.type_filter = opts.typeFilter; if (opts.searchForId) data.search_for_id = true; diff --git a/app/assets/javascripts/discourse/templates/search/topic_result.js.handlebars b/app/assets/javascripts/discourse/templates/search/topic_result.js.handlebars index 8455ef299b5..0ee415c460e 100644 --- a/app/assets/javascripts/discourse/templates/search/topic_result.js.handlebars +++ b/app/assets/javascripts/discourse/templates/search/topic_result.js.handlebars @@ -1,3 +1,10 @@ - + + {{unbound title}} + + {{#unless Discourse.Mobile.mobileView}} + + {{{unbound blurb}}} + + {{/unless}} diff --git a/app/assets/stylesheets/desktop/header.scss b/app/assets/stylesheets/desktop/header.scss index d294bad386b..415ef103821 100644 --- a/app/assets/stylesheets/desktop/header.scss +++ b/app/assets/stylesheets/desktop/header.scss @@ -65,3 +65,13 @@ and (max-width : 570px) { } } } + +.search-link .blurb { + color: scale-color($primary, $lightness: 45%); + display: block; + font-size: 11px; +} + +.d-dropdown#search-dropdown { + width: 540px; +} diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 9a9911491e9..13427bdede0 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1025,7 +1025,7 @@ en: granted_badge: "You earned %{link}" search: - within_post: "#%{post_number} by %{username}: %{excerpt}" + within_post: "#%{post_number} by %{username}" types: category: 'Categories' topic: 'Results' diff --git a/lib/search.rb b/lib/search.rb index 0dc1535a370..c199b0f65f1 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -279,17 +279,24 @@ class Search end def aggregate_search - cols = ['topics.id', 'topics.title', 'topics.slug'] + cols = ['topics.id', 'topics.title', 'topics.slug', 'cooked'] topics = posts_query(@limit, aggregate_search: true) .group(*cols) .pluck('min(posts.post_number)',*cols) + topics.each do |t| + post_number, topic_id, title, slug, cooked = t + + cooked = SearchObserver::HtmlScrubber.scrub(cooked).squish + blurb = SearchResult.blurb(cooked, @term) + @results.add_result(SearchResult.new(type: :topic, - topic_id: t[1], - id: t[1], - title: t[2], - url: "/t/#{t[3]}/#{t[1]}/#{t[0]}")) + topic_id: topic_id, + id: topic_id, + title: title, + url: "/t/#{slug}/#{topic_id}/#{post_number}", + blurb: blurb)) end end diff --git a/lib/search/search_result.rb b/lib/search/search_result.rb index d14b15c0bfb..85fb5d4b540 100644 --- a/lib/search/search_result.rb +++ b/lib/search/search_result.rb @@ -1,3 +1,5 @@ +require 'sanitize' + class Search class SearchResult @@ -55,24 +57,23 @@ class Search SearchResult.new(type: :topic, topic_id: t.id, id: t.id, title: options[:custom_title] || t.title, url: t.relative_url, blurb: options[:custom_blurb]) end + def self.blurb(raw, term) + blurb = TextHelper.excerpt(raw, term.split(/\s+/)[0], radius: 100) + blurb = TextHelper.truncate(raw, length: 200) if blurb.blank? + Sanitize.clean(blurb) + end + def self.from_post(p, context, term, include_blurbs=false) custom_title = if context && context.id == p.topic_id - # TODO: rewrite this - # 1. convert markdown to text - # 2. grab full words - excerpt = TextHelper.excerpt(p.raw, term.split(/\s+/)[0], radius: 30) - excerpt = TextHelper.truncate(p.raw, length: 50) if excerpt.blank? I18n.t("search.within_post", post_number: p.post_number, - username: p.user && p.user.username, - excerpt: excerpt + username: p.user && p.user.username ) end if include_blurbs #add a blurb from the post to the search results - custom_blurb = TextHelper.excerpt(p.raw, term.split(/\s+/)[0], radius: 100) - custom_blurb = TextHelper.truncate(p.raw, length: 200) if custom_blurb.blank? + custom_blurb = blurb(p.raw, term) end if p.post_number == 1 # we want the topic link when it's the OP diff --git a/lib/summarize.rb b/lib/summarize.rb index d1d1b8cb087..d6e23595f46 100644 --- a/lib/summarize.rb +++ b/lib/summarize.rb @@ -4,7 +4,7 @@ require 'sanitize' class Summarize - + def initialize(text) @text = text end diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index b2f9a2d66ef..adfc90dbea2 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -34,17 +34,12 @@ describe Search do @post = Fabricate(:post, topic: @topic, raw: 'this fun test ') @indexed = @post.post_search_data.search_data end - it "should include body in index" do - @indexed.should =~ /fun/ - end - it "should include title in index" do - @indexed.should =~ /sam/ - end - it "should include category in index" do - @indexed.should =~ /america/ - end - it "should pick up on title updates" do + it "should index correctly" do + @indexed.should =~ /fun/ + @indexed.should =~ /sam/ + @indexed.should =~ /america/ + @topic.title = "harpi is the new title" @topic.save! @post.post_search_data.reload @@ -186,8 +181,8 @@ describe Search do it 'returns the post' do result.should be_present result[:title].should == topic.title - result[:url].should == topic.relative_url + "/2" + result[:blurb].should == "this reply has no quotes" end end