From ad2b6675041f9a68f730d1181f2b00569a435f56 Mon Sep 17 00:00:00 2001
From: Stephan Kaag <stephan@ka.ag>
Date: Mon, 22 Jul 2013 22:16:46 +0200
Subject: [PATCH 1/3] Remove dead code

---
 app/models/post.rb  | 5 -----
 lib/post_revisor.rb | 2 --
 2 files changed, 7 deletions(-)

diff --git a/app/models/post.rb b/app/models/post.rb
index e32b563e0..bc5bc5d9f 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -78,11 +78,6 @@ class Post < ActiveRecord::Base
     Digest::SHA1.hexdigest(raw.gsub(/\s+/, ""))
   end
 
-  def reset_cooked
-    @cooked_document = nil
-    self.cooked = nil
-  end
-
   def self.white_listed_image_classes
     @white_listed_image_classes ||= ['avatar', 'favicon', 'thumbnail']
   end
diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb
index aed1a9dda..9a4fac265 100644
--- a/lib/post_revisor.rb
+++ b/lib/post_revisor.rb
@@ -66,8 +66,6 @@ class PostRevisor
   end
 
   def update_post
-    @post.reset_cooked
-
     @post.raw = @new_raw
     @post.updated_by = @user
     @post.last_editor_id = @user.id

From ebd5fa76c5ec49b568e50edec1d16fca757bd5fa Mon Sep 17 00:00:00 2001
From: Stephan Kaag <stephan@ka.ag>
Date: Mon, 22 Jul 2013 22:24:47 +0200
Subject: [PATCH 2/3] Reuse post-analyzer and cooked-document when requesting
 multiple post stats

---
 app/models/post.rb          |  7 ++++---
 app/models/post_analyzer.rb | 11 ++++-------
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/app/models/post.rb b/app/models/post.rb
index bc5bc5d9f..1b74ee22b 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -83,17 +83,18 @@ class Post < ActiveRecord::Base
   end
 
   def post_analyzer
-    @post_analyzer = PostAnalyzer.new(raw, topic_id)
+    @post_analyzers ||= {}
+    @post_analyzers[raw_hash] ||= PostAnalyzer.new(raw, topic_id)
   end
 
   %w{raw_mentions linked_hosts image_count attachment_count link_count raw_links}.each do |attr|
     define_method(attr) do
-      PostAnalyzer.new(raw, topic_id).send(attr)
+      post_analyzer.send(attr)
     end
   end
 
   def cook(*args)
-    PostAnalyzer.new(raw, topic_id).cook(*args)
+    post_analyzer.cook(*args)
   end
 
 
diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb
index 26cf7ac5d..2e193ef41 100644
--- a/app/models/post_analyzer.rb
+++ b/app/models/post_analyzer.rb
@@ -1,17 +1,10 @@
 class PostAnalyzer
 
-  attr_accessor :cooked, :raw
-
   def initialize(raw, topic_id)
     @raw  = raw
     @topic_id = topic_id
   end
 
-  def cooked_document
-    @cooked = cook(@raw, topic_id: @topic_id)
-    @cooked_document = Nokogiri::HTML.fragment(@cooked)
-  end
-
   # What we use to cook posts
   def cook(*args)
     cooked = PrettyText.cook(*args)
@@ -110,6 +103,10 @@ class PostAnalyzer
 
   private
 
+  def cooked_document
+    @cooked_document ||= Nokogiri::HTML.fragment(cook(@raw, topic_id: @topic_id))
+  end
+
   def link_is_a_mention?(l)
     html_class = l.attributes['class']
     return false if html_class.nil?

From b58da2fcf94ee7ebd29110bf6b6fa2709d4eaa5a Mon Sep 17 00:00:00 2001
From: Stephan Kaag <stephan@ka.ag>
Date: Mon, 22 Jul 2013 22:39:20 +0200
Subject: [PATCH 3/3] Add some TODO's

---
 app/models/post.rb                |  1 +
 app/models/post_alert_observer.rb | 12 +++++-------
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/app/models/post.rb b/app/models/post.rb
index 1b74ee22b..a62bea04d 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -292,6 +292,7 @@ class Post < ActiveRecord::Base
   end
 
 
+  # TODO: move to post-analyzer?
   # Determine what posts are quoted by this post
   def extract_quoted_post_numbers
     temp_collector = []
diff --git a/app/models/post_alert_observer.rb b/app/models/post_alert_observer.rb
index 141ae363b..251d5605b 100644
--- a/app/models/post_alert_observer.rb
+++ b/app/models/post_alert_observer.rb
@@ -96,20 +96,18 @@ class PostAlertObserver < ActiveRecord::Observer
                                         display_username: opts[:display_username] || post.user.username }.to_json)
     end
 
+    # TODO: Move to post-analyzer?
     # Returns a list users who have been mentioned
     def extract_mentioned_users(post)
       User.where(username_lower: post.raw_mentions).where("id <> ?", post.user_id)
     end
 
+    # TODO: Move to post-analyzer?
     # Returns a list of users who were quoted in the post
     def extract_quoted_users(post)
-      result = []
-      post.raw.scan(/\[quote=\"([^,]+),.+\"\]/).uniq.each do |m|
-        username = m.first.strip.downcase
-        user = User.where("username_lower = :username and id != :id", username: username, id: post.user_id).first
-        result << user if user.present?
-      end
-      result
+      post.raw.scan(/\[quote=\"([^,]+),.+\"\]/).uniq.map do |m|
+        User.where("username_lower = :username and id != :id", username: m.first.strip.downcase, id: post.user_id).first
+      end.compact
     end
 
     # Notify a bunch of users