2013-02-05 14:16:51 -05:00
require 'current_user'
2013-02-13 19:04:43 +08: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-09 14:08:42 +11: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 19:04:43 +08: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-24 13:38:00 +11: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-15 12:59:26 +10:00
def script ( * args )
2014-05-19 08:46:09 +10: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 16:32:06 +10:00
tags . gsub! ( " .js \" " , " .js?v=1&origin= #{ CGI . escape request . base_url } \" " )
2014-05-19 08:46:09 +10:00
tags . html_safe
else
2014-05-15 12:59:26 +10:00
javascript_include_tag ( * args )
2014-05-19 08:46:09 +10:00
end
2014-05-15 12:59:26 +10:00
end
2013-05-03 16:43:11 +10: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 16:43:11 +10: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 17:16:29 +10:00
" #{ mobile_view? ? 'mobile-view' : 'desktop-view' } #{ mobile_device? ? 'mobile-device' : 'not-mobile-device' } #{ rtl_class } #{ current_user ? '' : 'anon' } "
2014-08-27 14:38:03 +03:00
end
def rtl_class
2016-02-06 11:49:39 -08:00
rtl? ? 'rtl' : ''
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-30 14:05:25 +11:00
javascript = javascript . scrub
2013-09-10 16:01:36 +10: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
2016-03-08 20:08:23 +05:30
def format_topic_title ( title )
2015-10-15 09:59:29 +02:00
PrettyText . unescape_emoji ( title )
2016-03-08 20:08:23 +05:30
strip_tags ( title )
2015-10-15 09:59:29 +02:00
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-05 01:42:44 +01:00
defined? ( Rack :: MiniProfiler ) && admin?
2013-02-05 14:16:51 -05:00
end
def admin?
current_user . try ( :admin? )
end
2013-05-02 15:15:17 +10:00
def moderator?
current_user . try ( :moderator? )
end
2013-05-02 17:22:27 +10:00
def staff?
current_user . try ( :staff? )
end
2015-05-20 15:56:54 +10:00
def rtl?
2016-02-06 11:49:39 -08:00
[ " ar " , " fa_IR " , " he " ] . include? I18n . locale . to_s
2015-05-20 15:56:54 +10:00
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 || = { }
2015-10-01 12:24:07 -04:00
opts [ :url ] || = " #{ Discourse . base_url_no_prefix } #{ 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 ] } "
2015-11-03 01:23:51 +05:30
elsif opts [ :image ] . present? && opts [ :image ] . start_with? ( " /uploads/ " )
opts [ :image ] = " #{ Discourse . base_url } #{ opts [ :image ] } "
2014-08-07 12:58:26 -04:00
end
2013-03-07 17:31:06 -05:00
# Add opengraph tags
2015-10-15 11:00:47 +02:00
result = [ ]
result << tag ( :meta , property : 'og:site_name' , content : SiteSetting . title )
2013-03-15 15:42:21 -04:00
result << tag ( :meta , name : 'twitter:card' , content : " summary " )
2014-08-07 12:58:26 -04:00
2015-10-15 11:00:47 +02:00
[ :url , :title , :description , :image ] . 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 )
2015-10-15 11:00:47 +02:00
result << tag ( :meta , { property : " og: #{ property } " , content : opts [ property ] } , nil , escape )
result << tag ( :meta , { name : " twitter: #{ property } " , content : opts [ property ] } , nil , escape )
2013-03-08 15:04:37 -05:00
end
end
2013-03-07 17:31:06 -05:00
2016-01-07 16:48:05 +05:30
if opts [ :read_time ] && opts [ :read_time ] > 0 && opts [ :like_count ] && opts [ :like_count ] > 0
2015-12-28 18:22:31 +05:30
result << tag ( :meta , name : 'twitter:label1' , value : I18n . t ( " reading_time " ) )
result << tag ( :meta , name : 'twitter:data1' , value : " #{ opts [ :read_time ] } mins 🕑 " )
result << tag ( :meta , name : 'twitter:label2' , value : I18n . t ( " likes " ) )
2015-12-28 17:36:02 -05:00
result << tag ( :meta , name : 'twitter:data2' , value : " #{ opts [ :like_count ] } ❤ " )
2015-12-28 18:22:31 +05:30
end
2015-10-15 11:00:47 +02:00
result . join ( " \n " )
2013-03-07 17:31:06 -05:00
end
2016-02-13 10:29:53 -08:00
def render_sitelinks_search_tag
json = {
2016-04-14 17:22:26 +08:00
'@context' = > 'http://schema.org' ,
'@type' = > 'WebSite' ,
2016-02-13 10:29:53 -08:00
url : Discourse . base_url ,
potentialAction : {
2016-04-14 17:22:26 +08:00
'@type' = > 'SearchAction' ,
2016-02-13 10:29:53 -08:00
target : " #{ Discourse . base_url } /search?q={search_term_string} " ,
2016-04-14 17:22:26 +08:00
'query-input' = > 'required name=search_term_string' ,
2016-02-13 10:29:53 -08:00
}
}
content_tag ( :script , MultiJson . dump ( json ) . html_safe , type : 'application/ld+json' . freeze )
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 17:15:14 +01:00
def login_path
2013-11-14 16:41:16 +01:00
" #{ Discourse :: base_uri } /login "
2013-03-19 17:15:14 +01:00
end
2013-08-27 14:57:42 -04:00
2013-12-18 14:47:22 -05:00
def mobile_view?
2014-01-09 14:08:42 +11:00
MobileDetection . resolve_mobile_view! ( request . user_agent , params , session )
2013-12-18 14:47:22 -05:00
end
2016-04-07 22:28:31 +08:00
def crawler_layout?
controller . try ( :use_crawler_layout? )
end
2016-03-16 14:35:58 -04:00
def include_crawler_content?
2016-04-07 22:28:31 +08:00
crawler_layout? || ! mobile_view?
2016-03-16 14:35:58 -04:00
end
2013-12-18 14:47:22 -05:00
def mobile_device?
2014-01-09 14:08:42 +11:00
MobileDetection . mobile_device? ( request . user_agent )
2013-08-29 15:19:28 -04:00
end
2013-11-14 16:41:16 +01:00
def customization_disabled?
2015-02-20 18:21:19 +01:00
session [ :disable_customization ]
2013-11-14 16:41:16 +01:00
end
2015-03-02 23:31:04 +01: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-09 14:08:42 +11: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