openstreetmap-website/app/helpers/application_helper.rb
Andy Allan 24f6aeda6a Use hash-based flash objects to render complex flash messages
Since flash objects can only be String, Hash or Array (notably excluding SafeBuffers), then this approach is necessary to render complex html in a safe manner.

Each local can be treated as an (unsafe) string, and therefore escaped normally when rendered into the template. The template (and translation strings) can
contain html since they are no longer stored in the flash as a plain string.

Fixes #3215
2021-06-23 20:10:55 +01:00

81 lines
2.2 KiB
Ruby

module ApplicationHelper
require "rexml/document"
def linkify(text)
if text.html_safe?
Rinku.auto_link(text, :urls, tag_builder.tag_options(:rel => "nofollow")).html_safe
else
Rinku.auto_link(ERB::Util.h(text), :urls, tag_builder.tag_options(:rel => "nofollow")).html_safe
end
end
def rss_link_to(args = {})
link_to(image_tag("RSS.png", :size => "16x16", :border => 0), args, :class => "rsssmall")
end
def atom_link_to(args = {})
link_to(image_tag("RSS.png", :size => "16x16", :border => 0), args, :class => "rsssmall")
end
def dir
if dir = params[:dir]
dir == "rtl" ? "rtl" : "ltr"
else
I18n.t("html.dir")
end
end
def friendly_date(date)
tag.span(time_ago_in_words(date), :title => l(date, :format => :friendly))
end
def friendly_date_ago(date)
tag.span(time_ago_in_words(date, :scope => :"datetime.distance_in_words_ago"), :title => l(date, :format => :friendly))
end
def body_class
if content_for? :body_class
content_for :body_class
else
"#{params[:controller]} #{params[:controller]}-#{params[:action]}"
end
end
def current_page_class(path)
:current if current_page?(path)
end
def application_data
data = {
:locale => I18n.locale,
:preferred_editor => preferred_editor
}
if current_user
data[:user] = current_user.id.to_json
data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } unless current_user.home_lon.nil? || current_user.home_lat.nil?
end
data[:location] = session[:location] if session[:location]
if oauth_token
data[:token] = oauth_token.token
data[:token_secret] = oauth_token.secret
data[:consumer_key] = oauth_token.client_application.key
data[:consumer_secret] = oauth_token.client_application.secret
end
data
end
# If the flash is a hash, then it will be a partial with a hash of locals, so we can call `render` on that
# This allows us to render html into a flash message in a safe manner.
def render_flash(flash)
if flash.is_a?(Hash)
render flash.with_indifferent_access
else
flash
end
end
end