2013-02-05 14:16:51 -05:00
|
|
|
require 'current_user'
|
2013-02-13 06:04:43 -05:00
|
|
|
require 'canonical_url'
|
2013-02-05 14:16:51 -05:00
|
|
|
require_dependency 'guardian'
|
|
|
|
require_dependency 'unread'
|
|
|
|
require_dependency 'age_words'
|
2013-05-01 11:48:42 -04:00
|
|
|
require_dependency 'configurable_urls'
|
2014-01-08 22:08:42 -05:00
|
|
|
require_dependency 'mobile_detection'
|
2015-01-28 14:56:18 -05:00
|
|
|
require_dependency 'category_badge'
|
2015-03-09 15:24:16 -04:00
|
|
|
require_dependency 'global_path'
|
2015-03-23 14:12:11 -04:00
|
|
|
require_dependency 'canonical_url'
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
module ApplicationHelper
|
|
|
|
include CurrentUser
|
2013-02-13 06:04:43 -05:00
|
|
|
include CanonicalURL::Helpers
|
2013-05-01 11:48:42 -04:00
|
|
|
include ConfigurableUrls
|
2015-03-09 15:24:16 -04:00
|
|
|
include GlobalPath
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2015-04-07 13:09:49 -04:00
|
|
|
def ga_universal_json
|
|
|
|
cookie_domain = SiteSetting.ga_universal_domain_name.gsub(/^http(s)?:\/\//, '')
|
|
|
|
result = {cookieDomain: cookie_domain}
|
|
|
|
if current_user.present?
|
|
|
|
result[:userId] = current_user.id
|
|
|
|
end
|
|
|
|
result.to_json.html_safe
|
|
|
|
end
|
|
|
|
|
2014-10-23 22:38:00 -04:00
|
|
|
def shared_session_key
|
|
|
|
if SiteSetting.long_polling_base_url != '/'.freeze && current_user
|
|
|
|
sk = "shared_session_key"
|
|
|
|
return request.env[sk] if request.env[sk]
|
|
|
|
|
|
|
|
request.env[sk] = key = (session[sk] ||= SecureRandom.hex)
|
|
|
|
$redis.setex "#{sk}_#{key}", 7.days, current_user.id.to_s
|
|
|
|
key
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-05-14 22:59:26 -04:00
|
|
|
def script(*args)
|
2014-05-18 18:46:09 -04:00
|
|
|
if SiteSetting.enable_cdn_js_debugging && GlobalSetting.cdn_url
|
|
|
|
tags = javascript_include_tag(*args, "crossorigin" => "anonymous")
|
|
|
|
tags.gsub!("/assets/", "/cdn_asset/#{Discourse.current_hostname.gsub(".","_")}/")
|
2014-07-10 02:32:06 -04:00
|
|
|
tags.gsub!(".js\"", ".js?v=1&origin=#{CGI.escape request.base_url}\"")
|
2014-05-18 18:46:09 -04:00
|
|
|
tags.html_safe
|
|
|
|
else
|
2014-05-14 22:59:26 -04:00
|
|
|
javascript_include_tag(*args)
|
2014-05-18 18:46:09 -04:00
|
|
|
end
|
2014-05-14 22:59:26 -04:00
|
|
|
end
|
|
|
|
|
2013-05-03 02:43:11 -04:00
|
|
|
def discourse_csrf_tags
|
|
|
|
# anon can not have a CSRF token cause these are all pages
|
2013-06-05 18:23:43 -04:00
|
|
|
# that may be cached, causing a mismatch between session CSRF
|
2013-05-03 02:43:11 -04:00
|
|
|
# and CSRF on page and horrible impossible to debug login issues
|
|
|
|
if current_user
|
|
|
|
csrf_meta_tags
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-12-18 14:47:22 -05:00
|
|
|
def html_classes
|
2015-07-23 03:16:29 -04:00
|
|
|
"#{mobile_view? ? 'mobile-view' : 'desktop-view'} #{mobile_device? ? 'mobile-device' : 'not-mobile-device'} #{rtl_class} #{current_user ? '' : 'anon'}"
|
2014-08-27 07:38:03 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def rtl_class
|
|
|
|
RTL.new(current_user).css_class
|
2013-12-18 14:47:22 -05:00
|
|
|
end
|
|
|
|
|
2013-07-02 20:43:52 -04:00
|
|
|
def escape_unicode(javascript)
|
|
|
|
if javascript
|
2013-12-29 22:05:25 -05:00
|
|
|
javascript = javascript.scrub
|
2013-09-10 02:01:36 -04:00
|
|
|
javascript.gsub!(/\342\200\250/u, '
')
|
|
|
|
javascript.gsub!(/(<\/)/u, '\u003C/')
|
|
|
|
javascript.html_safe
|
2013-07-02 20:43:52 -04:00
|
|
|
else
|
|
|
|
''
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05: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-04 19:42:44 -05:00
|
|
|
defined?(Rack::MiniProfiler) && admin?
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def admin?
|
|
|
|
current_user.try(:admin?)
|
|
|
|
end
|
|
|
|
|
2013-05-02 01:15:17 -04:00
|
|
|
def moderator?
|
|
|
|
current_user.try(:moderator?)
|
|
|
|
end
|
|
|
|
|
2013-05-02 03:22:27 -04:00
|
|
|
def staff?
|
|
|
|
current_user.try(:staff?)
|
|
|
|
end
|
|
|
|
|
2015-05-20 01:56:54 -04:00
|
|
|
def rtl?
|
|
|
|
["ar", "fa_IR", "he"].include?(user_locale)
|
|
|
|
end
|
|
|
|
|
|
|
|
def user_locale
|
|
|
|
locale = current_user.locale if current_user && SiteSetting.allow_user_locale
|
|
|
|
# changing back to default shoves a blank string there
|
|
|
|
locale.present? ? locale : SiteSetting.default_locale
|
|
|
|
end
|
|
|
|
|
2013-03-08 15:04:37 -05:00
|
|
|
# Creates open graph and twitter card meta data
|
|
|
|
def crawlable_meta_data(opts=nil)
|
|
|
|
|
|
|
|
opts ||= {}
|
2013-03-08 15:58:37 -05:00
|
|
|
opts[:image] ||= "#{Discourse.base_url}#{SiteSetting.logo_small_url}"
|
2013-03-08 15:04:37 -05:00
|
|
|
opts[:url] ||= "#{Discourse.base_url}#{request.fullpath}"
|
2013-03-07 17:31:06 -05:00
|
|
|
|
2014-08-07 12:58:26 -04:00
|
|
|
# Use the correct scheme for open graph
|
|
|
|
if opts[:image].present? && opts[:image].start_with?("//")
|
|
|
|
uri = URI(Discourse.base_url)
|
|
|
|
opts[:image] = "#{uri.scheme}:#{opts[:image]}"
|
|
|
|
end
|
|
|
|
|
2013-03-07 17:31:06 -05:00
|
|
|
# Add opengraph tags
|
|
|
|
result = tag(:meta, property: 'og:site_name', content: SiteSetting.title) << "\n"
|
2013-03-08 15:04:37 -05:00
|
|
|
|
2013-03-15 15:42:21 -04:00
|
|
|
result << tag(:meta, name: 'twitter:card', content: "summary")
|
2014-08-07 12:58:26 -04:00
|
|
|
|
2014-12-24 03:30:55 -05:00
|
|
|
# I removed image related opengraph tags from here for now due to
|
|
|
|
# https://meta.discourse.org/t/x/22744/18
|
|
|
|
[:url, :title, :description].each do |property|
|
2013-03-08 15:04:37 -05:00
|
|
|
if opts[property].present?
|
2013-03-08 16:17:56 -05:00
|
|
|
escape = (property != :image)
|
|
|
|
result << tag(:meta, {property: "og:#{property}", content: opts[property]}, nil, escape) << "\n"
|
2013-03-15 15:42:21 -04:00
|
|
|
result << tag(:meta, {name: "twitter:#{property}", content: opts[property]}, nil, escape) << "\n"
|
2013-03-08 15:04:37 -05:00
|
|
|
end
|
|
|
|
end
|
2013-03-07 17:31:06 -05:00
|
|
|
|
|
|
|
result
|
|
|
|
end
|
|
|
|
|
2013-06-26 10:57:35 -04: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-05 15:21:55 -04:00
|
|
|
def markdown_content(key, replacements=nil)
|
2014-09-24 14:45:35 -04:00
|
|
|
result = PrettyText.cook(SiteText.text_for(key, replacements || {})).html_safe
|
2013-07-03 11:57:17 -04:00
|
|
|
if result.blank? && block_given?
|
|
|
|
yield
|
|
|
|
nil
|
|
|
|
else
|
|
|
|
result
|
|
|
|
end
|
2013-04-05 15:21:55 -04:00
|
|
|
end
|
|
|
|
|
2015-02-25 11:35:47 -05:00
|
|
|
def application_logo_url
|
|
|
|
@application_logo_url ||= (mobile_view? && SiteSetting.mobile_logo_url) || SiteSetting.logo_url
|
|
|
|
end
|
|
|
|
|
2013-03-19 12:15:14 -04:00
|
|
|
def login_path
|
2013-11-14 10:41:16 -05:00
|
|
|
"#{Discourse::base_uri}/login"
|
2013-03-19 12:15:14 -04:00
|
|
|
end
|
2013-08-27 14:57:42 -04:00
|
|
|
|
2013-12-18 14:47:22 -05:00
|
|
|
def mobile_view?
|
2014-01-08 22:08:42 -05:00
|
|
|
MobileDetection.resolve_mobile_view!(request.user_agent,params,session)
|
2013-12-18 14:47:22 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def mobile_device?
|
2014-01-08 22:08:42 -05:00
|
|
|
MobileDetection.mobile_device?(request.user_agent)
|
2013-08-29 15:19:28 -04:00
|
|
|
end
|
2013-11-14 10:41:16 -05:00
|
|
|
|
|
|
|
def customization_disabled?
|
2015-02-20 12:21:19 -05:00
|
|
|
session[:disable_customization]
|
2013-11-14 10:41:16 -05:00
|
|
|
end
|
|
|
|
|
2015-03-02 17:31:04 -05:00
|
|
|
def loading_admin?
|
|
|
|
controller.class.name.split("::").first == "Admin"
|
|
|
|
end
|
|
|
|
|
2015-01-28 14:56:18 -05:00
|
|
|
def category_badge(category, opts=nil)
|
|
|
|
CategoryBadge.html_for(category, opts).html_safe
|
|
|
|
end
|
2014-01-08 22:08:42 -05:00
|
|
|
|
2015-06-02 14:27:52 -04:00
|
|
|
def self.all_connectors
|
|
|
|
@all_connectors = Dir.glob("plugins/*/app/views/connectors/**/*.html.erb")
|
|
|
|
end
|
|
|
|
|
|
|
|
def server_plugin_outlet(name)
|
|
|
|
|
|
|
|
# Don't evaluate plugins in test
|
|
|
|
return "" if Rails.env.test?
|
|
|
|
|
|
|
|
matcher = Regexp.new("/connectors/#{name}/.*\.html\.erb$")
|
|
|
|
erbs = ApplicationHelper.all_connectors.select {|c| c =~ matcher }
|
|
|
|
return "" if erbs.blank?
|
|
|
|
|
|
|
|
result = ""
|
|
|
|
erbs.each {|erb| result << render(file: erb) }
|
|
|
|
result.html_safe
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|