heinous_inline_partial for story show perf
This commit is contained in:
parent
8dd88017a8
commit
dacbbb86fa
|
@ -3,9 +3,10 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
protect_from_forgery
|
||||
before_action :authenticate_user
|
||||
before_action :heinous_inline_partials, if: -> { Rails.env.development? }
|
||||
before_action :mini_profiler
|
||||
before_action :set_traffic_style
|
||||
before_action :prepare_exception_notifier
|
||||
before_action :set_traffic_style
|
||||
|
||||
# match this in your nginx config for bypassing the file cache
|
||||
TAG_FILTER_COOKIE = :tag_filters
|
||||
|
@ -72,6 +73,10 @@ class ApplicationController < ActionController::Base
|
|||
)
|
||||
end
|
||||
|
||||
def heinous_inline_partials
|
||||
do_heinous_inline_partial_replacement
|
||||
end
|
||||
|
||||
def mini_profiler
|
||||
if @user && @user.is_admin?
|
||||
Rack::MiniProfiler.authorize_request
|
||||
|
|
|
@ -56,12 +56,170 @@
|
|||
<% end %>
|
||||
<% previous_depth = comment.depth %>
|
||||
|
||||
<%= render "comments/comment", :comment => comment,
|
||||
:show_story => (comment.story_id != @story.id),
|
||||
:show_tree_lines => true,
|
||||
:was_merged => (comment.story_id != @story.id),
|
||||
:children => [],
|
||||
:is_unread => is_unread?(comment) %>
|
||||
<%
|
||||
show_story = (comment.story_id != @story.id)
|
||||
show_tree_lines = true
|
||||
was_merged = (comment.story_id != @story.id)
|
||||
is_unread = is_unread?(comment)
|
||||
%>
|
||||
<%#heinous_inline_partial(comments/_comment.html.erb)%>
|
||||
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
|
||||
<% flagged = comment.current_vote && comment.current_vote[:vote] == -1 %>
|
||||
<input id="comment_folder_<%= comment.short_id %>"
|
||||
class="comment_folder_button" type="checkbox"
|
||||
<%= defined?(force_open) ||
|
||||
@user.try(:is_moderator?) ||
|
||||
(comment.score > Comment::COLLAPSE_SCORE && !flagged) ? "" : "checked" %>>
|
||||
|
||||
<div id="c_<%= comment.short_id %>"
|
||||
data-shortid="<%= comment.short_id if comment.persisted? %>"
|
||||
class="comment <%= comment.current_vote ? (comment.current_vote[:vote] == 1 ?
|
||||
"upvoted" : "flagged") : "" %>
|
||||
<%= comment.score < Comment::SCORE_RANGE_TO_HIDE.first ? "bad" : "" %>">
|
||||
|
||||
<% if defined?(show_tree_lines) && show_tree_lines %>
|
||||
<label for="comment_folder_<%= comment.short_id %>"
|
||||
class="comment_folder"></label>
|
||||
<% end %>
|
||||
|
||||
<% if !comment.is_gone? %>
|
||||
<% can_flag = @user && @user.can_flag?(comment) %>
|
||||
<% score_display = comment.score_for_user(@user) %>
|
||||
<div class="voters">
|
||||
<% if @user %>
|
||||
<a class="upvoter"></a>
|
||||
<% else %>
|
||||
<%= link_to "", login_path, :class => "upvoter" %>
|
||||
<% end %>
|
||||
<div class="score"><%= score_display %></div>
|
||||
</div>
|
||||
<div class="comment_parent_tree_line
|
||||
<%= can_flag ? "can_flag" : "" %>
|
||||
<%= score_display != " " ? "score_shown" : "" %>
|
||||
<%= defined?(children) && children ? "" : "no_children" %>"></div>
|
||||
<% end %>
|
||||
|
||||
<div class="details">
|
||||
<div class="byline">
|
||||
<a name="c_<%= comment.short_id %>"></a>
|
||||
|
||||
<% if defined?(show_tree_lines) && show_tree_lines %>
|
||||
<label for="comment_folder_<%= comment.short_id %>"
|
||||
class="comment_folder comment_folder_inline"></label>
|
||||
<% else %>
|
||||
<label for="comment_folder_<%= comment.short_id %>"
|
||||
class="comment_folder comment_folder_inline force_inline"></label>
|
||||
<% end %>
|
||||
|
||||
<% if defined?(was_merged) && was_merged %>
|
||||
<span class="merge"></span>
|
||||
<% end %>
|
||||
|
||||
<% if (@user && @user.show_avatars?) || !@user %>
|
||||
<a href="/u/<%= comment.user.username %>"><%=
|
||||
avatar_img(comment.user, 16) %></a>
|
||||
<% end %>
|
||||
|
||||
<a href="/u/<%= comment.user.username %>"
|
||||
class="<%= comment.html_class_for_user %>"><%=
|
||||
comment.user.username %></a>
|
||||
|
||||
<% if comment.hat %>
|
||||
<%= comment.hat.to_html_label %>
|
||||
<% end %>
|
||||
|
||||
<% if comment.previewing %>
|
||||
previewed
|
||||
just now
|
||||
<% else %>
|
||||
<% if comment.has_been_edited? %>
|
||||
edited
|
||||
<% elsif comment.is_from_email? %>
|
||||
e-mailed
|
||||
<% end %>
|
||||
<% is_unread ||= false %>
|
||||
<%= time_ago_in_words_label(comment.has_been_edited? ? comment.updated_at : comment.created_at) %>
|
||||
<%= raw "<span class='comment_unread'>(unread)</span>" if is_unread %>
|
||||
<% end %>
|
||||
|
||||
<% if !comment.previewing %>
|
||||
|
|
||||
<a href="<%= comment.path %>">link</a>
|
||||
|
||||
<% if comment.is_editable_by_user?(@user) %>
|
||||
|
|
||||
<a tabindex="0" class="comment_editor">edit</a>
|
||||
<% end %>
|
||||
|
||||
<% if comment.is_gone? && comment.is_undeletable_by_user?(@user) %>
|
||||
|
|
||||
<a tabindex="0" class="comment_undeletor" href="#c_<%= comment.short_id %>">undelete</a>
|
||||
<% elsif !comment.is_gone? && comment.is_deletable_by_user?(@user) %>
|
||||
|
|
||||
<% if @user && @user.is_moderator? && @user.id != comment.user_id %>
|
||||
<a tabindex="0" class="comment_moderator" href="#c_<%= comment.short_id %>">delete</a>
|
||||
<% else %>
|
||||
<a tabindex="0" class="comment_deletor" href="#c_<%= comment.short_id %>">delete</a>
|
||||
<% end %>
|
||||
<% elsif !comment.is_gone? && comment.is_disownable_by_user?(@user) %>
|
||||
|
|
||||
<a tabindex="0" class="comment-disowner" href="#">disown</a>
|
||||
<% end %>
|
||||
|
||||
<% if can_flag && !flagged %>
|
||||
<span class="dropdown_parent">
|
||||
| <a class="flagger">flag</a>
|
||||
</span>
|
||||
<% elsif flagged %>
|
||||
| <a class="flagger">unflag</a>
|
||||
<% else %>
|
||||
<span class="flagger flagger_stub"></span>
|
||||
<% end %>
|
||||
|
||||
<% if @user && !comment.is_gone? && comment.story.accepting_comments? %>
|
||||
|
|
||||
<a tabindex="0" class="comment_replier" unselectable="on">reply</a>
|
||||
<% end %>
|
||||
|
||||
<% if defined?(show_story) && show_story %>
|
||||
| on:
|
||||
<a href="<%= comment.story.comments_path %>"><%= comment.story.title %></a>
|
||||
<% end %>
|
||||
|
||||
<span class="reason">
|
||||
<% if comment.flags > 0 &&
|
||||
comment.show_score_to_user?(@user) &&
|
||||
(comment.user_id == @user.try(:id) || @user.try("is_moderator?")) %>
|
||||
<% if (s = comment.vote_summary_for_user(@user).downcase).present? %>
|
||||
| <%= s %>
|
||||
<% end %>
|
||||
<% elsif comment.current_vote && comment.current_vote[:vote] == -1 %>
|
||||
| -1
|
||||
<%= Vote::ALL_COMMENT_REASONS[comment.current_vote[:reason]].downcase %>
|
||||
<% end %>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<div role="heading" aria-level="3" class="comment_text">
|
||||
<% if comment.is_gone? %>
|
||||
<p>
|
||||
<span class="na">
|
||||
[<%= comment.gone_text %><% if @user && @user.is_moderator? %> Visible to moderator:<% end %>]
|
||||
</span>
|
||||
</p>
|
||||
<% if @user && @user.is_moderator? %>
|
||||
<%= raw comment.markeddown_comment %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= raw comment.markeddown_comment %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%#/heinous_inline_partial(comments/_comment.html.erb)%>
|
||||
%>
|
||||
%>
|
||||
|
||||
<%#
|
||||
# If you edit this structure, update the incredibly brittle css selector
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
# Inlines partials into parent templates for performance.
|
||||
# In production & test: once at startup; development: every request
|
||||
#
|
||||
# Inlining the comments/_comment partial into stories/show (bulk of our traffic!)
|
||||
# gives a 25% speedup over 'render collection: @comment'.
|
||||
|
||||
HEINOUS_INLINE_PARTIALS = {
|
||||
# including template => partial
|
||||
}
|
||||
|
||||
Dir['app/views/**/*.erb'].each do |filename|
|
||||
template = File.read(filename)
|
||||
next unless template.include? 'heinous_inline_partial'
|
||||
|
||||
partial_match = template.match(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>/)
|
||||
partial_name = partial_match && partial_match.captures.first
|
||||
HEINOUS_INLINE_PARTIALS[filename] = 'app/views/' + partial_name
|
||||
end
|
||||
l = Logger.new(STDOUT)
|
||||
l.warn "heinous_inline_partial initialized, found: #{HEINOUS_INLINE_PARTIALS}"
|
||||
|
||||
def do_heinous_inline_partial_replacement
|
||||
HEINOUS_INLINE_PARTIALS.each do |filename, partial_name|
|
||||
partial_mtime = File.mtime(partial_name)
|
||||
# puts "heinous contemplating #{filename} #{File.mtime(filename).to_i} #{partial_mtime.to_i}"
|
||||
next if File.mtime(filename) == partial_mtime
|
||||
# puts " will replace in #{filename}"
|
||||
|
||||
template = File.read(filename)
|
||||
template.sub!(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>(.+)^<%#\/heinous_inline_partial\(([\w\/\.]+)\)/m) { |match|
|
||||
raise "Template name didn't match in open and closing tags. One per file!" unless $1 == $3
|
||||
# puts " .sub! matched, replacing"
|
||||
|
||||
<<~REPLACE
|
||||
<%#heinous_inline_partial(#{$1})%>
|
||||
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
|
||||
#{File.read(partial_name)}
|
||||
<%#/heinous_inline_partial(#{$1})%>
|
||||
REPLACE
|
||||
}
|
||||
# puts " writing filename #{filename}"
|
||||
File.write(filename, template)
|
||||
File.utime(partial_mtime, partial_mtime, filename)
|
||||
end
|
||||
end
|
||||
|
||||
# run once at startup:
|
||||
do_heinous_inline_partial_replacement
|
||||
|
||||
# see before_action in ApplicationController for development mode hook
|
Loading…
Reference in New Issue