2013-02-06 03:16:51 +08:00
|
|
|
require 'current_user'
|
2013-02-13 19:04:43 +08:00
|
|
|
require 'canonical_url'
|
2013-02-06 03:16:51 +08:00
|
|
|
require_dependency 'guardian'
|
|
|
|
require_dependency 'unread'
|
|
|
|
require_dependency 'age_words'
|
2013-05-01 23:48:42 +08:00
|
|
|
require_dependency 'configurable_urls'
|
2013-02-06 03:16:51 +08:00
|
|
|
|
|
|
|
module ApplicationHelper
|
|
|
|
include CurrentUser
|
2013-02-13 19:04:43 +08:00
|
|
|
include CanonicalURL::Helpers
|
2013-05-01 23:48:42 +08:00
|
|
|
include ConfigurableUrls
|
2013-02-06 03:16:51 +08:00
|
|
|
|
2013-05-03 14:43:11 +08:00
|
|
|
def discourse_csrf_tags
|
|
|
|
# anon can not have a CSRF token cause these are all pages
|
2013-06-06 06:23:43 +08:00
|
|
|
# that may be cached, causing a mismatch between session CSRF
|
2013-05-03 14:43:11 +08:00
|
|
|
# and CSRF on page and horrible impossible to debug login issues
|
|
|
|
if current_user
|
|
|
|
csrf_meta_tags
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-08-28 02:57:42 +08:00
|
|
|
def html_classes
|
2013-09-14 01:58:02 +08:00
|
|
|
"#{mobile_view? ? 'mobile-view' : 'desktop-view'} #{mobile_device? ? 'mobile-device' : 'not-mobile-device'}"
|
2013-08-28 02:57:42 +08:00
|
|
|
end
|
|
|
|
|
2013-07-03 08:43:52 +08:00
|
|
|
def escape_unicode(javascript)
|
|
|
|
if javascript
|
2013-09-10 14:01:36 +08:00
|
|
|
javascript = javascript.dup.force_encoding("utf-8")
|
|
|
|
javascript.gsub!(/\342\200\250/u, '
')
|
|
|
|
javascript.gsub!(/(<\/)/u, '\u003C/')
|
|
|
|
javascript.html_safe
|
2013-07-03 08:43:52 +08:00
|
|
|
else
|
|
|
|
''
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
def with_format(format, &block)
|
|
|
|
old_formats = formats
|
|
|
|
self.formats = [format]
|
|
|
|
block.call
|
|
|
|
self.formats = old_formats
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def age_words(secs)
|
|
|
|
AgeWords.age_words(secs)
|
|
|
|
end
|
|
|
|
|
|
|
|
def guardian
|
|
|
|
@guardian ||= Guardian.new(current_user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def mini_profiler_enabled?
|
2013-03-05 08:42:44 +08:00
|
|
|
defined?(Rack::MiniProfiler) && admin?
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def admin?
|
|
|
|
current_user.try(:admin?)
|
|
|
|
end
|
|
|
|
|
2013-05-02 13:15:17 +08:00
|
|
|
def moderator?
|
|
|
|
current_user.try(:moderator?)
|
|
|
|
end
|
|
|
|
|
2013-05-02 15:22:27 +08:00
|
|
|
def staff?
|
|
|
|
current_user.try(:staff?)
|
|
|
|
end
|
|
|
|
|
2013-03-09 04:04:37 +08:00
|
|
|
# Creates open graph and twitter card meta data
|
|
|
|
def crawlable_meta_data(opts=nil)
|
|
|
|
|
|
|
|
opts ||= {}
|
2013-03-09 04:58:37 +08:00
|
|
|
opts[:image] ||= "#{Discourse.base_url}#{SiteSetting.logo_small_url}"
|
2013-03-09 04:04:37 +08:00
|
|
|
opts[:url] ||= "#{Discourse.base_url}#{request.fullpath}"
|
2013-03-08 06:31:06 +08:00
|
|
|
|
|
|
|
# Add opengraph tags
|
|
|
|
result = tag(:meta, property: 'og:site_name', content: SiteSetting.title) << "\n"
|
2013-03-09 04:04:37 +08:00
|
|
|
|
2013-03-16 03:42:21 +08:00
|
|
|
result << tag(:meta, name: 'twitter:card', content: "summary")
|
2013-05-01 14:37:27 +08:00
|
|
|
[:image, :url, :title, :description, 'image:width', 'image:height'].each do |property|
|
2013-03-09 04:04:37 +08:00
|
|
|
if opts[property].present?
|
2013-03-09 05:17:56 +08:00
|
|
|
escape = (property != :image)
|
|
|
|
result << tag(:meta, {property: "og:#{property}", content: opts[property]}, nil, escape) << "\n"
|
2013-03-16 03:42:21 +08:00
|
|
|
result << tag(:meta, {name: "twitter:#{property}", content: opts[property]}, nil, escape) << "\n"
|
2013-03-09 04:04:37 +08:00
|
|
|
end
|
|
|
|
end
|
2013-03-08 06:31:06 +08:00
|
|
|
|
2013-07-05 19:59:39 +08:00
|
|
|
# Add workaround tag for old crawlers which ignores <noscript>
|
|
|
|
# (see https://developers.google.com/webmasters/ajax-crawling/docs/specification)
|
|
|
|
result << tag('meta', name: "fragment", content: "!") if SiteSetting.enable_escaped_fragments
|
2013-07-05 02:08:23 +08:00
|
|
|
|
2013-03-08 06:31:06 +08:00
|
|
|
result
|
|
|
|
end
|
|
|
|
|
2013-06-26 22:57:35 +08:00
|
|
|
# Look up site content for a key. If the key is blank, you can supply a block and that
|
|
|
|
# will be rendered instead.
|
2013-04-06 03:21:55 +08:00
|
|
|
def markdown_content(key, replacements=nil)
|
2013-06-26 22:57:35 +08:00
|
|
|
result = PrettyText.cook(SiteContent.content_for(key, replacements || {})).html_safe
|
2013-07-03 23:57:17 +08:00
|
|
|
if result.blank? && block_given?
|
|
|
|
yield
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
result
|
|
|
|
end
|
2013-04-06 03:21:55 +08:00
|
|
|
end
|
|
|
|
|
2013-03-20 00:15:14 +08:00
|
|
|
def login_path
|
|
|
|
return "#{Discourse::base_uri}/login"
|
|
|
|
end
|
2013-08-28 02:57:42 +08:00
|
|
|
|
|
|
|
def mobile_view?
|
2013-09-17 23:25:22 +08:00
|
|
|
return false unless SiteSetting.enable_mobile_theme
|
2013-08-28 02:57:42 +08:00
|
|
|
if session[:mobile_view]
|
|
|
|
session[:mobile_view] == '1'
|
|
|
|
else
|
2013-08-30 03:19:28 +08:00
|
|
|
mobile_device?
|
2013-08-28 02:57:42 +08:00
|
|
|
end
|
|
|
|
end
|
2013-08-30 03:19:28 +08:00
|
|
|
|
|
|
|
def mobile_device?
|
2013-09-11 04:43:51 +08:00
|
|
|
# TODO: this is dumb. user agent matching is a doomed approach. a better solution is coming.
|
|
|
|
request.user_agent =~ /Mobile|webOS/ and !(request.user_agent =~ /iPad/)
|
2013-08-30 03:19:28 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|